Blame view

drivers/dio/dio-driver.c 3.44 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   *  DIO Driver Services
   *
   *  Copyright (C) 2004 Jochen Friedrich
   *
   *  Loosely based on drivers/pci/pci-driver.c and drivers/zorro/zorro-driver.c
   *
   *  This file is subject to the terms and conditions of the GNU General Public
   *  License.  See the file COPYING in the main directory of this archive
   *  for more details.
   */
  
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/dio.h>
771fcb58e   Randy Dunlap   dio: fix kernel-d...
16
17
18
19
20
21
22
23
24
  /**
   *  dio_match_device - Tell if a DIO device structure has a matching DIO device id structure
   *  @ids: array of DIO device id structures to search in
   *  @d: the DIO device structure to match against
   *
   *  Used by a driver to check whether a DIO device present in the
   *  system is in its list of supported devices. Returns the matching
   *  dio_device_id structure or %NULL if there is no match.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  
  const struct dio_device_id *
  dio_match_device(const struct dio_device_id *ids,
  		   const struct dio_dev *d)
  {
  	while (ids->id) {
  		if (ids->id == DIO_WILDCARD)
  			return ids;
  		if (DIO_NEEDSSECID(ids->id & 0xff)) {
  			if (ids->id == d->id)
  				return ids;
  		} else {
  			if ((ids->id & 0xff) == (d->id & 0xff))
  				return ids;
  		}
  		ids++;
  	}
  	return NULL;
  }
  
  static int dio_device_probe(struct device *dev)
  {
  	int error = 0;
  	struct dio_driver *drv = to_dio_driver(dev->driver);
  	struct dio_dev *d = to_dio_dev(dev);
  
  	if (!d->driver && drv->probe) {
  		const struct dio_device_id *id;
  
  		id = dio_match_device(drv->id_table, d);
  		if (id)
  			error = drv->probe(d, id);
  		if (error >= 0) {
  			d->driver = drv;
  			error = 0;
  		}
  	}
  	return error;
  }
771fcb58e   Randy Dunlap   dio: fix kernel-d...
64
65
66
67
68
69
70
  /**
   *  dio_register_driver - register a new DIO driver
   *  @drv: the driver structure to register
   *
   *  Adds the driver structure to the list of registered drivers
   *  Returns zero or a negative error value.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
  
  int dio_register_driver(struct dio_driver *drv)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
  	/* initialize common driver fields */
  	drv->driver.name = drv->name;
  	drv->driver.bus = &dio_bus_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
  
  	/* register with core */
e51c01b08   Bjorn Helgaas   [PATCH] hp300: fi...
79
  	return driver_register(&drv->driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
  }
771fcb58e   Randy Dunlap   dio: fix kernel-d...
81
82
83
84
85
86
87
88
89
  /**
   *  dio_unregister_driver - unregister a DIO driver
   *  @drv: the driver structure to unregister
   *
   *  Deletes the driver structure from the list of registered DIO drivers,
   *  gives it a chance to clean up by calling its remove() function for
   *  each device it was responsible for, and marks those devices as
   *  driverless.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
92
93
94
  
  void dio_unregister_driver(struct dio_driver *drv)
  {
  	driver_unregister(&drv->driver);
  }
771fcb58e   Randy Dunlap   dio: fix kernel-d...
95
96
97
98
99
100
101
102
103
  /**
   *  dio_bus_match - Tell if a DIO device structure has a matching DIO device id structure
   *  @dev: the DIO device structure to match against
   *  @drv: the &device_driver that points to the array of DIO device id structures to search
   *
   *  Used by a driver to check whether a DIO device present in the
   *  system is in its list of supported devices. Returns the matching
   *  dio_device_id structure or %NULL if there is no match.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
107
108
109
110
111
112
  
  static int dio_bus_match(struct device *dev, struct device_driver *drv)
  {
  	struct dio_dev *d = to_dio_dev(dev);
  	struct dio_driver *dio_drv = to_dio_driver(drv);
  	const struct dio_device_id *ids = dio_drv->id_table;
  
  	if (!ids)
  		return 0;
18c993629   Akinobu Mita   dio: use dio_matc...
113
  	return dio_match_device(ids, d) ? 1 : 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
115
116
117
118
  }
  
  
  struct bus_type dio_bus_type = {
  	.name	= "dio",
5b34bf887   Russell King   [PATCH] Add dio_b...
119
120
  	.match	= dio_bus_match,
  	.probe	= dio_device_probe,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
124
125
126
127
128
129
130
131
132
133
  };
  
  
  static int __init dio_driver_init(void)
  {
  	return bus_register(&dio_bus_type);
  }
  
  postcore_initcall(dio_driver_init);
  
  EXPORT_SYMBOL(dio_match_device);
  EXPORT_SYMBOL(dio_register_driver);
  EXPORT_SYMBOL(dio_unregister_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  EXPORT_SYMBOL(dio_bus_type);