drm/nouveau/subdev: add direct pointer to nvkm_device
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:05 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:06 +0000 (12:40 +1000)
Will be utilised in upcoming commits to remove the need for heuristics
to lookup the device a subdev belongs to.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h
drivers/gpu/drm/nouveau/nvkm/core/subdev.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.c

index d9720dd..792bf54 100644 (file)
@@ -130,17 +130,17 @@ static bool
 get_tv_detect_quirks(struct drm_device *dev, uint32_t *pin_mask)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
-       struct nvif_device *device = &drm->device;
+       struct nvkm_device *device = nvxx_device(&drm->device);
 
        /* Zotac FX5200 */
-       if (nv_device_match(nvxx_object(device), 0x0322, 0x19da, 0x1035) ||
-           nv_device_match(nvxx_object(device), 0x0322, 0x19da, 0x2035)) {
+       if (nv_device_match(device, 0x0322, 0x19da, 0x1035) ||
+           nv_device_match(device, 0x0322, 0x19da, 0x2035)) {
                *pin_mask = 0xc;
                return false;
        }
 
        /* MSI nForce2 IGP */
-       if (nv_device_match(nvxx_object(device), 0x01f0, 0x1462, 0x5710)) {
+       if (nv_device_match(device, 0x01f0, 0x1462, 0x5710)) {
                *pin_mask = 0xc;
                return false;
        }
index 333db33..5983b30 100644 (file)
@@ -49,9 +49,8 @@ int nvkm_device_list(u64 *name, int size);
 struct nvkm_device *nv_device(void *obj);
 
 static inline bool
-nv_device_match(struct nvkm_object *object, u16 dev, u16 ven, u16 sub)
+nv_device_match(struct nvkm_device *device, u16 dev, u16 ven, u16 sub)
 {
-       struct nvkm_device *device = nv_device(object);
        return device->pdev->device == dev &&
               device->pdev->subsystem_vendor == ven &&
               device->pdev->subsystem_device == sub;
index 6fdc391..8357319 100644 (file)
@@ -8,6 +8,9 @@
 
 struct nvkm_subdev {
        struct nvkm_object object;
+
+       struct nvkm_device *device;
+
        struct mutex mutex;
        const char *name;
        void __iomem *mmio;
index c5fb3a7..b96cb2c 100644 (file)
@@ -114,6 +114,9 @@ nvkm_subdev_create_(struct nvkm_object *parent, struct nvkm_object *engine,
                struct nvkm_device *device = nv_device(parent);
                subdev->debug = nvkm_dbgopt(device->dbgopt, subname);
                subdev->mmio  = nv_subdev(device)->mmio;
+               subdev->device = device;
+       } else {
+               subdev->device = nv_device(subdev);
        }
 
        return 0;
index dea5816..980822d 100644 (file)
@@ -44,6 +44,7 @@ static int
 nvkm_gpio_find(struct nvkm_gpio *gpio, int idx, u8 tag, u8 line,
               struct dcb_gpio_func *func)
 {
+       struct nvkm_device *device = gpio->base.device;
        struct nvkm_bios *bios = nvkm_bios(gpio);
        u8  ver, len;
        u16 data;
@@ -56,7 +57,7 @@ nvkm_gpio_find(struct nvkm_gpio *gpio, int idx, u8 tag, u8 line,
                return 0;
 
        /* Apple iMac G4 NV18 */
-       if (nv_device_match(nv_object(gpio), 0x0189, 0x10de, 0x0010)) {
+       if (nv_device_match(device, 0x0189, 0x10de, 0x0010)) {
                if (tag == DCB_GPIO_TVDAC0) {
                        *func = (struct dcb_gpio_func) {
                                .func = DCB_GPIO_TVDAC0,
index b744136..1e9f1d0 100644 (file)
@@ -54,7 +54,6 @@ static void
 gk104_pmu_pgob(struct nvkm_pmu *pmu, bool enable)
 {
        struct nvkm_device *device = nv_device(pmu);
-       struct nvkm_object *dev = nv_object(device);
 
        nv_mask(pmu, 0x000200, 0x00001000, 0x00000000);
        nv_rd32(pmu, 0x000200);
@@ -76,8 +75,8 @@ gk104_pmu_pgob(struct nvkm_pmu *pmu, bool enable)
        nv_mask(pmu, 0x000200, 0x00001000, 0x00001000);
        nv_rd32(pmu, 0x000200);
 
-       if (nv_device_match(dev, 0x11fc, 0x17aa, 0x2211) /* Lenovo W541 */
-        || nv_device_match(dev, 0x11fc, 0x17aa, 0x221e) /* Lenovo W541 */
+       if (nv_device_match(device, 0x11fc, 0x17aa, 0x2211) /* Lenovo W541 */
+        || nv_device_match(device, 0x11fc, 0x17aa, 0x221e) /* Lenovo W541 */
         || nvkm_boolopt(device->cfgopt, "War00C800_0", false)) {
                nv_info(pmu, "hw bug workaround enabled\n");
                switch (device->chipset) {