diff options
author | Denys Dmytriyenko <denis@denix.org> | 2010-05-17 16:16:34 -0400 |
---|---|---|
committer | Denys Dmytriyenko <denis@denix.org> | 2010-05-17 16:16:34 -0400 |
commit | a58f2237cb2254eb8bd2f0719220fed85462ebe5 (patch) | |
tree | 3ef3653bfe6bd81c682116840619439ca97197c1 | |
parent | 3e6d9e878c06293010eb3c815e28e0798b7dab65 (diff) | |
parent | 14e1ed70361f7f5a5e54d93a606a7c8d53460b95 (diff) |
Merge branch 'org.openembedded.dev' of git@git.openembedded.org:openembedded into org.openembedded.dev
32 files changed, 1204 insertions, 2346 deletions
diff --git a/recipes/freesmartphone/fsonetworkd_git.bb b/recipes/freesmartphone/fsonetworkd_git.bb index e64de8e96d..974ac3ccc7 100644 --- a/recipes/freesmartphone/fsonetworkd_git.bb +++ b/recipes/freesmartphone/fsonetworkd_git.bb @@ -3,4 +3,5 @@ inherit fso-plugin SRCREV = "${FSO_CORNUCOPIA_SRCREV}" PV = "0.1.0.0+gitr${SRCPV}" PE = "1" -PR = "${INC_PR}.2" +PR = "${INC_PR}.3" +RDEPENDS += "iptables" diff --git a/recipes/linux/linux-openmoko-2.6.32/0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch b/recipes/linux/linux-openmoko-2.6.32/0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch index c6a16ab4d5..52fe6262cc 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0001-wm8753-fix-build-with-gcc-4.4.2-which-works-ok-with-.patch @@ -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 diff --git a/recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0002-accels.patch.patch index 16f379d055..9644473eda 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0016-accels.patch.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0002-accels.patch.patch @@ -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, >a02_glamo_dev, @@ -224,7 +224,7 @@ index b580b1b..8e3cc91 100644 &s3c_device_timer[2], >a02_hdq_device, >a02_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 diff --git a/recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0003-usbhost.patch.patch index 16ed3746fd..80b05eac18 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0017-usbhost.patch.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0003-usbhost.patch.patch @@ -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[] = { >a02_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 diff --git a/recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0004-ar6000_delay.patch.patch index 54200d558f..104a8c8951 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0018-ar6000_delay.patch.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0004-ar6000_delay.patch.patch @@ -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 index 744004e7b1..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0005-Add-JBT6k74-hook-for-use-by-KMS.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch b/recipes/linux/linux-openmoko-2.6.32/0005-save_regs.patch.patch index 8fc2cea326..7873f850e4 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0019-save_regs.patch.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0005-save_regs.patch.patch @@ -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 index f685608253..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0006-glamo-drm-use-dev_set_drvdata-instead-of-setting-dri.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0026-gta02-defconfigs-enable-LEDS_S3C24XX.patch b/recipes/linux/linux-openmoko-2.6.32/0006-gta02-defconfigs-enable-LEDS_S3C24XX-and-dummy-batte.patch index 7a40345689..103c06c886 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0026-gta02-defconfigs-enable-LEDS_S3C24XX.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0006-gta02-defconfigs-enable-LEDS_S3C24XX-and-dummy-batte.patch @@ -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 diff --git a/recipes/linux/linux-openmoko-2.6.32/0002-DRM-for-platform-devices.patch b/recipes/linux/linux-openmoko-2.6.32/0007-DRM-for-platform-devices.patch index 4e47a088d0..e16379fecf 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0002-DRM-for-platform-devices.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0007-DRM-for-platform-devices.patch @@ -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 index 68751942a9..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0007-glamo-drm-select-DRM_KMS_HELPER-for-crtc-functions.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0003-Glamo-DRM-and-KMS-driver.patch b/recipes/linux/linux-openmoko-2.6.32/0008-Glamo-DRM-and-KMS-driver.patch index 6c1cc415d9..cb680f1ed5 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0003-Glamo-DRM-and-KMS-driver.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0008-Glamo-DRM-and-KMS-driver.patch @@ -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 | 374 +++++++++++++ + 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 index 7fb2fa8762..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0009-A-couple-of-GEM-refcounting-fixes.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0004-Work-on-Glamo-core-for-DRM.patch b/recipes/linux/linux-openmoko-2.6.32/0009-Work-on-Glamo-core-for-DRM.patch index 2bddd1758a..79b0ea4e0f 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0004-Work-on-Glamo-core-for-DRM.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0009-Work-on-Glamo-core-for-DRM.patch @@ -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 | 32 ++++++++++++++++++++++---------- 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 index 0000000000..2105ab60aa --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0010-JBT6k74-work-for-KMS.patch @@ -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 index ca0c2af15b..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0010-Simplify-the-JBT6k74-driver.patch +++ /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 index 0d47c1263f..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0011-Don-t-choke-if-userspace-provides-a-pixel-clock-valu.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32/0008-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch b/recipes/linux/linux-openmoko-2.6.32/0011-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch index f5da51ed95..0f5af99025 100644 --- a/recipes/linux/linux-openmoko-2.6.32/0008-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch +++ b/recipes/linux/linux-openmoko-2.6.32/0011-Fix-crash-when-reading-Glamo-registers-via-sysfs.patch @@ -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 index 0000000000..68e170a588 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0012-Fix-dynamic-command-queue-allocation.patch @@ -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 index ac19dbd5d2..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0012-Report-all-FB-modes-given-by-the-lower-levels.patch +++ /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 index 1b8c653607..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0013-Change-connector-type-to-LVDS.patch +++ /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 index 0000000000..cc58d1629e --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0013-Debug-statements-for-testing.patch @@ -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 index 287214b677..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0014-Clean-up-JBT-hooks-and-allow-resolution-switching.patch +++ /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 index 0000000000..8dbdb70ce2 --- /dev/null +++ b/recipes/linux/linux-openmoko-2.6.32/0014-Fix-claim-of-2D-register-resource.patch @@ -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 index 4e7a8abe10..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0015-Enable-display-before-trying-to-set-mode-or-base.patch +++ /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 index 3ce4d59042..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0020-Fix-KMS-framebuffer-physical-address.patch +++ /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 index 7201602551..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0021-Reject-modes-with-clock-0.patch +++ /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 index 6acefa3382..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0022-JBT6k74-tweaks-Make-resolution-switch-work.patch +++ /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 index 7ec2a9582e..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0023-Remove-a-couple-of-debugging-messages.patch +++ /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 index 1e97ace698..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0024-Enable-dummy-frames-when-switching-resolution.patch +++ /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 index 84132c7649..0000000000 --- a/recipes/linux/linux-openmoko-2.6.32/0025-Almost-make-rotation-work.patch +++ /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 - diff --git a/recipes/linux/linux-openmoko-2.6.32_git.bb b/recipes/linux/linux-openmoko-2.6.32_git.bb index fb842419dd..133e5afe2d 100644 --- a/recipes/linux/linux-openmoko-2.6.32_git.bb +++ b/recipes/linux/linux-openmoko-2.6.32_git.bb @@ -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" |