aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@gmail.com>2010-12-14 12:16:38 -0500
committerDave Airlie <airlied@redhat.com>2011-02-06 22:09:36 -0500
commit8410ea3b95d105a5be5db501656f44bbb91197c1 (patch)
tree6cd27f207e50c13ba2f4a78d6323bc23f751e380
parentff72145badb834e8051719ea66e024784d000cb4 (diff)
drm: rework PCI/platform driver interface.
This abstracts the pci/platform interface out a step further, we can go further but this is far enough for now to allow USB to be plugged in. The drivers now just call the init code directly for their device type. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/drm_drv.c43
-rw-r--r--drivers/gpu/drm/drm_info.c27
-rw-r--r--drivers/gpu/drm/drm_ioctl.c115
-rw-r--r--drivers/gpu/drm/drm_irq.c14
-rw-r--r--drivers/gpu/drm/drm_pci.c205
-rw-r--r--drivers/gpu/drm/drm_platform.c75
-rw-r--r--drivers/gpu/drm/drm_stub.c20
-rw-r--r--drivers/gpu/drm/i810/i810_drv.c14
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c20
-rw-r--r--drivers/gpu/drm/mga/mga_dma.c2
-rw-r--r--drivers/gpu/drm/mga/mga_drv.c13
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.c21
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c4
-rw-r--r--drivers/gpu/drm/r128/r128_drv.c14
-rw-r--r--drivers/gpu/drm/radeon/radeon_cp.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c36
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c4
-rw-r--r--drivers/gpu/drm/savage/savage_drv.c14
-rw-r--r--drivers/gpu/drm/sis/sis_drv.c13
-rw-r--r--drivers/gpu/drm/tdfx/tdfx_drv.c13
-rw-r--r--drivers/gpu/drm/via/via_drv.c13
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c23
-rw-r--r--include/drm/drmP.h106
24 files changed, 456 insertions, 359 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 3e991980cee2..0d04914eb058 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -237,49 +237,6 @@ int drm_lastclose(struct drm_device * dev)
237 return 0; 237 return 0;
238} 238}
239 239
240/**
241 * Module initialization. Called via init_module at module load time, or via
242 * linux/init/main.c (this is not currently supported).
243 *
244 * \return zero on success or a negative number on failure.
245 *
246 * Initializes an array of drm_device structures, and attempts to
247 * initialize all available devices, using consecutive minors, registering the
248 * stubs and initializing the device.
249 *
250 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
251 * after the initialization for driver customization.
252 */
253int drm_init(struct drm_driver *driver)
254{
255 DRM_DEBUG("\n");
256 INIT_LIST_HEAD(&driver->device_list);
257
258 if (driver->driver_features & DRIVER_USE_PLATFORM_DEVICE)
259 return drm_platform_init(driver);
260 else
261 return drm_pci_init(driver);
262}
263
264EXPORT_SYMBOL(drm_init);
265
266void drm_exit(struct drm_driver *driver)
267{
268 struct drm_device *dev, *tmp;
269 DRM_DEBUG("\n");
270
271 if (driver->driver_features & DRIVER_MODESET) {
272 pci_unregister_driver(&driver->pci_driver);
273 } else {
274 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
275 drm_put_dev(dev);
276 }
277
278 DRM_INFO("Module unloaded\n");
279}
280
281EXPORT_SYMBOL(drm_exit);
282
283/** File operations structure */ 240/** File operations structure */
284static const struct file_operations drm_stub_fops = { 241static const struct file_operations drm_stub_fops = {
285 .owner = THIS_MODULE, 242 .owner = THIS_MODULE,
diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c
index 3cdbaf379bb5..812aaac4438a 100644
--- a/drivers/gpu/drm/drm_info.c
+++ b/drivers/gpu/drm/drm_info.c
@@ -47,30 +47,19 @@ int drm_name_info(struct seq_file *m, void *data)
47 struct drm_minor *minor = node->minor; 47 struct drm_minor *minor = node->minor;
48 struct drm_device *dev = minor->dev; 48 struct drm_device *dev = minor->dev;
49 struct drm_master *master = minor->master; 49 struct drm_master *master = minor->master;
50 50 const char *bus_name;
51 if (!master) 51 if (!master)
52 return 0; 52 return 0;
53 53
54 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) { 54 bus_name = dev->driver->bus->get_name(dev);
55 if (master->unique) { 55 if (master->unique) {
56 seq_printf(m, "%s %s %s\n", 56 seq_printf(m, "%s %s %s\n",
57 dev->driver->platform_device->name, 57 bus_name,
58 dev_name(dev->dev), master->unique); 58 dev_name(dev->dev), master->unique);
59 } else {
60 seq_printf(m, "%s\n",
61 dev->driver->platform_device->name);
62 }
63 } else { 59 } else {
64 if (master->unique) { 60 seq_printf(m, "%s %s\n",
65 seq_printf(m, "%s %s %s\n", 61 bus_name, dev_name(dev->dev));
66 dev->driver->pci_driver.name,
67 dev_name(dev->dev), master->unique);
68 } else {
69 seq_printf(m, "%s %s\n", dev->driver->pci_driver.name,
70 dev_name(dev->dev));
71 }
72 } 62 }
73
74 return 0; 63 return 0;
75} 64}
76 65
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 47db4df37a69..117490590f56 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -96,7 +96,7 @@ int drm_setunique(struct drm_device *dev, void *data,
96{ 96{
97 struct drm_unique *u = data; 97 struct drm_unique *u = data;
98 struct drm_master *master = file_priv->master; 98 struct drm_master *master = file_priv->master;
99 int domain, bus, slot, func, ret; 99 int ret;
100 100
101 if (master->unique_len || master->unique) 101 if (master->unique_len || master->unique)
102 return -EBUSY; 102 return -EBUSY;
@@ -104,50 +104,12 @@ int drm_setunique(struct drm_device *dev, void *data,
104 if (!u->unique_len || u->unique_len > 1024) 104 if (!u->unique_len || u->unique_len > 1024)
105 return -EINVAL; 105 return -EINVAL;
106 106
107 master->unique_len = u->unique_len; 107 if (!dev->driver->bus->set_unique)
108 master->unique_size = u->unique_len + 1; 108 return -EINVAL;
109 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
110 if (!master->unique) {
111 ret = -ENOMEM;
112 goto err;
113 }
114
115 if (copy_from_user(master->unique, u->unique, master->unique_len)) {
116 ret = -EFAULT;
117 goto err;
118 }
119
120 master->unique[master->unique_len] = '\0';
121
122 dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) +
123 strlen(master->unique) + 2, GFP_KERNEL);
124 if (!dev->devname) {
125 ret = -ENOMEM;
126 goto err;
127 }
128
129 sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
130 master->unique);
131
132 /* Return error if the busid submitted doesn't match the device's actual
133 * busid.
134 */
135 ret = sscanf(master->unique, "PCI:%d:%d:%d", &bus, &slot, &func);
136 if (ret != 3) {
137 ret = -EINVAL;
138 goto err;
139 }
140
141 domain = bus >> 8;
142 bus &= 0xff;
143 109
144 if ((domain != drm_get_pci_domain(dev)) || 110 ret = dev->driver->bus->set_unique(dev, master, u);
145 (bus != dev->pdev->bus->number) || 111 if (ret)
146 (slot != PCI_SLOT(dev->pdev->devfn)) ||
147 (func != PCI_FUNC(dev->pdev->devfn))) {
148 ret = -EINVAL;
149 goto err; 112 goto err;
150 }
151 113
152 return 0; 114 return 0;
153 115
@@ -159,74 +121,15 @@ err:
159static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) 121static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
160{ 122{
161 struct drm_master *master = file_priv->master; 123 struct drm_master *master = file_priv->master;
162 int len, ret; 124 int ret;
163 125
164 if (master->unique != NULL) 126 if (master->unique != NULL)
165 drm_unset_busid(dev, master); 127 drm_unset_busid(dev, master);
166 128
167 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) { 129 ret = dev->driver->bus->set_busid(dev, master);
168 master->unique_len = 10 + strlen(dev->platformdev->name); 130 if (ret)
169 master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL); 131 goto err;
170
171 if (master->unique == NULL)
172 return -ENOMEM;
173
174 len = snprintf(master->unique, master->unique_len,
175 "platform:%s", dev->platformdev->name);
176
177 if (len > master->unique_len) {
178 DRM_ERROR("Unique buffer overflowed\n");
179 ret = -EINVAL;
180 goto err;
181 }
182
183 dev->devname =
184 kmalloc(strlen(dev->platformdev->name) +
185 master->unique_len + 2, GFP_KERNEL);
186
187 if (dev->devname == NULL) {
188 ret = -ENOMEM;
189 goto err;
190 }
191
192 sprintf(dev->devname, "%s@%s", dev->platformdev->name,
193 master->unique);
194
195 } else {
196 master->unique_len = 40;
197 master->unique_size = master->unique_len;
198 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
199 if (master->unique == NULL)
200 return -ENOMEM;
201
202 len = snprintf(master->unique, master->unique_len,
203 "pci:%04x:%02x:%02x.%d",
204 drm_get_pci_domain(dev),
205 dev->pdev->bus->number,
206 PCI_SLOT(dev->pdev->devfn),
207 PCI_FUNC(dev->pdev->devfn));
208 if (len >= master->unique_len) {
209 DRM_ERROR("buffer overflow");
210 ret = -EINVAL;
211 goto err;
212 } else
213 master->unique_len = len;
214
215 dev->devname =
216 kmalloc(strlen(dev->driver->pci_driver.name) +
217 master->unique_len + 2, GFP_KERNEL);
218
219 if (dev->devname == NULL) {
220 ret = -ENOMEM;
221 goto err;
222 }
223
224 sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
225 master->unique);
226 }
227
228 return 0; 132 return 0;
229
230err: 133err:
231 drm_unset_busid(dev, master); 134 drm_unset_busid(dev, master);
232 return ret; 135 return ret;
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 3dadfa2a8528..cb49685bde01 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -74,23 +74,13 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
74{ 74{
75 struct drm_irq_busid *p = data; 75 struct drm_irq_busid *p = data;
76 76
77 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) 77 if (!dev->driver->bus->irq_by_busid)
78 return -EINVAL; 78 return -EINVAL;
79 79
80 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) 80 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
81 return -EINVAL; 81 return -EINVAL;
82 82
83 if ((p->busnum >> 8) != drm_get_pci_domain(dev) || 83 return dev->driver->bus->irq_by_busid(dev, p);
84 (p->busnum & 0xff) != dev->pdev->bus->number ||
85 p->devnum != PCI_SLOT(dev->pdev->devfn) || p->funcnum != PCI_FUNC(dev->pdev->devfn))
86 return -EINVAL;
87
88 p->irq = dev->pdev->irq;
89
90 DRM_DEBUG("%d:%d:%d => IRQ %d\n", p->busnum, p->devnum, p->funcnum,
91 p->irq);
92
93 return 0;
94} 84}
95 85
96/* 86/*
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c
index f5bd9e590c80..e1aee4f6a7c6 100644
--- a/drivers/gpu/drm/drm_pci.c
+++ b/drivers/gpu/drm/drm_pci.c
@@ -125,6 +125,176 @@ void drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah)
125EXPORT_SYMBOL(drm_pci_free); 125EXPORT_SYMBOL(drm_pci_free);
126 126
127#ifdef CONFIG_PCI 127#ifdef CONFIG_PCI
128
129static int drm_get_pci_domain(struct drm_device *dev)
130{
131#ifndef __alpha__
132 /* For historical reasons, drm_get_pci_domain() is busticated
133 * on most archs and has to remain so for userspace interface
134 * < 1.4, except on alpha which was right from the beginning
135 */
136 if (dev->if_version < 0x10004)
137 return 0;
138#endif /* __alpha__ */
139
140 return pci_domain_nr(dev->pdev->bus);
141}
142
143static int drm_pci_get_irq(struct drm_device *dev)
144{
145 return dev->pdev->irq;
146}
147
148static const char *drm_pci_get_name(struct drm_device *dev)
149{
150 struct pci_driver *pdriver = dev->driver->kdriver.pci;
151 return pdriver->name;
152}
153
154int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master)
155{
156 int len, ret;
157 struct pci_driver *pdriver = dev->driver->kdriver.pci;
158 master->unique_len = 40;
159 master->unique_size = master->unique_len;
160 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
161 if (master->unique == NULL)
162 return -ENOMEM;
163
164
165 len = snprintf(master->unique, master->unique_len,
166 "pci:%04x:%02x:%02x.%d",
167 drm_get_pci_domain(dev),
168 dev->pdev->bus->number,
169 PCI_SLOT(dev->pdev->devfn),
170 PCI_FUNC(dev->pdev->devfn));
171
172 if (len >= master->unique_len) {
173 DRM_ERROR("buffer overflow");
174 ret = -EINVAL;
175 goto err;
176 } else
177 master->unique_len = len;
178
179 dev->devname =
180 kmalloc(strlen(pdriver->name) +
181 master->unique_len + 2, GFP_KERNEL);
182
183 if (dev->devname == NULL) {
184 ret = -ENOMEM;
185 goto err;
186 }
187
188 sprintf(dev->devname, "%s@%s", pdriver->name,
189 master->unique);
190
191 return 0;
192err:
193 return ret;
194}
195
196int drm_pci_set_unique(struct drm_device *dev,
197 struct drm_master *master,
198 struct drm_unique *u)
199{
200 int domain, bus, slot, func, ret;
201 const char *bus_name;
202
203 master->unique_len = u->unique_len;
204 master->unique_size = u->unique_len + 1;
205 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
206 if (!master->unique) {
207 ret = -ENOMEM;
208 goto err;
209 }
210
211 if (copy_from_user(master->unique, u->unique, master->unique_len)) {
212 ret = -EFAULT;
213 goto err;
214 }
215
216 master->unique[master->unique_len] = '\0';
217
218 bus_name = dev->driver->bus->get_name(dev);
219 dev->devname = kmalloc(strlen(bus_name) +
220 strlen(master->unique) + 2, GFP_KERNEL);
221 if (!dev->devname) {
222 ret = -ENOMEM;
223 goto err;
224 }
225
226 sprintf(dev->devname, "%s@%s", bus_name,
227 master->unique);
228
229 /* Return error if the busid submitted doesn't match the device's actual
230 * busid.
231 */
232 ret = sscanf(master->unique, "PCI:%d:%d:%d", &bus, &slot, &func);
233 if (ret != 3) {
234 ret = -EINVAL;
235 goto err;
236 }
237
238 domain = bus >> 8;
239 bus &= 0xff;
240
241 if ((domain != drm_get_pci_domain(dev)) ||
242 (bus != dev->pdev->bus->number) ||
243 (slot != PCI_SLOT(dev->pdev->devfn)) ||
244 (func != PCI_FUNC(dev->pdev->devfn))) {
245 ret = -EINVAL;
246 goto err;
247 }
248 return 0;
249err:
250 return ret;
251}
252
253
254int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
255{
256 if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
257 (p->busnum & 0xff) != dev->pdev->bus->number ||
258 p->devnum != PCI_SLOT(dev->pdev->devfn) || p->funcnum != PCI_FUNC(dev->pdev->devfn))
259 return -EINVAL;
260
261 p->irq = dev->pdev->irq;
262
263 DRM_DEBUG("%d:%d:%d => IRQ %d\n", p->busnum, p->devnum, p->funcnum,
264 p->irq);
265 return 0;
266}
267
268int drm_pci_agp_init(struct drm_device *dev)
269{
270 if (drm_core_has_AGP(dev)) {
271 if (drm_pci_device_is_agp(dev))
272 dev->agp = drm_agp_init(dev);
273 if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
274 && (dev->agp == NULL)) {
275 DRM_ERROR("Cannot initialize the agpgart module.\n");
276 return -EINVAL;
277 }
278 if (drm_core_has_MTRR(dev)) {
279 if (dev->agp)
280 dev->agp->agp_mtrr =
281 mtrr_add(dev->agp->agp_info.aper_base,
282 dev->agp->agp_info.aper_size *
283 1024 * 1024, MTRR_TYPE_WRCOMB, 1);
284 }
285 }
286 return 0;
287}
288
289static struct drm_bus drm_pci_bus = {
290 .bus_type = DRIVER_BUS_PCI,
291 .get_irq = drm_pci_get_irq,
292 .get_name = drm_pci_get_name,
293 .set_busid = drm_pci_set_busid,
294 .set_unique = drm_pci_set_unique,
295 .agp_init = drm_pci_agp_init,
296};
297
128/** 298/**
129 * Register. 299 * Register.
130 * 300 *
@@ -219,7 +389,7 @@ err_g1:
219EXPORT_SYMBOL(drm_get_pci_dev); 389EXPORT_SYMBOL(drm_get_pci_dev);
220 390
221/** 391/**
222 * PCI device initialization. Called via drm_init at module load time, 392 * PCI device initialization. Called direct from modules at load time.
223 * 393 *
224 * \return zero on success or a negative number on failure. 394 * \return zero on success or a negative number on failure.
225 * 395 *
@@ -229,18 +399,24 @@ EXPORT_SYMBOL(drm_get_pci_dev);
229 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and 399 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
230 * after the initialization for driver customization. 400 * after the initialization for driver customization.
231 */ 401 */
232int drm_pci_init(struct drm_driver *driver) 402int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
233{ 403{
234 struct pci_dev *pdev = NULL; 404 struct pci_dev *pdev = NULL;
235 const struct pci_device_id *pid; 405 const struct pci_device_id *pid;
236 int i; 406 int i;
237 407
408 DRM_DEBUG("\n");
409
410 INIT_LIST_HEAD(&driver->device_list);
411 driver->kdriver.pci = pdriver;
412 driver->bus = &drm_pci_bus;
413
238 if (driver->driver_features & DRIVER_MODESET) 414 if (driver->driver_features & DRIVER_MODESET)
239 return pci_register_driver(&driver->pci_driver); 415 return pci_register_driver(pdriver);
240 416
241 /* If not using KMS, fall back to stealth mode manual scanning. */ 417 /* If not using KMS, fall back to stealth mode manual scanning. */
242 for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) { 418 for (i = 0; pdriver->id_table[i].vendor != 0; i++) {
243 pid = &driver->pci_driver.id_table[i]; 419 pid = &pdriver->id_table[i];
244 420
245 /* Loop around setting up a DRM device for each PCI device 421 /* Loop around setting up a DRM device for each PCI device
246 * matching our ID and device class. If we had the internal 422 * matching our ID and device class. If we had the internal
@@ -265,10 +441,27 @@ int drm_pci_init(struct drm_driver *driver)
265 441
266#else 442#else
267 443
268int drm_pci_init(struct drm_driver *driver) 444int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
269{ 445{
270 return -1; 446 return -1;
271} 447}
272 448
273#endif 449#endif
450
451EXPORT_SYMBOL(drm_pci_init);
452
274/*@}*/ 453/*@}*/
454void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
455{
456 struct drm_device *dev, *tmp;
457 DRM_DEBUG("\n");
458
459 if (driver->driver_features & DRIVER_MODESET) {
460 pci_unregister_driver(pdriver);
461 } else {
462 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
463 drm_put_dev(dev);
464 }
465 DRM_INFO("Module unloaded\n");
466}
467EXPORT_SYMBOL(drm_pci_exit);
diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c
index 92d1d0fb7b75..7223f06d8e58 100644
--- a/drivers/gpu/drm/drm_platform.c
+++ b/drivers/gpu/drm/drm_platform.c
@@ -109,8 +109,60 @@ err_g1:
109} 109}
110EXPORT_SYMBOL(drm_get_platform_dev); 110EXPORT_SYMBOL(drm_get_platform_dev);
111 111
112static int drm_platform_get_irq(struct drm_device *dev)
113{
114 return platform_get_irq(dev->platformdev, 0);
115}
116
117static const char *drm_platform_get_name(struct drm_device *dev)
118{
119 return dev->platformdev->name;
120}
121
122static int drm_platform_set_busid(struct drm_device *dev, struct drm_master *master)
123{
124 int len, ret;
125
126 master->unique_len = 10 + strlen(dev->platformdev->name);
127 master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL);
128
129 if (master->unique == NULL)
130 return -ENOMEM;
131
132 len = snprintf(master->unique, master->unique_len,
133 "platform:%s", dev->platformdev->name);
134
135 if (len > master->unique_len) {
136 DRM_ERROR("Unique buffer overflowed\n");
137 ret = -EINVAL;
138 goto err;
139 }
140
141 dev->devname =
142 kmalloc(strlen(dev->platformdev->name) +
143 master->unique_len + 2, GFP_KERNEL);
144
145 if (dev->devname == NULL) {
146 ret = -ENOMEM;
147 goto err;
148 }
149
150 sprintf(dev->devname, "%s@%s", dev->platformdev->name,
151 master->unique);
152 return 0;
153err:
154 return ret;
155}
156
157static struct drm_bus drm_platform_bus = {
158 .bus_type = DRIVER_BUS_PLATFORM,
159 .get_irq = drm_platform_get_irq,
160 .get_name = drm_platform_get_name,
161 .set_busid = drm_platform_set_busid,
162};
163
112/** 164/**
113 * Platform device initialization. Called via drm_init at module load time, 165 * Platform device initialization. Called direct from modules.
114 * 166 *
115 * \return zero on success or a negative number on failure. 167 * \return zero on success or a negative number on failure.
116 * 168 *
@@ -121,7 +173,24 @@ EXPORT_SYMBOL(drm_get_platform_dev);
121 * after the initialization for driver customization. 173 * after the initialization for driver customization.
122 */ 174 */
123 175
124int drm_platform_init(struct drm_driver *driver) 176int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device)
125{ 177{
126 return drm_get_platform_dev(driver->platform_device, driver); 178 DRM_DEBUG("\n");
179
180 driver->kdriver.platform_device = platform_device;
181 driver->bus = &drm_platform_bus;
182 INIT_LIST_HEAD(&driver->device_list);
183 return drm_get_platform_dev(platform_device, driver);
184}
185EXPORT_SYMBOL(drm_platform_init);
186
187void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device)
188{
189 struct drm_device *dev, *tmp;
190 DRM_DEBUG("\n");
191
192 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
193 drm_put_dev(dev);
194 DRM_INFO("Module unloaded\n");
127} 195}
196EXPORT_SYMBOL(drm_platform_exit);
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index d59edc18301f..0bf2c773c6c5 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -269,25 +269,14 @@ int drm_fill_in_dev(struct drm_device *dev,
269 269
270 dev->driver = driver; 270 dev->driver = driver;
271 271
272 if (drm_core_has_AGP(dev)) { 272 if (dev->driver->bus->agp_init) {
273 if (drm_device_is_agp(dev)) 273 retcode = dev->driver->bus->agp_init(dev);
274 dev->agp = drm_agp_init(dev); 274 if (retcode)
275 if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
276 && (dev->agp == NULL)) {
277 DRM_ERROR("Cannot initialize the agpgart module.\n");
278 retcode = -EINVAL;
279 goto error_out_unreg; 275 goto error_out_unreg;
280 }
281 if (drm_core_has_MTRR(dev)) {
282 if (dev->agp)
283 dev->agp->agp_mtrr =
284 mtrr_add(dev->agp->agp_info.aper_base,
285 dev->agp->agp_info.aper_size *
286 1024 * 1024, MTRR_TYPE_WRCOMB, 1);
287 }
288 } 276 }
289 277
290 278
279
291 retcode = drm_ctxbitmap_init(dev); 280 retcode = drm_ctxbitmap_init(dev);
292 if (retcode) { 281 if (retcode) {
293 DRM_ERROR("Cannot allocate memory for context bitmap.\n"); 282 DRM_ERROR("Cannot allocate memory for context bitmap.\n");
@@ -425,7 +414,6 @@ int drm_put_minor(struct drm_minor **minor_p)
425 * 414 *
426 * Cleans up all DRM device, calling drm_lastclose(). 415 * Cleans up all DRM device, calling drm_lastclose().
427 * 416 *
428 * \sa drm_init
429 */ 417 */
430void drm_put_dev(struct drm_device *dev) 418void drm_put_dev(struct drm_device *dev)
431{ 419{
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c
index 0152fa27e616..6f98d059f68a 100644
--- a/drivers/gpu/drm/i810/i810_drv.c
+++ b/drivers/gpu/drm/i810/i810_drv.c
@@ -64,11 +64,6 @@ static struct drm_driver driver = {
64 .llseek = noop_llseek, 64 .llseek = noop_llseek,
65 }, 65 },
66 66
67 .pci_driver = {
68 .name = DRIVER_NAME,
69 .id_table = pciidlist,
70 },
71
72 .name = DRIVER_NAME, 67 .name = DRIVER_NAME,
73 .desc = DRIVER_DESC, 68 .desc = DRIVER_DESC,
74 .date = DRIVER_DATE, 69 .date = DRIVER_DATE,
@@ -77,6 +72,11 @@ static struct drm_driver driver = {
77 .patchlevel = DRIVER_PATCHLEVEL, 72 .patchlevel = DRIVER_PATCHLEVEL,
78}; 73};
79 74
75static struct pci_driver i810_pci_driver = {
76 .name = DRIVER_NAME,
77 .id_table = pciidlist,
78};
79
80static int __init i810_init(void) 80static int __init i810_init(void)
81{ 81{
82 if (num_possible_cpus() > 1) { 82 if (num_possible_cpus() > 1) {
@@ -84,12 +84,12 @@ static int __init i810_init(void)
84 return -EINVAL; 84 return -EINVAL;
85 } 85 }
86 driver.num_ioctls = i810_max_ioctl; 86 driver.num_ioctls = i810_max_ioctl;
87 return drm_init(&driver); 87 return drm_pci_init(&driver, &i810_pci_driver);
88} 88}
89 89
90static void __exit i810_exit(void) 90static void __exit i810_exit(void)
91{ 91{
92 drm_exit(&driver); 92 drm_pci_exit(&driver, &i810_pci_driver);
93} 93}
94 94
95module_init(i810_init); 95module_init(i810_init);
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 17fde2f27418..9ad42d583493 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -719,14 +719,6 @@ static struct drm_driver driver = {
719 .llseek = noop_llseek, 719 .llseek = noop_llseek,
720 }, 720 },
721 721
722 .pci_driver = {
723 .name = DRIVER_NAME,
724 .id_table = pciidlist,
725 .probe = i915_pci_probe,
726 .remove = i915_pci_remove,
727 .driver.pm = &i915_pm_ops,
728 },
729
730 .name = DRIVER_NAME, 722 .name = DRIVER_NAME,
731 .desc = DRIVER_DESC, 723 .desc = DRIVER_DESC,
732 .date = DRIVER_DATE, 724 .date = DRIVER_DATE,
@@ -735,6 +727,14 @@ static struct drm_driver driver = {
735 .patchlevel = DRIVER_PATCHLEVEL, 727 .patchlevel = DRIVER_PATCHLEVEL,
736}; 728};
737 729
730static struct pci_driver i915_pci_driver = {
731 .name = DRIVER_NAME,
732 .id_table = pciidlist,
733 .probe = i915_pci_probe,
734 .remove = i915_pci_remove,
735 .driver.pm = &i915_pm_ops,
736};
737
738static int __init i915_init(void) 738static int __init i915_init(void)
739{ 739{
740 if (!intel_agp_enabled) { 740 if (!intel_agp_enabled) {
@@ -768,12 +768,12 @@ static int __init i915_init(void)
768 if (!(driver.driver_features & DRIVER_MODESET)) 768 if (!(driver.driver_features & DRIVER_MODESET))
769 driver.get_vblank_timestamp = NULL; 769 driver.get_vblank_timestamp = NULL;
770 770
771 return drm_init(&driver); 771 return drm_pci_init(&driver, &i915_pci_driver);
772} 772}
773 773
774static void __exit i915_exit(void) 774static void __exit i915_exit(void)
775{ 775{
776 drm_exit(&driver); 776 drm_pci_exit(&driver, &i915_pci_driver);
777} 777}
778 778
779module_init(i915_init); 779module_init(i915_init);
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c
index 08868ac3048a..1e1eb1d7e971 100644
--- a/drivers/gpu/drm/mga/mga_dma.c
+++ b/drivers/gpu/drm/mga/mga_dma.c
@@ -703,7 +703,7 @@ static int mga_do_pci_dma_bootstrap(struct drm_device *dev,
703static int mga_do_dma_bootstrap(struct drm_device *dev, 703static int mga_do_dma_bootstrap(struct drm_device *dev,
704 drm_mga_dma_bootstrap_t *dma_bs) 704 drm_mga_dma_bootstrap_t *dma_bs)
705{ 705{
706 const int is_agp = (dma_bs->agp_mode != 0) && drm_device_is_agp(dev); 706 const int is_agp = (dma_bs->agp_mode != 0) && drm_pci_device_is_agp(dev);
707 int err; 707 int err;
708 drm_mga_private_t *const dev_priv = 708 drm_mga_private_t *const dev_priv =
709 (drm_mga_private_t *) dev->dev_private; 709 (drm_mga_private_t *) dev->dev_private;
diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c
index 0aaf5f67a436..42d31874edf2 100644
--- a/drivers/gpu/drm/mga/mga_drv.c
+++ b/drivers/gpu/drm/mga/mga_drv.c
@@ -75,10 +75,6 @@ static struct drm_driver driver = {
75#endif 75#endif
76 .llseek = noop_llseek, 76 .llseek = noop_llseek,
77 }, 77 },
78 .pci_driver = {
79 .name = DRIVER_NAME,
80 .id_table = pciidlist,
81 },
82 78
83 .name = DRIVER_NAME, 79 .name = DRIVER_NAME,
84 .desc = DRIVER_DESC, 80 .desc = DRIVER_DESC,
@@ -88,15 +84,20 @@ static struct drm_driver driver = {
88 .patchlevel = DRIVER_PATCHLEVEL, 84 .patchlevel = DRIVER_PATCHLEVEL,
89}; 85};
90 86
87static struct pci_driver mga_pci_driver = {
88 .name = DRIVER_NAME,
89 .id_table = pciidlist,
90};
91
91static int __init mga_init(void) 92static int __init mga_init(void)
92{ 93{
93 driver.num_ioctls = mga_max_ioctl; 94 driver.num_ioctls = mga_max_ioctl;
94 return drm_init(&driver); 95 return drm_pci_init(&driver, &mga_pci_driver);
95} 96}
96 97
97static void __exit mga_exit(void) 98static void __exit mga_exit(void)
98{ 99{
99 drm_exit(&driver); 100 drm_pci_exit(&driver, &mga_pci_driver);
100} 101}
101 102
102module_init(mga_init); 103module_init(mga_init);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
index f658a04eecf9..155ebdcbf06f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
@@ -408,14 +408,6 @@ static struct drm_driver driver = {
408#endif 408#endif
409 .llseek = noop_llseek, 409 .llseek = noop_llseek,
410 }, 410 },
411 .pci_driver = {
412 .name = DRIVER_NAME,
413 .id_table = pciidlist,
414 .probe = nouveau_pci_probe,
415 .remove = nouveau_pci_remove,
416 .suspend = nouveau_pci_suspend,
417 .resume = nouveau_pci_resume
418 },
419 411
420 .gem_init_object = nouveau_gem_object_new, 412 .gem_init_object = nouveau_gem_object_new,
421 .gem_free_object = nouveau_gem_object_del, 413 .gem_free_object = nouveau_gem_object_del,
@@ -432,6 +424,15 @@ static struct drm_driver driver = {
432 .patchlevel = DRIVER_PATCHLEVEL, 424 .patchlevel = DRIVER_PATCHLEVEL,
433}; 425};
434 426
427static struct pci_driver nouveau_pci_driver = {
428 .name = DRIVER_NAME,
429 .id_table = pciidlist,
430 .probe = nouveau_pci_probe,
431 .remove = nouveau_pci_remove,
432 .suspend = nouveau_pci_suspend,
433 .resume = nouveau_pci_resume
434};
435
435static int __init nouveau_init(void) 436static int __init nouveau_init(void)
436{ 437{
437 driver.num_ioctls = nouveau_max_ioctl; 438 driver.num_ioctls = nouveau_max_ioctl;
@@ -449,7 +450,7 @@ static int __init nouveau_init(void)
449 return 0; 450 return 0;
450 451
451 nouveau_register_dsm_handler(); 452 nouveau_register_dsm_handler();
452 return drm_init(&driver); 453 return drm_pci_init(&driver, &nouveau_pci_driver);
453} 454}
454 455
455static void __exit nouveau_exit(void) 456static void __exit nouveau_exit(void)
@@ -457,7 +458,7 @@ static void __exit nouveau_exit(void)
457 if (!nouveau_modeset) 458 if (!nouveau_modeset)
458 return; 459 return;
459 460
460 drm_exit(&driver); 461 drm_pci_exit(&driver, &nouveau_pci_driver);
461 nouveau_unregister_dsm_handler(); 462 nouveau_unregister_dsm_handler();
462} 463}
463 464
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 26347b7cd872..123969dd4f56 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -480,7 +480,7 @@ nouveau_mem_gart_init(struct drm_device *dev)
480 dev_priv->gart_info.type = NOUVEAU_GART_NONE; 480 dev_priv->gart_info.type = NOUVEAU_GART_NONE;
481 481
482#if !defined(__powerpc__) && !defined(__ia64__) 482#if !defined(__powerpc__) && !defined(__ia64__)
483 if (drm_device_is_agp(dev) && dev->agp && nouveau_agpmode) { 483 if (drm_pci_device_is_agp(dev) && dev->agp && nouveau_agpmode) {
484 ret = nouveau_mem_init_agp(dev); 484 ret = nouveau_mem_init_agp(dev);
485 if (ret) 485 if (ret)
486 NV_ERROR(dev, "Error initialising AGP: %d\n", ret); 486 NV_ERROR(dev, "Error initialising AGP: %d\n", ret);
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index a54fc431fe98..2148d01354da 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -1103,9 +1103,9 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
1103 getparam->value = dev->pci_device; 1103 getparam->value = dev->pci_device;
1104 break; 1104 break;
1105 case NOUVEAU_GETPARAM_BUS_TYPE: 1105 case NOUVEAU_GETPARAM_BUS_TYPE:
1106 if (drm_device_is_agp(dev)) 1106 if (drm_pci_device_is_agp(dev))
1107 getparam->value = NV_AGP; 1107 getparam->value = NV_AGP;
1108 else if (drm_device_is_pcie(dev)) 1108 else if (drm_pci_device_is_pcie(dev))
1109 getparam->value = NV_PCIE; 1109 getparam->value = NV_PCIE;
1110 else 1110 else
1111 getparam->value = NV_PCI; 1111 getparam->value = NV_PCI;
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c
index 18c3c71e41b1..b9e8efd2b754 100644
--- a/drivers/gpu/drm/r128/r128_drv.c
+++ b/drivers/gpu/drm/r128/r128_drv.c
@@ -71,10 +71,7 @@ static struct drm_driver driver = {
71#endif 71#endif
72 .llseek = noop_llseek, 72 .llseek = noop_llseek,
73 }, 73 },
74 .pci_driver = { 74
75 .name = DRIVER_NAME,
76 .id_table = pciidlist,
77 },
78 75
79 .name = DRIVER_NAME, 76 .name = DRIVER_NAME,
80 .desc = DRIVER_DESC, 77 .desc = DRIVER_DESC,
@@ -89,16 +86,21 @@ int r128_driver_load(struct drm_device *dev, unsigned long flags)
89 return drm_vblank_init(dev, 1); 86 return drm_vblank_init(dev, 1);
90} 87}
91 88
89static struct pci_driver r128_pci_driver = {
90 .name = DRIVER_NAME,
91 .id_table = pciidlist,
92};
93
92static int __init r128_init(void) 94static int __init r128_init(void)
93{ 95{
94 driver.num_ioctls = r128_max_ioctl; 96 driver.num_ioctls = r128_max_ioctl;
95 97
96 return drm_init(&driver); 98 return drm_pci_init(&driver, &r128_pci_driver);
97} 99}
98 100
99static void __exit r128_exit(void) 101static void __exit r128_exit(void)
100{ 102{
101 drm_exit(&driver); 103 drm_pci_exit(&driver, &r128_pci_driver);
102} 104}
103 105
104module_init(r128_init); 106module_init(r128_init);
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
index eb6b9eed7349..3d599e33b9cc 100644
--- a/drivers/gpu/drm/radeon/radeon_cp.c
+++ b/drivers/gpu/drm/radeon/radeon_cp.c
@@ -2113,9 +2113,9 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
2113 break; 2113 break;
2114 } 2114 }
2115 2115
2116 if (drm_device_is_agp(dev)) 2116 if (drm_pci_device_is_agp(dev))
2117 dev_priv->flags |= RADEON_IS_AGP; 2117 dev_priv->flags |= RADEON_IS_AGP;
2118 else if (drm_device_is_pcie(dev)) 2118 else if (drm_pci_device_is_pcie(dev))
2119 dev_priv->flags |= RADEON_IS_PCIE; 2119 dev_priv->flags |= RADEON_IS_PCIE;
2120 else 2120 else
2121 dev_priv->flags |= RADEON_IS_PCI; 2121 dev_priv->flags |= RADEON_IS_PCI;
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index ca1b7d4c1d83..8a0df3d2a4c3 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -238,11 +238,6 @@ static struct drm_driver driver_old = {
238 .llseek = noop_llseek, 238 .llseek = noop_llseek,
239 }, 239 },
240 240
241 .pci_driver = {
242 .name = DRIVER_NAME,
243 .id_table = pciidlist,
244 },
245
246 .name = DRIVER_NAME, 241 .name = DRIVER_NAME,
247 .desc = DRIVER_DESC, 242 .desc = DRIVER_DESC,
248 .date = DRIVER_DATE, 243 .date = DRIVER_DATE,
@@ -349,15 +344,6 @@ static struct drm_driver kms_driver = {
349#endif 344#endif
350 }, 345 },
351 346
352 .pci_driver = {
353 .name = DRIVER_NAME,
354 .id_table = pciidlist,
355 .probe = radeon_pci_probe,
356 .remove = radeon_pci_remove,
357 .suspend = radeon_pci_suspend,
358 .resume = radeon_pci_resume,
359 },
360
361 .name = DRIVER_NAME, 347 .name = DRIVER_NAME,
362 .desc = DRIVER_DESC, 348 .desc = DRIVER_DESC,
363 .date = DRIVER_DATE, 349 .date = DRIVER_DATE,
@@ -367,15 +353,32 @@ static struct drm_driver kms_driver = {
367}; 353};
368 354
369static struct drm_driver *driver; 355static struct drm_driver *driver;
356static struct pci_driver *pdriver;
357
358static struct pci_driver radeon_pci_driver = {
359 .name = DRIVER_NAME,
360 .id_table = pciidlist,
361};
362
363static struct pci_driver radeon_kms_pci_driver = {
364 .name = DRIVER_NAME,
365 .id_table = pciidlist,
366 .probe = radeon_pci_probe,
367 .remove = radeon_pci_remove,
368 .suspend = radeon_pci_suspend,
369 .resume = radeon_pci_resume,
370};
370 371
371static int __init radeon_init(void) 372static int __init radeon_init(void)
372{ 373{
373 driver = &driver_old; 374 driver = &driver_old;
375 pdriver = &radeon_pci_driver;
374 driver->num_ioctls = radeon_max_ioctl; 376 driver->num_ioctls = radeon_max_ioctl;
375#ifdef CONFIG_VGA_CONSOLE 377#ifdef CONFIG_VGA_CONSOLE
376 if (vgacon_text_force() && radeon_modeset == -1) { 378 if (vgacon_text_force() && radeon_modeset == -1) {
377 DRM_INFO("VGACON disable radeon kernel modesetting.\n"); 379 DRM_INFO("VGACON disable radeon kernel modesetting.\n");
378 driver = &driver_old; 380 driver = &driver_old;
381 pdriver = &radeon_pci_driver;
379 driver->driver_features &= ~DRIVER_MODESET; 382 driver->driver_features &= ~DRIVER_MODESET;
380 radeon_modeset = 0; 383 radeon_modeset = 0;
381 } 384 }
@@ -393,18 +396,19 @@ static int __init radeon_init(void)
393 if (radeon_modeset == 1) { 396 if (radeon_modeset == 1) {
394 DRM_INFO("radeon kernel modesetting enabled.\n"); 397 DRM_INFO("radeon kernel modesetting enabled.\n");
395 driver = &kms_driver; 398 driver = &kms_driver;
399 pdriver = &radeon_kms_pci_driver;
396 driver->driver_features |= DRIVER_MODESET; 400 driver->driver_features |= DRIVER_MODESET;
397 driver->num_ioctls = radeon_max_kms_ioctl; 401 driver->num_ioctls = radeon_max_kms_ioctl;
398 radeon_register_atpx_handler(); 402 radeon_register_atpx_handler();
399 } 403 }
400 /* if the vga console setting is enabled still 404 /* if the vga console setting is enabled still
401 * let modprobe override it */ 405 * let modprobe override it */
402 return drm_init(driver); 406 return drm_pci_init(driver, pdriver);
403} 407}
404 408
405static void __exit radeon_exit(void) 409static void __exit radeon_exit(void)
406{ 410{
407 drm_exit(driver); 411 drm_pci_exit(driver, pdriver);
408 radeon_unregister_atpx_handler(); 412 radeon_unregister_atpx_handler();
409} 413}
410 414
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index 8387d32caaa7..4057ebf5195d 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -58,9 +58,9 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
58 dev->dev_private = (void *)rdev; 58 dev->dev_private = (void *)rdev;
59 59
60 /* update BUS flag */ 60 /* update BUS flag */
61 if (drm_device_is_agp(dev)) { 61 if (drm_pci_device_is_agp(dev)) {
62 flags |= RADEON_IS_AGP; 62 flags |= RADEON_IS_AGP;
63 } else if (drm_device_is_pcie(dev)) { 63 } else if (drm_pci_device_is_pcie(dev)) {
64 flags |= RADEON_IS_PCIE; 64 flags |= RADEON_IS_PCIE;
65 } else { 65 } else {
66 flags |= RADEON_IS_PCI; 66 flags |= RADEON_IS_PCI;
diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c
index fa64d25d4248..6464490b240b 100644
--- a/drivers/gpu/drm/savage/savage_drv.c
+++ b/drivers/gpu/drm/savage/savage_drv.c
@@ -55,11 +55,6 @@ static struct drm_driver driver = {
55 .llseek = noop_llseek, 55 .llseek = noop_llseek,
56 }, 56 },
57 57
58 .pci_driver = {
59 .name = DRIVER_NAME,
60 .id_table = pciidlist,
61 },
62
63 .name = DRIVER_NAME, 58 .name = DRIVER_NAME,
64 .desc = DRIVER_DESC, 59 .desc = DRIVER_DESC,
65 .date = DRIVER_DATE, 60 .date = DRIVER_DATE,
@@ -68,15 +63,20 @@ static struct drm_driver driver = {
68 .patchlevel = DRIVER_PATCHLEVEL, 63 .patchlevel = DRIVER_PATCHLEVEL,
69}; 64};
70 65
66static struct pci_driver savage_pci_driver = {
67 .name = DRIVER_NAME,
68 .id_table = pciidlist,
69};
70
71static int __init savage_init(void) 71static int __init savage_init(void)
72{ 72{
73 driver.num_ioctls = savage_max_ioctl; 73 driver.num_ioctls = savage_max_ioctl;
74 return drm_init(&driver); 74 return drm_pci_init(&driver, &savage_pci_driver);
75} 75}
76 76
77static void __exit savage_exit(void) 77static void __exit savage_exit(void)
78{ 78{
79 drm_exit(&driver); 79 drm_pci_exit(&driver, &savage_pci_driver);
80} 80}
81 81
82module_init(savage_init); 82module_init(savage_init);
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c
index 4caf5d01cfd3..46d5be6e97e5 100644
--- a/drivers/gpu/drm/sis/sis_drv.c
+++ b/drivers/gpu/drm/sis/sis_drv.c
@@ -82,10 +82,6 @@ static struct drm_driver driver = {
82 .fasync = drm_fasync, 82 .fasync = drm_fasync,
83 .llseek = noop_llseek, 83 .llseek = noop_llseek,
84 }, 84 },
85 .pci_driver = {
86 .name = DRIVER_NAME,
87 .id_table = pciidlist,
88 },
89 85
90 .name = DRIVER_NAME, 86 .name = DRIVER_NAME,
91 .desc = DRIVER_DESC, 87 .desc = DRIVER_DESC,
@@ -95,15 +91,20 @@ static struct drm_driver driver = {
95 .patchlevel = DRIVER_PATCHLEVEL, 91 .patchlevel = DRIVER_PATCHLEVEL,
96}; 92};
97 93
94static struct pci_driver sis_pci_driver = {
95 .name = DRIVER_NAME,
96 .id_table = pciidlist,
97};
98
98static int __init sis_init(void) 99static int __init sis_init(void)
99{ 100{
100 driver.num_ioctls = sis_max_ioctl; 101 driver.num_ioctls = sis_max_ioctl;
101 return drm_init(&driver); 102 return drm_pci_init(&driver, &sis_pci_driver);
102} 103}
103 104
104static void __exit sis_exit(void) 105static void __exit sis_exit(void)
105{ 106{
106 drm_exit(&driver); 107 drm_pci_exit(&driver, &sis_pci_driver);
107} 108}
108 109
109module_init(sis_init); 110module_init(sis_init);
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.c b/drivers/gpu/drm/tdfx/tdfx_drv.c
index b70fa91d761a..8bf98810a8d6 100644
--- a/drivers/gpu/drm/tdfx/tdfx_drv.c
+++ b/drivers/gpu/drm/tdfx/tdfx_drv.c
@@ -52,10 +52,6 @@ static struct drm_driver driver = {
52 .fasync = drm_fasync, 52 .fasync = drm_fasync,
53 .llseek = noop_llseek, 53 .llseek = noop_llseek,
54 }, 54 },
55 .pci_driver = {
56 .name = DRIVER_NAME,
57 .id_table = pciidlist,
58 },
59 55
60 .name = DRIVER_NAME, 56 .name = DRIVER_NAME,
61 .desc = DRIVER_DESC, 57 .desc = DRIVER_DESC,
@@ -65,14 +61,19 @@ static struct drm_driver driver = {
65 .patchlevel = DRIVER_PATCHLEVEL, 61 .patchlevel = DRIVER_PATCHLEVEL,
66}; 62};
67 63
64static struct pci_driver tdfx_pci_driver = {
65 .name = DRIVER_NAME,
66 .id_table = pciidlist,
67};
68
68static int __init tdfx_init(void) 69static int __init tdfx_init(void)
69{ 70{
70 return drm_init(&driver); 71 return drm_pci_init(&driver, &tdfx_pci_driver);
71} 72}
72 73
73static void __exit tdfx_exit(void) 74static void __exit tdfx_exit(void)
74{ 75{
75 drm_exit(&driver); 76 drm_pci_exit(&driver, &tdfx_pci_driver);
76} 77}
77 78
78module_init(tdfx_init); 79module_init(tdfx_init);
diff --git a/drivers/gpu/drm/via/via_drv.c b/drivers/gpu/drm/via/via_drv.c
index e1ff4e7a6eb0..920a55214bcf 100644
--- a/drivers/gpu/drm/via/via_drv.c
+++ b/drivers/gpu/drm/via/via_drv.c
@@ -62,10 +62,6 @@ static struct drm_driver driver = {
62 .fasync = drm_fasync, 62 .fasync = drm_fasync,
63 .llseek = noop_llseek, 63 .llseek = noop_llseek,
64 }, 64 },
65 .pci_driver = {
66 .name = DRIVER_NAME,
67 .id_table = pciidlist,
68 },
69 65
70 .name = DRIVER_NAME, 66 .name = DRIVER_NAME,
71 .desc = DRIVER_DESC, 67 .desc = DRIVER_DESC,
@@ -75,16 +71,21 @@ static struct drm_driver driver = {
75 .patchlevel = DRIVER_PATCHLEVEL, 71 .patchlevel = DRIVER_PATCHLEVEL,
76}; 72};
77 73
74static struct pci_driver via_pci_driver = {
75 .name = DRIVER_NAME,
76 .id_table = pciidlist,
77};
78
78static int __init via_init(void) 79static int __init via_init(void)
79{ 80{
80 driver.num_ioctls = via_max_ioctl; 81 driver.num_ioctls = via_max_ioctl;
81 via_init_command_verifier(); 82 via_init_command_verifier();
82 return drm_init(&driver); 83 return drm_pci_init(&driver, &via_pci_driver);
83} 84}
84 85
85static void __exit via_exit(void) 86static void __exit via_exit(void)
86{ 87{
87 drm_exit(&driver); 88 drm_pci_exit(&driver, &via_pci_driver);
88} 89}
89 90
90module_init(via_init); 91module_init(via_init);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 10ca97ee0206..96949b93d920 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -909,15 +909,6 @@ static struct drm_driver driver = {
909#endif 909#endif
910 .llseek = noop_llseek, 910 .llseek = noop_llseek,
911 }, 911 },
912 .pci_driver = {
913 .name = VMWGFX_DRIVER_NAME,
914 .id_table = vmw_pci_id_list,
915 .probe = vmw_probe,
916 .remove = vmw_remove,
917 .driver = {
918 .pm = &vmw_pm_ops
919 }
920 },
921 .name = VMWGFX_DRIVER_NAME, 912 .name = VMWGFX_DRIVER_NAME,
922 .desc = VMWGFX_DRIVER_DESC, 913 .desc = VMWGFX_DRIVER_DESC,
923 .date = VMWGFX_DRIVER_DATE, 914 .date = VMWGFX_DRIVER_DATE,
@@ -926,6 +917,16 @@ static struct drm_driver driver = {
926 .patchlevel = VMWGFX_DRIVER_PATCHLEVEL 917 .patchlevel = VMWGFX_DRIVER_PATCHLEVEL
927}; 918};
928 919
920static struct pci_driver vmw_pci_driver = {
921 .name = VMWGFX_DRIVER_NAME,
922 .id_table = vmw_pci_id_list,
923 .probe = vmw_probe,
924 .remove = vmw_remove,
925 .driver = {
926 .pm = &vmw_pm_ops
927 }
928};
929
929static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 930static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
930{ 931{
931 return drm_get_pci_dev(pdev, ent, &driver); 932 return drm_get_pci_dev(pdev, ent, &driver);
@@ -934,7 +935,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
934static int __init vmwgfx_init(void) 935static int __init vmwgfx_init(void)
935{ 936{
936 int ret; 937 int ret;
937 ret = drm_init(&driver); 938 ret = drm_pci_init(&driver, &vmw_pci_driver);
938 if (ret) 939 if (ret)
939 DRM_ERROR("Failed initializing DRM.\n"); 940 DRM_ERROR("Failed initializing DRM.\n");
940 return ret; 941 return ret;
@@ -942,7 +943,7 @@ static int __init vmwgfx_init(void)
942 943
943static void __exit vmwgfx_exit(void) 944static void __exit vmwgfx_exit(void)
944{ 945{
945 drm_exit(&driver); 946 drm_pci_exit(&driver, &vmw_pci_driver);
946} 947}
947 948
948module_init(vmwgfx_init); 949module_init(vmwgfx_init);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 3cbe7a02d2aa..a99aefb9537c 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -145,7 +145,10 @@ extern void drm_ut_debug_printk(unsigned int request_level,
145#define DRIVER_IRQ_VBL2 0x800 145#define DRIVER_IRQ_VBL2 0x800
146#define DRIVER_GEM 0x1000 146#define DRIVER_GEM 0x1000
147#define DRIVER_MODESET 0x2000 147#define DRIVER_MODESET 0x2000
148#define DRIVER_USE_PLATFORM_DEVICE 0x4000 148
149#define DRIVER_BUS_PCI 0x1
150#define DRIVER_BUS_PLATFORM 0x2
151#define DRIVER_BUS_USB 0x3
149 152
150/***********************************************************************/ 153/***********************************************************************/
151/** \name Begin the DRM... */ 154/** \name Begin the DRM... */
@@ -698,6 +701,19 @@ struct drm_master {
698#define DRM_SCANOUTPOS_INVBL (1 << 1) 701#define DRM_SCANOUTPOS_INVBL (1 << 1)
699#define DRM_SCANOUTPOS_ACCURATE (1 << 2) 702#define DRM_SCANOUTPOS_ACCURATE (1 << 2)
700 703
704struct drm_bus {
705 int bus_type;
706 int (*get_irq)(struct drm_device *dev);
707 const char *(*get_name)(struct drm_device *dev);
708 int (*set_busid)(struct drm_device *dev, struct drm_master *master);
709 int (*set_unique)(struct drm_device *dev, struct drm_master *master,
710 struct drm_unique *unique);
711 int (*irq_by_busid)(struct drm_device *dev, struct drm_irq_busid *p);
712 /* hooks that are for PCI */
713 int (*agp_init)(struct drm_device *dev);
714
715};
716
701/** 717/**
702 * DRM driver structure. This structure represent the common code for 718 * DRM driver structure. This structure represent the common code for
703 * a family of cards. There will one drm_device for each card present 719 * a family of cards. There will one drm_device for each card present
@@ -906,8 +922,12 @@ struct drm_driver {
906 struct drm_ioctl_desc *ioctls; 922 struct drm_ioctl_desc *ioctls;
907 int num_ioctls; 923 int num_ioctls;
908 struct file_operations fops; 924 struct file_operations fops;
909 struct pci_driver pci_driver; 925 union {
910 struct platform_device *platform_device; 926 struct pci_driver *pci;
927 struct platform_device *platform_device;
928 } kdriver;
929 struct drm_bus *bus;
930
911 /* List of devices hanging off this driver */ 931 /* List of devices hanging off this driver */
912 struct list_head device_list; 932 struct list_head device_list;
913}; 933};
@@ -1147,28 +1167,9 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev,
1147 1167
1148static inline int drm_dev_to_irq(struct drm_device *dev) 1168static inline int drm_dev_to_irq(struct drm_device *dev)
1149{ 1169{
1150 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) 1170 return dev->driver->bus->get_irq(dev);
1151 return platform_get_irq(dev->platformdev, 0);
1152 else
1153 return dev->pdev->irq;
1154} 1171}
1155 1172
1156static inline int drm_get_pci_domain(struct drm_device *dev)
1157{
1158 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
1159 return 0;
1160
1161#ifndef __alpha__
1162 /* For historical reasons, drm_get_pci_domain() is busticated
1163 * on most archs and has to remain so for userspace interface
1164 * < 1.4, except on alpha which was right from the beginning
1165 */
1166 if (dev->if_version < 0x10004)
1167 return 0;
1168#endif /* __alpha__ */
1169
1170 return pci_domain_nr(dev->pdev->bus);
1171}
1172 1173
1173#if __OS_HAS_AGP 1174#if __OS_HAS_AGP
1174static inline int drm_core_has_AGP(struct drm_device *dev) 1175static inline int drm_core_has_AGP(struct drm_device *dev)
@@ -1222,8 +1223,6 @@ static inline int drm_mtrr_del(int handle, unsigned long offset,
1222/*@{*/ 1223/*@{*/
1223 1224
1224 /* Driver support (drm_drv.h) */ 1225 /* Driver support (drm_drv.h) */
1225extern int drm_init(struct drm_driver *driver);
1226extern void drm_exit(struct drm_driver *driver);
1227extern long drm_ioctl(struct file *filp, 1226extern long drm_ioctl(struct file *filp,
1228 unsigned int cmd, unsigned long arg); 1227 unsigned int cmd, unsigned long arg);
1229extern long drm_compat_ioctl(struct file *filp, 1228extern long drm_compat_ioctl(struct file *filp,
@@ -1433,11 +1432,7 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
1433struct drm_master *drm_master_create(struct drm_minor *minor); 1432struct drm_master *drm_master_create(struct drm_minor *minor);
1434extern struct drm_master *drm_master_get(struct drm_master *master); 1433extern struct drm_master *drm_master_get(struct drm_master *master);
1435extern void drm_master_put(struct drm_master **master); 1434extern void drm_master_put(struct drm_master **master);
1436extern int drm_get_pci_dev(struct pci_dev *pdev, 1435
1437 const struct pci_device_id *ent,
1438 struct drm_driver *driver);
1439extern int drm_get_platform_dev(struct platform_device *pdev,
1440 struct drm_driver *driver);
1441extern void drm_put_dev(struct drm_device *dev); 1436extern void drm_put_dev(struct drm_device *dev);
1442extern int drm_put_minor(struct drm_minor **minor); 1437extern int drm_put_minor(struct drm_minor **minor);
1443extern unsigned int drm_debug; 1438extern unsigned int drm_debug;
@@ -1628,11 +1623,21 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
1628 return NULL; 1623 return NULL;
1629} 1624}
1630 1625
1631static __inline__ int drm_device_is_agp(struct drm_device *dev) 1626static __inline__ void drm_core_dropmap(struct drm_local_map *map)
1632{ 1627{
1633 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) 1628}
1634 return 0; 1629
1630#include "drm_mem_util.h"
1635 1631
1632extern int drm_fill_in_dev(struct drm_device *dev,
1633 const struct pci_device_id *ent,
1634 struct drm_driver *driver);
1635int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type);
1636/*@}*/
1637
1638/* PCI section */
1639static __inline__ int drm_pci_device_is_agp(struct drm_device *dev)
1640{
1636 if (dev->driver->device_is_agp != NULL) { 1641 if (dev->driver->device_is_agp != NULL) {
1637 int err = (*dev->driver->device_is_agp) (dev); 1642 int err = (*dev->driver->device_is_agp) (dev);
1638 1643
@@ -1644,35 +1649,26 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev)
1644 return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP); 1649 return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
1645} 1650}
1646 1651
1647static __inline__ int drm_device_is_pcie(struct drm_device *dev)
1648{
1649 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
1650 return 0;
1651 else
1652 return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
1653}
1654 1652
1655static __inline__ void drm_core_dropmap(struct drm_local_map *map) 1653static __inline__ int drm_pci_device_is_pcie(struct drm_device *dev)
1656{ 1654{
1655 return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
1657} 1656}
1658 1657
1659#include "drm_mem_util.h"
1660 1658
1661static inline void *drm_get_device(struct drm_device *dev) 1659extern int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver);
1662{ 1660extern void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver);
1663 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) 1661extern int drm_get_pci_dev(struct pci_dev *pdev,
1664 return dev->platformdev;
1665 else
1666 return dev->pdev;
1667}
1668
1669extern int drm_platform_init(struct drm_driver *driver);
1670extern int drm_pci_init(struct drm_driver *driver);
1671extern int drm_fill_in_dev(struct drm_device *dev,
1672 const struct pci_device_id *ent, 1662 const struct pci_device_id *ent,
1673 struct drm_driver *driver); 1663 struct drm_driver *driver);
1674int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); 1664
1675/*@}*/ 1665
1666/* platform section */
1667extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device);
1668extern void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device);
1669
1670extern int drm_get_platform_dev(struct platform_device *pdev,
1671 struct drm_driver *driver);
1676 1672
1677#endif /* __KERNEL__ */ 1673#endif /* __KERNEL__ */
1678#endif 1674#endif