Blame view

drivers/zorro/zorro-driver.c 4.45 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  /*
   *  Zorro Driver Services
   *
   *  Copyright (C) 2003 Geert Uytterhoeven
   *
   *  Loosely based on drivers/pci/pci-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/zorro.h>
  
  
      /**
       *  zorro_match_device - Tell if a Zorro device structure has a matching
       *                       Zorro device id structure
       *  @ids: array of Zorro device id structures to search in
       *  @dev: the Zorro device structure to match against
       *
       *  Used by a driver to check whether a Zorro device present in the
       *  system is in its list of supported devices. Returns the matching
       *  zorro_device_id structure or %NULL if there is no match.
       */
  
  const struct zorro_device_id *
  zorro_match_device(const struct zorro_device_id *ids,
  		   const struct zorro_dev *z)
  {
  	while (ids->id) {
  		if (ids->id == ZORRO_WILDCARD || ids->id == z->id)
  			return ids;
  		ids++;
  	}
  	return NULL;
  }
d996e9dc4   Jim Rotmalm   zorro: Fix four c...
40
  EXPORT_SYMBOL(zorro_match_device);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  
  
  static int zorro_device_probe(struct device *dev)
  {
  	int error = 0;
  	struct zorro_driver *drv = to_zorro_driver(dev->driver);
  	struct zorro_dev *z = to_zorro_dev(dev);
  
  	if (!z->driver && drv->probe) {
  		const struct zorro_device_id *id;
  
  		id = zorro_match_device(drv->id_table, z);
  		if (id)
  			error = drv->probe(z, id);
  		if (error >= 0) {
  			z->driver = drv;
  			error = 0;
  		}
  	}
  	return error;
  }
2f9b0b5e4   Geert Uytterhoeven   Amiga zorro bus: ...
62
63
64
65
66
67
68
69
70
71
72
73
  static int zorro_device_remove(struct device *dev)
  {
  	struct zorro_dev *z = to_zorro_dev(dev);
  	struct zorro_driver *drv = to_zorro_driver(dev->driver);
  
  	if (drv) {
  		if (drv->remove)
  			drv->remove(z);
  		z->driver = NULL;
  	}
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
77
78
      /**
       *  zorro_register_driver - register a new Zorro driver
       *  @drv: the driver structure to register
       *
       *  Adds the driver structure to the list of registered drivers
33d8675ea   Bjorn Helgaas   [PATCH] amiga: fi...
79
       *  Returns zero or a negative error value.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
       */
  
  int zorro_register_driver(struct zorro_driver *drv)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
86
  	/* initialize common driver fields */
  	drv->driver.name = drv->name;
  	drv->driver.bus = &zorro_bus_type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
  
  	/* register with core */
33d8675ea   Bjorn Helgaas   [PATCH] amiga: fi...
89
  	return driver_register(&drv->driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  }
d996e9dc4   Jim Rotmalm   zorro: Fix four c...
91
  EXPORT_SYMBOL(zorro_register_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  
  
      /**
       *  zorro_unregister_driver - unregister a zorro driver
       *  @drv: the driver structure to unregister
       *
       *  Deletes the driver structure from the list of registered Zorro 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.
       */
  
  void zorro_unregister_driver(struct zorro_driver *drv)
  {
  	driver_unregister(&drv->driver);
  }
d996e9dc4   Jim Rotmalm   zorro: Fix four c...
108
  EXPORT_SYMBOL(zorro_unregister_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  
  
      /**
       *  zorro_bus_match - Tell if a Zorro device structure has a matching Zorro
       *                    device id structure
       *  @ids: array of Zorro device id structures to search in
       *  @dev: the Zorro device structure to match against
       *
       *  Used by a driver to check whether a Zorro device present in the
       *  system is in its list of supported devices.Returns the matching
       *  zorro_device_id structure or %NULL if there is no match.
       */
  
  static int zorro_bus_match(struct device *dev, struct device_driver *drv)
  {
  	struct zorro_dev *z = to_zorro_dev(dev);
  	struct zorro_driver *zorro_drv = to_zorro_driver(drv);
  	const struct zorro_device_id *ids = zorro_drv->id_table;
  
  	if (!ids)
  		return 0;
  
  	while (ids->id) {
  		if (ids->id == ZORRO_WILDCARD || ids->id == z->id)
  			return 1;
  		ids++;
  	}
  	return 0;
  }
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
  {
  #ifdef CONFIG_HOTPLUG
  	struct zorro_dev *z;
  
  	if (!dev)
  		return -ENODEV;
  
  	z = to_zorro_dev(dev);
  	if (!z)
  		return -ENODEV;
  
  	if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) ||
  	    add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) ||
  	    add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) ||
  	    add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id))
  		return -ENOMEM;
  
  	return 0;
  #else /* !CONFIG_HOTPLUG */
  	return -ENODEV;
  #endif /* !CONFIG_HOTPLUG */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
  
  struct bus_type zorro_bus_type = {
  	.name	= "zorro",
b6a01e9bd   Russell King   [PATCH] Add zorro...
164
  	.match	= zorro_bus_match,
bf54a2b3c   Geert Uytterhoeven   m68k: amiga - Zor...
165
  	.uevent	= zorro_uevent,
b6a01e9bd   Russell King   [PATCH] Add zorro...
166
  	.probe	= zorro_device_probe,
2f9b0b5e4   Geert Uytterhoeven   Amiga zorro bus: ...
167
  	.remove	= zorro_device_remove,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
  };
d996e9dc4   Jim Rotmalm   zorro: Fix four c...
169
  EXPORT_SYMBOL(zorro_bus_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
172
173
174
175
176
177
  
  
  static int __init zorro_driver_init(void)
  {
  	return bus_register(&zorro_bus_type);
  }
  
  postcore_initcall(zorro_driver_init);