diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-22 19:54:53 (GMT) |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-22 20:01:40 (GMT) |
commit | ae19ffbadc1b2100285a5b5b3d0a4e0a11390904 (patch) | |
tree | 3c2086ab67398a019089a47ca3f362a4bc6db74f /drivers/staging/meilhaus/medevice.c | |
parent | 34e84f39a27d059a3e6ec6e8b94aafa702e6f220 (diff) | |
parent | 9173a8ef24a6b1b8031507b35b8ffe5f85a87692 (diff) | |
download | linux-fsl-qoriq-ae19ffbadc1b2100285a5b5b3d0a4e0a11390904.tar.xz |
Merge branch 'master' into for-linus
Diffstat (limited to 'drivers/staging/meilhaus/medevice.c')
-rw-r--r-- | drivers/staging/meilhaus/medevice.c | 1740 |
1 files changed, 0 insertions, 1740 deletions
diff --git a/drivers/staging/meilhaus/medevice.c b/drivers/staging/meilhaus/medevice.c deleted file mode 100644 index 75aaec0..0000000 --- a/drivers/staging/meilhaus/medevice.c +++ /dev/null @@ -1,1740 +0,0 @@ -/** - * @file medevice.c - * - * @brief Meilhaus device base class. - * @note Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de) - * @author Guenter Gebhardt - * @author Krzysztof Gantzke (k.gantzke@meilhaus.de) - */ - -/* - * Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de) - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "mecommon.h" -#include "meinternal.h" -#include "medefines.h" -#include "meerror.h" - -#include "medebug.h" -#include "medevice.h" - -#ifndef __KERNEL__ -# define __KERNEL__ -#endif - -static int me_device_io_irq_start(struct me_device *device, - struct file *filep, - int subdevice, - int channel, - int irq_source, - int irq_edge, int irq_arg, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_irq_start(s, - filep, - channel, - irq_source, - irq_edge, irq_arg, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_irq_wait(struct me_device *device, - struct file *filep, - int subdevice, - int channel, - int *irq_count, - int *value, int time_out, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_irq_wait(s, - filep, - channel, - irq_count, - value, time_out, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_irq_stop(struct me_device *device, - struct file *filep, - int subdevice, int channel, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_irq_stop(s, filep, channel, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_reset_device(struct me_device *device, - struct file *filep, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - int i, n; - - PDEBUG("executed.\n"); - - /* Get the number of subdevices. */ - n = me_slist_get_number_subdevices(&device->slist); - - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - - /* Reset every subdevice in list. */ - for (i = 0; i < n; i++) { - s = me_slist_get_subdevice(&device->slist, i); - err = s->me_subdevice_io_reset_subdevice(s, filep, flags); - - if (err) { - PERROR("Cannot reset subdevice.\n"); - break; - } - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_reset_subdevice(struct me_device *device, - struct file *filep, - int subdevice, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_reset_subdevice(s, filep, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_single_config(struct me_device *device, - struct file *filep, - int subdevice, - int channel, - int single_config, - int ref, - int trig_chan, - int trig_type, int trig_edge, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_single_config(s, - filep, - channel, - single_config, - ref, - trig_chan, - trig_type, - trig_edge, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_single_read(struct me_device *device, - struct file *filep, - int subdevice, - int channel, - int *value, int time_out, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_single_read(s, - filep, - channel, - value, time_out, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_single_write(struct me_device *device, - struct file *filep, - int subdevice, - int channel, - int value, int time_out, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_single_write(s, - filep, - channel, - value, time_out, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_config(struct me_device *device, - struct file *filep, - int subdevice, - meIOStreamConfig_t *config_list, - int count, - meIOStreamTrigger_t *trigger, - int fifo_irq_threshold, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_config(s, - filep, - config_list, - count, - trigger, - fifo_irq_threshold, - flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_new_values(struct me_device *device, - struct file *filep, - int subdevice, - int time_out, int *count, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_new_values(s, - filep, - time_out, - count, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_read(struct me_device *device, - struct file *filep, - int subdevice, - int read_mode, - int *values, int *count, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_read(s, - filep, - read_mode, - values, count, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_start(struct me_device *device, - struct file *filep, - int subdevice, - int start_mode, int time_out, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_start(s, - filep, - start_mode, - time_out, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_status(struct me_device *device, - struct file *filep, - int subdevice, - int wait, - int *status, int *count, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_status(s, - filep, - wait, - status, count, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_stop(struct me_device *device, - struct file *filep, - int subdevice, int stop_mode, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_stop(s, - filep, stop_mode, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_io_stream_write(struct me_device *device, - struct file *filep, - int subdevice, - int write_mode, - int *values, int *count, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_io_stream_write(s, - filep, - write_mode, - values, count, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_lock_device(struct me_device *device, - struct file *filep, int lock, int flags) -{ - PDEBUG("executed.\n"); - - return me_dlock_lock(&device->dlock, - filep, lock, flags, &device->slist); -} - -static int me_device_lock_subdevice(struct me_device *device, - struct file *filep, - int subdevice, int lock, int flags) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Enter device. - err = me_dlock_enter(&device->dlock, filep); - - if (err) { - PERROR("Cannot enter device.\n"); - return err; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_lock_subdevice(s, filep, lock, flags); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - // Exit device. - me_dlock_exit(&device->dlock, filep); - - return err; -} - -static int me_device_query_description_device(struct me_device *device, - char **description) -{ - PDEBUG("executed.\n"); - *description = device->device_description; - return ME_ERRNO_SUCCESS; -} - -static int me_device_query_info_device(struct me_device *device, - int *vendor_id, - int *device_id, - int *serial_no, - int *bus_type, - int *bus_no, - int *dev_no, int *func_no, int *plugged) -{ - PDEBUG("executed.\n"); - - if (device->bus_type == ME_BUS_TYPE_PCI) { - *vendor_id = device->info.pci.vendor_id; - *device_id = device->info.pci.device_id; - *serial_no = device->info.pci.serial_no; - *bus_type = ME_BUS_TYPE_PCI; - *bus_no = device->info.pci.pci_bus_no; - *dev_no = device->info.pci.pci_dev_no; - *func_no = device->info.pci.pci_func_no; - *plugged = ME_PLUGGED_IN; - } else { - *plugged = ME_PLUGGED_OUT; - } - return ME_ERRNO_SUCCESS; -} - -static int me_device_query_name_device(struct me_device *device, char **name) -{ - PDEBUG("executed.\n"); - *name = device->device_name; - return ME_ERRNO_SUCCESS; -} - -static int me_device_query_name_device_driver(struct me_device *device, - char **name) -{ - PDEBUG("executed.\n"); - *name = device->driver_name; - return ME_ERRNO_SUCCESS; -} - -static int me_device_query_number_subdevices(struct me_device *device, - int *number) -{ - PDEBUG("executed.\n"); - return me_slist_query_number_subdevices(&device->slist, number); -} - -static int me_device_query_number_channels(struct me_device *device, - int subdevice, int *number) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_number_channels(s, number); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_number_ranges(struct me_device *device, - int subdevice, int unit, int *count) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_number_ranges(s, unit, count); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_range_by_min_max(struct me_device *device, - int subdevice, - int unit, - int *min, - int *max, int *maxdata, int *range) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_range_by_min_max(s, - unit, - min, - max, - maxdata, range); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_range_info(struct me_device *device, - int subdevice, - int range, - int *unit, - int *min, int *max, int *maxdata) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_range_info(s, - range, - unit, min, max, maxdata); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_subdevice_by_type(struct me_device *device, - int start_subdevice, - int type, - int subtype, int *subdevice) -{ - PDEBUG("executed.\n"); - - return me_slist_get_subdevice_by_type(&device->slist, - start_subdevice, - type, subtype, subdevice); -} - -static int me_device_query_subdevice_type(struct me_device *device, - int subdevice, - int *type, int *subtype) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_subdevice_type(s, type, subtype); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_subdevice_caps(struct me_device *device, - int subdevice, int *caps) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_subdevice_caps(s, caps); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_subdevice_caps_args(struct me_device *device, - int subdevice, - int cap, int *args, int count) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_subdevice_caps_args(s, - cap, - args, count); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_timer(struct me_device *device, - int subdevice, - int timer, - int *base_frequency, - uint64_t *min_ticks, uint64_t *max_ticks) -{ - int err = ME_ERRNO_SUCCESS; - me_subdevice_t *s; - - PDEBUG("executed.\n"); - - // Check subdevice index. - - if (subdevice >= me_slist_get_number_subdevices(&device->slist)) { - PERROR("Invalid subdevice.\n"); - return ME_ERRNO_INVALID_SUBDEVICE; - } - // Get subdevice instance. - s = me_slist_get_subdevice(&device->slist, subdevice); - - if (s) { - // Call subdevice method. - err = s->me_subdevice_query_timer(s, - timer, - base_frequency, - min_ticks, max_ticks); - } else { - // Something really bad happened. - PERROR("Cannot get subdevice instance.\n"); - err = ME_ERRNO_INTERNAL; - } - - return err; -} - -static int me_device_query_version_device_driver(struct me_device *device, - int *version) -/** @todo Versions shold be read from driver. I must overwrite this function in each module. Here should be returned an error! -*/ -{ - PDEBUG("executed.\n"); - *version = ME_VERSION_DRIVER; - return ME_ERRNO_SUCCESS; -} - -static int me_device_config_load(struct me_device *device, struct file *filep, - me_cfg_device_entry_t *config) -{ - PDEBUG("executed.\n"); - return ME_ERRNO_SUCCESS; //If no need for config return success. -// return ME_ERRNO_NOT_SUPPORTED; -} - -static void me_device_destructor(me_device_t *me_device) -{ - PDEBUG("executed.\n"); - me_device_deinit(me_device); - kfree(me_device); -} - -/* //me_device_usb_init -int me_device_usb_init(me_device_t *me_device, struct usb_interface *interface) -{ - PDEBUG("executed.\n"); - return -1; -} -*/ - -static int get_device_descriptions(uint16_t device_id, - char **device_name, - char **device_description, - char **driver_name) -/** @todo This is wrong concept! Static table has too strong limitations! -* 'device_name' and 'driver_name' should be calculated from 'device_id' -* 'device_description' should be read from device or moved to user space and handled by library! -*/ -{ - PDEBUG("executed.\n"); - - switch (device_id) { - case PCI_DEVICE_ID_MEILHAUS_ME1000: - case PCI_DEVICE_ID_MEILHAUS_ME1000_A: - case PCI_DEVICE_ID_MEILHAUS_ME1000_B: - *device_name = ME1000_NAME_DEVICE_ME1000; - *device_description = ME1000_DESCRIPTION_DEVICE_ME1000; - *driver_name = ME1000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1400: - *device_name = ME1400_NAME_DEVICE_ME1400; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME140A: - *device_name = ME1400_NAME_DEVICE_ME1400A; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400A; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME140B: - *device_name = ME1400_NAME_DEVICE_ME1400B; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400B; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME14E0: - *device_name = ME1400_NAME_DEVICE_ME1400E; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400E; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME14EA: - *device_name = ME1400_NAME_DEVICE_ME1400EA; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EA; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME14EB: - *device_name = ME1400_NAME_DEVICE_ME1400EB; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400EB; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME140C: - *device_name = ME1400_NAME_DEVICE_ME1400C; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400C; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME140D: - *device_name = ME1400_NAME_DEVICE_ME1400D; - *device_description = ME1400_DESCRIPTION_DEVICE_ME1400D; - *driver_name = ME1400_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1600_4U: - *device_name = ME1600_NAME_DEVICE_ME16004U; - *device_description = ME1600_DESCRIPTION_DEVICE_ME16004U; - *driver_name = ME1600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1600_8U: - *device_name = ME1600_NAME_DEVICE_ME16008U; - *device_description = ME1600_DESCRIPTION_DEVICE_ME16008U; - *driver_name = ME1600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1600_12U: - *device_name = ME1600_NAME_DEVICE_ME160012U; - *device_description = ME1600_DESCRIPTION_DEVICE_ME160012U; - *driver_name = ME1600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1600_16U: - *device_name = ME1600_NAME_DEVICE_ME160016U; - *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U; - *driver_name = ME1600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME1600_16U_8I: - *device_name = ME1600_NAME_DEVICE_ME160016U8I; - *device_description = ME1600_DESCRIPTION_DEVICE_ME160016U8I; - *driver_name = ME1600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4610: - *device_name = ME4600_NAME_DEVICE_ME4610; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4610; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4650: - *device_name = ME4600_NAME_DEVICE_ME4650; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4650; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4660: - *device_name = ME4600_NAME_DEVICE_ME4660; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4660; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4660I: - *device_name = ME4600_NAME_DEVICE_ME4660I; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4660I; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4660S: - *device_name = ME4600_NAME_DEVICE_ME4660S; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4660S; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4660IS: - *device_name = ME4600_NAME_DEVICE_ME4660IS; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4660IS; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4670: - *device_name = ME4600_NAME_DEVICE_ME4670; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4670; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4670I: - *device_name = ME4600_NAME_DEVICE_ME4670I; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4670I; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4670S: - *device_name = ME4600_NAME_DEVICE_ME4670S; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4670S; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4670IS: - *device_name = ME4600_NAME_DEVICE_ME4670IS; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4670IS; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4680: - *device_name = ME4600_NAME_DEVICE_ME4680; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4680; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4680I: - *device_name = ME4600_NAME_DEVICE_ME4680I; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4680I; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4680S: - *device_name = ME4600_NAME_DEVICE_ME4680S; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4680S; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME4680IS: - *device_name = ME4600_NAME_DEVICE_ME4680IS; - *device_description = ME4600_DESCRIPTION_DEVICE_ME4680IS; - *driver_name = ME4600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6004: - *device_name = ME6000_NAME_DEVICE_ME60004; - *device_description = ME6000_DESCRIPTION_DEVICE_ME60004; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6008: - *device_name = ME6000_NAME_DEVICE_ME60008; - *device_description = ME6000_DESCRIPTION_DEVICE_ME60008; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME600F: - *device_name = ME6000_NAME_DEVICE_ME600016; - *device_description = ME6000_DESCRIPTION_DEVICE_ME600016; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6014: - *device_name = ME6000_NAME_DEVICE_ME6000I4; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6018: - *device_name = ME6000_NAME_DEVICE_ME6000I8; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME601F: - *device_name = ME6000_NAME_DEVICE_ME6000I16; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6034: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE4; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6038: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE8; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME603F: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE16; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6104: - *device_name = ME6000_NAME_DEVICE_ME61004; - *device_description = ME6000_DESCRIPTION_DEVICE_ME61004; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6108: - *device_name = ME6000_NAME_DEVICE_ME61008; - *device_description = ME6000_DESCRIPTION_DEVICE_ME61008; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME610F: - *device_name = ME6000_NAME_DEVICE_ME610016; - *device_description = ME6000_DESCRIPTION_DEVICE_ME610016; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6114: - *device_name = ME6000_NAME_DEVICE_ME6100I4; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6118: - *device_name = ME6000_NAME_DEVICE_ME6100I8; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME611F: - *device_name = ME6000_NAME_DEVICE_ME6100I16; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6134: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE4; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6138: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE8; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME613F: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE16; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6044: - *device_name = ME6000_NAME_DEVICE_ME60004DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME60004DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6048: - *device_name = ME6000_NAME_DEVICE_ME60008DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME60008DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME604F: - *device_name = ME6000_NAME_DEVICE_ME600016DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME600016DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6054: - *device_name = ME6000_NAME_DEVICE_ME6000I4DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I4DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6058: - *device_name = ME6000_NAME_DEVICE_ME6000I8DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I8DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME605F: - *device_name = ME6000_NAME_DEVICE_ME6000I16DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000I16DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6074: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE4DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE4DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6078: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE8DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE8DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME607F: - *device_name = ME6000_NAME_DEVICE_ME6000ISLE16DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6000ISLE16DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6144: - *device_name = ME6000_NAME_DEVICE_ME61004DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME61004DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6148: - *device_name = ME6000_NAME_DEVICE_ME61008DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME61008DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME614F: - *device_name = ME6000_NAME_DEVICE_ME610016DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME610016DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6154: - *device_name = ME6000_NAME_DEVICE_ME6100I4DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I4DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6158: - *device_name = ME6000_NAME_DEVICE_ME6100I8DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I8DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME615F: - *device_name = ME6000_NAME_DEVICE_ME6100I16DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100I16DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6174: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE4DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE4DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6178: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE8DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE8DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME617F: - *device_name = ME6000_NAME_DEVICE_ME6100ISLE16DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6100ISLE16DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6259: - *device_name = ME6000_NAME_DEVICE_ME6200I9DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6200I9DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME6359: - *device_name = ME6000_NAME_DEVICE_ME6300I9DIO; - *device_description = ME6000_DESCRIPTION_DEVICE_ME6300I9DIO; - *driver_name = ME6000_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME0630: - *device_name = ME0600_NAME_DEVICE_ME0630; - *device_description = ME0600_DESCRIPTION_DEVICE_ME0630; - *driver_name = ME0600_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME8100_A: - *device_name = ME8100_NAME_DEVICE_ME8100A; - *device_description = ME8100_DESCRIPTION_DEVICE_ME8100A; - *driver_name = ME8100_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME8100_B: - *device_name = ME8100_NAME_DEVICE_ME8100B; - *device_description = ME8100_DESCRIPTION_DEVICE_ME8100B; - *driver_name = ME8100_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME8200_A: - *device_name = ME8200_NAME_DEVICE_ME8200A; - *device_description = ME8200_DESCRIPTION_DEVICE_ME8200A; - *driver_name = ME8200_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME8200_B: - *device_name = ME8200_NAME_DEVICE_ME8200B; - *device_description = ME8200_DESCRIPTION_DEVICE_ME8200B; - *driver_name = ME8200_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME0940: - *device_name = ME0900_NAME_DEVICE_ME0940; - *device_description = ME0900_DESCRIPTION_DEVICE_ME0940; - *driver_name = ME0900_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME0950: - *device_name = ME0900_NAME_DEVICE_ME0950; - *device_description = ME0900_DESCRIPTION_DEVICE_ME0950; - *driver_name = ME0900_NAME_DRIVER; - break; - - case PCI_DEVICE_ID_MEILHAUS_ME0960: - *device_name = ME0900_NAME_DEVICE_ME0960; - *device_description = ME0900_DESCRIPTION_DEVICE_ME0960; - *driver_name = ME0900_NAME_DRIVER; - break; -/* - case USB_DEVICE_ID_MEPHISTO_S1: - *device_name = MEPHISTO_S1_NAME_DEVICE; - *device_description = MEPHISTO_S1_DESCRIPTION_DEVICE; - *driver_name = MEPHISTO_S1_NAME_DRIVER; - break; -*/ - default: - *device_name = EMPTY_NAME_DEVICE; - *device_description = EMPTY_DESCRIPTION_DEVICE; - *driver_name = EMPTY_NAME_DRIVER; - - PERROR("Invalid device id.\n"); - - return 1; - } - - return 0; -} - -int me_device_pci_init(me_device_t *me_device, struct pci_dev *pci_device) -{ - int err; - int i; - - PDEBUG("executed.\n"); - - // Initialize device list head. - INIT_LIST_HEAD(&me_device->list); - - // Initialize device description strings. - err = get_device_descriptions(pci_device->device, - &me_device->device_name, - &me_device->device_description, - &me_device->driver_name); - - if (err) { - PERROR("Cannot initialize device description strings.\n"); - return 1; - } - // Enable the pci device. - err = pci_enable_device(pci_device); - - if (err < 0) { - PERROR("Cannot enable PCI device.\n"); - return 1; - } - // Request the PCI register regions. - err = pci_request_regions(pci_device, me_device->device_name); - - if (err < 0) { - PERROR("Cannot request PCI regions.\n"); - goto ERROR_0; - } - // The bus carrying the device is a PCI bus. - me_device->bus_type = ME_BUS_TYPE_PCI; - - // Store the PCI information for later usage. - me_device->info.pci.pci_device = pci_device; - - // Get PCI register bases and sizes. - for (i = 0; i < 6; i++) { - me_device->info.pci.reg_bases[i] = - pci_resource_start(pci_device, i); - me_device->info.pci.reg_sizes[i] = - pci_resource_len(pci_device, i); - } - - // Get the PCI location. - me_device->info.pci.pci_bus_no = pci_device->bus->number; - me_device->info.pci.pci_dev_no = PCI_SLOT(pci_device->devfn); - me_device->info.pci.pci_func_no = PCI_FUNC(pci_device->devfn); - - // Get Meilhaus specific device information. - me_device->info.pci.vendor_id = pci_device->vendor; - me_device->info.pci.device_id = pci_device->device; - pci_read_config_byte(pci_device, 0x08, - &me_device->info.pci.hw_revision); - pci_read_config_dword(pci_device, 0x2C, &me_device->info.pci.serial_no); - - // Get the interrupt request number. - me_device->irq = pci_device->irq; - - // Initialize device lock instance. - err = me_dlock_init(&me_device->dlock); - - if (err) { - PERROR("Cannot initialize device lock instance.\n"); - goto ERROR_1; - } - // Initialize subdevice list instance. - me_slist_init(&me_device->slist); - - if (err) { - PERROR("Cannot initialize subdevice list instance.\n"); - goto ERROR_2; - } - // Initialize method pointers. - me_device->me_device_io_irq_start = me_device_io_irq_start; - me_device->me_device_io_irq_wait = me_device_io_irq_wait; - me_device->me_device_io_irq_stop = me_device_io_irq_stop; - me_device->me_device_io_reset_device = me_device_io_reset_device; - me_device->me_device_io_reset_subdevice = me_device_io_reset_subdevice; - me_device->me_device_io_single_config = me_device_io_single_config; - me_device->me_device_io_single_read = me_device_io_single_read; - me_device->me_device_io_single_write = me_device_io_single_write; - me_device->me_device_io_stream_config = me_device_io_stream_config; - me_device->me_device_io_stream_new_values = - me_device_io_stream_new_values; - me_device->me_device_io_stream_read = me_device_io_stream_read; - me_device->me_device_io_stream_start = me_device_io_stream_start; - me_device->me_device_io_stream_status = me_device_io_stream_status; - me_device->me_device_io_stream_stop = me_device_io_stream_stop; - me_device->me_device_io_stream_write = me_device_io_stream_write; - me_device->me_device_lock_device = me_device_lock_device; - me_device->me_device_lock_subdevice = me_device_lock_subdevice; - me_device->me_device_query_description_device = - me_device_query_description_device; - me_device->me_device_query_info_device = me_device_query_info_device; - me_device->me_device_query_name_device = me_device_query_name_device; - me_device->me_device_query_name_device_driver = - me_device_query_name_device_driver; - me_device->me_device_query_number_subdevices = - me_device_query_number_subdevices; - me_device->me_device_query_number_channels = - me_device_query_number_channels; - me_device->me_device_query_number_ranges = - me_device_query_number_ranges; - me_device->me_device_query_range_by_min_max = - me_device_query_range_by_min_max; - me_device->me_device_query_range_info = me_device_query_range_info; - me_device->me_device_query_subdevice_by_type = - me_device_query_subdevice_by_type; - me_device->me_device_query_subdevice_type = - me_device_query_subdevice_type; - me_device->me_device_query_subdevice_caps = - me_device_query_subdevice_caps; - me_device->me_device_query_subdevice_caps_args = - me_device_query_subdevice_caps_args; - me_device->me_device_query_timer = me_device_query_timer; - me_device->me_device_query_version_device_driver = - me_device_query_version_device_driver; - me_device->me_device_config_load = me_device_config_load; - me_device->me_device_destructor = me_device_destructor; - - return 0; - - ERROR_0: - me_dlock_deinit(&me_device->dlock); - - ERROR_1: - pci_release_regions(pci_device); - - ERROR_2: - pci_disable_device(pci_device); - - return 1; -} - -void me_device_deinit(me_device_t *me_device) -{ - PDEBUG("executed.\n"); - - me_slist_deinit(&me_device->slist); - me_dlock_deinit(&me_device->dlock); - - if (me_device->bus_type == ME_BUS_TYPE_PCI) { - pci_release_regions(me_device->info.pci.pci_device); - pci_disable_device(me_device->info.pci.pci_device); - } -/* - else - { - // Must be an USB device. - } -*/ -} |