linux/drivers/staging/meilhaus/medevice.c
<<
>>
Prefs
   1/**
   2 * @file medevice.c
   3 *
   4 * @brief Meilhaus device base class.
   5 * @note Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
   6 * @author Guenter Gebhardt
   7 * @author Krzysztof Gantzke    (k.gantzke@meilhaus.de)
   8 */
   9
  10/*
  11 * Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
  12 *
  13 * This file is free software; you can redistribute it and/or modify
  14 * it under the terms of the GNU General Public License as published by
  15 * the Free Software Foundation; either version 2 of the License, or
  16 * (at your option) any later version.
  17 *
  18 * This program is distributed in the hope that it will be useful,
  19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 * GNU General Public License for more details.
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with this program; if not, write to the Free Software
  25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26 */
  27
  28#include "mecommon.h"
  29#include "meinternal.h"
  30#include "medefines.h"
  31#include "meerror.h"
  32
  33#include "medebug.h"
  34#include "medevice.h"
  35
  36#ifndef __KERNEL__
  37#  define __KERNEL__
  38#endif
  39
  40static int me_device_io_irq_start(struct me_device *device,
  41                                  struct file *filep,
  42                                  int subdevice,
  43                                  int channel,
  44                                  int irq_source,
  45                                  int irq_edge, int irq_arg, int flags)
  46{
  47        int err = ME_ERRNO_SUCCESS;
  48        me_subdevice_t *s;
  49
  50        PDEBUG("executed.\n");
  51
  52        // Check subdevice index.
  53        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
  54                PERROR("Invalid subdevice.\n");
  55                return ME_ERRNO_INVALID_SUBDEVICE;
  56        }
  57        // Enter device.
  58        err = me_dlock_enter(&device->dlock, filep);
  59
  60        if (err) {
  61                PERROR("Cannot enter device.\n");
  62                return err;
  63        }
  64        // Get subdevice instance.
  65        s = me_slist_get_subdevice(&device->slist, subdevice);
  66
  67        if (s) {
  68                // Call subdevice method.
  69                err = s->me_subdevice_io_irq_start(s,
  70                                                   filep,
  71                                                   channel,
  72                                                   irq_source,
  73                                                   irq_edge, irq_arg, flags);
  74        } else {
  75                // Something really bad happened.
  76                PERROR("Cannot get subdevice instance.\n");
  77                err = ME_ERRNO_INTERNAL;
  78        }
  79
  80        // Exit device.
  81        me_dlock_exit(&device->dlock, filep);
  82
  83        return err;
  84}
  85
  86static int me_device_io_irq_wait(struct me_device *device,
  87                                 struct file *filep,
  88                                 int subdevice,
  89                                 int channel,
  90                                 int *irq_count,
  91                                 int *value, int time_out, int flags)
  92{
  93        int err = ME_ERRNO_SUCCESS;
  94        me_subdevice_t *s;
  95
  96        PDEBUG("executed.\n");
  97
  98        // Check subdevice index.
  99        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 100                PERROR("Invalid subdevice.\n");
 101                return ME_ERRNO_INVALID_SUBDEVICE;
 102        }
 103        // Enter device.
 104        err = me_dlock_enter(&device->dlock, filep);
 105
 106        if (err) {
 107                PERROR("Cannot enter device.\n");
 108                return err;
 109        }
 110        // Get subdevice instance.
 111        s = me_slist_get_subdevice(&device->slist, subdevice);
 112
 113        if (s) {
 114                // Call subdevice method.
 115                err = s->me_subdevice_io_irq_wait(s,
 116                                                  filep,
 117                                                  channel,
 118                                                  irq_count,
 119                                                  value, time_out, flags);
 120        } else {
 121                // Something really bad happened.
 122                PERROR("Cannot get subdevice instance.\n");
 123                err = ME_ERRNO_INTERNAL;
 124        }
 125
 126        // Exit device.
 127        me_dlock_exit(&device->dlock, filep);
 128
 129        return err;
 130}
 131
 132static int me_device_io_irq_stop(struct me_device *device,
 133                                 struct file *filep,
 134                                 int subdevice, int channel, int flags)
 135{
 136        int err = ME_ERRNO_SUCCESS;
 137        me_subdevice_t *s;
 138
 139        PDEBUG("executed.\n");
 140
 141        // Check subdevice index.
 142        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 143                PERROR("Invalid subdevice.\n");
 144                return ME_ERRNO_INVALID_SUBDEVICE;
 145        }
 146        // Enter device.
 147        err = me_dlock_enter(&device->dlock, filep);
 148
 149        if (err) {
 150                PERROR("Cannot enter device.\n");
 151                return err;
 152        }
 153        // Get subdevice instance.
 154        s = me_slist_get_subdevice(&device->slist, subdevice);
 155
 156        if (s) {
 157                // Call subdevice method.
 158                err = s->me_subdevice_io_irq_stop(s, filep, channel, flags);
 159        } else {
 160                // Something really bad happened.
 161                PERROR("Cannot get subdevice instance.\n");
 162                err = ME_ERRNO_INTERNAL;
 163        }
 164
 165        // Exit device.
 166        me_dlock_exit(&device->dlock, filep);
 167
 168        return err;
 169}
 170
 171static int me_device_io_reset_device(struct me_device *device,
 172                                     struct file *filep, int flags)
 173{
 174        int err = ME_ERRNO_SUCCESS;
 175        me_subdevice_t *s;
 176        int i, n;
 177
 178        PDEBUG("executed.\n");
 179
 180        /* Get the number of subdevices. */
 181        n = me_slist_get_number_subdevices(&device->slist);
 182
 183        // Enter device.
 184        err = me_dlock_enter(&device->dlock, filep);
 185
 186        if (err) {
 187                PERROR("Cannot enter device.\n");
 188                return err;
 189        }
 190
 191        /* Reset every subdevice in list. */
 192        for (i = 0; i < n; i++) {
 193                s = me_slist_get_subdevice(&device->slist, i);
 194                err = s->me_subdevice_io_reset_subdevice(s, filep, flags);
 195
 196                if (err) {
 197                        PERROR("Cannot reset subdevice.\n");
 198                        break;
 199                }
 200        }
 201
 202        // Exit device.
 203        me_dlock_exit(&device->dlock, filep);
 204
 205        return err;
 206}
 207
 208static int me_device_io_reset_subdevice(struct me_device *device,
 209                                        struct file *filep,
 210                                        int subdevice, int flags)
 211{
 212        int err = ME_ERRNO_SUCCESS;
 213        me_subdevice_t *s;
 214
 215        PDEBUG("executed.\n");
 216
 217        // Check subdevice index.
 218
 219        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 220                PERROR("Invalid subdevice.\n");
 221                return ME_ERRNO_INVALID_SUBDEVICE;
 222        }
 223        // Enter device.
 224        err = me_dlock_enter(&device->dlock, filep);
 225
 226        if (err) {
 227                PERROR("Cannot enter device.\n");
 228                return err;
 229        }
 230        // Get subdevice instance.
 231        s = me_slist_get_subdevice(&device->slist, subdevice);
 232
 233        if (s) {
 234                // Call subdevice method.
 235                err = s->me_subdevice_io_reset_subdevice(s, filep, flags);
 236        } else {
 237                // Something really bad happened.
 238                PERROR("Cannot get subdevice instance.\n");
 239                err = ME_ERRNO_INTERNAL;
 240        }
 241
 242        // Exit device.
 243        me_dlock_exit(&device->dlock, filep);
 244
 245        return err;
 246}
 247
 248static int me_device_io_single_config(struct me_device *device,
 249                                      struct file *filep,
 250                                      int subdevice,
 251                                      int channel,
 252                                      int single_config,
 253                                      int ref,
 254                                      int trig_chan,
 255                                      int trig_type, int trig_edge, int flags)
 256{
 257        int err = ME_ERRNO_SUCCESS;
 258        me_subdevice_t *s;
 259
 260        PDEBUG("executed.\n");
 261
 262        // Check subdevice index.
 263
 264        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 265                PERROR("Invalid subdevice.\n");
 266                return ME_ERRNO_INVALID_SUBDEVICE;
 267        }
 268        // Enter device.
 269        err = me_dlock_enter(&device->dlock, filep);
 270
 271        if (err) {
 272                PERROR("Cannot enter device.\n");
 273                return err;
 274        }
 275        // Get subdevice instance.
 276        s = me_slist_get_subdevice(&device->slist, subdevice);
 277
 278        if (s) {
 279                // Call subdevice method.
 280                err = s->me_subdevice_io_single_config(s,
 281                                                       filep,
 282                                                       channel,
 283                                                       single_config,
 284                                                       ref,
 285                                                       trig_chan,
 286                                                       trig_type,
 287                                                       trig_edge, flags);
 288        } else {
 289                // Something really bad happened.
 290                PERROR("Cannot get subdevice instance.\n");
 291                err = ME_ERRNO_INTERNAL;
 292        }
 293
 294        // Exit device.
 295        me_dlock_exit(&device->dlock, filep);
 296
 297        return err;
 298}
 299
 300static int me_device_io_single_read(struct me_device *device,
 301                                    struct file *filep,
 302                                    int subdevice,
 303                                    int channel,
 304                                    int *value, int time_out, int flags)
 305{
 306        int err = ME_ERRNO_SUCCESS;
 307        me_subdevice_t *s;
 308
 309        PDEBUG("executed.\n");
 310
 311        // Check subdevice index.
 312
 313        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 314                PERROR("Invalid subdevice.\n");
 315                return ME_ERRNO_INVALID_SUBDEVICE;
 316        }
 317        // Enter device.
 318        err = me_dlock_enter(&device->dlock, filep);
 319
 320        if (err) {
 321                PERROR("Cannot enter device.\n");
 322                return err;
 323        }
 324        // Get subdevice instance.
 325        s = me_slist_get_subdevice(&device->slist, subdevice);
 326
 327        if (s) {
 328                // Call subdevice method.
 329                err = s->me_subdevice_io_single_read(s,
 330                                                     filep,
 331                                                     channel,
 332                                                     value, time_out, flags);
 333        } else {
 334                // Something really bad happened.
 335                PERROR("Cannot get subdevice instance.\n");
 336                err = ME_ERRNO_INTERNAL;
 337        }
 338
 339        // Exit device.
 340        me_dlock_exit(&device->dlock, filep);
 341
 342        return err;
 343}
 344
 345static int me_device_io_single_write(struct me_device *device,
 346                                     struct file *filep,
 347                                     int subdevice,
 348                                     int channel,
 349                                     int value, int time_out, int flags)
 350{
 351        int err = ME_ERRNO_SUCCESS;
 352        me_subdevice_t *s;
 353
 354        PDEBUG("executed.\n");
 355
 356        // Check subdevice index.
 357
 358        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 359                PERROR("Invalid subdevice.\n");
 360                return ME_ERRNO_INVALID_SUBDEVICE;
 361        }
 362        // Enter device.
 363        err = me_dlock_enter(&device->dlock, filep);
 364
 365        if (err) {
 366                PERROR("Cannot enter device.\n");
 367                return err;
 368        }
 369        // Get subdevice instance.
 370        s = me_slist_get_subdevice(&device->slist, subdevice);
 371
 372        if (s) {
 373                // Call subdevice method.
 374                err = s->me_subdevice_io_single_write(s,
 375                                                      filep,
 376                                                      channel,
 377                                                      value, time_out, flags);
 378        } else {
 379                // Something really bad happened.
 380                PERROR("Cannot get subdevice instance.\n");
 381                err = ME_ERRNO_INTERNAL;
 382        }
 383
 384        // Exit device.
 385        me_dlock_exit(&device->dlock, filep);
 386
 387        return err;
 388}
 389
 390static int me_device_io_stream_config(struct me_device *device,
 391                                      struct file *filep,
 392                                      int subdevice,
 393                                      meIOStreamConfig_t * config_list,
 394                                      int count,
 395                                      meIOStreamTrigger_t * trigger,
 396                                      int fifo_irq_threshold, int flags)
 397{
 398        int err = ME_ERRNO_SUCCESS;
 399        me_subdevice_t *s;
 400
 401        PDEBUG("executed.\n");
 402
 403        // Check subdevice index.
 404
 405        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 406                PERROR("Invalid subdevice.\n");
 407                return ME_ERRNO_INVALID_SUBDEVICE;
 408        }
 409        // Enter device.
 410        err = me_dlock_enter(&device->dlock, filep);
 411
 412        if (err) {
 413                PERROR("Cannot enter device.\n");
 414                return err;
 415        }
 416        // Get subdevice instance.
 417        s = me_slist_get_subdevice(&device->slist, subdevice);
 418
 419        if (s) {
 420                // Call subdevice method.
 421                err = s->me_subdevice_io_stream_config(s,
 422                                                       filep,
 423                                                       config_list,
 424                                                       count,
 425                                                       trigger,
 426                                                       fifo_irq_threshold,
 427                                                       flags);
 428        } else {
 429                // Something really bad happened.
 430                PERROR("Cannot get subdevice instance.\n");
 431                err = ME_ERRNO_INTERNAL;
 432        }
 433
 434        // Exit device.
 435        me_dlock_exit(&device->dlock, filep);
 436
 437        return err;
 438}
 439
 440static int me_device_io_stream_new_values(struct me_device *device,
 441                                          struct file *filep,
 442                                          int subdevice,
 443                                          int time_out, int *count, int flags)
 444{
 445        int err = ME_ERRNO_SUCCESS;
 446        me_subdevice_t *s;
 447
 448        PDEBUG("executed.\n");
 449
 450        // Check subdevice index.
 451
 452        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 453                PERROR("Invalid subdevice.\n");
 454                return ME_ERRNO_INVALID_SUBDEVICE;
 455        }
 456        // Enter device.
 457        err = me_dlock_enter(&device->dlock, filep);
 458
 459        if (err) {
 460                PERROR("Cannot enter device.\n");
 461                return err;
 462        }
 463        // Get subdevice instance.
 464        s = me_slist_get_subdevice(&device->slist, subdevice);
 465
 466        if (s) {
 467                // Call subdevice method.
 468                err = s->me_subdevice_io_stream_new_values(s,
 469                                                           filep,
 470                                                           time_out,
 471                                                           count, flags);
 472        } else {
 473                // Something really bad happened.
 474                PERROR("Cannot get subdevice instance.\n");
 475                err = ME_ERRNO_INTERNAL;
 476        }
 477
 478        // Exit device.
 479        me_dlock_exit(&device->dlock, filep);
 480
 481        return err;
 482}
 483
 484static int me_device_io_stream_read(struct me_device *device,
 485                                    struct file *filep,
 486                                    int subdevice,
 487                                    int read_mode,
 488                                    int *values, int *count, int flags)
 489{
 490        int err = ME_ERRNO_SUCCESS;
 491        me_subdevice_t *s;
 492
 493        PDEBUG("executed.\n");
 494
 495        // Check subdevice index.
 496
 497        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 498                PERROR("Invalid subdevice.\n");
 499                return ME_ERRNO_INVALID_SUBDEVICE;
 500        }
 501        // Enter device.
 502        err = me_dlock_enter(&device->dlock, filep);
 503
 504        if (err) {
 505                PERROR("Cannot enter device.\n");
 506                return err;
 507        }
 508        // Get subdevice instance.
 509        s = me_slist_get_subdevice(&device->slist, subdevice);
 510
 511        if (s) {
 512                // Call subdevice method.
 513                err = s->me_subdevice_io_stream_read(s,
 514                                                     filep,
 515                                                     read_mode,
 516                                                     values, count, flags);
 517        } else {
 518                // Something really bad happened.
 519                PERROR("Cannot get subdevice instance.\n");
 520                err = ME_ERRNO_INTERNAL;
 521        }
 522
 523        // Exit device.
 524        me_dlock_exit(&device->dlock, filep);
 525
 526        return err;
 527}
 528
 529static int me_device_io_stream_start(struct me_device *device,
 530                                     struct file *filep,
 531                                     int subdevice,
 532                                     int start_mode, int time_out, int flags)
 533{
 534        int err = ME_ERRNO_SUCCESS;
 535        me_subdevice_t *s;
 536
 537        PDEBUG("executed.\n");
 538
 539        // Check subdevice index.
 540
 541        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 542                PERROR("Invalid subdevice.\n");
 543                return ME_ERRNO_INVALID_SUBDEVICE;
 544        }
 545        // Enter device.
 546        err = me_dlock_enter(&device->dlock, filep);
 547
 548        if (err) {
 549                PERROR("Cannot enter device.\n");
 550                return err;
 551        }
 552        // Get subdevice instance.
 553        s = me_slist_get_subdevice(&device->slist, subdevice);
 554
 555        if (s) {
 556                // Call subdevice method.
 557                err = s->me_subdevice_io_stream_start(s,
 558                                                      filep,
 559                                                      start_mode,
 560                                                      time_out, flags);
 561        } else {
 562                // Something really bad happened.
 563                PERROR("Cannot get subdevice instance.\n");
 564                err = ME_ERRNO_INTERNAL;
 565        }
 566
 567        // Exit device.
 568        me_dlock_exit(&device->dlock, filep);
 569
 570        return err;
 571}
 572
 573static int me_device_io_stream_status(struct me_device *device,
 574                                      struct file *filep,
 575                                      int subdevice,
 576                                      int wait,
 577                                      int *status, int *count, int flags)
 578{
 579        int err = ME_ERRNO_SUCCESS;
 580        me_subdevice_t *s;
 581
 582        PDEBUG("executed.\n");
 583
 584        // Check subdevice index.
 585
 586        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 587                PERROR("Invalid subdevice.\n");
 588                return ME_ERRNO_INVALID_SUBDEVICE;
 589        }
 590        // Enter device.
 591        err = me_dlock_enter(&device->dlock, filep);
 592
 593        if (err) {
 594                PERROR("Cannot enter device.\n");
 595                return err;
 596        }
 597        // Get subdevice instance.
 598        s = me_slist_get_subdevice(&device->slist, subdevice);
 599
 600        if (s) {
 601                // Call subdevice method.
 602                err = s->me_subdevice_io_stream_status(s,
 603                                                       filep,
 604                                                       wait,
 605                                                       status, count, flags);
 606        } else {
 607                // Something really bad happened.
 608                PERROR("Cannot get subdevice instance.\n");
 609                err = ME_ERRNO_INTERNAL;
 610        }
 611
 612        // Exit device.
 613        me_dlock_exit(&device->dlock, filep);
 614
 615        return err;
 616}
 617
 618static int me_device_io_stream_stop(struct me_device *device,
 619                                    struct file *filep,
 620                                    int subdevice, int stop_mode, int flags)
 621{
 622        int err = ME_ERRNO_SUCCESS;
 623        me_subdevice_t *s;
 624
 625        PDEBUG("executed.\n");
 626
 627        // Check subdevice index.
 628
 629        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 630                PERROR("Invalid subdevice.\n");
 631                return ME_ERRNO_INVALID_SUBDEVICE;
 632        }
 633        // Enter device.
 634        err = me_dlock_enter(&device->dlock, filep);
 635
 636        if (err) {
 637                PERROR("Cannot enter device.\n");
 638                return err;
 639        }
 640        // Get subdevice instance.
 641        s = me_slist_get_subdevice(&device->slist, subdevice);
 642
 643        if (s) {
 644                // Call subdevice method.
 645                err = s->me_subdevice_io_stream_stop(s,
 646                                                     filep, stop_mode, flags);
 647        } else {
 648                // Something really bad happened.
 649                PERROR("Cannot get subdevice instance.\n");
 650                err = ME_ERRNO_INTERNAL;
 651        }
 652
 653        // Exit device.
 654        me_dlock_exit(&device->dlock, filep);
 655
 656        return err;
 657}
 658
 659static int me_device_io_stream_write(struct me_device *device,
 660                                     struct file *filep,
 661                                     int subdevice,
 662                                     int write_mode,
 663                                     int *values, int *count, int flags)
 664{
 665        int err = ME_ERRNO_SUCCESS;
 666        me_subdevice_t *s;
 667
 668        PDEBUG("executed.\n");
 669
 670        // Check subdevice index.
 671
 672        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 673                PERROR("Invalid subdevice.\n");
 674                return ME_ERRNO_INVALID_SUBDEVICE;
 675        }
 676        // Enter device.
 677        err = me_dlock_enter(&device->dlock, filep);
 678
 679        if (err) {
 680                PERROR("Cannot enter device.\n");
 681                return err;
 682        }
 683        // Get subdevice instance.
 684        s = me_slist_get_subdevice(&device->slist, subdevice);
 685
 686        if (s) {
 687                // Call subdevice method.
 688                err = s->me_subdevice_io_stream_write(s,
 689                                                      filep,
 690                                                      write_mode,
 691                                                      values, count, flags);
 692        } else {
 693                // Something really bad happened.
 694                PERROR("Cannot get subdevice instance.\n");
 695                err = ME_ERRNO_INTERNAL;
 696        }
 697
 698        // Exit device.
 699        me_dlock_exit(&device->dlock, filep);
 700
 701        return err;
 702}
 703
 704static int me_device_lock_device(struct me_device *device,
 705                                 struct file *filep, int lock, int flags)
 706{
 707        PDEBUG("executed.\n");
 708
 709        return me_dlock_lock(&device->dlock,
 710                             filep, lock, flags, &device->slist);
 711}
 712
 713static int me_device_lock_subdevice(struct me_device *device,
 714                                    struct file *filep,
 715                                    int subdevice, int lock, int flags)
 716{
 717        int err = ME_ERRNO_SUCCESS;
 718        me_subdevice_t *s;
 719
 720        PDEBUG("executed.\n");
 721
 722        // Check subdevice index.
 723
 724        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 725                PERROR("Invalid subdevice.\n");
 726                return ME_ERRNO_INVALID_SUBDEVICE;
 727        }
 728        // Enter device.
 729        err = me_dlock_enter(&device->dlock, filep);
 730
 731        if (err) {
 732                PERROR("Cannot enter device.\n");
 733                return err;
 734        }
 735        // Get subdevice instance.
 736        s = me_slist_get_subdevice(&device->slist, subdevice);
 737
 738        if (s) {
 739                // Call subdevice method.
 740                err = s->me_subdevice_lock_subdevice(s, filep, lock, flags);
 741        } else {
 742                // Something really bad happened.
 743                PERROR("Cannot get subdevice instance.\n");
 744                err = ME_ERRNO_INTERNAL;
 745        }
 746
 747        // Exit device.
 748        me_dlock_exit(&device->dlock, filep);
 749
 750        return err;
 751}
 752
 753static int me_device_query_description_device(struct me_device *device,
 754                                              char **description)
 755{
 756        PDEBUG("executed.\n");
 757        *description = device->device_description;
 758        return ME_ERRNO_SUCCESS;
 759}
 760
 761static int me_device_query_info_device(struct me_device *device,
 762                                       int *vendor_id,
 763                                       int *device_id,
 764                                       int *serial_no,
 765                                       int *bus_type,
 766                                       int *bus_no,
 767                                       int *dev_no, int *func_no, int *plugged)
 768{
 769        PDEBUG("executed.\n");
 770
 771        if (device->bus_type == ME_BUS_TYPE_PCI) {
 772                *vendor_id = device->info.pci.vendor_id;
 773                *device_id = device->info.pci.device_id;
 774                *serial_no = device->info.pci.serial_no;
 775                *bus_type = ME_BUS_TYPE_PCI;
 776                *bus_no = device->info.pci.pci_bus_no;
 777                *dev_no = device->info.pci.pci_dev_no;
 778                *func_no = device->info.pci.pci_func_no;
 779                *plugged = ME_PLUGGED_IN;
 780        } else {
 781                *plugged = ME_PLUGGED_OUT;
 782        }
 783        return ME_ERRNO_SUCCESS;
 784}
 785
 786static int me_device_query_name_device(struct me_device *device, char **name)
 787{
 788        PDEBUG("executed.\n");
 789        *name = device->device_name;
 790        return ME_ERRNO_SUCCESS;
 791}
 792
 793static int me_device_query_name_device_driver(struct me_device *device,
 794                                              char **name)
 795{
 796        PDEBUG("executed.\n");
 797        *name = device->driver_name;
 798        return ME_ERRNO_SUCCESS;
 799}
 800
 801static int me_device_query_number_subdevices(struct me_device *device,
 802                                             int *number)
 803{
 804        PDEBUG("executed.\n");
 805        return me_slist_query_number_subdevices(&device->slist, number);
 806}
 807
 808static int me_device_query_number_channels(struct me_device *device,
 809                                           int subdevice, int *number)
 810{
 811        int err = ME_ERRNO_SUCCESS;
 812        me_subdevice_t *s;
 813
 814        PDEBUG("executed.\n");
 815
 816        // Check subdevice index.
 817
 818        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 819                PERROR("Invalid subdevice.\n");
 820                return ME_ERRNO_INVALID_SUBDEVICE;
 821        }
 822        // Get subdevice instance.
 823        s = me_slist_get_subdevice(&device->slist, subdevice);
 824
 825        if (s) {
 826                // Call subdevice method.
 827                err = s->me_subdevice_query_number_channels(s, number);
 828        } else {
 829                // Something really bad happened.
 830                PERROR("Cannot get subdevice instance.\n");
 831                err = ME_ERRNO_INTERNAL;
 832        }
 833
 834        return err;
 835}
 836
 837static int me_device_query_number_ranges(struct me_device *device,
 838                                         int subdevice, int unit, int *count)
 839{
 840        int err = ME_ERRNO_SUCCESS;
 841        me_subdevice_t *s;
 842
 843        PDEBUG("executed.\n");
 844
 845        // Check subdevice index.
 846
 847        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 848                PERROR("Invalid subdevice.\n");
 849                return ME_ERRNO_INVALID_SUBDEVICE;
 850        }
 851        // Get subdevice instance.
 852        s = me_slist_get_subdevice(&device->slist, subdevice);
 853
 854        if (s) {
 855                // Call subdevice method.
 856                err = s->me_subdevice_query_number_ranges(s, unit, count);
 857        } else {
 858                // Something really bad happened.
 859                PERROR("Cannot get subdevice instance.\n");
 860                err = ME_ERRNO_INTERNAL;
 861        }
 862
 863        return err;
 864}
 865
 866static int me_device_query_range_by_min_max(struct me_device *device,
 867                                            int subdevice,
 868                                            int unit,
 869                                            int *min,
 870                                            int *max, int *maxdata, int *range)
 871{
 872        int err = ME_ERRNO_SUCCESS;
 873        me_subdevice_t *s;
 874
 875        PDEBUG("executed.\n");
 876
 877        // Check subdevice index.
 878
 879        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 880                PERROR("Invalid subdevice.\n");
 881                return ME_ERRNO_INVALID_SUBDEVICE;
 882        }
 883        // Get subdevice instance.
 884        s = me_slist_get_subdevice(&device->slist, subdevice);
 885
 886        if (s) {
 887                // Call subdevice method.
 888                err = s->me_subdevice_query_range_by_min_max(s,
 889                                                             unit,
 890                                                             min,
 891                                                             max,
 892                                                             maxdata, range);
 893        } else {
 894                // Something really bad happened.
 895                PERROR("Cannot get subdevice instance.\n");
 896                err = ME_ERRNO_INTERNAL;
 897        }
 898
 899        return err;
 900}
 901
 902static int me_device_query_range_info(struct me_device *device,
 903                                      int subdevice,
 904                                      int range,
 905                                      int *unit,
 906                                      int *min, int *max, int *maxdata)
 907{
 908        int err = ME_ERRNO_SUCCESS;
 909        me_subdevice_t *s;
 910
 911        PDEBUG("executed.\n");
 912
 913        // Check subdevice index.
 914
 915        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 916                PERROR("Invalid subdevice.\n");
 917                return ME_ERRNO_INVALID_SUBDEVICE;
 918        }
 919        // Get subdevice instance.
 920        s = me_slist_get_subdevice(&device->slist, subdevice);
 921
 922        if (s) {
 923                // Call subdevice method.
 924                err = s->me_subdevice_query_range_info(s,
 925                                                       range,
 926                                                       unit, min, max, maxdata);
 927        } else {
 928                // Something really bad happened.
 929                PERROR("Cannot get subdevice instance.\n");
 930                err = ME_ERRNO_INTERNAL;
 931        }
 932
 933        return err;
 934}
 935
 936static int me_device_query_subdevice_by_type(struct me_device *device,
 937                                             int start_subdevice,
 938                                             int type,
 939                                             int subtype, int *subdevice)
 940{
 941        PDEBUG("executed.\n");
 942
 943        return me_slist_get_subdevice_by_type(&device->slist,
 944                                              start_subdevice,
 945                                              type, subtype, subdevice);
 946}
 947
 948static int me_device_query_subdevice_type(struct me_device *device,
 949                                          int subdevice,
 950                                          int *type, int *subtype)
 951{
 952        int err = ME_ERRNO_SUCCESS;
 953        me_subdevice_t *s;
 954
 955        PDEBUG("executed.\n");
 956
 957        // Check subdevice index.
 958
 959        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 960                PERROR("Invalid subdevice.\n");
 961                return ME_ERRNO_INVALID_SUBDEVICE;
 962        }
 963        // Get subdevice instance.
 964        s = me_slist_get_subdevice(&device->slist, subdevice);
 965
 966        if (s) {
 967                // Call subdevice method.
 968                err = s->me_subdevice_query_subdevice_type(s, type, subtype);
 969        } else {
 970                // Something really bad happened.
 971                PERROR("Cannot get subdevice instance.\n");
 972                err = ME_ERRNO_INTERNAL;
 973        }
 974
 975        return err;
 976}
 977
 978static int me_device_query_subdevice_caps(struct me_device *device,
 979                                          int subdevice, int *caps)
 980{
 981        int err = ME_ERRNO_SUCCESS;
 982        me_subdevice_t *s;
 983
 984        PDEBUG("executed.\n");
 985
 986        // Check subdevice index.
 987
 988        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
 989                PERROR("Invalid subdevice.\n");
 990                return ME_ERRNO_INVALID_SUBDEVICE;
 991        }
 992        // Get subdevice instance.
 993        s = me_slist_get_subdevice(&device->slist, subdevice);
 994
 995        if (s) {
 996                // Call subdevice method.
 997                err = s->me_subdevice_query_subdevice_caps(s, caps);
 998        } else {
 999                // Something really bad happened.
1000                PERROR("Cannot get subdevice instance.\n");
1001                err = ME_ERRNO_INTERNAL;
1002        }
1003
1004        return err;
1005}
1006
1007static int me_device_query_subdevice_caps_args(struct me_device *device,
1008                                               int subdevice,
1009                                               int cap, int *args, int count)
1010{
1011        int err = ME_ERRNO_SUCCESS;
1012        me_subdevice_t *s;
1013
1014        PDEBUG("executed.\n");
1015
1016        // Check subdevice index.
1017
1018        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
1019                PERROR("Invalid subdevice.\n");
1020                return ME_ERRNO_INVALID_SUBDEVICE;
1021        }
1022        // Get subdevice instance.
1023        s = me_slist_get_subdevice(&device->slist, subdevice);
1024
1025        if (s) {
1026                // Call subdevice method.
1027                err = s->me_subdevice_query_subdevice_caps_args(s,
1028                                                                cap,
1029                                                                args, count);
1030        } else {
1031                // Something really bad happened.
1032                PERROR("Cannot get subdevice instance.\n");
1033                err = ME_ERRNO_INTERNAL;
1034        }
1035
1036        return err;
1037}
1038
1039static int me_device_query_timer(struct me_device *device,
1040                                 int subdevice,
1041                                 int timer,
1042                                 int *base_frequency,
1043                                 uint64_t * min_ticks, uint64_t * max_ticks)
1044{
1045        int err = ME_ERRNO_SUCCESS;
1046        me_subdevice_t *s;
1047
1048        PDEBUG("executed.\n");
1049
1050        // Check subdevice index.
1051
1052        if (subdevice >= me_slist_get_number_subdevices(&device->slist)) {
1053                PERROR("Invalid subdevice.\n");
1054                return ME_ERRNO_INVALID_SUBDEVICE;
1055        }
1056        // Get subdevice instance.
1057        s = me_slist_get_subdevice(&device->slist, subdevice);
1058
1059        if (s) {
1060                // Call subdevice method.
1061                err = s->me_subdevice_query_timer(s,
1062                                                  timer,
1063                                                  base_frequency,
1064                                                  min_ticks, max_ticks);
1065        } else {
1066                // Something really bad happened.
1067                PERROR("Cannot get subdevice instance.\n");
1068                err = ME_ERRNO_INTERNAL;
1069        }
1070
1071        return err;
1072}
1073
1074static int me_device_query_version_device_driver(struct me_device *device,
1075                                                 int *version)
1076/** @todo Versions shold be read from driver. I must overwrite this function in each module. Here should be returned an error!
1077*/
1078{
1079        PDEBUG("executed.\n");
1080        *version = ME_VERSION_DRIVER;
1081        return ME_ERRNO_SUCCESS;
1082}
1083
1084static int me_device_config_load(struct me_device *device, struct file *filep,
1085                                 me_cfg_device_entry_t * config)
1086{
1087        PDEBUG("executed.\n");
1088        return ME_ERRNO_SUCCESS;        //If no need for config return success.
1089//      return ME_ERRNO_NOT_SUPPORTED;
1090}
1091
1092static void me_device_destructor(me_device_t * me_device)
1093{
1094        PDEBUG("executed.\n");
1095        me_device_deinit(me_device);
1096        kfree(me_device);
1097}
1098
1099/* //me_device_usb_init
1100int me_device_usb_init(me_device_t *me_device, struct usb_interface *interface)
1101{
1102        PDEBUG("executed.\n");
1103        return -1;
1104}
1105*/
1106
1107static int get_device_descriptions(uint16_t device_id,
1108                                   char **device_name,
1109                                   char **device_description,
1110                                   char **driver_name)
1111/** @todo This is wrong concept! Static table has too strong limitations!
1112* 'device_name' and 'driver_name' should be calculated from 'device_id'
1113* 'device_description' should be read from device or moved to user space and handled by library!
1114*/
1115{
1116        PDEBUG("executed.\n");
1117
1118        switch (device_id) {
1119        case PCI_DEVICE_ID_MEILHAUS_ME1000:
1120        case PCI_DEVICE_ID_MEILHAUS_ME1000_A:
1121        case PCI_DEVICE_ID_MEILHAUS_ME1000_B:
1122                *device_name = ME1000_NAME_DEVICE_ME1000;
1123                *device_description = ME1000_DESCRIPTION_DEVICE_ME1000;
1124                *driver_name = ME1000_NAME_DRIVER;
1125                break;
1126
1127        case PCI_DEVICE_ID_MEILHAUS_ME1400:
1128                *device_name = ME1400_NAME_DEVICE_ME1400;
1129                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400;
1130                *driver_name = ME1400_NAME_DRIVER;
1131                break;
1132
1133        case PCI_DEVICE_ID_MEILHAUS_ME140A:
1134                *device_name = ME1400_NAME_DEVICE_ME1400A;
1135                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400A;
1136                *driver_name = ME1400_NAME_DRIVER;
1137                break;
1138
1139        case PCI_DEVICE_ID_MEILHAUS_ME140B:
1140                *device_name = ME1400_NAME_DEVICE_ME1400B;
1141                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400B;
1142                *driver_name = ME1400_NAME_DRIVER;
1143                break;
1144
1145        case PCI_DEVICE_ID_MEILHAUS_ME14E0:
1146                *device_name = ME1400_NAME_DEVICE_ME1400E;
1147                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400E;
1148                *driver_name = ME1400_NAME_DRIVER;
1149                break;
1150
1151        case PCI_DEVICE_ID_MEILHAUS_ME14EA:
1152                *device_name = ME1400_NAME_DEVICE_ME1400EA;
1153                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EA;
1154                *driver_name = ME1400_NAME_DRIVER;
1155                break;
1156
1157        case PCI_DEVICE_ID_MEILHAUS_ME14EB:
1158                *device_name = ME1400_NAME_DEVICE_ME1400EB;
1159                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EB;
1160                *driver_name = ME1400_NAME_DRIVER;
1161                break;
1162
1163        case PCI_DEVICE_ID_MEILHAUS_ME140C:
1164                *device_name = ME1400_NAME_DEVICE_ME1400C;
1165                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400C;
1166                *driver_name = ME1400_NAME_DRIVER;
1167                break;
1168
1169        case PCI_DEVICE_ID_MEILHAUS_ME140D:
1170                *device_name = ME1400_NAME_DEVICE_ME1400D;
1171                *device_description = ME1400_DESCRIPTION_DEVICE_ME1400D;
1172                *driver_name = ME1400_NAME_DRIVER;
1173                break;
1174
1175        case PCI_DEVICE_ID_MEILHAUS_ME1600_4U:
1176                *device_name = ME1600_NAME_DEVICE_ME16004U;
1177                *device_description = ME1600_DESCRIPTION_DEVICE_ME16004U;
1178                *driver_name = ME1600_NAME_DRIVER;
1179                break;
1180
1181        case PCI_DEVICE_ID_MEILHAUS_ME1600_8U:
1182                *device_name = ME1600_NAME_DEVICE_ME16008U;
1183                *device_description = ME1600_DESCRIPTION_DEVICE_ME16008U;
1184                *driver_name = ME1600_NAME_DRIVER;
1185                break;
1186
1187        case PCI_DEVICE_ID_MEILHAUS_ME1600_12U:
1188                *device_name = ME1600_NAME_DEVICE_ME160012U;
1189                *device_description = ME1600_DESCRIPTION_DEVICE_ME160012U;
1190                *driver_name = ME1600_NAME_DRIVER;
1191                break;
1192
1193        case PCI_DEVICE_ID_MEILHAUS_ME1600_16U:
1194                *device_name = ME1600_NAME_DEVICE_ME160016U;
1195                *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U;
1196                *driver_name = ME1600_NAME_DRIVER;
1197                break;
1198
1199        case PCI_DEVICE_ID_MEILHAUS_ME1600_16U_8I:
1200                *device_name = ME1600_NAME_DEVICE_ME160016U8I;
1201                *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U8I;
1202                *driver_name = ME1600_NAME_DRIVER;
1203                break;
1204
1205        case PCI_DEVICE_ID_MEILHAUS_ME4610:
1206                *device_name = ME4600_NAME_DEVICE_ME4610;
1207                *device_description = ME4600_DESCRIPTION_DEVICE_ME4610;
1208                *driver_name = ME4600_NAME_DRIVER;
1209                break;
1210
1211        case PCI_DEVICE_ID_MEILHAUS_ME4650:
1212                *device_name = ME4600_NAME_DEVICE_ME4650;
1213                *device_description = ME4600_DESCRIPTION_DEVICE_ME4650;
1214                *driver_name = ME4600_NAME_DRIVER;
1215                break;
1216
1217        case PCI_DEVICE_ID_MEILHAUS_ME4660:
1218                *device_name = ME4600_NAME_DEVICE_ME4660;
1219                *device_description = ME4600_DESCRIPTION_DEVICE_ME4660;
1220                *driver_name = ME4600_NAME_DRIVER;
1221                break;
1222
1223        case PCI_DEVICE_ID_MEILHAUS_ME4660I:
1224                *device_name = ME4600_NAME_DEVICE_ME4660I;
1225                *device_description = ME4600_DESCRIPTION_DEVICE_ME4660I;
1226                *driver_name = ME4600_NAME_DRIVER;
1227                break;
1228
1229        case PCI_DEVICE_ID_MEILHAUS_ME4660S:
1230                *device_name = ME4600_NAME_DEVICE_ME4660S;
1231                *device_description = ME4600_DESCRIPTION_DEVICE_ME4660S;
1232                *driver_name = ME4600_NAME_DRIVER;
1233                break;
1234
1235        case PCI_DEVICE_ID_MEILHAUS_ME4660IS:
1236                *device_name = ME4600_NAME_DEVICE_ME4660IS;
1237                *device_description = ME4600_DESCRIPTION_DEVICE_ME4660IS;
1238                *driver_name = ME4600_NAME_DRIVER;
1239                break;
1240
1241        case PCI_DEVICE_ID_MEILHAUS_ME4670:
1242                *device_name = ME4600_NAME_DEVICE_ME4670;
1243                *device_description = ME4600_DESCRIPTION_DEVICE_ME4670;
1244                *driver_name = ME4600_NAME_DRIVER;
1245                break;
1246
1247        case PCI_DEVICE_ID_MEILHAUS_ME4670I:
1248                *device_name = ME4600_NAME_DEVICE_ME4670I;
1249                *device_description = ME4600_DESCRIPTION_DEVICE_ME4670I;
1250                *driver_name = ME4600_NAME_DRIVER;
1251                break;
1252
1253        case PCI_DEVICE_ID_MEILHAUS_ME4670S:
1254                *device_name = ME4600_NAME_DEVICE_ME4670S;
1255                *device_description = ME4600_DESCRIPTION_DEVICE_ME4670S;
1256                *driver_name = ME4600_NAME_DRIVER;
1257                break;
1258
1259        case PCI_DEVICE_ID_MEILHAUS_ME4670IS:
1260                *device_name = ME4600_NAME_DEVICE_ME4670IS;
1261                *device_description = ME4600_DESCRIPTION_DEVICE_ME4670IS;
1262                *driver_name = ME4600_NAME_DRIVER;
1263                break;
1264
1265        case PCI_DEVICE_ID_MEILHAUS_ME4680:
1266                *device_name = ME4600_NAME_DEVICE_ME4680;
1267                *device_description = ME4600_DESCRIPTION_DEVICE_ME4680;
1268                *driver_name = ME4600_NAME_DRIVER;
1269                break;
1270
1271        case PCI_DEVICE_ID_MEILHAUS_ME4680I:
1272                *device_name = ME4600_NAME_DEVICE_ME4680I;
1273                *device_description = ME4600_DESCRIPTION_DEVICE_ME4680I;
1274                *driver_name = ME4600_NAME_DRIVER;
1275                break;
1276
1277        case PCI_DEVICE_ID_MEILHAUS_ME4680S:
1278                *device_name = ME4600_NAME_DEVICE_ME4680S;
1279                *device_description = ME4600_DESCRIPTION_DEVICE_ME4680S;
1280                *driver_name = ME4600_NAME_DRIVER;
1281                break;
1282
1283        case PCI_DEVICE_ID_MEILHAUS_ME4680IS:
1284                *device_name = ME4600_NAME_DEVICE_ME4680IS;
1285                *device_description = ME4600_DESCRIPTION_DEVICE_ME4680IS;
1286                *driver_name = ME4600_NAME_DRIVER;
1287                break;
1288
1289        case PCI_DEVICE_ID_MEILHAUS_ME6004:
1290                *device_name = ME6000_NAME_DEVICE_ME60004;
1291                *device_description = ME6000_DESCRIPTION_DEVICE_ME60004;
1292                *driver_name = ME6000_NAME_DRIVER;
1293                break;
1294
1295        case PCI_DEVICE_ID_MEILHAUS_ME6008:
1296                *device_name = ME6000_NAME_DEVICE_ME60008;
1297                *device_description = ME6000_DESCRIPTION_DEVICE_ME60008;
1298                *driver_name = ME6000_NAME_DRIVER;
1299                break;
1300
1301        case PCI_DEVICE_ID_MEILHAUS_ME600F:
1302                *device_name = ME6000_NAME_DEVICE_ME600016;
1303                *device_description = ME6000_DESCRIPTION_DEVICE_ME600016;
1304                *driver_name = ME6000_NAME_DRIVER;
1305                break;
1306
1307        case PCI_DEVICE_ID_MEILHAUS_ME6014:
1308                *device_name = ME6000_NAME_DEVICE_ME6000I4;
1309                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4;
1310                *driver_name = ME6000_NAME_DRIVER;
1311                break;
1312
1313        case PCI_DEVICE_ID_MEILHAUS_ME6018:
1314                *device_name = ME6000_NAME_DEVICE_ME6000I8;
1315                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8;
1316                *driver_name = ME6000_NAME_DRIVER;
1317                break;
1318
1319        case PCI_DEVICE_ID_MEILHAUS_ME601F:
1320                *device_name = ME6000_NAME_DEVICE_ME6000I16;
1321                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16;
1322                *driver_name = ME6000_NAME_DRIVER;
1323                break;
1324
1325        case PCI_DEVICE_ID_MEILHAUS_ME6034:
1326                *device_name = ME6000_NAME_DEVICE_ME6000ISLE4;
1327                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4;
1328                *driver_name = ME6000_NAME_DRIVER;
1329                break;
1330
1331        case PCI_DEVICE_ID_MEILHAUS_ME6038:
1332                *device_name = ME6000_NAME_DEVICE_ME6000ISLE8;
1333                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8;
1334                *driver_name = ME6000_NAME_DRIVER;
1335                break;
1336
1337        case PCI_DEVICE_ID_MEILHAUS_ME603F:
1338                *device_name = ME6000_NAME_DEVICE_ME6000ISLE16;
1339                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16;
1340                *driver_name = ME6000_NAME_DRIVER;
1341                break;
1342
1343        case PCI_DEVICE_ID_MEILHAUS_ME6104:
1344                *device_name = ME6000_NAME_DEVICE_ME61004;
1345                *device_description = ME6000_DESCRIPTION_DEVICE_ME61004;
1346                *driver_name = ME6000_NAME_DRIVER;
1347                break;
1348
1349        case PCI_DEVICE_ID_MEILHAUS_ME6108:
1350                *device_name = ME6000_NAME_DEVICE_ME61008;
1351                *device_description = ME6000_DESCRIPTION_DEVICE_ME61008;
1352                *driver_name = ME6000_NAME_DRIVER;
1353                break;
1354
1355        case PCI_DEVICE_ID_MEILHAUS_ME610F:
1356                *device_name = ME6000_NAME_DEVICE_ME610016;
1357                *device_description = ME6000_DESCRIPTION_DEVICE_ME610016;
1358                *driver_name = ME6000_NAME_DRIVER;
1359                break;
1360
1361        case PCI_DEVICE_ID_MEILHAUS_ME6114:
1362                *device_name = ME6000_NAME_DEVICE_ME6100I4;
1363                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4;
1364                *driver_name = ME6000_NAME_DRIVER;
1365                break;
1366
1367        case PCI_DEVICE_ID_MEILHAUS_ME6118:
1368                *device_name = ME6000_NAME_DEVICE_ME6100I8;
1369                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8;
1370                *driver_name = ME6000_NAME_DRIVER;
1371                break;
1372
1373        case PCI_DEVICE_ID_MEILHAUS_ME611F:
1374                *device_name = ME6000_NAME_DEVICE_ME6100I16;
1375                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16;
1376                *driver_name = ME6000_NAME_DRIVER;
1377                break;
1378
1379        case PCI_DEVICE_ID_MEILHAUS_ME6134:
1380                *device_name = ME6000_NAME_DEVICE_ME6100ISLE4;
1381                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4;
1382                *driver_name = ME6000_NAME_DRIVER;
1383                break;
1384
1385        case PCI_DEVICE_ID_MEILHAUS_ME6138:
1386                *device_name = ME6000_NAME_DEVICE_ME6100ISLE8;
1387                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8;
1388                *driver_name = ME6000_NAME_DRIVER;
1389                break;
1390
1391        case PCI_DEVICE_ID_MEILHAUS_ME613F:
1392                *device_name = ME6000_NAME_DEVICE_ME6100ISLE16;
1393                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16;
1394                *driver_name = ME6000_NAME_DRIVER;
1395                break;
1396
1397        case PCI_DEVICE_ID_MEILHAUS_ME6044:
1398                *device_name = ME6000_NAME_DEVICE_ME60004DIO;
1399                *device_description = ME6000_DESCRIPTION_DEVICE_ME60004DIO;
1400                *driver_name = ME6000_NAME_DRIVER;
1401                break;
1402
1403        case PCI_DEVICE_ID_MEILHAUS_ME6048:
1404                *device_name = ME6000_NAME_DEVICE_ME60008DIO;
1405                *device_description = ME6000_DESCRIPTION_DEVICE_ME60008DIO;
1406                *driver_name = ME6000_NAME_DRIVER;
1407                break;
1408
1409        case PCI_DEVICE_ID_MEILHAUS_ME604F:
1410                *device_name = ME6000_NAME_DEVICE_ME600016DIO;
1411                *device_description = ME6000_DESCRIPTION_DEVICE_ME600016DIO;
1412                *driver_name = ME6000_NAME_DRIVER;
1413                break;
1414
1415        case PCI_DEVICE_ID_MEILHAUS_ME6054:
1416                *device_name = ME6000_NAME_DEVICE_ME6000I4DIO;
1417                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4DIO;
1418                *driver_name = ME6000_NAME_DRIVER;
1419                break;
1420
1421        case PCI_DEVICE_ID_MEILHAUS_ME6058:
1422                *device_name = ME6000_NAME_DEVICE_ME6000I8DIO;
1423                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8DIO;
1424                *driver_name = ME6000_NAME_DRIVER;
1425                break;
1426
1427        case PCI_DEVICE_ID_MEILHAUS_ME605F:
1428                *device_name = ME6000_NAME_DEVICE_ME6000I16DIO;
1429                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16DIO;
1430                *driver_name = ME6000_NAME_DRIVER;
1431                break;
1432
1433        case PCI_DEVICE_ID_MEILHAUS_ME6074:
1434                *device_name = ME6000_NAME_DEVICE_ME6000ISLE4DIO;
1435                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4DIO;
1436                *driver_name = ME6000_NAME_DRIVER;
1437                break;
1438
1439        case PCI_DEVICE_ID_MEILHAUS_ME6078:
1440                *device_name = ME6000_NAME_DEVICE_ME6000ISLE8DIO;
1441                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8DIO;
1442                *driver_name = ME6000_NAME_DRIVER;
1443                break;
1444
1445        case PCI_DEVICE_ID_MEILHAUS_ME607F:
1446                *device_name = ME6000_NAME_DEVICE_ME6000ISLE16DIO;
1447                *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16DIO;
1448                *driver_name = ME6000_NAME_DRIVER;
1449                break;
1450
1451        case PCI_DEVICE_ID_MEILHAUS_ME6144:
1452                *device_name = ME6000_NAME_DEVICE_ME61004DIO;
1453                *device_description = ME6000_DESCRIPTION_DEVICE_ME61004DIO;
1454                *driver_name = ME6000_NAME_DRIVER;
1455                break;
1456
1457        case PCI_DEVICE_ID_MEILHAUS_ME6148:
1458                *device_name = ME6000_NAME_DEVICE_ME61008DIO;
1459                *device_description = ME6000_DESCRIPTION_DEVICE_ME61008DIO;
1460                *driver_name = ME6000_NAME_DRIVER;
1461                break;
1462
1463        case PCI_DEVICE_ID_MEILHAUS_ME614F:
1464                *device_name = ME6000_NAME_DEVICE_ME610016DIO;
1465                *device_description = ME6000_DESCRIPTION_DEVICE_ME610016DIO;
1466                *driver_name = ME6000_NAME_DRIVER;
1467                break;
1468
1469        case PCI_DEVICE_ID_MEILHAUS_ME6154:
1470                *device_name = ME6000_NAME_DEVICE_ME6100I4DIO;
1471                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4DIO;
1472                *driver_name = ME6000_NAME_DRIVER;
1473                break;
1474
1475        case PCI_DEVICE_ID_MEILHAUS_ME6158:
1476                *device_name = ME6000_NAME_DEVICE_ME6100I8DIO;
1477                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8DIO;
1478                *driver_name = ME6000_NAME_DRIVER;
1479                break;
1480
1481        case PCI_DEVICE_ID_MEILHAUS_ME615F:
1482                *device_name = ME6000_NAME_DEVICE_ME6100I16DIO;
1483                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16DIO;
1484                *driver_name = ME6000_NAME_DRIVER;
1485                break;
1486
1487        case PCI_DEVICE_ID_MEILHAUS_ME6174:
1488                *device_name = ME6000_NAME_DEVICE_ME6100ISLE4DIO;
1489                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4DIO;
1490                *driver_name = ME6000_NAME_DRIVER;
1491                break;
1492
1493        case PCI_DEVICE_ID_MEILHAUS_ME6178:
1494                *device_name = ME6000_NAME_DEVICE_ME6100ISLE8DIO;
1495                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8DIO;
1496                *driver_name = ME6000_NAME_DRIVER;
1497                break;
1498
1499        case PCI_DEVICE_ID_MEILHAUS_ME617F:
1500                *device_name = ME6000_NAME_DEVICE_ME6100ISLE16DIO;
1501                *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16DIO;
1502                *driver_name = ME6000_NAME_DRIVER;
1503                break;
1504
1505        case PCI_DEVICE_ID_MEILHAUS_ME6259:
1506                *device_name = ME6000_NAME_DEVICE_ME6200I9DIO;
1507                *device_description = ME6000_DESCRIPTION_DEVICE_ME6200I9DIO;
1508                *driver_name = ME6000_NAME_DRIVER;
1509                break;
1510
1511        case PCI_DEVICE_ID_MEILHAUS_ME6359:
1512                *device_name = ME6000_NAME_DEVICE_ME6300I9DIO;
1513                *device_description = ME6000_DESCRIPTION_DEVICE_ME6300I9DIO;
1514                *driver_name = ME6000_NAME_DRIVER;
1515                break;
1516
1517        case PCI_DEVICE_ID_MEILHAUS_ME0630:
1518                *device_name = ME0600_NAME_DEVICE_ME0630;
1519                *device_description = ME0600_DESCRIPTION_DEVICE_ME0630;
1520                *driver_name = ME0600_NAME_DRIVER;
1521                break;
1522
1523        case PCI_DEVICE_ID_MEILHAUS_ME8100_A:
1524                *device_name = ME8100_NAME_DEVICE_ME8100A;
1525                *device_description = ME8100_DESCRIPTION_DEVICE_ME8100A;
1526                *driver_name = ME8100_NAME_DRIVER;
1527                break;
1528
1529        case PCI_DEVICE_ID_MEILHAUS_ME8100_B:
1530                *device_name = ME8100_NAME_DEVICE_ME8100B;
1531                *device_description = ME8100_DESCRIPTION_DEVICE_ME8100B;
1532                *driver_name = ME8100_NAME_DRIVER;
1533                break;
1534
1535        case PCI_DEVICE_ID_MEILHAUS_ME8200_A:
1536                *device_name = ME8200_NAME_DEVICE_ME8200A;
1537                *device_description = ME8200_DESCRIPTION_DEVICE_ME8200A;
1538                *driver_name = ME8200_NAME_DRIVER;
1539                break;
1540
1541        case PCI_DEVICE_ID_MEILHAUS_ME8200_B:
1542                *device_name = ME8200_NAME_DEVICE_ME8200B;
1543                *device_description = ME8200_DESCRIPTION_DEVICE_ME8200B;
1544                *driver_name = ME8200_NAME_DRIVER;
1545                break;
1546
1547        case PCI_DEVICE_ID_MEILHAUS_ME0940:
1548                *device_name = ME0900_NAME_DEVICE_ME0940;
1549                *device_description = ME0900_DESCRIPTION_DEVICE_ME0940;
1550                *driver_name = ME0900_NAME_DRIVER;
1551                break;
1552
1553        case PCI_DEVICE_ID_MEILHAUS_ME0950:
1554                *device_name = ME0900_NAME_DEVICE_ME0950;
1555                *device_description = ME0900_DESCRIPTION_DEVICE_ME0950;
1556                *driver_name = ME0900_NAME_DRIVER;
1557                break;
1558
1559        case PCI_DEVICE_ID_MEILHAUS_ME0960:
1560                *device_name = ME0900_NAME_DEVICE_ME0960;
1561                *device_description = ME0900_DESCRIPTION_DEVICE_ME0960;
1562                *driver_name = ME0900_NAME_DRIVER;
1563                break;
1564/*
1565                case USB_DEVICE_ID_MEPHISTO_S1:
1566                        *device_name = MEPHISTO_S1_NAME_DEVICE;
1567                        *device_description = MEPHISTO_S1_DESCRIPTION_DEVICE;
1568                        *driver_name = MEPHISTO_S1_NAME_DRIVER;
1569                        break;
1570*/
1571        default:
1572                *device_name = EMPTY_NAME_DEVICE;
1573                *device_description = EMPTY_DESCRIPTION_DEVICE;
1574                *driver_name = EMPTY_NAME_DRIVER;
1575
1576                PERROR("Invalid device id.\n");
1577
1578                return 1;
1579        }
1580
1581        return 0;
1582}
1583
1584int me_device_pci_init(me_device_t * me_device, struct pci_dev *pci_device)
1585{
1586        int err;
1587        int i;
1588
1589        PDEBUG("executed.\n");
1590
1591        // Initialize device list head.
1592        INIT_LIST_HEAD(&me_device->list);
1593
1594        // Initialize device description strings.
1595        err = get_device_descriptions(pci_device->device,
1596                                      &me_device->device_name,
1597                                      &me_device->device_description,
1598                                      &me_device->driver_name);
1599
1600        if (err) {
1601                PERROR("Cannot initialize device description strings.\n");
1602                return 1;
1603        }
1604        // Enable the pci device.
1605        err = pci_enable_device(pci_device);
1606
1607        if (err < 0) {
1608                PERROR("Cannot enable PCI device.\n");
1609                return 1;
1610        }
1611        // Request the PCI register regions.
1612        err = pci_request_regions(pci_device, me_device->device_name);
1613
1614        if (err < 0) {
1615                PERROR("Cannot request PCI regions.\n");
1616                goto ERROR_0;
1617        }
1618        // The bus carrying the device is a PCI bus.
1619        me_device->bus_type = ME_BUS_TYPE_PCI;
1620
1621        // Store the PCI information for later usage.
1622        me_device->info.pci.pci_device = pci_device;
1623
1624        // Get PCI register bases and sizes.
1625        for (i = 0; i < 6; i++) {
1626                me_device->info.pci.reg_bases[i] =
1627                    pci_resource_start(pci_device, i);
1628                me_device->info.pci.reg_sizes[i] =
1629                    pci_resource_len(pci_device, i);
1630        }
1631
1632        // Get the PCI location.
1633        me_device->info.pci.pci_bus_no = pci_device->bus->number;
1634        me_device->info.pci.pci_dev_no = PCI_SLOT(pci_device->devfn);
1635        me_device->info.pci.pci_func_no = PCI_FUNC(pci_device->devfn);
1636
1637        // Get Meilhaus specific device information.
1638        me_device->info.pci.vendor_id = pci_device->vendor;
1639        me_device->info.pci.device_id = pci_device->device;
1640        pci_read_config_byte(pci_device, 0x08,
1641                             &me_device->info.pci.hw_revision);
1642        pci_read_config_dword(pci_device, 0x2C, &me_device->info.pci.serial_no);
1643
1644        // Get the interrupt request number.
1645        me_device->irq = pci_device->irq;
1646
1647        // Initialize device lock instance.
1648        err = me_dlock_init(&me_device->dlock);
1649
1650        if (err) {
1651                PERROR("Cannot initialize device lock instance.\n");
1652                goto ERROR_1;
1653        }
1654        // Initialize subdevice list instance.
1655        me_slist_init(&me_device->slist);
1656
1657        if (err) {
1658                PERROR("Cannot initialize subdevice list instance.\n");
1659                goto ERROR_2;
1660        }
1661        // Initialize method pointers.
1662        me_device->me_device_io_irq_start = me_device_io_irq_start;
1663        me_device->me_device_io_irq_wait = me_device_io_irq_wait;
1664        me_device->me_device_io_irq_stop = me_device_io_irq_stop;
1665        me_device->me_device_io_reset_device = me_device_io_reset_device;
1666        me_device->me_device_io_reset_subdevice = me_device_io_reset_subdevice;
1667        me_device->me_device_io_single_config = me_device_io_single_config;
1668        me_device->me_device_io_single_read = me_device_io_single_read;
1669        me_device->me_device_io_single_write = me_device_io_single_write;
1670        me_device->me_device_io_stream_config = me_device_io_stream_config;
1671        me_device->me_device_io_stream_new_values =
1672            me_device_io_stream_new_values;
1673        me_device->me_device_io_stream_read = me_device_io_stream_read;
1674        me_device->me_device_io_stream_start = me_device_io_stream_start;
1675        me_device->me_device_io_stream_status = me_device_io_stream_status;
1676        me_device->me_device_io_stream_stop = me_device_io_stream_stop;
1677        me_device->me_device_io_stream_write = me_device_io_stream_write;
1678        me_device->me_device_lock_device = me_device_lock_device;
1679        me_device->me_device_lock_subdevice = me_device_lock_subdevice;
1680        me_device->me_device_query_description_device =
1681            me_device_query_description_device;
1682        me_device->me_device_query_info_device = me_device_query_info_device;
1683        me_device->me_device_query_name_device = me_device_query_name_device;
1684        me_device->me_device_query_name_device_driver =
1685            me_device_query_name_device_driver;
1686        me_device->me_device_query_number_subdevices =
1687            me_device_query_number_subdevices;
1688        me_device->me_device_query_number_channels =
1689            me_device_query_number_channels;
1690        me_device->me_device_query_number_ranges =
1691            me_device_query_number_ranges;
1692        me_device->me_device_query_range_by_min_max =
1693            me_device_query_range_by_min_max;
1694        me_device->me_device_query_range_info = me_device_query_range_info;
1695        me_device->me_device_query_subdevice_by_type =
1696            me_device_query_subdevice_by_type;
1697        me_device->me_device_query_subdevice_type =
1698            me_device_query_subdevice_type;
1699        me_device->me_device_query_subdevice_caps =
1700            me_device_query_subdevice_caps;
1701        me_device->me_device_query_subdevice_caps_args =
1702            me_device_query_subdevice_caps_args;
1703        me_device->me_device_query_timer = me_device_query_timer;
1704        me_device->me_device_query_version_device_driver =
1705            me_device_query_version_device_driver;
1706        me_device->me_device_config_load = me_device_config_load;
1707        me_device->me_device_destructor = me_device_destructor;
1708
1709        return 0;
1710
1711      ERROR_0:
1712        me_dlock_deinit(&me_device->dlock);
1713
1714      ERROR_1:
1715        pci_release_regions(pci_device);
1716
1717      ERROR_2:
1718        pci_disable_device(pci_device);
1719
1720        return 1;
1721}
1722
1723void me_device_deinit(me_device_t * me_device)
1724{
1725        PDEBUG("executed.\n");
1726
1727        me_slist_deinit(&me_device->slist);
1728        me_dlock_deinit(&me_device->dlock);
1729
1730        if (me_device->bus_type == ME_BUS_TYPE_PCI) {
1731                pci_release_regions(me_device->info.pci.pci_device);
1732                pci_disable_device(me_device->info.pci.pci_device);
1733        }
1734/*
1735        else
1736        {
1737                // Must be an USB device.
1738        }
1739*/
1740}
1741
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.