[Title] Reimplmented emulator backlight to support ACPI
authordon.hong <don.hong@samsung.com>
Thu, 12 Jan 2012 02:17:00 +0000 (11:17 +0900)
committerdon.hong <don.hong@samsung.com>
Thu, 12 Jan 2012 02:17:00 +0000 (11:17 +0900)
[Type] Enahncement
[Module]
[Priority]
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

Change-Id: I5b92404d215a22dc6100be8a2798fdfdd328402b

arch/x86/configs/i386_emul_defconfig
drivers/video/backlight/Kconfig
drivers/video/backlight/emul_backlight.c

index 0abf144334416ccfd12f092ef76e1c2f3a3c0981..4fd59fa0da91b4fa3979e540beda6f6632ea17ba 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.32.9
-# Wed Dec 14 10:09:11 2011
+# Wed Jan 11 20:07:48 2012
 #
 # CONFIG_64BIT is not set
 CONFIG_X86_32=y
@@ -341,6 +341,7 @@ CONFIG_MTRR=y
 # CONFIG_MTRR_SANITIZER is not set
 CONFIG_X86_PAT=y
 CONFIG_ARCH_USES_PG_UNCACHED=y
+# CONFIG_EFI is not set
 CONFIG_SECCOMP=y
 # CONFIG_CC_STACKPROTECTOR is not set
 CONFIG_HZ_100=y
@@ -362,7 +363,31 @@ CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
 #
 # Power management and ACPI options
 #
-# CONFIG_PM is not set
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
+# CONFIG_PM_RUNTIME is not set
+CONFIG_ACPI=y
+# CONFIG_ACPI_PROCFS is not set
+# CONFIG_ACPI_PROCFS_POWER is not set
+# CONFIG_ACPI_POWER_METER is not set
+CONFIG_ACPI_SYSFS_POWER=y
+# CONFIG_ACPI_PROC_EVENT is not set
+# CONFIG_ACPI_AC is not set
+# CONFIG_ACPI_BATTERY is not set
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_VIDEO=y
+# CONFIG_ACPI_FAN is not set
+# CONFIG_ACPI_DOCK is not set
+# CONFIG_ACPI_PROCESSOR is not set
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_X86_PM_TIMER=y
+# CONFIG_ACPI_CONTAINER is not set
+# CONFIG_ACPI_SBS is not set
 # CONFIG_SFI is not set
 
 #
@@ -401,7 +426,9 @@ CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 # shared options
 #
 # CONFIG_X86_SPEEDSTEP_LIB is not set
-# CONFIG_CPU_IDLE is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
 
 #
 # Bus options (PCI etc.)
@@ -414,6 +441,7 @@ CONFIG_PCI=y
 CONFIG_PCI_GOANY=y
 CONFIG_PCI_BIOS=y
 CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
 CONFIG_PCI_DOMAINS=y
 CONFIG_PCIEPORTBUS=y
 # CONFIG_HOTPLUG_PCI_PCIE is not set
@@ -454,6 +482,7 @@ CONFIG_PCCARD_NONSTATIC=y
 CONFIG_HOTPLUG_PCI=y
 # CONFIG_HOTPLUG_PCI_FAKE is not set
 # CONFIG_HOTPLUG_PCI_COMPAQ is not set
+# CONFIG_HOTPLUG_PCI_ACPI is not set
 # CONFIG_HOTPLUG_PCI_CPCI is not set
 # CONFIG_HOTPLUG_PCI_SHPC is not set
 
@@ -711,6 +740,13 @@ CONFIG_CONNECTOR=y
 CONFIG_PROC_EVENTS=y
 # CONFIG_MTD is not set
 # CONFIG_PARPORT is not set
+CONFIG_PNP=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+
+#
+# Protocols
+#
+CONFIG_PNPACPI=y
 CONFIG_BLK_DEV=y
 # CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_CPQ_DA is not set
@@ -764,6 +800,7 @@ CONFIG_IDE_GD_ATA=y
 # CONFIG_BLK_DEV_DELKIN is not set
 # CONFIG_BLK_DEV_IDECD is not set
 # CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEACPI is not set
 # CONFIG_IDE_TASK_IOCTL is not set
 CONFIG_IDE_PROC_FS=y
 
@@ -773,6 +810,7 @@ CONFIG_IDE_PROC_FS=y
 CONFIG_IDE_GENERIC=y
 CONFIG_BLK_DEV_PLATFORM=y
 # CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
 
 #
 # PCI IDE chipsets support
@@ -846,6 +884,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 CONFIG_VETH=y
+# CONFIG_NET_SB1000 is not set
 # CONFIG_ARCNET is not set
 CONFIG_PHYLIB=y
 
@@ -1126,6 +1165,7 @@ CONFIG_INPUT_MISC=y
 # CONFIG_INPUT_PCSPKR is not set
 # CONFIG_INPUT_APANEL is not set
 # CONFIG_INPUT_WISTRON_BTNS is not set
+# CONFIG_INPUT_ATLAS_BTNS is not set
 # CONFIG_INPUT_ATI_REMOTE is not set
 # CONFIG_INPUT_ATI_REMOTE2 is not set
 # CONFIG_INPUT_KEYSPAN_REMOTE is not set
@@ -1133,6 +1173,7 @@ CONFIG_INPUT_MISC=y
 # CONFIG_INPUT_YEALINK is not set
 # CONFIG_INPUT_CM109 is not set
 # CONFIG_INPUT_UINPUT is not set
+# CONFIG_INPUT_WINBOND_CIR is not set
 
 #
 # Hardware I/O ports
@@ -1179,6 +1220,7 @@ CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_FIX_EARLYCON_MEM=y
 CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_PNP=y
 # CONFIG_SERIAL_8250_CS is not set
 CONFIG_SERIAL_8250_NR_UARTS=32
 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
@@ -1223,6 +1265,7 @@ CONFIG_NVRAM=y
 # CONFIG_NSC_GPIO is not set
 # CONFIG_CS5535_GPIO is not set
 # CONFIG_RAW_DRIVER is not set
+# CONFIG_HPET is not set
 # CONFIG_HANGCHECK_TIMER is not set
 # CONFIG_TCG_TPM is not set
 # CONFIG_TELCLOCK is not set
@@ -1257,6 +1300,11 @@ CONFIG_I2C_I801=y
 # CONFIG_I2C_VIA is not set
 # CONFIG_I2C_VIAPRO is not set
 
+#
+# ACPI drivers
+#
+# CONFIG_I2C_SCMI is not set
+
 #
 # I2C system bus drivers (mostly embedded / system-on-chip)
 #
@@ -1383,6 +1431,12 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_W83627EHF is not set
 # CONFIG_SENSORS_HDAPS is not set
 # CONFIG_SENSORS_APPLESMC is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_SENSORS_ATK0110 is not set
+# CONFIG_SENSORS_LIS3LV02D is not set
 CONFIG_THERMAL=y
 # CONFIG_THERMAL_HWMON is not set
 CONFIG_WATCHDOG=y
@@ -1581,7 +1635,7 @@ CONFIG_DRM_I915=y
 # CONFIG_DRM_VIA is not set
 # CONFIG_DRM_SAVAGE is not set
 # CONFIG_VGASTATE is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
 # CONFIG_FIRMWARE_EDID is not set
 # CONFIG_FB_DDC is not set
@@ -1644,7 +1698,11 @@ CONFIG_FB_UVESA=y
 # CONFIG_FB_BROADSHEET is not set
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
-# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+# CONFIG_BACKLIGHT_PROGEAR is not set
+# CONFIG_BACKLIGHT_MBP_NVIDIA is not set
+# CONFIG_BACKLIGHT_SAHARA is not set
 CONFIG_BACKLIGHT_EMUL=y
 
 #
@@ -1855,6 +1913,7 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
 CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_DEVICE_CLASS is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
 # CONFIG_USB_OTG is not set
 CONFIG_USB_MON=y
 # CONFIG_USB_WUSB is not set
@@ -2107,6 +2166,19 @@ CONFIG_ANDROID_TIMED_OUTPUT=y
 CONFIG_EMUL_LCD=y
 CONFIG_EMUL_CODEC=y
 CONFIG_X86_PLATFORM_DEVICES=y
+# CONFIG_ACER_WMI is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_FUJITSU_LAPTOP is not set
+# CONFIG_TC1100_WMI is not set
+# CONFIG_MSI_LAPTOP is not set
+# CONFIG_PANASONIC_LAPTOP is not set
+# CONFIG_COMPAL_LAPTOP is not set
+# CONFIG_THINKPAD_ACPI is not set
+# CONFIG_EEEPC_LAPTOP is not set
+# CONFIG_ACPI_WMI is not set
+# CONFIG_ACPI_ASUS is not set
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_ACPI_TOSHIBA is not set
 
 #
 # Firmware Drivers
@@ -2449,6 +2521,7 @@ CONFIG_SECURITY_FILE_CAPABILITIES=y
 # CONFIG_SECURITY_SELINUX is not set
 CONFIG_SECURITY_SMACK=y
 # CONFIG_SECURITY_TOMOYO is not set
+# CONFIG_IMA is not set
 CONFIG_CRYPTO=y
 
 #
index 1cd39baa74afa00190cd17685d2beebf7105f6e0..9610621352e66614e92929bea2724976b1bb9ab4 100644 (file)
@@ -264,6 +264,7 @@ config BACKLIGHT_ADP5520
 
 config BACKLIGHT_EMUL
        tristate "Virtual Emulator Backlight Driver"
+       depends on BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y to enable the backlight driver on Emulator.
index bb30f446ffd395ca3ee99320a8a0c345fe9728df..1cd717ad5411912cc666ff47176f592ff0090d29 100644 (file)
@@ -4,10 +4,7 @@
  * Copyright (c) 2011 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Contact:
- * Hyunjun Son <hj79.son@samsung.com>
- * GiWoong Kim <giwoong.kim@samsung.com>
- * DongKyun Yun <dk77.yun@samsung.com>
- * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
+ * Dohyung Hong <don.hong@samsung.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -35,6 +32,8 @@
 #include <linux/notifier.h>
 #include <linux/ctype.h>
 #include <linux/err.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
 
 #include <asm/uaccess.h>
 
@@ -54,12 +53,9 @@ MODULE_DEVICE_TABLE(pci, svb_pci_table);
 
 /* samsung virtual brightness(backlight) device structure */
 struct svb {
-       struct pci_dev *pci_dev;
-       unsigned int brightness_level;
-
-       resource_size_t mem_start, reg_start;
-       resource_size_t mem_size, reg_size;
-
+       struct backlight_device *bl_dev;
+       unsigned int brightness;
+       resource_size_t reg_start, reg_size;
        unsigned char __iomem *svb_mmreg;       /* svb: memory mapped registers */
 };
 
@@ -67,68 +63,37 @@ struct svb {
 static struct svb *svb_device;
 /* ============================================================================== */
 
-static struct class *emul_backlight_class;
-static struct device *emul_backlight_dev;
-
-static int brightness;
 static int max_brightness = 24;
 
-static ssize_t bl_brightness_show(struct device *dev,
-               struct device_attribute *attr, char *buf)
+static int emulbl_get_intensity(struct backlight_device *bd)
 {
-       /* handover to qemu layer */
-       brightness = (unsigned int)readl(svb_device->svb_mmreg);
-       printk(KERN_INFO "%s: brightness = %d\n", __FUNCTION__, brightness);
-
-       return sprintf(buf, "%d\n", brightness);
+       return svb_device->brightness;
+       //      return svb_device->brightness = (unsigned int)readl(svb_device->svb_mmreg);
 }
 
-static ssize_t bl_brightness_store(struct device *dev,
-               struct device_attribute *attr, const char *buf, size_t count)
+static int emulbl_send_intensity(struct backlight_device *bd)
 {
-       int rc;
-       unsigned long brightness_level;
+       int intensity = bd->props.brightness;
 
-       rc = strict_strtoul(buf, 0, &brightness_level);
-       if (rc)
-               return rc;
+       if (bd->props.power != FB_BLANK_UNBLANK)
+               intensity = 0;
+       if (bd->props.state & BL_CORE_FBBLANK)
+               intensity = 0;
+       if (bd->props.state & BL_CORE_SUSPENDED)
+               intensity = 0;
+//     if (bd->props.state & GENERICBL_BATTLOW)
+//             intensity &= bl_machinfo->limit_mask;
 
-       rc = -ENXIO;
+       writel(intensity, svb_device->svb_mmreg);
+       svb_device->brightness = intensity;
 
-       if (brightness_level > max_brightness) {
-               rc = -EINVAL;
-       } else {
-               printk(KERN_INFO "backlight: set brightness to %lu\n", brightness_level);
-               brightness = brightness_level;
-
-               /* handover to qemu layer */
-               writel(brightness, svb_device->svb_mmreg);
-
-               rc = count;
-       }
-       return rc;
-}
-
-static ssize_t bl_max_brightness_show(struct device *dev,
-               struct device_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%d\n", max_brightness);
-}
-
-#if 0
-static ssize_t bl_max_brightness_store(struct device *dev,
-               struct device_attribute *attr, const char *buf, size_t count)
-{
        return 0;
 }
-#endif
-
-static DEVICE_ATTR(brightness, 0664, bl_brightness_show, bl_brightness_store);
-static DEVICE_ATTR(max_brightness, 0664, bl_max_brightness_show, NULL);
 
-static struct device_attribute *emul_bl_device_attrib[] = {
-               &dev_attr_brightness,
-               &dev_attr_max_brightness,
+static struct backlight_ops emulbl_ops = {
+       .options = BL_CORE_SUSPENDRESUME,
+       .get_brightness = emulbl_get_intensity,
+       .update_status  = emulbl_send_intensity,
 };
 
 /* pci probe function
@@ -136,7 +101,8 @@ static struct device_attribute *emul_bl_device_attrib[] = {
 static int __devinit svb_probe(struct pci_dev *pci_dev,
                        const struct pci_device_id *ent)
 {
-       int ret = -EBUSY;
+       int ret;
+       struct backlight_device *bd;
 
        svb_device = kmalloc(sizeof(struct svb), GFP_KERNEL);
        if (svb_device == NULL) {
@@ -146,64 +112,80 @@ static int __devinit svb_probe(struct pci_dev *pci_dev,
 
        memset(svb_device, 0, sizeof(struct svb));
 
-       if (svb_device->pci_dev != NULL) {
-               printk(KERN_ERR "[svb] Only one device is allowed.\n");
-               goto outnotdev;
-       }
-
-       svb_device->pci_dev = pci_dev;
-
-       ret = -EIO;
-       if ((ret = pci_enable_device(svb_device->pci_dev)) < 0) {
+       if ((ret = pci_enable_device(pci_dev)) < 0) {
                printk(KERN_ERR "svb: pci_enable_device is failed.\n");
                goto outnotdev;
        }
 
-       /* 0 : IORESOURCE_IO */
-       svb_device->mem_start = pci_resource_start(svb_device->pci_dev, 0);
-       svb_device->mem_size = pci_resource_len(svb_device->pci_dev, 0);
-
-       if (!request_mem_region(pci_resource_start(svb_device->pci_dev, 0),
-                               pci_resource_len(svb_device->pci_dev, 0),
-                               SVB_DRIVER_NAME)) {
-       }
+       ret = -EIO;
 
        /* 1 : IORESOURCE_MEM */
-       svb_device->reg_start = pci_resource_start(svb_device->pci_dev, 1);
-       svb_device->reg_size = pci_resource_len(svb_device->pci_dev, 1);
-
-       if (!request_mem_region(pci_resource_start(svb_device->pci_dev, 1),
-                               pci_resource_len(svb_device->pci_dev, 1),
-                               SVB_DRIVER_NAME)) {
+       if (!request_mem_region(svb_device->reg_start = pci_resource_start(pci_dev, 1),
+                                                       svb_device->reg_size  = pci_resource_len(pci_dev, 1),
+                                                       SVB_DRIVER_NAME)) {
+               goto outnotdev;
        }
 
        /* memory areas mapped kernel space */
        svb_device->svb_mmreg = ioremap(svb_device->reg_start, svb_device->reg_size);
        if (!svb_device->svb_mmreg) {
+               goto outnotdev;
+       }
+
+       //pci_write_config_byte(pci_dev, PCI_CACHE_LINE_SIZE, 8);
+       pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, 64);
+       pci_set_master(pci_dev);
+
+       /*
+        * register backlight device
+        */
+       bd = backlight_device_register ("emulator",     &pci_dev->dev, NULL, &emulbl_ops);
+       if (IS_ERR (bd)) {
+               ret = PTR_ERR (bd);
+               goto outnotdev;
        }
 
-       //pci_write_config_byte(svb_device->pci_dev, PCI_CACHE_LINE_SIZE, 8);
-       pci_write_config_byte(svb_device->pci_dev, PCI_LATENCY_TIMER, 64);
-       pci_set_master(svb_device->pci_dev);
+       bd->props.brightness = (unsigned int)readl(svb_device->svb_mmreg);;
+       bd->props.max_brightness = max_brightness;
+       bd->props.power = FB_BLANK_UNBLANK;
+       backlight_update_status(bd);
+
+       svb_device->bl_dev = bd;
 
        printk(KERN_INFO "svb: Samsung Virtual Backlight driver.\n");
        return 0;
 
 outnotdev:
+       if (svb_device->svb_mmreg)
+               iounmap(svb_device->svb_mmreg);
        kfree(svb_device);
        return ret;
 }
 
 static void __devexit svb_exit(struct pci_dev *pcidev)
 {
+       /*
+        * Unregister backlight device
+        */
+       struct backlight_device *bd = svb_device->bl_dev;
+
+       bd->props.power = 0;
+       bd->props.brightness = 0;
+       backlight_update_status(bd);
+
+       backlight_device_unregister(bd);
+
+       /*
+        * Unregister pci device & delete device
+        */
        iounmap(svb_device->svb_mmreg);
        pci_disable_device(pcidev);
        kfree(svb_device);
 }
 
-/* register pci driver
-*/
-
+/*
+ * register pci driver
+ */
 static struct pci_driver svb_pci_driver = {
        .name     = SVB_DRIVER_NAME,
        .id_table = svb_pci_table,
@@ -215,50 +197,22 @@ static struct pci_driver svb_pci_driver = {
 #endif
 };
 
-static int backlight_svb_init(void)
+static int __init emulbl_init(void)
 {
        return pci_register_driver(&svb_pci_driver);
 }
 
-static int __init emul_backlight_class_init(void)
-{
-       int i, ret;
-
-       emul_backlight_class = class_create(THIS_MODULE, "backlight");
-       if (IS_ERR(emul_backlight_class)) {
-               printk(KERN_WARNING "Unable to create backlight class; errno = %ld\n",
-                               PTR_ERR(emul_backlight_class));
-               return PTR_ERR(emul_backlight_class);
-       }
-
-       emul_backlight_dev = device_create(emul_backlight_class, NULL, 0, NULL, "emulator");
-
-       for (i=0; i < ARRAY_SIZE(emul_bl_device_attrib); i++) {
-               ret = device_create_file(emul_backlight_dev, emul_bl_device_attrib[i]);
-               if (ret != 0) {
-                       printk(KERN_ERR "emul_bl: Failed to create attr %d: %d\n", i, ret);
-                       return ret;
-               }
-       }
-
-       /* related to virtual pci device */
-       backlight_svb_init();
-
-       return 0;
-}
-
-static void __exit emul_backlight_class_exit(void)
+static void __exit emulbl_exit(void)
 {
-       class_destroy(emul_backlight_class);
+       pci_unregister_driver(&svb_pci_driver);
 }
 
 /*
  * if this is compiled into the kernel, we need to ensure that the
  * class is registered before users of the class try to register lcd's
  */
-//postcore_initcall(emul_backlight_class_init);
-module_init(emul_backlight_class_init);
-module_exit(emul_backlight_class_exit);
+module_init(emulbl_init);
+module_exit(emulbl_exit);
 
 MODULE_LICENSE("GPL2");
 MODULE_DESCRIPTION("Emulator Virtual Backlight Driver for x86");