static int platform_probe(struct platform_device *dev) { struct backlight_properties props; int ret; mutex_init(&dev_priv.mutex); INIT_DELAYED_WORK(&dev_priv.work, brightness_work); ret = lp8550_probe(); if (ret) return ret; ret = lp8550_save(); if (ret) return ret; memset(&props, 0, sizeof(struct backlight_properties)); props.max_brightness = 255; props.type = BACKLIGHT_FIRMWARE; props.power = 0; /* Power is on */ backlight_device = backlight_device_register("mba6x_backlight", NULL, NULL, &backlight_ops, &props); if (IS_ERR(backlight_device)) { pr_err("mba6x_bl: Failed to register backlight device\n"); return PTR_ERR(backlight_device); } backlight_device->props.brightness = INIT_BRIGHTNESS; backlight_update_status(backlight_device); #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) acpi_video_set_dmi_backlight_type(acpi_backlight_vendor); #else acpi_video_dmi_promote_vendor(); #endif acpi_video_unregister(); return 0; }
int i915_driver_unload(struct drm_device *dev) { struct drm_i915_private *dev_priv = dev->dev_private; int ret; ret = i915_gem_suspend(dev); if (ret) { DRM_ERROR("failed to idle hardware: %d\n", ret); return ret; } intel_power_domains_fini(dev_priv); intel_gpu_ips_teardown(); i915_teardown_sysfs(dev); WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier)); unregister_shrinker(&dev_priv->mm.shrinker); io_mapping_free(dev_priv->gtt.mappable); arch_phys_wc_del(dev_priv->gtt.mtrr); acpi_video_unregister(); if (drm_core_check_feature(dev, DRIVER_MODESET)) intel_fbdev_fini(dev); drm_vblank_cleanup(dev); if (drm_core_check_feature(dev, DRIVER_MODESET)) { intel_modeset_cleanup(dev); /* * free the memory space allocated for the child device * config parsed from VBT */ if (dev_priv->vbt.child_dev && dev_priv->vbt.child_dev_num) { kfree(dev_priv->vbt.child_dev); dev_priv->vbt.child_dev = NULL; dev_priv->vbt.child_dev_num = 0; } vga_switcheroo_unregister_client(dev->pdev); vga_client_register(dev->pdev, NULL, NULL, NULL); } /* Free error state after interrupts are fully disabled. */ del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); cancel_work_sync(&dev_priv->gpu_error.work); i915_destroy_error_state(dev); if (dev->pdev->msi_enabled) pci_disable_msi(dev->pdev); intel_opregion_fini(dev); if (drm_core_check_feature(dev, DRIVER_MODESET)) { /* Flush any outstanding unpin_work. */ flush_workqueue(dev_priv->wq); mutex_lock(&dev->struct_mutex); i915_gem_cleanup_ringbuffer(dev); i915_gem_context_fini(dev); mutex_unlock(&dev->struct_mutex); i915_gem_cleanup_stolen(dev); } intel_teardown_gmbus(dev); intel_teardown_mchbar(dev); destroy_workqueue(dev_priv->dp_wq); destroy_workqueue(dev_priv->wq); pm_qos_remove_request(&dev_priv->pm_qos); i915_global_gtt_cleanup(dev); intel_uncore_fini(dev); if (dev_priv->regs != NULL) pci_iounmap(dev->pdev, dev_priv->regs); if (dev_priv->slab) kmem_cache_destroy(dev_priv->slab); pci_dev_put(dev_priv->bridge_dev); kfree(dev_priv); return 0; }
static int __devinit gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) { struct apple_gmux_data *gmux_data; struct resource *res; struct backlight_properties props; struct backlight_device *bdev; u8 ver_major, ver_minor, ver_release; int ret = -ENXIO; gmux_data = kzalloc(sizeof(*gmux_data), GFP_KERNEL); if (!gmux_data) return -ENOMEM; pnp_set_drvdata(pnp, gmux_data); res = pnp_get_resource(pnp, IORESOURCE_IO, 0); if (!res) { pr_err("Failed to find gmux I/O resource\n"); goto err_free; } gmux_data->iostart = res->start; gmux_data->iolen = res->end - res->start; if (gmux_data->iolen < GMUX_MIN_IO_LEN) { pr_err("gmux I/O region too small (%lu < %u)\n", gmux_data->iolen, GMUX_MIN_IO_LEN); goto err_free; } if (!request_region(gmux_data->iostart, gmux_data->iolen, "Apple gmux")) { pr_err("gmux I/O already in use\n"); goto err_free; } /* * On some machines the gmux is in ACPI even thought the machine * doesn't really have a gmux. Check for invalid version information * to detect this. */ ver_major = gmux_read8(gmux_data, GMUX_PORT_VERSION_MAJOR); ver_minor = gmux_read8(gmux_data, GMUX_PORT_VERSION_MINOR); ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE); if (ver_major == 0xff && ver_minor == 0xff && ver_release == 0xff) { pr_info("gmux device not present\n"); ret = -ENODEV; goto err_release; } pr_info("Found gmux version %d.%d.%d\n", ver_major, ver_minor, ver_release); memset(&props, 0, sizeof(props)); props.type = BACKLIGHT_PLATFORM; props.max_brightness = gmux_read32(gmux_data, GMUX_PORT_MAX_BRIGHTNESS); /* * Currently it's assumed that the maximum brightness is less than * 2^24 for compatibility with old gmux versions. Cap the max * brightness at this value, but print a warning if the hardware * reports something higher so that it can be fixed. */ if (WARN_ON(props.max_brightness > GMUX_MAX_BRIGHTNESS)) props.max_brightness = GMUX_MAX_BRIGHTNESS; bdev = backlight_device_register("gmux_backlight", &pnp->dev, gmux_data, &gmux_bl_ops, &props); if (IS_ERR(bdev)) { ret = PTR_ERR(bdev); goto err_release; } gmux_data->bdev = bdev; bdev->props.brightness = gmux_get_brightness(bdev); backlight_update_status(bdev); /* * The backlight situation on Macs is complicated. If the gmux is * present it's the best choice, because it always works for * backlight control and supports more levels than other options. * Disable the other backlight choices. */ acpi_video_dmi_promote_vendor(); #ifdef CONFIG_ACPI_VIDEO acpi_video_unregister(); #endif apple_bl_unregister(); return 0; err_release: release_region(gmux_data->iostart, gmux_data->iolen); err_free: kfree(gmux_data); return ret; }
static void poulsbo_remove(struct pci_dev *pdev) { acpi_video_unregister(); }