static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct intel_device_info *intel_info = (struct intel_device_info *) ent->driver_data; if (IS_PRELIMINARY_HW(intel_info) && !i915.preliminary_hw_support) { DRM_INFO("This hardware requires preliminary hardware support.\n" "See CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT, and/or modparam preliminary_hw_support\n"); return -ENODEV; } /* Only bind to function 0 of the device. Early generations * used function 1 as a placeholder for multi-head. This causes * us confusion instead, especially on the systems where both * functions have the same PCI-ID! */ if (PCI_FUNC(pdev->devfn)) return -ENODEV; /* * apple-gmux is needed on dual GPU MacBook Pro * to probe the panel if we're the inactive GPU. */ if (IS_ENABLED(CONFIG_VGA_ARB) && IS_ENABLED(CONFIG_VGA_SWITCHEROO) && apple_gmux_present() && pdev != vga_default_device() && !vga_switcheroo_handler_flags()) return -EPROBE_DEFER; return drm_get_pci_dev(pdev, ent, &driver); }
int nouveau_backlight_init(struct drm_connector *connector) { struct nouveau_drm *drm = nouveau_drm(connector->dev); struct nouveau_backlight *bl; struct nouveau_encoder *nv_encoder = NULL; struct nvif_device *device = &drm->client.device; char backlight_name[BL_NAME_SIZE]; struct backlight_properties props = {0}; const struct backlight_ops *ops; int ret; if (apple_gmux_present()) { NV_INFO_ONCE(drm, "Apple GMUX detected: not registering Nouveau backlight interface\n"); return 0; } if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) nv_encoder = find_encoder(connector, DCB_OUTPUT_LVDS); else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) nv_encoder = find_encoder(connector, DCB_OUTPUT_DP); else return 0; if (!nv_encoder) return 0; switch (device->info.family) { case NV_DEVICE_INFO_V0_CURIE: ret = nv40_backlight_init(nv_encoder, &props, &ops); break; case NV_DEVICE_INFO_V0_TESLA: case NV_DEVICE_INFO_V0_FERMI: case NV_DEVICE_INFO_V0_KEPLER: case NV_DEVICE_INFO_V0_MAXWELL: ret = nv50_backlight_init(nv_encoder, &props, &ops); break; default: return 0; } if (ret == -ENODEV) return 0; else if (ret) return ret; bl = kzalloc(sizeof(*bl), GFP_KERNEL); if (!bl) return -ENOMEM; if (!nouveau_get_backlight_name(backlight_name, bl)) { NV_ERROR(drm, "Failed to retrieve a unique name for the backlight interface\n"); goto fail_alloc; } bl->dev = backlight_device_register(backlight_name, connector->kdev, nv_encoder, ops, &props); if (IS_ERR(bl->dev)) { if (bl->id >= 0) ida_simple_remove(&bl_ida, bl->id); ret = PTR_ERR(bl->dev); goto fail_alloc; } nouveau_connector(connector)->backlight = bl; bl->dev->props.brightness = bl->dev->ops->get_brightness(bl->dev); backlight_update_status(bl->dev); return 0; fail_alloc: kfree(bl); return ret; }