linux-openmoko-2.6.32: add patches from gdrm-for-merging instead of gdrm-2.6.32 branc...
authorMartin Jansa <Martin.Jansa@gmail.com>
Mon, 17 May 2010 11:31:01 +0000 (13:31 +0200)
committerMartin Jansa <Martin.Jansa@gmail.com>
Mon, 17 May 2010 19:23:57 +0000 (21:23 +0200)
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
31 files changed:
recipes/linux/linux-openmoko-2.6.32/0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch
recipes/linux/linux-openmoko-2.6.32/0002-accels.patch.patch [moved from recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch with 99% similarity]
recipes/linux/linux-openmoko-2.6.32/0003-usbhost.patch.patch [moved from recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch with 96% similarity]
recipes/linux/linux-openmoko-2.6.32/0004-ar6000_delay.patch.patch [moved from recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch with 97% similarity]
recipes/linux/linux-openmoko-2.6.32/0005-Add-JBT6k74-hook-for-use-by-KMS.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0005-save_regs.patch.patch [moved from recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch with 97% similarity]
recipes/linux/linux-openmoko-2.6.32/0006-glamo-drm-use-dev_set_drvdata-instead-of-setting-dri.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0006-gta02-defconfigs-enable-LEDS_S3C24XX-and-dummy-batte.patch [moved from recipes/linux/linux-openmoko-2.6.32/0026-gta02-defconfigs-enable-LEDS_S3C24XX.patch with 60% similarity]
recipes/linux/linux-openmoko-2.6.32/0007-DRM-for-platform-devices.patch [moved from recipes/linux/linux-openmoko-2.6.32/0002-DRM-for-platform-devices.patch with 99% similarity]
recipes/linux/linux-openmoko-2.6.32/0007-glamo-drm-select-DRM_KMS_HELPER-for-crtc-functions.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0008-Glamo-DRM-and-KMS-driver.patch [moved from recipes/linux/linux-openmoko-2.6.32/0003-Glamo-DRM-and-KMS-driver.patch with 89% similarity]
recipes/linux/linux-openmoko-2.6.32/0009-A-couple-of-GEM-refcounting-fixes.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0009-Work-on-Glamo-core-for-DRM.patch [moved from recipes/linux/linux-openmoko-2.6.32/0004-Work-on-Glamo-core-for-DRM.patch with 84% similarity]
recipes/linux/linux-openmoko-2.6.32/0010-JBT6k74-work-for-KMS.patch [new file with mode: 0644]
recipes/linux/linux-openmoko-2.6.32/0010-Simplify-the-JBT6k74-driver.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0011-Don-t-choke-if-userspace-provides-a-pixel-clock-valu.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0011-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch [moved from recipes/linux/linux-openmoko-2.6.32/0008-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch with 86% similarity]
recipes/linux/linux-openmoko-2.6.32/0012-Fix-dynamic-command-queue-allocation.patch [new file with mode: 0644]
recipes/linux/linux-openmoko-2.6.32/0012-Report-all-FB-modes-given-by-the-lower-levels.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0013-Change-connector-type-to-LVDS.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0013-Debug-statements-for-testing.patch [new file with mode: 0644]
recipes/linux/linux-openmoko-2.6.32/0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0014-Fix-claim-of-2D-register-resource.patch [new file with mode: 0644]
recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32/0025-Almost-make-rotation-work.patch [deleted file]
recipes/linux/linux-openmoko-2.6.32_git.bb

index c6a16ab..52fe626 100644 (file)
@@ -1,7 +1,7 @@
-From b3b22a8f23e6b49d21bbfe70f278a0d79419e3df Mon Sep 17 00:00:00 2001
+From 16722526979959805c493deabaac8cf9ba2f8ef6 Mon Sep 17 00:00:00 2001
 From: Martin Jansa <Martin.Jansa@gmail.com>
 Date: Sat, 7 Nov 2009 20:33:06 +0100
-Subject: [PATCH 1/9] wm8753: fix build with gcc-4.4.2, which works ok with 4.1.2
+Subject: [PATCH 01/14] wm8753: fix build with gcc-4.4.2, which works ok with 4.1.2
 
 Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
 ---
@@ -24,5 +24,5 @@ index 5ad677c..e148406 100644
        K = Kpart & 0xFFFFFFFF;
  
 -- 
-1.6.6.1
+1.7.1
 
@@ -1,7 +1,7 @@
-From a08be3ba79daf13baca6de98249c8784ede31297 Mon Sep 17 00:00:00 2001
+From b96dbc75c274014171a53da13686bd90d239c023 Mon Sep 17 00:00:00 2001
 From: Radek Polak <psonek2@seznam.cz>
 Date: Fri, 9 Apr 2010 09:15:40 +0200
-Subject: [PATCH 17/22] accels.patch
+Subject: [PATCH 02/14] accels.patch
 
 adds support for accelerometers. You will need include/linux/lis302dl.h and
 drivers/input/misc/lis302dl.c from andy-tracking. The patch needs
@@ -39,7 +39,7 @@ index 980a099..0ff8949 100644
  
  
 diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c
-index b580b1b..8e3cc91 100644
+index 7965cad..0675181 100644
 --- a/arch/arm/mach-s3c2442/mach-gta02.c
 +++ b/arch/arm/mach-s3c2442/mach-gta02.c
 @@ -63,6 +63,7 @@
@@ -73,7 +73,7 @@ index b580b1b..8e3cc91 100644
  struct pcf50633 *gta02_pcf;
  
  /*
-@@ -776,6 +793,60 @@ const struct jbt6k74_platform_data jbt6k74_pdata = {
+@@ -775,6 +792,60 @@ const struct jbt6k74_platform_data jbt6k74_pdata = {
        .gpio_reset = GTA02_GPIO_GLAMO(4),
  };
  
@@ -134,7 +134,7 @@ index b580b1b..8e3cc91 100644
  static struct spi_board_info gta02_spi_board_info[] = {
        {
                .modalias       = "jbt6k74",
-@@ -786,6 +857,81 @@ static struct spi_board_info gta02_spi_board_info[] = {
+@@ -785,6 +856,81 @@ static struct spi_board_info gta02_spi_board_info[] = {
                .bus_num        = 2,
                .chip_select = 0
        },
@@ -216,7 +216,7 @@ index b580b1b..8e3cc91 100644
  };
  
  /* BQ27000 Battery */
-@@ -1136,6 +1282,7 @@ static struct platform_device *gta02_devices[] __initdata = {
+@@ -1135,6 +1281,7 @@ static struct platform_device *gta02_devices[] __initdata = {
  static struct platform_device *gta02_devices_pmu_children[] = {
        &s3c_device_ts,
        &gta02_glamo_dev,
@@ -224,7 +224,7 @@ index b580b1b..8e3cc91 100644
        &s3c_device_timer[2],
        &gta02_hdq_device,
        &gta02_gps_userspace_consumer
-@@ -1362,6 +1509,16 @@ static void __init gta02_machine_init(void)
+@@ -1361,6 +1508,16 @@ static void __init gta02_machine_init(void)
        /* Set the panic callback to make AUX LED blink at ~5Hz. */
        panic_blink = gta02_panic_blink;
  
@@ -1755,5 +1755,5 @@ index eed4254..f92de01 100644
  /* start or stop queue processing */
  extern int spi_bitbang_start(struct spi_bitbang *spi);
 -- 
-1.7.0.4
+1.7.1
 
@@ -1,7 +1,7 @@
-From d71534de6ab5e132d0798df30408042c229cbb62 Mon Sep 17 00:00:00 2001
+From 1000aee5e65dc824e02aafe2a70ad5b3f0d44d2d Mon Sep 17 00:00:00 2001
 From: Radek Polak <psonek2@seznam.cz>
 Date: Fri, 9 Apr 2010 09:17:28 +0200
-Subject: [PATCH 18/22] usbhost.patch
+Subject: [PATCH 03/14] usbhost.patch
 
 adds support for usb host mode and adds usb host pm sysfs node. I just copied
 and modified how modem is powered up and backported changes in ohci-s3c2410.c.
@@ -32,7 +32,7 @@ index 6247ca0..3e7145c 100644
  # Machine support
  
 diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c
-index 8e3cc91..f1d4d51 100644
+index 0675181..779d6df 100644
 --- a/arch/arm/mach-s3c2442/mach-gta02.c
 +++ b/arch/arm/mach-s3c2442/mach-gta02.c
 @@ -322,6 +322,10 @@ static struct platform_device gta02_pm_gsm_dev = {
@@ -106,7 +106,7 @@ index 8e3cc91..f1d4d51 100644
  static struct regulator_bulk_data gta02_gps_consumer_supply = {
        .supply = "GPS",
  };
-@@ -1332,12 +1368,17 @@ static struct platform_device* gta02_glamo_gpio_children[] = {
+@@ -1331,12 +1367,17 @@ static struct platform_device* gta02_glamo_gpio_children[] = {
  
  static struct platform_device* gta02_pcf50633_gpio_children[] = {
        &gta02_gsm_supply_device,
@@ -124,7 +124,7 @@ index 8e3cc91..f1d4d51 100644
  static struct platform_device* gta02_hdq_children[] = {
        &bq27000_battery_device,
  };
-@@ -1364,14 +1405,19 @@ static struct gta02_device_children gta02_device_children[] = {
+@@ -1363,14 +1404,19 @@ static struct gta02_device_children gta02_device_children[] = {
        },
        {
                .dev_name = "pcf50633-gpio",
@@ -229,5 +229,5 @@ index a68af2d..02bd7b0 100644
        s3c2410_stop_hc(dev);
        iounmap(hcd->regs);
 -- 
-1.7.0.4
+1.7.1
 
@@ -1,7 +1,7 @@
-From cf93a0f8d2d61a2e13590c261dee4c4d74412db7 Mon Sep 17 00:00:00 2001
+From c9580261d79d8d1664fbd2da52dcd2148da9ef14 Mon Sep 17 00:00:00 2001
 From: Radek Polak <psonek2@seznam.cz>
 Date: Fri, 9 Apr 2010 09:18:02 +0200
-Subject: [PATCH 19/22] ar6000_delay.patch
+Subject: [PATCH 04/14] ar6000_delay.patch
 
 patch from https://docs.openmoko.org/trac/ticket/2327 - wifi is working good
 (100% until now) for me with this patch.
@@ -207,5 +207,5 @@ index 386d96e..90178d0 100644
        if (ret == A_OK)
                return 0;
 -- 
-1.7.0.4
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0005-Add-JBT6k74-hook-for-use-by-KMS.patch b/recipes/linux/linux-openmoko-2.6.32/0005-Add-JBT6k74-hook-for-use-by-KMS.patch
deleted file mode 100644 (file)
index 744004e..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-From 972c0a58e9e238c266adc77c88dcd8de6f123742 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sat, 21 Nov 2009 21:42:16 +0100
-Subject: [PATCH 5/9] Add JBT6k74 hook for use by KMS
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/video/backlight/jbt6k74.c |   18 ++++++++++++++++++
- 1 files changed, 18 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
-index 8450904..95ca4cf 100644
---- a/drivers/video/backlight/jbt6k74.c
-+++ b/drivers/video/backlight/jbt6k74.c
-@@ -698,6 +698,22 @@ static int jbt6k74_get_power(struct lcd_device *ld)
-       }
- }
-+/* This is utterly, totally horrible.  I'm REALLY sorry... */
-+struct jbt_info *jbt_global;
-+void jbt6k74_action(int val)
-+{
-+      if ( !jbt_global ) {
-+              printk(KERN_CRIT "JBT not initialised!!!\n");
-+              return;
-+      }
-+      if ( val == 0 ) {
-+              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_SLEEP);
-+      } else {
-+              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_NORMAL);
-+      }
-+}
-+EXPORT_SYMBOL_GPL(jbt6k74_action);
-+
- struct lcd_ops jbt6k74_lcd_ops = {
-       .set_power = jbt6k74_set_power,
-       .get_power = jbt6k74_get_power,
-@@ -728,6 +744,8 @@ static int __devinit jbt_probe(struct spi_device *spi)
-       if (!jbt)
-               return -ENOMEM;
-+      jbt_global = jbt;
-+
-       jbt->spi = spi;
-       jbt->lcd_dev = lcd_device_register("jbt6k74-lcd", &spi->dev, jbt,
--- 
-1.6.6.1
-
@@ -1,7 +1,7 @@
-From a9d6c115089a0a34fbca89c539de50148a2cf34e Mon Sep 17 00:00:00 2001
+From f143dfe95e9b48aebc8fad111086a25c915bf479 Mon Sep 17 00:00:00 2001
 From: Radek Polak <psonek2@seznam.cz>
 Date: Fri, 9 Apr 2010 09:22:23 +0200
-Subject: [PATCH 20/22] save_regs.patch
+Subject: [PATCH 05/14] save_regs.patch
 
 With this patch wifi can survive suspend.
 ---
@@ -136,5 +136,5 @@ index e4898e9..b49d674 100644
  extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
  extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
 -- 
-1.7.0.4
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0006-glamo-drm-use-dev_set_drvdata-instead-of-setting-dri.patch b/recipes/linux/linux-openmoko-2.6.32/0006-glamo-drm-use-dev_set_drvdata-instead-of-setting-dri.patch
deleted file mode 100644 (file)
index f685608..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From be2d944c2b29b19b4cee7c64b00bd75cf7209724 Mon Sep 17 00:00:00 2001
-From: Martin Jansa <Martin.Jansa@gmail.com>
-Date: Tue, 22 Dec 2009 16:11:27 +0100
-Subject: [PATCH 6/9] glamo-drm: use dev_set_drvdata instead of setting driver_data directly
-
-* driver_data is private since 2.6.32
-  http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b4028437876866aba4747a655ede00f892089e14
-
-Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
----
- drivers/mfd/glamo/glamo-drm-drv.c |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
-index f30097e..1907a47 100644
---- a/drivers/mfd/glamo/glamo-drm-drv.c
-+++ b/drivers/mfd/glamo/glamo-drm-drv.c
-@@ -347,7 +347,7 @@ out_release_regs:
-       release_mem_region(gdrm->reg->start, resource_size(gdrm->reg));
- out_free:
-       kfree(gdrm);
--      pdev->dev.driver_data = NULL;
-+      dev_set_drvdata(&pdev->dev, NULL);
-       return rc;
- }
--- 
-1.6.6.1
-
@@ -1,12 +1,12 @@
-From f80beb203e503696cd2e74e194176b8d6f49b27b Mon Sep 17 00:00:00 2001
+From 7e4a1fee4f08ef7ccedd4706b4890afc71f37dc4 Mon Sep 17 00:00:00 2001
 From: Martin Jansa <Martin.Jansa@gmail.com>
 Date: Mon, 17 May 2010 12:41:06 +0200
-Subject: [PATCH] gta02 defconfigs, enable LEDS_S3C24XX and dummy battery driver
+Subject: [PATCH 06/14] gta02 defconfigs, enable LEDS_S3C24XX and dummy battery driver
 
 ---
  arch/arm/configs/gta02_defconfig     |    2 +-
- arch/arm/configs/gta02_drm_defconfig |    4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
+ arch/arm/configs/gta02_drm_defconfig |   10 +++++-----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
 
 diff --git a/arch/arm/configs/gta02_defconfig b/arch/arm/configs/gta02_defconfig
 index 73d26ba..55832ac 100644
@@ -22,9 +22,19 @@ index 73d26ba..55832ac 100644
  CONFIG_LEDS_GPIO=y
  CONFIG_LEDS_GPIO_PLATFORM=y
 diff --git a/arch/arm/configs/gta02_drm_defconfig b/arch/arm/configs/gta02_drm_defconfig
-index 05aa130..4d85e9a 100644
+index 05aa130..62c1ee4 100644
 --- a/arch/arm/configs/gta02_drm_defconfig
 +++ b/arch/arm/configs/gta02_drm_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.32.11
+-# Sun Apr 11 14:20:07 2010
++# Linux kernel version: 2.6.32.13
++# Mon May 17 14:13:35 2010
+ #
+ CONFIG_ARM=y
+ CONFIG_HAVE_PWM=y
 @@ -1233,7 +1233,7 @@ CONFIG_POWER_SUPPLY=y
  CONFIG_CHARGER_PCF50633=y
  CONFIG_BATTERY_BQ27000_HDQ=y
@@ -34,7 +44,7 @@ index 05aa130..4d85e9a 100644
  # CONFIG_HWMON is not set
  # CONFIG_THERMAL is not set
  CONFIG_WATCHDOG=y
-@@ -1681,7 +1681,7 @@ CONFIG_LEDS_CLASS=y
+@@ -1681,14 +1681,14 @@ CONFIG_LEDS_CLASS=y
  #
  # LED drivers
  #
@@ -43,6 +53,14 @@ index 05aa130..4d85e9a 100644
  # CONFIG_LEDS_PCA9532 is not set
  CONFIG_LEDS_GPIO=y
  CONFIG_LEDS_GPIO_PLATFORM=y
+ # CONFIG_LEDS_LP3944 is not set
+ # CONFIG_LEDS_PCA955X is not set
+ # CONFIG_LEDS_DAC124S085 is not set
+-# CONFIG_LEDS_PWM is not set
++CONFIG_LEDS_PWM=y
+ # CONFIG_LEDS_BD2802 is not set
+ #
 -- 
 1.7.1
 
@@ -1,7 +1,7 @@
-From 660570997a5c998aaecc94798b6ea8d60b0da053 Mon Sep 17 00:00:00 2001
+From d05d2c82e2ec110720c5c714ad18d60ef676aa1d Mon Sep 17 00:00:00 2001
 From: Thomas White <taw@bitwiz.org.uk>
 Date: Tue, 20 Oct 2009 15:52:30 +0200
-Subject: [PATCH 2/9] DRM for platform devices
+Subject: [PATCH 07/14] DRM for platform devices
 
 This modifies the DRM core in a small number of places to allow platform
 devices to be used for direct rendering, alongside PCI devices.
@@ -454,5 +454,5 @@ index 7ad3faa..1d9a229 100644
  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
                       struct drm_driver *driver);
 -- 
-1.6.6.1
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0007-glamo-drm-select-DRM_KMS_HELPER-for-crtc-functions.patch b/recipes/linux/linux-openmoko-2.6.32/0007-glamo-drm-select-DRM_KMS_HELPER-for-crtc-functions.patch
deleted file mode 100644 (file)
index 6875194..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-From 8bb128ce2474ef10c71ea681fa01e574c1ec3114 Mon Sep 17 00:00:00 2001
-From: Martin Jansa <Martin.Jansa@gmail.com>
-Date: Tue, 22 Dec 2009 16:32:57 +0100
-Subject: [PATCH 7/9] glamo-drm: select DRM_KMS_HELPER for crtc functions
-
----
- drivers/mfd/glamo/Kconfig |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/mfd/glamo/Kconfig b/drivers/mfd/glamo/Kconfig
-index 214c70e..a12ebf6 100644
---- a/drivers/mfd/glamo/Kconfig
-+++ b/drivers/mfd/glamo/Kconfig
-@@ -47,6 +47,7 @@ config MFD_GLAMO_DRM
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-+      select DRM_KMS_HELPER
-       help
-         Direct Rendering Manager interface for the S-Media Glamo chip, as
-         used in Openmoko FreeRunner (GTA02).
--- 
-1.6.6.1
-
@@ -1,30 +1,31 @@
-From eff70b6d14cc372944bbeda0dd0afe8599327f96 Mon Sep 17 00:00:00 2001
+From ee4092984dd817e3889a48c0b51c173e96c71913 Mon Sep 17 00:00:00 2001
 From: Thomas White <taw@bitwiz.org.uk>
 Date: Tue, 20 Oct 2009 16:14:55 +0200
-Subject: [PATCH 3/9] Glamo DRM and KMS driver
+Subject: [PATCH 08/14] Glamo DRM and KMS driver
 
-This adds the Glamo DRM and KMS driver, but not the modifications needed
+This adds the Glamo DRM and KMS driver, but note that modifications are needed
 elsewhere to support it.
 
 Signed-off-by: Thomas White <taw@bitwiz.org.uk>
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
 ---
- drivers/mfd/glamo/Kconfig             |   15 +
+ drivers/mfd/glamo/Kconfig             |   16 +
  drivers/mfd/glamo/Makefile            |    5 +-
- drivers/mfd/glamo/glamo-buffer.c      |  372 ++++++++++++++
- drivers/mfd/glamo/glamo-buffer.h      |   60 +++
- drivers/mfd/glamo/glamo-cmdq.c        |  528 ++++++++++++++++++++
+ drivers/mfd/glamo/glamo-buffer.c      |  37+++++++++++++
+ drivers/mfd/glamo/glamo-buffer.h      |   60 ++
+ drivers/mfd/glamo/glamo-cmdq.c        |  555 +++++++++++++++++++
  drivers/mfd/glamo/glamo-cmdq.h        |   49 ++
- drivers/mfd/glamo/glamo-display.c     |  869 +++++++++++++++++++++++++++++++++
- drivers/mfd/glamo/glamo-display.h     |   39 ++
- drivers/mfd/glamo/glamo-drm-drv.c     |  444 +++++++++++++++++
- drivers/mfd/glamo/glamo-drm-private.h |  156 ++++++
- drivers/mfd/glamo/glamo-fence.c       |  330 +++++++++++++
+ drivers/mfd/glamo/glamo-display.c     |  975 +++++++++++++++++++++++++++++++++
+ drivers/mfd/glamo/glamo-display.h     |   41 ++
+ drivers/mfd/glamo/glamo-drm-drv.c     |  423 ++++++++++++++
+ drivers/mfd/glamo/glamo-drm-private.h |  166 ++++++
+ drivers/mfd/glamo/glamo-fence.c       |  330 +++++++++++
  drivers/mfd/glamo/glamo-fence.h       |   34 ++
- drivers/mfd/glamo/glamo-kms-fb.c      |  540 ++++++++++++++++++++
+ drivers/mfd/glamo/glamo-kms-fb.c      |  493 +++++++++++++++++
  drivers/mfd/glamo/glamo-kms-fb.h      |   41 ++
  include/drm/Kbuild                    |    1 +
- include/drm/glamo_drm.h               |  153 ++++++
- 16 files changed, 3635 insertions(+), 1 deletions(-)
+ include/drm/glamo_drm.h               |  153 +++++
+ 16 files changed, 3715 insertions(+), 1 deletions(-)
  create mode 100644 drivers/mfd/glamo/glamo-buffer.c
  create mode 100644 drivers/mfd/glamo/glamo-buffer.h
  create mode 100644 drivers/mfd/glamo/glamo-cmdq.c
@@ -40,10 +41,10 @@ Signed-off-by: Thomas White <taw@bitwiz.org.uk>
  create mode 100644 include/drm/glamo_drm.h
 
 diff --git a/drivers/mfd/glamo/Kconfig b/drivers/mfd/glamo/Kconfig
-index 3aa4831..214c70e 100644
+index 3aa4831..a12ebf6 100644
 --- a/drivers/mfd/glamo/Kconfig
 +++ b/drivers/mfd/glamo/Kconfig
-@@ -40,3 +40,18 @@ config MFD_GLAMO_MCI
+@@ -40,3 +40,19 @@ config MFD_GLAMO_MCI
          neo1973 GTA-02.
  
          If unsure, say N.
@@ -54,6 +55,7 @@ index 3aa4831..214c70e 100644
 +      select FB_CFB_FILLRECT
 +      select FB_CFB_COPYAREA
 +      select FB_CFB_IMAGEBLIT
++      select DRM_KMS_HELPER
 +      help
 +        Direct Rendering Manager interface for the S-Media Glamo chip, as
 +        used in Openmoko FreeRunner (GTA02).
@@ -83,10 +85,10 @@ index ebf26f7..d5ebf8f 100644
 +                    glamo-display.o glamo-kms-fb.o glamo-fence.o
 diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c
 new file mode 100644
-index 0000000..45500d3
+index 0000000..82ea0c0
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-buffer.c
-@@ -0,0 +1,372 @@
+@@ -0,0 +1,374 @@
 +/*
 + * SMedia Glamo 336x/337x memory management
 + *
@@ -334,6 +336,8 @@ index 0000000..45500d3
 +      if (!gobj->mmap_offset) {
 +              ret = glamo_gem_create_mmap_offset(obj);
 +              if (ret) {
++                      printk(KERN_CRIT "Couldn't create mmap offset\n");
++                      drm_gem_object_unreference(obj);
 +                      mutex_unlock(&dev->struct_mutex);
 +                      return ret;
 +              }
@@ -527,10 +531,10 @@ index 0000000..41f18fd
 +#endif /* __GLAMO_BUFFER_H */
 diff --git a/drivers/mfd/glamo/glamo-cmdq.c b/drivers/mfd/glamo/glamo-cmdq.c
 new file mode 100644
-index 0000000..caedc27
+index 0000000..442963c
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-cmdq.c
-@@ -0,0 +1,528 @@
+@@ -0,0 +1,555 @@
 +/*
 + * SMedia Glamo 336x/337x command queue handling
 + *
@@ -592,6 +596,9 @@ index 0000000..caedc27
 +#include "glamo-regs.h"
 +
 +
++#define GLAMO_CMDQ_SIZE (128 * 1024)    /* 128k ring buffer */
++
++
 +static inline void reg_write(struct glamodrm_handle *gdrm,
 +                             u_int16_t reg, u_int16_t val)
 +{
@@ -969,7 +976,7 @@ index 0000000..caedc27
 +      burst[0] = 1<<15 | cbuf->base;
 +      burst[1] = data_size / 2;  /* -> 2-byte words */
 +      if ( burst[1] & 0x01 ) {
-+              printk(KERN_CRIT "Burst not aligned!\n");
++              printk(KERN_WARNING "[glamo-drm] Burst not aligned!\n");
 +              goto cleanup;
 +      }
 +
@@ -988,7 +995,7 @@ index 0000000..caedc27
 +}
 +
 +
-+int glamo_cmdq_init(struct glamodrm_handle *gdrm)
++int glamo_cmdq_setup(struct glamodrm_handle *gdrm)
 +{
 +      unsigned int i;
 +
@@ -1008,9 +1015,9 @@ index 0000000..caedc27
 +
 +      /* Set up command queue location */
 +      reg_write(gdrm, GLAMO_REG_CMDQ_BASE_ADDRL,
-+                                      GLAMO_OFFSET_CMDQ & 0xffff);
++                                      gdrm->cmdq_offs & 0xffff);
 +      reg_write(gdrm, GLAMO_REG_CMDQ_BASE_ADDRH,
-+                                      (GLAMO_OFFSET_CMDQ >> 16) & 0x7f);
++                                      (gdrm->cmdq_offs >> 16) & 0x7f);
 +
 +      /* Length of command queue in 1k blocks, minus one */
 +      reg_write(gdrm, GLAMO_REG_CMDQ_LEN, (GLAMO_CMDQ_SIZE >> 10)-1);
@@ -1025,6 +1032,30 @@ index 0000000..caedc27
 +}
 +
 +
++int glamo_cmdq_init(struct glamodrm_handle *gdrm)
++{
++      struct drm_gem_object *obj;
++      struct drm_glamo_gem_object *gobj;
++      int ret = 0;
++
++      obj = glamo_gem_object_alloc(dev, GLAMO_CMDQ_SIZE, 4);
++      if ( !obj ) {
++              printk(KERN_ERR "[glamo-drm] Failed to allocate CmdQ\n");
++              ret = -ENOMEM;
++              goto out;
++      }
++      gobj = fbo->driver_private;
++      gdrm->cmdq_offs = GLAMO_OFFSET_FB + gobj->block->start;
++      gdrm->cmdq_base = ioremap(gdrm->vram->start + offs, GLAMO_CMDQ_SIZE);
++
++      /* Set up registers */
++      glamo_cmdq_setup(gdrm);
++
++out:
++      return ret;
++}
++
++
 +int glamo_cmdq_shutdown(struct glamodrm_handle *gdrm)
 +{
 +      return 0;
@@ -1039,7 +1070,7 @@ index 0000000..caedc27
 +
 +void glamo_cmdq_resume(struct glamodrm_handle *gdrm)
 +{
-+      glamo_cmdq_init(gdrm);
++      glamo_cmdq_setup(gdrm);
 +}
 +
 +
@@ -1116,10 +1147,10 @@ index 0000000..510d195
 +#endif /* __GLAMO_CMDQ_H */
 diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
 new file mode 100644
-index 0000000..34a665a
+index 0000000..75ad734
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-display.c
-@@ -0,0 +1,869 @@
+@@ -0,0 +1,975 @@
 +/*
 + * SMedia Glamo 336x/337x display
 + *
@@ -1174,19 +1205,18 @@ index 0000000..34a665a
 + *
 + */
 +
-+#define DEBUG 1
-+
 +#include <drm/drmP.h>
 +#include <drm/glamo_drm.h>
 +#include <drm/drm_crtc_helper.h>
 +#include <drm/drm_crtc.h>
++#include <linux/glamofb.h>
++#include <linux/jbt6k74.h>
 +
 +#include "glamo-core.h"
 +#include "glamo-drm-private.h"
 +#include "glamo-regs.h"
 +#include "glamo-kms-fb.h"
 +#include "glamo-display.h"
-+#include <linux/glamofb.h>
 +
 +
 +#define GLAMO_LCD_WIDTH_MASK 0x03FF
@@ -1361,14 +1391,6 @@ index 0000000..34a665a
 +}
 +
 +
-+extern void jbt6k74_action(int val);
-+
-+/* Power on/off */
-+static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
-+{
-+}
-+
-+
 +static bool glamo_crtc_mode_fixup(struct drm_crtc *crtc,
 +                                  struct drm_display_mode *mode,
 +                                  struct drm_display_mode *adjusted_mode)
@@ -1397,6 +1419,12 @@ index 0000000..34a665a
 +      gcrtc = to_glamo_crtc(crtc);
 +      gdrm = gcrtc->gdrm;     /* Here it is! */
 +
++      if ( !gcrtc->pixel_clock_on ) {
++              printk(KERN_WARNING "[glamo-drm] Display is off - "
++                                  "enabling it before setting base.\n");
++              glamo_lcd_power(gdrm, 1);
++      }
++
 +      gfb = to_glamo_framebuffer(crtc->fb);
 +      obj = gfb->obj;
 +      gobj = obj->driver_private;
@@ -1423,63 +1451,176 @@ index 0000000..34a665a
 +      struct glamodrm_handle *gdrm;
 +      struct glamo_crtc *gcrtc;
 +      int retr_start, retr_end, disp_start, disp_end;
++      int rot;
 +
 +      /* Dig out our handle */
 +      gcrtc = to_glamo_crtc(crtc);
 +      gdrm = gcrtc->gdrm;     /* Here it is! */
 +
++      if ( !gcrtc->pixel_clock_on ) {
++              printk(KERN_WARNING "[glamo-drm] Display is off - "
++                                  "enabling it before setting mode.\n");
++              glamo_lcd_power(gdrm, 1);
++              msleep(500);
++      }
++
++      /* Rotate? */
++      if ( (mode->hdisplay == 640) && (mode->vdisplay == 480) ) {
++              rot = GLAMO_LCD_ROT_MODE_90;
++      } else if ( (mode->hdisplay == 480) && (mode->vdisplay == 640) ) {
++              rot = GLAMO_LCD_ROT_MODE_0;
++      } else if ( (mode->hdisplay == 320) && (mode->vdisplay == 240) ) {
++              rot = GLAMO_LCD_ROT_MODE_90;
++      } else if ( (mode->hdisplay == 240) && (mode->vdisplay == 320) ) {
++              rot = GLAMO_LCD_ROT_MODE_0;
++      } else {
++              printk(KERN_WARNING "[glamo-drm] Couldn't choose rotation.\n");
++              rot = GLAMO_LCD_ROT_MODE_0;
++      }
++
 +      glamo_lcd_cmd_mode(gdrm, 1);
 +
-+      glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD, mode->clock);
-+      gdrm->saved_clock = mode->clock;
++      /* Set dimensions */
++      if ( rot == GLAMO_LCD_ROT_MODE_0 ) {
++
++              glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
++                                   mode->clock);
++
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
++                                   GLAMO_LCD_WIDTH_MASK, mode->hdisplay);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
++                                   GLAMO_LCD_HEIGHT_MASK, mode->vdisplay);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
++                                   GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
++
++              /* Set rotation */
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
++                                   GLAMO_LCD_ROT_MODE_MASK, rot);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_MODE1,
++                                   GLAMO_LCD_MODE1_ROTATE_EN,
++                                   (rot != GLAMO_LCD_ROT_MODE_0) ?
++                                     GLAMO_LCD_MODE1_ROTATE_EN : 0);
++
++              /* Convert "X modeline timings" into "Glamo timings" */
++              retr_start = 0;
++              retr_end = retr_start + mode->hsync_end - mode->hsync_start;
++              disp_start = mode->htotal - mode->hsync_start;
++              disp_end = disp_start + mode->hdisplay;
++
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
++                                   GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
++                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
++                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
++                                   GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
++                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
++
++              /* The same in the vertical direction */
++              retr_start = 0;
++              retr_end = retr_start + mode->vsync_end - mode->vsync_start;
++              disp_start = mode->vtotal - mode->vsync_start;
++              disp_end = disp_start + mode->vdisplay;
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
++                                   GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
++                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
++                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
++                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
++                                   disp_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
++                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
++
++      } else {
++
++              glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
++                                   mode->clock/2);
++
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
++                                   GLAMO_LCD_WIDTH_MASK, mode->vdisplay);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
++                                   GLAMO_LCD_HEIGHT_MASK, mode->hdisplay);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
++                                   GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
++
++              /* Set rotation */
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
++                                   GLAMO_LCD_ROT_MODE_MASK, rot);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_MODE1,
++                                   GLAMO_LCD_MODE1_ROTATE_EN,
++                                   (rot != GLAMO_LCD_ROT_MODE_0) ?
++                                     GLAMO_LCD_MODE1_ROTATE_EN : 0);
++
++              /* Apply "vertical" numbers to the horizontal registers */
++              retr_start = 0;
++              retr_end = retr_start + mode->vsync_end - mode->vsync_start;
++              disp_start = mode->vtotal - mode->vsync_start;
++              disp_end = disp_start + mode->vdisplay;
++
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
++                                   GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
++                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
++                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
++                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
++                                   disp_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
++                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
++
++              /* Apply "horizontal" numbers to the vertical registers */
++              retr_start = 0;
++              retr_end = retr_start + mode->hsync_end - mode->hsync_start;
++              disp_start = mode->htotal - mode->hsync_start;
++              disp_end = disp_start + mode->hdisplay;
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
++                                   GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
++                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
++                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
++                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
++                                   disp_start);
++              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
++                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
++
++      }
 +
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
-+                           GLAMO_LCD_WIDTH_MASK, mode->hdisplay);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
-+                           GLAMO_LCD_HEIGHT_MASK, mode->vdisplay);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
-+                           GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
-+
-+      /* Convert "X modeline timings" into "Glamo timings" */
-+      retr_start = 0;
-+      retr_end = retr_start + mode->hsync_end - mode->hsync_start;
-+      disp_start = mode->htotal - mode->hsync_start;
-+      disp_end = disp_start + mode->hdisplay;
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
-+                           GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
-+                           GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
-+                           GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
-+                           GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
-+                           GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
-+
-+      /* The same in the vertical direction */
-+      retr_start = 0;
-+      retr_end = retr_start + mode->vsync_end - mode->vsync_start;
-+      disp_start = mode->vtotal - mode->vsync_start;
-+      disp_end = disp_start + mode->vdisplay;
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
-+                           GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
-+                           GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
-+                           GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
-+                           GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
-+                           GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
++      gdrm->saved_clock = mode->clock;
 +
 +      glamo_lcd_cmd_mode(gdrm, 0);
 +
 +      glamo_crtc_mode_set_base(crtc, 0, 0, old_fb);
 +
++      if ( mode->hdisplay == 240 ) {
++              jbt6k74_finish_resolutionchange(JBT_RESOLUTION_QVGA);
++      } else {
++              jbt6k74_finish_resolutionchange(JBT_RESOLUTION_VGA);
++      }
++
++      gcrtc->current_mode = *mode;
++      gcrtc->current_mode_set = 1;
++      gcrtc->current_fb = old_fb;
++
 +      return 0;
 +}
 +
 +
++/* This is not the right place to switch power on/off, because the helper
++ * stuff ends up calling this before/after setting the mode.  We can't
++ * set modes with the display off (although backlight off would be OK) */
++static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
++{
++      /* do nothing */
++}
++
++
 +static void glamo_crtc_prepare(struct drm_crtc *crtc)
 +{
 +}
@@ -1537,43 +1678,53 @@ index 0000000..34a665a
 +
 +static int glamo_connector_get_modes(struct drm_connector *connector)
 +{
-+      struct drm_display_mode *mode;
 +      struct glamo_fb_platform_data *fb_info;
 +      struct glamo_output *goutput = to_glamo_output(connector);
 +      struct glamodrm_handle *gdrm = goutput->gdrm;
++      int i;
 +
 +      /* Dig out the record which will tell us about the hardware */
 +      fb_info = gdrm->glamo_core->pdata->fb_data;
 +
-+      mode = drm_mode_create(connector->dev);
-+      if (!mode)
-+              return 0;
-+      /* Fill in 'mode' here */
-+      mode->type = DRM_MODE_TYPE_DEFAULT | DRM_MODE_TYPE_PREFERRED;
++      for ( i=0; i<fb_info->num_modes; i++ ) {
++
++              struct drm_display_mode *mode;
++
++              mode = drm_mode_create(connector->dev);
++              if ( !mode ) continue;
++
++              mode->type = DRM_MODE_TYPE_DEFAULT | DRM_MODE_TYPE_PREFERRED;
++
++              /* Convert framebuffer timings into KMS timings.
++               * First:  ps -> kHz */
++              mode->clock = 1000000000UL / fb_info->modes[i].pixclock;
++              mode->clock *= 1000; /* then kHz -> Hz */
++              mode->hdisplay = fb_info->modes[i].xres;
++              mode->hsync_start = fb_info->modes[i].right_margin
++                                   + mode->hdisplay;
++              mode->hsync_end = mode->hsync_start
++                                   + fb_info->modes[i].hsync_len;
++              mode->htotal = mode->hsync_end + fb_info->modes[i].left_margin;
++              mode->hskew = 0;
 +
-+      /* Convert framebuffer timings into KMS timings */
-+      mode->clock = 1000000000UL / fb_info->modes[0].pixclock; /* ps -> kHz */
-+      mode->clock *= 1000; /* kHz -> Hz */
-+      mode->hdisplay = fb_info->modes[0].xres;
-+      mode->hsync_start = fb_info->modes[0].right_margin + mode->hdisplay;
-+      mode->hsync_end = mode->hsync_start + fb_info->modes[0].hsync_len;
-+      mode->htotal = mode->hsync_end + fb_info->modes[0].left_margin;
-+      mode->hskew = 0;
++              mode->vdisplay = fb_info->modes[i].yres;
++              mode->vsync_start = fb_info->modes[i].lower_margin
++                                   + mode->vdisplay;
++              mode->vsync_end = mode->vsync_start
++                                 + fb_info->modes[i].vsync_len;
++              mode->vtotal = mode->vsync_end + fb_info->modes[i].upper_margin;
++              mode->vscan = 0;
 +
-+      mode->vdisplay = fb_info->modes[0].yres;
-+      mode->vsync_start = fb_info->modes[0].lower_margin + mode->vdisplay;
-+      mode->vsync_end = mode->vsync_start + fb_info->modes[0].vsync_len;
-+      mode->vtotal = mode->vsync_end + fb_info->modes[0].upper_margin;
-+      mode->vscan = 0;
++              /* Physical size */
++              mode->width_mm = fb_info->width;
++              mode->height_mm = fb_info->height;
 +
-+      /* Physical size */
-+      mode->width_mm = fb_info->width;
-+      mode->height_mm = fb_info->height;
++              drm_mode_set_name(mode);
++              drm_mode_probed_add(connector, mode);
 +
-+      drm_mode_set_name(mode);
-+      drm_mode_probed_add(connector, mode);
++      }
 +
-+      return 1;       /* one mode, for now */
++      return fb_info->num_modes;
 +}
 +
 +
@@ -1612,6 +1763,7 @@ index 0000000..34a665a
 +                                 struct drm_display_mode *mode,
 +                                 struct drm_display_mode *adjusted_mode)
 +{
++      if ( mode->clock == 0 ) return false;
 +      return true;
 +}
 +
@@ -1835,8 +1987,8 @@ index 0000000..34a665a
 +      drm_mode_config_init(dev);
 +
 +      dev->mode_config.min_width = 240;
-+      dev->mode_config.min_height = 320;
-+      dev->mode_config.max_width = 480;
++      dev->mode_config.min_height = 240;
++      dev->mode_config.max_width = 640;
 +      dev->mode_config.max_height = 640;
 +
 +      dev->mode_config.funcs = (void *)&glamo_mode_funcs;
@@ -1847,6 +1999,8 @@ index 0000000..34a665a
 +                         + sizeof(struct drm_connector *), GFP_KERNEL);
 +      if (glamo_crtc == NULL) return 1;
 +      glamo_crtc->gdrm = gdrm;
++      gdrm->crtc = (struct drm_crtc *)glamo_crtc;
++      glamo_crtc->pixel_clock_on = 1;
 +      glamo_crtc->blank_mode = DRM_MODE_DPMS_OFF;
 +      drm_crtc_init(dev, &glamo_crtc->base, &glamo_crtc_funcs);
 +      drm_crtc_helper_add(&glamo_crtc->base, &glamo_crtc_helper_funcs);
@@ -1864,7 +2018,7 @@ index 0000000..34a665a
 +
 +      /* Initialise the connector */
 +      drm_connector_init(dev, connector, &glamo_connector_funcs,
-+                         DRM_MODE_CONNECTOR_Unknown);
++                         DRM_MODE_CONNECTOR_LVDS);
 +      drm_sysfs_connector_add(connector);
 +      connector->interlace_allowed = 0;
 +      connector->doublescan_allowed = 0;
@@ -1928,73 +2082,56 @@ index 0000000..34a665a
 +}
 +
 +
++void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
++{
++      struct drm_crtc *crtc = gdrm->crtc;
++      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
++
++      if ( mode ) {
++              glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
++              gcrtc->pixel_clock_on = 1;
++              jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
++              if ( gcrtc->current_mode_set ) {
++                      glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
++                                          &gcrtc->current_mode, 0, 0,
++                                          gcrtc->current_fb);
++              }
++      } else {
++              jbt6k74_setpower(JBT_POWER_MODE_OFF);
++              glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
++              gcrtc->pixel_clock_on = 0;
++      }
++}
++
++
 +void glamo_display_suspend(struct glamodrm_handle *gdrm)
 +{
-+      gdrm->saved_width = reg_read_lcd(gdrm, GLAMO_REG_LCD_WIDTH);
-+      gdrm->saved_height = reg_read_lcd(gdrm, GLAMO_REG_LCD_HEIGHT);
-+      gdrm->saved_pitch = reg_read_lcd(gdrm, GLAMO_REG_LCD_PITCH);
-+      gdrm->saved_htotal = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL);
-+      gdrm->saved_hrtrst = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START);
-+      gdrm->saved_hrtren = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END);
-+      gdrm->saved_hdspst = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START);
-+      gdrm->saved_hdspen = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END);
-+      gdrm->saved_vtotal = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL);
-+      gdrm->saved_vrtrst = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START);
-+      gdrm->saved_vrtren = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END);
-+      gdrm->saved_vdspst = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START);
-+      gdrm->saved_vdspen = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END);
++      /* do nothing */
 +}
 +
 +
 +void glamo_display_resume(struct glamodrm_handle *gdrm)
 +{
++      struct drm_crtc *crtc = gdrm->crtc;
++      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
++
 +      glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
 +      glamo_engine_reset(gdrm->glamo_core, GLAMO_ENGINE_LCD);
 +      glamo_run_lcd_script(gdrm, lcd_init_script,
 +                                 ARRAY_SIZE(lcd_init_script));
 +
-+      /* Restore timings */
-+      glamo_lcd_cmd_mode(gdrm, 1);
-+      glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
-+                           gdrm->saved_clock);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH, GLAMO_LCD_WIDTH_MASK,
-+                           gdrm->saved_width);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT, GLAMO_LCD_HEIGHT_MASK,
-+                           gdrm->saved_height);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH, GLAMO_LCD_PITCH_MASK,
-+                           gdrm->saved_pitch);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
-+                           GLAMO_LCD_HV_TOTAL_MASK, gdrm->saved_htotal);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
-+                           GLAMO_LCD_HV_RETR_START_MASK, gdrm->saved_hrtrst);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
-+                           GLAMO_LCD_HV_RETR_END_MASK, gdrm->saved_hrtren);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
-+                           GLAMO_LCD_HV_RETR_DISP_START_MASK,
-+                           gdrm->saved_hdspst);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
-+                           GLAMO_LCD_HV_RETR_DISP_END_MASK,
-+                           gdrm->saved_hdspen);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
-+                           GLAMO_LCD_HV_TOTAL_MASK, gdrm->saved_vtotal);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
-+                           GLAMO_LCD_HV_RETR_START_MASK, gdrm->saved_vrtrst);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
-+                           GLAMO_LCD_HV_RETR_END_MASK, gdrm->saved_vrtren);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
-+                           GLAMO_LCD_HV_RETR_DISP_START_MASK,
-+                           gdrm->saved_vdspst);
-+      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
-+                           GLAMO_LCD_HV_RETR_DISP_END_MASK,
-+                           gdrm->saved_vdspen);
-+      glamo_lcd_cmd_mode(gdrm, 0);
++      if ( gcrtc->current_mode_set ) {
++              glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
++                                  &gcrtc->current_mode, 0, 0,
++                                  gcrtc->current_fb);
++      }
 +}
 diff --git a/drivers/mfd/glamo/glamo-display.h b/drivers/mfd/glamo/glamo-display.h
 new file mode 100644
-index 0000000..d6f21bc
+index 0000000..728bba5
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-display.h
-@@ -0,0 +1,39 @@
+@@ -0,0 +1,41 @@
 +/* Smedia Glamo 336x/337x Display
 + *
 + * Copyright (c) 2008-2009 Thomas White <taw@bitwiz.org.uk>
@@ -2033,13 +2170,15 @@ index 0000000..d6f21bc
 +extern void glamo_display_suspend(struct glamodrm_handle *gdrm);
 +extern void glamo_display_resume(struct glamodrm_handle *gdrm);
 +
++extern void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode);
++
 +#endif /* __GLAMO_DISPLAY_H */
 diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
 new file mode 100644
-index 0000000..f30097e
+index 0000000..774eaff
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-drm-drv.c
-@@ -0,0 +1,444 @@
+@@ -0,0 +1,423 @@
 +/* Smedia Glamo 336x/337x Graphics Driver
 + *
 + * Copyright (C) 2009 Openmoko, Inc. Jorge Luis Zapata <turran@openmoko.com>
@@ -2195,6 +2334,8 @@ index 0000000..f30097e
 +
 +static struct vm_operations_struct glamodrm_gem_vm_ops = {
 +      .fault = glamodrm_gem_fault,
++      .open = drm_gem_vm_open,
++      .close = drm_gem_vm_close,
 +};
 +
 +static struct drm_driver glamodrm_drm_driver = {
@@ -2271,29 +2412,6 @@ index 0000000..f30097e
 +              goto out_release_regs;
 +      }
 +
-+      /* Find the command queue itself */
-+      gdrm->cmdq = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+                                                "glamo-command-queue");
-+      if ( !gdrm->cmdq ) {
-+              dev_err(&pdev->dev, "Unable to find command queue.\n");
-+              rc = -ENOENT;
-+              goto out_unmap_regs;
-+      }
-+      gdrm->cmdq = request_mem_region(gdrm->cmdq->start,
-+                                      resource_size(gdrm->cmdq), pdev->name);
-+      if ( !gdrm->cmdq ) {
-+              dev_err(&pdev->dev, "failed to request command queue region\n");
-+              rc = -ENOENT;
-+              goto out_unmap_regs;
-+      }
-+      gdrm->cmdq_base = ioremap_nocache(gdrm->cmdq->start,
-+                                        resource_size(gdrm->cmdq));
-+      if ( !gdrm->cmdq_base ) {
-+              dev_err(&pdev->dev, "failed to ioremap() command queue\n");
-+              rc = -ENOENT;
-+              goto out_release_cmdq;
-+      }
-+
 +      /* Find the VRAM */
 +      gdrm->vram = platform_get_resource_byname(pdev, IORESOURCE_MEM,
 +                                                "glamo-fb-mem");
@@ -2389,7 +2507,7 @@ index 0000000..f30097e
 +      release_mem_region(gdrm->reg->start, resource_size(gdrm->reg));
 +out_free:
 +      kfree(gdrm);
-+      pdev->dev.driver_data = NULL;
++      dev_set_drvdata(&pdev->dev, NULL);
 +      return rc;
 +}
 +
@@ -2486,10 +2604,10 @@ index 0000000..f30097e
 +MODULE_LICENSE("GPL");
 diff --git a/drivers/mfd/glamo/glamo-drm-private.h b/drivers/mfd/glamo/glamo-drm-private.h
 new file mode 100644
-index 0000000..7949a2e
+index 0000000..75f2757
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-drm-private.h
-@@ -0,0 +1,156 @@
+@@ -0,0 +1,166 @@
 +/* Smedia Glamo 336x/337x DRM private bits
 + *
 + * Copyright (C) 2008-2009 Thomas White <taw@bitwiz.org.uk>
@@ -2553,8 +2671,8 @@ index 0000000..7949a2e
 +      struct resource *vram;
 +
 +      /* Command queue region */
-+      struct resource *cmdq;
 +      char __iomem *cmdq_base;
++      unsigned long cmdq_offs;
 +
 +      /* LCD controller registers */
 +      struct resource *lcd_regs;
@@ -2598,6 +2716,9 @@ index 0000000..7949a2e
 +
 +      /* A scratch block */
 +      struct drm_mm_node *scratch;
++
++      /* We only have one */
++      struct drm_crtc *crtc;
 +};
 +
 +
@@ -2610,11 +2731,18 @@ index 0000000..7949a2e
 +
 +
 +struct glamo_crtc {
++
 +      struct drm_crtc base;
 +      struct glamodrm_handle *gdrm;
 +      /* a mode_set for fbdev users on this crtc */
 +      struct drm_mode_set mode_set;
 +      int blank_mode;
++
++      int pixel_clock_on;
++
++      int current_mode_set;
++      struct drm_display_mode current_mode;
++      struct drm_framebuffer *current_fb;
 +};
 +
 +
@@ -3024,10 +3152,10 @@ index 0000000..deda995
 +#endif /* __GLAMO_FENCE_H */
 diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c
 new file mode 100644
-index 0000000..61cd605
+index 0000000..d76dd24
 --- /dev/null
 +++ b/drivers/mfd/glamo/glamo-kms-fb.c
-@@ -0,0 +1,540 @@
+@@ -0,0 +1,493 @@
 +/*
 + * SMedia Glamo 336x/337x KMS Framebuffer
 + *
@@ -3207,37 +3335,35 @@ index 0000000..61cd605
 +      struct drm_device *dev = par->dev;
 +      struct fb_var_screeninfo *var = &info->var;
 +      int i;
++      struct drm_crtc *crtc;
++      int ret;
 +
 +      DRM_DEBUG("%d %d\n", var->xres, var->pixclock);
 +
 +      if (var->pixclock != -1) {
++              DRM_ERROR("Warning: userspace gave me a pixel clock value (%i)"
++                        "- I'm ignoring it.\n", var->pixclock);
++      }
 +
-+              DRM_ERROR("PIXEL CLOCK SET\n");
-+              return -EINVAL;
-+      } else {
-+              struct drm_crtc *crtc;
-+              int ret;
-+
-+              list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-+                      struct glamo_crtc *glamo_crtc = to_glamo_crtc(crtc);
++      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
++              struct glamo_crtc *glamo_crtc = to_glamo_crtc(crtc);
 +
-+                      for (i = 0; i < par->crtc_count; i++)
-+                              if (crtc->base.id == par->crtc_ids[i])
-+                                      break;
++              for (i = 0; i < par->crtc_count; i++)
++                      if (crtc->base.id == par->crtc_ids[i])
++                              break;
 +
-+                      if (i == par->crtc_count)
-+                              continue;
++              if (i == par->crtc_count)
++                      continue;
 +
-+                      if (crtc->fb == glamo_crtc->mode_set.fb) {
-+                              mutex_lock(&dev->mode_config.mutex);
-+                              ret = crtc->funcs->set_config(&glamo_crtc->mode_set);
-+                              mutex_unlock(&dev->mode_config.mutex);
-+                              if (ret)
-+                                      return ret;
-+                      }
++              if (crtc->fb == glamo_crtc->mode_set.fb) {
++                      mutex_lock(&dev->mode_config.mutex);
++                      ret = crtc->funcs->set_config(&glamo_crtc->mode_set);
++                      mutex_unlock(&dev->mode_config.mutex);
++                      if (ret)
++                              return ret;
 +              }
-+              return 0;
 +      }
++      return 0;
 +}
 +
 +static int glamofb_pan_display(struct fb_var_screeninfo *var,
@@ -3283,64 +3409,20 @@ index 0000000..61cd605
 +{
 +      struct glamofb_par *par = info->par;
 +      struct drm_device *dev = par->dev;
-+      struct drm_crtc *crtc;
-+      struct drm_encoder *encoder;
-+      int i;
-+
-+      /*
-+       * For each CRTC in this fb, find all associated encoders
-+       * and turn them off, then turn off the CRTC.
-+       */
-+      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-+              struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
-+
-+              for (i = 0; i < par->crtc_count; i++)
-+                      if (crtc->base.id == par->crtc_ids[i])
-+                              break;
++      struct glamodrm_handle *gdrm = dev->dev_private;
 +
-+              crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
++      gdrm = dev->dev_private;
 +
-+              /* Found a CRTC on this fb, now find encoders */
-+              list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-+                      if (encoder->crtc == crtc) {
-+                              struct drm_encoder_helper_funcs *encoder_funcs;
-+                              encoder_funcs = encoder->helper_private;
-+                              encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
-+                      }
-+              }
-+      }
++      glamo_lcd_power(gdrm, 1);
 +}
 +
 +static void glamofb_off(struct fb_info *info, int dpms_mode)
 +{
 +      struct glamofb_par *par = info->par;
 +      struct drm_device *dev = par->dev;
-+      struct drm_crtc *crtc;
-+      struct drm_encoder *encoder;
-+      int i;
-+
-+      /*
-+       * For each CRTC in this fb, find all associated encoders
-+       * and turn them off, then turn off the CRTC.
-+       */
-+      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-+              struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
-+
-+              for (i = 0; i < par->crtc_count; i++)
-+                      if (crtc->base.id == par->crtc_ids[i])
-+                              break;
++      struct glamodrm_handle *gdrm = dev->dev_private;
 +
-+              /* Found a CRTC on this fb, now find encoders */
-+              list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-+                      if (encoder->crtc == crtc) {
-+                              struct drm_encoder_helper_funcs *encoder_funcs;
-+                              encoder_funcs = encoder->helper_private;
-+                              encoder_funcs->dpms(encoder, dpms_mode);
-+                      }
-+              }
-+              if (dpms_mode == DRM_MODE_DPMS_OFF)
-+                      crtc_funcs->dpms(crtc, dpms_mode);
-+      }
++      glamo_lcd_power(gdrm, 0);
 +}
 +
 +static int glamofb_blank(int blank, struct fb_info *info)
@@ -3459,9 +3541,6 @@ index 0000000..61cd605
 +      info->fbops = &glamofb_ops;
 +
 +      info->fix.line_length = fb->pitch;
-+      info->fix.smem_start = dev->mode_config.fb_base
-+                              + (unsigned long) gdrm->vram->start;
-+      info->fix.smem_len = size;
 +
 +      info->flags = FBINFO_DEFAULT;
 +
@@ -3473,6 +3552,8 @@ index 0000000..61cd605
 +              ret = -ENOSPC;
 +              goto out_unref;
 +      }
++      info->fix.smem_start = (unsigned long)gdrm->vram->start + offs;
++      info->fix.smem_len = size;
 +      info->screen_size = size;
 +
 +      info->pseudo_palette = fb->pseudo_palette;
@@ -3784,5 +3865,5 @@ index 0000000..4c194dc
 +
 +#endif
 -- 
-1.6.6.1
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0009-A-couple-of-GEM-refcounting-fixes.patch b/recipes/linux/linux-openmoko-2.6.32/0009-A-couple-of-GEM-refcounting-fixes.patch
deleted file mode 100644 (file)
index 7fb2fa8..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From 75e660e406cd4941f253ddbdeaa45f59d107a014 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sun, 7 Feb 2010 13:27:20 +0100
-Subject: [PATCH 9/9] A couple of GEM refcounting fixes
-
-This allows GEM objects to be freed properly, which wasn't working before.
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-buffer.c  |    2 ++
- drivers/mfd/glamo/glamo-drm-drv.c |    2 ++
- 2 files changed, 4 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c
-index 45500d3..82ea0c0 100644
---- a/drivers/mfd/glamo/glamo-buffer.c
-+++ b/drivers/mfd/glamo/glamo-buffer.c
-@@ -245,6 +245,8 @@ int glamo_ioctl_gem_mmap(struct drm_device *dev, void *data,
-       if (!gobj->mmap_offset) {
-               ret = glamo_gem_create_mmap_offset(obj);
-               if (ret) {
-+                      printk(KERN_CRIT "Couldn't create mmap offset\n");
-+                      drm_gem_object_unreference(obj);
-                       mutex_unlock(&dev->struct_mutex);
-                       return ret;
-               }
-diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
-index 1907a47..e7220d5 100644
---- a/drivers/mfd/glamo/glamo-drm-drv.c
-+++ b/drivers/mfd/glamo/glamo-drm-drv.c
-@@ -153,6 +153,8 @@ static int glamodrm_unload(struct drm_device *dev)
- static struct vm_operations_struct glamodrm_gem_vm_ops = {
-       .fault = glamodrm_gem_fault,
-+      .open = drm_gem_vm_open,
-+      .close = drm_gem_vm_close,
- };
- static struct drm_driver glamodrm_drm_driver = {
--- 
-1.6.6.1
-
@@ -1,24 +1,24 @@
-From eb0614d6a8a879bd3ac69050b3f5b012ef562b9e Mon Sep 17 00:00:00 2001
+From 8cdc10f17ecd42c9f71f7f4a657d979ab20f9e26 Mon Sep 17 00:00:00 2001
 From: Thomas White <taw@bitwiz.org.uk>
 Date: Tue, 17 Nov 2009 23:45:29 +0100
-Subject: [PATCH 4/9] Work on Glamo-core for DRM
+Subject: [PATCH 09/14] Work on Glamo-core for DRM
 
 This adds modifications to the core of the Glamo driver to expose functionality
 to support DRM and KMS.
 
 Signed-off-by: Thomas White <taw@bitwiz.org.uk>
 ---
- drivers/mfd/glamo/glamo-core.c |   33 +++++++++++++++++++++++++++------
- drivers/mfd/glamo/glamo-core.h |   35 +++++++++++++++++++++++++----------
+ drivers/mfd/glamo/glamo-core.c |   27 +++++++++++++++++++++------
+ drivers/mfd/glamo/glamo-core.h |   3++++++++++++++++++++++----------
  drivers/mfd/glamo/glamo-regs.h |   24 ++++++++++++++++++++++++
  include/linux/mfd/glamo.h      |    7 ++-----
- 4 files changed, 78 insertions(+), 21 deletions(-)
+ 4 files changed, 69 insertions(+), 21 deletions(-)
 
 diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
-index 82a906a..a614d44 100644
+index 82a906a..74da668 100644
 --- a/drivers/mfd/glamo/glamo-core.c
 +++ b/drivers/mfd/glamo/glamo-core.c
-@@ -221,10 +221,31 @@ static struct resource glamo_fb_resources[] = {
+@@ -221,10 +221,25 @@ static struct resource glamo_fb_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .name   = "glamo-fb-mem",
@@ -34,12 +34,6 @@ index 82a906a..a614d44 100644
 +              .end    = GLAMO_REGOFS_RISC - 1,
 +              .flags  = IORESOURCE_MEM,
 +      }, {
-+              .name   = "glamo-command-queue",
-+              .start  = GLAMO_MEM_BASE + GLAMO_OFFSET_CMDQ,
-+              .end    = GLAMO_MEM_BASE + GLAMO_OFFSET_CMDQ +
-+                        GLAMO_CMDQ_SIZE - 1,
-+              .flags  = IORESOURCE_MEM,
-+      }, {
 +              .name   = "glamo-2d-regs",
 +              .start  = GLAMO_REGOFS_2D,
 +              .end    = GLAMO_REGOFS_3D- 1,
@@ -53,7 +47,7 @@ index 82a906a..a614d44 100644
  };
  
  static struct resource glamo_mmc_resources[] = {
-@@ -235,9 +256,9 @@ static struct resource glamo_mmc_resources[] = {
+@@ -235,9 +250,9 @@ static struct resource glamo_mmc_resources[] = {
                .flags  = IORESOURCE_MEM
        }, {
                .name   = "glamo-mmc-mem",
@@ -67,10 +61,10 @@ index 82a906a..a614d44 100644
        }, {
                .start  = GLAMO_IRQ_MMC,
 diff --git a/drivers/mfd/glamo/glamo-core.h b/drivers/mfd/glamo/glamo-core.h
-index 17017b0..d21bdc4 100644
+index 17017b0..0adba96 100644
 --- a/drivers/mfd/glamo/glamo-core.h
 +++ b/drivers/mfd/glamo/glamo-core.h
-@@ -3,18 +3,33 @@
+@@ -3,18 +3,30 @@
  
  #include <linux/mfd/glamo.h>
  
@@ -80,12 +74,10 @@ index 17017b0..d21bdc4 100644
 +/* Arbitrarily determined amount for the hardware cursor */
 +#define GLAMO_CURSOR_SIZE (4096)
 +#define GLAMO_MMC_BUFFER_SIZE (64 * 1024) /* 64k MMC buffer */
-+#define GLAMO_CMDQ_SIZE (128 * 1024)    /* 128k ring buffer */
 +/* Remaining memory will be used for 2D and 3D graphics */
 +#define GLAMO_FB_SIZE (GLAMO_INTERNAL_RAM_SIZE     \
 +                       - GLAMO_CURSOR_SIZE       \
-+                       - GLAMO_MMC_BUFFER_SIZE   \
-+                       - GLAMO_CMDQ_SIZE)
++                       - GLAMO_MMC_BUFFER_SIZE)
 +/* A 640x480, 16bpp, double-buffered framebuffer */
 +#if (GLAMO_FB_SIZE < (640 * 480 * 4)) /* == 0x12c000 */
 +#error Not enough Glamo VRAM for framebuffer!
@@ -110,7 +102,6 @@ index 17017b0..d21bdc4 100644
 +#define GLAMO_OFFSET_FB               (0x000000)
 +#define GLAMO_OFFSET_CURSOR   (GLAMO_OFFSET_FB + GLAMO_FB_SIZE)
 +#define GLAMO_OFFSET_MMC      (GLAMO_OFFSET_CURSOR + GLAMO_CURSOR_SIZE)
-+#define GLAMO_OFFSET_CMDQ     (GLAMO_OFFSET_MMC + GLAMO_MMC_BUFFER_SIZE)
  
  enum glamo_pll {
      GLAMO_PLL1,
@@ -167,5 +158,5 @@ index 529d4f0..ea91a06 100644
 +
  #endif
 -- 
-1.6.6.1
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0010-JBT6k74-work-for-KMS.patch b/recipes/linux/linux-openmoko-2.6.32/0010-JBT6k74-work-for-KMS.patch
new file mode 100644 (file)
index 0000000..2105ab6
--- /dev/null
@@ -0,0 +1,540 @@
+From 5788c7777a6fa63dc56093277ae14c4dac4ee6cb Mon Sep 17 00:00:00 2001
+From: Thomas White <taw@bitwiz.org.uk>
+Date: Sat, 21 Nov 2009 21:42:16 +0100
+Subject: [PATCH 10/14] JBT6k74 work for KMS
+
+This simplifies the JBT6k74 driver, and adds hooks for the Glamo driver to cooperate
+more closely with it.
+
+Signed-off-by: Thomas White <taw@bitwiz.org.uk>
+---
+ drivers/video/backlight/jbt6k74.c |  252 ++++++++++++++++++------------------
+ include/linux/jbt6k74.h           |   17 +++-
+ 2 files changed, 142 insertions(+), 127 deletions(-)
+
+diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
+index 8450904..91651e7 100644
+--- a/drivers/video/backlight/jbt6k74.c
++++ b/drivers/video/backlight/jbt6k74.c
+@@ -101,20 +101,10 @@ enum jbt_register {
+       JBT_REG_HCLOCK_QVGA             = 0xed,
+ };
+-enum jbt_resolution {
+-      JBT_RESOLUTION_VGA,
+-      JBT_RESOLUTION_QVGA,
+-};
+-
+-enum jbt_power_mode {
+-      JBT_POWER_MODE_DEEP_STANDBY,
+-      JBT_POWER_MODE_SLEEP,
+-      JBT_POWER_MODE_NORMAL,
+-};
+ static const char *jbt_power_mode_names[] = {
+-      [JBT_POWER_MODE_DEEP_STANDBY]   = "deep-standby",
+-      [JBT_POWER_MODE_SLEEP]          = "sleep",
++      [JBT_POWER_MODE_OFF]            = "off",
++      [JBT_POWER_MODE_STANDBY]        = "standby",
+       [JBT_POWER_MODE_NORMAL]         = "normal",
+ };
+@@ -123,6 +113,7 @@ static const char *jbt_resolution_names[] = {
+       [JBT_RESOLUTION_QVGA] = "qvga",
+ };
++
+ struct jbt_info {
+       struct mutex lock;              /* protects this structure */
+       enum jbt_resolution resolution;
+@@ -141,6 +132,8 @@ struct jbt_info {
+       uint16_t reg_cache[0xEE];
+ };
++struct jbt_info *jbt_global;
++
+ #define JBT_COMMAND   0x000
+ #define JBT_DATA      0x100
+@@ -156,6 +149,8 @@ static int jbt_reg_write_nodata(struct jbt_info *jbt, uint8_t reg)
+       else
+               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++      mdelay(1);
++
+       return ret;
+ }
+@@ -173,6 +168,8 @@ static int jbt_reg_write(struct jbt_info *jbt, uint8_t reg, uint8_t data)
+       else
+               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++      mdelay(1);
++
+       return ret;
+ }
+@@ -191,6 +188,8 @@ static int jbt_reg_write16(struct jbt_info *jbt, uint8_t reg, uint16_t data)
+       else
+               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++      mdelay(1);
++
+       return ret;
+ }
+@@ -218,7 +217,7 @@ static int jbt_init_regs(struct jbt_info *jbt)
+        * to avoid red / blue flicker
+        */
+       ret |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x00 | (1 << 5));
+-      ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);
++      ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0xff);
+       ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);
+       ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);
+@@ -260,14 +259,18 @@ static int jbt_init_regs(struct jbt_info *jbt)
+       return ret ? -EIO : 0;
+ }
+-static int jbt_standby_to_sleep(struct jbt_info *jbt)
++
++static int jbt_off_to_normal(struct jbt_info *jbt)
+ {
+       int ret;
++
+       struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
+       gpio_set_value_cansleep(pdata->gpio_reset, 1);
+       ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
++      mdelay(120);
++
+       /* three times command zero */
+       ret |= jbt_reg_write_nodata(jbt, 0x00);
+       mdelay(1);
+@@ -279,18 +282,11 @@ static int jbt_standby_to_sleep(struct jbt_info *jbt)
+       /* deep standby out */
+       ret |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11);
+       mdelay(1);
+-      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
++      ret |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
+       /* (re)initialize register set */
+       ret |= jbt_init_regs(jbt);
+-      return ret ? -EIO : 0;
+-}
+-
+-static int jbt_sleep_to_normal(struct jbt_info *jbt)
+-{
+-      int ret;
+-
+       /* Make sure we are 120 ms after SLEEP_OUT */
+       if (time_before(jiffies, jbt->next_sleep))
+               mdelay(jiffies_to_msecs(jbt->next_sleep - jiffies));
+@@ -320,6 +316,7 @@ static int jbt_sleep_to_normal(struct jbt_info *jbt)
+       /* Sleep mode off */
+       ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
++
+       jbt->next_sleep = jiffies + msecs_to_jiffies(120);
+       /* Allow the booster and display controller to restart stably */
+@@ -328,45 +325,68 @@ static int jbt_sleep_to_normal(struct jbt_info *jbt)
+       return ret ? -EIO : 0;
+ }
+-static int jbt_normal_to_sleep(struct jbt_info *jbt)
++static int jbt_normal_to_off(struct jbt_info *jbt)
+ {
+       int ret;
++      struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
+-      /* Make sure we are 120 ms after SLEEP_OUT */
+-      while (time_before(jiffies, jbt->next_sleep))
+-              cpu_relax();
++      /* Pull the plug! */
++      ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies),
++                                   jbt->supplies);
++      if (!ret)
++              gpio_set_value_cansleep(pdata->gpio_reset, 0);
++
++      return ret ? -EIO : 0;
++}
++
++
++static int jbt_normal_to_standby(struct jbt_info *jbt)
++{
++      int ret;
++
++      if ( jbt->power_mode != JBT_POWER_MODE_NORMAL ) return 0;
++
++      /* Make sure we are 120 ms after SLEEP_{IN,OUT} */
++      while (time_before(jiffies, jbt->next_sleep)) cpu_relax();
++
++      /* Sleep mode on */
+       ret = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
+       ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3);
++
+       ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
+-      jbt->next_sleep = jiffies + msecs_to_jiffies(120);
++      jbt->next_sleep = jiffies + msecs_to_jiffies(150);
+-      /* Allow the internal circuits to stop automatically */
+-      mdelay(5);
++      jbt->power_mode = JBT_POWER_MODE_STANDBY;
+       return ret ? -EIO : 0;
+ }
+-static int jbt_sleep_to_standby(struct jbt_info *jbt)
++
++static int jbt_standby_to_normal(struct jbt_info *jbt)
+ {
+       int ret;
+-      struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
+-      ret = jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
++      if ( jbt->power_mode != JBT_POWER_MODE_STANDBY ) return 0;
+-      if (!ret)
+-              ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
++      /* Make sure we are 120 ms after SLEEP_{IN,OUT} */
++      while (time_before(jiffies, jbt->next_sleep)) cpu_relax();
+-      if (!ret)
+-              gpio_set_value_cansleep(pdata->gpio_reset, 0);
++      ret = jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
++      jbt->next_sleep = jiffies + msecs_to_jiffies(150);
+-      return ret;
++      ret |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
++      ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xdff9);
++
++      jbt->power_mode = JBT_POWER_MODE_NORMAL;
++
++      return ret ? -EIO : 0;
+ }
++
+ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
+                                       enum jbt_power_mode new_mode)
+ {
+-      struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
+       int ret = -EINVAL;
+       dev_dbg(&jbt->spi->dev, "entering (old_state=%s, new_state=%s)\n",
+@@ -375,49 +395,17 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
+       mutex_lock(&jbt->lock);
+-      if (jbt->suspended) {
+-              switch (new_mode) {
+-              case JBT_POWER_MODE_DEEP_STANDBY:
+-              case JBT_POWER_MODE_SLEEP:
+-              case JBT_POWER_MODE_NORMAL:
+-                      ret = 0;
+-                      jbt->suspend_mode = new_mode;
+-                      break;
+-              default:
+-                      break;
+-              }
+-      } else if (new_mode == JBT_POWER_MODE_NORMAL &&
+-                      pdata->enable_pixel_clock) {
+-              pdata->enable_pixel_clock(&jbt->spi->dev, 1);
+-      }
+-
+       switch (jbt->power_mode) {
+-      case JBT_POWER_MODE_DEEP_STANDBY:
++      case JBT_POWER_MODE_OFF:
+               switch (new_mode) {
+-              case JBT_POWER_MODE_DEEP_STANDBY:
++              case JBT_POWER_MODE_OFF:
+                       ret = 0;
+                       break;
+-              case JBT_POWER_MODE_SLEEP:
+-                      ret = jbt_standby_to_sleep(jbt);
+-                      break;
+               case JBT_POWER_MODE_NORMAL:
+-                      /* first transition into sleep */
+-                      ret = jbt_standby_to_sleep(jbt);
+-                      /* then transition into normal */
+-                      ret |= jbt_sleep_to_normal(jbt);
++                      ret = jbt_off_to_normal(jbt);
+                       break;
+-              }
+-              break;
+-      case JBT_POWER_MODE_SLEEP:
+-              switch (new_mode) {
+-              case JBT_POWER_MODE_SLEEP:
+-                      ret = 0;
+-                      break;
+-              case JBT_POWER_MODE_DEEP_STANDBY:
+-                      ret = jbt_sleep_to_standby(jbt);
+-                      break;
+-              case JBT_POWER_MODE_NORMAL:
+-                      ret = jbt_sleep_to_normal(jbt);
++              case JBT_POWER_MODE_STANDBY:
++                      ret = -EINVAL;
+                       break;
+               }
+               break;
+@@ -426,25 +414,23 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
+               case JBT_POWER_MODE_NORMAL:
+                       ret = 0;
+                       break;
+-              case JBT_POWER_MODE_DEEP_STANDBY:
+-                      /* first transition into sleep */
+-                      ret = jbt_normal_to_sleep(jbt);
+-                      /* then transition into deep standby */
+-                      ret |= jbt_sleep_to_standby(jbt);
++              case JBT_POWER_MODE_OFF:
++                      ret = jbt_normal_to_off(jbt);
+                       break;
+-              case JBT_POWER_MODE_SLEEP:
+-                      ret = jbt_normal_to_sleep(jbt);
++              case JBT_POWER_MODE_STANDBY:
++                      ret = -EINVAL;
+                       break;
+               }
++              break;
++      case JBT_POWER_MODE_STANDBY:
++              ret = -EINVAL;
++              break;
+       }
+       if (ret == 0) {
+               jbt->power_mode = new_mode;
+-              if (new_mode != JBT_POWER_MODE_NORMAL &&
+-                      pdata->enable_pixel_clock)
+-                      pdata->enable_pixel_clock(&jbt->spi->dev, 0);
+       } else {
+-              dev_err(&jbt->spi->dev, "Failed enter state '%s': %d\n",
++              dev_err(&jbt->spi->dev, "Failed to enter state '%s': %d\n",
+                               jbt_power_mode_names[new_mode], ret);
+       }
+@@ -456,28 +442,46 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
+ static int jbt6k74_set_resolution(struct jbt_info *jbt,
+                                       enum jbt_resolution new_resolution)
+ {
++      int old_resolution;
+       int ret = 0;
+-      enum jbt_resolution old_resolution;
++
++      if ( !jbt ) return -1;
+       mutex_lock(&jbt->lock);
+-      if (jbt->resolution == new_resolution)
+-              goto out_unlock;
++      if ( jbt->resolution == new_resolution ) goto out_unlock;
++      if ( jbt->power_mode == JBT_POWER_MODE_OFF ) goto out_unlock;
+       old_resolution = jbt->resolution;
+       jbt->resolution = new_resolution;
+-      if (jbt->power_mode == JBT_POWER_MODE_NORMAL) {
++      if ( jbt->power_mode == JBT_POWER_MODE_NORMAL ) {
++
++              ret = jbt_normal_to_standby(jbt);
++
++              mdelay(25);
+-              /* first transition into sleep */
+-              ret = jbt_normal_to_sleep(jbt);
+-              ret |= jbt_sleep_to_normal(jbt);
++              if (jbt->resolution == JBT_RESOLUTION_VGA) {
++                      /* Quad mode off */
++                      ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);
++                      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);
++              } else {
++                      /* Quad mode on */
++                      ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
++                      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
++              }
++
++              mdelay(25);
++
++              ret |= jbt_standby_to_normal(jbt);
+               if (ret) {
+                       jbt->resolution = old_resolution;
+-                      dev_err(&jbt->spi->dev, "Failed to set resolution '%s')\n",
++                      dev_err(&jbt->spi->dev,
++                              "Failed to set resolution '%s')\n",
+                               jbt_resolution_names[new_resolution]);
+               }
++
+       }
+ out_unlock:
+@@ -589,7 +593,7 @@ static ssize_t reset_write(struct device *dev, struct device_attribute *attr,
+       mutex_unlock(&jbt->lock);
+-      jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
++      jbt->power_mode = JBT_POWER_MODE_OFF;
+       jbt6k74_enter_power_mode(jbt, old_power_mode);
+       return count;
+@@ -616,27 +620,6 @@ static struct attribute_group jbt_attr_group = {
+       .attrs  = jbt_sysfs_entries,
+ };
+-/* FIXME: This in an ugly hack to delay display blanking.
+-  When the jbt is in sleep mode it displays an all white screen and thus one
+-  will a see a short flash.
+-  By delaying the blanking we will give the backlight a chance to turn off and
+-  thus avoid getting the flash */
+-static void jbt_blank_worker(struct work_struct *work)
+-{
+-      struct jbt_info *jbt  = container_of(work, struct jbt_info,
+-                                              blank_work.work);
+-
+-      switch (jbt->blank_mode) {
+-      case FB_BLANK_NORMAL:
+-              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
+-              break;
+-      case FB_BLANK_POWERDOWN:
+-              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
+-              break;
+-      default:
+-              break;
+-      }
+-}
+ static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m)
+ {
+@@ -649,7 +632,7 @@ static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m)
+               ret = jbt6k74_set_resolution(jbt, JBT_RESOLUTION_VGA);
+       } else {
+               dev_err(&jbt->spi->dev, "Unknown resolution.\n");
+-              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
++              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
+       }
+       return ret;
+@@ -671,11 +654,11 @@ static int jbt6k74_set_power(struct lcd_device *ld, int power)
+               break;
+       case FB_BLANK_NORMAL:
+               dev_dbg(&jbt->spi->dev, "blank\n");
+-              ret = schedule_delayed_work(&jbt->blank_work, HZ);
++              ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
+               break;
+       case FB_BLANK_POWERDOWN:
+               dev_dbg(&jbt->spi->dev, "powerdown\n");
+-              ret = schedule_delayed_work(&jbt->blank_work, HZ);
++              ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
+               break;
+       default:
+               break;
+@@ -691,10 +674,10 @@ static int jbt6k74_get_power(struct lcd_device *ld)
+       switch (jbt->power_mode) {
+       case JBT_POWER_MODE_NORMAL:
+               return FB_BLANK_UNBLANK;
+-      case JBT_POWER_MODE_SLEEP:
++      case JBT_POWER_MODE_OFF:
+               return FB_BLANK_NORMAL;
+       default:
+-              return JBT_POWER_MODE_DEEP_STANDBY;
++              return JBT_POWER_MODE_OFF;
+       }
+ }
+@@ -728,6 +711,8 @@ static int __devinit jbt_probe(struct spi_device *spi)
+       if (!jbt)
+               return -ENOMEM;
++      jbt_global = jbt;
++
+       jbt->spi = spi;
+       jbt->lcd_dev = lcd_device_register("jbt6k74-lcd", &spi->dev, jbt,
+@@ -738,11 +723,9 @@ static int __devinit jbt_probe(struct spi_device *spi)
+               goto err_free_drvdata;
+       }
+-      INIT_DELAYED_WORK(&jbt->blank_work, jbt_blank_worker);
+-
+       jbt->resolution = JBT_RESOLUTION_VGA;
+-      jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
+       jbt->next_sleep = jiffies + msecs_to_jiffies(120);
++      jbt->power_mode = JBT_POWER_MODE_OFF;
+       mutex_init(&jbt->lock);
+       dev_set_drvdata(&spi->dev, jbt);
+@@ -831,6 +814,24 @@ static int __devexit jbt_remove(struct spi_device *spi)
+       return 0;
+ }
++/* Begin horrible layering violations in the interest of making stuff work */
++
++int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution)
++{
++      if ( !jbt_global ) return 0;
++      return jbt6k74_set_resolution(jbt_global, new_resolution);
++}
++EXPORT_SYMBOL_GPL(jbt6k74_finish_resolutionchange);
++
++void jbt6k74_setpower(enum jbt_power_mode new_power)
++{
++      if ( !jbt_global ) return;
++      jbt6k74_enter_power_mode(jbt_global, new_power);
++}
++EXPORT_SYMBOL_GPL(jbt6k74_setpower);
++
++/* End horrible layering violations */
++
+ #ifdef CONFIG_PM
+ static int jbt_suspend(struct spi_device *spi, pm_message_t state)
+ {
+@@ -838,8 +839,7 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state)
+       jbt->suspend_mode = jbt->power_mode;
+-      jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
+-      jbt->suspended = 1;
++      jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
+       dev_info(&spi->dev, "suspended\n");
+diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h
+index 75488c4..2010bdc 100644
+--- a/include/linux/jbt6k74.h
++++ b/include/linux/jbt6k74.h
+@@ -3,6 +3,22 @@
+ #include <linux/spi/spi.h>
++enum jbt_resolution {
++      JBT_RESOLUTION_VGA,
++      JBT_RESOLUTION_QVGA,
++};
++
++enum jbt_power_mode {
++      JBT_POWER_MODE_OFF,
++      JBT_POWER_MODE_STANDBY,
++      JBT_POWER_MODE_NORMAL,
++};
++
++extern void jbt6k74_setpower(enum jbt_power_mode new_power);
++extern int jbt6k74_prepare_resolutionchange(enum jbt_resolution new_resolution);
++extern int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution);
++
++
+ /*
+  *  struct jbt6k74_platform_data - Platform data for jbt6k74 driver
+  *  @probe_completed: Callback to be called when the driver has been
+@@ -13,7 +29,6 @@
+  */
+ struct jbt6k74_platform_data {
+       void (*probe_completed)(struct device *dev);
+-      void (*enable_pixel_clock)(struct device *dev, int enable);
+       int gpio_reset;
+ };
+-- 
+1.7.1
+
diff --git a/recipes/linux/linux-openmoko-2.6.32/0010-Simplify-the-JBT6k74-driver.patch b/recipes/linux/linux-openmoko-2.6.32/0010-Simplify-the-JBT6k74-driver.patch
deleted file mode 100644 (file)
index ca0c2af..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-From cb84d543b9465a8ea48b504b1dfb745c6682a50e Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sun, 28 Feb 2010 15:20:57 +0100
-Subject: [PATCH 1/2] Simplify the JBT6k74 driver
-
-Simplify the JBT6k74 driver
-
-We don't need all the native sleep states - they just complicate things.  Instead, just
-use the LDO "power switch" to send it firmly to sleep and wake it up in a virgin state
-each time.
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-display.c     |  116 ++++++++++++------------
- drivers/mfd/glamo/glamo-display.h     |    2 +
- drivers/mfd/glamo/glamo-drm-private.h |   10 ++
- drivers/mfd/glamo/glamo-kms-fb.c      |   54 ++----------
- drivers/video/backlight/jbt6k74.c     |  160 ++++++++-------------------------
- include/linux/jbt6k74.h               |    1 -
- 6 files changed, 115 insertions(+), 228 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index 34a665a..a384c8b 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -239,14 +239,6 @@ static int glamo_run_lcd_script(struct glamodrm_handle *gdrm,
- }
--extern void jbt6k74_action(int val);
--
--/* Power on/off */
--static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
--{
--}
--
--
- static bool glamo_crtc_mode_fixup(struct drm_crtc *crtc,
-                                   struct drm_display_mode *mode,
-                                   struct drm_display_mode *adjusted_mode)
-@@ -275,6 +267,12 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-       gcrtc = to_glamo_crtc(crtc);
-       gdrm = gcrtc->gdrm;     /* Here it is! */
-+      if ( !gcrtc->pixel_clock_on ) {
-+              printk(KERN_WARNING "[glamo-drm] Refusing to set base while "
-+                                  "pixel clock is off.\n");
-+              return -EBUSY;
-+      }
-+
-       gfb = to_glamo_framebuffer(crtc->fb);
-       obj = gfb->obj;
-       gobj = obj->driver_private;
-@@ -306,6 +304,12 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       gcrtc = to_glamo_crtc(crtc);
-       gdrm = gcrtc->gdrm;     /* Here it is! */
-+      if ( !gcrtc->pixel_clock_on ) {
-+              printk(KERN_WARNING "[glamo-drm] Refusing to set mode while "
-+                                  "pixel clock is off.\n");
-+              return -EBUSY;
-+      }
-+
-       glamo_lcd_cmd_mode(gdrm, 1);
-       glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD, mode->clock);
-@@ -354,10 +358,47 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       glamo_crtc_mode_set_base(crtc, 0, 0, old_fb);
-+      gcrtc->current_mode = *mode;
-+      gcrtc->current_mode_set = 1;
-+      gcrtc->current_fb = old_fb;
-+
-       return 0;
- }
-+extern void jbt6k74_action(int val);
-+
-+/* This is not the right place to switch power on/off, because the helper
-+ * stuff ends up calling this before/after setting the mode.  We can't
-+ * set modes with the display off (although backlight off would be OK) */
-+static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
-+{
-+      /* do nothing */
-+}
-+
-+
-+void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
-+{
-+      struct drm_crtc *crtc = gdrm->crtc;
-+      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
-+
-+      if ( mode ) {
-+              glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-+              gcrtc->pixel_clock_on = 1;
-+              jbt6k74_action(1);
-+              if ( gcrtc->current_mode_set ) {
-+                      glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
-+                                          &gcrtc->current_mode, 0, 0,
-+                                          gcrtc->current_fb);
-+              }
-+      } else {
-+              jbt6k74_action(0);
-+              glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-+              gcrtc->pixel_clock_on = 0;
-+      }
-+}
-+
-+
- static void glamo_crtc_prepare(struct drm_crtc *crtc)
- {
- }
-@@ -725,6 +766,8 @@ int glamo_display_init(struct drm_device *dev)
-                          + sizeof(struct drm_connector *), GFP_KERNEL);
-       if (glamo_crtc == NULL) return 1;
-       glamo_crtc->gdrm = gdrm;
-+      gdrm->crtc = (struct drm_crtc *)glamo_crtc;
-+      glamo_crtc->pixel_clock_on = 1;
-       glamo_crtc->blank_mode = DRM_MODE_DPMS_OFF;
-       drm_crtc_init(dev, &glamo_crtc->base, &glamo_crtc_funcs);
-       drm_crtc_helper_add(&glamo_crtc->base, &glamo_crtc_helper_funcs);
-@@ -808,62 +851,23 @@ int glamo_display_init(struct drm_device *dev)
- void glamo_display_suspend(struct glamodrm_handle *gdrm)
- {
--      gdrm->saved_width = reg_read_lcd(gdrm, GLAMO_REG_LCD_WIDTH);
--      gdrm->saved_height = reg_read_lcd(gdrm, GLAMO_REG_LCD_HEIGHT);
--      gdrm->saved_pitch = reg_read_lcd(gdrm, GLAMO_REG_LCD_PITCH);
--      gdrm->saved_htotal = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL);
--      gdrm->saved_hrtrst = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START);
--      gdrm->saved_hrtren = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END);
--      gdrm->saved_hdspst = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START);
--      gdrm->saved_hdspen = reg_read_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END);
--      gdrm->saved_vtotal = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL);
--      gdrm->saved_vrtrst = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START);
--      gdrm->saved_vrtren = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END);
--      gdrm->saved_vdspst = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START);
--      gdrm->saved_vdspen = reg_read_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END);
-+      /* do nothing */
- }
- void glamo_display_resume(struct glamodrm_handle *gdrm)
- {
-+      struct drm_crtc *crtc = gdrm->crtc;
-+      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
-+
-       glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-       glamo_engine_reset(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-       glamo_run_lcd_script(gdrm, lcd_init_script,
-                                  ARRAY_SIZE(lcd_init_script));
--      /* Restore timings */
--      glamo_lcd_cmd_mode(gdrm, 1);
--      glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
--                           gdrm->saved_clock);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH, GLAMO_LCD_WIDTH_MASK,
--                           gdrm->saved_width);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT, GLAMO_LCD_HEIGHT_MASK,
--                           gdrm->saved_height);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH, GLAMO_LCD_PITCH_MASK,
--                           gdrm->saved_pitch);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
--                           GLAMO_LCD_HV_TOTAL_MASK, gdrm->saved_htotal);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
--                           GLAMO_LCD_HV_RETR_START_MASK, gdrm->saved_hrtrst);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
--                           GLAMO_LCD_HV_RETR_END_MASK, gdrm->saved_hrtren);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
--                           GLAMO_LCD_HV_RETR_DISP_START_MASK,
--                           gdrm->saved_hdspst);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
--                           GLAMO_LCD_HV_RETR_DISP_END_MASK,
--                           gdrm->saved_hdspen);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
--                           GLAMO_LCD_HV_TOTAL_MASK, gdrm->saved_vtotal);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
--                           GLAMO_LCD_HV_RETR_START_MASK, gdrm->saved_vrtrst);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
--                           GLAMO_LCD_HV_RETR_END_MASK, gdrm->saved_vrtren);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
--                           GLAMO_LCD_HV_RETR_DISP_START_MASK,
--                           gdrm->saved_vdspst);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
--                           GLAMO_LCD_HV_RETR_DISP_END_MASK,
--                           gdrm->saved_vdspen);
--      glamo_lcd_cmd_mode(gdrm, 0);
-+      if ( gcrtc->current_mode_set ) {
-+              glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
-+                                  &gcrtc->current_mode, 0, 0,
-+                                  gcrtc->current_fb);
-+      }
- }
-diff --git a/drivers/mfd/glamo/glamo-display.h b/drivers/mfd/glamo/glamo-display.h
-index d6f21bc..728bba5 100644
---- a/drivers/mfd/glamo/glamo-display.h
-+++ b/drivers/mfd/glamo/glamo-display.h
-@@ -36,4 +36,6 @@ extern int glamo_framebuffer_create(struct drm_device *dev,
- extern void glamo_display_suspend(struct glamodrm_handle *gdrm);
- extern void glamo_display_resume(struct glamodrm_handle *gdrm);
-+extern void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode);
-+
- #endif /* __GLAMO_DISPLAY_H */
-diff --git a/drivers/mfd/glamo/glamo-drm-private.h b/drivers/mfd/glamo/glamo-drm-private.h
-index 7949a2e..4e24019 100644
---- a/drivers/mfd/glamo/glamo-drm-private.h
-+++ b/drivers/mfd/glamo/glamo-drm-private.h
-@@ -106,6 +106,9 @@ struct glamodrm_handle {
-       /* A scratch block */
-       struct drm_mm_node *scratch;
-+
-+      /* We only have one */
-+      struct drm_crtc *crtc;
- };
-@@ -118,11 +121,18 @@ struct drm_glamo_gem_object {
- struct glamo_crtc {
-+
-       struct drm_crtc base;
-       struct glamodrm_handle *gdrm;
-       /* a mode_set for fbdev users on this crtc */
-       struct drm_mode_set mode_set;
-       int blank_mode;
-+
-+      int pixel_clock_on;
-+
-+      int current_mode_set;
-+      struct drm_display_mode current_mode;
-+      struct drm_framebuffer *current_fb;
- };
-diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c
-index 61cd605..57680ed 100644
---- a/drivers/mfd/glamo/glamo-kms-fb.c
-+++ b/drivers/mfd/glamo/glamo-kms-fb.c
-@@ -253,64 +253,24 @@ static void glamofb_on(struct fb_info *info)
- {
-       struct glamofb_par *par = info->par;
-       struct drm_device *dev = par->dev;
--      struct drm_crtc *crtc;
--      struct drm_encoder *encoder;
--      int i;
-+      struct glamodrm_handle *gdrm = dev->dev_private;
--      /*
--       * For each CRTC in this fb, find all associated encoders
--       * and turn them off, then turn off the CRTC.
--       */
--      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
--              struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
-+      printk(KERN_CRIT "Turning on display...\n");
--              for (i = 0; i < par->crtc_count; i++)
--                      if (crtc->base.id == par->crtc_ids[i])
--                              break;
--
--              crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
-+      gdrm = dev->dev_private;
--              /* Found a CRTC on this fb, now find encoders */
--              list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
--                      if (encoder->crtc == crtc) {
--                              struct drm_encoder_helper_funcs *encoder_funcs;
--                              encoder_funcs = encoder->helper_private;
--                              encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
--                      }
--              }
--      }
-+      glamo_lcd_power(gdrm, 1);
- }
- static void glamofb_off(struct fb_info *info, int dpms_mode)
- {
-       struct glamofb_par *par = info->par;
-       struct drm_device *dev = par->dev;
--      struct drm_crtc *crtc;
--      struct drm_encoder *encoder;
--      int i;
-+      struct glamodrm_handle *gdrm = dev->dev_private;
--      /*
--       * For each CRTC in this fb, find all associated encoders
--       * and turn them off, then turn off the CRTC.
--       */
--      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
--              struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
--
--              for (i = 0; i < par->crtc_count; i++)
--                      if (crtc->base.id == par->crtc_ids[i])
--                              break;
-+      printk(KERN_CRIT "Turning off display...\n");
--              /* Found a CRTC on this fb, now find encoders */
--              list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
--                      if (encoder->crtc == crtc) {
--                              struct drm_encoder_helper_funcs *encoder_funcs;
--                              encoder_funcs = encoder->helper_private;
--                              encoder_funcs->dpms(encoder, dpms_mode);
--                      }
--              }
--              if (dpms_mode == DRM_MODE_DPMS_OFF)
--                      crtc_funcs->dpms(crtc, dpms_mode);
--      }
-+      glamo_lcd_power(gdrm, 0);
- }
- static int glamofb_blank(int blank, struct fb_info *info)
-diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
-index 95ca4cf..9554cb3 100644
---- a/drivers/video/backlight/jbt6k74.c
-+++ b/drivers/video/backlight/jbt6k74.c
-@@ -107,14 +107,12 @@ enum jbt_resolution {
- };
- enum jbt_power_mode {
--      JBT_POWER_MODE_DEEP_STANDBY,
--      JBT_POWER_MODE_SLEEP,
-+      JBT_POWER_MODE_OFF,
-       JBT_POWER_MODE_NORMAL,
- };
- static const char *jbt_power_mode_names[] = {
--      [JBT_POWER_MODE_DEEP_STANDBY]   = "deep-standby",
--      [JBT_POWER_MODE_SLEEP]          = "sleep",
-+      [JBT_POWER_MODE_OFF]            = "off",
-       [JBT_POWER_MODE_NORMAL]         = "normal",
- };
-@@ -260,14 +258,18 @@ static int jbt_init_regs(struct jbt_info *jbt)
-       return ret ? -EIO : 0;
- }
--static int jbt_standby_to_sleep(struct jbt_info *jbt)
-+
-+static int jbt_off_to_normal(struct jbt_info *jbt)
- {
-       int ret;
-+
-       struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
-       gpio_set_value_cansleep(pdata->gpio_reset, 1);
-       ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
-+      mdelay(30);
-+
-       /* three times command zero */
-       ret |= jbt_reg_write_nodata(jbt, 0x00);
-       mdelay(1);
-@@ -279,18 +281,11 @@ static int jbt_standby_to_sleep(struct jbt_info *jbt)
-       /* deep standby out */
-       ret |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11);
-       mdelay(1);
--      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
-+      ret |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
-       /* (re)initialize register set */
-       ret |= jbt_init_regs(jbt);
--      return ret ? -EIO : 0;
--}
--
--static int jbt_sleep_to_normal(struct jbt_info *jbt)
--{
--      int ret;
--
-       /* Make sure we are 120 ms after SLEEP_OUT */
-       if (time_before(jiffies, jbt->next_sleep))
-               mdelay(jiffies_to_msecs(jbt->next_sleep - jiffies));
-@@ -320,53 +315,34 @@ static int jbt_sleep_to_normal(struct jbt_info *jbt)
-       /* Sleep mode off */
-       ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
--      jbt->next_sleep = jiffies + msecs_to_jiffies(120);
--      /* Allow the booster and display controller to restart stably */
--      mdelay(5);
--
--      return ret ? -EIO : 0;
--}
--
--static int jbt_normal_to_sleep(struct jbt_info *jbt)
--{
--      int ret;
--
--      /* Make sure we are 120 ms after SLEEP_OUT */
--      while (time_before(jiffies, jbt->next_sleep))
--              cpu_relax();
--
--      ret = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
--      ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3);
--      ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
-       jbt->next_sleep = jiffies + msecs_to_jiffies(120);
--      /* Allow the internal circuits to stop automatically */
-+      /* Allow the booster and display controller to restart stably */
-       mdelay(5);
-       return ret ? -EIO : 0;
- }
--static int jbt_sleep_to_standby(struct jbt_info *jbt)
-+static int jbt_normal_to_off(struct jbt_info *jbt)
- {
-       int ret;
-       struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
--      ret = jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
--
--      if (!ret)
--              ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
-+      /* Pull the plug! */
-+      ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies),
-+                                   jbt->supplies);
-       if (!ret)
-               gpio_set_value_cansleep(pdata->gpio_reset, 0);
--      return ret;
-+      return ret ? -EIO : 0;
- }
-+
- static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-                                       enum jbt_power_mode new_mode)
- {
--      struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
-       int ret = -EINVAL;
-       dev_dbg(&jbt->spi->dev, "entering (old_state=%s, new_state=%s)\n",
-@@ -375,49 +351,14 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-       mutex_lock(&jbt->lock);
--      if (jbt->suspended) {
--              switch (new_mode) {
--              case JBT_POWER_MODE_DEEP_STANDBY:
--              case JBT_POWER_MODE_SLEEP:
--              case JBT_POWER_MODE_NORMAL:
--                      ret = 0;
--                      jbt->suspend_mode = new_mode;
--                      break;
--              default:
--                      break;
--              }
--      } else if (new_mode == JBT_POWER_MODE_NORMAL &&
--                      pdata->enable_pixel_clock) {
--              pdata->enable_pixel_clock(&jbt->spi->dev, 1);
--      }
--
-       switch (jbt->power_mode) {
--      case JBT_POWER_MODE_DEEP_STANDBY:
--              switch (new_mode) {
--              case JBT_POWER_MODE_DEEP_STANDBY:
--                      ret = 0;
--                      break;
--              case JBT_POWER_MODE_SLEEP:
--                      ret = jbt_standby_to_sleep(jbt);
--                      break;
--              case JBT_POWER_MODE_NORMAL:
--                      /* first transition into sleep */
--                      ret = jbt_standby_to_sleep(jbt);
--                      /* then transition into normal */
--                      ret |= jbt_sleep_to_normal(jbt);
--                      break;
--              }
--              break;
--      case JBT_POWER_MODE_SLEEP:
-+      case JBT_POWER_MODE_OFF:
-               switch (new_mode) {
--              case JBT_POWER_MODE_SLEEP:
-+              case JBT_POWER_MODE_OFF:
-                       ret = 0;
-                       break;
--              case JBT_POWER_MODE_DEEP_STANDBY:
--                      ret = jbt_sleep_to_standby(jbt);
--                      break;
-               case JBT_POWER_MODE_NORMAL:
--                      ret = jbt_sleep_to_normal(jbt);
-+                      ret = jbt_off_to_normal(jbt);
-                       break;
-               }
-               break;
-@@ -426,25 +367,16 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-               case JBT_POWER_MODE_NORMAL:
-                       ret = 0;
-                       break;
--              case JBT_POWER_MODE_DEEP_STANDBY:
--                      /* first transition into sleep */
--                      ret = jbt_normal_to_sleep(jbt);
--                      /* then transition into deep standby */
--                      ret |= jbt_sleep_to_standby(jbt);
--                      break;
--              case JBT_POWER_MODE_SLEEP:
--                      ret = jbt_normal_to_sleep(jbt);
-+              case JBT_POWER_MODE_OFF:
-+                      ret = jbt_normal_to_off(jbt);
-                       break;
-               }
-       }
-       if (ret == 0) {
-               jbt->power_mode = new_mode;
--              if (new_mode != JBT_POWER_MODE_NORMAL &&
--                      pdata->enable_pixel_clock)
--                      pdata->enable_pixel_clock(&jbt->spi->dev, 0);
-       } else {
--              dev_err(&jbt->spi->dev, "Failed enter state '%s': %d\n",
-+              dev_err(&jbt->spi->dev, "Failed to enter state '%s': %d\n",
-                               jbt_power_mode_names[new_mode], ret);
-       }
-@@ -470,8 +402,8 @@ static int jbt6k74_set_resolution(struct jbt_info *jbt,
-       if (jbt->power_mode == JBT_POWER_MODE_NORMAL) {
-               /* first transition into sleep */
--              ret = jbt_normal_to_sleep(jbt);
--              ret |= jbt_sleep_to_normal(jbt);
-+              ret = jbt_normal_to_off(jbt);
-+              ret |= jbt_off_to_normal(jbt);
-               if (ret) {
-                       jbt->resolution = old_resolution;
-@@ -589,7 +521,7 @@ static ssize_t reset_write(struct device *dev, struct device_attribute *attr,
-       mutex_unlock(&jbt->lock);
--      jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
-+      jbt->power_mode = JBT_POWER_MODE_OFF;
-       jbt6k74_enter_power_mode(jbt, old_power_mode);
-       return count;
-@@ -616,27 +548,6 @@ static struct attribute_group jbt_attr_group = {
-       .attrs  = jbt_sysfs_entries,
- };
--/* FIXME: This in an ugly hack to delay display blanking.
--  When the jbt is in sleep mode it displays an all white screen and thus one
--  will a see a short flash.
--  By delaying the blanking we will give the backlight a chance to turn off and
--  thus avoid getting the flash */
--static void jbt_blank_worker(struct work_struct *work)
--{
--      struct jbt_info *jbt  = container_of(work, struct jbt_info,
--                                              blank_work.work);
--
--      switch (jbt->blank_mode) {
--      case FB_BLANK_NORMAL:
--              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
--              break;
--      case FB_BLANK_POWERDOWN:
--              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
--              break;
--      default:
--              break;
--      }
--}
- static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m)
- {
-@@ -649,7 +560,7 @@ static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m)
-               ret = jbt6k74_set_resolution(jbt, JBT_RESOLUTION_VGA);
-       } else {
-               dev_err(&jbt->spi->dev, "Unknown resolution.\n");
--              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
-+              jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
-       }
-       return ret;
-@@ -671,11 +582,11 @@ static int jbt6k74_set_power(struct lcd_device *ld, int power)
-               break;
-       case FB_BLANK_NORMAL:
-               dev_dbg(&jbt->spi->dev, "blank\n");
--              ret = schedule_delayed_work(&jbt->blank_work, HZ);
-+              ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
-               break;
-       case FB_BLANK_POWERDOWN:
-               dev_dbg(&jbt->spi->dev, "powerdown\n");
--              ret = schedule_delayed_work(&jbt->blank_work, HZ);
-+              ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
-               break;
-       default:
-               break;
-@@ -691,10 +602,10 @@ static int jbt6k74_get_power(struct lcd_device *ld)
-       switch (jbt->power_mode) {
-       case JBT_POWER_MODE_NORMAL:
-               return FB_BLANK_UNBLANK;
--      case JBT_POWER_MODE_SLEEP:
-+      case JBT_POWER_MODE_OFF:
-               return FB_BLANK_NORMAL;
-       default:
--              return JBT_POWER_MODE_DEEP_STANDBY;
-+              return JBT_POWER_MODE_OFF;
-       }
- }
-@@ -707,7 +618,7 @@ void jbt6k74_action(int val)
-               return;
-       }
-       if ( val == 0 ) {
--              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_SLEEP);
-+              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_OFF);
-       } else {
-               jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_NORMAL);
-       }
-@@ -756,11 +667,9 @@ static int __devinit jbt_probe(struct spi_device *spi)
-               goto err_free_drvdata;
-       }
--      INIT_DELAYED_WORK(&jbt->blank_work, jbt_blank_worker);
--
-       jbt->resolution = JBT_RESOLUTION_VGA;
--      jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
-       jbt->next_sleep = jiffies + msecs_to_jiffies(120);
-+      jbt->power_mode = JBT_POWER_MODE_OFF;
-       mutex_init(&jbt->lock);
-       dev_set_drvdata(&spi->dev, jbt);
-@@ -856,9 +765,10 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state)
-       jbt->suspend_mode = jbt->power_mode;
--      jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
--      jbt->suspended = 1;
-+      printk(KERN_CRIT "[jbt] powering off for suspend\n");
-+      jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
-+      printk(KERN_CRIT "[jbt] done\n");
-       dev_info(&spi->dev, "suspended\n");
-       return 0;
-@@ -869,11 +779,13 @@ int jbt6k74_resume(struct spi_device *spi)
-       struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
-       dev_info(&spi->dev, "starting resume: %d\n", jbt->suspend_mode);
-+      printk(KERN_CRIT "[jbt] powering on for resume\n");
-       mdelay(20);
-       jbt->suspended = 0;
-       jbt6k74_enter_power_mode(jbt, jbt->suspend_mode);
-+      printk(KERN_CRIT "[jbt] done\n");
-       dev_info(&spi->dev, "resumed: %d\n", jbt->suspend_mode);
-       return 0;
-diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h
-index 75488c4..4cf760c 100644
---- a/include/linux/jbt6k74.h
-+++ b/include/linux/jbt6k74.h
-@@ -13,7 +13,6 @@
-  */
- struct jbt6k74_platform_data {
-       void (*probe_completed)(struct device *dev);
--      void (*enable_pixel_clock)(struct device *dev, int enable);
-       int gpio_reset;
- };
--- 
-1.7.0
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0011-Don-t-choke-if-userspace-provides-a-pixel-clock-valu.patch b/recipes/linux/linux-openmoko-2.6.32/0011-Don-t-choke-if-userspace-provides-a-pixel-clock-valu.patch
deleted file mode 100644 (file)
index 0d47c12..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-From 73abadc5bbbc94f4ca67effc5f5c3174c2a3ac48 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sun, 28 Feb 2010 15:40:13 +0100
-Subject: [PATCH 2/2] Don't choke if userspace provides a pixel clock value
-
-Don't choke if userspace provides a pixel clock value
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-kms-fb.c |   46 ++++++++++++++++++-------------------
- 1 files changed, 22 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c
-index 57680ed..6d4b9ea 100644
---- a/drivers/mfd/glamo/glamo-kms-fb.c
-+++ b/drivers/mfd/glamo/glamo-kms-fb.c
-@@ -177,37 +177,35 @@ static int glamofb_set_par(struct fb_info *info)
-       struct drm_device *dev = par->dev;
-       struct fb_var_screeninfo *var = &info->var;
-       int i;
-+      struct drm_crtc *crtc;
-+      int ret;
-       DRM_DEBUG("%d %d\n", var->xres, var->pixclock);
-       if (var->pixclock != -1) {
-+              DRM_ERROR("Warning: userspace gave me a pixel clock value (%i)"
-+                        "- I'm ignoring it.\n", var->pixclock);
-+      }
--              DRM_ERROR("PIXEL CLOCK SET\n");
--              return -EINVAL;
--      } else {
--              struct drm_crtc *crtc;
--              int ret;
--
--              list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
--                      struct glamo_crtc *glamo_crtc = to_glamo_crtc(crtc);
--
--                      for (i = 0; i < par->crtc_count; i++)
--                              if (crtc->base.id == par->crtc_ids[i])
--                                      break;
--
--                      if (i == par->crtc_count)
--                              continue;
--
--                      if (crtc->fb == glamo_crtc->mode_set.fb) {
--                              mutex_lock(&dev->mode_config.mutex);
--                              ret = crtc->funcs->set_config(&glamo_crtc->mode_set);
--                              mutex_unlock(&dev->mode_config.mutex);
--                              if (ret)
--                                      return ret;
--                      }
-+      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
-+              struct glamo_crtc *glamo_crtc = to_glamo_crtc(crtc);
-+
-+              for (i = 0; i < par->crtc_count; i++)
-+                      if (crtc->base.id == par->crtc_ids[i])
-+                              break;
-+
-+              if (i == par->crtc_count)
-+                      continue;
-+
-+              if (crtc->fb == glamo_crtc->mode_set.fb) {
-+                      mutex_lock(&dev->mode_config.mutex);
-+                      ret = crtc->funcs->set_config(&glamo_crtc->mode_set);
-+                      mutex_unlock(&dev->mode_config.mutex);
-+                      if (ret)
-+                              return ret;
-               }
--              return 0;
-       }
-+      return 0;
- }
- static int glamofb_pan_display(struct fb_var_screeninfo *var,
--- 
-1.7.0
-
@@ -1,7 +1,7 @@
-From f6debba05c9f6d0337324dc0eaa8e892d2d3142b Mon Sep 17 00:00:00 2001
+From d5f07ab010afe531312874872904fe1a0348ee2b Mon Sep 17 00:00:00 2001
 From: Thomas White <taw@bitwiz.org.uk>
 Date: Thu, 4 Feb 2010 00:07:25 +0100
-Subject: [PATCH 8/9] Fix crash when reading Glamo registers via sysfs
+Subject: [PATCH 11/14] Fix crash when reading Glamo registers via sysfs
 
 glamo-core didn't ioremap() some areas, so don't try to read them.
 
@@ -11,7 +11,7 @@ Signed-off-by: Thomas White <taw@bitwiz.org.uk>
  1 files changed, 4 insertions(+), 4 deletions(-)
 
 diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c
-index a614d44..faaf269 100644
+index 74da668..33a7a59 100644
 --- a/drivers/mfd/glamo/glamo-core.c
 +++ b/drivers/mfd/glamo/glamo-core.c
 @@ -90,14 +90,14 @@ static const struct reg_range reg_range[] = {
@@ -34,5 +34,5 @@ index a614d44..faaf269 100644
  };
  
 -- 
-1.6.6.1
+1.7.1
 
diff --git a/recipes/linux/linux-openmoko-2.6.32/0012-Fix-dynamic-command-queue-allocation.patch b/recipes/linux/linux-openmoko-2.6.32/0012-Fix-dynamic-command-queue-allocation.patch
new file mode 100644 (file)
index 0000000..68e170a
--- /dev/null
@@ -0,0 +1,131 @@
+From 3b328bfd4aef3ffc9b0192ca512fbc899148e8f5 Mon Sep 17 00:00:00 2001
+From: Thomas White <taw@bitwiz.org.uk>
+Date: Thu, 6 May 2010 05:40:15 -0700
+Subject: [PATCH 12/14] Fix dynamic command queue allocation
+
+(Not tested...)
+
+Signed-off-by: Thomas White <taw@bitwiz.org.uk>
+---
+ drivers/mfd/glamo/glamo-cmdq.c    |   10 +++++++---
+ drivers/mfd/glamo/glamo-cmdq.h    |    2 +-
+ drivers/mfd/glamo/glamo-drm-drv.c |   17 +++++++----------
+ 3 files changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/mfd/glamo/glamo-cmdq.c b/drivers/mfd/glamo/glamo-cmdq.c
+index 442963c..28c5268 100644
+--- a/drivers/mfd/glamo/glamo-cmdq.c
++++ b/drivers/mfd/glamo/glamo-cmdq.c
+@@ -57,6 +57,7 @@
+ #include "glamo-core.h"
+ #include "glamo-drm-private.h"
+ #include "glamo-regs.h"
++#include "glamo-buffer.h"
+ #define GLAMO_CMDQ_SIZE (128 * 1024)    /* 128k ring buffer */
+@@ -495,10 +496,11 @@ int glamo_cmdq_setup(struct glamodrm_handle *gdrm)
+ }
+-int glamo_cmdq_init(struct glamodrm_handle *gdrm)
++int glamo_cmdq_init(struct drm_device *dev)
+ {
+       struct drm_gem_object *obj;
+       struct drm_glamo_gem_object *gobj;
++      struct glamodrm_handle *gdrm = dev->dev_private;
+       int ret = 0;
+       obj = glamo_gem_object_alloc(dev, GLAMO_CMDQ_SIZE, 4);
+@@ -507,9 +509,10 @@ int glamo_cmdq_init(struct glamodrm_handle *gdrm)
+               ret = -ENOMEM;
+               goto out;
+       }
+-      gobj = fbo->driver_private;
++      gobj = obj->driver_private;
+       gdrm->cmdq_offs = GLAMO_OFFSET_FB + gobj->block->start;
+-      gdrm->cmdq_base = ioremap(gdrm->vram->start + offs, GLAMO_CMDQ_SIZE);
++      gdrm->cmdq_base = ioremap(gdrm->vram->start + gdrm->cmdq_offs,
++                                GLAMO_CMDQ_SIZE);
+       /* Set up registers */
+       glamo_cmdq_setup(gdrm);
+@@ -521,6 +524,7 @@ out:
+ int glamo_cmdq_shutdown(struct glamodrm_handle *gdrm)
+ {
++      iounmap(gdrm->cmdq_base);
+       return 0;
+ }
+diff --git a/drivers/mfd/glamo/glamo-cmdq.h b/drivers/mfd/glamo/glamo-cmdq.h
+index 510d195..6d7f184 100644
+--- a/drivers/mfd/glamo/glamo-cmdq.h
++++ b/drivers/mfd/glamo/glamo-cmdq.h
+@@ -38,7 +38,7 @@ extern int glamo_ioctl_cmdburst(struct drm_device *dev, void *data,
+ extern void glamo_cmdq_blank(struct glamodrm_handle *gdrm,
+                              struct drm_gem_object *obj);
+-extern int glamo_cmdq_init(struct glamodrm_handle *gdrm);
++extern int glamo_cmdq_init(struct drm_device *de);
+ extern int glamo_cmdq_shutdown(struct glamodrm_handle *gdrm);
+ extern void glamo_cmdq_suspend(struct glamodrm_handle *gdrm);
+ extern void glamo_cmdq_resume(struct glamodrm_handle *gdrm);
+diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
+index 774eaff..ee648c1 100644
+--- a/drivers/mfd/glamo/glamo-drm-drv.c
++++ b/drivers/mfd/glamo/glamo-drm-drv.c
+@@ -128,7 +128,7 @@ static int glamodrm_load(struct drm_device *dev, unsigned long flags)
+       gdrm = dev->dev_private;
+       glamo_buffer_init(gdrm);
+-      glamo_cmdq_init(gdrm);
++      glamo_cmdq_init(dev);
+       glamo_fence_init(gdrm);
+       glamo_display_init(dev);
+@@ -237,14 +237,14 @@ static int glamodrm_probe(struct platform_device *pdev)
+       if ( !gdrm->vram ) {
+               dev_err(&pdev->dev, "Unable to find VRAM.\n");
+               rc = -ENOENT;
+-              goto out_unmap_cmdq;
++              goto out_unmap_regs;
+       }
+       gdrm->vram = request_mem_region(gdrm->vram->start,
+                                       resource_size(gdrm->vram), pdev->name);
+       if ( !gdrm->vram ) {
+               dev_err(&pdev->dev, "failed to request VRAM region\n");
+               rc = -ENOENT;
+-              goto out_unmap_cmdq;
++              goto out_unmap_regs;
+       }
+       /* Find the LCD controller */
+@@ -316,10 +316,6 @@ out_release_lcd:
+                          resource_size(gdrm->lcd_regs));
+ out_release_vram:
+       release_mem_region(gdrm->vram->start, resource_size(gdrm->vram));
+-out_unmap_cmdq:
+-      iounmap(gdrm->cmdq_base);
+-out_release_cmdq:
+-      release_mem_region(gdrm->cmdq->start, resource_size(gdrm->cmdq));
+ out_unmap_regs:
+       iounmap(gdrm->reg_base);
+ out_release_regs:
+@@ -349,9 +345,10 @@ static int glamodrm_remove(struct platform_device *pdev)
+       /* Release VRAM */
+       release_mem_region(gdrm->vram->start, resource_size(gdrm->vram));
+-      /* Release command queue */
+-      iounmap(gdrm->cmdq_base);
+-      release_mem_region(gdrm->cmdq->start, resource_size(gdrm->cmdq));
++      /* Release LCD registers */
++      iounmap(gdrm->lcd_base);
++      release_mem_region(gdrm->lcd_regs->start,
++                         resource_size(gdrm->lcd_regs));
+       /* Release 2D engine  */
+       iounmap(gdrm->twod_base);
+-- 
+1.7.1
+
diff --git a/recipes/linux/linux-openmoko-2.6.32/0012-Report-all-FB-modes-given-by-the-lower-levels.patch b/recipes/linux/linux-openmoko-2.6.32/0012-Report-all-FB-modes-given-by-the-lower-levels.patch
deleted file mode 100644 (file)
index ac19dbd..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-From f8448d2b08c1e2cfd0faba0e3f3c4c58e4ecaa9f Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Mon, 1 Mar 2010 22:02:26 +0100
-Subject: [PATCH 12/13] Report all FB modes given by the lower levels
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
-Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
----
- drivers/mfd/glamo/glamo-display.c |   70 +++++++++++++++++++++----------------
- 1 files changed, 40 insertions(+), 30 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index a384c8b..bc3a2ea 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -456,43 +456,53 @@ static void glamo_connector_destroy(struct drm_connector *connector)
- static int glamo_connector_get_modes(struct drm_connector *connector)
- {
--      struct drm_display_mode *mode;
-       struct glamo_fb_platform_data *fb_info;
-       struct glamo_output *goutput = to_glamo_output(connector);
-       struct glamodrm_handle *gdrm = goutput->gdrm;
-+      int i;
-       /* Dig out the record which will tell us about the hardware */
-       fb_info = gdrm->glamo_core->pdata->fb_data;
--      mode = drm_mode_create(connector->dev);
--      if (!mode)
--              return 0;
--      /* Fill in 'mode' here */
--      mode->type = DRM_MODE_TYPE_DEFAULT | DRM_MODE_TYPE_PREFERRED;
--
--      /* Convert framebuffer timings into KMS timings */
--      mode->clock = 1000000000UL / fb_info->modes[0].pixclock; /* ps -> kHz */
--      mode->clock *= 1000; /* kHz -> Hz */
--      mode->hdisplay = fb_info->modes[0].xres;
--      mode->hsync_start = fb_info->modes[0].right_margin + mode->hdisplay;
--      mode->hsync_end = mode->hsync_start + fb_info->modes[0].hsync_len;
--      mode->htotal = mode->hsync_end + fb_info->modes[0].left_margin;
--      mode->hskew = 0;
--
--      mode->vdisplay = fb_info->modes[0].yres;
--      mode->vsync_start = fb_info->modes[0].lower_margin + mode->vdisplay;
--      mode->vsync_end = mode->vsync_start + fb_info->modes[0].vsync_len;
--      mode->vtotal = mode->vsync_end + fb_info->modes[0].upper_margin;
--      mode->vscan = 0;
--
--      /* Physical size */
--      mode->width_mm = fb_info->width;
--      mode->height_mm = fb_info->height;
--
--      drm_mode_set_name(mode);
--      drm_mode_probed_add(connector, mode);
--
--      return 1;       /* one mode, for now */
-+      for ( i=0; i<fb_info->num_modes; i++ ) {
-+
-+              struct drm_display_mode *mode;
-+
-+              mode = drm_mode_create(connector->dev);
-+              if ( !mode ) continue;
-+
-+              mode->type = DRM_MODE_TYPE_DEFAULT | DRM_MODE_TYPE_PREFERRED;
-+
-+              /* Convert framebuffer timings into KMS timings.
-+               * First:  ps -> kHz */
-+              mode->clock = 1000000000UL / fb_info->modes[i].pixclock;
-+              mode->clock *= 1000; /* then kHz -> Hz */
-+              mode->hdisplay = fb_info->modes[i].xres;
-+              mode->hsync_start = fb_info->modes[i].right_margin
-+                                   + mode->hdisplay;
-+              mode->hsync_end = mode->hsync_start
-+                                   + fb_info->modes[i].hsync_len;
-+              mode->htotal = mode->hsync_end + fb_info->modes[i].left_margin;
-+              mode->hskew = 0;
-+
-+              mode->vdisplay = fb_info->modes[i].yres;
-+              mode->vsync_start = fb_info->modes[i].lower_margin
-+                                   + mode->vdisplay;
-+              mode->vsync_end = mode->vsync_start
-+                                 + fb_info->modes[i].vsync_len;
-+              mode->vtotal = mode->vsync_end + fb_info->modes[i].upper_margin;
-+              mode->vscan = 0;
-+
-+              /* Physical size */
-+              mode->width_mm = fb_info->width;
-+              mode->height_mm = fb_info->height;
-+
-+              drm_mode_set_name(mode);
-+              drm_mode_probed_add(connector, mode);
-+
-+      }
-+
-+      return fb_info->num_modes;
- }
--- 
-1.7.0
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0013-Change-connector-type-to-LVDS.patch b/recipes/linux/linux-openmoko-2.6.32/0013-Change-connector-type-to-LVDS.patch
deleted file mode 100644 (file)
index 1b8c653..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 3f1154d1b763f981791ad54987e61d31bde43ec7 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Mon, 1 Mar 2010 22:07:57 +0100
-Subject: [PATCH 13/13] Change connector type to LVDS
-
-Not certain that this exactly describes what it is, and too lazy to check, but for sure
-it's a better description than "Unknown".
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-display.c |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index bc3a2ea..5f04697 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -795,7 +795,7 @@ int glamo_display_init(struct drm_device *dev)
-       /* Initialise the connector */
-       drm_connector_init(dev, connector, &glamo_connector_funcs,
--                         DRM_MODE_CONNECTOR_Unknown);
-+                         DRM_MODE_CONNECTOR_LVDS);
-       drm_sysfs_connector_add(connector);
-       connector->interlace_allowed = 0;
-       connector->doublescan_allowed = 0;
--- 
-1.7.0
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0013-Debug-statements-for-testing.patch b/recipes/linux/linux-openmoko-2.6.32/0013-Debug-statements-for-testing.patch
new file mode 100644 (file)
index 0000000..cc58d16
--- /dev/null
@@ -0,0 +1,78 @@
+From fa66cc905714c94bca6580c9adf7b57fa3b1da02 Mon Sep 17 00:00:00 2001
+From: Thomas White <taw@bitwiz.org.uk>
+Date: Thu, 6 May 2010 05:40:33 -0700
+Subject: [PATCH 13/14] Debug statements for testing
+
+Signed-off-by: Thomas White <taw@bitwiz.org.uk>
+---
+ drivers/mfd/glamo/glamo-display.c |    7 +++++++
+ drivers/video/backlight/jbt6k74.c |    4 +++-
+ 2 files changed, 10 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
+index 75ad734..57292ff 100644
+--- a/drivers/mfd/glamo/glamo-display.c
++++ b/drivers/mfd/glamo/glamo-display.c
+@@ -257,6 +257,8 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
+       u32 addr;
+       u16 addr_low, addr_high;
++      printk(KERN_CRIT "Setting base!\n");
++
+       if (!crtc->fb) {
+               DRM_DEBUG("No FB bound\n");
+               return -EINVAL;
+@@ -311,6 +313,8 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
+               msleep(500);
+       }
++      printk(KERN_CRIT "Setting mode!\n");
++
+       /* Rotate? */
+       if ( (mode->hdisplay == 640) && (mode->vdisplay == 480) ) {
+               rot = GLAMO_LCD_ROT_MODE_90;
+@@ -935,15 +939,18 @@ void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
+       struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
+       if ( mode ) {
++              printk(KERN_CRIT "Power on sequence\n");
+               glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
+               gcrtc->pixel_clock_on = 1;
+               jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
+               if ( gcrtc->current_mode_set ) {
++                      printk(KERN_CRIT "Setting previous mode\n");
+                       glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
+                                           &gcrtc->current_mode, 0, 0,
+                                           gcrtc->current_fb);
+               }
+       } else {
++              printk(KERN_CRIT "Power off sequence\n");
+               jbt6k74_setpower(JBT_POWER_MODE_OFF);
+               glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
+               gcrtc->pixel_clock_on = 0;
+diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
+index 91651e7..56a3e3a 100644
+--- a/drivers/video/backlight/jbt6k74.c
++++ b/drivers/video/backlight/jbt6k74.c
+@@ -389,7 +389,7 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
+ {
+       int ret = -EINVAL;
+-      dev_dbg(&jbt->spi->dev, "entering (old_state=%s, new_state=%s)\n",
++      printk(KERN_CRIT "entering (old_state=%s, new_state=%s)\n",
+                       jbt_power_mode_names[jbt->power_mode],
+                       jbt_power_mode_names[new_mode]);
+@@ -825,7 +825,9 @@ EXPORT_SYMBOL_GPL(jbt6k74_finish_resolutionchange);
+ void jbt6k74_setpower(enum jbt_power_mode new_power)
+ {
++      printk(KERN_CRIT "About to set power..\n");
+       if ( !jbt_global ) return;
++      printk(KERN_CRIT "Setting JBT power.. %i\n", new_power);
+       jbt6k74_enter_power_mode(jbt_global, new_power);
+ }
+ EXPORT_SYMBOL_GPL(jbt6k74_setpower);
+-- 
+1.7.1
+
diff --git a/recipes/linux/linux-openmoko-2.6.32/0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch b/recipes/linux/linux-openmoko-2.6.32/0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch
deleted file mode 100644 (file)
index 287214b..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-From 644aab63501ebff3e819fd25d23c63da6b6e1cf5 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Mon, 8 Mar 2010 23:51:09 +0100
-Subject: [PATCH 14/15] Clean up JBT hooks, and allow resolution switching
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- arch/arm/mach-s3c2442/mach-gta02.c |    2 +-
- drivers/mfd/glamo/glamo-display.c  |   17 ++++++----
- drivers/video/backlight/jbt6k74.c  |   57 +++++++++++++++++++----------------
- include/linux/jbt6k74.h            |   14 +++++++++
- 4 files changed, 56 insertions(+), 34 deletions(-)
-
-diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c
-index a969037..b580b1b 100644
---- a/arch/arm/mach-s3c2442/mach-gta02.c
-+++ b/arch/arm/mach-s3c2442/mach-gta02.c
-@@ -229,7 +229,7 @@ static struct fb_videomode gta02_glamo_modes[] = {
-               .name = "240x320",
-               .xres = 240,
-               .yres = 320,
--              .pixclock       = 40816,
-+              .pixclock       = 100000,
-               .left_margin    = 8,
-               .right_margin   = 16,
-               .upper_margin   = 2,
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index 5f04697..e56cdb4 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -52,19 +52,18 @@
-  *
-  */
--#define DEBUG 1
--
- #include <drm/drmP.h>
- #include <drm/glamo_drm.h>
- #include <drm/drm_crtc_helper.h>
- #include <drm/drm_crtc.h>
-+#include <linux/glamofb.h>
-+#include <linux/jbt6k74.h>
- #include "glamo-core.h"
- #include "glamo-drm-private.h"
- #include "glamo-regs.h"
- #include "glamo-kms-fb.h"
- #include "glamo-display.h"
--#include <linux/glamofb.h>
- #define GLAMO_LCD_WIDTH_MASK 0x03FF
-@@ -356,6 +355,12 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       glamo_lcd_cmd_mode(gdrm, 0);
-+      if ( mode->hdisplay == 240 ) {
-+              jbt6k74_setresolution(JBT_RESOLUTION_QVGA);
-+      } else {
-+              jbt6k74_setresolution(JBT_RESOLUTION_VGA);
-+      }
-+
-       glamo_crtc_mode_set_base(crtc, 0, 0, old_fb);
-       gcrtc->current_mode = *mode;
-@@ -366,8 +371,6 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
- }
--extern void jbt6k74_action(int val);
--
- /* This is not the right place to switch power on/off, because the helper
-  * stuff ends up calling this before/after setting the mode.  We can't
-  * set modes with the display off (although backlight off would be OK) */
-@@ -385,14 +388,14 @@ void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
-       if ( mode ) {
-               glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-               gcrtc->pixel_clock_on = 1;
--              jbt6k74_action(1);
-+              jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
-               if ( gcrtc->current_mode_set ) {
-                       glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
-                                           &gcrtc->current_mode, 0, 0,
-                                           gcrtc->current_fb);
-               }
-       } else {
--              jbt6k74_action(0);
-+              jbt6k74_setpower(JBT_POWER_MODE_OFF);
-               glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-               gcrtc->pixel_clock_on = 0;
-       }
-diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
-index 9554cb3..40c31f6 100644
---- a/drivers/video/backlight/jbt6k74.c
-+++ b/drivers/video/backlight/jbt6k74.c
-@@ -101,15 +101,6 @@ enum jbt_register {
-       JBT_REG_HCLOCK_QVGA             = 0xed,
- };
--enum jbt_resolution {
--      JBT_RESOLUTION_VGA,
--      JBT_RESOLUTION_QVGA,
--};
--
--enum jbt_power_mode {
--      JBT_POWER_MODE_OFF,
--      JBT_POWER_MODE_NORMAL,
--};
- static const char *jbt_power_mode_names[] = {
-       [JBT_POWER_MODE_OFF]            = "off",
-@@ -121,6 +112,7 @@ static const char *jbt_resolution_names[] = {
-       [JBT_RESOLUTION_QVGA] = "qvga",
- };
-+
- struct jbt_info {
-       struct mutex lock;              /* protects this structure */
-       enum jbt_resolution resolution;
-@@ -139,6 +131,8 @@ struct jbt_info {
-       uint16_t reg_cache[0xEE];
- };
-+struct jbt_info *jbt_global;
-+
- #define JBT_COMMAND   0x000
- #define JBT_DATA      0x100
-@@ -401,8 +395,9 @@ static int jbt6k74_set_resolution(struct jbt_info *jbt,
-       if (jbt->power_mode == JBT_POWER_MODE_NORMAL) {
--              /* first transition into sleep */
-+              /* "Reboot" the LCM */
-               ret = jbt_normal_to_off(jbt);
-+              mdelay(1000);
-               ret |= jbt_off_to_normal(jbt);
-               if (ret) {
-@@ -609,22 +604,6 @@ static int jbt6k74_get_power(struct lcd_device *ld)
-       }
- }
--/* This is utterly, totally horrible.  I'm REALLY sorry... */
--struct jbt_info *jbt_global;
--void jbt6k74_action(int val)
--{
--      if ( !jbt_global ) {
--              printk(KERN_CRIT "JBT not initialised!!!\n");
--              return;
--      }
--      if ( val == 0 ) {
--              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_OFF);
--      } else {
--              jbt6k74_enter_power_mode(jbt_global, JBT_POWER_MODE_NORMAL);
--      }
--}
--EXPORT_SYMBOL_GPL(jbt6k74_action);
--
- struct lcd_ops jbt6k74_lcd_ops = {
-       .set_power = jbt6k74_set_power,
-       .get_power = jbt6k74_get_power,
-@@ -758,6 +737,32 @@ static int __devexit jbt_remove(struct spi_device *spi)
-       return 0;
- }
-+/* Begin horrible layering violations (in the interest of making stuff work) */
-+
-+int jbt6k74_setresolution(enum jbt_resolution new_resolution)
-+{
-+      if ( !jbt_global ) {
-+              printk(KERN_CRIT "JBT not initialised!!!\n");
-+              return -1;
-+      }
-+      jbt6k74_set_resolution(jbt_global, new_resolution);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(jbt6k74_setresolution);
-+
-+/* This is utterly, totally horrible.  I'm REALLY sorry... */
-+void jbt6k74_setpower(enum jbt_power_mode new_power)
-+{
-+      if ( !jbt_global ) {
-+              printk(KERN_CRIT "JBT not initialised!!!\n");
-+              return;
-+      }
-+      jbt6k74_enter_power_mode(jbt_global, new_power);
-+}
-+EXPORT_SYMBOL_GPL(jbt6k74_setpower);
-+
-+/* End horrible layering violations */
-+
- #ifdef CONFIG_PM
- static int jbt_suspend(struct spi_device *spi, pm_message_t state)
- {
-diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h
-index 4cf760c..f430e5a 100644
---- a/include/linux/jbt6k74.h
-+++ b/include/linux/jbt6k74.h
-@@ -3,6 +3,20 @@
- #include <linux/spi/spi.h>
-+enum jbt_resolution {
-+      JBT_RESOLUTION_VGA,
-+      JBT_RESOLUTION_QVGA,
-+};
-+
-+enum jbt_power_mode {
-+      JBT_POWER_MODE_OFF,
-+      JBT_POWER_MODE_NORMAL,
-+};
-+
-+extern void jbt6k74_setpower(enum jbt_power_mode new_power);
-+extern int jbt6k74_setresolution(enum jbt_resolution new_resolution);
-+
-+
- /*
-  *  struct jbt6k74_platform_data - Platform data for jbt6k74 driver
-  *  @probe_completed: Callback to be called when the driver has been
--- 
-1.7.0.2
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0014-Fix-claim-of-2D-register-resource.patch b/recipes/linux/linux-openmoko-2.6.32/0014-Fix-claim-of-2D-register-resource.patch
new file mode 100644 (file)
index 0000000..8dbdb70
--- /dev/null
@@ -0,0 +1,27 @@
+From 8c753fc51c4954b88bacba68ee0591fb673de8fc Mon Sep 17 00:00:00 2001
+From: Thomas White <taw@bitwiz.org.uk>
+Date: Thu, 6 May 2010 08:37:04 -0700
+Subject: [PATCH 14/14] Fix claim of 2D register resource
+
+Signed-off-by: Thomas White <taw@bitwiz.org.uk>
+---
+ drivers/mfd/glamo/glamo-drm-drv.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/mfd/glamo/glamo-drm-drv.c b/drivers/mfd/glamo/glamo-drm-drv.c
+index ee648c1..4f982ad 100644
+--- a/drivers/mfd/glamo/glamo-drm-drv.c
++++ b/drivers/mfd/glamo/glamo-drm-drv.c
+@@ -272,7 +272,8 @@ static int glamodrm_probe(struct platform_device *pdev)
+       }
+       /* Find the 2D engine */
+-      gdrm->twod_regs = platform_get_resource(pdev, IORESOURCE_MEM, 4);
++      gdrm->twod_regs = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++                                                     "glamo-2d-regs");
+       if ( !gdrm->twod_regs ) {
+               dev_err(&pdev->dev, "Unable to find 2D registers.\n");
+               rc = -ENOENT;
+-- 
+1.7.1
+
diff --git a/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch b/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch
deleted file mode 100644 (file)
index 4e7a8ab..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-From 986df52e3e02a1cdbf43eafccd483f0f86c696bd Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sun, 21 Mar 2010 20:55:18 +0100
-Subject: [PATCH 16/16] Enable display before trying to set mode or base
-
-This makes it possible to change mode when the screen is switched off.
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-display.c |   56 ++++++++++++++++++------------------
- 1 files changed, 28 insertions(+), 28 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index e56cdb4..24a1a31 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -267,9 +267,9 @@ static int glamo_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-       gdrm = gcrtc->gdrm;     /* Here it is! */
-       if ( !gcrtc->pixel_clock_on ) {
--              printk(KERN_WARNING "[glamo-drm] Refusing to set base while "
--                                  "pixel clock is off.\n");
--              return -EBUSY;
-+              printk(KERN_WARNING "[glamo-drm] Display is off - "
-+                                  "enabling it before setting base.\n");
-+              glamo_lcd_power(gdrm, 1);
-       }
-       gfb = to_glamo_framebuffer(crtc->fb);
-@@ -304,9 +304,9 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       gdrm = gcrtc->gdrm;     /* Here it is! */
-       if ( !gcrtc->pixel_clock_on ) {
--              printk(KERN_WARNING "[glamo-drm] Refusing to set mode while "
--                                  "pixel clock is off.\n");
--              return -EBUSY;
-+              printk(KERN_WARNING "[glamo-drm] Display is off - "
-+                                  "enabling it before setting mode.\n");
-+              glamo_lcd_power(gdrm, 1);
-       }
-       glamo_lcd_cmd_mode(gdrm, 1);
-@@ -380,28 +380,6 @@ static void glamo_crtc_dpms(struct drm_crtc *crtc, int mode)
- }
--void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
--{
--      struct drm_crtc *crtc = gdrm->crtc;
--      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
--
--      if ( mode ) {
--              glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
--              gcrtc->pixel_clock_on = 1;
--              jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
--              if ( gcrtc->current_mode_set ) {
--                      glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
--                                          &gcrtc->current_mode, 0, 0,
--                                          gcrtc->current_fb);
--              }
--      } else {
--              jbt6k74_setpower(JBT_POWER_MODE_OFF);
--              glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
--              gcrtc->pixel_clock_on = 0;
--      }
--}
--
--
- static void glamo_crtc_prepare(struct drm_crtc *crtc)
- {
- }
-@@ -862,6 +840,28 @@ int glamo_display_init(struct drm_device *dev)
- }
-+void glamo_lcd_power(struct glamodrm_handle *gdrm, int mode)
-+{
-+      struct drm_crtc *crtc = gdrm->crtc;
-+      struct glamo_crtc *gcrtc = to_glamo_crtc(crtc);
-+
-+      if ( mode ) {
-+              glamo_engine_enable(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-+              gcrtc->pixel_clock_on = 1;
-+              jbt6k74_setpower(JBT_POWER_MODE_NORMAL);
-+              if ( gcrtc->current_mode_set ) {
-+                      glamo_crtc_mode_set(crtc, &gcrtc->current_mode,
-+                                          &gcrtc->current_mode, 0, 0,
-+                                          gcrtc->current_fb);
-+              }
-+      } else {
-+              jbt6k74_setpower(JBT_POWER_MODE_OFF);
-+              glamo_engine_suspend(gdrm->glamo_core, GLAMO_ENGINE_LCD);
-+              gcrtc->pixel_clock_on = 0;
-+      }
-+}
-+
-+
- void glamo_display_suspend(struct glamodrm_handle *gdrm)
- {
-       /* do nothing */
--- 
-1.7.0.2
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch b/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch
deleted file mode 100644 (file)
index 3ce4d59..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From 1b83b6d7f2e1bf5473cd17a742737a1cfe450509 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Fri, 20 Nov 2009 22:06:30 +0100
-Subject: [PATCH 24/24] Fix KMS framebuffer physical address
-
-This allows "/dev/fb0" to work correctly with mmap().
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-kms-fb.c |    5 ++---
- 1 files changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c
-index 6d4b9ea..04de83b 100644
---- a/drivers/mfd/glamo/glamo-kms-fb.c
-+++ b/drivers/mfd/glamo/glamo-kms-fb.c
-@@ -387,9 +387,6 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width,
-       info->fbops = &glamofb_ops;
-       info->fix.line_length = fb->pitch;
--      info->fix.smem_start = dev->mode_config.fb_base
--                              + (unsigned long) gdrm->vram->start;
--      info->fix.smem_len = size;
-       info->flags = FBINFO_DEFAULT;
-@@ -401,6 +398,8 @@ int glamofb_create(struct drm_device *dev, uint32_t fb_width,
-               ret = -ENOSPC;
-               goto out_unref;
-       }
-+      info->fix.smem_start = (unsigned long)gdrm->vram->start + offs;
-+      info->fix.smem_len = size;
-       info->screen_size = size;
-       info->pseudo_palette = fb->pseudo_palette;
--- 
-1.7.0.4
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch b/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch
deleted file mode 100644 (file)
index 7201602..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 6a6957d634daa88f381e44353c98f27e4c39300a Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sun, 18 Apr 2010 14:25:14 +0200
-Subject: [PATCH 27/31] Reject modes with clock=0
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-display.c |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index 24a1a31..f57d273 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -522,6 +522,7 @@ static bool glamo_encoder_mode_fixup(struct drm_encoder *encoder,
-                                  struct drm_display_mode *mode,
-                                  struct drm_display_mode *adjusted_mode)
- {
-+      if ( mode->clock == 0 ) return false;
-       return true;
- }
--- 
-1.7.0.4
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch b/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch
deleted file mode 100644 (file)
index 6acefa3..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-From 6296b2623da88372bc6762160ba2a990cc99902c Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sat, 24 Apr 2010 21:04:46 +0200
-Subject: [PATCH 28/31] JBT6k74 tweaks: Make resolution switch work
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- arch/arm/mach-s3c2442/mach-gta02.c |    2 +-
- drivers/mfd/glamo/glamo-display.c  |    9 ++-
- drivers/video/backlight/jbt6k74.c  |  121 +++++++++++++++++++++++++++--------
- include/linux/jbt6k74.h            |    4 +-
- 4 files changed, 102 insertions(+), 34 deletions(-)
-
-diff --git a/arch/arm/mach-s3c2442/mach-gta02.c b/arch/arm/mach-s3c2442/mach-gta02.c
-index 8b59fa7..9a30687 100644
---- a/arch/arm/mach-s3c2442/mach-gta02.c
-+++ b/arch/arm/mach-s3c2442/mach-gta02.c
-@@ -246,7 +246,7 @@ static struct fb_videomode gta02_glamo_modes[] = {
-               .name = "240x320",
-               .xres = 240,
-               .yres = 320,
--              .pixclock       = 100000,
-+              .pixclock       = 40816,
-               .left_margin    = 8,
-               .right_margin   = 16,
-               .upper_margin   = 2,
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index f57d273..a551968 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -307,6 +307,7 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-               printk(KERN_WARNING "[glamo-drm] Display is off - "
-                                   "enabling it before setting mode.\n");
-               glamo_lcd_power(gdrm, 1);
-+              msleep(500);
-       }
-       glamo_lcd_cmd_mode(gdrm, 1);
-@@ -355,14 +356,14 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       glamo_lcd_cmd_mode(gdrm, 0);
-+      glamo_crtc_mode_set_base(crtc, 0, 0, old_fb);
-+
-       if ( mode->hdisplay == 240 ) {
--              jbt6k74_setresolution(JBT_RESOLUTION_QVGA);
-+              jbt6k74_finish_resolutionchange(JBT_RESOLUTION_QVGA);
-       } else {
--              jbt6k74_setresolution(JBT_RESOLUTION_VGA);
-+              jbt6k74_finish_resolutionchange(JBT_RESOLUTION_VGA);
-       }
--      glamo_crtc_mode_set_base(crtc, 0, 0, old_fb);
--
-       gcrtc->current_mode = *mode;
-       gcrtc->current_mode_set = 1;
-       gcrtc->current_fb = old_fb;
-diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
-index 40c31f6..43249ad 100644
---- a/drivers/video/backlight/jbt6k74.c
-+++ b/drivers/video/backlight/jbt6k74.c
-@@ -104,6 +104,7 @@ enum jbt_register {
- static const char *jbt_power_mode_names[] = {
-       [JBT_POWER_MODE_OFF]            = "off",
-+      [JBT_POWER_MODE_STANDBY]        = "standby",
-       [JBT_POWER_MODE_NORMAL]         = "normal",
- };
-@@ -148,6 +149,8 @@ static int jbt_reg_write_nodata(struct jbt_info *jbt, uint8_t reg)
-       else
-               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
-+      mdelay(1);
-+
-       return ret;
- }
-@@ -165,6 +168,8 @@ static int jbt_reg_write(struct jbt_info *jbt, uint8_t reg, uint8_t data)
-       else
-               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
-+      mdelay(1);
-+
-       return ret;
- }
-@@ -183,6 +188,8 @@ static int jbt_reg_write16(struct jbt_info *jbt, uint8_t reg, uint16_t data)
-       else
-               dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
-+      mdelay(1);
-+
-       return ret;
- }
-@@ -262,7 +269,7 @@ static int jbt_off_to_normal(struct jbt_info *jbt)
-       gpio_set_value_cansleep(pdata->gpio_reset, 1);
-       ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
--      mdelay(30);
-+      mdelay(120);
-       /* three times command zero */
-       ret |= jbt_reg_write_nodata(jbt, 0x00);
-@@ -334,6 +341,49 @@ static int jbt_normal_to_off(struct jbt_info *jbt)
- }
-+static int jbt_normal_to_standby(struct jbt_info *jbt)
-+{
-+      int ret;
-+
-+      if ( jbt->power_mode != JBT_POWER_MODE_NORMAL ) return 0;
-+
-+      /* Make sure we are 120 ms after SLEEP_{IN,OUT} */
-+      while (time_before(jiffies, jbt->next_sleep)) cpu_relax();
-+
-+      /* Sleep mode on */
-+      ret = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
-+      ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3);
-+
-+      ret |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
-+      jbt->next_sleep = jiffies + msecs_to_jiffies(150);
-+
-+      jbt->power_mode = JBT_POWER_MODE_STANDBY;
-+
-+      return ret ? -EIO : 0;
-+}
-+
-+
-+static int jbt_standby_to_normal(struct jbt_info *jbt)
-+{
-+      int ret;
-+
-+      if ( jbt->power_mode != JBT_POWER_MODE_STANDBY ) return 0;
-+
-+      /* Make sure we are 120 ms after SLEEP_{IN,OUT} */
-+      while (time_before(jiffies, jbt->next_sleep)) cpu_relax();
-+
-+      ret = jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
-+      jbt->next_sleep = jiffies + msecs_to_jiffies(150);
-+
-+      ret |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
-+      ret |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xdff9);
-+
-+      jbt->power_mode = JBT_POWER_MODE_NORMAL;
-+
-+      return ret ? -EIO : 0;
-+}
-+
-+
- static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-                                       enum jbt_power_mode new_mode)
- {
-@@ -354,6 +404,9 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-               case JBT_POWER_MODE_NORMAL:
-                       ret = jbt_off_to_normal(jbt);
-                       break;
-+              case JBT_POWER_MODE_STANDBY:
-+                      ret = -EINVAL;
-+                      break;
-               }
-               break;
-       case JBT_POWER_MODE_NORMAL:
-@@ -364,7 +417,14 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
-               case JBT_POWER_MODE_OFF:
-                       ret = jbt_normal_to_off(jbt);
-                       break;
-+              case JBT_POWER_MODE_STANDBY:
-+                      ret = -EINVAL;
-+                      break;
-               }
-+              break;
-+      case JBT_POWER_MODE_STANDBY:
-+              ret = -EINVAL;
-+              break;
-       }
-       if (ret == 0) {
-@@ -382,29 +442,46 @@ static int jbt6k74_enter_power_mode(struct jbt_info *jbt,
- static int jbt6k74_set_resolution(struct jbt_info *jbt,
-                                       enum jbt_resolution new_resolution)
- {
-+      int old_resolution;
-       int ret = 0;
--      enum jbt_resolution old_resolution;
-+
-+      if ( !jbt ) return -1;
-       mutex_lock(&jbt->lock);
--      if (jbt->resolution == new_resolution)
--              goto out_unlock;
-+      if ( jbt->resolution == new_resolution ) goto out_unlock;
-+      if ( jbt->power_mode == JBT_POWER_MODE_OFF ) goto out_unlock;
-       old_resolution = jbt->resolution;
-       jbt->resolution = new_resolution;
--      if (jbt->power_mode == JBT_POWER_MODE_NORMAL) {
-+      if ( jbt->power_mode == JBT_POWER_MODE_NORMAL ) {
-+
-+              ret = jbt_normal_to_standby(jbt);
-+
-+              mdelay(25);
-+
-+              if (jbt->resolution == JBT_RESOLUTION_VGA) {
-+                      /* Quad mode off */
-+                      ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);
-+                      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);
-+              } else {
-+                      /* Quad mode on */
-+                      ret |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
-+                      ret = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
-+              }
--              /* "Reboot" the LCM */
--              ret = jbt_normal_to_off(jbt);
--              mdelay(1000);
--              ret |= jbt_off_to_normal(jbt);
-+              mdelay(25);
-+
-+              ret |= jbt_standby_to_normal(jbt);
-               if (ret) {
-                       jbt->resolution = old_resolution;
--                      dev_err(&jbt->spi->dev, "Failed to set resolution '%s')\n",
-+                      dev_err(&jbt->spi->dev,
-+                              "Failed to set resolution '%s')\n",
-                               jbt_resolution_names[new_resolution]);
-               }
-+
-       }
- out_unlock:
-@@ -737,26 +814,18 @@ static int __devexit jbt_remove(struct spi_device *spi)
-       return 0;
- }
--/* Begin horrible layering violations (in the interest of making stuff work) */
-+/* Begin horrible layering violations in the interest of making stuff work */
--int jbt6k74_setresolution(enum jbt_resolution new_resolution)
-+int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution)
- {
--      if ( !jbt_global ) {
--              printk(KERN_CRIT "JBT not initialised!!!\n");
--              return -1;
--      }
--      jbt6k74_set_resolution(jbt_global, new_resolution);
--      return 0;
-+      if ( !jbt_global ) return 0;
-+      return jbt6k74_set_resolution(jbt_global, new_resolution);
- }
--EXPORT_SYMBOL_GPL(jbt6k74_setresolution);
-+EXPORT_SYMBOL_GPL(jbt6k74_finish_resolutionchange);
--/* This is utterly, totally horrible.  I'm REALLY sorry... */
- void jbt6k74_setpower(enum jbt_power_mode new_power)
- {
--      if ( !jbt_global ) {
--              printk(KERN_CRIT "JBT not initialised!!!\n");
--              return;
--      }
-+      if ( !jbt_global ) return;
-       jbt6k74_enter_power_mode(jbt_global, new_power);
- }
- EXPORT_SYMBOL_GPL(jbt6k74_setpower);
-@@ -770,10 +839,8 @@ static int jbt_suspend(struct spi_device *spi, pm_message_t state)
-       jbt->suspend_mode = jbt->power_mode;
--      printk(KERN_CRIT "[jbt] powering off for suspend\n");
-       jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_OFF);
--      printk(KERN_CRIT "[jbt] done\n");
-       dev_info(&spi->dev, "suspended\n");
-       return 0;
-@@ -784,13 +851,11 @@ int jbt6k74_resume(struct spi_device *spi)
-       struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
-       dev_info(&spi->dev, "starting resume: %d\n", jbt->suspend_mode);
--      printk(KERN_CRIT "[jbt] powering on for resume\n");
-       mdelay(20);
-       jbt->suspended = 0;
-       jbt6k74_enter_power_mode(jbt, jbt->suspend_mode);
--      printk(KERN_CRIT "[jbt] done\n");
-       dev_info(&spi->dev, "resumed: %d\n", jbt->suspend_mode);
-       return 0;
-diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h
-index f430e5a..2010bdc 100644
---- a/include/linux/jbt6k74.h
-+++ b/include/linux/jbt6k74.h
-@@ -10,11 +10,13 @@ enum jbt_resolution {
- enum jbt_power_mode {
-       JBT_POWER_MODE_OFF,
-+      JBT_POWER_MODE_STANDBY,
-       JBT_POWER_MODE_NORMAL,
- };
- extern void jbt6k74_setpower(enum jbt_power_mode new_power);
--extern int jbt6k74_setresolution(enum jbt_resolution new_resolution);
-+extern int jbt6k74_prepare_resolutionchange(enum jbt_resolution new_resolution);
-+extern int jbt6k74_finish_resolutionchange(enum jbt_resolution new_resolution);
- /*
--- 
-1.7.0.4
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch b/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch
deleted file mode 100644 (file)
index 7ec2a95..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 171e3f48e87b7ce366116b4dc5af5b1286c19554 Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sat, 24 Apr 2010 21:10:09 +0200
-Subject: [PATCH 29/31] Remove a couple of debugging messages
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-kms-fb.c |    4 ----
- 1 files changed, 0 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-kms-fb.c b/drivers/mfd/glamo/glamo-kms-fb.c
-index 04de83b..d76dd24 100644
---- a/drivers/mfd/glamo/glamo-kms-fb.c
-+++ b/drivers/mfd/glamo/glamo-kms-fb.c
-@@ -253,8 +253,6 @@ static void glamofb_on(struct fb_info *info)
-       struct drm_device *dev = par->dev;
-       struct glamodrm_handle *gdrm = dev->dev_private;
--      printk(KERN_CRIT "Turning on display...\n");
--
-       gdrm = dev->dev_private;
-       glamo_lcd_power(gdrm, 1);
-@@ -266,8 +264,6 @@ static void glamofb_off(struct fb_info *info, int dpms_mode)
-       struct drm_device *dev = par->dev;
-       struct glamodrm_handle *gdrm = dev->dev_private;
--      printk(KERN_CRIT "Turning off display...\n");
--
-       glamo_lcd_power(gdrm, 0);
- }
--- 
-1.7.0.4
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch b/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch
deleted file mode 100644 (file)
index 1e97ace..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From ed45a9c582b2626a7f44e9fe64ae313d9dcbfbfb Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Sat, 24 Apr 2010 21:45:38 +0200
-Subject: [PATCH 30/31] Enable dummy frames when switching resolution
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/video/backlight/jbt6k74.c |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
-index 43249ad..91651e7 100644
---- a/drivers/video/backlight/jbt6k74.c
-+++ b/drivers/video/backlight/jbt6k74.c
-@@ -217,7 +217,7 @@ static int jbt_init_regs(struct jbt_info *jbt)
-        * to avoid red / blue flicker
-        */
-       ret |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x00 | (1 << 5));
--      ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);
-+      ret |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0xff);
-       ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);
-       ret |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);
--- 
-1.7.0.4
-
diff --git a/recipes/linux/linux-openmoko-2.6.32/0025-Almost-make-rotation-work.patch b/recipes/linux/linux-openmoko-2.6.32/0025-Almost-make-rotation-work.patch
deleted file mode 100644 (file)
index 84132c7..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-From 2f37934f81b3f46ad5c3dac6484a2c3c255066fc Mon Sep 17 00:00:00 2001
-From: Thomas White <taw@bitwiz.org.uk>
-Date: Wed, 28 Apr 2010 00:09:00 +0200
-Subject: [PATCH 27/27] Almost make rotation work
-
-Signed-off-by: Thomas White <taw@bitwiz.org.uk>
----
- drivers/mfd/glamo/glamo-display.c |  171 ++++++++++++++++++++++++++++---------
- 1 files changed, 129 insertions(+), 42 deletions(-)
-
-diff --git a/drivers/mfd/glamo/glamo-display.c b/drivers/mfd/glamo/glamo-display.c
-index a551968..75ad734 100644
---- a/drivers/mfd/glamo/glamo-display.c
-+++ b/drivers/mfd/glamo/glamo-display.c
-@@ -298,6 +298,7 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-       struct glamodrm_handle *gdrm;
-       struct glamo_crtc *gcrtc;
-       int retr_start, retr_end, disp_start, disp_end;
-+      int rot;
-       /* Dig out our handle */
-       gcrtc = to_glamo_crtc(crtc);
-@@ -310,49 +311,135 @@ static int glamo_crtc_mode_set(struct drm_crtc *crtc,
-               msleep(500);
-       }
-+      /* Rotate? */
-+      if ( (mode->hdisplay == 640) && (mode->vdisplay == 480) ) {
-+              rot = GLAMO_LCD_ROT_MODE_90;
-+      } else if ( (mode->hdisplay == 480) && (mode->vdisplay == 640) ) {
-+              rot = GLAMO_LCD_ROT_MODE_0;
-+      } else if ( (mode->hdisplay == 320) && (mode->vdisplay == 240) ) {
-+              rot = GLAMO_LCD_ROT_MODE_90;
-+      } else if ( (mode->hdisplay == 240) && (mode->vdisplay == 320) ) {
-+              rot = GLAMO_LCD_ROT_MODE_0;
-+      } else {
-+              printk(KERN_WARNING "[glamo-drm] Couldn't choose rotation.\n");
-+              rot = GLAMO_LCD_ROT_MODE_0;
-+      }
-+
-       glamo_lcd_cmd_mode(gdrm, 1);
--      glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD, mode->clock);
--      gdrm->saved_clock = mode->clock;
-+      /* Set dimensions */
-+      if ( rot == GLAMO_LCD_ROT_MODE_0 ) {
-+
-+              glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
-+                                   mode->clock);
-+
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
-+                                   GLAMO_LCD_WIDTH_MASK, mode->hdisplay);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
-+                                   GLAMO_LCD_HEIGHT_MASK, mode->vdisplay);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
-+                                   GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
-+
-+              /* Set rotation */
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
-+                                   GLAMO_LCD_ROT_MODE_MASK, rot);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_MODE1,
-+                                   GLAMO_LCD_MODE1_ROTATE_EN,
-+                                   (rot != GLAMO_LCD_ROT_MODE_0) ?
-+                                     GLAMO_LCD_MODE1_ROTATE_EN : 0);
-+
-+              /* Convert "X modeline timings" into "Glamo timings" */
-+              retr_start = 0;
-+              retr_end = retr_start + mode->hsync_end - mode->hsync_start;
-+              disp_start = mode->htotal - mode->hsync_start;
-+              disp_end = disp_start + mode->hdisplay;
-+
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
-+                                   GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
-+                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
-+                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
-+                                   GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
-+                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
-+
-+              /* The same in the vertical direction */
-+              retr_start = 0;
-+              retr_end = retr_start + mode->vsync_end - mode->vsync_start;
-+              disp_start = mode->vtotal - mode->vsync_start;
-+              disp_end = disp_start + mode->vdisplay;
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
-+                                   GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
-+                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
-+                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
-+                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
-+                                   disp_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
-+                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
-+
-+      } else {
-+
-+              glamo_engine_reclock(gdrm->glamo_core, GLAMO_ENGINE_LCD,
-+                                   mode->clock/2);
-+
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
-+                                   GLAMO_LCD_WIDTH_MASK, mode->vdisplay);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
-+                                   GLAMO_LCD_HEIGHT_MASK, mode->hdisplay);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
-+                                   GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
-+
-+              /* Set rotation */
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
-+                                   GLAMO_LCD_ROT_MODE_MASK, rot);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_MODE1,
-+                                   GLAMO_LCD_MODE1_ROTATE_EN,
-+                                   (rot != GLAMO_LCD_ROT_MODE_0) ?
-+                                     GLAMO_LCD_MODE1_ROTATE_EN : 0);
-+
-+              /* Apply "vertical" numbers to the horizontal registers */
-+              retr_start = 0;
-+              retr_end = retr_start + mode->vsync_end - mode->vsync_start;
-+              disp_start = mode->vtotal - mode->vsync_start;
-+              disp_end = disp_start + mode->vdisplay;
-+
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
-+                                   GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
-+                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
-+                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
-+                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
-+                                   disp_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
-+                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
-+
-+              /* Apply "horizontal" numbers to the vertical registers */
-+              retr_start = 0;
-+              retr_end = retr_start + mode->hsync_end - mode->hsync_start;
-+              disp_start = mode->htotal - mode->hsync_start;
-+              disp_end = disp_start + mode->hdisplay;
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
-+                                   GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
-+                                   GLAMO_LCD_HV_RETR_START_MASK, retr_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
-+                                   GLAMO_LCD_HV_RETR_END_MASK, retr_end);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
-+                                   GLAMO_LCD_HV_RETR_DISP_START_MASK,
-+                                   disp_start);
-+              reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
-+                                   GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_WIDTH,
--                           GLAMO_LCD_WIDTH_MASK, mode->hdisplay);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HEIGHT,
--                           GLAMO_LCD_HEIGHT_MASK, mode->vdisplay);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_PITCH,
--                           GLAMO_LCD_PITCH_MASK, mode->hdisplay*2);
--
--      /* Convert "X modeline timings" into "Glamo timings" */
--      retr_start = 0;
--      retr_end = retr_start + mode->hsync_end - mode->hsync_start;
--      disp_start = mode->htotal - mode->hsync_start;
--      disp_end = disp_start + mode->hdisplay;
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_TOTAL,
--                           GLAMO_LCD_HV_TOTAL_MASK, mode->htotal);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_START,
--                           GLAMO_LCD_HV_RETR_START_MASK, retr_start);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_RETR_END,
--                           GLAMO_LCD_HV_RETR_END_MASK, retr_end);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_START,
--                           GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_HORIZ_DISP_END,
--                           GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
--
--      /* The same in the vertical direction */
--      retr_start = 0;
--      retr_end = retr_start + mode->vsync_end - mode->vsync_start;
--      disp_start = mode->vtotal - mode->vsync_start;
--      disp_end = disp_start + mode->vdisplay;
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_TOTAL,
--                           GLAMO_LCD_HV_TOTAL_MASK, mode->vtotal);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_START,
--                           GLAMO_LCD_HV_RETR_START_MASK, retr_start);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_RETR_END,
--                           GLAMO_LCD_HV_RETR_END_MASK, retr_end);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_START,
--                           GLAMO_LCD_HV_RETR_DISP_START_MASK, disp_start);
--      reg_set_bit_mask_lcd(gdrm, GLAMO_REG_LCD_VERT_DISP_END,
--                           GLAMO_LCD_HV_RETR_DISP_END_MASK, disp_end);
-+      }
-+
-+      gdrm->saved_clock = mode->clock;
-       glamo_lcd_cmd_mode(gdrm, 0);
-@@ -747,8 +834,8 @@ int glamo_display_init(struct drm_device *dev)
-       drm_mode_config_init(dev);
-       dev->mode_config.min_width = 240;
--      dev->mode_config.min_height = 320;
--      dev->mode_config.max_width = 480;
-+      dev->mode_config.min_height = 240;
-+      dev->mode_config.max_width = 640;
-       dev->mode_config.max_height = 640;
-       dev->mode_config.funcs = (void *)&glamo_mode_funcs;
--- 
-1.7.1
-
index fb84241..133e5af 100644 (file)
@@ -6,7 +6,7 @@ DESCRIPTION_${PN} = "Linux ${KERNEL_RELEASE} kernel for the Openmoko Neo GSM Sma
 KERNEL_RELEASE="2.6.32.13"
 
 SRCREV = "a9254be10ac2294ea20165a87c09ea6afcf66d94"
-OEV = "oe1"
+OEV = "oe2"
 PV = "${KERNEL_RELEASE}-${OEV}+gitr${SRCPV}"
 
 SRC_URI = "\
@@ -16,32 +16,22 @@ SRC_URI = "\
   ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${KERNEL_RELEASE}.bz2;patch=1;name=stablepatch \
 # build fix
   file://0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch;patch=1 \
-# patches from Weiss's gdrm-2.6.32 branch
-  file://0002-DRM-for-platform-devices.patch;patch=1 \
-  file://0003-Glamo-DRM-and-KMS-driver.patch;patch=1 \
-  file://0004-Work-on-Glamo-core-for-DRM.patch;patch=1 \
-  file://0005-Add-JBT6k74-hook-for-use-by-KMS.patch;patch=1 \
-  file://0006-glamo-drm-use-dev_set_drvdata-instead-of-setting-dri.patch;patch=1 \
-  file://0007-glamo-drm-select-DRM_KMS_HELPER-for-crtc-functions.patch;patch=1 \
-  file://0008-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch;patch=1 \
-  file://0009-A-couple-of-GEM-refcounting-fixes.patch;patch=1 \
-  file://0010-Simplify-the-JBT6k74-driver.patch;patch=1 \
-  file://0011-Don-t-choke-if-userspace-provides-a-pixel-clock-valu.patch;patch=1 \
-  file://0012-Report-all-FB-modes-given-by-the-lower-levels.patch;patch=1 \
-  file://0013-Change-connector-type-to-LVDS.patch;patch=1 \
-  file://0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch;patch=1 \
-  file://0015-Enable-display-before-trying-to-set-mode-or-base.patch;patch=1 \
-  file://0016-accels.patch.patch;patch=1 \
-  file://0017-usbhost.patch.patch;patch=1 \
-  file://0018-ar6000_delay.patch.patch;patch=1 \
-  file://0019-save_regs.patch.patch;patch=1 \
-  file://0020-Fix-KMS-framebuffer-physical-address.patch;patch=1 \
-  file://0021-Reject-modes-with-clock-0.patch;patch=1 \
-  file://0022-JBT6k74-tweaks-Make-resolution-switch-work.patch;patch=1 \
-  file://0023-Remove-a-couple-of-debugging-messages.patch;patch=1 \
-  file://0024-Enable-dummy-frames-when-switching-resolution.patch;patch=1 \
-  file://0025-Almost-make-rotation-work.patch;patch=1 \
-  file://0026-gta02-defconfigs-enable-LEDS_S3C24XX.patch;patch=1 \
+# patches from Radek Polak used in qtmoko
+  file://0002-accels.patch.patch;patch=1 \
+  file://0003-usbhost.patch.patch;patch=1 \
+  file://0004-ar6000_delay.patch.patch;patch=1 \
+  file://0005-save_regs.patch.patch;patch=1 \
+# defconfig updates
+  file://0006-gta02-defconfigs-enable-LEDS_S3C24XX-and-dummy-batte.patch;patch=1 \
+# patches from Weiss's gdrm-for-merging branch
+  file://0007-DRM-for-platform-devices.patch;patch=1 \
+  file://0008-Glamo-DRM-and-KMS-driver.patch;patch=1 \
+  file://0009-Work-on-Glamo-core-for-DRM.patch;patch=1 \
+  file://0010-JBT6k74-work-for-KMS.patch;patch=1 \
+  file://0011-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch;patch=1 \
+  file://0012-Fix-dynamic-command-queue-allocation.patch;patch=1 \
+  file://0013-Debug-statements-for-testing.patch;patch=1 \
+  file://0014-Fix-claim-of-2D-register-resource.patch;patch=1 \
 "
 
 SRC_URI[stablepatch.md5sum] = "ba6abb1ffee513a1d4f831599ddae490"