|
@@ -9,6 +9,7 @@
|
|
|
/*
|
|
|
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
|
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
|
|
+ * Copyright (c) 2009-2010, Code Aurora Forum.
|
|
|
* All rights reserved.
|
|
|
*
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
@@ -48,6 +49,7 @@
|
|
|
#include <linux/proc_fs.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/file.h>
|
|
|
+#include <linux/platform_device.h>
|
|
|
#include <linux/pci.h>
|
|
|
#include <linux/jiffies.h>
|
|
|
#include <linux/smp_lock.h> /* For (un)lock_kernel */
|
|
@@ -144,6 +146,7 @@ extern void drm_ut_debug_printk(unsigned int request_level,
|
|
|
#define DRIVER_IRQ_VBL2 0x800
|
|
|
#define DRIVER_GEM 0x1000
|
|
|
#define DRIVER_MODESET 0x2000
|
|
|
+#define DRIVER_USE_PLATFORM_DEVICE 0x4000
|
|
|
|
|
|
/***********************************************************************/
|
|
|
/** \name Begin the DRM... */
|
|
@@ -823,6 +826,7 @@ struct drm_driver {
|
|
|
int num_ioctls;
|
|
|
struct file_operations fops;
|
|
|
struct pci_driver pci_driver;
|
|
|
+ struct platform_device *platform_device;
|
|
|
/* List of devices hanging off this driver */
|
|
|
struct list_head device_list;
|
|
|
};
|
|
@@ -1015,12 +1019,16 @@ struct drm_device {
|
|
|
|
|
|
struct drm_agp_head *agp; /**< AGP data */
|
|
|
|
|
|
+ struct device *dev; /**< Device structure */
|
|
|
struct pci_dev *pdev; /**< PCI device structure */
|
|
|
int pci_vendor; /**< PCI vendor id */
|
|
|
int pci_device; /**< PCI device id */
|
|
|
#ifdef __alpha__
|
|
|
struct pci_controller *hose;
|
|
|
#endif
|
|
|
+
|
|
|
+ struct platform_device *platformdev; /**< Platform device struture */
|
|
|
+
|
|
|
struct drm_sg_mem *sg; /**< Scatter gather memory */
|
|
|
int num_crtcs; /**< Number of CRTCs on this device */
|
|
|
void *dev_private; /**< device private data */
|
|
@@ -1060,17 +1068,21 @@ struct drm_device {
|
|
|
|
|
|
};
|
|
|
|
|
|
-static inline int drm_dev_to_irq(struct drm_device *dev)
|
|
|
-{
|
|
|
- return dev->pdev->irq;
|
|
|
-}
|
|
|
-
|
|
|
static __inline__ int drm_core_check_feature(struct drm_device *dev,
|
|
|
int feature)
|
|
|
{
|
|
|
return ((dev->driver->driver_features & feature) ? 1 : 0);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static inline int drm_dev_to_irq(struct drm_device *dev)
|
|
|
+{
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
|
|
|
+ return platform_get_irq(dev->platformdev, 0);
|
|
|
+ else
|
|
|
+ return dev->pdev->irq;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef __alpha__
|
|
|
#define drm_get_pci_domain(dev) dev->hose->index
|
|
|
#else
|
|
@@ -1273,10 +1285,6 @@ extern int drm_freebufs(struct drm_device *dev, void *data,
|
|
|
extern int drm_mapbufs(struct drm_device *dev, void *data,
|
|
|
struct drm_file *file_priv);
|
|
|
extern int drm_order(unsigned long size);
|
|
|
-extern resource_size_t drm_get_resource_start(struct drm_device *dev,
|
|
|
- unsigned int resource);
|
|
|
-extern resource_size_t drm_get_resource_len(struct drm_device *dev,
|
|
|
- unsigned int resource);
|
|
|
|
|
|
/* DMA support (drm_dma.h) */
|
|
|
extern int drm_dma_setup(struct drm_device *dev);
|
|
@@ -1351,8 +1359,11 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
|
|
|
struct drm_master *drm_master_create(struct drm_minor *minor);
|
|
|
extern struct drm_master *drm_master_get(struct drm_master *master);
|
|
|
extern void drm_master_put(struct drm_master **master);
|
|
|
-extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
|
|
|
- struct drm_driver *driver);
|
|
|
+extern int drm_get_pci_dev(struct pci_dev *pdev,
|
|
|
+ const struct pci_device_id *ent,
|
|
|
+ struct drm_driver *driver);
|
|
|
+extern int drm_get_platform_dev(struct platform_device *pdev,
|
|
|
+ struct drm_driver *driver);
|
|
|
extern void drm_put_dev(struct drm_device *dev);
|
|
|
extern int drm_put_minor(struct drm_minor **minor);
|
|
|
extern unsigned int drm_debug;
|
|
@@ -1529,6 +1540,9 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
|
|
|
|
|
|
static __inline__ int drm_device_is_agp(struct drm_device *dev)
|
|
|
{
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
|
|
|
+ return 0;
|
|
|
+
|
|
|
if (dev->driver->device_is_agp != NULL) {
|
|
|
int err = (*dev->driver->device_is_agp) (dev);
|
|
|
|
|
@@ -1542,7 +1556,10 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev)
|
|
|
|
|
|
static __inline__ int drm_device_is_pcie(struct drm_device *dev)
|
|
|
{
|
|
|
- return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
|
|
|
+ return 0;
|
|
|
+ else
|
|
|
+ return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
|
|
|
}
|
|
|
|
|
|
static __inline__ void drm_core_dropmap(struct drm_local_map *map)
|
|
@@ -1550,6 +1567,21 @@ static __inline__ void drm_core_dropmap(struct drm_local_map *map)
|
|
|
}
|
|
|
|
|
|
#include "drm_mem_util.h"
|
|
|
+
|
|
|
+static inline void *drm_get_device(struct drm_device *dev)
|
|
|
+{
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
|
|
|
+ return dev->platformdev;
|
|
|
+ else
|
|
|
+ return dev->pdev;
|
|
|
+}
|
|
|
+
|
|
|
+extern int drm_platform_init(struct drm_driver *driver);
|
|
|
+extern int drm_pci_init(struct drm_driver *driver);
|
|
|
+extern int drm_fill_in_dev(struct drm_device *dev,
|
|
|
+ const struct pci_device_id *ent,
|
|
|
+ struct drm_driver *driver);
|
|
|
+int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type);
|
|
|
/*@}*/
|
|
|
|
|
|
#endif /* __KERNEL__ */
|