aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-omap-pm/dss2
diff options
context:
space:
mode:
authorKoen Kooi <k-kooi@ti.com>2009-09-30 10:26:42 +0200
committerKoen Kooi <koen@openembedded.org>2009-10-01 19:48:39 +0200
commit02b1862a3b96784cd8caeb5d86c331fa5bbc2b84 (patch)
tree5590c4f4da9f9923ab5b6a626a719ac662f4bc24 /recipes/linux/linux-omap-pm/dss2
parent6e779f0d529fa60a4a322868766b3bba3832a622 (diff)
downloadopenembedded-02b1862a3b96784cd8caeb5d86c331fa5bbc2b84.tar.gz
omap kernels: sync with .dev
Omap kernels in .dev have seen a big number of improvements, the most notable change being the mem-hole issue being resolved. Like the u-boot change this also adds support for new machines Signed-off-by: Koen Kooi <k-kooi@ti.com> Acked-by: Marcin Juszkiewicz <marcin@juszkiewicz.com.pl> Acked-by: Philip Balister <philip@balister.org>
Diffstat (limited to 'recipes/linux/linux-omap-pm/dss2')
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0001-OMAPFB-move-omapfb.h-to-include-linux.patch (renamed from recipes/linux/linux-omap-pm/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch)98
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch39
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0002-DSS2-OMAP2-3-Display-Subsystem-driver.patch (renamed from recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch)18
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP-framebuffer-driver.patch (renamed from recipes/linux/linux-omap-pm/dss2/0004-DSS2-OMAP-framebuffer-driver.patch)8
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0004-DSS2-Add-panel-drivers.patch (renamed from recipes/linux/linux-omap-pm/dss2/0005-DSS2-Add-panel-drivers.patch)8
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0005-DSS2-HACK-Add-DSS2-support-for-N800.patch (renamed from recipes/linux/linux-omap-pm/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch)34
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0006-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch (renamed from recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch)100
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-function-to-display-object-to-get-the-back.patch (renamed from recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-acx565akm-panel.patch (renamed from recipes/linux/linux-omap-pm/dss2/0009-DSS2-Add-acx565akm-panel.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0009-DSS2-Small-VRFB-context-allocation-bug-fixed.patch (renamed from recipes/linux/linux-omap-pm/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0010-DSS2-Allocated-memory-for-Color-Look-up-table.patch (renamed from recipes/linux/linux-omap-pm/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0011-DSS2-Fix-DMA-rotation.patch (renamed from recipes/linux/linux-omap-pm/dss2/0012-DSS2-Fix-DMA-rotation.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0012-DSS2-Verify-that-overlay-paddr-0.patch (renamed from recipes/linux/linux-omap-pm/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0013-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch (renamed from recipes/linux/linux-omap-pm/dss2/0014-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0014-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch (renamed from recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-improve-packet-len-calculation.patch (renamed from recipes/linux/linux-omap-pm/dss2/0016-DSS2-DSI-improve-packet-len-calculation.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0016-DSS2-Disable-video-planes-on-sync-lost-error.patch (renamed from recipes/linux/linux-omap-pm/dss2/0017-DSS2-Disable-video-planes-on-sync-lost-error.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0017-DSS2-check-for-ovl-paddr-only-when-enabling.patch (renamed from recipes/linux/linux-omap-pm/dss2/0018-DSS2-check-for-ovl-paddr-only-when-enabling.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0018-DSS2-Check-fclk-limits-when-configuring-video-plane.patch (renamed from recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-fclk-limits-when-configuring-video-plane.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-scaling-limits-against-proper-values.patch (renamed from recipes/linux/linux-omap-pm/dss2/0020-DSS2-Check-scaling-limits-against-proper-values.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0020-DSS2-Add-venc-register-dump.patch (renamed from recipes/linux/linux-omap-pm/dss2/0021-DSS2-Add-venc-register-dump.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0021-DSS2-FB-remove-unused-var-warning.patch (renamed from recipes/linux/linux-omap-pm/dss2/0022-DSS2-FB-remove-unused-var-warning.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0022-DSS2-pass-the-default-FB-color-format-through-board.patch (renamed from recipes/linux/linux-omap-pm/dss2/0023-DSS2-pass-the-default-FB-color-format-through-board.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0023-DSS2-Beagle-Use-gpio_set_value.patch (renamed from recipes/linux/linux-omap-pm/dss2/0024-DSS2-Beagle-Use-gpio_set_value.patch)14
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0024-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch (renamed from recipes/linux/linux-omap-pm/dss2/0025-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0025-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch (renamed from recipes/linux/linux-omap-pm/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0026-DSS2-VRFB-rotation-and-mirroring-implemented.patch (renamed from recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0027-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch (renamed from recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch (renamed from recipes/linux/linux-omap-pm/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0029-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch (renamed from recipes/linux/linux-omap-pm/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0030-DSS2-do-bootmem-reserve-for-exclusive-access.patch (renamed from recipes/linux/linux-omap-pm/dss2/0031-DSS2-do-bootmem-reserve-for-exclusive-access.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0031-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch (renamed from recipes/linux/linux-omap-pm/dss2/0032-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0032-DSS2-Prefer-3-tap-filter.patch (renamed from recipes/linux/linux-omap-pm/dss2/0033-DSS2-Prefer-3-tap-filter.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0033-DSS2-VRAM-improve-omap_vram_add_region.patch (renamed from recipes/linux/linux-omap-pm/dss2/0034-DSS2-VRAM-improve-omap_vram_add_region.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0034-DSS2-Added-the-function-pointer-for-getting-default.patch (renamed from recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-the-function-pointer-for-getting-default.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-support-for-setting-and-querying-alpha-b.patch (renamed from recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-setting-and-querying-alpha-b.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-querying-color-keying.patch (renamed from recipes/linux/linux-omap-pm/dss2/0037-DSS2-Added-support-for-querying-color-keying.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0037-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch (renamed from recipes/linux/linux-omap-pm/dss2/0038-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0038-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch (renamed from recipes/linux/linux-omap-pm/dss2/0039-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0039-DSS2-Provided-proper-exclusion-for-destination-colo.patch (renamed from recipes/linux/linux-omap-pm/dss2/0040-DSS2-Provided-proper-exclusion-for-destination-colo.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0040-DSS2-Disable-vertical-offset-with-fieldmode.patch (renamed from recipes/linux/linux-omap-pm/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0041-DSS2-Don-t-enable-fieldmode-automatically.patch (renamed from recipes/linux/linux-omap-pm/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0042-DSS2-Swap-field-0-and-field-1-registers.patch (renamed from recipes/linux/linux-omap-pm/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0043-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch (renamed from recipes/linux/linux-omap-pm/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0044-DSS2-Fixed-line-endings-from-to.patch (renamed from recipes/linux/linux-omap-pm/dss2/0045-DSS2-Fixed-line-endings-from-to.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0045-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch (renamed from recipes/linux/linux-omap-pm/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0046-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch (renamed from recipes/linux/linux-omap-pm/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0047-DSS2-VRAM-clear-allocated-area-with-DMA.patch (renamed from recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0048-DSS2-OMAPFB-remove-fb-clearing-code.patch (renamed from recipes/linux/linux-omap-pm/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch123
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-use-debugfs-not-procfs.patch (renamed from recipes/linux/linux-omap-pm/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0050-DSS2-VRAM-fix-section-mismatch-warning.patch (renamed from recipes/linux/linux-omap-pm/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0051-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch (renamed from recipes/linux/linux-omap-pm/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch)6
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0052-DSS2-DSI-more-error-handling.patch85
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0053-DSS2-Added-global-alpha-support.patch230
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0054-DSS2-Rotation-attrs-for-YUV-need-not-to-be-reversed.patch35
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0055-DSS2-Documentation-update-for-new-sysfs-entries-in.patch32
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0056-DSS2-Don-t-touch-plane-coordinates-when-changing-fb.patch56
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0057-DSS2-DSI-configure-ENTER-EXIT_HS_MODE_LATENCY.patch97
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0058-DSS2-Avoid-div-by-zero-when-calculating-required-fc.patch34
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0059-DSS2-VRFB-save-restore-context.patch106
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0060-DSS2-VRAM-Fix-indentation.patch65
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0061-DSS2-fix-the-usage-of-get_last_off_on_transaction_i.patch82
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0062-VRFB-fix-debug-messages.patch35
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0063-VRFB-add-suspend-resume-functionality.patch216
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0064-DSS2-DSI-tune-the-timings-to-be-more-relaxed.patch92
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0065-DSS2-VRFB-don-t-WARN-when-releasing-inactive-ctx.patch29
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0066-DSS2-Swap-field-offset-values-w-VRFB-rotation.patch65
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0067-DSS2-OMAP3EVM-Added-DSI-powerup-and-powerdown-func.patch125
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0068-DSS2-DSI-Improve-perf-measurement-output.patch127
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0069-DSS2-DSI-Add-support-for-external-TE-signal.patch110
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0070-DSS2-DSI-Fix-LP-clock.patch78
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0071-DSS2-Do-not-swap-xres-yres-or-change-rotation-in-ch.patch68
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0072-DSS2-Allow-independent-rotation-for-each-plane.patch277
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0073-DSS2-DISPC-fix-irq-handling-locking.patch225
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0074-DSS2-DISPC-clear-irqstatus-for-newly-enabled-irqs.patch39
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0075-DSS2-Add-WSS-support.patch172
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0076-DSS2-Fix-PAL-NTSC-timings.patch68
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0077-DSS2-Add-venc-debugfs-file.patch34
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0078-DSS2-Enable-replication-logic-feature.patch138
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0079-DSS2-support-for-querying-the-supported-overlay-col.patch180
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0080-DSS2-fix-uninitialized-var-in-OMAPFB_GET_CAPS-IOCTL.patch26
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0081-DSS2-Reset-WSS-data-only-when-changing-TV-standard.patch54
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0082-DSS2-DSI-implement-timeout-for-DSI-transfer.patch78
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0083-DSS2-DSI-reset-perf-frame-counter-when-starting-au.patch32
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0084-DSS2-DSI-Implement-DSI-bus-lock.patch265
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0085-DSS2-OMAPFB-omapfb_get_ovl_colormode-to-static.patch26
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0086-DSS2-VRFB-make-vrfb_hw_context-static.patch25
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0087-DSS2-new-device-driver-model.patch5336
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0088-DSS2-Board-file-changes-for-new-device-model.patch496
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0089-DSS2-Panel-driver-changes-for-new-device-model.patch400
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0090-DSS2-VENC-venc-uses-regulator-framework.patch74
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0091-DSS2-DSI-Use-regulator-framework.patch134
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0092-DSS2-SDP-regulators-for-VDAC-DSI.patch225
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0093-DSS2-Sharp-panel-use-regulator-fw.patch100
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0094-DSS2-Beagle-regulators-for-VDAC-DSI.patch52
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0095-DSS2-Fix-checkpatch-complaints.patch740
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0096-DSS2-Overo-add-vdac-dsi-regulators-fix-panel-name.patch278
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0097-DSS2-implement-overlay_manager_info.patch649
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0098-DSS2-use-sysfs_streq-to-compare-display-names.patch43
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0099-DSS2-Implement-function-to-verify-lcd-timings.patch144
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0100-DSS2-Remove-non-existing-dsi-power-funcs-from-dss.h.patch25
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0101-DSS2-move-to_dss_driver-and-to_dss_device-to-pu.patch40
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0102-DSS2-CLK-change-omapfb-omapdss-in-clock-framewo.patch53
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0103-DSS2-Use-clkdev.patch122
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0104-DSS2-Fix-documentation.patch38
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0105-DSS2-OMAPFB-first-set-TE-then-update-mode.patch38
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0106-DSS2-OMAPFB-Disable-forced-display-update-on-fb-cl.patch48
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0107-DSS2-DSI-use-INIT_COMPLETION-not-init_completion.patch25
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0108-DSS2-DSI-Rewrite-of-the-DSI-update-and-cmd-queue.patch1860
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0109-DSS2-let-init_display-return-an-error-code.patch235
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0110-DSS2-isolate-the-SDI-pads-when-SDI-is-disabled.patch209
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0111-DSS2-Fix-bottom-field-initial-starting-line.patch210
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0112-DSS2-Correctly-determine-if-an-interlaced-display-i.patch50
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0113-DSS2-Fix-omapfb-framebuffer-name.patch115
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0114-DSS2-Overo-update-defconfig-to-lighter-one.patch1217
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0115-DSS2-SDI-make-sdi_pads-static.patch26
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0116-DSS2-Fix-default_color-sysfs-output.patch26
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0117-DSS2-Locking-for-VRFB.patch125
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch54
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0119-DSS2-OMAPFB-remove-unneeded-locks.patch391
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0120-DSS2-DISPC-configuration-management.patch2006
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0121-DSS2-VRFB-clean-up-BUG-calls.patch70
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0122-DSS2-OMAPFB-don-t-fail-even-if-default-display-doe.patch139
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0123-DSS2-DSI-Fix-external-TE-wait.patch41
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0124-DSS2-DSI-Increase-framedone-timeout-to-1s.patch28
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0125-DSS2-VRAM-Add-function-to-get-free-vram-info.patch76
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0126-DSS2-OMAPFB-implement-OMAPFB_GET_VRAM_INFO-ioctl.patch86
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0127-DSS2-DSI-increase-dsi-thread-priority.patch37
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0128-DSS2-DSI-check-bus_lock-in-send_bta.patch28
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0129-DSS2-DSI-export-dsi_vc_send_bta_sync.patch47
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0130-DSS2-DSI-clear-BTA-irq-before-enabling-it.patch26
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0131-DSS2-DSI-check-dsi_set_te-return-value.patch62
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0132-DSS2-DSI-use-only-1-VC.-Fixes-to-TE.patch406
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0133-DSS2-VRAM-Remove-unused-defines.patch41
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0134-DSS2-VENC-Add-invert_polarity-flag.patch65
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0135-DSS2-VRAM-Add-defines-for-VRAM-types.patch89
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0136-DSS2-VRAM-separate-VRAM-setup-from-the-old-fb-vram.patch311
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0137-DSS2-VRFB-Update-license-information.patch77
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0138-DSS2-VRAM-Update-license-information.patch86
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0139-DSS2-VRFB-use-pr_-instead-of-printk.patch43
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0140-DSS2-VRAM-Change-CONFIG_OMAP2_DSS_VRAM_SIZE-name.patch49
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0141-DSS2-VRAM-add-CONFIG_OMAP2_VRAM-flag.patch141
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0142-DSS2-VRFB-Add-CONFIG_OMAP2_VRFB-flag.patch61
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0143-DSS2-VRFB-VRAM-fix-checkpatch-warnings.patch41
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0144-DSS2-fixes-to-dss_omap_3430sdp_defconfig-to-make-it.patch1675
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0145-DSS2-BEAGLE-get-DSS2-working-again-on-beagle.patch724
-rw-r--r--recipes/linux/linux-omap-pm/dss2/0146-DSS2-change-include-asm-.-to-linux-.-in-oma.patch29
148 files changed, 23746 insertions, 428 deletions
diff --git a/recipes/linux/linux-omap-pm/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch b/recipes/linux/linux-omap-pm/dss2/0001-OMAPFB-move-omapfb.h-to-include-linux.patch
index 5873ae280c..90151db610 100644
--- a/recipes/linux/linux-omap-pm/dss2/0002-OMAPFB-move-omapfb.h-to-include-linux.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0001-OMAPFB-move-omapfb.h-to-include-linux.patch
@@ -1,7 +1,7 @@
-From 02243f13eec816e11d16676a131bc04b8a0666ab Mon Sep 17 00:00:00 2001
+From 6ded8e833fa9559202dbd4c70a1bd95ffffacc5d Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Wed, 11 Feb 2009 16:33:02 +0200
-Subject: [PATCH] OMAPFB: move omapfb.h to include/linux/
+Subject: [PATCH 001/146] OMAPFB: move omapfb.h to include/linux/
This is needed so that omapfb.h is automatically exported to user space.
@@ -32,7 +32,6 @@ Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
drivers/video/omap/lcd_omap3evm.c | 2 +-
drivers/video/omap/lcd_osk.c | 2 +-
drivers/video/omap/lcd_overo.c | 2 +-
- drivers/video/omap/lcd_p2.c | 2 +-
drivers/video/omap/lcd_palmte.c | 2 +-
drivers/video/omap/lcd_palmtt.c | 2 +-
drivers/video/omap/lcd_palmz71.c | 3 +-
@@ -41,12 +40,12 @@ Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
drivers/video/omap/rfbi.c | 3 +-
drivers/video/omap/sossi.c | 2 +-
include/linux/omapfb.h | 398 ++++++++++++++++++++++++++++++
- 31 files changed, 427 insertions(+), 430 deletions(-)
+ 30 files changed, 426 insertions(+), 429 deletions(-)
delete mode 100644 arch/arm/plat-omap/include/mach/omapfb.h
create mode 100644 include/linux/omapfb.h
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
-index 8780ca6..ca4680a 100644
+index ed2a48a..63be1bc 100644
--- a/arch/arm/mach-omap1/board-nokia770.c
+++ b/arch/arm/mach-omap1/board-nokia770.c
@@ -18,6 +18,7 @@
@@ -62,29 +61,49 @@ index 8780ca6..ca4680a 100644
#include <mach/common.h>
#include <mach/dsp_common.h>
-#include <mach/omapfb.h>
+ #include <mach/hwa742.h>
#include <mach/lcd_mipid.h>
#include <mach/mmc.h>
- #include <mach/usb.h>
diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c
-index cb32b61..f6f6571 100644
+index 23296e9..e2907ac 100644
--- a/arch/arm/mach-omap2/board-n800.c
+++ b/arch/arm/mach-omap2/board-n800.c
-@@ -27,6 +27,7 @@
- #include <linux/i2c/lm8323.h>
- #include <linux/i2c/menelaus.h>
- #include <linux/i2c/lp5521.h>
+@@ -22,6 +22,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/i2c.h>
+#include <linux/omapfb.h>
#include <mach/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
-@@ -39,7 +40,6 @@
+@@ -34,7 +35,6 @@
#include <mach/lcd_mipid.h>
#include <mach/clock.h>
- #include <mach/gpio-switch.h>
+ #include <mach/menelaus.h>
-#include <mach/omapfb.h>
#include <mach/blizzard.h>
+ #include <mach/onenand.h>
+ #include <mach/board-nokia.h>
+diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
+index 3a86b0f..5c91f36 100644
+--- a/arch/arm/mach-omap2/io.c
++++ b/arch/arm/mach-omap2/io.c
+@@ -20,6 +20,7 @@
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
++#include <linux/omapfb.h>
+ #include <linux/io.h>
+ #include <linux/clk.h>
- #include <../drivers/cbus/tahvo.h>
+@@ -28,7 +29,6 @@
+ #include <asm/mach/map.h>
+
+ #include <mach/mux.h>
+-#include <mach/omapfb.h>
+ #include <mach/sram.h>
+ #include <mach/sdrc.h>
+ #include <mach/gpmc.h>
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c
index 3746222..40615a6 100644
--- a/arch/arm/plat-omap/fb.c
@@ -509,7 +528,7 @@ index b226bdf..0000000
-
-#endif /* __OMAPFB_H */
diff --git a/drivers/video/omap/blizzard.c b/drivers/video/omap/blizzard.c
-index f60a233..8121c09 100644
+index d5e5955..56097ae 100644
--- a/drivers/video/omap/blizzard.c
+++ b/drivers/video/omap/blizzard.c
@@ -25,9 +25,9 @@
@@ -524,7 +543,7 @@ index f60a233..8121c09 100644
#include "dispc.h"
diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c
-index c140c21..1915af5 100644
+index 350b444..9f04e34 100644
--- a/drivers/video/omap/dispc.c
+++ b/drivers/video/omap/dispc.c
@@ -24,9 +24,9 @@
@@ -539,7 +558,7 @@ index c140c21..1915af5 100644
#include "dispc.h"
diff --git a/drivers/video/omap/hwa742.c b/drivers/video/omap/hwa742.c
-index f24df0b..9b4c506 100644
+index ca51583..e93a51b 100644
--- a/drivers/video/omap/hwa742.c
+++ b/drivers/video/omap/hwa742.c
@@ -25,9 +25,9 @@
@@ -554,7 +573,7 @@ index f24df0b..9b4c506 100644
#define HWA742_REV_CODE_REG 0x0
diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c
-index a22b452..1252cc3 100644
+index 13c822e..e199bba 100644
--- a/drivers/video/omap/lcd_2430sdp.c
+++ b/drivers/video/omap/lcd_2430sdp.c
@@ -26,9 +26,9 @@
@@ -569,18 +588,15 @@ index a22b452..1252cc3 100644
#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91
diff --git a/drivers/video/omap/lcd_ams_delta.c b/drivers/video/omap/lcd_ams_delta.c
-index 3fd5342..4d54725 100644
+index 1f74399..e480b6b 100644
--- a/drivers/video/omap/lcd_ams_delta.c
+++ b/drivers/video/omap/lcd_ams_delta.c
-@@ -24,13 +24,13 @@
-
- #include <linux/module.h>
+@@ -24,10 +24,10 @@
#include <linux/platform_device.h>
+ #include <linux/io.h>
+ #include <linux/delay.h>
+#include <linux/omapfb.h>
- #include <asm/delay.h>
- #include <asm/io.h>
-
#include <mach/board-ams-delta.h>
#include <mach/hardware.h>
-#include <mach/omapfb.h>
@@ -588,7 +604,7 @@ index 3fd5342..4d54725 100644
#define AMS_DELTA_DEFAULT_CONTRAST 112
diff --git a/drivers/video/omap/lcd_apollon.c b/drivers/video/omap/lcd_apollon.c
-index beae5d9..e3b2224 100644
+index 626ae3a..15a0ced 100644
--- a/drivers/video/omap/lcd_apollon.c
+++ b/drivers/video/omap/lcd_apollon.c
@@ -23,10 +23,10 @@
@@ -679,7 +695,7 @@ index 8925230..1c25186 100644
#define LCD_PANEL_BACKLIGHT_GPIO (15 + OMAP_MAX_GPIO_LINES)
diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c
-index 1895997..4b28005 100644
+index 3165d3d..025ee97 100644
--- a/drivers/video/omap/lcd_mipid.c
+++ b/drivers/video/omap/lcd_mipid.c
@@ -22,8 +22,8 @@
@@ -691,7 +707,7 @@ index 1895997..4b28005 100644
-#include <mach/omapfb.h>
#include <mach/lcd_mipid.h>
- #include "../../cbus/tahvo.h"
+ #define MIPID_MODULE_NAME "lcd_mipid"
diff --git a/drivers/video/omap/lcd_omap2evm.c b/drivers/video/omap/lcd_omap2evm.c
index 2fc46c2..1908a2b 100644
--- a/drivers/video/omap/lcd_omap2evm.c
@@ -708,7 +724,7 @@ index 2fc46c2..1908a2b 100644
#define LCD_PANEL_ENABLE_GPIO 154
diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c
-index eae43e4..6be117e 100644
+index 40454dc..dbb832c 100644
--- a/drivers/video/omap/lcd_omap3beagle.c
+++ b/drivers/video/omap/lcd_omap3beagle.c
@@ -24,9 +24,9 @@
@@ -769,22 +785,6 @@ index 2bc5c92..40c2026 100644
#include <asm/mach-types.h>
#define LCD_ENABLE 144
-diff --git a/drivers/video/omap/lcd_p2.c b/drivers/video/omap/lcd_p2.c
-index dd40fd7..bc5abef 100644
---- a/drivers/video/omap/lcd_p2.c
-+++ b/drivers/video/omap/lcd_p2.c
-@@ -24,10 +24,10 @@
- #include <linux/module.h>
- #include <linux/delay.h>
- #include <linux/platform_device.h>
-+#include <linux/omapfb.h>
-
- #include <mach/mux.h>
- #include <mach/gpio.h>
--#include <mach/omapfb.h>
-
- /*
- * File: epson-md-tft.h
diff --git a/drivers/video/omap/lcd_palmte.c b/drivers/video/omap/lcd_palmte.c
index 2183173..dcb456c 100644
--- a/drivers/video/omap/lcd_palmte.c
@@ -845,7 +845,7 @@ index ab39492..633e33c 100644
#include <asm/mach-types.h>
diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c
-index 3bb4247..c6306af 100644
+index 0df4523..a06f964 100644
--- a/drivers/video/omap/omapfb_main.c
+++ b/drivers/video/omap/omapfb_main.c
@@ -27,9 +27,9 @@
@@ -860,7 +860,7 @@ index 3bb4247..c6306af 100644
#include "lcdc.h"
#include "dispc.h"
diff --git a/drivers/video/omap/rfbi.c b/drivers/video/omap/rfbi.c
-index 29fa368..118cfa9 100644
+index ee01e84..9040678 100644
--- a/drivers/video/omap/rfbi.c
+++ b/drivers/video/omap/rfbi.c
@@ -26,8 +26,7 @@
@@ -874,7 +874,7 @@ index 29fa368..118cfa9 100644
#include "dispc.h"
diff --git a/drivers/video/omap/sossi.c b/drivers/video/omap/sossi.c
-index cc697cc..ff9dd71 100644
+index a769462..cab398f 100644
--- a/drivers/video/omap/sossi.c
+++ b/drivers/video/omap/sossi.c
@@ -23,9 +23,9 @@
@@ -1293,5 +1293,5 @@ index 0000000..b226bdf
+
+#endif /* __OMAPFB_H */
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch b/recipes/linux/linux-omap-pm/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch
deleted file mode 100644
index aeab62f105..0000000000
--- a/recipes/linux/linux-omap-pm/dss2/0001-Revert-gro-Fix-legacy-path-napi_complete-crash.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 26abf45ac80be4c54a63fecf1c3c1e1efb416e0a Mon Sep 17 00:00:00 2001
-From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
-Date: Wed, 1 Apr 2009 18:27:09 +0300
-Subject: [PATCH] Revert "gro: Fix legacy path napi_complete crash"
-
-This reverts commit 303c6a0251852ecbdc5c15e466dcaff5971f7517.
-
-Fixes USB network problems
----
- net/core/dev.c | 5 ++---
- 1 files changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/net/core/dev.c b/net/core/dev.c
-index e3fe5c7..c1e9dc0 100644
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -2588,9 +2588,9 @@ static int process_backlog(struct napi_struct *napi, int quota)
- local_irq_disable();
- skb = __skb_dequeue(&queue->input_pkt_queue);
- if (!skb) {
-+ __napi_complete(napi);
- local_irq_enable();
-- napi_complete(napi);
-- goto out;
-+ break;
- }
- local_irq_enable();
-
-@@ -2599,7 +2599,6 @@ static int process_backlog(struct napi_struct *napi, int quota)
-
- napi_gro_flush(napi);
-
--out:
- return work;
- }
-
---
-1.5.6.5
-
diff --git a/recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch b/recipes/linux/linux-omap-pm/dss2/0002-DSS2-OMAP2-3-Display-Subsystem-driver.patch
index c3523362c6..0b8e2e2c6b 100644
--- a/recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP2-3-Display-Subsystem-driver.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0002-DSS2-OMAP2-3-Display-Subsystem-driver.patch
@@ -1,7 +1,7 @@
-From 284deec412f9c6f15c971d8eaf4d0156a51a2f3b Mon Sep 17 00:00:00 2001
+From 8dd3bdbcdeba2b9ebba84ac6dde99c3673c08437 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 10:23:42 +0300
-Subject: [PATCH] DSS2: OMAP2/3 Display Subsystem driver
+Subject: [PATCH 002/146] DSS2: OMAP2/3 Display Subsystem driver
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
---
@@ -372,7 +372,7 @@ index 0000000..9e902a2
+- Not sure if needed
+
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
-index 3ebc09e..e6146b2 100644
+index a832795..cfc0967 100644
--- a/arch/arm/plat-omap/Makefile
+++ b/arch/arm/plat-omap/Makefile
@@ -4,7 +4,7 @@
@@ -1789,11 +1789,11 @@ index 0000000..7e0f8fc
+EXPORT_SYMBOL(omap_vrfb_request_ctx);
+
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index fb19803..8b3752b 100644
+index d6d65ef..95e03fd 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
-@@ -2132,6 +2132,7 @@ config FB_MX3
- an LCD display with your i.MX31 system, say Y here.
+@@ -2146,6 +2146,7 @@ config FB_BROADSHEET
+ a bridge adapter.
source "drivers/video/omap/Kconfig"
+source "drivers/video/omap2/Kconfig"
@@ -1801,10 +1801,10 @@ index fb19803..8b3752b 100644
source "drivers/video/backlight/Kconfig"
source "drivers/video/display/Kconfig"
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index 2a998ca..1db8dd4 100644
+index 01a819f..01bf7a5 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
-@@ -120,6 +120,7 @@ obj-$(CONFIG_FB_SM501) += sm501fb.o
+@@ -123,6 +123,7 @@ obj-$(CONFIG_FB_SM501) += sm501fb.o
obj-$(CONFIG_FB_XILINX) += xilinxfb.o
obj-$(CONFIG_FB_SH_MOBILE_LCDC) += sh_mobile_lcdcfb.o
obj-$(CONFIG_FB_OMAP) += omap/
@@ -14446,5 +14446,5 @@ index 0000000..aceed9f
+ display->check_timings = venc_check_timings;
+}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0004-DSS2-OMAP-framebuffer-driver.patch b/recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP-framebuffer-driver.patch
index 09afa7e5be..994bd23b82 100644
--- a/recipes/linux/linux-omap-pm/dss2/0004-DSS2-OMAP-framebuffer-driver.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0003-DSS2-OMAP-framebuffer-driver.patch
@@ -1,7 +1,7 @@
-From db9314f01a207e256d545244d3d00dc4ce535280 Mon Sep 17 00:00:00 2001
+From 0612cfdea0354b6c8b2deacbcd805427fb3b4c1f Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 10:25:48 +0300
-Subject: [PATCH] DSS2: OMAP framebuffer driver
+Subject: [PATCH 003/146] DSS2: OMAP framebuffer driver
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
---
@@ -62,7 +62,7 @@ index 40615a6..1dc3415 100644
void omapfb_reserve_sdram(void) {}
diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig
-index c355b59..a1c10de 100644
+index 551e3e9..455c605 100644
--- a/drivers/video/omap/Kconfig
+++ b/drivers/video/omap/Kconfig
@@ -1,6 +1,7 @@
@@ -3399,5 +3399,5 @@ index b226bdf..96190b2 100644
extern void omapfb_register_panel(struct lcd_panel *panel);
extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0005-DSS2-Add-panel-drivers.patch b/recipes/linux/linux-omap-pm/dss2/0004-DSS2-Add-panel-drivers.patch
index d12586ca2f..47b52269aa 100644
--- a/recipes/linux/linux-omap-pm/dss2/0005-DSS2-Add-panel-drivers.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0004-DSS2-Add-panel-drivers.patch
@@ -1,7 +1,7 @@
-From 4cc0368574f587f448231ccd121266bed4bf9729 Mon Sep 17 00:00:00 2001
+From 7764c7b96f5c101584226238b799cb89bca80749 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 10:29:56 +0300
-Subject: [PATCH] DSS2: Add panel drivers
+Subject: [PATCH 004/146] DSS2: Add panel drivers
- Generic panel
- Samsung LTE430WQ-F0C LCD Panel
@@ -254,7 +254,7 @@ index 0000000..e4bb781
+ .vfp = 4,
+ .vbp = 12-10,
+ },
-+ .recommended_bpp = 16,
++
+ .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IVS,
+};
+
@@ -392,5 +392,5 @@ index 0000000..1f99150
+module_exit(sharp_ls_panel_drv_exit);
+MODULE_LICENSE("GPL");
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch b/recipes/linux/linux-omap-pm/dss2/0005-DSS2-HACK-Add-DSS2-support-for-N800.patch
index 0025f1aa8b..5dd90a4f22 100644
--- a/recipes/linux/linux-omap-pm/dss2/0006-DSS2-HACK-Add-DSS2-support-for-N800.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0005-DSS2-HACK-Add-DSS2-support-for-N800.patch
@@ -1,7 +1,7 @@
-From 18a25382e81c03230e022ca2eb7e0fce24479d6a Mon Sep 17 00:00:00 2001
+From 0fb0c230f94ff7e513db42dae9765c0b86234de8 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 10:31:57 +0300
-Subject: [PATCH] DSS2: HACK: Add DSS2 support for N800
+Subject: [PATCH 005/146] DSS2: HACK: Add DSS2 support for N800
Works, but it an ugly quick hack.
@@ -17,19 +17,19 @@ Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
create mode 100644 drivers/video/omap2/displays/panel-n800.c
diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c
-index f6f6571..6de60ae 100644
+index e2907ac..3f1071b 100644
--- a/arch/arm/mach-omap2/board-n800.c
+++ b/arch/arm/mach-omap2/board-n800.c
-@@ -41,6 +41,8 @@
- #include <mach/clock.h>
- #include <mach/gpio-switch.h>
+@@ -38,6 +38,8 @@
#include <mach/blizzard.h>
+ #include <mach/onenand.h>
+ #include <mach/board-nokia.h>
+#include <mach/display.h>
+#include <mach/vram.h>
#include <../drivers/cbus/tahvo.h>
#include <../drivers/media/video/tcm825x.h>
-@@ -161,23 +163,176 @@ static struct omap_uart_config n800_uart_config __initdata = {
+@@ -98,23 +100,176 @@ static struct omap_uart_config n800_uart_config __initdata = {
#include "../../../drivers/cbus/retu.h"
@@ -216,7 +216,7 @@ index f6f6571..6de60ae 100644
static void mipid_shutdown(struct mipid_platform_data *pdata)
{
if (pdata->nreset_gpio != -1) {
-@@ -191,6 +346,7 @@ static struct mipid_platform_data n800_mipid_platform_data = {
+@@ -128,6 +283,7 @@ static struct mipid_platform_data n800_mipid_platform_data = {
.shutdown = mipid_shutdown,
};
@@ -224,7 +224,7 @@ index f6f6571..6de60ae 100644
static void __init mipid_dev_init(void)
{
const struct omap_lcd_config *conf;
-@@ -201,26 +357,9 @@ static void __init mipid_dev_init(void)
+@@ -138,26 +294,9 @@ static void __init mipid_dev_init(void)
n800_mipid_platform_data.data_lines = conf->data_lines;
}
}
@@ -253,7 +253,7 @@ index f6f6571..6de60ae 100644
static void blizzard_enable_clocks(int enable)
{
if (enable)
-@@ -265,14 +404,12 @@ static void __init blizzard_dev_init(void)
+@@ -202,14 +341,12 @@ static void __init blizzard_dev_init(void)
gpio_direction_output(N800_BLIZZARD_POWERDOWN_GPIO, 1);
blizzard_get_clocks();
@@ -270,7 +270,7 @@ index f6f6571..6de60ae 100644
{ OMAP_TAG_TMP105, &n800_tmp105_config },
};
-@@ -379,7 +516,7 @@ static struct omap2_mcspi_device_config tsc2005_mcspi_config = {
+@@ -257,7 +394,7 @@ static struct omap2_mcspi_device_config cx3110x_mcspi_config = {
static struct spi_board_info n800_spi_board_info[] __initdata = {
{
@@ -279,7 +279,7 @@ index f6f6571..6de60ae 100644
.bus_num = 1,
.chip_select = 1,
.max_speed_hz = 4000000,
-@@ -404,7 +541,7 @@ static struct spi_board_info n800_spi_board_info[] __initdata = {
+@@ -281,7 +418,7 @@ static struct spi_board_info n800_spi_board_info[] __initdata = {
static struct spi_board_info n810_spi_board_info[] __initdata = {
{
@@ -288,7 +288,7 @@ index f6f6571..6de60ae 100644
.bus_num = 1,
.chip_select = 1,
.max_speed_hz = 4000000,
-@@ -582,6 +719,7 @@ static struct platform_device *n800_devices[] __initdata = {
+@@ -390,6 +527,7 @@ static struct platform_device *n800_devices[] __initdata = {
#if defined(CONFIG_CBUS_RETU_HEADSET)
&retu_headset_device,
#endif
@@ -296,7 +296,7 @@ index f6f6571..6de60ae 100644
};
#ifdef CONFIG_MENELAUS
-@@ -713,9 +851,10 @@ void __init nokia_n800_common_init(void)
+@@ -554,9 +692,10 @@ void __init nokia_n800_common_init(void)
if (machine_is_nokia_n810())
i2c_register_board_info(2, n810_i2c_board_info_2,
ARRAY_SIZE(n810_i2c_board_info_2));
@@ -307,10 +307,10 @@ index f6f6571..6de60ae 100644
+ //mipid_dev_init();
+ //blizzard_dev_init();
+ n800_display_init();
+ board_onenand_init();
}
- static void __init nokia_n800_init(void)
-@@ -735,6 +874,7 @@ void __init nokia_n800_map_io(void)
+@@ -575,6 +714,7 @@ void __init nokia_n800_map_io(void)
omap_board_config_size = ARRAY_SIZE(n800_config);
omap2_set_globals_242x();
@@ -1075,5 +1075,5 @@ index 0000000..91d3e37
+MODULE_DESCRIPTION("N800 LCD Driver");
+MODULE_LICENSE("GPL");
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch b/recipes/linux/linux-omap-pm/dss2/0006-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch
index 62d653700e..6073d22d20 100644
--- a/recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0006-DSS2-Add-DSS2-support-for-SDP-Beagle-Overo-EVM.patch
@@ -1,7 +1,7 @@
-From 9292aae93419867b9d0fce5cf3b2697e9250f5b5 Mon Sep 17 00:00:00 2001
+From 9b34ebb747ba53f9c0c90c21764dbc1e1d967ad3 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 10:36:05 +0300
-Subject: [PATCH] DSS2: Add DSS2 support for SDP, Beagle, Overo, EVM
+Subject: [PATCH 006/146] DSS2: Add DSS2 support for SDP, Beagle, Overo, EVM
Also custom dss_*_defconfigs as an example.
@@ -11,10 +11,10 @@ Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
arch/arm/configs/dss_omap_3430sdp_defconfig | 1634 +++++++++++++++++++++++
arch/arm/configs/dss_overo_defconfig | 1862 +++++++++++++++++++++++++++
arch/arm/mach-omap2/board-3430sdp.c | 227 ++++-
- arch/arm/mach-omap2/board-omap3beagle.c | 95 ++-
+ arch/arm/mach-omap2/board-omap3beagle.c | 91 ++-
arch/arm/mach-omap2/board-omap3evm.c | 217 +++-
arch/arm/mach-omap2/board-overo.c | 98 ++-
- 7 files changed, 5475 insertions(+), 29 deletions(-)
+ 7 files changed, 5475 insertions(+), 25 deletions(-)
create mode 100644 arch/arm/configs/dss_omap3_beagle_defconfig
create mode 100644 arch/arm/configs/dss_omap_3430sdp_defconfig
create mode 100644 arch/arm/configs/dss_overo_defconfig
@@ -4905,10 +4905,18 @@ index 0000000..755a1b6
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
-index 0a1099e..3c664a9 100644
+index 21b4a52..2ee6cbb 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
-@@ -242,6 +243,35 @@ static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
+@@ -36,6 +36,7 @@
+ #include <mach/common.h>
+ #include <mach/dma.h>
+ #include <mach/gpmc.h>
++#include <mach/display.h>
+
+ #include <mach/control.h>
+ #include <mach/keypad.h>
+@@ -148,6 +149,35 @@ static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
},
};
@@ -4944,7 +4952,7 @@ index 0a1099e..3c664a9 100644
static struct platform_device sdp3430_lcd_device = {
.name = "sdp2430_lcd",
.id = -1,
-@@ -257,9 +287,198 @@ static struct regulator_consumer_supply sdp3430_vdvi_supply = {
+@@ -163,8 +193,197 @@ static struct regulator_consumer_supply sdp3430_vdvi_supply = {
.dev = &sdp3430_lcd_device.dev,
};
@@ -5138,13 +5146,12 @@ index 0a1099e..3c664a9 100644
+};
+
static struct platform_device *sdp3430_devices[] __initdata = {
- &sdp3430_smc91x_device,
- &sdp3430_lcd_device,
+ &sdp3430_dss_device,
};
- static inline void __init sdp3430_init_smc91x(void)
-@@ -306,13 +525,8 @@ static struct omap_uart_config sdp3430_uart_config __initdata = {
+ static void __init omap_3430sdp_init_irq(void)
+@@ -178,13 +397,8 @@ static struct omap_uart_config sdp3430_uart_config __initdata = {
.enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
};
@@ -5158,16 +5165,16 @@ index 0a1099e..3c664a9 100644
};
static int sdp3430_batt_table[] = {
-@@ -681,6 +895,7 @@ static void __init omap_3430sdp_init(void)
- omap_serial_init();
+@@ -496,6 +710,7 @@ static void __init omap_3430sdp_init(void)
usb_musb_init();
- usb_ehci_init();
+ board_smc91x_init();
+ usb_ehci_init(EHCI_HCD_OMAP_MODE_PHY, true, true, 57, 61);
+ sdp3430_display_init();
}
static void __init omap_3430sdp_map_io(void)
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
-index 346351e..b67e7a5 100644
+index b6a68d5..c2c76b0 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -30,6 +30,7 @@
@@ -5178,18 +5185,15 @@ index 346351e..b67e7a5 100644
#include <mach/hardware.h>
#include <asm/mach-types.h>
-@@ -312,10 +314,6 @@ static void __init omap3_beagle_init_irq(void)
- omap_gpio_init();
- }
+@@ -44,6 +45,7 @@
+ #include <mach/mux.h>
+ #include <mach/usb.h>
+ #include <mach/timer-gp.h>
++#include <mach/display.h>
--static struct omap_lcd_config omap3_beagle_lcd_config __initdata = {
-- .ctrl_name = "internal",
--};
--
- static struct gpio_led gpio_leds[] = {
- {
- .name = "beagleboard::usr0",
-@@ -369,13 +367,94 @@ static struct platform_device keys_gpio = {
+ #include "mmc-twl4030.h"
+
+@@ -343,13 +345,94 @@ static struct platform_device keys_gpio = {
},
};
@@ -5286,7 +5290,7 @@ index 346351e..b67e7a5 100644
&leds_gpio,
&keys_gpio,
};
-@@ -428,13 +507,11 @@ static void __init omap3_beagle_init(void)
+@@ -402,13 +485,11 @@ static void __init omap3_beagle_init(void)
omap_serial_init();
omap_cfg_reg(J25_34XX_GPIO170);
@@ -5295,17 +5299,25 @@ index 346351e..b67e7a5 100644
- gpio_direction_output(170, true);
usb_musb_init();
- usb_ehci_init();
+ usb_ehci_init(EHCI_HCD_OMAP_MODE_PHY, true, true, 57, 61);
omap3beagle_flash_init();
+ beagle_display_init();
}
static void __init omap3_beagle_map_io(void)
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
-index 024d7c4..6f5a866 100644
+index 595beac..dffb8b9 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
-@@ -216,13 +217,215 @@ static int __init omap3_evm_i2c_init(void)
+@@ -37,6 +37,7 @@
+ #include <mach/common.h>
+ #include <mach/mcspi.h>
+ #include <mach/keypad.h>
++#include <mach/display.h>
+
+ #include "sdram-micron-mt46h32m32lf-6.h"
+ #include "mmc-twl4030.h"
+@@ -222,13 +223,215 @@ static int __init omap3_evm_i2c_init(void)
return 0;
}
@@ -5526,7 +5538,7 @@ index 024d7c4..6f5a866 100644
};
static void ads7846_dev_init(void)
-@@ -281,11 +484,10 @@ static void __init omap3_evm_init_irq(void)
+@@ -287,11 +490,10 @@ static void __init omap3_evm_init_irq(void)
static struct omap_board_config_kernel omap3_evm_config[] __initdata = {
{ OMAP_TAG_UART, &omap3_evm_uart_config },
@@ -5539,28 +5551,28 @@ index 024d7c4..6f5a866 100644
&omap3evm_smc911x_device,
};
-@@ -305,6 +507,7 @@ static void __init omap3_evm_init(void)
- usb_ehci_init();
- omap3evm_flash_init();
+@@ -310,6 +512,7 @@ static void __init omap3_evm_init(void)
+ usb_musb_init();
+ usb_ehci_init(EHCI_HCD_OMAP_MODE_PHY, true, true, 57, 61);
ads7846_dev_init();
+ omap3_evm_display_init();
}
static void __init omap3_evm_map_io(void)
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
-index 071f4b0..267bb6b 100644
+index 501d020..7bcac03 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
-@@ -41,6 +41,7 @@
- #include <mach/board-overo.h>
+@@ -40,6 +40,7 @@
+
#include <mach/board.h>
#include <mach/common.h>
+#include <mach/display.h>
#include <mach/gpio.h>
#include <mach/gpmc.h>
#include <mach/hardware.h>
-@@ -176,6 +177,9 @@ static void __init overo_ads7846_init(void)
- static inline void __init overo_ads7846_init(void) { return; }
+@@ -182,6 +183,9 @@ static inline void __init overo_init_smsc911x(void)
+ static inline void __init overo_init_smsc911x(void) { return; }
#endif
+static int lcd_enabled;
@@ -5569,7 +5581,7 @@ index 071f4b0..267bb6b 100644
static struct mtd_partition overo_nand_partitions[] = {
{
.name = "xloader",
-@@ -360,22 +364,101 @@ static void __init overo_init_irq(void)
+@@ -365,22 +369,101 @@ static void __init overo_init_irq(void)
omap_gpio_init();
}
@@ -5644,7 +5656,7 @@ index 071f4b0..267bb6b 100644
+
+static struct omap_dss_display_config overo_display_data_lcd = {
+ .type = OMAP_DISPLAY_TYPE_DPI,
-+ .name = "lcd43",
++ .name = "lcd",
+ .panel_name = "samsung-lte430wq-f0c",
+ .u.dpi.data_lines = 24,
+ .panel_enable = overo_panel_enable_lcd,
@@ -5678,14 +5690,14 @@ index 071f4b0..267bb6b 100644
};
static void __init overo_init(void)
-@@ -390,6 +473,7 @@ static void __init overo_init(void)
- overo_flash_init();
- overo_init_smsc911x();
+@@ -395,6 +478,7 @@ static void __init overo_init(void)
+ usb_ehci_init(EHCI_HCD_OMAP_MODE_PHY, false, true, 183, -EINVAL);
overo_ads7846_init();
+ overo_init_smsc911x();
+ overo_display_init();
if ((gpio_request(OVERO_GPIO_W2W_NRESET,
"OVERO_GPIO_W2W_NRESET") == 0) &&
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch b/recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-function-to-display-object-to-get-the-back.patch
index 4c8d432dd5..98537e0ebf 100644
--- a/recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-function-to-display-object-to-get-the-back.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0007-DSS2-Add-function-to-display-object-to-get-the-back.patch
@@ -1,7 +1,7 @@
-From 4741076cae4f4284e1fff9a03f35475b8455af54 Mon Sep 17 00:00:00 2001
+From 5d32a2ba9289a16d950db719330ee57dc9ffa60a Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Wed, 1 Apr 2009 14:36:39 +0200
-Subject: [PATCH] DSS2: Add function to display object to get the backlight level
+Subject: [PATCH 007/146] DSS2: Add function to display object to get the backlight level
This is needed by an upcoming patch that changes the backlight
initialization to use the backlight level set by the bootloader.
@@ -35,5 +35,5 @@ index 6288353..6b702c7 100644
struct device;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0009-DSS2-Add-acx565akm-panel.patch b/recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-acx565akm-panel.patch
index 3f55f04460..042a792029 100644
--- a/recipes/linux/linux-omap-pm/dss2/0009-DSS2-Add-acx565akm-panel.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0008-DSS2-Add-acx565akm-panel.patch
@@ -1,7 +1,7 @@
-From 66e16f86d3f4c5b34b37e965c65102b7192371de Mon Sep 17 00:00:00 2001
+From 7591138400ae9112bb5f5d4f4b62b3a1adb69874 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Thu, 2 Apr 2009 11:47:13 +0300
-Subject: [PATCH] DSS2: Add acx565akm panel
+Subject: [PATCH 008/146] DSS2: Add acx565akm panel
Signed-off-by: Imre Deak <imre.deak@nokia.com>
---
@@ -774,5 +774,5 @@ index 0000000..6d3727b
+#endif
+
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch b/recipes/linux/linux-omap-pm/dss2/0009-DSS2-Small-VRFB-context-allocation-bug-fixed.patch
index c7efc58a05..916e57c27a 100644
--- a/recipes/linux/linux-omap-pm/dss2/0010-DSS2-Small-VRFB-context-allocation-bug-fixed.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0009-DSS2-Small-VRFB-context-allocation-bug-fixed.patch
@@ -1,7 +1,7 @@
-From 370510e24ddbf539392ebb6a1e43280965fcb19b Mon Sep 17 00:00:00 2001
+From 8caea38adca77b8aa14721f07810d4802272bd05 Mon Sep 17 00:00:00 2001
From: Vaibhav Hiremath <hvaibhav@ti.com>
Date: Tue, 31 Mar 2009 18:47:32 +0530
-Subject: [PATCH] DSS2: Small VRFB context allocation bug fixed
+Subject: [PATCH 009/146] DSS2: Small VRFB context allocation bug fixed
This is minor bug while requesting and mapping memory for
VRFB space.
@@ -24,5 +24,5 @@ index 852abe5..44febef 100644
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch b/recipes/linux/linux-omap-pm/dss2/0010-DSS2-Allocated-memory-for-Color-Look-up-table.patch
index 1a82ed2a22..8b2f21f561 100644
--- a/recipes/linux/linux-omap-pm/dss2/0011-DSS2-Allocated-memory-for-Color-Look-up-table.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0010-DSS2-Allocated-memory-for-Color-Look-up-table.patch
@@ -1,7 +1,7 @@
-From 370d1f93a32e8fcaeac5c16574417e354af21d08 Mon Sep 17 00:00:00 2001
+From 9a88005a530cd311fa0ffd0d07f7ae7a73dbf7d5 Mon Sep 17 00:00:00 2001
From: Vaibhav Hiremath <hvaibhav@ti.com>
Date: Tue, 31 Mar 2009 18:38:31 +0530
-Subject: [PATCH] DSS2: Allocated memory for Color Look-up-table
+Subject: [PATCH 010/146] DSS2: Allocated memory for Color Look-up-table
We were not allocating memory for CMAP buffer and due to that
G_CMAP was failing, since it does check for size of CMAP buffer.
@@ -33,5 +33,5 @@ index 44febef..afe40a9 100644
return r;
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0012-DSS2-Fix-DMA-rotation.patch b/recipes/linux/linux-omap-pm/dss2/0011-DSS2-Fix-DMA-rotation.patch
index 22add6efd2..006c2346f7 100644
--- a/recipes/linux/linux-omap-pm/dss2/0012-DSS2-Fix-DMA-rotation.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0011-DSS2-Fix-DMA-rotation.patch
@@ -1,7 +1,7 @@
-From 9c93bcab724b5935d745604773ed43825efefd87 Mon Sep 17 00:00:00 2001
+From 5563b1d969aa8227919e35c3d4ceb738b3bf7a39 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 13:47:11 +0300
-Subject: [PATCH] DSS2: Fix DMA rotation
+Subject: [PATCH 011/146] DSS2: Fix DMA rotation
u16 was not a good type for offsets. First, they need to be signed,
and second, 16 bits is not enough.
@@ -61,5 +61,5 @@ index ffb5648..6cea545 100644
if (plane == OMAP_DSS_GFX) {
if (width != out_width || height != out_height)
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch b/recipes/linux/linux-omap-pm/dss2/0012-DSS2-Verify-that-overlay-paddr-0.patch
index 76b8c73630..869a27b81e 100644
--- a/recipes/linux/linux-omap-pm/dss2/0013-DSS2-Verify-that-overlay-paddr-0.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0012-DSS2-Verify-that-overlay-paddr-0.patch
@@ -1,7 +1,7 @@
-From 360a55ddd309e3a45b227a4a905ae7120dd16169 Mon Sep 17 00:00:00 2001
+From 24ae439174e570101d8d80fdc4b605de0040f88a Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 14:21:12 +0300
-Subject: [PATCH] DSS2: Verify that overlay paddr != 0
+Subject: [PATCH 012/146] DSS2: Verify that overlay paddr != 0
---
drivers/video/omap2/dss/dispc.c | 3 +++
@@ -37,5 +37,5 @@ index 968edbe..9209acf 100644
ovl->info = *info;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0014-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch b/recipes/linux/linux-omap-pm/dss2/0013-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch
index 3b3fd77a9a..781af9c7eb 100644
--- a/recipes/linux/linux-omap-pm/dss2/0014-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0013-DSS2-Add-function-to-get-DSS-logic-clock-rate.patch
@@ -1,7 +1,7 @@
-From 832b763db235da8e62f7b6ab02bcb8ad6bcb7a01 Mon Sep 17 00:00:00 2001
+From 22e54d90b60675e8584d92d92493e0579e69e589 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 16:48:41 +0300
-Subject: [PATCH] DSS2: Add function to get DSS logic clock rate
+Subject: [PATCH 013/146] DSS2: Add function to get DSS logic clock rate
---
drivers/video/omap2/dss/dispc.c | 15 +++++++++++++++
@@ -47,5 +47,5 @@ index bac5ece..0be42b6 100644
void dispc_set_pol_freq(struct omap_panel *panel);
void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch b/recipes/linux/linux-omap-pm/dss2/0014-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch
index d6b0cbbb41..090a9ea68c 100644
--- a/recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0014-DSS2-DSI-calculate-VP_CLK_RATIO-properly.patch
@@ -1,7 +1,7 @@
-From a5c235a6f0094494ae1fc1a1ba4728e0d33dfd3b Mon Sep 17 00:00:00 2001
+From ea00b61dccecbcddadc0c69d18a220d563a56754 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 16:49:27 +0300
-Subject: [PATCH] DSS2: DSI: calculate VP_CLK_RATIO properly
+Subject: [PATCH 014/146] DSS2: DSI: calculate VP_CLK_RATIO properly
---
drivers/video/omap2/dss/dsi.c | 17 +++++++++++------
@@ -64,5 +64,5 @@ index 4442931..aecb89d 100644
r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */
r = FLD_MOD(r, 2, 13, 12); /* LINE_BUFFER, 2 lines */
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0016-DSS2-DSI-improve-packet-len-calculation.patch b/recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-improve-packet-len-calculation.patch
index bca449f169..9fc0f8cbcf 100644
--- a/recipes/linux/linux-omap-pm/dss2/0016-DSS2-DSI-improve-packet-len-calculation.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0015-DSS2-DSI-improve-packet-len-calculation.patch
@@ -1,7 +1,7 @@
-From 6b2c9d84c7accdfe1067fcdc8a00e50674aab4bb Mon Sep 17 00:00:00 2001
+From 539f93c4bc0119abf79d9a25955e863309ae6771 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 2 Apr 2009 17:42:26 +0300
-Subject: [PATCH] DSS2: DSI: improve packet len calculation
+Subject: [PATCH 015/146] DSS2: DSI: improve packet len calculation
---
drivers/video/omap2/dss/dsi.c | 21 ++++++++++++++++-----
@@ -54,5 +54,5 @@ index aecb89d..66ac6ea 100644
if (dsi.use_te)
l = FLD_MOD(l, 1, 30, 30); /* TE_EN */
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0017-DSS2-Disable-video-planes-on-sync-lost-error.patch b/recipes/linux/linux-omap-pm/dss2/0016-DSS2-Disable-video-planes-on-sync-lost-error.patch
index 5b68b57da9..8d33f7f5ff 100644
--- a/recipes/linux/linux-omap-pm/dss2/0017-DSS2-Disable-video-planes-on-sync-lost-error.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0016-DSS2-Disable-video-planes-on-sync-lost-error.patch
@@ -1,7 +1,7 @@
-From 85848d329ca3a2d6ee6841cdc11cc5951d187931 Mon Sep 17 00:00:00 2001
+From adc4913d614b6b523dfe5ba115d2690043ab8ee9 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Fri, 3 Apr 2009 19:09:20 +0200
-Subject: [PATCH] DSS2: Disable video planes on sync lost error
+Subject: [PATCH 016/146] DSS2: Disable video planes on sync lost error
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -99,5 +99,5 @@ index 1bc23f7..41734f3 100644
if (errors & DISPC_IRQ_OCP_ERR) {
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0018-DSS2-check-for-ovl-paddr-only-when-enabling.patch b/recipes/linux/linux-omap-pm/dss2/0017-DSS2-check-for-ovl-paddr-only-when-enabling.patch
index 088135c0a8..1e9e4f4b78 100644
--- a/recipes/linux/linux-omap-pm/dss2/0018-DSS2-check-for-ovl-paddr-only-when-enabling.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0017-DSS2-check-for-ovl-paddr-only-when-enabling.patch
@@ -1,7 +1,7 @@
-From 63e15ba8d5f95b13d3abf359da718537d769f112 Mon Sep 17 00:00:00 2001
+From 79d7d58e0fe8b0fb2c7b68116be30f37d3389f2f Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Tue, 7 Apr 2009 10:01:58 +0300
-Subject: [PATCH] DSS2: check for ovl paddr only when enabling
+Subject: [PATCH 017/146] DSS2: check for ovl paddr only when enabling
It seems Xvideo uses SETUP_PLANE ioctl even when
the fb memory has not been allocated. Sigh.
@@ -36,5 +36,5 @@ index 9209acf..c047206 100644
ovl->info = *info;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-fclk-limits-when-configuring-video-plane.patch b/recipes/linux/linux-omap-pm/dss2/0018-DSS2-Check-fclk-limits-when-configuring-video-plane.patch
index daa95ca50d..8ae7666a7d 100644
--- a/recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-fclk-limits-when-configuring-video-plane.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0018-DSS2-Check-fclk-limits-when-configuring-video-plane.patch
@@ -1,7 +1,7 @@
-From 67f3fc050ab4e2006d5b7ec6ec341896627181ab Mon Sep 17 00:00:00 2001
+From ca0485ad7fcd29a0190eccd6b58bcd22794d4a7d Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 6 Apr 2009 17:32:04 +0200
-Subject: [PATCH] DSS2: Check fclk limits when configuring video planes
+Subject: [PATCH 018/146] DSS2: Check fclk limits when configuring video planes
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -179,5 +179,5 @@ index 41734f3..61861d8 100644
_dispc_set_vid_color_conv(plane, cconv);
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0020-DSS2-Check-scaling-limits-against-proper-values.patch b/recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-scaling-limits-against-proper-values.patch
index b3248527e8..47541f6c98 100644
--- a/recipes/linux/linux-omap-pm/dss2/0020-DSS2-Check-scaling-limits-against-proper-values.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0019-DSS2-Check-scaling-limits-against-proper-values.patch
@@ -1,7 +1,7 @@
-From 9f8f1613253656f155b3844c8255a560f86e0acd Mon Sep 17 00:00:00 2001
+From 16b86930f796436e4f440626980a25df71b6a8ec Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 6 Apr 2009 17:32:05 +0200
-Subject: [PATCH] DSS2: Check scaling limits against proper values
+Subject: [PATCH 019/146] DSS2: Check scaling limits against proper values
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -75,5 +75,5 @@ index 61861d8..ae7be3d 100644
_dispc_set_color_mode(plane, color_mode);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0021-DSS2-Add-venc-register-dump.patch b/recipes/linux/linux-omap-pm/dss2/0020-DSS2-Add-venc-register-dump.patch
index 31ff180228..bf63b3a058 100644
--- a/recipes/linux/linux-omap-pm/dss2/0021-DSS2-Add-venc-register-dump.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0020-DSS2-Add-venc-register-dump.patch
@@ -1,7 +1,7 @@
-From c5e71be877e71c7df329205307e830f158c403bf Mon Sep 17 00:00:00 2001
+From c36a2e49cae0ae5e1068e68dee23987df763ca0e Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 6 Apr 2009 17:32:06 +0200
-Subject: [PATCH] DSS2: Add venc register dump
+Subject: [PATCH 020/146] DSS2: Add venc register dump
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -92,5 +92,5 @@ index aceed9f..b655df4 100644
+#undef DUMPREG
+}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0022-DSS2-FB-remove-unused-var-warning.patch b/recipes/linux/linux-omap-pm/dss2/0021-DSS2-FB-remove-unused-var-warning.patch
index d4fb327c76..736c7e6e1e 100644
--- a/recipes/linux/linux-omap-pm/dss2/0022-DSS2-FB-remove-unused-var-warning.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0021-DSS2-FB-remove-unused-var-warning.patch
@@ -1,7 +1,7 @@
-From facfd479bb6efad76eec1e74048cb7a31da7287d Mon Sep 17 00:00:00 2001
+From 4b1e929ef1d15f565d166fa19ffd501f547b8eb0 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Mon, 6 Apr 2009 22:26:04 +0200
-Subject: [PATCH] DSS2: FB: remove unused var warning
+Subject: [PATCH 021/146] DSS2: FB: remove unused var warning
Signed-off-by: Imre Deak <imre.deak@nokia.com>
---
@@ -23,5 +23,5 @@ index afe40a9..12ce0c3 100644
omap_vrfb_adjust_size(&w, &h, bytespp);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0023-DSS2-pass-the-default-FB-color-format-through-board.patch b/recipes/linux/linux-omap-pm/dss2/0022-DSS2-pass-the-default-FB-color-format-through-board.patch
index 6492905530..0dcff125de 100644
--- a/recipes/linux/linux-omap-pm/dss2/0023-DSS2-pass-the-default-FB-color-format-through-board.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0022-DSS2-pass-the-default-FB-color-format-through-board.patch
@@ -1,7 +1,7 @@
-From c02b843c2732bc7b15a3e35b5dd715d68225bbd1 Mon Sep 17 00:00:00 2001
+From 353b8aba981b1ebc892d84e4c40b1fd4201079db Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Wed, 8 Apr 2009 12:51:46 +0200
-Subject: [PATCH] DSS2: pass the default FB color format through board info
+Subject: [PATCH 022/146] DSS2: pass the default FB color format through board info
Add a field to the FB memory region platform data, so that board
init code can pass a default color format to the driver. Set this
@@ -210,5 +210,5 @@ index 96190b2..7a34f22 100644
unsigned map:1; /* kernel mapped by the driver */
};
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0024-DSS2-Beagle-Use-gpio_set_value.patch b/recipes/linux/linux-omap-pm/dss2/0023-DSS2-Beagle-Use-gpio_set_value.patch
index 559e49f40a..568c4fb00c 100644
--- a/recipes/linux/linux-omap-pm/dss2/0024-DSS2-Beagle-Use-gpio_set_value.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0023-DSS2-Beagle-Use-gpio_set_value.patch
@@ -1,17 +1,17 @@
-From 2710416c43572652cb5355a5eaf68038c95659e8 Mon Sep 17 00:00:00 2001
+From c01ef38cc851f53008c0f1491f568b8554270441 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 9 Apr 2009 12:10:46 +0300
-Subject: [PATCH] DSS2: Beagle: Use gpio_set_value
+Subject: [PATCH 023/146] DSS2: Beagle: Use gpio_set_value
---
arch/arm/mach-omap2/board-omap3beagle.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
-index b67e7a5..8c1961d 100644
+index c2c76b0..4ab7396 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
-@@ -372,7 +372,7 @@ static struct platform_device keys_gpio = {
+@@ -350,7 +350,7 @@ static struct platform_device keys_gpio = {
static int beagle_enable_dvi(struct omap_display *display)
{
if (display->hw_config.panel_reset_gpio != -1)
@@ -20,7 +20,7 @@ index b67e7a5..8c1961d 100644
return 0;
}
-@@ -380,7 +380,7 @@ static int beagle_enable_dvi(struct omap_display *display)
+@@ -358,7 +358,7 @@ static int beagle_enable_dvi(struct omap_display *display)
static void beagle_disable_dvi(struct omap_display *display)
{
if (display->hw_config.panel_reset_gpio != -1)
@@ -29,7 +29,7 @@ index b67e7a5..8c1961d 100644
}
static struct omap_dss_display_config beagle_display_data_dvi = {
-@@ -445,8 +445,12 @@ static void __init beagle_display_init(void)
+@@ -423,8 +423,12 @@ static void __init beagle_display_init(void)
int r;
r = gpio_request(beagle_display_data_dvi.panel_reset_gpio, "DVI reset");
@@ -44,5 +44,5 @@ index b67e7a5..8c1961d 100644
static struct omap_board_config_kernel omap3_beagle_config[] __initdata = {
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0025-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch b/recipes/linux/linux-omap-pm/dss2/0024-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch
index e81b1331bb..2f7d475c49 100644
--- a/recipes/linux/linux-omap-pm/dss2/0025-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0024-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch
@@ -1,7 +1,7 @@
-From 990f3160d33361c135ee72e91f202e05a8c378fc Mon Sep 17 00:00:00 2001
+From 5ba7dbfd877bf8c345419b2985e5b26c2934d1d3 Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Mon, 13 Apr 2009 18:50:24 +0530
-Subject: [PATCH] DSS2: VRFB: Macro for calculating base address of the VRFB context was faulty
+Subject: [PATCH 024/146] DSS2: VRFB: Macro for calculating base address of the VRFB context was faulty
Signed-off-by: Hardik Shah <hardik.shah@ti.com>
---
@@ -24,5 +24,5 @@ index 7e0f8fc..d68065f 100644
#define OMAP_VRFB_SIZE (2048 * 2048 * 4)
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch b/recipes/linux/linux-omap-pm/dss2/0025-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch
index 6ee3908d10..dde493b544 100644
--- a/recipes/linux/linux-omap-pm/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0025-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch
@@ -1,7 +1,7 @@
-From a1e8018c0806a1a0579eda4b93b7d6764a2ff643 Mon Sep 17 00:00:00 2001
+From 76650cba4f338e9a15f6cb4bab56580802632dd0 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Wed, 15 Apr 2009 14:06:54 +0300
-Subject: [PATCH] DSS2: DSI: sidlemode to noidle while sending frame
+Subject: [PATCH 025/146] DSS2: DSI: sidlemode to noidle while sending frame
DISPC interrupts are not wake-up capable. Smart-idle in DISPC_SIDLEMODE
causes DSS interface to go to idle at the end of the frame, and the
@@ -74,5 +74,5 @@ index 0be42b6..d0917a8 100644
void dispc_lcd_enable_signal(bool enable);
void dispc_pck_free_enable(bool enable);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch b/recipes/linux/linux-omap-pm/dss2/0026-DSS2-VRFB-rotation-and-mirroring-implemented.patch
index b56e32a11c..52c2942fde 100644
--- a/recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0026-DSS2-VRFB-rotation-and-mirroring-implemented.patch
@@ -1,7 +1,7 @@
-From 77e848eeba461e9b55b09d39fd0d640caea13e19 Mon Sep 17 00:00:00 2001
+From 684d15b8505257b465ec26e473882560383471b8 Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Thu, 9 Apr 2009 12:09:44 +0530
-Subject: [PATCH] DSS2: VRFB rotation and mirroring implemented.
+Subject: [PATCH 026/146] DSS2: VRFB rotation and mirroring implemented.
DSS2 modified to accept the rotation_type input
to get the dma or VRFB rotation.
@@ -320,5 +320,5 @@ index b0fee80..8ca0bbb 100644
ovl->info.mirror);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch b/recipes/linux/linux-omap-pm/dss2/0027-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
index 6400da3c24..e451fb1910 100644
--- a/recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0027-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
@@ -1,7 +1,7 @@
-From c09f1a0642fd58a1b081594ea36dfd1bf71aec52 Mon Sep 17 00:00:00 2001
+From c90771a625b91517a178008b83ca1925d8f8d1dd Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Thu, 9 Apr 2009 12:13:07 +0530
-Subject: [PATCH] DSS2: OMAPFB: Added support for the YUV VRFB rotation and mirroring.
+Subject: [PATCH 027/146] DSS2: OMAPFB: Added support for the YUV VRFB rotation and mirroring.
DSS2 now requires roatation_type to be specified by driver.
Added support for that.
@@ -232,5 +232,5 @@ index 2607def..43f6922 100644
bool mirror;
};
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch b/recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch
index 072978670b..148fc661d8 100644
--- a/recipes/linux/linux-omap-pm/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0028-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch
@@ -1,7 +1,7 @@
-From a8a37babe4856170f4cba86c425a8f21975d9e9e Mon Sep 17 00:00:00 2001
+From 2e22c28ba3d4dd6c07e0c51903c8827c9a199c5e Mon Sep 17 00:00:00 2001
From: Tim Yamin <plasm@roo.me.uk>
Date: Mon, 13 Apr 2009 13:57:42 -0700
-Subject: [PATCH] DSS2: OMAPFB: Set line_length correctly for YUV with VRFB.
+Subject: [PATCH 028/146] DSS2: OMAPFB: Set line_length correctly for YUV with VRFB.
Signed-off-by: Tim Yamin <plasm@roo.me.uk>
---
@@ -57,5 +57,5 @@ index 57f5900..cd63740 100644
ovl->get_overlay_info(ovl, &info);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch b/recipes/linux/linux-omap-pm/dss2/0029-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch
index 7e2bb48938..1f7e9d826e 100644
--- a/recipes/linux/linux-omap-pm/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0029-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch
@@ -1,7 +1,7 @@
-From bda19b9359d9dc60f8b0beb5685e173e236ee30f Mon Sep 17 00:00:00 2001
+From d005d1318e9ac306432f562bd74c6efebd577981 Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Wed, 15 Apr 2009 17:05:18 +0530
-Subject: [PATCH] DSS2: dispc_get_trans_key was returning wrong key type
+Subject: [PATCH 029/146] DSS2: dispc_get_trans_key was returning wrong key type
Signed-off-by: Hardik Shah <hardik.shah@ti.com>
---
@@ -25,5 +25,5 @@ index 23a8155..076d3d4 100644
BUG();
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0031-DSS2-do-bootmem-reserve-for-exclusive-access.patch b/recipes/linux/linux-omap-pm/dss2/0030-DSS2-do-bootmem-reserve-for-exclusive-access.patch
index ae777ed04e..0436458564 100644
--- a/recipes/linux/linux-omap-pm/dss2/0031-DSS2-do-bootmem-reserve-for-exclusive-access.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0030-DSS2-do-bootmem-reserve-for-exclusive-access.patch
@@ -1,7 +1,7 @@
-From 30c40f5e6b1794430f678bf23d3319354321cab7 Mon Sep 17 00:00:00 2001
+From 18386ebea56159305014c898ffaf034b95bb7ac5 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Tue, 14 Apr 2009 14:50:11 +0200
-Subject: [PATCH] DSS2: do bootmem reserve for exclusive access
+Subject: [PATCH 030/146] DSS2: do bootmem reserve for exclusive access
BOOTMEM_DEFAULT would allow multiple reservations for the same location,
we need to reserve the region for our exclusive use. Also check if the
@@ -29,5 +29,5 @@ index f24a110..520f260 100644
if (size > sdram_size) {
printk(KERN_ERR "Illegal SDRAM size for VRAM\n");
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0032-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch b/recipes/linux/linux-omap-pm/dss2/0031-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch
index 4959a760b1..b9e030619a 100644
--- a/recipes/linux/linux-omap-pm/dss2/0032-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0031-DSS2-Fix-DISPC_VID_FIR-value-for-omap34xx.patch
@@ -1,7 +1,7 @@
-From ed7a9223f6785be03951c55f3b0695b0d5635c80 Mon Sep 17 00:00:00 2001
+From fe2a2cf84ab84bab840c0d2b8c92d95f1d9d6d84 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Thu, 9 Apr 2009 15:04:44 +0200
-Subject: [PATCH] DSS2: Fix DISPC_VID_FIR value for omap34xx
+Subject: [PATCH 031/146] DSS2: Fix DISPC_VID_FIR value for omap34xx
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -31,5 +31,5 @@ index 076d3d4..b8a3329 100644
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0033-DSS2-Prefer-3-tap-filter.patch b/recipes/linux/linux-omap-pm/dss2/0032-DSS2-Prefer-3-tap-filter.patch
index f643ca64f3..20156fd00e 100644
--- a/recipes/linux/linux-omap-pm/dss2/0033-DSS2-Prefer-3-tap-filter.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0032-DSS2-Prefer-3-tap-filter.patch
@@ -1,7 +1,7 @@
-From 5390230ed12585a79683733209db34e9130b8e3b Mon Sep 17 00:00:00 2001
+From d6fb2501311709ce820c3fb62c50259374c39dc5 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Thu, 9 Apr 2009 15:04:43 +0200
-Subject: [PATCH] DSS2: Prefer 3-tap filter
+Subject: [PATCH 032/146] DSS2: Prefer 3-tap filter
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -78,5 +78,5 @@ index b8a3329..b631dd8 100644
DSSDBG("required fclk rate = %lu Hz\n", fclk);
DSSDBG("current fclk rate = %lu Hz\n", dispc_fclk_rate());
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0034-DSS2-VRAM-improve-omap_vram_add_region.patch b/recipes/linux/linux-omap-pm/dss2/0033-DSS2-VRAM-improve-omap_vram_add_region.patch
index fdfc25fb47..458d4913a0 100644
--- a/recipes/linux/linux-omap-pm/dss2/0034-DSS2-VRAM-improve-omap_vram_add_region.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0033-DSS2-VRAM-improve-omap_vram_add_region.patch
@@ -1,7 +1,7 @@
-From 946eb774e95cdc2f2fa5cdc24aa69229f82814b8 Mon Sep 17 00:00:00 2001
+From 76d1928e53bbb506ddccd1f48f31c672f281c127 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 16 Apr 2009 17:56:00 +0300
-Subject: [PATCH] DSS2: VRAM: improve omap_vram_add_region()
+Subject: [PATCH 033/146] DSS2: VRAM: improve omap_vram_add_region()
Combine postponed and non-posponed versions of omap_vram_add_region.
Make the func non-static, so it can be called from board files.
@@ -131,5 +131,5 @@ index 520f260..8e9fe77 100644
if (reserved)
pr_info("Reserving %lu bytes SRAM for VRAM\n", reserved);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-the-function-pointer-for-getting-default.patch b/recipes/linux/linux-omap-pm/dss2/0034-DSS2-Added-the-function-pointer-for-getting-default.patch
index b7b395458f..5242142ac1 100644
--- a/recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-the-function-pointer-for-getting-default.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0034-DSS2-Added-the-function-pointer-for-getting-default.patch
@@ -1,7 +1,7 @@
-From f825cafd5ee5c600218740507f85594c825b0c00 Mon Sep 17 00:00:00 2001
+From 45d3e5f313f3c617100ef0b6a7f10771acfb76a8 Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Thu, 16 Apr 2009 18:47:49 +0530
-Subject: [PATCH] DSS2: Added the function pointer for getting default color.
+Subject: [PATCH 034/146] DSS2: Added the function pointer for getting default color.
V4L2 Framework has a CID for getting/setting default color.
So added the function pointer for doing same.
@@ -62,5 +62,5 @@ index 8ca0bbb..12cf7b0 100644
dss_overlay_setup_dispc_manager(mgr);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-setting-and-querying-alpha-b.patch b/recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-support-for-setting-and-querying-alpha-b.patch
index c6e9f16b3a..8ec00b8c0c 100644
--- a/recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-setting-and-querying-alpha-b.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0035-DSS2-Added-support-for-setting-and-querying-alpha-b.patch
@@ -1,7 +1,7 @@
-From 6c56dc10226c84f41917ac2117b0e654fa080d40 Mon Sep 17 00:00:00 2001
+From cccb6206195978ab8ff0b08958b44a0d88e8bc94 Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Thu, 16 Apr 2009 19:00:11 +0530
-Subject: [PATCH] DSS2: Added support for setting and querying alpha blending.
+Subject: [PATCH 035/146] DSS2: Added support for setting and querying alpha blending.
Signed-off-by: Hardik Shah <hardik.shah@ti.com>
---
@@ -114,5 +114,5 @@ index 12cf7b0..90acd28 100644
mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC,
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0037-DSS2-Added-support-for-querying-color-keying.patch b/recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-querying-color-keying.patch
index fc62b09512..1afe7b42f9 100644
--- a/recipes/linux/linux-omap-pm/dss2/0037-DSS2-Added-support-for-querying-color-keying.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0036-DSS2-Added-support-for-querying-color-keying.patch
@@ -1,7 +1,7 @@
-From 2c9edd6af31a812a9487dd8bc12322e105a29f44 Mon Sep 17 00:00:00 2001
+From c6f6a968cb089237a092d4c1a294dbe79671bb3c Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Fri, 17 Apr 2009 09:42:36 +0530
-Subject: [PATCH] DSS2: Added support for querying color keying.
+Subject: [PATCH 036/146] DSS2: Added support for querying color keying.
V4L2 Framework has a ioctl for getting/setting color keying.
So added the function manager pointers for doing same.
@@ -146,5 +146,5 @@ index 90acd28..e0501c4 100644
&omap_dss_mgr_enable_alpha_blending;
mgr->get_alpha_blending_status =
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0038-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch b/recipes/linux/linux-omap-pm/dss2/0037-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch
index 65cb113574..85b21b4e26 100644
--- a/recipes/linux/linux-omap-pm/dss2/0038-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0037-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch
@@ -1,7 +1,7 @@
-From 9e8877f0e5b17d3ddd101d6a63aa86fdb14d35d5 Mon Sep 17 00:00:00 2001
+From a68284a6285a035a9572b6e0c5178751826db75f Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Fri, 17 Apr 2009 09:51:25 +0530
-Subject: [PATCH] DSS2:OMAPFB: Some color keying pointerd renamed in DSS2. Replicated in FB
+Subject: [PATCH 037/146] DSS2:OMAPFB: Some color keying pointerd renamed in DSS2. Replicated in FB
Signed-off-by: Hardik Shah <hardik.shah@ti.com>
---
@@ -52,5 +52,5 @@ index 7f18d2a..79d8916 100644
r = -ENODEV;
goto err;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0039-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch b/recipes/linux/linux-omap-pm/dss2/0038-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch
index af8c2cd09b..fa5c658ae1 100644
--- a/recipes/linux/linux-omap-pm/dss2/0039-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0038-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch
@@ -1,7 +1,7 @@
-From 6f1f0c7b19ecb468824b79f9d181ef0da41b7d7d Mon Sep 17 00:00:00 2001
+From b10751409130b1260992ab2b96d4d50f9f375f7f Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Fri, 17 Apr 2009 13:58:21 +0530
-Subject: [PATCH] DSS2: Add sysfs entry to for the alpha blending support.
+Subject: [PATCH 038/146] DSS2: Add sysfs entry to for the alpha blending support.
Signed-off-by: Hardik Shah <hardik.shah@ti.com>
---
@@ -55,5 +55,5 @@ index e0501c4..7965a84 100644
};
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0040-DSS2-Provided-proper-exclusion-for-destination-colo.patch b/recipes/linux/linux-omap-pm/dss2/0039-DSS2-Provided-proper-exclusion-for-destination-colo.patch
index 66be75f3f7..7193209c42 100644
--- a/recipes/linux/linux-omap-pm/dss2/0040-DSS2-Provided-proper-exclusion-for-destination-colo.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0039-DSS2-Provided-proper-exclusion-for-destination-colo.patch
@@ -1,7 +1,7 @@
-From a5129f272a48aa22629137c9c31e60eddb8c3f5d Mon Sep 17 00:00:00 2001
+From 3a26967466a00e8a0727ecf6b9b4a42b949867de Mon Sep 17 00:00:00 2001
From: Hardik Shah <hardik.shah@ti.com>
Date: Fri, 17 Apr 2009 14:24:46 +0530
-Subject: [PATCH] DSS2: Provided proper exclusion for destination color keying and alpha blending.
+Subject: [PATCH 039/146] DSS2: Provided proper exclusion for destination color keying and alpha blending.
OMAP does not support destination color key and alpha blending
simultaneously. So this patch does not allow the user
@@ -93,5 +93,5 @@ index 7965a84..108489c 100644
return size;
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch b/recipes/linux/linux-omap-pm/dss2/0040-DSS2-Disable-vertical-offset-with-fieldmode.patch
index 6785ade279..e153c9c5a4 100644
--- a/recipes/linux/linux-omap-pm/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0040-DSS2-Disable-vertical-offset-with-fieldmode.patch
@@ -1,7 +1,7 @@
-From 9bcac9b9e678f476c83b5679b1215b6bc946130a Mon Sep 17 00:00:00 2001
+From a2649a29d782112aa5e853f71992314f631762e2 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 20 Apr 2009 16:26:18 +0200
-Subject: [PATCH] DSS2: Disable vertical offset with fieldmode
+Subject: [PATCH 040/146] DSS2: Disable vertical offset with fieldmode
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -67,5 +67,5 @@ index 7e551c2..f15614b 100644
_dispc_set_vid_color_conv(plane, cconv);
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch b/recipes/linux/linux-omap-pm/dss2/0041-DSS2-Don-t-enable-fieldmode-automatically.patch
index 5264911b41..fe0e27ec4a 100644
--- a/recipes/linux/linux-omap-pm/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0041-DSS2-Don-t-enable-fieldmode-automatically.patch
@@ -1,7 +1,7 @@
-From 9c6de0fed6e8a598d026d348533fdf731b737d55 Mon Sep 17 00:00:00 2001
+From 9e4341c229dd7e78a5612b8b9259f1dcf19a7f84 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 20 Apr 2009 16:26:19 +0200
-Subject: [PATCH] DSS2: Don't enable fieldmode automatically
+Subject: [PATCH 041/146] DSS2: Don't enable fieldmode automatically
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -30,5 +30,5 @@ index f15614b..1c036c1 100644
if (ilace) {
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch b/recipes/linux/linux-omap-pm/dss2/0042-DSS2-Swap-field-0-and-field-1-registers.patch
index 76e37817c4..d56a39a5a6 100644
--- a/recipes/linux/linux-omap-pm/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0042-DSS2-Swap-field-0-and-field-1-registers.patch
@@ -1,7 +1,7 @@
-From 35e88797e93b107ba602dee1e2ac8ea761dccd4b Mon Sep 17 00:00:00 2001
+From 8f69b9dbb2783e69c2a30c73fe2b2b1dc5b1dd52 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
Date: Mon, 20 Apr 2009 16:26:20 +0200
-Subject: [PATCH] DSS2: Swap field 0 and field 1 registers
+Subject: [PATCH 042/146] DSS2: Swap field 0 and field 1 registers
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
@@ -166,5 +166,5 @@ index 1c036c1..9bab6cf 100644
(fieldmode ? 1 : 0),
ps);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch b/recipes/linux/linux-omap-pm/dss2/0043-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch
index 32def9e8d5..1dd9176001 100644
--- a/recipes/linux/linux-omap-pm/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0043-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch
@@ -1,7 +1,7 @@
-From a9b3500bd14609750a2337e866e1df62627c1bac Mon Sep 17 00:00:00 2001
+From 99cf62779ad75224b9b8ea6490733ac5557d1763 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Mon, 20 Apr 2009 14:55:33 +0200
-Subject: [PATCH] DSS2: add sysfs entry for seting the rotate type
+Subject: [PATCH 043/146] DSS2: add sysfs entry for seting the rotate type
This can help in utilizing VRAM memory better. Since with VRFB rotation
we waste a lot of physical memory due to the VRFB HW design, provide the
@@ -72,5 +72,5 @@ index 2c88718..4e3da42 100644
__ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size),
__ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays),
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0045-DSS2-Fixed-line-endings-from-to.patch b/recipes/linux/linux-omap-pm/dss2/0044-DSS2-Fixed-line-endings-from-to.patch
index 9382469850..39baba371f 100644
--- a/recipes/linux/linux-omap-pm/dss2/0045-DSS2-Fixed-line-endings-from-to.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0044-DSS2-Fixed-line-endings-from-to.patch
@@ -1,7 +1,7 @@
-From b0e081456a9b094109c04467d041ff693843ca47 Mon Sep 17 00:00:00 2001
+From d4e33a71922c6e2c13a70428a5d3118fb827fce7 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Tue, 21 Apr 2009 09:25:16 +0300
-Subject: [PATCH] DSS2: Fixed line endings from , to ;
+Subject: [PATCH 044/146] DSS2: Fixed line endings from , to ;
---
drivers/video/omap2/dss/manager.c | 18 +++++++++---------
@@ -44,5 +44,5 @@ index 108489c..bf059e0 100644
dss_overlay_setup_dispc_manager(mgr);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch b/recipes/linux/linux-omap-pm/dss2/0045-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch
index 4ae5fbdd9a..298095d214 100644
--- a/recipes/linux/linux-omap-pm/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0045-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch
@@ -1,7 +1,7 @@
-From 0f88992b2681aed4f31dc7dd3926b357bbc95154 Mon Sep 17 00:00:00 2001
+From 23ee17c38e6762ff59dda729ffae8d9bf483f9c5 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Tue, 21 Apr 2009 10:11:55 +0300
-Subject: [PATCH] DSS2: DSI: decrease sync timeout from 60s to 2s
+Subject: [PATCH 045/146] DSS2: DSI: decrease sync timeout from 60s to 2s
The framedone-problem should be ok now, so we shouldn't get long waits.
---
@@ -22,5 +22,5 @@ index 50af925..d59ad38 100644
DSSDBGF("");
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch b/recipes/linux/linux-omap-pm/dss2/0046-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch
index 0b0f104b30..50b4fea0f0 100644
--- a/recipes/linux/linux-omap-pm/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0046-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch
@@ -1,7 +1,7 @@
-From 7ddd5eaa7bc345c3719d613a46a95b7e8052ad2c Mon Sep 17 00:00:00 2001
+From 18c8d0ed7236cca6a52a701001337131d7e066e7 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Tue, 21 Apr 2009 15:18:36 +0200
-Subject: [PATCH] DSS2: fix return value for rotate_type sysfs function
+Subject: [PATCH 046/146] DSS2: fix return value for rotate_type sysfs function
Signed-off-by: Imre Deak <imre.deak@nokia.com>
---
@@ -40,5 +40,5 @@ index 4e3da42..13028ae 100644
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch b/recipes/linux/linux-omap-pm/dss2/0047-DSS2-VRAM-clear-allocated-area-with-DMA.patch
index e9fc76ce15..40748784c8 100644
--- a/recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0047-DSS2-VRAM-clear-allocated-area-with-DMA.patch
@@ -1,7 +1,7 @@
-From 02034cc79f69512a6037f03ad1243c28f59fdd8a Mon Sep 17 00:00:00 2001
+From 1850c0c28d013be68d398cac330a0dcfbb7a1ed6 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Wed, 22 Apr 2009 10:25:20 +0300
-Subject: [PATCH] DSS2: VRAM: clear allocated area with DMA
+Subject: [PATCH 047/146] DSS2: VRAM: clear allocated area with DMA
Use DMA constant fill feature to clear VRAM area when
someone allocates it.
@@ -97,5 +97,5 @@ index 8e9fe77..90276ac 100644
}
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch b/recipes/linux/linux-omap-pm/dss2/0048-DSS2-OMAPFB-remove-fb-clearing-code.patch
index 8c5edd0c3d..9348a075a3 100644
--- a/recipes/linux/linux-omap-pm/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0048-DSS2-OMAPFB-remove-fb-clearing-code.patch
@@ -1,7 +1,7 @@
-From 07482193cccdfe9ede1f47d72790dfbe54343505 Mon Sep 17 00:00:00 2001
+From ca06a6b885058df4fc7f2033e2ea569789dc0883 Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Wed, 22 Apr 2009 10:26:06 +0300
-Subject: [PATCH] DSS2: OMAPFB: remove fb clearing code
+Subject: [PATCH 048/146] DSS2: OMAPFB: remove fb clearing code
VRAM manager does the clearing now when the area is allocated.
---
@@ -49,5 +49,5 @@ index cd63740..76e7c6c 100644
rg->paddr = paddr;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch b/recipes/linux/linux-omap-pm/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch
deleted file mode 100644
index cc6663fa21..0000000000
--- a/recipes/linux/linux-omap-pm/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From e34564db95627ad20e918b240c45e2bd5555f7e8 Mon Sep 17 00:00:00 2001
-From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
-Date: Wed, 22 Apr 2009 10:06:08 +0300
-Subject: [PATCH] OMAP2/3: DMA: implement trans copy and const fill
-
-Implement transparent copy and constant fill features for OMAP2/3.
-
-Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
----
- arch/arm/plat-omap/dma.c | 81 +++++++++++++++++++++------------
- arch/arm/plat-omap/include/mach/dma.h | 1 +
- 2 files changed, 52 insertions(+), 30 deletions(-)
-
-diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
-index 3fd0e77..060ac71 100755
---- a/arch/arm/plat-omap/dma.c
-+++ b/arch/arm/plat-omap/dma.c
-@@ -310,41 +310,62 @@ EXPORT_SYMBOL(omap_set_dma_transfer_params);
-
- void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color)
- {
-- u16 w;
--
- BUG_ON(omap_dma_in_1510_mode());
-
-- if (cpu_class_is_omap2()) {
-- REVISIT_24XX();
-- return;
-- }
-+ if (cpu_class_is_omap1()) {
-+ u16 w;
-
-- w = dma_read(CCR2(lch));
-- w &= ~0x03;
-+ w = dma_read(CCR2(lch));
-+ w &= ~0x03;
-
-- switch (mode) {
-- case OMAP_DMA_CONSTANT_FILL:
-- w |= 0x01;
-- break;
-- case OMAP_DMA_TRANSPARENT_COPY:
-- w |= 0x02;
-- break;
-- case OMAP_DMA_COLOR_DIS:
-- break;
-- default:
-- BUG();
-+ switch (mode) {
-+ case OMAP_DMA_CONSTANT_FILL:
-+ w |= 0x01;
-+ break;
-+ case OMAP_DMA_TRANSPARENT_COPY:
-+ w |= 0x02;
-+ break;
-+ case OMAP_DMA_COLOR_DIS:
-+ break;
-+ default:
-+ BUG();
-+ }
-+ dma_write(w, CCR2(lch));
-+
-+ w = dma_read(LCH_CTRL(lch));
-+ w &= ~0x0f;
-+ /* Default is channel type 2D */
-+ if (mode) {
-+ dma_write((u16)color, COLOR_L(lch));
-+ dma_write((u16)(color >> 16), COLOR_U(lch));
-+ w |= 1; /* Channel type G */
-+ }
-+ dma_write(w, LCH_CTRL(lch));
- }
-- dma_write(w, CCR2(lch));
-
-- w = dma_read(LCH_CTRL(lch));
-- w &= ~0x0f;
-- /* Default is channel type 2D */
-- if (mode) {
-- dma_write((u16)color, COLOR_L(lch));
-- dma_write((u16)(color >> 16), COLOR_U(lch));
-- w |= 1; /* Channel type G */
-+ if (cpu_class_is_omap2()) {
-+ u32 val;
-+
-+ val = dma_read(CCR(lch));
-+ val &= ~((1 << 17) | (1 << 16));
-+
-+ switch (mode) {
-+ case OMAP_DMA_CONSTANT_FILL:
-+ val |= 1 << 16;
-+ break;
-+ case OMAP_DMA_TRANSPARENT_COPY:
-+ val |= 1 << 17;
-+ break;
-+ case OMAP_DMA_COLOR_DIS:
-+ break;
-+ default:
-+ BUG();
-+ }
-+ dma_write(val, CCR(lch));
-+
-+ color &= 0xffffff;
-+ dma_write(color, COLOR(lch));
- }
-- dma_write(w, LCH_CTRL(lch));
- }
- EXPORT_SYMBOL(omap_set_dma_color_mode);
-
-diff --git a/arch/arm/plat-omap/include/mach/dma.h b/arch/arm/plat-omap/include/mach/dma.h
-index 224b077..4e34f47 100644
---- a/arch/arm/plat-omap/include/mach/dma.h
-+++ b/arch/arm/plat-omap/include/mach/dma.h
-@@ -144,6 +144,7 @@
- #define OMAP_DMA4_CSSA_U(n) 0
- #define OMAP_DMA4_CDSA_L(n) 0
- #define OMAP_DMA4_CDSA_U(n) 0
-+#define OMAP1_DMA_COLOR(n) 0
-
- /*----------------------------------------------------------------------------*/
-
---
-1.5.6.5
-
diff --git a/recipes/linux/linux-omap-pm/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch b/recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-use-debugfs-not-procfs.patch
index 93ff3205d3..6bf78ce442 100644
--- a/recipes/linux/linux-omap-pm/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0049-DSS2-VRAM-use-debugfs-not-procfs.patch
@@ -1,7 +1,7 @@
-From b47aef28536f3c276d232c41cd3084c69389dca4 Mon Sep 17 00:00:00 2001
+From e9199bfc627213a53ff149dc5334d3881c749cfa Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Wed, 22 Apr 2009 14:11:52 +0300
-Subject: [PATCH] DSS2: VRAM: use debugfs, not procfs
+Subject: [PATCH 049/146] DSS2: VRAM: use debugfs, not procfs
---
arch/arm/plat-omap/vram.c | 103 +++++++++++++++------------------------------
@@ -166,5 +166,5 @@ index 90276ac..e847579 100644
return 0;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch b/recipes/linux/linux-omap-pm/dss2/0050-DSS2-VRAM-fix-section-mismatch-warning.patch
index b8f89b6239..43f5c8b811 100644
--- a/recipes/linux/linux-omap-pm/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0050-DSS2-VRAM-fix-section-mismatch-warning.patch
@@ -1,7 +1,7 @@
-From 635fa66abe6e502c9b78b1dc66757bf67fd163e1 Mon Sep 17 00:00:00 2001
+From 174cc52b0c4dd551ff80ba25568ed9a9d678ea79 Mon Sep 17 00:00:00 2001
From: Imre Deak <imre.deak@nokia.com>
Date: Wed, 22 Apr 2009 14:40:48 +0200
-Subject: [PATCH] DSS2: VRAM: fix section mismatch warning
+Subject: [PATCH 050/146] DSS2: VRAM: fix section mismatch warning
postponed_regions are accessed from the non __init
omap_vram_add_region().
@@ -30,5 +30,5 @@ index e847579..b126a64 100644
struct vram_alloc {
struct list_head list;
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch b/recipes/linux/linux-omap-pm/dss2/0051-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch
index f591fb700a..61dfbc1740 100644
--- a/recipes/linux/linux-omap-pm/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch
+++ b/recipes/linux/linux-omap-pm/dss2/0051-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch
@@ -1,7 +1,7 @@
-From c7ce3c5e9f7e28900b8ea9c3e1afe41dcdc0863d Mon Sep 17 00:00:00 2001
+From 96cedf8bb26d2a50da506051da87ee24d8e3d7fc Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
Date: Thu, 23 Apr 2009 10:46:53 +0300
-Subject: [PATCH] DSS2: disable LCD & DIGIT before resetting DSS
+Subject: [PATCH 051/146] DSS2: disable LCD & DIGIT before resetting DSS
This seems to fix the synclost problem that we get, if the bootloader
starts the DSS and the kernel resets it.
@@ -37,5 +37,5 @@ index adc1f34..aab9758 100644
/* autoidle */
REG_FLD_MOD(DSS_SYSCONFIG, 1, 0, 0);
--
-1.5.6.5
+1.6.2.4
diff --git a/recipes/linux/linux-omap-pm/dss2/0052-DSS2-DSI-more-error-handling.patch b/recipes/linux/linux-omap-pm/dss2/0052-DSS2-DSI-more-error-handling.patch
new file mode 100644
index 0000000000..1b0035317a
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0052-DSS2-DSI-more-error-handling.patch
@@ -0,0 +1,85 @@
+From bbf1f63b3b6fa18a33b70ad85729dad6bd280c16 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 27 Apr 2009 11:06:16 +0300
+Subject: [PATCH 052/146] DSS2: DSI: more error handling
+
+---
+ drivers/video/omap2/dss/dsi.c | 27 +++++++++++++++++++++++++++
+ 1 files changed, 27 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index d59ad38..d8df353 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -289,6 +289,8 @@ static struct
+
+ bool autoupdate_setup;
+
++ u32 errors;
++ spinlock_t errors_lock;
+ #ifdef DEBUG
+ ktime_t perf_setup_time;
+ ktime_t perf_start_time;
+@@ -541,6 +543,9 @@ void dsi_irq_handler(void)
+ if (irqstatus & DSI_IRQ_ERROR_MASK) {
+ DSSERR("DSI error, irqstatus %x\n", irqstatus);
+ print_irq_status(irqstatus);
++ spin_lock(&dsi.errors_lock);
++ dsi.errors |= irqstatus & DSI_IRQ_ERROR_MASK;
++ spin_unlock(&dsi.errors_lock);
+ } else if (debug_irq) {
+ print_irq_status(irqstatus);
+ }
+@@ -616,6 +621,17 @@ static void _dsi_initialize_irq(void)
+ -1 & (~DSI_CIO_IRQ_ERRCONTROL2));
+ }
+
++static u32 dsi_get_errors(void)
++{
++ unsigned long flags;
++ u32 e;
++ spin_lock_irqsave(&dsi.errors_lock, flags);
++ e = dsi.errors;
++ dsi.errors = 0;
++ spin_unlock_irqrestore(&dsi.errors_lock, flags);
++ return e;
++}
++
+ static void dsi_vc_enable_bta_irq(int channel)
+ {
+ u32 l;
+@@ -1807,6 +1823,7 @@ static int dsi_vc_send_bta(int channel)
+ static int dsi_vc_send_bta_sync(int channel)
+ {
+ int r = 0;
++ u32 err;
+
+ init_completion(&dsi.bta_completion);
+
+@@ -1822,6 +1839,13 @@ static int dsi_vc_send_bta_sync(int channel)
+ r = -EIO;
+ goto err;
+ }
++
++ err = dsi_get_errors();
++ if (err) {
++ DSSERR("Error while sending BTA: %x\n", err);
++ r = -EIO;
++ goto err;
++ }
+ err:
+ dsi_vc_disable_bta_irq(channel);
+
+@@ -3720,6 +3744,9 @@ int dsi_init(void)
+ {
+ u32 rev;
+
++ spin_lock_init(&dsi.errors_lock);
++ dsi.errors = 0;
++
+ spin_lock_init(&dsi.cmd_lock);
+ dsi.cmd_fifo = kfifo_alloc(
+ DSI_CMD_FIFO_LEN * sizeof(struct dsi_cmd_item),
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0053-DSS2-Added-global-alpha-support.patch b/recipes/linux/linux-omap-pm/dss2/0053-DSS2-Added-global-alpha-support.patch
new file mode 100644
index 0000000000..0a5a213789
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0053-DSS2-Added-global-alpha-support.patch
@@ -0,0 +1,230 @@
+From 3aae3ce190cbdf64bcfe9768ef4d20cdd2ddbd6a Mon Sep 17 00:00:00 2001
+From: Hardik Shah <hardik.shah@ti.com>
+Date: Fri, 24 Apr 2009 15:29:06 +0530
+Subject: [PATCH 053/146] DSS2: Added global alpha support.
+
+global_alpha sysfs entry for video1 plane will always show 255 as
+it does not support global_alpha.
+Initliazied the global alpha field for all the overlays
+to 255 (fully opaque).
+Documentation also updated.
+
+Signed-off-by: Hardik Shah <hardik.shah@ti.com>
+---
+ Documentation/arm/OMAP/DSS | 1 +
+ arch/arm/plat-omap/include/mach/display.h | 1 +
+ drivers/video/omap2/dss/dispc.c | 25 ++++++++++++++++---
+ drivers/video/omap2/dss/dss.h | 3 +-
+ drivers/video/omap2/dss/manager.c | 3 +-
+ drivers/video/omap2/dss/overlay.c | 37 +++++++++++++++++++++++++++++
+ 6 files changed, 64 insertions(+), 6 deletions(-)
+
+diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS
+index 9e902a2..249e1a3 100644
+--- a/Documentation/arm/OMAP/DSS
++++ b/Documentation/arm/OMAP/DSS
+@@ -133,6 +133,7 @@ name
+ output_size width,height
+ position x,y
+ screen_width width
++global_alpha global alpha 0-255 0=transparent 255=opaque
+
+ /sys/devices/platform/omapdss/manager? directory:
+ display Destination display
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index d0b4c83..45b16ca 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -363,6 +363,7 @@ struct omap_overlay_info {
+ u16 pos_y;
+ u16 out_width; /* if 0, out_width == width */
+ u16 out_height; /* if 0, out_height == height */
++ u8 global_alpha;
+ };
+
+ enum omap_overlay_caps {
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 9bab6cf..b6a39f5 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -778,6 +778,17 @@ static void _dispc_set_vid_size(enum omap_plane plane, int width, int height)
+ dispc_write_reg(vsi_reg[plane-1], val);
+ }
+
++static void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
++{
++
++ BUG_ON(plane == OMAP_DSS_VIDEO1);
++
++ if (plane == OMAP_DSS_GFX)
++ REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 7, 0);
++ else if (plane == OMAP_DSS_VIDEO2)
++ REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 23, 16);
++}
++
+ static void _dispc_set_pix_inc(enum omap_plane plane, s32 inc)
+ {
+ const struct dispc_reg ri_reg[] = { DISPC_GFX_PIXEL_INC,
+@@ -1444,7 +1455,8 @@ static int _dispc_setup_plane(enum omap_plane plane,
+ enum omap_color_mode color_mode,
+ bool ilace,
+ enum omap_dss_rotation_type rotation_type,
+- u8 rotation, int mirror)
++ u8 rotation, int mirror,
++ u8 global_alpha)
+ {
+ const int maxdownscale = cpu_is_omap34xx() ? 4 : 2;
+ bool five_taps = 0;
+@@ -1592,6 +1604,9 @@ static int _dispc_setup_plane(enum omap_plane plane,
+
+ _dispc_set_rotation_attrs(plane, rotation, mirror, color_mode);
+
++ if (plane != OMAP_DSS_VIDEO1)
++ _dispc_setup_global_alpha(plane, global_alpha);
++
+ return 0;
+ }
+
+@@ -3011,7 +3026,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+ enum omap_color_mode color_mode,
+ bool ilace,
+ enum omap_dss_rotation_type rotation_type,
+- u8 rotation, bool mirror)
++ u8 rotation, bool mirror, u8 global_alpha)
+ {
+ int r = 0;
+
+@@ -3032,7 +3047,8 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+ out_width, out_height,
+ color_mode, ilace,
+ rotation_type,
+- rotation, mirror);
++ rotation, mirror,
++ global_alpha);
+
+ enable_clocks(0);
+
+@@ -3247,7 +3263,8 @@ void dispc_setup_partial_planes(struct omap_display *display,
+ pi->color_mode, 0,
+ pi->rotation_type,
+ pi->rotation,
+- pi->mirror);
++ pi->mirror,
++ pi->global_alpha);
+
+ dispc_enable_plane(ovl->id, 1);
+ }
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 1d01ff6..20cef0a 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -273,7 +273,8 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+ enum omap_color_mode color_mode,
+ bool ilace,
+ enum omap_dss_rotation_type rotation_type,
+- u8 rotation, bool mirror);
++ u8 rotation, bool mirror,
++ u8 global_alpha);
+
+ void dispc_go(enum omap_channel channel);
+ void dispc_enable_lcd_out(bool enable);
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index bf059e0..1e6cd8d 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -464,7 +464,8 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ ilace,
+ ovl->info.rotation_type,
+ ovl->info.rotation,
+- ovl->info.mirror);
++ ovl->info.mirror,
++ ovl->info.global_alpha);
+
+ if (r) {
+ DSSERR("dispc_setup_plane failed for ovl %d\n",
+diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
+index c047206..035a57a 100644
+--- a/drivers/video/omap2/dss/overlay.c
++++ b/drivers/video/omap2/dss/overlay.c
+@@ -194,6 +194,37 @@ static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf,
+ return size;
+ }
+
++static ssize_t overlay_global_alpha_show(struct omap_overlay *ovl, char *buf)
++{
++ return snprintf(buf, PAGE_SIZE, "%d\n",
++ ovl->info.global_alpha);
++}
++
++static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
++ const char *buf, size_t size)
++{
++ int r;
++ struct omap_overlay_info info;
++
++ ovl->get_overlay_info(ovl, &info);
++
++ /* Video1 plane does not support global alpha
++ * to always make it 255 completely opaque
++ */
++ if (ovl->id == OMAP_DSS_VIDEO1)
++ info.global_alpha = 255;
++ else
++ info.global_alpha = simple_strtoul(buf, NULL, 10);
++
++ if ((r = ovl->set_overlay_info(ovl, &info)))
++ return r;
++
++ if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
++ return r;
++
++ return size;
++}
++
+ struct overlay_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct omap_overlay *, char *);
+@@ -215,6 +246,8 @@ static OVERLAY_ATTR(output_size, S_IRUGO|S_IWUSR,
+ overlay_output_size_show, overlay_output_size_store);
+ static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR,
+ overlay_enabled_show, overlay_enabled_store);
++static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR,
++ overlay_global_alpha_show, overlay_global_alpha_store);
+
+ static struct attribute *overlay_sysfs_attrs[] = {
+ &overlay_attr_name.attr,
+@@ -224,6 +257,7 @@ static struct attribute *overlay_sysfs_attrs[] = {
+ &overlay_attr_position.attr,
+ &overlay_attr_output_size.attr,
+ &overlay_attr_enabled.attr,
++ &overlay_attr_global_alpha.attr,
+ NULL
+ };
+
+@@ -444,6 +478,7 @@ void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name)
+ ovl->id = OMAP_DSS_GFX;
+ ovl->supported_modes = OMAP_DSS_COLOR_GFX_OMAP3;
+ ovl->caps = OMAP_DSS_OVL_CAP_DISPC;
++ ovl->info.global_alpha = 255;
+ break;
+ case 1:
+ ovl->name = "vid1";
+@@ -451,6 +486,7 @@ void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name)
+ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3;
+ ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
+ OMAP_DSS_OVL_CAP_DISPC;
++ ovl->info.global_alpha = 255;
+ break;
+ case 2:
+ ovl->name = "vid2";
+@@ -458,6 +494,7 @@ void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name)
+ ovl->supported_modes = OMAP_DSS_COLOR_VID_OMAP3;
+ ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
+ OMAP_DSS_OVL_CAP_DISPC;
++ ovl->info.global_alpha = 255;
+ break;
+ }
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0054-DSS2-Rotation-attrs-for-YUV-need-not-to-be-reversed.patch b/recipes/linux/linux-omap-pm/dss2/0054-DSS2-Rotation-attrs-for-YUV-need-not-to-be-reversed.patch
new file mode 100644
index 0000000000..6b28f17db5
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0054-DSS2-Rotation-attrs-for-YUV-need-not-to-be-reversed.patch
@@ -0,0 +1,35 @@
+From 08a8816f1b41c331073a3144dbb90b4fe9eeec05 Mon Sep 17 00:00:00 2001
+From: Hardik Shah <hardik.shah@ti.com>
+Date: Fri, 24 Apr 2009 14:33:48 +0530
+Subject: [PATCH 054/146] DSS2: Rotation attrs for YUV need not to be reversed for 90 and 270
+
+DSS2 supports horizontal mirroing. so only 180 and 0 degree attributes needs
+to be reversed for mirroring.
+Slight corrupt image is seen with 90 ad 270 degree rotation with mirroring
+when the image height and widht is not 32-pixels aligned. To be specific
+resolution is 168X192.
+
+Signed-off-by: Hardik Shah <hardik.shah@ti.com>
+---
+ drivers/video/omap2/dss/dispc.c | 4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index b6a39f5..f79decb 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1110,9 +1110,9 @@ static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation,
+ if (mirroring) {
+ switch (rotation) {
+ case 0: vidrot = 2; break;
+- case 1: vidrot = 3; break;
++ case 1: vidrot = 1; break;
+ case 2: vidrot = 0; break;
+- case 3: vidrot = 1; break;
++ case 3: vidrot = 3; break;
+ }
+ } else {
+ switch (rotation) {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0055-DSS2-Documentation-update-for-new-sysfs-entries-in.patch b/recipes/linux/linux-omap-pm/dss2/0055-DSS2-Documentation-update-for-new-sysfs-entries-in.patch
new file mode 100644
index 0000000000..24033a2c76
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0055-DSS2-Documentation-update-for-new-sysfs-entries-in.patch
@@ -0,0 +1,32 @@
+From 188cf22d913a2fab84e77e95651a99e70a78ec20 Mon Sep 17 00:00:00 2001
+From: Hardik Shah <hardik.shah@ti.com>
+Date: Mon, 27 Apr 2009 13:15:07 +0530
+Subject: [PATCH 055/146] DSS2: Documentation update for new sysfs entries in omapdss/manager
+
+Signed-off-by: Hardik Shah <hardik.shah@ti.com>
+---
+ Documentation/arm/OMAP/DSS | 7 ++++++-
+ 1 files changed, 6 insertions(+), 1 deletions(-)
+
+diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS
+index 249e1a3..751000b 100644
+--- a/Documentation/arm/OMAP/DSS
++++ b/Documentation/arm/OMAP/DSS
+@@ -136,8 +136,13 @@ screen_width width
+ global_alpha global alpha 0-255 0=transparent 255=opaque
+
+ /sys/devices/platform/omapdss/manager? directory:
+-display Destination display
++display Destination display
+ name
++alpha_blending_enabled 0=off 1=on
++color_key_enabled 0=off 1=on
++color_key_type gfx-destination video-source
++color_key_value 0 to 2^24
++default_color default background color RGB24 0 to 2^24
+
+ /sys/devices/platform/omapdss/display? directory:
+ ctrl_name Controller name
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0056-DSS2-Don-t-touch-plane-coordinates-when-changing-fb.patch b/recipes/linux/linux-omap-pm/dss2/0056-DSS2-Don-t-touch-plane-coordinates-when-changing-fb.patch
new file mode 100644
index 0000000000..a35e4d78eb
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0056-DSS2-Don-t-touch-plane-coordinates-when-changing-fb.patch
@@ -0,0 +1,56 @@
+From eede63f63b5c8b932b938b9b65725918e8f42775 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Fri, 17 Apr 2009 18:34:33 +0200
+Subject: [PATCH 056/146] DSS2: Don't touch plane coordinates when changing fb->ovl mapping
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+When attaching overlays to a framebuffer via the 'overlays' sysfs file
+do not touch the planes' coordinates. Without this change attaching
+VID2 to a framebuffer which already has VID1 attached would cause VID1
+to be reset to position 0,0 and scaled to 1:1 size. Also call
+omapfb_apply_changes() only once after all the overlays have been
+attached to avoid fiddling with all the overlays several times.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-sysfs.c | 13 ++++++-------
+ 1 files changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+index 13028ae..702199d 100644
+--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c
++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+@@ -183,6 +183,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+ struct omap_overlay *ovl;
+ int num_ovls, r, i;
+ int len;
++ bool added = false;
+
+ num_ovls = 0;
+
+@@ -284,15 +285,13 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+
+ ofbi->overlays[ofbi->num_overlays++] = ovl;
+
+- r = omapfb_apply_changes(fbi, 1);
++ added = true;
++ }
++
++ if (added) {
++ r = omapfb_apply_changes(fbi, 0);
+ if (r)
+ goto out;
+-
+- if (ovl->manager) {
+- r = ovl->manager->apply(ovl->manager);
+- if (r)
+- goto out;
+- }
+ }
+
+ r = count;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0057-DSS2-DSI-configure-ENTER-EXIT_HS_MODE_LATENCY.patch b/recipes/linux/linux-omap-pm/dss2/0057-DSS2-DSI-configure-ENTER-EXIT_HS_MODE_LATENCY.patch
new file mode 100644
index 0000000000..9699e07869
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0057-DSS2-DSI-configure-ENTER-EXIT_HS_MODE_LATENCY.patch
@@ -0,0 +1,97 @@
+From c843753f9a84739e7e81f6da3e29c7d5bdf3abc1 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 29 Apr 2009 17:26:30 +0300
+Subject: [PATCH 057/146] DSS2: DSI: configure ENTER/EXIT_HS_MODE_LATENCY
+
+---
+ drivers/video/omap2/dss/dsi.c | 49 ++++++++++++++++++++++++++++++++--------
+ 1 files changed, 39 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index d8df353..5225ed6 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -2309,15 +2309,26 @@ static int dsi_proto_config(struct omap_display *display)
+ return 0;
+ }
+
+-static void dsi_proto_timings(void)
+-{
+- int tlpx_half, tclk_zero, tclk_prepare, tclk_trail;
+- int tclk_pre, tclk_post;
+- int ddr_clk_pre, ddr_clk_post;
++static void dsi_proto_timings(struct omap_display *display)
++{
++ unsigned tlpx, tclk_zero, tclk_prepare, tclk_trail;
++ unsigned tclk_pre, tclk_post;
++ unsigned ths_prepare, ths_prepare_ths_zero, ths_zero;
++ unsigned ths_trail, ths_exit;
++ unsigned ddr_clk_pre, ddr_clk_post;
++ unsigned enter_hs_mode_lat, exit_hs_mode_lat;
++ unsigned ths_eot;
+ u32 r;
+
++ r = dsi_read_reg(DSI_DSIPHY_CFG0);
++ ths_prepare = FLD_GET(r, 31, 24);
++ ths_prepare_ths_zero = FLD_GET(r, 23, 16);
++ ths_zero = ths_prepare_ths_zero - ths_prepare;
++ ths_trail = FLD_GET(r, 15, 8);
++ ths_exit = FLD_GET(r, 7, 0);
++
+ r = dsi_read_reg(DSI_DSIPHY_CFG1);
+- tlpx_half = FLD_GET(r, 22, 16);
++ tlpx = FLD_GET(r, 22, 16) * 2;
+ tclk_trail = FLD_GET(r, 15, 8);
+ tclk_zero = FLD_GET(r, 7, 0);
+
+@@ -2329,17 +2340,35 @@ static void dsi_proto_timings(void)
+ /* min 60ns + 52*UI */
+ tclk_post = ns2ddr(60) + 26;
+
+- ddr_clk_pre = (tclk_pre + tlpx_half*2 + tclk_zero + tclk_prepare) / 4;
+- ddr_clk_post = (tclk_post + tclk_trail) / 4;
++ ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare,
++ 4);
++ ddr_clk_post = DIV_ROUND_UP(tclk_post + tclk_trail, 4);
+
+ r = dsi_read_reg(DSI_CLK_TIMING);
+ r = FLD_MOD(r, ddr_clk_pre, 15, 8);
+ r = FLD_MOD(r, ddr_clk_post, 7, 0);
+ dsi_write_reg(DSI_CLK_TIMING, r);
+
+- DSSDBG("ddr_clk_pre %d, ddr_clk_post %d\n",
++ DSSDBG("ddr_clk_pre %u, ddr_clk_post %u\n",
+ ddr_clk_pre,
+ ddr_clk_post);
++
++ /* ths_eot is 2 for 2 datalanes and 4 for 1 datalane */
++ if (display->hw_config.u.dsi.data1_lane != 0 &&
++ display->hw_config.u.dsi.data2_lane != 0)
++ ths_eot = 2;
++ else
++ ths_eot = 4;
++
++ enter_hs_mode_lat = DIV_ROUND_UP(tlpx + ths_prepare + ths_zero, 4) + 4;
++ exit_hs_mode_lat = DIV_ROUND_UP(ths_trail + ths_exit, 4) + 1 + ths_eot;
++
++ r = FLD_VAL(enter_hs_mode_lat, 31, 16) |
++ FLD_VAL(exit_hs_mode_lat, 15, 0);
++ dsi_write_reg(DSI_VM_TIMING7, r);
++
++ DSSDBG("enter_hs_mode_lat %u, exit_hs_mode_lat %u\n",
++ enter_hs_mode_lat, exit_hs_mode_lat);
+ }
+
+
+@@ -3340,7 +3369,7 @@ static int dsi_display_init_dsi(struct omap_display *display)
+
+ _dsi_print_reset_status();
+
+- dsi_proto_timings();
++ dsi_proto_timings(display);
+ dsi_set_lp_clk_divisor();
+
+ if (1)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0058-DSS2-Avoid-div-by-zero-when-calculating-required-fc.patch b/recipes/linux/linux-omap-pm/dss2/0058-DSS2-Avoid-div-by-zero-when-calculating-required-fc.patch
new file mode 100644
index 0000000000..c8b5f7fe83
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0058-DSS2-Avoid-div-by-zero-when-calculating-required-fc.patch
@@ -0,0 +1,34 @@
+From 7afd9adb31922a0b3b16c92df3f767f78f7cdc68 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Mon, 4 May 2009 16:18:30 +0200
+Subject: [PATCH 058/146] DSS2: Avoid div by zero when calculating required fclk
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+When calculating the required fclk rate for five tap filtering if the
+display width and output width are equal div by zero could occur. The
+TRM doesn't actually specify how this case should be handled but for
+now just skip the calculation which would trigger the div by zero.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/dispc.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index f79decb..5fc9457 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1399,7 +1399,7 @@ static unsigned long calc_fclk_five_taps(u16 width, u16 height,
+ do_div(tmp, 2 * out_height * ppl);
+ fclk = tmp;
+
+- if (height > 2 * out_height) {
++ if (height > 2 * out_height && ppl != out_width) {
+ tmp = pclk * (height - 2 * out_height) * out_width;
+ do_div(tmp, 2 * out_height * (ppl - out_width));
+ fclk = max(fclk, (u32) tmp);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0059-DSS2-VRFB-save-restore-context.patch b/recipes/linux/linux-omap-pm/dss2/0059-DSS2-VRFB-save-restore-context.patch
new file mode 100644
index 0000000000..ce2a65777e
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0059-DSS2-VRFB-save-restore-context.patch
@@ -0,0 +1,106 @@
+From 482644bbb2e168002d8a004d1553f5da994276c2 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 5 May 2009 09:05:12 +0300
+Subject: [PATCH 059/146] DSS2: VRFB: save / restore context
+
+The VRFB is part of the SMS and supplied by the core power domain; do
+the context saving while VRFB is configured and restore it along with
+the rest of the domain context.
+
+This patch only implements the restore functionality, but not the
+actual call to the restore. That belongs to PM functionality.
+---
+ arch/arm/plat-omap/include/mach/vrfb.h | 1 +
+ arch/arm/plat-omap/vrfb.c | 50 ++++++++++++++++++++++++++-----
+ 2 files changed, 43 insertions(+), 8 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h
+index 12c7fab..ee6c062 100644
+--- a/arch/arm/plat-omap/include/mach/vrfb.h
++++ b/arch/arm/plat-omap/include/mach/vrfb.h
+@@ -44,5 +44,6 @@ extern void omap_vrfb_adjust_size(u16 *width, u16 *height,
+ extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+ u16 width, u16 height,
+ enum omap_color_mode color_mode);
++extern void omap_vrfb_restore_context(void);
+
+ #endif /* __VRFB_H */
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 2ae0d68..649803e 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -39,6 +39,33 @@
+ /* bitmap of reserved contexts */
+ static unsigned ctx_map;
+
++/*
++ * Access to this happens from client drivers or the PM core after wake-up.
++ * For the first case we require locking at the driver level, for the second
++ * we don't need locking, since no drivers will run until after the wake-up
++ * has finished.
++ */
++struct {
++ u32 physical_ba;
++ u32 control;
++ u32 size;
++} vrfb_hw_context[VRFB_NUM_CTXS];
++
++void omap_vrfb_restore_context(void)
++{
++ int i;
++
++ for (i = 0; i < VRFB_NUM_CTXS; i++) {
++ /* Restore only the active contexts */
++ if (!(ctx_map & (1 << i)))
++ continue;
++ omap_writel(vrfb_hw_context[i].control, SMS_ROT_CONTROL(i));
++ omap_writel(vrfb_hw_context[i].size, SMS_ROT_SIZE(i));
++ omap_writel(vrfb_hw_context[i].physical_ba,
++ SMS_ROT_PHYSICAL_BA(i));
++ }
++}
++
+ void omap_vrfb_adjust_size(u16 *width, u16 *height,
+ u8 bytespp)
+ {
+@@ -56,6 +83,8 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+ u16 vrfb_height;
+ u8 ctx = vrfb->context;
+ u8 bytespp;
++ u32 size;
++ u32 control;
+
+ DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d)\n", ctx, paddr,
+ width, height, bytespp);
+@@ -100,15 +129,20 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+
+ DBG("vrfb w %u, h %u\n", vrfb_width, vrfb_height);
+
++ size = vrfb_width << SMS_IMAGEWIDTH_OFFSET;
++ size |= vrfb_height << SMS_IMAGEHEIGHT_OFFSET;
++
++ control = pixel_size_exp << SMS_PS_OFFSET;
++ control |= VRFB_PAGE_WIDTH_EXP << SMS_PW_OFFSET;
++ control |= VRFB_PAGE_HEIGHT_EXP << SMS_PH_OFFSET;
++
++ vrfb_hw_context[ctx].physical_ba = paddr;
++ vrfb_hw_context[ctx].size = size;
++ vrfb_hw_context[ctx].control = control;
++
+ omap_writel(paddr, SMS_ROT_PHYSICAL_BA(ctx));
+- omap_writel((vrfb_width << SMS_IMAGEWIDTH_OFFSET) |
+- (vrfb_height << SMS_IMAGEHEIGHT_OFFSET),
+- SMS_ROT_SIZE(ctx));
+-
+- omap_writel(pixel_size_exp << SMS_PS_OFFSET |
+- VRFB_PAGE_WIDTH_EXP << SMS_PW_OFFSET |
+- VRFB_PAGE_HEIGHT_EXP << SMS_PH_OFFSET,
+- SMS_ROT_CONTROL(ctx));
++ omap_writel(size, SMS_ROT_SIZE(ctx));
++ omap_writel(control, SMS_ROT_CONTROL(ctx));
+
+ DBG("vrfb offset pixels %d, %d\n",
+ vrfb_width - width, vrfb_height - height);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0060-DSS2-VRAM-Fix-indentation.patch b/recipes/linux/linux-omap-pm/dss2/0060-DSS2-VRAM-Fix-indentation.patch
new file mode 100644
index 0000000000..c9eef730ea
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0060-DSS2-VRAM-Fix-indentation.patch
@@ -0,0 +1,65 @@
+From a12a2e16a3403ffd3c4def1bb53760f8b1538adf Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 6 May 2009 09:03:43 +0300
+Subject: [PATCH 060/146] DSS2: VRAM: Fix indentation
+
+---
+ arch/arm/plat-omap/vram.c | 26 +++++++++++++-------------
+ 1 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index b126a64..f3ce849 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -287,35 +287,35 @@ static void _omap_vram_dma_cb(int lch, u16 ch_status, void *data)
+ static int _omap_vram_clear(u32 paddr, unsigned pages)
+ {
+ struct completion compl;
+- unsigned elem_count;
+- unsigned frame_count;
++ unsigned elem_count;
++ unsigned frame_count;
+ int r;
+ int lch;
+
+ init_completion(&compl);
+
+- r = omap_request_dma(OMAP_DMA_NO_DEVICE, "VRAM DMA",
++ r = omap_request_dma(OMAP_DMA_NO_DEVICE, "VRAM DMA",
+ _omap_vram_dma_cb,
+- &compl, &lch);
+- if (r) {
++ &compl, &lch);
++ if (r) {
+ pr_err("VRAM: request_dma failed for memory clear\n");
+ return -EBUSY;
+ }
+
+- elem_count = pages * PAGE_SIZE / 4;
+- frame_count = 1;
++ elem_count = pages * PAGE_SIZE / 4;
++ frame_count = 1;
+
+- omap_set_dma_transfer_params(lch, OMAP_DMA_DATA_TYPE_S32,
+- elem_count, frame_count,
+- OMAP_DMA_SYNC_ELEMENT,
+- 0, 0);
++ omap_set_dma_transfer_params(lch, OMAP_DMA_DATA_TYPE_S32,
++ elem_count, frame_count,
++ OMAP_DMA_SYNC_ELEMENT,
++ 0, 0);
+
+- omap_set_dma_dest_params(lch, 0, OMAP_DMA_AMODE_POST_INC,
++ omap_set_dma_dest_params(lch, 0, OMAP_DMA_AMODE_POST_INC,
+ paddr, 0, 0);
+
+ omap_set_dma_color_mode(lch, OMAP_DMA_CONSTANT_FILL, 0x000000);
+
+- omap_start_dma(lch);
++ omap_start_dma(lch);
+
+ if (wait_for_completion_timeout(&compl, msecs_to_jiffies(1000)) == 0) {
+ omap_stop_dma(lch);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0061-DSS2-fix-the-usage-of-get_last_off_on_transaction_i.patch b/recipes/linux/linux-omap-pm/dss2/0061-DSS2-fix-the-usage-of-get_last_off_on_transaction_i.patch
new file mode 100644
index 0000000000..8b3b962df3
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0061-DSS2-fix-the-usage-of-get_last_off_on_transaction_i.patch
@@ -0,0 +1,82 @@
+From 0196f7d35fd6780c07646aefbb4f3985794518db Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 5 May 2009 19:00:19 +0200
+Subject: [PATCH 061/146] DSS2: fix the usage of get_last_off_on_transaction_id
+
+The function returns int not unsigned since it can fail. Handle the
+failing case as if the context had been lost. So now:
+
+1. No get_last_off_on_transaction_id func in platform data->
+ never restore the context
+2. Return val < 0 -> force the restore
+3. Return val >= 0 do the restore only if the counter has changed.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/display.h | 2 +-
+ drivers/video/omap2/dss/core.c | 18 ++++++++++++------
+ 2 files changed, 13 insertions(+), 7 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 45b16ca..31ebb96 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -234,7 +234,7 @@ struct device;
+
+ /* Board specific data */
+ struct omap_dss_board_info {
+- unsigned (*get_last_off_on_transaction_id)(struct device *dev);
++ int (*get_last_off_on_transaction_id)(struct device *dev);
+ int (*dsi_power_up)(void);
+ void (*dsi_power_down)(void);
+ int num_displays;
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index ae7cd06..6d11b04 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -38,7 +38,7 @@
+
+ static struct {
+ struct platform_device *pdev;
+- unsigned ctx_id;
++ int ctx_id;
+
+ struct clk *dss_ick;
+ struct clk *dss1_fck;
+@@ -63,22 +63,28 @@ module_param_named(debug, dss_debug, bool, 0644);
+ #endif
+
+ /* CONTEXT */
+-static unsigned dss_get_ctx_id(void)
++static int dss_get_ctx_id(void)
+ {
+ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data;
++ int r;
+
+ if (!pdata->get_last_off_on_transaction_id)
+ return 0;
+-
+- return pdata->get_last_off_on_transaction_id(&core.pdev->dev);
++ r = pdata->get_last_off_on_transaction_id(&core.pdev->dev);
++ if (r < 0) {
++ dev_err(&core.pdev->dev,
++ "getting transaction ID failed, will force context restore\n");
++ r = -1;
++ }
++ return r;
+ }
+
+ int dss_need_ctx_restore(void)
+ {
+ int id = dss_get_ctx_id();
+
+- if (id != core.ctx_id) {
+- DSSDBG("ctx id %u -> id %u\n",
++ if (id < 0 || id != core.ctx_id) {
++ DSSDBG("ctx id %d -> id %d\n",
+ core.ctx_id, id);
+ core.ctx_id = id;
+ return 1;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0062-VRFB-fix-debug-messages.patch b/recipes/linux/linux-omap-pm/dss2/0062-VRFB-fix-debug-messages.patch
new file mode 100644
index 0000000000..989b8cfece
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0062-VRFB-fix-debug-messages.patch
@@ -0,0 +1,35 @@
+From ad6c07cb298391adfbbb286606cca98738675119 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 5 May 2009 11:16:14 +0200
+Subject: [PATCH 062/146] VRFB: fix debug messages
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ arch/arm/plat-omap/vrfb.c | 4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 649803e..289fc8a 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -87,7 +87,7 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+ u32 control;
+
+ DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d)\n", ctx, paddr,
+- width, height, bytespp);
++ width, height, color_mode);
+
+ switch (color_mode) {
+ case OMAP_DSS_COLOR_RGB16:
+@@ -127,7 +127,7 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+ vrfb_width = ALIGN(width * bytespp, VRFB_PAGE_WIDTH) / bytespp;
+ vrfb_height = ALIGN(height, VRFB_PAGE_HEIGHT);
+
+- DBG("vrfb w %u, h %u\n", vrfb_width, vrfb_height);
++ DBG("vrfb w %u, h %u bytespp %d\n", vrfb_width, vrfb_height, bytespp);
+
+ size = vrfb_width << SMS_IMAGEWIDTH_OFFSET;
+ size |= vrfb_height << SMS_IMAGEHEIGHT_OFFSET;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0063-VRFB-add-suspend-resume-functionality.patch b/recipes/linux/linux-omap-pm/dss2/0063-VRFB-add-suspend-resume-functionality.patch
new file mode 100644
index 0000000000..d2b9346a93
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0063-VRFB-add-suspend-resume-functionality.patch
@@ -0,0 +1,216 @@
+From c26aa6e5aab9d145b343a2a71243508378e59621 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 5 May 2009 11:16:13 +0200
+Subject: [PATCH 063/146] VRFB: add suspend/resume functionality
+
+At the moment the VRFB context is restored at each core power domain
+OFF->ON transition. This is not optimal since the VRFB might be unused
+temporarily for example when the screen is blanked. Add a suspend /
+resume function to mark these unused periods during which we'll avoid
+thea the context restore.
+
+Use atomic bitops for ctx_map for consistency.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vrfb.h | 2 +
+ arch/arm/plat-omap/vrfb.c | 75 ++++++++++++++++++++++++-----
+ drivers/video/omap2/omapfb/omapfb-main.c | 28 +++++++++++
+ 3 files changed, 92 insertions(+), 13 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h
+index ee6c062..9647d82 100644
+--- a/arch/arm/plat-omap/include/mach/vrfb.h
++++ b/arch/arm/plat-omap/include/mach/vrfb.h
+@@ -39,6 +39,8 @@ struct vrfb
+
+ extern int omap_vrfb_request_ctx(struct vrfb *vrfb);
+ extern void omap_vrfb_release_ctx(struct vrfb *vrfb);
++extern void omap_vrfb_suspend_ctx(struct vrfb *vrfb);
++extern void omap_vrfb_resume_ctx(struct vrfb *vrfb);
+ extern void omap_vrfb_adjust_size(u16 *width, u16 *height,
+ u8 bytespp);
+ extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 289fc8a..29f04e2 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -1,7 +1,9 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/ioport.h>
++
+ #include <asm/io.h>
++#include <asm/bitops.h>
+
+ #include <mach/io.h>
+ #include <mach/vrfb.h>
+@@ -37,7 +39,9 @@
+
+ #define VRFB_NUM_CTXS 12
+ /* bitmap of reserved contexts */
+-static unsigned ctx_map;
++static unsigned long ctx_map;
++/* bitmap of contexts for which we have to keep the HW context valid */
++static unsigned long ctx_map_active;
+
+ /*
+ * Access to this happens from client drivers or the PM core after wake-up.
+@@ -51,18 +55,23 @@ struct {
+ u32 size;
+ } vrfb_hw_context[VRFB_NUM_CTXS];
+
++static void inline restore_hw_context(int ctx)
++{
++ omap_writel(vrfb_hw_context[ctx].control, SMS_ROT_CONTROL(ctx));
++ omap_writel(vrfb_hw_context[ctx].size, SMS_ROT_SIZE(ctx));
++ omap_writel(vrfb_hw_context[ctx].physical_ba, SMS_ROT_PHYSICAL_BA(ctx));
++}
++
+ void omap_vrfb_restore_context(void)
+ {
+ int i;
++ unsigned long map = ctx_map_active;
+
+- for (i = 0; i < VRFB_NUM_CTXS; i++) {
+- /* Restore only the active contexts */
+- if (!(ctx_map & (1 << i)))
+- continue;
+- omap_writel(vrfb_hw_context[i].control, SMS_ROT_CONTROL(i));
+- omap_writel(vrfb_hw_context[i].size, SMS_ROT_SIZE(i));
+- omap_writel(vrfb_hw_context[i].physical_ba,
+- SMS_ROT_PHYSICAL_BA(i));
++ for (i = ffs(map); i; i = ffs(map)) {
++ /* i=1..32 */
++ i--;
++ map &= ~(1 << i);
++ restore_hw_context(i);
+ }
+ }
+
+@@ -156,13 +165,20 @@ EXPORT_SYMBOL(omap_vrfb_setup);
+ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+ {
+ int rot;
++ int ctx = vrfb->context;
+
+- if (vrfb->context == 0xff)
++ if (ctx == 0xff)
+ return;
+
+- DBG("release ctx %d\n", vrfb->context);
++ DBG("release ctx %d\n", ctx);
+
+- ctx_map &= ~(1 << vrfb->context);
++ if (!(ctx_map & (1 << ctx))) {
++ BUG();
++ return;
++ }
++ WARN_ON(!(ctx_map_active & (1 << ctx)));
++ clear_bit(ctx, &ctx_map_active);
++ clear_bit(ctx, &ctx_map);
+
+ for (rot = 0; rot < 4; ++rot) {
+ if(vrfb->paddr[rot]) {
+@@ -194,7 +210,9 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+
+ DBG("found free ctx %d\n", ctx);
+
+- ctx_map |= 1 << ctx;
++ set_bit(ctx, &ctx_map);
++ WARN_ON(ctx_map_active & (1 << ctx));
++ set_bit(ctx, &ctx_map_active);
+
+ memset(vrfb, 0, sizeof(*vrfb));
+
+@@ -219,3 +237,34 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ }
+ EXPORT_SYMBOL(omap_vrfb_request_ctx);
+
++void omap_vrfb_suspend_ctx(struct vrfb *vrfb)
++{
++ DBG("suspend ctx %d\n", vrfb->context);
++ if (vrfb->context >= VRFB_NUM_CTXS ||
++ (!(1 << vrfb->context) & ctx_map_active)) {
++ BUG();
++ return;
++ }
++ clear_bit(vrfb->context, &ctx_map_active);
++}
++EXPORT_SYMBOL(omap_vrfb_suspend_ctx);
++
++void omap_vrfb_resume_ctx(struct vrfb *vrfb)
++{
++ DBG("resume ctx %d\n", vrfb->context);
++ if (vrfb->context >= VRFB_NUM_CTXS ||
++ ((1 << vrfb->context) & ctx_map_active)) {
++ BUG();
++ return;
++ }
++ /*
++ * omap_vrfb_restore_context is normally called by the core domain
++ * save / restore logic, but since this VRFB context was suspended
++ * those calls didn't actually restore the context and now we might
++ * have an invalid context. Do an explicit restore here.
++ */
++ restore_hw_context(vrfb->context);
++ set_bit(vrfb->context, &ctx_map_active);
++}
++EXPORT_SYMBOL(omap_vrfb_resume_ctx);
++
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 76e7c6c..4bb74b7 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -1036,6 +1036,30 @@ static int omapfb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
+ return 0;
+ }
+
++static void omapfb_vrfb_suspend_all(struct omapfb2_device *fbdev)
++{
++ int i;
++
++ for (i = 0; i < fbdev->num_fbs; i++) {
++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]);
++
++ if (ofbi->region.vrfb.vaddr[0])
++ omap_vrfb_suspend_ctx(&ofbi->region.vrfb);
++ }
++}
++
++static void omapfb_vrfb_resume_all(struct omapfb2_device *fbdev)
++{
++ int i;
++
++ for (i = 0; i < fbdev->num_fbs; i++) {
++ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]);
++
++ if (ofbi->region.vrfb.vaddr[0])
++ omap_vrfb_resume_ctx(&ofbi->region.vrfb);
++ }
++}
++
+ static int omapfb_blank(int blank, struct fb_info *fbi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+@@ -1051,6 +1075,8 @@ static int omapfb_blank(int blank, struct fb_info *fbi)
+ if (display->state != OMAP_DSS_DISPLAY_SUSPENDED)
+ goto exit;
+
++ omapfb_vrfb_resume_all(fbdev);
++
+ if (display->resume)
+ r = display->resume(display);
+
+@@ -1073,6 +1099,8 @@ static int omapfb_blank(int blank, struct fb_info *fbi)
+ if (display->suspend)
+ r = display->suspend(display);
+
++ omapfb_vrfb_suspend_all(fbdev);
++
+ break;
+
+ default:
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0064-DSS2-DSI-tune-the-timings-to-be-more-relaxed.patch b/recipes/linux/linux-omap-pm/dss2/0064-DSS2-DSI-tune-the-timings-to-be-more-relaxed.patch
new file mode 100644
index 0000000000..02588ba453
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0064-DSS2-DSI-tune-the-timings-to-be-more-relaxed.patch
@@ -0,0 +1,92 @@
+From 2666676c1db8b6c50cd97e668c773e5b072de188 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 7 May 2009 14:32:55 +0300
+Subject: [PATCH 064/146] DSS2: DSI: tune the timings to be more relaxed
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dsi.c | 37 +++++++++++++++++++++----------------
+ 1 files changed, 21 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 5225ed6..67ecfcf 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -1396,28 +1396,28 @@ static void dsi_complexio_timings(void)
+ /* 1 * DDR_CLK = 2 * UI */
+
+ /* min 40ns + 4*UI max 85ns + 6*UI */
+- ths_prepare = ns2ddr(59) + 2;
++ ths_prepare = ns2ddr(70) + 2;
+
+ /* min 145ns + 10*UI */
+- ths_prepare_ths_zero = ns2ddr(145) + 5;
++ ths_prepare_ths_zero = ns2ddr(175) + 2;
+
+ /* min max(8*UI, 60ns+4*UI) */
+- ths_trail = max((unsigned)4, ns2ddr(60) + 2);
++ ths_trail = ns2ddr(60) + 5;
+
+ /* min 100ns */
+- ths_exit = ns2ddr(100);
++ ths_exit = ns2ddr(145);
+
+ /* tlpx min 50n */
+ tlpx_half = ns2ddr(25);
+
+ /* min 60ns */
+- tclk_trail = ns2ddr(60);
++ tclk_trail = ns2ddr(60) + 2;
+
+ /* min 38ns, max 95ns */
+- tclk_prepare = ns2ddr(38);
++ tclk_prepare = ns2ddr(65);
+
+ /* min tclk-prepare + tclk-zero = 300ns */
+- tclk_zero = ns2ddr(300 - 38);
++ tclk_zero = ns2ddr(260);
+
+ DSSDBG("ths_prepare %u (%uns), ths_prepare_ths_zero %u (%uns)\n",
+ ths_prepare, ddr2ns(ths_prepare),
+@@ -2340,9 +2340,19 @@ static void dsi_proto_timings(struct omap_display *display)
+ /* min 60ns + 52*UI */
+ tclk_post = ns2ddr(60) + 26;
+
++ /* ths_eot is 2 for 2 datalanes and 4 for 1 datalane */
++ if (display->hw_config.u.dsi.data1_lane != 0 &&
++ display->hw_config.u.dsi.data2_lane != 0)
++ ths_eot = 2;
++ else
++ ths_eot = 4;
++
+ ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare,
+ 4);
+- ddr_clk_post = DIV_ROUND_UP(tclk_post + tclk_trail, 4);
++ ddr_clk_post = DIV_ROUND_UP(tclk_post + tclk_trail, 4) + ths_eot;
++
++ BUG_ON(ddr_clk_pre == 0 || ddr_clk_pre > 255);
++ BUG_ON(ddr_clk_post == 0 || ddr_clk_post > 255);
+
+ r = dsi_read_reg(DSI_CLK_TIMING);
+ r = FLD_MOD(r, ddr_clk_pre, 15, 8);
+@@ -2353,14 +2363,9 @@ static void dsi_proto_timings(struct omap_display *display)
+ ddr_clk_pre,
+ ddr_clk_post);
+
+- /* ths_eot is 2 for 2 datalanes and 4 for 1 datalane */
+- if (display->hw_config.u.dsi.data1_lane != 0 &&
+- display->hw_config.u.dsi.data2_lane != 0)
+- ths_eot = 2;
+- else
+- ths_eot = 4;
+-
+- enter_hs_mode_lat = DIV_ROUND_UP(tlpx + ths_prepare + ths_zero, 4) + 4;
++ enter_hs_mode_lat = 1 + DIV_ROUND_UP(tlpx, 4) +
++ DIV_ROUND_UP(ths_prepare, 4) +
++ DIV_ROUND_UP(ths_zero + 3, 4);
+ exit_hs_mode_lat = DIV_ROUND_UP(ths_trail + ths_exit, 4) + 1 + ths_eot;
+
+ r = FLD_VAL(enter_hs_mode_lat, 31, 16) |
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0065-DSS2-VRFB-don-t-WARN-when-releasing-inactive-ctx.patch b/recipes/linux/linux-omap-pm/dss2/0065-DSS2-VRFB-don-t-WARN-when-releasing-inactive-ctx.patch
new file mode 100644
index 0000000000..915dad4def
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0065-DSS2-VRFB-don-t-WARN-when-releasing-inactive-ctx.patch
@@ -0,0 +1,29 @@
+From d60b50b5248b9badf996119c80136503b1d68ed7 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Mon, 11 May 2009 15:15:52 +0200
+Subject: [PATCH 065/146] DSS2: VRFB: don't WARN when releasing inactive ctx
+
+Releasing an inactive context is valid, it can happen when
+the application first blanks the screen then frees the
+framebuffer.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ arch/arm/plat-omap/vrfb.c | 1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 29f04e2..34395c2 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -176,7 +176,6 @@ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+ BUG();
+ return;
+ }
+- WARN_ON(!(ctx_map_active & (1 << ctx)));
+ clear_bit(ctx, &ctx_map_active);
+ clear_bit(ctx, &ctx_map);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0066-DSS2-Swap-field-offset-values-w-VRFB-rotation.patch b/recipes/linux/linux-omap-pm/dss2/0066-DSS2-Swap-field-offset-values-w-VRFB-rotation.patch
new file mode 100644
index 0000000000..3e3dd6e1af
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0066-DSS2-Swap-field-offset-values-w-VRFB-rotation.patch
@@ -0,0 +1,65 @@
+From 949c60b7fa5c016478dd403fab96b7dd1c701fc7 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Tue, 12 May 2009 14:38:05 +0200
+Subject: [PATCH 066/146] DSS2: Swap field offset values w/ VRFB rotation
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+The field 0 and field 1 offset values were still incorrect when VRFB
+rotation is used. Swap them to put the fields into proper order.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/dispc.c | 17 +++++++++++------
+ 1 files changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 5fc9457..b0e4960 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1182,6 +1182,11 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+
+ DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width,
+ width, height);
++
++ /*
++ * field 0 = even field = bottom field
++ * field 1 = odd field = top field
++ */
+ switch (rotation + mirror * 4) {
+ case 0:
+ case 2:
+@@ -1194,11 +1199,11 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+ width = width >> 1;
+ case 1:
+ case 3:
+- *offset0 = 0;
++ *offset1 = 0;
+ if (fieldmode)
+- *offset1 = screen_width * ps;
++ *offset0 = screen_width * ps;
+ else
+- *offset1 = 0;
++ *offset0 = 0;
+
+ *row_inc = pixinc(1 + (screen_width - width) +
+ (fieldmode ? screen_width : 0),
+@@ -1216,11 +1221,11 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+ width = width >> 1;
+ case 5:
+ case 7:
+- *offset0 = 0;
++ *offset1 = 0;
+ if (fieldmode)
+- *offset1 = screen_width * ps;
++ *offset0 = screen_width * ps;
+ else
+- *offset1 = 0;
++ *offset0 = 0;
+ *row_inc = pixinc(1 - (screen_width + width) -
+ (fieldmode ? screen_width : 0),
+ ps);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0067-DSS2-OMAP3EVM-Added-DSI-powerup-and-powerdown-func.patch b/recipes/linux/linux-omap-pm/dss2/0067-DSS2-OMAP3EVM-Added-DSI-powerup-and-powerdown-func.patch
new file mode 100644
index 0000000000..5b86244e1f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0067-DSS2-OMAP3EVM-Added-DSI-powerup-and-powerdown-func.patch
@@ -0,0 +1,125 @@
+From d82606b114e4bab4f425f0180741bd2b1cd8e04a Mon Sep 17 00:00:00 2001
+From: Hardik Shah <hardik.shah@ti.com>
+Date: Thu, 14 May 2009 15:04:17 +0530
+Subject: [PATCH 067/146] DSS2: OMAP3EVM: Added DSI powerup and powerdown functions
+
+Copied fom 3430sdp implementation.
+
+Signed-off-by: Hardik Shah <hardik.shah@ti.com>
+---
+ arch/arm/mach-omap2/board-omap3evm.c | 62 +++++++++++++++++++++-------------
+ 1 files changed, 38 insertions(+), 24 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
+index dffb8b9..6c9f11b 100644
+--- a/arch/arm/mach-omap2/board-omap3evm.c
++++ b/arch/arm/mach-omap2/board-omap3evm.c
+@@ -243,6 +243,38 @@ static int __init omap3_evm_i2c_init(void)
+ static int lcd_enabled;
+ static int dvi_enabled;
+
++static void enable_vpll2(int enable)
++{
++ u8 ded_val, grp_val;
++
++ if (enable) {
++ ded_val = ENABLE_VPLL2_DEDICATED;
++ grp_val = ENABLE_VPLL2_DEV_GRP;
++ } else {
++ ded_val = 0;
++ grp_val = 0;
++ }
++
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ ded_val, TWL4030_VPLL2_DEDICATED);
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ grp_val, TWL4030_VPLL2_DEV_GRP);
++}
++
++static int omap3evm_dsi_power_up(void)
++{
++ if (omap_rev() > OMAP3430_REV_ES1_0)
++ enable_vpll2(1);
++ return 0;
++}
++
++static void omap3evm_dsi_power_down(void)
++{
++ if (omap_rev() > OMAP3430_REV_ES1_0)
++ enable_vpll2(0);
++}
++
++
+ static void __init omap3_evm_display_init(void)
+ {
+ int r;
+@@ -312,12 +344,7 @@ static int omap3_evm_panel_enable_lcd(struct omap_display *display)
+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+ return -EINVAL;
+ }
+- if (omap_rev() > OMAP3430_REV_ES1_0) {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP);
+- }
++ omap3evm_dsi_power_up();
+ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);
+ lcd_enabled = 1;
+ return 0;
+@@ -325,12 +352,7 @@ static int omap3_evm_panel_enable_lcd(struct omap_display *display)
+
+ static void omap3_evm_panel_disable_lcd(struct omap_display *display)
+ {
+- if (omap_rev() > OMAP3430_REV_ES1_0) {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
+- TWL4030_VPLL2_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
+- TWL4030_VPLL2_DEV_GRP);
+- }
++ omap3evm_dsi_power_down();
+ gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1);
+ lcd_enabled = 0;
+ }
+@@ -376,13 +398,8 @@ static int omap3_evm_panel_enable_dvi(struct omap_display *display)
+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+ return -EINVAL;
+ }
+- if (omap_rev() > OMAP3430_REV_ES1_0) {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP);
+- }
+
++ omap3evm_dsi_power_up();
+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80,
+ TWL4030_GPIODATA_IN3);
+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80,
+@@ -394,13 +411,8 @@ static int omap3_evm_panel_enable_dvi(struct omap_display *display)
+
+ static void omap3_evm_panel_disable_dvi(struct omap_display *display)
+ {
+- if (omap_rev() > OMAP3430_REV_ES1_0) {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
+- TWL4030_VPLL2_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
+- TWL4030_VPLL2_DEV_GRP);
+- }
+
++ omap3evm_dsi_power_down();
+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00,
+ TWL4030_GPIODATA_IN3);
+ twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00,
+@@ -419,6 +431,8 @@ static struct omap_dss_display_config omap3_evm_display_data_dvi = {
+ };
+
+ static struct omap_dss_board_info omap3_evm_dss_data = {
++ .dsi_power_up = omap3evm_dsi_power_up,
++ .dsi_power_down = omap3evm_dsi_power_down,
+ .num_displays = 3,
+ .displays = {
+ &omap3_evm_display_data,
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0068-DSS2-DSI-Improve-perf-measurement-output.patch b/recipes/linux/linux-omap-pm/dss2/0068-DSS2-DSI-Improve-perf-measurement-output.patch
new file mode 100644
index 0000000000..f090aa8d51
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0068-DSS2-DSI-Improve-perf-measurement-output.patch
@@ -0,0 +1,127 @@
+From ba927a58cb0bc990839f4278e0fc71529cb4dc70 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 22 May 2009 12:59:41 +0300
+Subject: [PATCH 068/146] DSS2: DSI: Improve perf-measurement output
+
+---
+ drivers/video/omap2/dss/dsi.c | 67 +++++++++++++++++++++++++++++-----------
+ 1 files changed, 48 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 67ecfcf..057b057 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -294,6 +294,7 @@ static struct
+ #ifdef DEBUG
+ ktime_t perf_setup_time;
+ ktime_t perf_start_time;
++ ktime_t perf_start_time_auto;
+ int perf_measure_frames;
+
+ struct {
+@@ -360,13 +361,16 @@ static void perf_mark_start(void)
+ dsi.perf_start_time = ktime_get();
+ }
+
++static void perf_mark_start_auto(void)
++{
++ dsi.perf_start_time_auto = ktime_get();
++}
++
+ static void perf_show(const char *name)
+ {
+ ktime_t t, setup_time, trans_time;
+ u32 total_bytes;
+ u32 setup_us, trans_us, total_us;
+- const int numframes = 100;
+- static u32 s_trans_us, s_min_us = 0xffffffff, s_max_us;
+
+ if (!dsi_perf)
+ return;
+@@ -393,34 +397,57 @@ static void perf_show(const char *name)
+ dsi.update_region.bytespp;
+
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) {
++ static u32 s_total_trans_us, s_total_setup_us;
++ static u32 s_min_trans_us = 0xffffffff, s_min_setup_us;
++ static u32 s_max_trans_us, s_max_setup_us;
++ const int numframes = 100;
++ ktime_t total_time_auto;
++ u32 total_time_auto_us;
++
+ dsi.perf_measure_frames++;
+
+- if (trans_us < s_min_us)
+- s_min_us = trans_us;
++ if (setup_us < s_min_setup_us)
++ s_min_setup_us = setup_us;
++
++ if (setup_us > s_max_setup_us)
++ s_max_setup_us = setup_us;
+
+- if (trans_us > s_max_us)
+- s_max_us = trans_us;
++ s_total_setup_us += setup_us;
+
+- s_trans_us += trans_us;
++ if (trans_us < s_min_trans_us)
++ s_min_trans_us = trans_us;
++
++ if (trans_us > s_max_trans_us)
++ s_max_trans_us = trans_us;
++
++ s_total_trans_us += trans_us;
+
+ if (dsi.perf_measure_frames < numframes)
+ return;
+
+- DSSINFO("%s update: %d frames in %u us "
+- "(min/max/avg %u/%u/%u), %u fps\n",
+- name, numframes,
+- s_trans_us,
+- s_min_us,
+- s_max_us,
+- s_trans_us / numframes,
+- 1000*1000 / (s_trans_us / numframes));
++ total_time_auto = ktime_sub(t, dsi.perf_start_time_auto);
++ total_time_auto_us = (u32)ktime_to_us(total_time_auto);
++
++ printk("DSI(%s): %u fps, setup %u/%u/%u, trans %u/%u/%u\n",
++ name,
++ 1000 * 1000 * numframes / total_time_auto_us,
++ s_min_setup_us,
++ s_max_setup_us,
++ s_total_setup_us / numframes,
++ s_min_trans_us,
++ s_max_trans_us,
++ s_total_trans_us / numframes);
+
+ dsi.perf_measure_frames = 0;
+- s_trans_us = 0;
+- s_min_us = 0xffffffff;
+- s_max_us = 0;
++ s_total_setup_us = 0;
++ s_min_setup_us = 0xffffffff;
++ s_max_setup_us = 0;
++ s_total_trans_us = 0;
++ s_min_trans_us = 0xffffffff;
++ s_max_trans_us = 0;
++ perf_mark_start_auto();
+ } else {
+- DSSINFO("%s update %u us + %u us = %u us (%uHz), %u bytes, "
++ printk("DSI(%s): %u us + %u us = %u us (%uHz), %u bytes, "
+ "%u kbytes/sec\n",
+ name,
+ setup_us,
+@@ -2814,6 +2841,8 @@ static void dsi_start_auto_update(struct omap_display *display)
+ dsi.autoupdate_setup = 1;
+
+ dsi_push_autoupdate(display);
++
++ perf_mark_start_auto();
+ }
+
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0069-DSS2-DSI-Add-support-for-external-TE-signal.patch b/recipes/linux/linux-omap-pm/dss2/0069-DSS2-DSI-Add-support-for-external-TE-signal.patch
new file mode 100644
index 0000000000..e32f8ad04a
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0069-DSS2-DSI-Add-support-for-external-TE-signal.patch
@@ -0,0 +1,110 @@
+From da9828702ab1cf29401f9a93f1e950505bfa2b76 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 22 May 2009 13:43:26 +0300
+Subject: [PATCH 069/146] DSS2: DSI: Add support for external TE signal
+
+I hope this can be removed when the DSI displays work properly.
+---
+ arch/arm/plat-omap/include/mach/display.h | 4 ++++
+ drivers/video/omap2/dss/dsi.c | 29 +++++++++++++++++++----------
+ 2 files changed, 23 insertions(+), 10 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 31ebb96..dccc660 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -201,6 +201,9 @@ struct omap_dss_display_config {
+ u8 data2_lane;
+ u8 data2_pol;
+ unsigned long ddr_clk_hz;
++
++ bool ext_te;
++ u8 ext_te_gpio;
+ } dsi;
+
+ struct {
+@@ -256,6 +259,7 @@ struct omap_ctrl {
+ u16 x, u16 y, u16 w, u16 h);
+
+ int (*enable_te)(struct omap_display *display, bool enable);
++ int (*wait_for_te)(struct omap_display *display);
+
+ u8 (*get_rotate)(struct omap_display *display);
+ int (*set_rotate)(struct omap_display *display, u8 rotate);
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 057b057..f39c890 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -274,7 +274,8 @@ static struct
+ enum omap_dss_update_mode user_update_mode;
+ enum omap_dss_update_mode target_update_mode;
+ enum omap_dss_update_mode update_mode;
+- int use_te;
++ bool use_te;
++ bool use_ext_te;
+ int framedone_scheduled; /* helps to catch strange framedone bugs */
+
+ unsigned long cache_req_pck;
+@@ -2734,6 +2735,9 @@ static void dsi_update_screen_dispc(struct omap_display *display,
+
+ display->ctrl->setup_update(display, x, y, w, h);
+
++ if (dsi.use_ext_te && display->ctrl->wait_for_te)
++ display->ctrl->wait_for_te(display);
++
+ if (0)
+ dsi_vc_print_status(1);
+
+@@ -3001,19 +3005,24 @@ end:
+
+ static void dsi_do_cmd_set_te(struct omap_display *display, bool enable)
+ {
+- dsi.use_te = enable;
++ if (!display->hw_config.u.dsi.ext_te)
++ dsi.use_te = enable;
++ else
++ dsi.use_ext_te = enable;
+
+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
+ display->ctrl->enable_te(display, enable);
+
+- if (enable) {
+- /* disable LP_RX_TO, so that we can receive TE.
+- * Time to wait for TE is longer than the timer allows */
+- REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
+- } else {
+- REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
++ if (!display->hw_config.u.dsi.ext_te) {
++ if (enable) {
++ /* disable LP_RX_TO, so that we can receive TE.
++ * Time to wait for TE is longer than the timer allows */
++ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
++ } else {
++ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
++ }
+ }
+ }
+
+@@ -3508,7 +3517,7 @@ static int dsi_display_enable(struct omap_display *display)
+
+ display->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+- if (dsi.use_te)
++ if (dsi.use_te || dsi.use_ext_te)
+ dsi_push_set_te(display, 1);
+
+ dsi_push_set_update_mode(display, dsi.user_update_mode);
+@@ -3641,7 +3650,7 @@ static int dsi_display_enable_te(struct omap_display *display, bool enable)
+
+ static int dsi_display_get_te(struct omap_display *display)
+ {
+- return dsi.use_te;
++ return dsi.use_te | dsi.use_ext_te;
+ }
+
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0070-DSS2-DSI-Fix-LP-clock.patch b/recipes/linux/linux-omap-pm/dss2/0070-DSS2-DSI-Fix-LP-clock.patch
new file mode 100644
index 0000000000..a5267c816f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0070-DSS2-DSI-Fix-LP-clock.patch
@@ -0,0 +1,78 @@
+From 8f6e8ec77ffe7b13623046648cdeea33d836169c Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 22 May 2009 14:14:23 +0300
+Subject: [PATCH 070/146] DSS2: DSI: Fix LP clock
+
+Outgoing LP clock is actually DSI fclk / 2 / clk_divisor.
+
+Also don't use hardcoded LP clock frequency, but get it from
+the board file.
+---
+ arch/arm/plat-omap/include/mach/display.h | 1 +
+ drivers/video/omap2/dss/dsi.c | 18 +++++++++---------
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index dccc660..5ac1ae7 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -200,6 +200,7 @@ struct omap_dss_display_config {
+ u8 data1_pol;
+ u8 data2_lane;
+ u8 data2_pol;
++ unsigned long lp_clk_hz;
+ unsigned long ddr_clk_hz;
+
+ bool ext_te;
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index f39c890..c45140f 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -763,19 +763,19 @@ static unsigned long dsi_fclk_rate(void)
+ return r;
+ }
+
+-static int dsi_set_lp_clk_divisor(void)
++static int dsi_set_lp_clk_divisor(struct omap_display *display)
+ {
+- int n;
++ unsigned n;
+ unsigned long dsi_fclk;
+- unsigned long mhz;
+-
+- /* LP_CLK_DIVISOR, DSI fclk/n, should be 20MHz - 32kHz */
++ unsigned long lp_clk, lp_clk_req;
+
+ dsi_fclk = dsi_fclk_rate();
+
++ lp_clk_req = display->hw_config.u.dsi.lp_clk_hz;
++
+ for (n = 1; n < (1 << 13) - 1; ++n) {
+- mhz = dsi_fclk / n;
+- if (mhz <= 20*1000*1000)
++ lp_clk = dsi_fclk / 2 / n;
++ if (lp_clk <= lp_clk_req)
+ break;
+ }
+
+@@ -784,7 +784,7 @@ static int dsi_set_lp_clk_divisor(void)
+ return -EINVAL;
+ }
+
+- DSSDBG("LP_CLK_DIV %d, LP_CLK %ld\n", n, mhz);
++ DSSDBG("LP_CLK_DIV %u, LP_CLK %lu (req %lu)\n", n, lp_clk, lp_clk_req);
+
+ REG_FLD_MOD(DSI_CLK_CTRL, n, 12, 0); /* LP_CLK_DIVISOR */
+ if (dsi_fclk > 30*1000*1000)
+@@ -3413,7 +3413,7 @@ static int dsi_display_init_dsi(struct omap_display *display)
+ _dsi_print_reset_status();
+
+ dsi_proto_timings(display);
+- dsi_set_lp_clk_divisor();
++ dsi_set_lp_clk_divisor(display);
+
+ if (1)
+ _dsi_print_reset_status();
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0071-DSS2-Do-not-swap-xres-yres-or-change-rotation-in-ch.patch b/recipes/linux/linux-omap-pm/dss2/0071-DSS2-Do-not-swap-xres-yres-or-change-rotation-in-ch.patch
new file mode 100644
index 0000000000..fb5a8213d3
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0071-DSS2-Do-not-swap-xres-yres-or-change-rotation-in-ch.patch
@@ -0,0 +1,68 @@
+From cff6ff96f2b280924e7a2bb453bc8d6d9bbb67f0 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Thu, 14 May 2009 15:03:48 +0200
+Subject: [PATCH 071/146] DSS2: Do not swap xres/yres or change rotation in check_fb_var()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Do not to change the actual rotation setting in check_fb_var() and
+also remove the xres/yres swap from the same place. Applications must
+now specify var.xres and var.yres in framebuffer coordinates. Eg. if
+you have a 480x800 framebuffer and want it rotated cw/ccw to a 800x480
+display xres must be 480 and yres must be 800. So the application
+doesn't have to know if it's dealing with a 480x800 unrotated display
+or a 800x480 rotated display.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 26 ++++++--------------------
+ 1 files changed, 6 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 4bb74b7..0cdf36e 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -391,6 +391,12 @@ void set_fb_fix(struct fb_info *fbi)
+ /* used by open/write in fbmem.c */
+ fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi);
+
++ if (ofbi->rotation != var->rotate) {
++ DBG("changing rotation %d -> %d\n",
++ ofbi->rotation, var->rotate);
++ ofbi->rotation = var->rotate;
++ }
++
+ /* used by mmap in fbmem.c */
+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
+ switch (var->nonstd) {
+@@ -482,26 +488,6 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var)
+ if (var->rotate < 0 || var->rotate > 3)
+ return -EINVAL;
+
+- if (var->rotate != fbi->var.rotate) {
+- DBG("rotation changing\n");
+-
+- ofbi->rotation = var->rotate;
+-
+- if (abs(var->rotate - fbi->var.rotate) != 2) {
+- int tmp;
+- DBG("rotate changing 90/270 degrees. "
+- "swapping x/y res\n");
+-
+- tmp = var->yres;
+- var->yres = var->xres;
+- var->xres = tmp;
+-
+- tmp = var->yres_virtual;
+- var->yres_virtual = var->xres_virtual;
+- var->xres_virtual = tmp;
+- }
+- }
+-
+ xres_min = OMAPFB_PLANE_XRES_MIN;
+ xres_max = 2048;
+ yres_min = OMAPFB_PLANE_YRES_MIN;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0072-DSS2-Allow-independent-rotation-for-each-plane.patch b/recipes/linux/linux-omap-pm/dss2/0072-DSS2-Allow-independent-rotation-for-each-plane.patch
new file mode 100644
index 0000000000..4fccaa65d1
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0072-DSS2-Allow-independent-rotation-for-each-plane.patch
@@ -0,0 +1,277 @@
+From d2bb6e5832085247afc9a925ce2c4fc76a84db0e Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Thu, 14 May 2009 15:03:50 +0200
+Subject: [PATCH 072/146] DSS2: Allow independent rotation for each plane
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Allow overlays attached to the same framebuffer to have different
+rotation settings. A new sysfs file overlays_rotate can be used to
+configure the rotation settings for each overlay. The total rotation
+for a single overlay is now '(var.rotate + overlays_rotate) % 4'.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 42 ++++++++-----
+ drivers/video/omap2/omapfb/omapfb-sysfs.c | 91 ++++++++++++++++++++++++++++-
+ drivers/video/omap2/omapfb/omapfb.h | 2 +-
+ 3 files changed, 115 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 0cdf36e..c4bd081 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -174,11 +174,11 @@ static unsigned omapfb_get_vrfb_offset(struct omapfb_info *ofbi, int rot)
+ return offset;
+ }
+
+-static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi)
++static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi, int rot)
+ {
+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
+- return ofbi->region.vrfb.paddr[ofbi->rotation]
+- + omapfb_get_vrfb_offset(ofbi, ofbi->rotation);
++ return ofbi->region.vrfb.paddr[rot]
++ + omapfb_get_vrfb_offset(ofbi, rot);
+ } else {
+ return ofbi->region.paddr;
+ }
+@@ -391,11 +391,7 @@ void set_fb_fix(struct fb_info *fbi)
+ /* used by open/write in fbmem.c */
+ fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi);
+
+- if (ofbi->rotation != var->rotate) {
+- DBG("changing rotation %d -> %d\n",
+- ofbi->rotation, var->rotate);
+- ofbi->rotation = var->rotate;
+- }
++ DBG("changing rotation to %d\n", var->rotate);
+
+ /* used by mmap in fbmem.c */
+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
+@@ -665,11 +661,21 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
+ int xres, yres;
+ int screen_width;
+ int mirror;
++ int rotation = var->rotate;
++ int i;
++
++ for (i = 0; i < ofbi->num_overlays; i++) {
++ if (ovl != ofbi->overlays[i])
++ continue;
++
++ rotation = (rotation + ofbi->rotation[i]) % 4;
++ break;
++ }
+
+ DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id,
+ posx, posy, outw, outh);
+
+- if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_CCW) {
++ if (rotation == FB_ROTATE_CW || rotation == FB_ROTATE_CCW) {
+ xres = var->yres;
+ yres = var->xres;
+ } else {
+@@ -681,7 +687,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
+ var->xoffset) * var->bits_per_pixel) >> 3;
+
+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
+- data_start_p = omapfb_get_region_rot_paddr(ofbi);
++ data_start_p = omapfb_get_region_rot_paddr(ofbi, rotation);
+ data_start_v = NULL;
+ } else {
+ data_start_p = omapfb_get_region_paddr(ofbi);
+@@ -726,7 +732,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
+ info.height = yres;
+ info.color_mode = mode;
+ info.rotation_type = ofbi->rotation_type;
+- info.rotation = ofbi->rotation;
++ info.rotation = rotation;
+ info.mirror = mirror;
+
+ info.pos_x = posx;
+@@ -777,8 +783,9 @@ int omapfb_apply_changes(struct fb_info *fbi, int init)
+ }
+
+ if (init || (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) {
+- if (ofbi->rotation == FB_ROTATE_CW ||
+- ofbi->rotation == FB_ROTATE_CCW) {
++ int rotation = (var->rotate + ofbi->rotation[i]) % 4;
++ if (rotation == FB_ROTATE_CW ||
++ rotation == FB_ROTATE_CCW) {
+ outw = var->yres;
+ outh = var->xres;
+ } else {
+@@ -1575,7 +1582,7 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+ var->nonstd = 0;
+ var->bits_per_pixel = 0;
+
+- var->rotate = ofbi->rotation;
++ var->rotate = def_rotate;
+
+ /*
+ * Check if there is a default color format set in the board file,
+@@ -1605,10 +1612,12 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+
+ if (display) {
+ u16 w, h;
++ int rotation = (var->rotate + ofbi->rotation[0]) % 4;
++
+ display->get_resolution(display, &w, &h);
+
+- if (ofbi->rotation == FB_ROTATE_CW ||
+- ofbi->rotation == FB_ROTATE_CCW) {
++ if (rotation == FB_ROTATE_CW ||
++ rotation == FB_ROTATE_CCW) {
+ var->xres = h;
+ var->yres = w;
+ } else {
+@@ -1724,7 +1733,6 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
+ /* assign these early, so that fb alloc can use them */
+ ofbi->rotation_type = def_vrfb ? OMAP_DSS_ROT_VRFB :
+ OMAP_DSS_ROT_DMA;
+- ofbi->rotation = def_rotate;
+ ofbi->mirror = def_mirror;
+
+ fbdev->num_fbs++;
+diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+index 702199d..dcec42b 100644
+--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c
++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+@@ -259,8 +259,10 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+ if (ovl->manager)
+ ovl->manager->apply(ovl->manager);
+
+- for (t = i + 1; t < ofbi->num_overlays; t++)
++ for (t = i + 1; t < ofbi->num_overlays; t++) {
++ ofbi->rotation[t-1] = ofbi->rotation[t];
+ ofbi->overlays[t-1] = ofbi->overlays[t];
++ }
+
+ ofbi->num_overlays--;
+ i--;
+@@ -282,7 +284,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+
+ if (found)
+ continue;
+-
++ ofbi->rotation[ofbi->num_overlays] = 0;
+ ofbi->overlays[ofbi->num_overlays++] = ovl;
+
+ added = true;
+@@ -301,6 +303,90 @@ out:
+ return r;
+ }
+
++static ssize_t show_overlays_rotate(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct fb_info *fbi = dev_get_drvdata(dev);
++ struct omapfb_info *ofbi = FB2OFB(fbi);
++ ssize_t l = 0;
++ int t;
++
++ for (t = 0; t < ofbi->num_overlays; t++) {
++ l += snprintf(buf + l, PAGE_SIZE - l, "%s%d",
++ t == 0 ? "" : ",", ofbi->rotation[t]);
++ }
++
++ l += snprintf(buf + l, PAGE_SIZE - l, "\n");
++
++ return l;
++}
++
++static ssize_t store_overlays_rotate(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct fb_info *fbi = dev_get_drvdata(dev);
++ struct omapfb_info *ofbi = FB2OFB(fbi);
++ struct omapfb2_device *fbdev = ofbi->fbdev;
++ int num_ovls = 0, r, i;
++ int len;
++ bool changed = false;
++ u8 rotation[OMAPFB_MAX_OVL_PER_FB];
++
++ len = strlen(buf);
++ if (buf[len - 1] == '\n')
++ len = len - 1;
++
++ omapfb_lock(fbdev);
++
++ if (len > 0) {
++ char *p = (char *)buf;
++
++ while (p < buf + len) {
++ int rot;
++
++ if (num_ovls == ofbi->num_overlays) {
++ r = -EINVAL;
++ goto out;
++ }
++
++ rot = simple_strtoul(p, &p, 0);
++ if (rot < 0 || rot > 3) {
++ r = -EINVAL;
++ goto out;
++ }
++
++ if (ofbi->rotation[num_ovls] != rot)
++ changed = true;
++
++ rotation[num_ovls++] = rot;
++
++ p++;
++ }
++ }
++
++ if (num_ovls != ofbi->num_overlays) {
++ r = -EINVAL;
++ goto out;
++ }
++
++ if (changed) {
++ for (i = 0; i < num_ovls; ++i)
++ ofbi->rotation[i] = rotation[i];
++
++ r = omapfb_apply_changes(fbi, 0);
++ if (r)
++ goto out;
++
++ /* FIXME error handling? */
++ }
++
++ r = count;
++out:
++ omapfb_unlock(fbdev);
++
++ return r;
++}
++
+ static ssize_t show_size(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+@@ -369,6 +455,7 @@ static struct device_attribute omapfb_attrs[] = {
+ __ATTR(mirror, S_IRUGO | S_IWUSR, show_mirror, store_mirror),
+ __ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size),
+ __ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays),
++ __ATTR(overlays_rotate, S_IRUGO | S_IWUSR, show_overlays_rotate, store_overlays_rotate),
+ __ATTR(phys_addr, S_IRUGO, show_phys, NULL),
+ __ATTR(virt_addr, S_IRUGO, show_virt, NULL),
+ };
+diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h
+index 43f6922..f40fcce 100644
+--- a/drivers/video/omap2/omapfb/omapfb.h
++++ b/drivers/video/omap2/omapfb/omapfb.h
+@@ -62,7 +62,7 @@ struct omapfb_info {
+ struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB];
+ struct omapfb2_device *fbdev;
+ enum omap_dss_rotation_type rotation_type;
+- u8 rotation;
++ u8 rotation[OMAPFB_MAX_OVL_PER_FB];
+ bool mirror;
+ };
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0073-DSS2-DISPC-fix-irq-handling-locking.patch b/recipes/linux/linux-omap-pm/dss2/0073-DSS2-DISPC-fix-irq-handling-locking.patch
new file mode 100644
index 0000000000..e68f6458a0
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0073-DSS2-DISPC-fix-irq-handling-locking.patch
@@ -0,0 +1,225 @@
+From a4df82191832d6b384da9b6a07328ac404db9393 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Sat, 23 May 2009 18:00:21 +0300
+Subject: [PATCH 073/146] DSS2: DISPC: fix irq handling locking
+
+---
+ drivers/video/omap2/dss/dispc.c | 74 +++++++++++++++++++++++---------------
+ 1 files changed, 45 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index b0e4960..b3685b2 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -154,23 +154,20 @@ static struct {
+
+ struct clk *dpll4_m4_ck;
+
+- spinlock_t irq_lock;
+-
+ unsigned long cache_req_pck;
+ unsigned long cache_prate;
+ struct dispc_clock_info cache_cinfo;
+
+- u32 irq_error_mask;
++ spinlock_t irq_lock;
++ u32 irq_error_mask;
+ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
+-
+- spinlock_t error_lock;
+ u32 error_irqs;
+ struct work_struct error_work;
+
+ u32 ctx[DISPC_SZ_REGS / sizeof(u32)];
+ } dispc;
+
+-static void omap_dispc_set_irqs(void);
++static void _omap_dispc_set_irqs(void);
+
+ static inline void dispc_write_reg(const struct dispc_reg idx, u32 val)
+ {
+@@ -1691,10 +1688,13 @@ void dispc_enable_digit_out(bool enable)
+ }
+
+ if (enable) {
++ unsigned long flags;
+ /* When we enable digit output, we'll get an extra digit
+ * sync lost interrupt, that we need to ignore */
++ spin_lock_irqsave(&dispc.irq_lock, flags);
+ dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT;
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+ }
+
+ /* When we disable digit output, we need to wait until fields are done.
+@@ -1728,9 +1728,12 @@ void dispc_enable_digit_out(bool enable)
+ DSSERR("failed to unregister EVSYNC isr\n");
+
+ if (enable) {
++ unsigned long flags;
++ spin_lock_irqsave(&dispc.irq_lock, flags);
+ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
+ dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT);
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+ }
+
+ enable_clocks(0);
+@@ -2508,14 +2511,14 @@ int dispc_get_clock_div(struct dispc_clock_info *cinfo)
+ return 0;
+ }
+
+-static void omap_dispc_set_irqs(void)
++/* dispc.irq_lock has to be locked by the caller */
++static void _omap_dispc_set_irqs(void)
+ {
+- unsigned long flags;
+- u32 mask = dispc.irq_error_mask;
++ u32 mask;
+ int i;
+ struct omap_dispc_isr_data *isr_data;
+
+- spin_lock_irqsave(&dispc.irq_lock, flags);
++ mask = dispc.irq_error_mask;
+
+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
+ isr_data = &dispc.registered_isr[i];
+@@ -2528,9 +2531,8 @@ static void omap_dispc_set_irqs(void)
+
+ enable_clocks(1);
+ dispc_write_reg(DISPC_IRQENABLE, mask);
+- enable_clocks(0);
+
+- spin_unlock_irqrestore(&dispc.irq_lock, flags);
++ enable_clocks(0);
+ }
+
+ int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
+@@ -2571,11 +2573,14 @@ int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
+
+ break;
+ }
+-err:
++
++ _omap_dispc_set_irqs();
++
+ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+
+- if (ret == 0)
+- omap_dispc_set_irqs();
++ return 0;
++err:
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+
+ return ret;
+ }
+@@ -2606,10 +2611,10 @@ int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
+ break;
+ }
+
+- spin_unlock_irqrestore(&dispc.irq_lock, flags);
+-
+ if (ret == 0)
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
++
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+
+ return ret;
+ }
+@@ -2645,11 +2650,15 @@ static void print_irq_status(u32 status)
+ void dispc_irq_handler(void)
+ {
+ int i;
+- u32 irqstatus = dispc_read_reg(DISPC_IRQSTATUS);
++ u32 irqstatus;
+ u32 handledirqs = 0;
+ u32 unhandled_errors;
+ struct omap_dispc_isr_data *isr_data;
+
++ spin_lock(&dispc.irq_lock);
++
++ irqstatus = dispc_read_reg(DISPC_IRQSTATUS);
++
+ #ifdef DEBUG
+ if (dss_debug)
+ print_irq_status(irqstatus);
+@@ -2673,15 +2682,15 @@ void dispc_irq_handler(void)
+ unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask;
+
+ if (unhandled_errors) {
+- spin_lock(&dispc.error_lock);
+ dispc.error_irqs |= unhandled_errors;
+- spin_unlock(&dispc.error_lock);
+
+ dispc.irq_error_mask &= ~unhandled_errors;
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
+
+ schedule_work(&dispc.error_work);
+ }
++
++ spin_unlock(&dispc.irq_lock);
+ }
+
+ static void dispc_error_worker(struct work_struct *work)
+@@ -2690,10 +2699,10 @@ static void dispc_error_worker(struct work_struct *work)
+ u32 errors;
+ unsigned long flags;
+
+- spin_lock_irqsave(&dispc.error_lock, flags);
++ spin_lock_irqsave(&dispc.irq_lock, flags);
+ errors = dispc.error_irqs;
+ dispc.error_irqs = 0;
+- spin_unlock_irqrestore(&dispc.error_lock, flags);
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+
+ if (errors & DISPC_IRQ_GFX_FIFO_UNDERFLOW) {
+ DSSERR("GFX_FIFO_UNDERFLOW, disabling GFX\n");
+@@ -2836,8 +2845,10 @@ static void dispc_error_worker(struct work_struct *work)
+ }
+ }
+
++ spin_lock_irqsave(&dispc.irq_lock, flags);
+ dispc.irq_error_mask |= errors;
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+ }
+
+ int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout)
+@@ -2921,6 +2932,10 @@ void dispc_fake_vsync_irq(void)
+
+ static void _omap_dispc_initialize_irq(void)
+ {
++ unsigned long flags;
++
++ spin_lock_irqsave(&dispc.irq_lock, flags);
++
+ memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr));
+
+ dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
+@@ -2929,7 +2944,9 @@ static void _omap_dispc_initialize_irq(void)
+ * so clear it */
+ dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS));
+
+- omap_dispc_set_irqs();
++ _omap_dispc_set_irqs();
++
++ spin_unlock_irqrestore(&dispc.irq_lock, flags);
+ }
+
+ void dispc_enable_sidle(void)
+@@ -2970,7 +2987,6 @@ int dispc_init(void)
+ u32 rev;
+
+ spin_lock_init(&dispc.irq_lock);
+- spin_lock_init(&dispc.error_lock);
+
+ INIT_WORK(&dispc.error_work, dispc_error_worker);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0074-DSS2-DISPC-clear-irqstatus-for-newly-enabled-irqs.patch b/recipes/linux/linux-omap-pm/dss2/0074-DSS2-DISPC-clear-irqstatus-for-newly-enabled-irqs.patch
new file mode 100644
index 0000000000..fed108627a
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0074-DSS2-DISPC-clear-irqstatus-for-newly-enabled-irqs.patch
@@ -0,0 +1,39 @@
+From c6aecc828455ea996ae1804f166581b6d0040e84 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Sat, 23 May 2009 18:00:00 +0300
+Subject: [PATCH 074/146] DSS2: DISPC: clear irqstatus for newly enabled irqs
+
+This fixes the problem that when requesting a new irq
+we could get the isr called too early in case irqstatus
+already had that irq flag on.
+---
+ drivers/video/omap2/dss/dispc.c | 6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index b3685b2..2471cfe 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -2515,6 +2515,7 @@ int dispc_get_clock_div(struct dispc_clock_info *cinfo)
+ static void _omap_dispc_set_irqs(void)
+ {
+ u32 mask;
++ u32 old_mask;
+ int i;
+ struct omap_dispc_isr_data *isr_data;
+
+@@ -2530,6 +2531,11 @@ static void _omap_dispc_set_irqs(void)
+ }
+
+ enable_clocks(1);
++
++ old_mask = dispc_read_reg(DISPC_IRQENABLE);
++ /* clear the irqstatus for newly enabled irqs */
++ dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask);
++
+ dispc_write_reg(DISPC_IRQENABLE, mask);
+
+ enable_clocks(0);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0075-DSS2-Add-WSS-support.patch b/recipes/linux/linux-omap-pm/dss2/0075-DSS2-Add-WSS-support.patch
new file mode 100644
index 0000000000..0f9c28a49f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0075-DSS2-Add-WSS-support.patch
@@ -0,0 +1,172 @@
+From 3b453993217ece5b38170727e8240869c12b89ea Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Fri, 22 May 2009 17:23:56 +0200
+Subject: [PATCH 075/146] DSS2: Add WSS support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Add support for setting the widescreen signalling (WSS) data via sysfs.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/display.h | 3 ++
+ drivers/video/omap2/dss/display.c | 36 +++++++++++++++++++++++++++
+ drivers/video/omap2/dss/venc.c | 38 ++++++++++++++++++++++++++++-
+ 3 files changed, 76 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 5ac1ae7..2031dd5 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -514,6 +514,9 @@ struct omap_display {
+ u16 x, u16 y, u16 w, u16 h);
+
+ void (*configure_overlay)(struct omap_overlay *overlay);
++
++ int (*set_wss)(struct omap_display *display, u32 wss);
++ u32 (*get_wss)(struct omap_display *display);
+ };
+
+ int omap_dss_get_num_displays(void);
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 9aaf392..50ced29 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -239,6 +239,39 @@ struct display_attribute {
+ ssize_t (*store)(struct omap_display *, const char *, size_t);
+ };
+
++static ssize_t display_wss_show(struct omap_display *display, char *buf)
++{
++ unsigned int wss;
++
++ if (!display->get_wss)
++ return -ENOENT;
++
++ wss = display->get_wss(display);
++
++ return snprintf(buf, PAGE_SIZE, "0x%05x\n", wss);
++}
++
++static ssize_t display_wss_store(struct omap_display *display,
++ const char *buf, size_t size)
++{
++ unsigned long wss;
++ int r;
++
++ if (!display->get_wss || !display->set_wss)
++ return -ENOENT;
++
++ if (strict_strtoul(buf, 0, &wss))
++ return -EINVAL;
++
++ if (wss > 0xfffff)
++ return -EINVAL;
++
++ if ((r = display->set_wss(display, wss)))
++ return r;
++
++ return size;
++}
++
+ #define DISPLAY_ATTR(_name, _mode, _show, _store) \
+ struct display_attribute display_attr_##_name = \
+ __ATTR(_name, _mode, _show, _store)
+@@ -258,6 +291,8 @@ static DISPLAY_ATTR(mirror, S_IRUGO|S_IWUSR,
+ display_mirror_show, display_mirror_store);
+ static DISPLAY_ATTR(panel_name, S_IRUGO, display_panel_name_show, NULL);
+ static DISPLAY_ATTR(ctrl_name, S_IRUGO, display_ctrl_name_show, NULL);
++static DISPLAY_ATTR(wss, S_IRUGO|S_IWUSR,
++ display_wss_show, display_wss_store);
+
+ static struct attribute *display_sysfs_attrs[] = {
+ &display_attr_name.attr,
+@@ -269,6 +304,7 @@ static struct attribute *display_sysfs_attrs[] = {
+ &display_attr_mirror.attr,
+ &display_attr_panel_name.attr,
+ &display_attr_ctrl_name.attr,
++ &display_attr_wss.attr,
+ NULL
+ };
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index b655df4..0cbba9f 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -289,6 +289,7 @@ EXPORT_SYMBOL(omap_dss_ntsc_timings);
+ static struct {
+ void __iomem *base;
+ struct mutex venc_lock;
++ u32 wss_data;
+ } venc;
+
+ static struct omap_panel venc_panel = {
+@@ -320,7 +321,7 @@ static void venc_write_config(const struct venc_config *config)
+ venc_write_reg(VENC_BLACK_LEVEL, config->black_level);
+ venc_write_reg(VENC_BLANK_LEVEL, config->blank_level);
+ venc_write_reg(VENC_M_CONTROL, config->m_control);
+- venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data);
++ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data | venc.wss_data);
+ venc_write_reg(VENC_S_CARR, config->s_carr);
+ venc_write_reg(VENC_L21__WC_CTL, config->l21__wc_ctl);
+ venc_write_reg(VENC_SAVID__EAVID, config->savid__eavid);
+@@ -482,6 +483,8 @@ static int venc_enable_display(struct omap_display *display)
+ goto err;
+ }
+
++ venc.wss_data = 0;
++
+ venc_power_on(display);
+
+ display->state = OMAP_DSS_DISPLAY_ACTIVE;
+@@ -589,6 +592,37 @@ static int venc_check_timings(struct omap_display *display,
+ return -EINVAL;
+ }
+
++static u32 venc_get_wss(struct omap_display *display)
++{
++ /* Invert due to VENC_L21_WC_CTL:INV=1 */
++ return (venc.wss_data >> 8) ^ 0xfffff;
++}
++
++static int venc_set_wss(struct omap_display *display,
++ u32 wss)
++{
++ const struct venc_config *config;
++
++ DSSDBG("venc_set_wss\n");
++
++ mutex_lock(&venc.venc_lock);
++
++ config = venc_timings_to_config(&display->panel->timings);
++
++ /* Invert due to VENC_L21_WC_CTL:INV=1 */
++ venc.wss_data = (wss ^ 0xfffff) << 8;
++
++ venc_enable_clocks(1);
++
++ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data | venc.wss_data);
++
++ venc_enable_clocks(0);
++
++ mutex_unlock(&venc.venc_lock);
++
++ return 0;
++}
++
+ void venc_init_display(struct omap_display *display)
+ {
+ display->panel = &venc_panel;
+@@ -599,6 +633,8 @@ void venc_init_display(struct omap_display *display)
+ display->get_timings = venc_get_timings;
+ display->set_timings = venc_set_timings;
+ display->check_timings = venc_check_timings;
++ display->get_wss = venc_get_wss;
++ display->set_wss = venc_set_wss;
+ }
+
+ void venc_dump_regs(struct seq_file *s)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0076-DSS2-Fix-PAL-NTSC-timings.patch b/recipes/linux/linux-omap-pm/dss2/0076-DSS2-Fix-PAL-NTSC-timings.patch
new file mode 100644
index 0000000000..28ae3ec5ac
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0076-DSS2-Fix-PAL-NTSC-timings.patch
@@ -0,0 +1,68 @@
+From f41bc6591494db0698b5f0f6bcf01ee6050c732f Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Fri, 22 May 2009 17:23:57 +0200
+Subject: [PATCH 076/146] DSS2: Fix PAL/NTSC timings
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Fix the PAL/NTSC video timings. Only some of these values are actually
+specified for digital video, the rest were calculated based on the the
+analog timings. The analog timings differ from the digital timings
+anyway but these should be close to the truth. These values aren't
+actually needed by the VENC but it doesn't hurt to make them a bit more
+accurate.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/venc.c | 28 ++++++++++++++--------------
+ 1 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index 0cbba9f..02286b8 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -263,26 +263,26 @@ static const struct venc_config venc_config_pal_bdghi = {
+ const struct omap_video_timings omap_dss_pal_timings = {
+ .x_res = 720,
+ .y_res = 574,
+- .pixel_clock = 26181,
+- .hsw = 32,
+- .hfp = 80,
+- .hbp = 48,
+- .vsw = 7,
+- .vfp = 3,
+- .vbp = 6,
++ .pixel_clock = 13500,
++ .hsw = 64,
++ .hfp = 12,
++ .hbp = 68,
++ .vsw = 5,
++ .vfp = 5,
++ .vbp = 41,
+ };
+ EXPORT_SYMBOL(omap_dss_pal_timings);
+
+ const struct omap_video_timings omap_dss_ntsc_timings = {
+ .x_res = 720,
+ .y_res = 482,
+- .pixel_clock = 22153,
+- .hsw = 32,
+- .hfp = 80,
+- .hbp = 48,
+- .vsw = 10,
+- .vfp = 3,
+- .vbp = 6,
++ .pixel_clock = 13500,
++ .hsw = 64,
++ .hfp = 16,
++ .hbp = 58,
++ .vsw = 6,
++ .vfp = 6,
++ .vbp = 31,
+ };
+ EXPORT_SYMBOL(omap_dss_ntsc_timings);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0077-DSS2-Add-venc-debugfs-file.patch b/recipes/linux/linux-omap-pm/dss2/0077-DSS2-Add-venc-debugfs-file.patch
new file mode 100644
index 0000000000..713c72533e
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0077-DSS2-Add-venc-debugfs-file.patch
@@ -0,0 +1,34 @@
+From d0d9b920dcf074ca854f11a9bb80d3a7fcf83b97 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Fri, 22 May 2009 17:23:58 +0200
+Subject: [PATCH 077/146] DSS2: Add venc debugfs file
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Actually make the venc register dump file visible in debugfs. Somehow
+this hunk got dropped when the venc debugfs file was originally added.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/core.c | 4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index 6d11b04..2a38507 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -396,6 +396,10 @@ static int dss_initialize_debugfs(void)
+ debugfs_create_file("dsi", S_IRUGO, dss_debugfs_dir,
+ &dsi_dump_regs, &dss_debug_fops);
+ #endif
++#ifdef CONFIG_OMAP2_DSS_VENC
++ debugfs_create_file("venc", S_IRUGO, dss_debugfs_dir,
++ &venc_dump_regs, &dss_debug_fops);
++#endif
+ return 0;
+ }
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0078-DSS2-Enable-replication-logic-feature.patch b/recipes/linux/linux-omap-pm/dss2/0078-DSS2-Enable-replication-logic-feature.patch
new file mode 100644
index 0000000000..ac502112fd
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0078-DSS2-Enable-replication-logic-feature.patch
@@ -0,0 +1,138 @@
+From 8d239b2c7f05acf2f732d292f5d7c5abc3c7ce1a Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 26 May 2009 10:49:24 +0300
+Subject: [PATCH 078/146] DSS2: Enable replication logic feature
+
+Replication logic will make colors a bit better on active matrix LCD
+when the fb is in 16bpp mode and the LCD interface is 18/24bpp.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dispc.c | 19 +++++++++++++++++++
+ drivers/video/omap2/dss/display.c | 34 ++++++++++++++++++++++++++++++++++
+ drivers/video/omap2/dss/dss.h | 3 +++
+ drivers/video/omap2/dss/manager.c | 5 +++++
+ 4 files changed, 61 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 2471cfe..e936c59 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -908,6 +908,20 @@ static void _dispc_set_vid_color_conv(enum omap_plane plane, bool enable)
+ dispc_write_reg(dispc_reg_att[plane], val);
+ }
+
++void dispc_enable_replication(enum omap_plane plane, bool enable)
++{
++ int bit;
++
++ if (plane == OMAP_DSS_GFX)
++ bit = 5;
++ else
++ bit = 10;
++
++ enable_clocks(1);
++ REG_FLD_MOD(dispc_reg_att[plane], enable, bit, bit);
++ enable_clocks(0);
++}
++
+ void dispc_set_lcd_size(u16 width, u16 height)
+ {
+ u32 val;
+@@ -3293,6 +3307,11 @@ void dispc_setup_partial_planes(struct omap_display *display,
+ pi->mirror,
+ pi->global_alpha);
+
++ if (dss_use_replication(display, ovl->info.color_mode))
++ dispc_enable_replication(ovl->id, true);
++ else
++ dispc_enable_replication(ovl->id, false);
++
+ dispc_enable_plane(ovl->id, 1);
+ }
+
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 50ced29..77a6dc4 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -411,6 +411,40 @@ static int default_get_recommended_bpp(struct omap_display *display)
+ }
+ }
+
++/* Checks if replication logic should be used. Only use for active matrix,
++ * when overlay is in RGB12U or RGB16 mode, and LCD interface is
++ * 18bpp or 24bpp */
++bool dss_use_replication(struct omap_display *display,
++ enum omap_color_mode mode)
++{
++ int bpp;
++
++ if (mode != OMAP_DSS_COLOR_RGB12U && mode != OMAP_DSS_COLOR_RGB16)
++ return false;
++
++ if (display->type == OMAP_DISPLAY_TYPE_DPI &&
++ (display->panel->config & OMAP_DSS_LCD_TFT) == 0)
++ return false;
++
++ switch (display->type) {
++ case OMAP_DISPLAY_TYPE_DPI:
++ bpp = display->hw_config.u.dpi.data_lines;
++ break;
++ case OMAP_DISPLAY_TYPE_VENC:
++ case OMAP_DISPLAY_TYPE_SDI:
++ bpp = 24;
++ break;
++ case OMAP_DISPLAY_TYPE_DBI:
++ case OMAP_DISPLAY_TYPE_DSI:
++ bpp = display->ctrl->pixel_size;
++ break;
++ default:
++ BUG();
++ }
++
++ return bpp > 16;
++}
++
+ void dss_init_displays(struct platform_device *pdev)
+ {
+ struct omap_dss_board_info *pdata = pdev->dev.platform_data;
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 20cef0a..d51ffe4 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -173,6 +173,8 @@ void dss_uninit_displays(struct platform_device *pdev);
+ int dss_suspend_all_displays(void);
+ int dss_resume_all_displays(void);
+ struct omap_display *dss_get_display(int no);
++bool dss_use_replication(struct omap_display *display,
++ enum omap_color_mode mode);
+
+ /* manager */
+ int dss_init_overlay_managers(struct platform_device *pdev);
+@@ -280,6 +282,7 @@ void dispc_go(enum omap_channel channel);
+ void dispc_enable_lcd_out(bool enable);
+ void dispc_enable_digit_out(bool enable);
+ int dispc_enable_plane(enum omap_plane plane, bool enable);
++void dispc_enable_replication(enum omap_plane plane, bool enable);
+
+ void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode);
+ void dispc_set_tft_data_lines(u8 data_lines);
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 1e6cd8d..8d5d00f 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -474,6 +474,11 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ continue;
+ }
+
++ if (dss_use_replication(display, ovl->info.color_mode))
++ dispc_enable_replication(ovl->id, true);
++ else
++ dispc_enable_replication(ovl->id, false);
++
+ dispc_enable_plane(ovl->id, 1);
+ }
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0079-DSS2-support-for-querying-the-supported-overlay-col.patch b/recipes/linux/linux-omap-pm/dss2/0079-DSS2-support-for-querying-the-supported-overlay-col.patch
new file mode 100644
index 0000000000..3bc96874e6
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0079-DSS2-support-for-querying-the-supported-overlay-col.patch
@@ -0,0 +1,180 @@
+From 31204dee400ffa13900eedef77ec78234a0bbbf9 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 26 May 2009 16:42:16 +0200
+Subject: [PATCH 079/146] DSS2: support for querying the supported overlay color modes
+
+Adds an IOCTL through which an application can iterate through the
+color modes supported by an overlay. Instead of a simple mode ID
+this will give the parameters needed to setup the FB, as this is what
+the application will do anyway.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 62 +++++++++++++++++++++++++++++
+ drivers/video/omap2/omapfb/omapfb-main.c | 4 +-
+ drivers/video/omap2/omapfb/omapfb.h | 2 +
+ include/linux/omapfb.h | 15 ++++++-
+ 4 files changed, 80 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 79d8916..980e3db 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -434,6 +434,52 @@ static int omapfb_memory_read(struct fb_info *fbi,
+ return r;
+ }
+
++int omapfb_get_ovl_colormode(struct omapfb2_device *fbdev,
++ struct omapfb_ovl_colormode *mode)
++{
++ int ovl_idx = mode->overlay_idx;
++ int mode_idx = mode->mode_idx;
++ struct omap_overlay *ovl;
++ enum omap_color_mode supported_modes;
++ struct fb_var_screeninfo var;
++ int i;
++
++ if (ovl_idx >= fbdev->num_overlays)
++ return -ENODEV;
++ ovl = fbdev->overlays[ovl_idx];
++ supported_modes = ovl->supported_modes;
++
++ mode_idx = mode->mode_idx;
++
++ for (i = 0; i < sizeof(supported_modes) * 8; i++) {
++ if (!(supported_modes & (1 << i)))
++ continue;
++ /*
++ * It's possible that the FB doesn't support a mode
++ * that is supported by the overlay, so call the
++ * following here.
++ */
++ if (dss_mode_to_fb_mode(1 << i, &var) < 0)
++ continue;
++
++ mode_idx--;
++ if (mode_idx < 0)
++ break;
++ }
++
++ if (i == sizeof(supported_modes) * 8)
++ return -ENOENT;
++
++ mode->bits_per_pixel = var.bits_per_pixel;
++ mode->nonstd = var.nonstd;
++ mode->red = var.red;
++ mode->green = var.green;
++ mode->blue = var.blue;
++ mode->transp = var.transp;
++
++ return 0;
++}
++
+ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+@@ -447,6 +493,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ struct omapfb_caps caps;
+ struct omapfb_mem_info mem_info;
+ struct omapfb_color_key color_key;
++ struct omapfb_ovl_colormode ovl_colormode;
+ enum omapfb_update_mode update_mode;
+ int test_num;
+ struct omapfb_memory_read memory_read;
+@@ -554,6 +601,21 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ r = -EFAULT;
+ break;
+
++ case OMAPFB_GET_OVERLAY_COLORMODE:
++ DBG("ioctl GET_OVERLAY_COLORMODE\n");
++ if (copy_from_user(&p.ovl_colormode, (void __user *)arg,
++ sizeof(p.ovl_colormode))) {
++ r = -EFAULT;
++ break;
++ }
++ r = omapfb_get_ovl_colormode(fbdev, &p.ovl_colormode);
++ if (r < 0)
++ break;
++ if (copy_to_user((void __user *)arg, &p.ovl_colormode,
++ sizeof(p.ovl_colormode)))
++ r = -EFAULT;
++ break;
++
+ case OMAPFB_SET_UPDATE_MODE:
+ DBG("ioctl SET_UPDATE_MODE\n");
+ if (get_user(p.update_mode, (int __user *)arg))
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index c4bd081..c3690b8 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -364,8 +364,8 @@ static enum omap_color_mode fb_mode_to_dss_mode(struct fb_var_screeninfo *var)
+ return -EINVAL;
+ }
+
+-static int dss_mode_to_fb_mode(enum omap_color_mode dssmode,
+- struct fb_var_screeninfo *var)
++int dss_mode_to_fb_mode(enum omap_color_mode dssmode,
++ struct fb_var_screeninfo *var)
+ {
+ int i;
+
+diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h
+index f40fcce..e750bc0 100644
+--- a/drivers/video/omap2/omapfb/omapfb.h
++++ b/drivers/video/omap2/omapfb/omapfb.h
+@@ -111,6 +111,8 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg);
+
+ int omapfb_mode_to_timings(const char *mode_str,
+ struct omap_video_timings *timings, u8 *bpp);
++int dss_mode_to_fb_mode(enum omap_color_mode dssmode,
++ struct fb_var_screeninfo *var);
+
+ /* find the display connected to this fb, if any */
+ static inline struct omap_display *fb2display(struct fb_info *fbi)
+diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h
+index 7a34f22..fd522d3 100644
+--- a/include/linux/omapfb.h
++++ b/include/linux/omapfb.h
+@@ -24,6 +24,8 @@
+ #ifndef __OMAPFB_H
+ #define __OMAPFB_H
+
++#include <linux/fb.h>
++
+ #include <asm/ioctl.h>
+ #include <asm/types.h>
+
+@@ -52,6 +54,7 @@
+ #define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info)
+ #define OMAPFB_WAITFORVSYNC OMAP_IO(57)
+ #define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read)
++#define OMAPFB_GET_OVERLAY_COLORMODE OMAP_IOR(59, struct omapfb_ovl_colormode)
+
+ #define OMAPFB_CAPS_GENERIC_MASK 0x00000fff
+ #define OMAPFB_CAPS_LCDC_MASK 0x00fff000
+@@ -179,11 +182,21 @@ struct omapfb_memory_read {
+ void __user *buffer;
+ };
+
++struct omapfb_ovl_colormode {
++ __u8 overlay_idx;
++ __u8 mode_idx;
++ __u32 bits_per_pixel;
++ __u32 nonstd;
++ struct fb_bitfield red;
++ struct fb_bitfield green;
++ struct fb_bitfield blue;
++ struct fb_bitfield transp;
++};
++
+ #ifdef __KERNEL__
+
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+-#include <linux/fb.h>
+ #include <linux/mutex.h>
+
+ #include <mach/board.h>
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0080-DSS2-fix-uninitialized-var-in-OMAPFB_GET_CAPS-IOCTL.patch b/recipes/linux/linux-omap-pm/dss2/0080-DSS2-fix-uninitialized-var-in-OMAPFB_GET_CAPS-IOCTL.patch
new file mode 100644
index 0000000000..4454bbae1f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0080-DSS2-fix-uninitialized-var-in-OMAPFB_GET_CAPS-IOCTL.patch
@@ -0,0 +1,26 @@
+From 5069f20f593bc6b0bdeb1913130be894a2a3d071 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@nokia.com>
+Date: Tue, 26 May 2009 16:53:46 +0200
+Subject: [PATCH 080/146] DSS2: fix uninitialized var in OMAPFB_GET_CAPS IOCTL
+
+Spotted-by: Ville Syrjala <ville.syrjala@nokia.com>
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 980e3db..123f5dc 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -595,6 +595,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ break;
+ }
+
++ memset(&p.caps, 0, sizeof(p.caps));
+ p.caps.ctrl = display->caps;
+
+ if (copy_to_user((void __user *)arg, &p.caps, sizeof(p.caps)))
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0081-DSS2-Reset-WSS-data-only-when-changing-TV-standard.patch b/recipes/linux/linux-omap-pm/dss2/0081-DSS2-Reset-WSS-data-only-when-changing-TV-standard.patch
new file mode 100644
index 0000000000..239465729e
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0081-DSS2-Reset-WSS-data-only-when-changing-TV-standard.patch
@@ -0,0 +1,54 @@
+From 6a853312fa903f4369af3ea485c86753aca556fc Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Tue, 26 May 2009 16:14:49 +0200
+Subject: [PATCH 081/146] DSS2: Reset WSS data only when changing TV standard
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+Do not reset the the WSS data every time the display is enabled. Only
+reset it when the TV standard changes since PAL and NTSC use different
+WSS data layouts.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/venc.c | 9 +++++++--
+ 1 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index 02286b8..b0f0795 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -406,6 +406,8 @@ int venc_init(void)
+
+ mutex_init(&venc.venc_lock);
+
++ venc.wss_data = 0;
++
+ venc_panel.timings = omap_dss_pal_timings;
+
+ venc.base = ioremap(VENC_BASE, SZ_1K);
+@@ -483,8 +485,6 @@ static int venc_enable_display(struct omap_display *display)
+ goto err;
+ }
+
+- venc.wss_data = 0;
+-
+ venc_power_on(display);
+
+ display->state = OMAP_DSS_DISPLAY_ACTIVE;
+@@ -570,6 +570,11 @@ static void venc_set_timings(struct omap_display *display,
+ struct omap_video_timings *timings)
+ {
+ DSSDBG("venc_set_timings\n");
++
++ /* Reset WSS data when the TV standard changes. */
++ if (memcmp(&display->panel->timings, timings, sizeof(*timings)))
++ venc.wss_data = 0;
++
+ display->panel->timings = *timings;
+ if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
+ /* turn the venc off and on to get new timings to use */
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0082-DSS2-DSI-implement-timeout-for-DSI-transfer.patch b/recipes/linux/linux-omap-pm/dss2/0082-DSS2-DSI-implement-timeout-for-DSI-transfer.patch
new file mode 100644
index 0000000000..6d211adc92
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0082-DSS2-DSI-implement-timeout-for-DSI-transfer.patch
@@ -0,0 +1,78 @@
+From d8745c631cfcbf6b91b7ffd1c228b1c27f6d1917 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 27 May 2009 12:00:20 +0300
+Subject: [PATCH 082/146] DSS2: DSI: implement timeout for DSI transfer
+
+Proper transfer shutdown is still missing.
+---
+ drivers/video/omap2/dss/dsi.c | 27 +++++++++++++++++++++++++++
+ 1 files changed, 27 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index c45140f..38d3807 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -269,6 +269,7 @@ static struct
+
+ struct work_struct framedone_work;
+ struct work_struct process_work;
++ struct delayed_work framedone_timeout_work;
+ struct workqueue_struct *workqueue;
+
+ enum omap_dss_update_mode user_update_mode;
+@@ -2756,12 +2757,34 @@ static void dsi_update_screen_dispc(struct omap_display *display,
+
+ dispc_disable_sidle();
+
++ queue_delayed_work(dsi.workqueue, &dsi.framedone_timeout_work,
++ msecs_to_jiffies(1000));
++
+ dispc_enable_lcd_out(1);
+
+ if (dsi.use_te)
+ dsi_vc_send_bta(1);
+ }
+
++static void framedone_timeout_callback(struct work_struct *work)
++{
++ DSSERR("framedone timeout\n");
++
++ dispc_enable_lcd_out(0);
++
++ /* XXX TODO: cancel the transfer properly */
++
++ /* XXX check that fifo is not full. otherwise we would sleep and never
++ * get to process_cmd_fifo below */
++ /* We check for target_update_mode, not update_mode. No reason to push
++ * new updates if we're turning auto update off */
++ if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO)
++ dsi_push_autoupdate(dsi.vc[1].display);
++
++ atomic_set(&dsi.cmd_pending, 0);
++ dsi_process_cmd_fifo(NULL);
++}
++
+ static void framedone_callback(void *data, u32 mask)
+ {
+ if (dsi.framedone_scheduled) {
+@@ -2769,6 +2792,8 @@ static void framedone_callback(void *data, u32 mask)
+ return;
+ }
+
++ cancel_delayed_work(&dsi.framedone_timeout_work);
++
+ dispc_enable_sidle();
+
+ dsi.framedone_scheduled = 1;
+@@ -3834,6 +3859,8 @@ int dsi_init(void)
+ dsi.workqueue = create_singlethread_workqueue("dsi");
+ INIT_WORK(&dsi.framedone_work, framedone_worker);
+ INIT_WORK(&dsi.process_work, dsi_process_cmd_fifo);
++ INIT_DELAYED_WORK(&dsi.framedone_timeout_work,
++ framedone_timeout_callback);
+
+ mutex_init(&dsi.lock);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0083-DSS2-DSI-reset-perf-frame-counter-when-starting-au.patch b/recipes/linux/linux-omap-pm/dss2/0083-DSS2-DSI-reset-perf-frame-counter-when-starting-au.patch
new file mode 100644
index 0000000000..e3838f0d51
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0083-DSS2-DSI-reset-perf-frame-counter-when-starting-au.patch
@@ -0,0 +1,32 @@
+From 26e96637277d8631372a14e82e43b4023b75eff7 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 27 May 2009 16:19:28 +0300
+Subject: [PATCH 083/146] DSS2: DSI: reset perf frame counter when starting autoupdate
+
+---
+ drivers/video/omap2/dss/dsi.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 38d3807..a845ea6 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -365,6 +365,7 @@ static void perf_mark_start(void)
+
+ static void perf_mark_start_auto(void)
+ {
++ dsi.perf_measure_frames = 0;
+ dsi.perf_start_time_auto = ktime_get();
+ }
+
+@@ -440,7 +441,6 @@ static void perf_show(const char *name)
+ s_max_trans_us,
+ s_total_trans_us / numframes);
+
+- dsi.perf_measure_frames = 0;
+ s_total_setup_us = 0;
+ s_min_setup_us = 0xffffffff;
+ s_max_setup_us = 0;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0084-DSS2-DSI-Implement-DSI-bus-lock.patch b/recipes/linux/linux-omap-pm/dss2/0084-DSS2-DSI-Implement-DSI-bus-lock.patch
new file mode 100644
index 0000000000..457fb19221
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0084-DSS2-DSI-Implement-DSI-bus-lock.patch
@@ -0,0 +1,265 @@
+From b666333651cbb1e60a84b6be8b9d45b3104ca804 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 27 May 2009 16:34:54 +0300
+Subject: [PATCH 084/146] DSS2: DSI: Implement DSI bus lock
+
+DSI bus lock protects the DSI bus. Normally dsi driver acquires the
+lock, but if display drivers have their own workqueues, or similar,
+they need to acquire the bus lock before sending data.
+---
+ arch/arm/plat-omap/include/mach/display.h | 2 +
+ drivers/video/omap2/dss/dsi.c | 61 +++++++++++++++++++++++++++++
+ 2 files changed, 63 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 2031dd5..d36f730 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -169,6 +169,8 @@ int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode,
+ int hs_pol_inv, int vs_pol_inv, int extif_div);
+
+ /* DSI */
++void dsi_bus_lock(void);
++void dsi_bus_unlock(void);
+ int dsi_vc_dcs_write(int channel, u8 *data, int len);
+ int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len);
+ int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen);
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index a845ea6..a06fb75 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -262,6 +262,7 @@ static struct
+ } vc[4];
+
+ struct mutex lock;
++ struct mutex bus_lock;
+
+ unsigned pll_locked;
+
+@@ -339,6 +340,18 @@ void dsi_restore_context(void)
+ {
+ }
+
++void dsi_bus_lock(void)
++{
++ mutex_lock(&dsi.bus_lock);
++}
++EXPORT_SYMBOL(dsi_bus_lock);
++
++void dsi_bus_unlock(void)
++{
++ mutex_unlock(&dsi.bus_lock);
++}
++EXPORT_SYMBOL(dsi_bus_unlock);
++
+ static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum,
+ int value)
+ {
+@@ -1887,6 +1900,8 @@ static inline void dsi_vc_write_long_header(int channel, u8 data_type,
+ u32 val;
+ u8 data_id;
+
++ WARN_ON(!mutex_is_locked(&dsi.bus_lock));
++
+ /*data_id = data_type | channel << 6; */
+ data_id = data_type | dsi.vc[channel].dest_per << 6;
+
+@@ -1978,6 +1993,8 @@ static int dsi_vc_send_short(int channel, u8 data_type, u16 data, u8 ecc)
+ u32 r;
+ u8 data_id;
+
++ WARN_ON(!mutex_is_locked(&dsi.bus_lock));
++
+ if (dsi.debug_write)
+ DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n",
+ channel,
+@@ -2478,6 +2495,8 @@ static int dsi_update_screen_l4(struct omap_display *display,
+
+ DSSDBG("max_pixels_per_packet %d\n", max_pixels_per_packet);
+
++ dsi_bus_lock();
++
+ display->ctrl->setup_update(display, x, y, w, h);
+
+ pixels_left = w * h;
+@@ -2514,6 +2533,7 @@ static int dsi_update_screen_l4(struct omap_display *display,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
++ dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2526,6 +2546,7 @@ static int dsi_update_screen_l4(struct omap_display *display,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
++ dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2536,6 +2557,7 @@ static int dsi_update_screen_l4(struct omap_display *display,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
++ dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2568,6 +2590,8 @@ static int dsi_update_screen_l4(struct omap_display *display,
+
+ perf_show("L4");
+
++ dsi_bus_unlock();
++
+ return 0;
+ }
+
+@@ -2734,6 +2758,8 @@ static void dsi_update_screen_dispc(struct omap_display *display,
+ if (len % packet_payload)
+ total_len += (len % packet_payload) + 1;
+
++ dsi_bus_lock();
++
+ display->ctrl->setup_update(display, x, y, w, h);
+
+ if (dsi.use_ext_te && display->ctrl->wait_for_te)
+@@ -2774,6 +2800,12 @@ static void framedone_timeout_callback(struct work_struct *work)
+
+ /* XXX TODO: cancel the transfer properly */
+
++ dsi_bus_unlock();
++
++ /* Schedule, so that other threads that want dsi-bus-lock can get it.
++ * Otherwise with autoupdate we may be holding it all the time */
++ schedule();
++
+ /* XXX check that fifo is not full. otherwise we would sleep and never
+ * get to process_cmd_fifo below */
+ /* We check for target_update_mode, not update_mode. No reason to push
+@@ -2852,6 +2884,12 @@ static void framedone_worker(struct work_struct *work)
+ #endif
+ dsi.framedone_scheduled = 0;
+
++ dsi_bus_unlock();
++
++ /* Schedule, so that other threads that want dsi-bus-lock can get it.
++ * Otherwise with autoupdate we may be holding it all the time */
++ schedule();
++
+ /* XXX check that fifo is not full. otherwise we would sleep and never
+ * get to process_cmd_fifo below */
+ /* We check for target_update_mode, not update_mode. No reason to push
+@@ -2970,6 +3008,9 @@ static void dsi_do_cmd_mem_read(struct omap_display *display,
+ struct dsi_cmd_mem_read *mem_read)
+ {
+ int r;
++
++ dsi_bus_lock();
++
+ r = display->ctrl->memory_read(display,
+ mem_read->buf,
+ mem_read->size,
+@@ -2978,6 +3019,8 @@ static void dsi_do_cmd_mem_read(struct omap_display *display,
+ mem_read->w,
+ mem_read->h);
+
++ dsi_bus_unlock();
++
+ *mem_read->ret_size = (size_t)r;
+ complete(mem_read->completion);
+ }
+@@ -2992,6 +3035,8 @@ static void dsi_do_cmd_test(struct omap_display *display,
+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
++ dsi_bus_lock();
++
+ /* run test first in low speed mode */
+ dsi_vc_enable_hs(0, 0);
+
+@@ -3022,6 +3067,8 @@ static void dsi_do_cmd_test(struct omap_display *display,
+ end:
+ dsi_vc_enable_hs(0, 1);
+
++ dsi_bus_unlock();
++
+ *test->result = r;
+ complete(test->completion);
+
+@@ -3038,7 +3085,9 @@ static void dsi_do_cmd_set_te(struct omap_display *display, bool enable)
+ if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
++ dsi_bus_lock();
+ display->ctrl->enable_te(display, enable);
++ dsi_bus_unlock();
+
+ if (!display->hw_config.u.dsi.ext_te) {
+ if (enable) {
+@@ -3148,13 +3197,17 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+ break;
+
+ case DSI_CMD_SET_ROTATE:
++ dsi_bus_lock();
+ display->ctrl->set_rotate(display, p.u.rotate);
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
+ dsi.autoupdate_setup = 1;
++ dsi_bus_unlock();
+ break;
+
+ case DSI_CMD_SET_MIRROR:
++ dsi_bus_lock();
+ display->ctrl->set_mirror(display, p.u.mirror);
++ dsi_bus_unlock();
+ break;
+
+ default:
+@@ -3417,6 +3470,8 @@ static int dsi_display_init_dsi(struct omap_display *display)
+
+ _dsi_print_reset_status();
+
++ dsi_bus_lock();
++
+ r = dsi_pll_init(1, 0);
+ if (r)
+ goto err0;
+@@ -3468,6 +3523,8 @@ static int dsi_display_init_dsi(struct omap_display *display)
+ /* enable high-speed after initial config */
+ dsi_vc_enable_hs(0, 1);
+
++ dsi_bus_unlock();
++
+ return 0;
+ err4:
+ if (display->ctrl && display->ctrl->disable)
+@@ -3479,15 +3536,18 @@ err2:
+ err1:
+ dsi_pll_uninit();
+ err0:
++ dsi_bus_unlock();
+ return r;
+ }
+
+ static void dsi_display_uninit_dsi(struct omap_display *display)
+ {
++ dsi_bus_lock();
+ if (display->panel && display->panel->disable)
+ display->panel->disable(display);
+ if (display->ctrl && display->ctrl->disable)
+ display->ctrl->disable(display);
++ dsi_bus_unlock();
+
+ dsi_complexio_uninit();
+ dsi_pll_uninit();
+@@ -3863,6 +3923,7 @@ int dsi_init(void)
+ framedone_timeout_callback);
+
+ mutex_init(&dsi.lock);
++ mutex_init(&dsi.bus_lock);
+
+ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
+ dsi.user_update_mode = OMAP_DSS_UPDATE_DISABLED;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0085-DSS2-OMAPFB-omapfb_get_ovl_colormode-to-static.patch b/recipes/linux/linux-omap-pm/dss2/0085-DSS2-OMAPFB-omapfb_get_ovl_colormode-to-static.patch
new file mode 100644
index 0000000000..da0c155c2b
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0085-DSS2-OMAPFB-omapfb_get_ovl_colormode-to-static.patch
@@ -0,0 +1,26 @@
+From 5e7b8aa4d0c904556af01085a82f50ad895a59d5 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 28 May 2009 15:26:08 +0300
+Subject: [PATCH 085/146] DSS2: OMAPFB: omapfb_get_ovl_colormode to static
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 123f5dc..57e6287 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -434,7 +434,7 @@ static int omapfb_memory_read(struct fb_info *fbi,
+ return r;
+ }
+
+-int omapfb_get_ovl_colormode(struct omapfb2_device *fbdev,
++static int omapfb_get_ovl_colormode(struct omapfb2_device *fbdev,
+ struct omapfb_ovl_colormode *mode)
+ {
+ int ovl_idx = mode->overlay_idx;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0086-DSS2-VRFB-make-vrfb_hw_context-static.patch b/recipes/linux/linux-omap-pm/dss2/0086-DSS2-VRFB-make-vrfb_hw_context-static.patch
new file mode 100644
index 0000000000..ed817f2e9a
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0086-DSS2-VRFB-make-vrfb_hw_context-static.patch
@@ -0,0 +1,25 @@
+From 989ad2f5d7ce459332ecaca7e0c5ffa0e24218b9 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 1 Jun 2009 14:08:12 +0300
+Subject: [PATCH 086/146] DSS2: VRFB: make vrfb_hw_context static
+
+---
+ arch/arm/plat-omap/vrfb.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 34395c2..59ac66a 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -49,7 +49,7 @@ static unsigned long ctx_map_active;
+ * we don't need locking, since no drivers will run until after the wake-up
+ * has finished.
+ */
+-struct {
++static struct {
+ u32 physical_ba;
+ u32 control;
+ u32 size;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0087-DSS2-new-device-driver-model.patch b/recipes/linux/linux-omap-pm/dss2/0087-DSS2-new-device-driver-model.patch
new file mode 100644
index 0000000000..ecc51227f2
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0087-DSS2-new-device-driver-model.patch
@@ -0,0 +1,5336 @@
+From 63614d959a4558c552a9d9aec693018fb6eece63 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 1 Jun 2009 14:15:13 +0300
+Subject: [PATCH 087/146] DSS2: new device/driver model
+
+Use better model for handling DSS devices and drivers.
+
+Remove omap_display, omap_ctrl and omap_panel structs, and add
+omap_dss_device and omap_dss_driver. DSS devices are added to DSS bus.
+
+The commit changes almost every part of DSS2, even if actual
+functionality should be changed only in few parts.
+---
+ arch/arm/plat-omap/include/mach/display.h | 400 ++++++++----------
+ drivers/video/omap2/dss/core.c | 306 +++++++++++++-
+ drivers/video/omap2/dss/dispc.c | 36 +-
+ drivers/video/omap2/dss/display.c | 654 ++++++++++++-----------------
+ drivers/video/omap2/dss/dpi.c | 150 ++++---
+ drivers/video/omap2/dss/dsi.c | 584 ++++++++++++--------------
+ drivers/video/omap2/dss/dss.h | 44 ++-
+ drivers/video/omap2/dss/manager.c | 108 +++---
+ drivers/video/omap2/dss/overlay.c | 93 ++---
+ drivers/video/omap2/dss/rfbi.c | 104 +++---
+ drivers/video/omap2/dss/sdi.c | 115 +++---
+ drivers/video/omap2/dss/venc.c | 192 ++++++---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 12 +-
+ drivers/video/omap2/omapfb/omapfb-main.c | 49 +--
+ drivers/video/omap2/omapfb/omapfb.h | 6 +-
+ 15 files changed, 1526 insertions(+), 1327 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index d36f730..57bb8ff 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -22,6 +22,7 @@
+
+ #include <linux/list.h>
+ #include <linux/kobject.h>
++#include <linux/device.h>
+ #include <asm/atomic.h>
+
+ #define DISPC_IRQ_FRAMEDONE (1 << 0)
+@@ -42,6 +43,9 @@
+ #define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15)
+ #define DISPC_IRQ_WAKEUP (1 << 16)
+
++struct omap_dss_device;
++struct omap_overlay_manager;
++
+ enum omap_display_type {
+ OMAP_DISPLAY_TYPE_NONE = 0,
+ OMAP_DISPLAY_TYPE_DPI = 1 << 0,
+@@ -132,9 +136,41 @@ enum omap_dss_venc_type {
+ OMAP_DSS_VENC_TYPE_SVIDEO,
+ };
+
+-struct omap_display;
+-struct omap_panel;
+-struct omap_ctrl;
++enum omap_display_caps {
++ OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0,
++};
++
++enum omap_dss_update_mode {
++ OMAP_DSS_UPDATE_DISABLED = 0,
++ OMAP_DSS_UPDATE_AUTO,
++ OMAP_DSS_UPDATE_MANUAL,
++};
++
++enum omap_dss_display_state {
++ OMAP_DSS_DISPLAY_DISABLED = 0,
++ OMAP_DSS_DISPLAY_ACTIVE,
++ OMAP_DSS_DISPLAY_SUSPENDED,
++};
++
++/* XXX perhaps this should be removed */
++enum omap_dss_overlay_managers {
++ OMAP_DSS_OVL_MGR_LCD,
++ OMAP_DSS_OVL_MGR_TV,
++};
++
++enum omap_dss_rotation_type {
++ OMAP_DSS_ROT_DMA = 0,
++ OMAP_DSS_ROT_VRFB = 1,
++};
++
++enum omap_overlay_caps {
++ OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
++ OMAP_DSS_OVL_CAP_DISPC = 1 << 1,
++};
++
++enum omap_overlay_manager_caps {
++ OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0,
++};
+
+ /* RFBI */
+
+@@ -178,108 +214,13 @@ int dsi_vc_set_max_rx_packet_size(int channel, u16 len);
+ int dsi_vc_send_null(int channel);
+
+ /* Board specific data */
+-struct omap_dss_display_config {
+- enum omap_display_type type;
+-
+- union {
+- struct {
+- u8 data_lines;
+- } dpi;
+-
+- struct {
+- u8 channel;
+- u8 data_lines;
+- } rfbi;
+-
+- struct {
+- u8 datapairs;
+- } sdi;
+-
+- struct {
+- u8 clk_lane;
+- u8 clk_pol;
+- u8 data1_lane;
+- u8 data1_pol;
+- u8 data2_lane;
+- u8 data2_pol;
+- unsigned long lp_clk_hz;
+- unsigned long ddr_clk_hz;
+-
+- bool ext_te;
+- u8 ext_te_gpio;
+- } dsi;
+-
+- struct {
+- enum omap_dss_venc_type type;
+- } venc;
+- } u;
+-
+- int panel_reset_gpio;
+- int ctrl_reset_gpio;
+-
+- int max_backlight_level;
+-
+- const char *name; /* for debug */
+- const char *ctrl_name;
+- const char *panel_name;
+-
+- void *panel_data;
+- void *ctrl_data;
+-
+- /* platform specific enable/disable */
+- int (*panel_enable)(struct omap_display *display);
+- void (*panel_disable)(struct omap_display *display);
+- int (*ctrl_enable)(struct omap_display *display);
+- void (*ctrl_disable)(struct omap_display *display);
+- int (*set_backlight)(struct omap_display *display,
+- int level);
+- int (*get_backlight)(struct omap_display *display);
+-};
+-
+-struct device;
+-
+-/* Board specific data */
+-struct omap_dss_board_info {
++struct omap_dss_board_info {
+ int (*get_last_off_on_transaction_id)(struct device *dev);
++ int num_devices;
++ struct omap_dss_device **devices;
++ struct omap_dss_device *default_device;
+ int (*dsi_power_up)(void);
+ void (*dsi_power_down)(void);
+- int num_displays;
+- struct omap_dss_display_config *displays[];
+-};
+-
+-struct omap_ctrl {
+- struct module *owner;
+-
+- const char *name;
+-
+- int (*init)(struct omap_display *display);
+- void (*cleanup)(struct omap_display *display);
+- int (*enable)(struct omap_display *display);
+- void (*disable)(struct omap_display *display);
+- int (*suspend)(struct omap_display *display);
+- int (*resume)(struct omap_display *display);
+- void (*setup_update)(struct omap_display *display,
+- u16 x, u16 y, u16 w, u16 h);
+-
+- int (*enable_te)(struct omap_display *display, bool enable);
+- int (*wait_for_te)(struct omap_display *display);
+-
+- u8 (*get_rotate)(struct omap_display *display);
+- int (*set_rotate)(struct omap_display *display, u8 rotate);
+-
+- bool (*get_mirror)(struct omap_display *display);
+- int (*set_mirror)(struct omap_display *display, bool enable);
+-
+- int (*run_test)(struct omap_display *display, int test);
+- int (*memory_read)(struct omap_display *display,
+- void *buf, size_t size,
+- u16 x, u16 y, u16 w, u16 h);
+-
+- u8 pixel_size;
+-
+- struct rfbi_timings timings;
+-
+- void *priv;
+ };
+
+ struct omap_video_timings {
+@@ -301,7 +242,6 @@ struct omap_video_timings {
+ u16 vfp; /* Vertical front porch */
+ /* Unit: line clocks */
+ u16 vbp; /* Vertical back porch */
+-
+ };
+
+ #ifdef CONFIG_OMAP2_DSS_VENC
+@@ -313,46 +253,6 @@ const extern struct omap_video_timings omap_dss_pal_timings;
+ const extern struct omap_video_timings omap_dss_ntsc_timings;
+ #endif
+
+-struct omap_panel {
+- struct module *owner;
+-
+- const char *name;
+-
+- int (*init)(struct omap_display *display);
+- void (*cleanup)(struct omap_display *display);
+- int (*remove)(struct omap_display *display);
+- int (*enable)(struct omap_display *display);
+- void (*disable)(struct omap_display *display);
+- int (*suspend)(struct omap_display *display);
+- int (*resume)(struct omap_display *display);
+- int (*run_test)(struct omap_display *display, int test);
+-
+- struct omap_video_timings timings;
+-
+- int acbi; /* ac-bias pin transitions per interrupt */
+- /* Unit: line clocks */
+- int acb; /* ac-bias pin frequency */
+-
+- enum omap_panel_config config;
+-
+- u8 recommended_bpp;
+-
+- void *priv;
+-};
+-
+-/* XXX perhaps this should be removed */
+-enum omap_dss_overlay_managers {
+- OMAP_DSS_OVL_MGR_LCD,
+- OMAP_DSS_OVL_MGR_TV,
+-};
+-
+-struct omap_overlay_manager;
+-
+-enum omap_dss_rotation_type {
+- OMAP_DSS_ROT_DMA = 0,
+- OMAP_DSS_ROT_VRFB = 1,
+-};
+-
+ struct omap_overlay_info {
+ bool enabled;
+
+@@ -373,11 +273,6 @@ struct omap_overlay_info {
+ u8 global_alpha;
+ };
+
+-enum omap_overlay_caps {
+- OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
+- OMAP_DSS_OVL_CAP_DISPC = 1 << 1,
+-};
+-
+ struct omap_overlay {
+ struct kobject kobj;
+ struct list_head list;
+@@ -399,10 +294,6 @@ struct omap_overlay {
+ struct omap_overlay_info *info);
+ };
+
+-enum omap_overlay_manager_caps {
+- OMAP_DSS_OVL_MGR_CAP_DISPC = 1 << 0,
+-};
+-
+ struct omap_overlay_manager {
+ struct kobject kobj;
+ struct list_head list;
+@@ -410,14 +301,14 @@ struct omap_overlay_manager {
+ const char *name;
+ int id;
+ enum omap_overlay_manager_caps caps;
+- struct omap_display *display;
++ struct omap_dss_device *device;
+ int num_overlays;
+ struct omap_overlay **overlays;
+ enum omap_display_type supported_displays;
+
+- int (*set_display)(struct omap_overlay_manager *mgr,
+- struct omap_display *display);
+- int (*unset_display)(struct omap_overlay_manager *mgr);
++ int (*set_device)(struct omap_overlay_manager *mgr,
++ struct omap_dss_device *dssdev);
++ int (*unset_device)(struct omap_overlay_manager *mgr);
+
+ int (*apply)(struct omap_overlay_manager *mgr);
+
+@@ -437,99 +328,183 @@ struct omap_overlay_manager {
+ bool enable);
+ };
+
+-enum omap_display_caps {
+- OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0,
+-};
++struct omap_dss_device {
++ struct device dev;
+
+-enum omap_dss_update_mode {
+- OMAP_DSS_UPDATE_DISABLED = 0,
+- OMAP_DSS_UPDATE_AUTO,
+- OMAP_DSS_UPDATE_MANUAL,
+-};
++ enum omap_display_type type;
+
+-enum omap_dss_display_state {
+- OMAP_DSS_DISPLAY_DISABLED = 0,
+- OMAP_DSS_DISPLAY_ACTIVE,
+- OMAP_DSS_DISPLAY_SUSPENDED,
+-};
++ union {
++ struct {
++ u8 data_lines;
++ } dpi;
+
+-struct omap_display {
+- struct kobject kobj;
+- struct list_head list;
++ struct {
++ u8 channel;
++ u8 data_lines;
++ } rfbi;
+
+- /*atomic_t ref_count;*/
+- int ref_count;
+- /* helper variable for driver suspend/resume */
+- int activate_after_resume;
++ struct {
++ u8 datapairs;
++ } sdi;
++
++ struct {
++ u8 clk_lane;
++ u8 clk_pol;
++ u8 data1_lane;
++ u8 data1_pol;
++ u8 data2_lane;
++ u8 data2_pol;
++ unsigned long lp_clk_hz;
++ unsigned long ddr_clk_hz;
++
++ bool ext_te;
++ u8 ext_te_gpio;
++ } dsi;
++
++ struct {
++ enum omap_dss_venc_type type;
++ } venc;
++ } phy;
++
++ struct {
++ struct omap_video_timings timings;
++
++ int acbi; /* ac-bias pin transitions per interrupt */
++ /* Unit: line clocks */
++ int acb; /* ac-bias pin frequency */
++
++ enum omap_panel_config config;
++
++ u8 recommended_bpp;
++
++ struct omap_dss_device *ctrl;
++ } panel;
++
++ struct {
++ u8 pixel_size;
++ struct rfbi_timings rfbi_timings;
++ struct omap_dss_device *panel;
++ } ctrl;
++
++ int reset_gpio;
++
++ int max_backlight_level;
+
+- enum omap_display_type type;
+ const char *name;
+
++ /* used to match device to driver */
++ const char *driver_name;
++
++ void *data;
++
++ struct omap_dss_driver *driver;
++
++ /* helper variable for driver suspend/resume */
++ bool activate_after_resume;
++
+ enum omap_display_caps caps;
+
+ struct omap_overlay_manager *manager;
+
+ enum omap_dss_display_state state;
+
+- struct omap_dss_display_config hw_config; /* board specific data */
+- struct omap_ctrl *ctrl; /* static common data */
+- struct omap_panel *panel; /* static common data */
+-
+- int (*enable)(struct omap_display *display);
+- void (*disable)(struct omap_display *display);
++ int (*enable)(struct omap_dss_device *dssdev);
++ void (*disable)(struct omap_dss_device *dssdev);
+
+- int (*suspend)(struct omap_display *display);
+- int (*resume)(struct omap_display *display);
++ int (*suspend)(struct omap_dss_device *dssdev);
++ int (*resume)(struct omap_dss_device *dssdev);
+
+- void (*get_resolution)(struct omap_display *display,
++ void (*get_resolution)(struct omap_dss_device *dssdev,
+ u16 *xres, u16 *yres);
+- int (*get_recommended_bpp)(struct omap_display *display);
++ int (*get_recommended_bpp)(struct omap_dss_device *dssdev);
+
+- int (*check_timings)(struct omap_display *display,
++ int (*check_timings)(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings);
+- void (*set_timings)(struct omap_display *display,
++ void (*set_timings)(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings);
+- void (*get_timings)(struct omap_display *display,
++ void (*get_timings)(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings);
+- int (*update)(struct omap_display *display,
++ int (*update)(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h);
+- int (*sync)(struct omap_display *display);
+- int (*wait_vsync)(struct omap_display *display);
++ int (*sync)(struct omap_dss_device *dssdev);
++ int (*wait_vsync)(struct omap_dss_device *dssdev);
+
+- int (*set_update_mode)(struct omap_display *display,
++ int (*set_update_mode)(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode);
+ enum omap_dss_update_mode (*get_update_mode)
+- (struct omap_display *display);
++ (struct omap_dss_device *dssdev);
+
+- int (*enable_te)(struct omap_display *display, bool enable);
+- int (*get_te)(struct omap_display *display);
++ int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
++ int (*get_te)(struct omap_dss_device *dssdev);
++ int (*wait_for_te)(struct omap_dss_device *dssdev);
+
+- u8 (*get_rotate)(struct omap_display *display);
+- int (*set_rotate)(struct omap_display *display, u8 rotate);
++ u8 (*get_rotate)(struct omap_dss_device *dssdev);
++ int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate);
+
+- bool (*get_mirror)(struct omap_display *display);
+- int (*set_mirror)(struct omap_display *display, bool enable);
++ bool (*get_mirror)(struct omap_dss_device *dssdev);
++ int (*set_mirror)(struct omap_dss_device *dssdev, bool enable);
+
+- int (*run_test)(struct omap_display *display, int test);
+- int (*memory_read)(struct omap_display *display,
++ int (*run_test)(struct omap_dss_device *dssdev, int test);
++ int (*memory_read)(struct omap_dss_device *dssdev,
+ void *buf, size_t size,
+ u16 x, u16 y, u16 w, u16 h);
+
+ void (*configure_overlay)(struct omap_overlay *overlay);
+
+- int (*set_wss)(struct omap_display *display, u32 wss);
+- u32 (*get_wss)(struct omap_display *display);
++ int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
++ u32 (*get_wss)(struct omap_dss_device *dssdev);
++
++ /* platform specific */
++ int (*platform_enable)(struct omap_dss_device *dssdev);
++ void (*platform_disable)(struct omap_dss_device *dssdev);
++ int (*set_backlight)(struct omap_dss_device *dssdev, int level);
++ int (*get_backlight)(struct omap_dss_device *dssdev);
+ };
+
+-int omap_dss_get_num_displays(void);
+-struct omap_display *omap_dss_get_display(int no);
+-void omap_dss_put_display(struct omap_display *display);
++struct omap_dss_driver {
++ struct device_driver driver;
++
++ int (*probe)(struct omap_dss_device *);
++ void (*remove)(struct omap_dss_device *);
+
+-void omap_dss_register_ctrl(struct omap_ctrl *ctrl);
+-void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl);
++ int (*enable)(struct omap_dss_device *display);
++ void (*disable)(struct omap_dss_device *display);
++ int (*suspend)(struct omap_dss_device *display);
++ int (*resume)(struct omap_dss_device *display);
++ int (*run_test)(struct omap_dss_device *display, int test);
+
+-void omap_dss_register_panel(struct omap_panel *panel);
+-void omap_dss_unregister_panel(struct omap_panel *panel);
++ void (*setup_update)(struct omap_dss_device *dssdev,
++ u16 x, u16 y, u16 w, u16 h);
++
++ int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
++ int (*wait_for_te)(struct omap_dss_device *dssdev);
++
++ u8 (*get_rotate)(struct omap_dss_device *dssdev);
++ int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate);
++
++ bool (*get_mirror)(struct omap_dss_device *dssdev);
++ int (*set_mirror)(struct omap_dss_device *dssdev, bool enable);
++
++ int (*memory_read)(struct omap_dss_device *dssdev,
++ void *buf, size_t size,
++ u16 x, u16 y, u16 w, u16 h);
++};
++
++int omap_dss_register_driver(struct omap_dss_driver *);
++void omap_dss_unregister_driver(struct omap_dss_driver *);
++
++int omap_dss_register_device(struct omap_dss_device *);
++void omap_dss_unregister_device(struct omap_dss_device *);
++
++void omap_dss_get_device(struct omap_dss_device *dssdev);
++void omap_dss_put_device(struct omap_dss_device *dssdev);
++#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL)
++struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from);
++struct omap_dss_device *omap_dss_find_device(void *data,
++ int (*match)(struct omap_dss_device *dssdev, void *data));
++
++int omap_dss_start_device(struct omap_dss_device *dssdev);
++void omap_dss_stop_device(struct omap_dss_device *dssdev);
+
+ int omap_dss_get_num_overlay_managers(void);
+ struct omap_overlay_manager *omap_dss_get_overlay_manager(int num);
+@@ -544,5 +519,4 @@ int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
+ int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout);
+ int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask,
+ unsigned long timeout);
+-
+ #endif
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index 2a38507..c56c431 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -30,6 +30,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/debugfs.h>
+ #include <linux/io.h>
++#include <linux/device.h>
+
+ #include <mach/display.h>
+ #include <mach/clock.h>
+@@ -437,11 +438,16 @@ void dss_dsi_power_down(void)
+ /* PLATFORM DEVICE */
+ static int omap_dss_probe(struct platform_device *pdev)
+ {
++ struct omap_dss_board_info *pdata = pdev->dev.platform_data;
+ int skip_init = 0;
+ int r;
++ int i;
+
+ core.pdev = pdev;
+
++ dss_init_overlay_managers(pdev);
++ dss_init_overlays(pdev);
++
+ r = dss_get_clocks();
+ if (r)
+ goto fail0;
+@@ -483,7 +489,7 @@ static int omap_dss_probe(struct platform_device *pdev)
+ goto fail0;
+ }
+ #ifdef CONFIG_OMAP2_DSS_VENC
+- r = venc_init();
++ r = venc_init(pdev);
+ if (r) {
+ DSSERR("Failed to initialize venc\n");
+ goto fail0;
+@@ -498,7 +504,7 @@ static int omap_dss_probe(struct platform_device *pdev)
+ }
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_DSI
+- r = dsi_init();
++ r = dsi_init(pdev);
+ if (r) {
+ DSSERR("Failed to initialize DSI\n");
+ goto fail0;
+@@ -512,9 +518,16 @@ static int omap_dss_probe(struct platform_device *pdev)
+ goto fail0;
+ #endif
+
+- dss_init_displays(pdev);
+- dss_init_overlay_managers(pdev);
+- dss_init_overlays(pdev, def_disp_name);
++ for (i = 0; i < pdata->num_devices; ++i) {
++ struct omap_dss_device *dssdev = pdata->devices[i];
++
++ r = omap_dss_register_device(dssdev);
++ if (r)
++ DSSERR("device reg failed %d\n", i);
++
++ if (def_disp_name && strcmp(def_disp_name, dssdev->name) == 0)
++ pdata->default_device = dssdev;
++ }
+
+ dss_clk_disable_all();
+
+@@ -527,12 +540,10 @@ fail0:
+
+ static int omap_dss_remove(struct platform_device *pdev)
+ {
++ struct omap_dss_board_info *pdata = pdev->dev.platform_data;
++ int i;
+ int c;
+
+- dss_uninit_overlays(pdev);
+- dss_uninit_overlay_managers(pdev);
+- dss_uninit_displays(pdev);
+-
+ #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT)
+ dss_uninitialize_debugfs();
+ #endif
+@@ -597,6 +608,12 @@ static int omap_dss_remove(struct platform_device *pdev)
+
+ dss_put_clocks();
+
++ dss_uninit_overlays(pdev);
++ dss_uninit_overlay_managers(pdev);
++
++ for (i = 0; i < pdata->num_devices; ++i)
++ omap_dss_unregister_device(pdata->devices[i]);
++
+ return 0;
+ }
+
+@@ -609,14 +626,14 @@ static int omap_dss_suspend(struct platform_device *pdev, pm_message_t state)
+ {
+ DSSDBG("suspend %d\n", state.event);
+
+- return dss_suspend_all_displays();
++ return dss_suspend_all_devices();
+ }
+
+ static int omap_dss_resume(struct platform_device *pdev)
+ {
+ DSSDBG("resume\n");
+
+- return dss_resume_all_displays();
++ return dss_resume_all_devices();
+ }
+
+ static struct platform_driver omap_dss_driver = {
+@@ -631,19 +648,282 @@ static struct platform_driver omap_dss_driver = {
+ },
+ };
+
++/* BUS */
++static int dss_bus_match(struct device *dev, struct device_driver *driver)
++{
++ struct omap_dss_device *dssdev = to_dss_device(dev);
++
++ DSSDBG("bus_match. dev %s/%s, drv %s\n",
++ dev_name(dev), dssdev->driver_name, driver->name);
++
++ return strcmp(dssdev->driver_name, driver->name) == 0;
++}
++
++static ssize_t device_name_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct omap_dss_device *dssdev = to_dss_device(dev);
++ return snprintf(buf, PAGE_SIZE, "%s\n",
++ dssdev->name ?
++ dssdev->name : "");
++}
++
++static struct device_attribute default_dev_attrs[] = {
++ __ATTR(name, S_IRUGO, device_name_show, NULL),
++ __ATTR_NULL,
++};
++
++static ssize_t driver_name_show(struct device_driver *drv, char *buf)
++{
++ struct omap_dss_driver *dssdrv = to_dss_driver(drv);
++ return snprintf(buf, PAGE_SIZE, "%s\n",
++ dssdrv->driver.name ?
++ dssdrv->driver.name : "");
++}
++static struct driver_attribute default_drv_attrs[] = {
++ __ATTR(name, S_IRUGO, driver_name_show, NULL),
++ __ATTR_NULL,
++};
++
++static struct bus_type dss_bus_type = {
++ .name = "omapdss",
++ .match = dss_bus_match,
++ .dev_attrs = default_dev_attrs,
++ .drv_attrs = default_drv_attrs,
++};
++
++static void dss_bus_release(struct device *dev)
++{
++ DSSDBG("bus_release\n");
++}
++
++static struct device dss_bus = {
++ .release = dss_bus_release,
++};
++
++struct bus_type *dss_get_bus(void)
++{
++ return &dss_bus_type;
++}
++
++/* DRIVER */
++static int dss_driver_probe(struct device *dev)
++{
++ int r;
++ struct omap_dss_driver *dssdrv = to_dss_driver(dev->driver);
++ struct omap_dss_device *dssdev = to_dss_device(dev);
++ struct omap_dss_board_info *pdata = core.pdev->dev.platform_data;
++ bool force;
++
++ DSSDBG("driver_probe: dev %s/%s, drv %s\n",
++ dev_name(dev), dssdev->driver_name,
++ dssdrv->driver.name);
++
++ dss_init_device(core.pdev, dssdev);
++
++ /* skip this if the device is behind a ctrl */
++ if (!dssdev->panel.ctrl) {
++ force = pdata->default_device == dssdev;
++ dss_recheck_connections(dssdev, force);
++ }
++
++ r = dssdrv->probe(dssdev);
++
++ if (r) {
++ DSSERR("driver probe failed: %d\n", r);
++ return r;
++ }
++
++ DSSDBG("probe done for device %s\n", dev_name(dev));
++
++ dssdev->driver = dssdrv;
++
++ return 0;
++}
++
++static int dss_driver_remove(struct device *dev)
++{
++ struct omap_dss_driver *dssdrv = to_dss_driver(dev->driver);
++ struct omap_dss_device *dssdev = to_dss_device(dev);
++
++ DSSDBG("driver_remove: dev %s/%s\n", dev_name(dev),
++ dssdev->driver_name);
++
++ dssdrv->remove(dssdev);
++
++ dss_uninit_device(core.pdev, dssdev);
++
++ dssdev->driver = NULL;
++
++ return 0;
++}
++
++int omap_dss_register_driver(struct omap_dss_driver *dssdriver)
++{
++ dssdriver->driver.bus = &dss_bus_type;
++ dssdriver->driver.probe = dss_driver_probe;
++ dssdriver->driver.remove = dss_driver_remove;
++ return driver_register(&dssdriver->driver);
++}
++EXPORT_SYMBOL(omap_dss_register_driver);
++
++void omap_dss_unregister_driver(struct omap_dss_driver *dssdriver)
++{
++ driver_unregister(&dssdriver->driver);
++}
++EXPORT_SYMBOL(omap_dss_unregister_driver);
++
++/* DEVICE */
++static void reset_device(struct device *dev, int check)
++{
++ u8 *dev_p = (u8 *)dev;
++ u8 *dev_end = dev_p + sizeof(*dev);
++ void *saved_pdata;
++
++ saved_pdata = dev->platform_data;
++ if (check) {
++ /*
++ * Check if there is any other setting than platform_data
++ * in struct device; warn that these will be reset by our
++ * init.
++ */
++ dev->platform_data = NULL;
++ while (dev_p < dev_end) {
++ if (*dev_p) {
++ WARN("%s: struct device fields will be discarded\n",
++ __func__);
++ break;
++ }
++ dev_p++;
++ }
++ }
++ memset(dev, 0, sizeof(*dev));
++ dev->platform_data = saved_pdata;
++}
++
++
++static void omap_dss_dev_release(struct device *dev)
++{
++ reset_device(dev, 0);
++}
++
++int omap_dss_register_device(struct omap_dss_device *dssdev)
++{
++ static int dev_num;
++ static int panel_num;
++ int r;
++
++ WARN_ON(!dssdev->driver_name);
++
++ reset_device(&dssdev->dev, 1);
++ dssdev->dev.bus = &dss_bus_type;
++ dssdev->dev.parent = &dss_bus;
++ dssdev->dev.release = omap_dss_dev_release;
++ dev_set_name(&dssdev->dev, "display%d", dev_num++);
++ r = device_register(&dssdev->dev);
++ if (r)
++ return r;
++
++ if (dssdev->ctrl.panel) {
++ struct omap_dss_device *panel = dssdev->ctrl.panel;
++
++ panel->panel.ctrl = dssdev;
++
++ reset_device(&panel->dev, 1);
++ panel->dev.bus = &dss_bus_type;
++ panel->dev.parent = &dssdev->dev;
++ panel->dev.release = omap_dss_dev_release;
++ dev_set_name(&panel->dev, "panel%d", panel_num++);
++ r = device_register(&panel->dev);
++ if (r)
++ return r;
++ }
++
++ return 0;
++}
++
++void omap_dss_unregister_device(struct omap_dss_device *dssdev)
++{
++ device_unregister(&dssdev->dev);
++
++ if (dssdev->ctrl.panel) {
++ struct omap_dss_device *panel = dssdev->ctrl.panel;
++ device_unregister(&panel->dev);
++ }
++}
++
++/* BUS */
++static int omap_dss_bus_register(void)
++{
++ int r;
++
++ r = bus_register(&dss_bus_type);
++ if (r) {
++ DSSERR("bus register failed\n");
++ return r;
++ }
++
++ dev_set_name(&dss_bus, "omapdss");
++ r = device_register(&dss_bus);
++ if (r) {
++ DSSERR("bus driver register failed\n");
++ bus_unregister(&dss_bus_type);
++ return r;
++ }
++
++ return 0;
++}
++
++/* INIT */
++
++#ifdef CONFIG_OMAP2_DSS_MODULE
++static void omap_dss_bus_unregister(void)
++{
++ device_unregister(&dss_bus);
++
++ bus_unregister(&dss_bus_type);
++}
++
+ static int __init omap_dss_init(void)
+ {
+- return platform_driver_register(&omap_dss_driver);
++ int r;
++
++ r = omap_dss_bus_register();
++ if (r)
++ return r;
++
++ r = platform_driver_register(&omap_dss_driver);
++ if (r) {
++ omap_dss_bus_unregister();
++ return r;
++ }
++
++ return 0;
+ }
+
+ static void __exit omap_dss_exit(void)
+ {
+ platform_driver_unregister(&omap_dss_driver);
++
++ omap_dss_bus_unregister();
+ }
+
+-subsys_initcall(omap_dss_init);
++module_init(omap_dss_init);
+ module_exit(omap_dss_exit);
++#else
++static int __init omap_dss_init(void)
++{
++ return omap_dss_bus_register();
++}
++
++static int __init omap_dss_init2(void)
++{
++ return platform_driver_register(&omap_dss_driver);
++}
+
++core_initcall(omap_dss_init);
++device_initcall(omap_dss_init2);
++#endif
+
+ MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@nokia.com>");
+ MODULE_DESCRIPTION("OMAP2/3 Display Subsystem");
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index e936c59..52170f8 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -2319,15 +2319,15 @@ static void _dispc_set_pol_freq(bool onoff, bool rf, bool ieo, bool ipc,
+ enable_clocks(0);
+ }
+
+-void dispc_set_pol_freq(struct omap_panel *panel)
++void dispc_set_pol_freq(enum omap_panel_config config, u8 acbi, u8 acb)
+ {
+- _dispc_set_pol_freq((panel->config & OMAP_DSS_LCD_ONOFF) != 0,
+- (panel->config & OMAP_DSS_LCD_RF) != 0,
+- (panel->config & OMAP_DSS_LCD_IEO) != 0,
+- (panel->config & OMAP_DSS_LCD_IPC) != 0,
+- (panel->config & OMAP_DSS_LCD_IHS) != 0,
+- (panel->config & OMAP_DSS_LCD_IVS) != 0,
+- panel->acbi, panel->acb);
++ _dispc_set_pol_freq((config & OMAP_DSS_LCD_ONOFF) != 0,
++ (config & OMAP_DSS_LCD_RF) != 0,
++ (config & OMAP_DSS_LCD_IEO) != 0,
++ (config & OMAP_DSS_LCD_IPC) != 0,
++ (config & OMAP_DSS_LCD_IHS) != 0,
++ (config & OMAP_DSS_LCD_IVS) != 0,
++ acbi, acb);
+ }
+
+ void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
+@@ -2790,9 +2790,9 @@ static void dispc_error_worker(struct work_struct *work)
+
+ if (mgr->id == OMAP_DSS_CHANNEL_LCD) {
+ manager = mgr;
+- enable = mgr->display->state ==
++ enable = mgr->device->state ==
+ OMAP_DSS_DISPLAY_ACTIVE;
+- mgr->display->disable(mgr->display);
++ mgr->device->disable(mgr->device);
+ break;
+ }
+ }
+@@ -2812,7 +2812,7 @@ static void dispc_error_worker(struct work_struct *work)
+ dispc_go(manager->id);
+ mdelay(50);
+ if (enable)
+- manager->display->enable(manager->display);
++ manager->device->enable(manager->device);
+ }
+ }
+
+@@ -2828,9 +2828,9 @@ static void dispc_error_worker(struct work_struct *work)
+
+ if (mgr->id == OMAP_DSS_CHANNEL_DIGIT) {
+ manager = mgr;
+- enable = mgr->display->state ==
++ enable = mgr->device->state ==
+ OMAP_DSS_DISPLAY_ACTIVE;
+- mgr->display->disable(mgr->display);
++ mgr->device->disable(mgr->device);
+ break;
+ }
+ }
+@@ -2850,7 +2850,7 @@ static void dispc_error_worker(struct work_struct *work)
+ dispc_go(manager->id);
+ mdelay(50);
+ if (enable)
+- manager->display->enable(manager->display);
++ manager->device->enable(manager->device);
+ }
+ }
+
+@@ -2861,7 +2861,7 @@ static void dispc_error_worker(struct work_struct *work)
+ mgr = omap_dss_get_overlay_manager(i);
+
+ if (mgr->caps & OMAP_DSS_OVL_CAP_DISPC)
+- mgr->display->disable(mgr->display);
++ mgr->device->disable(mgr->device);
+ }
+ }
+
+@@ -3126,7 +3126,7 @@ static int dispc_is_overlay_scaled(struct omap_overlay_info *pi)
+ }
+
+ /* returns the area that needs updating */
+-void dispc_setup_partial_planes(struct omap_display *display,
++void dispc_setup_partial_planes(struct omap_dss_device *dssdev,
+ u16 *xi, u16 *yi, u16 *wi, u16 *hi)
+ {
+ struct omap_overlay_manager *mgr;
+@@ -3143,7 +3143,7 @@ void dispc_setup_partial_planes(struct omap_display *display,
+ *xi, *yi, *wi, *hi);
+
+
+- mgr = display->manager;
++ mgr = dssdev->manager;
+
+ if (!mgr) {
+ DSSDBG("no manager\n");
+@@ -3307,7 +3307,7 @@ void dispc_setup_partial_planes(struct omap_display *display,
+ pi->mirror,
+ pi->global_alpha);
+
+- if (dss_use_replication(display, ovl->info.color_mode))
++ if (dss_use_replication(dssdev, ovl->info.color_mode))
+ dispc_enable_replication(ovl->id, true);
+ else
+ dispc_enable_replication(ovl->id, false);
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 77a6dc4..2251bff 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -31,52 +31,54 @@
+ #include <mach/display.h>
+ #include "dss.h"
+
+-static int num_displays;
+ static LIST_HEAD(display_list);
+
+-static ssize_t display_name_show(struct omap_display *display, char *buf)
++static ssize_t display_enabled_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
+- return snprintf(buf, PAGE_SIZE, "%s\n", display->name);
+-}
+-
+-static ssize_t display_enabled_show(struct omap_display *display, char *buf)
+-{
+- bool enabled = display->state != OMAP_DSS_DISPLAY_DISABLED;
++ struct omap_dss_device *dssdev = to_dss_device(dev);
++ bool enabled = dssdev->state != OMAP_DSS_DISPLAY_DISABLED;
+
+ return snprintf(buf, PAGE_SIZE, "%d\n", enabled);
+ }
+
+-static ssize_t display_enabled_store(struct omap_display *display,
++static ssize_t display_enabled_store(struct device *dev,
++ struct device_attribute *attr,
+ const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ bool enabled, r;
+
+ enabled = simple_strtoul(buf, NULL, 10);
+
+- if (enabled != (display->state != OMAP_DSS_DISPLAY_DISABLED)) {
++ if (enabled != (dssdev->state != OMAP_DSS_DISPLAY_DISABLED)) {
+ if (enabled) {
+- r = display->enable(display);
++ r = dssdev->enable(dssdev);
+ if (r)
+ return r;
+ } else {
+- display->disable(display);
++ dssdev->disable(dssdev);
+ }
+ }
+
+ return size;
+ }
+
+-static ssize_t display_upd_mode_show(struct omap_display *display, char *buf)
++static ssize_t display_upd_mode_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ enum omap_dss_update_mode mode = OMAP_DSS_UPDATE_AUTO;
+- if (display->get_update_mode)
+- mode = display->get_update_mode(display);
++ if (dssdev->get_update_mode)
++ mode = dssdev->get_update_mode(dssdev);
+ return snprintf(buf, PAGE_SIZE, "%d\n", mode);
+ }
+
+-static ssize_t display_upd_mode_store(struct omap_display *display,
++static ssize_t display_upd_mode_store(struct device *dev,
++ struct device_attribute *attr,
+ const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ int val, r;
+ enum omap_dss_update_mode mode;
+
+@@ -92,43 +94,48 @@ static ssize_t display_upd_mode_store(struct omap_display *display,
+ return -EINVAL;
+ }
+
+- if ((r = display->set_update_mode(display, mode)))
++ if ((r = dssdev->set_update_mode(dssdev, mode)))
+ return r;
+
+ return size;
+ }
+
+-static ssize_t display_tear_show(struct omap_display *display, char *buf)
++static ssize_t display_tear_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ return snprintf(buf, PAGE_SIZE, "%d\n",
+- display->get_te ? display->get_te(display) : 0);
++ dssdev->get_te ? dssdev->get_te(dssdev) : 0);
+ }
+
+-static ssize_t display_tear_store(struct omap_display *display,
+- const char *buf, size_t size)
++static ssize_t display_tear_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ unsigned long te;
+ int r;
+
+- if (!display->enable_te || !display->get_te)
++ if (!dssdev->enable_te || !dssdev->get_te)
+ return -ENOENT;
+
+ te = simple_strtoul(buf, NULL, 0);
+
+- if ((r = display->enable_te(display, te)))
++ if ((r = dssdev->enable_te(dssdev, te)))
+ return r;
+
+ return size;
+ }
+
+-static ssize_t display_timings_show(struct omap_display *display, char *buf)
++static ssize_t display_timings_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ struct omap_video_timings t;
+
+- if (!display->get_timings)
++ if (!dssdev->get_timings)
+ return -ENOENT;
+
+- display->get_timings(display, &t);
++ dssdev->get_timings(dssdev, &t);
+
+ return snprintf(buf, PAGE_SIZE, "%u,%u/%u/%u/%u,%u/%u/%u/%u\n",
+ t.pixel_clock,
+@@ -136,13 +143,14 @@ static ssize_t display_timings_show(struct omap_display *display, char *buf)
+ t.y_res, t.vfp, t.vbp, t.vsw);
+ }
+
+-static ssize_t display_timings_store(struct omap_display *display,
+- const char *buf, size_t size)
++static ssize_t display_timings_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ struct omap_video_timings t;
+ int r, found;
+
+- if (!display->set_timings || !display->check_timings)
++ if (!dssdev->set_timings || !dssdev->check_timings)
+ return -ENOENT;
+
+ found = 0;
+@@ -161,103 +169,94 @@ static ssize_t display_timings_store(struct omap_display *display,
+ &t.y_res, &t.vfp, &t.vbp, &t.vsw) != 9)
+ return -EINVAL;
+
+- if ((r = display->check_timings(display, &t)))
++ if ((r = dssdev->check_timings(dssdev, &t)))
+ return r;
+
+- display->set_timings(display, &t);
++ dssdev->set_timings(dssdev, &t);
+
+ return size;
+ }
+
+-static ssize_t display_rotate_show(struct omap_display *display, char *buf)
++static ssize_t display_rotate_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ int rotate;
+- if (!display->get_rotate)
++ if (!dssdev->get_rotate)
+ return -ENOENT;
+- rotate = display->get_rotate(display);
++ rotate = dssdev->get_rotate(dssdev);
+ return snprintf(buf, PAGE_SIZE, "%u\n", rotate);
+ }
+
+-static ssize_t display_rotate_store(struct omap_display *display,
+- const char *buf, size_t size)
++static ssize_t display_rotate_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ unsigned long rot;
+ int r;
+
+- if (!display->set_rotate || !display->get_rotate)
++ if (!dssdev->set_rotate || !dssdev->get_rotate)
+ return -ENOENT;
+
+ rot = simple_strtoul(buf, NULL, 0);
+
+- if ((r = display->set_rotate(display, rot)))
++ if ((r = dssdev->set_rotate(dssdev, rot)))
+ return r;
+
+ return size;
+ }
+
+-static ssize_t display_mirror_show(struct omap_display *display, char *buf)
++static ssize_t display_mirror_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ int mirror;
+- if (!display->get_mirror)
++ if (!dssdev->get_mirror)
+ return -ENOENT;
+- mirror = display->get_mirror(display);
++ mirror = dssdev->get_mirror(dssdev);
+ return snprintf(buf, PAGE_SIZE, "%u\n", mirror);
+ }
+
+-static ssize_t display_mirror_store(struct omap_display *display,
+- const char *buf, size_t size)
++static ssize_t display_mirror_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ unsigned long mirror;
+ int r;
+
+- if (!display->set_mirror || !display->get_mirror)
++ if (!dssdev->set_mirror || !dssdev->get_mirror)
+ return -ENOENT;
+
+ mirror = simple_strtoul(buf, NULL, 0);
+
+- if ((r = display->set_mirror(display, mirror)))
++ if ((r = dssdev->set_mirror(dssdev, mirror)))
+ return r;
+
+ return size;
+ }
+
+-static ssize_t display_panel_name_show(struct omap_display *display, char *buf)
+-{
+- return snprintf(buf, PAGE_SIZE, "%s\n",
+- display->panel ? display->panel->name : "");
+-}
+-
+-static ssize_t display_ctrl_name_show(struct omap_display *display, char *buf)
+-{
+- return snprintf(buf, PAGE_SIZE, "%s\n",
+- display->ctrl ? display->ctrl->name : "");
+-}
+-
+-struct display_attribute {
+- struct attribute attr;
+- ssize_t (*show)(struct omap_display *, char *);
+- ssize_t (*store)(struct omap_display *, const char *, size_t);
+-};
+-
+-static ssize_t display_wss_show(struct omap_display *display, char *buf)
++static ssize_t display_wss_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ unsigned int wss;
+
+- if (!display->get_wss)
++ if (!dssdev->get_wss)
+ return -ENOENT;
+
+- wss = display->get_wss(display);
++ wss = dssdev->get_wss(dssdev);
+
+ return snprintf(buf, PAGE_SIZE, "0x%05x\n", wss);
+ }
+
+-static ssize_t display_wss_store(struct omap_display *display,
+- const char *buf, size_t size)
++static ssize_t display_wss_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
+ {
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+ unsigned long wss;
+ int r;
+
+- if (!display->get_wss || !display->set_wss)
++ if (!dssdev->get_wss || !dssdev->set_wss)
+ return -ENOENT;
+
+ if (strict_strtoul(buf, 0, &wss))
+@@ -266,92 +265,43 @@ static ssize_t display_wss_store(struct omap_display *display,
+ if (wss > 0xfffff)
+ return -EINVAL;
+
+- if ((r = display->set_wss(display, wss)))
++ if ((r = dssdev->set_wss(dssdev, wss)))
+ return r;
+
+ return size;
+ }
+
+-#define DISPLAY_ATTR(_name, _mode, _show, _store) \
+- struct display_attribute display_attr_##_name = \
+- __ATTR(_name, _mode, _show, _store)
+-
+-static DISPLAY_ATTR(name, S_IRUGO, display_name_show, NULL);
+-static DISPLAY_ATTR(enabled, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(enabled, S_IRUGO|S_IWUSR,
+ display_enabled_show, display_enabled_store);
+-static DISPLAY_ATTR(update_mode, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(update_mode, S_IRUGO|S_IWUSR,
+ display_upd_mode_show, display_upd_mode_store);
+-static DISPLAY_ATTR(tear_elim, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(tear_elim, S_IRUGO|S_IWUSR,
+ display_tear_show, display_tear_store);
+-static DISPLAY_ATTR(timings, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(timings, S_IRUGO|S_IWUSR,
+ display_timings_show, display_timings_store);
+-static DISPLAY_ATTR(rotate, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(rotate, S_IRUGO|S_IWUSR,
+ display_rotate_show, display_rotate_store);
+-static DISPLAY_ATTR(mirror, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(mirror, S_IRUGO|S_IWUSR,
+ display_mirror_show, display_mirror_store);
+-static DISPLAY_ATTR(panel_name, S_IRUGO, display_panel_name_show, NULL);
+-static DISPLAY_ATTR(ctrl_name, S_IRUGO, display_ctrl_name_show, NULL);
+-static DISPLAY_ATTR(wss, S_IRUGO|S_IWUSR,
++static DEVICE_ATTR(wss, S_IRUGO|S_IWUSR,
+ display_wss_show, display_wss_store);
+
+-static struct attribute *display_sysfs_attrs[] = {
+- &display_attr_name.attr,
+- &display_attr_enabled.attr,
+- &display_attr_update_mode.attr,
+- &display_attr_tear_elim.attr,
+- &display_attr_timings.attr,
+- &display_attr_rotate.attr,
+- &display_attr_mirror.attr,
+- &display_attr_panel_name.attr,
+- &display_attr_ctrl_name.attr,
+- &display_attr_wss.attr,
++static struct device_attribute *display_sysfs_attrs[] = {
++ &dev_attr_enabled,
++ &dev_attr_update_mode,
++ &dev_attr_tear_elim,
++ &dev_attr_timings,
++ &dev_attr_rotate,
++ &dev_attr_mirror,
++ &dev_attr_wss,
+ NULL
+ };
+
+-static ssize_t display_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
+-{
+- struct omap_display *display;
+- struct display_attribute *display_attr;
+-
+- display = container_of(kobj, struct omap_display, kobj);
+- display_attr = container_of(attr, struct display_attribute, attr);
+-
+- if (!display_attr->show)
+- return -ENOENT;
+-
+- return display_attr->show(display, buf);
+-}
+-
+-static ssize_t display_attr_store(struct kobject *kobj, struct attribute *attr,
+- const char *buf, size_t size)
+-{
+- struct omap_display *display;
+- struct display_attribute *display_attr;
+-
+- display = container_of(kobj, struct omap_display, kobj);
+- display_attr = container_of(attr, struct display_attribute, attr);
+-
+- if (!display_attr->store)
+- return -ENOENT;
+-
+- return display_attr->store(display, buf, size);
+-}
+-
+-static struct sysfs_ops display_sysfs_ops = {
+- .show = display_attr_show,
+- .store = display_attr_store,
+-};
+-
+-static struct kobj_type display_ktype = {
+- .sysfs_ops = &display_sysfs_ops,
+- .default_attrs = display_sysfs_attrs,
+-};
+-
+-static void default_get_resolution(struct omap_display *display,
++static void default_get_resolution(struct omap_dss_device *dssdev,
+ u16 *xres, u16 *yres)
+ {
+- *xres = display->panel->timings.x_res;
+- *yres = display->panel->timings.y_res;
++ *xres = dssdev->panel.timings.x_res;
++ *yres = dssdev->panel.timings.y_res;
+ }
+
+ static void default_configure_overlay(struct omap_overlay *ovl)
+@@ -371,12 +321,12 @@ static void default_configure_overlay(struct omap_overlay *ovl)
+ dispc_setup_plane_fifo(plane, low, high);
+ }
+
+-static int default_wait_vsync(struct omap_display *display)
++static int default_wait_vsync(struct omap_dss_device *dssdev)
+ {
+ unsigned long timeout = msecs_to_jiffies(500);
+ u32 irq;
+
+- if (display->type == OMAP_DISPLAY_TYPE_VENC)
++ if (dssdev->type == OMAP_DISPLAY_TYPE_VENC)
+ irq = DISPC_IRQ_EVSYNC_ODD;
+ else
+ irq = DISPC_IRQ_VSYNC;
+@@ -384,21 +334,21 @@ static int default_wait_vsync(struct omap_display *display)
+ return omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
+ }
+
+-static int default_get_recommended_bpp(struct omap_display *display)
++static int default_get_recommended_bpp(struct omap_dss_device *dssdev)
+ {
+- if (display->panel->recommended_bpp)
+- return display->panel->recommended_bpp;
++ if (dssdev->panel.recommended_bpp)
++ return dssdev->panel.recommended_bpp;
+
+- switch (display->type) {
++ switch (dssdev->type) {
+ case OMAP_DISPLAY_TYPE_DPI:
+- if (display->hw_config.u.dpi.data_lines == 24)
++ if (dssdev->phy.dpi.data_lines == 24)
+ return 24;
+ else
+ return 16;
+
+ case OMAP_DISPLAY_TYPE_DBI:
+ case OMAP_DISPLAY_TYPE_DSI:
+- if (display->ctrl->pixel_size == 24)
++ if (dssdev->ctrl.pixel_size == 24)
+ return 24;
+ else
+ return 16;
+@@ -414,7 +364,7 @@ static int default_get_recommended_bpp(struct omap_display *display)
+ /* Checks if replication logic should be used. Only use for active matrix,
+ * when overlay is in RGB12U or RGB16 mode, and LCD interface is
+ * 18bpp or 24bpp */
+-bool dss_use_replication(struct omap_display *display,
++bool dss_use_replication(struct omap_dss_device *dssdev,
+ enum omap_color_mode mode)
+ {
+ int bpp;
+@@ -422,13 +372,13 @@ bool dss_use_replication(struct omap_display *display,
+ if (mode != OMAP_DSS_COLOR_RGB12U && mode != OMAP_DSS_COLOR_RGB16)
+ return false;
+
+- if (display->type == OMAP_DISPLAY_TYPE_DPI &&
+- (display->panel->config & OMAP_DSS_LCD_TFT) == 0)
++ if (dssdev->type == OMAP_DISPLAY_TYPE_DPI &&
++ (dssdev->panel.config & OMAP_DSS_LCD_TFT) == 0)
+ return false;
+
+- switch (display->type) {
++ switch (dssdev->type) {
+ case OMAP_DISPLAY_TYPE_DPI:
+- bpp = display->hw_config.u.dpi.data_lines;
++ bpp = dssdev->phy.dpi.data_lines;
+ break;
+ case OMAP_DISPLAY_TYPE_VENC:
+ case OMAP_DISPLAY_TYPE_SDI:
+@@ -436,7 +386,7 @@ bool dss_use_replication(struct omap_display *display,
+ break;
+ case OMAP_DISPLAY_TYPE_DBI:
+ case OMAP_DISPLAY_TYPE_DSI:
+- bpp = display->ctrl->pixel_size;
++ bpp = dssdev->ctrl.pixel_size;
+ break;
+ default:
+ BUG();
+@@ -445,319 +395,259 @@ bool dss_use_replication(struct omap_display *display,
+ return bpp > 16;
+ }
+
+-void dss_init_displays(struct platform_device *pdev)
++void dss_init_device(struct platform_device *pdev,
++ struct omap_dss_device *dssdev)
+ {
+- struct omap_dss_board_info *pdata = pdev->dev.platform_data;
+- int i, r;
+-
+- INIT_LIST_HEAD(&display_list);
+-
+- num_displays = 0;
+-
+- for (i = 0; i < pdata->num_displays; ++i) {
+- struct omap_display *display;
++ struct device_attribute *attr;
++ int i;
++ int r;
+
+- switch (pdata->displays[i]->type) {
+- case OMAP_DISPLAY_TYPE_DPI:
++ switch (dssdev->type) {
++ case OMAP_DISPLAY_TYPE_DPI:
+ #ifdef CONFIG_OMAP2_DSS_RFBI
+- case OMAP_DISPLAY_TYPE_DBI:
++ case OMAP_DISPLAY_TYPE_DBI:
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_SDI
+- case OMAP_DISPLAY_TYPE_SDI:
++ case OMAP_DISPLAY_TYPE_SDI:
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_DSI
+- case OMAP_DISPLAY_TYPE_DSI:
++ case OMAP_DISPLAY_TYPE_DSI:
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_VENC
+- case OMAP_DISPLAY_TYPE_VENC:
++ case OMAP_DISPLAY_TYPE_VENC:
+ #endif
+- break;
+- default:
+- DSSERR("Support for display '%s' not compiled in.\n",
+- pdata->displays[i]->name);
+- continue;
+- }
+-
+- display = kzalloc(sizeof(*display), GFP_KERNEL);
+-
+- /*atomic_set(&display->ref_count, 0);*/
+- display->ref_count = 0;
+-
+- display->hw_config = *pdata->displays[i];
+- display->type = pdata->displays[i]->type;
+- display->name = pdata->displays[i]->name;
++ break;
++ default:
++ DSSERR("Support for display '%s' not compiled in.\n",
++ dssdev->name);
++ return;
++ }
+
+- display->get_resolution = default_get_resolution;
+- display->get_recommended_bpp = default_get_recommended_bpp;
+- display->configure_overlay = default_configure_overlay;
+- display->wait_vsync = default_wait_vsync;
++ dssdev->get_resolution = default_get_resolution;
++ dssdev->get_recommended_bpp = default_get_recommended_bpp;
++ dssdev->configure_overlay = default_configure_overlay;
++ dssdev->wait_vsync = default_wait_vsync;
+
+- switch (display->type) {
+- case OMAP_DISPLAY_TYPE_DPI:
+- dpi_init_display(display);
+- break;
++ switch (dssdev->type) {
++ case OMAP_DISPLAY_TYPE_DPI:
++ dpi_init_display(dssdev);
++ break;
+ #ifdef CONFIG_OMAP2_DSS_RFBI
+- case OMAP_DISPLAY_TYPE_DBI:
+- rfbi_init_display(display);
+- break;
++ case OMAP_DISPLAY_TYPE_DBI:
++ rfbi_init_display(dssdev);
++ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_VENC
+- case OMAP_DISPLAY_TYPE_VENC:
+- venc_init_display(display);
+- break;
++ case OMAP_DISPLAY_TYPE_VENC:
++ venc_init_display(dssdev);
++ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_SDI
+- case OMAP_DISPLAY_TYPE_SDI:
+- sdi_init_display(display);
+- break;
++ case OMAP_DISPLAY_TYPE_SDI:
++ sdi_init_display(dssdev);
++ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_DSI
+- case OMAP_DISPLAY_TYPE_DSI:
+- dsi_init_display(display);
+- break;
++ case OMAP_DISPLAY_TYPE_DSI:
++ dsi_init_display(dssdev);
++ break;
+ #endif
+- default:
+- BUG();
+- }
+-
+- r = kobject_init_and_add(&display->kobj, &display_ktype,
+- &pdev->dev.kobj, "display%d", num_displays);
++ default:
++ BUG();
++ }
+
+- if (r) {
++ /* create device sysfs files */
++ i = 0;
++ while ((attr = display_sysfs_attrs[i++]) != NULL) {
++ r = device_create_file(&dssdev->dev, attr);
++ if (r)
+ DSSERR("failed to create sysfs file\n");
+- continue;
+- }
+-
+- num_displays++;
+-
+- list_add_tail(&display->list, &display_list);
+ }
++
++ /* create display? sysfs links */
++ r = sysfs_create_link(&pdev->dev.kobj, &dssdev->dev.kobj,
++ dev_name(&dssdev->dev));
++ if (r)
++ DSSERR("failed to create sysfs display link\n");
+ }
+
+-void dss_uninit_displays(struct platform_device *pdev)
++void dss_uninit_device(struct platform_device *pdev,
++ struct omap_dss_device *dssdev)
+ {
+- struct omap_display *display;
+-
+- while (!list_empty(&display_list)) {
+- display = list_first_entry(&display_list,
+- struct omap_display, list);
+- list_del(&display->list);
+- kobject_del(&display->kobj);
+- kobject_put(&display->kobj);
+- kfree(display);
+- }
++ struct device_attribute *attr;
++ int i = 0;
++
++ sysfs_remove_link(&pdev->dev.kobj, dev_name(&dssdev->dev));
++
++ while ((attr = display_sysfs_attrs[i++]) != NULL)
++ device_remove_file(&dssdev->dev, attr);
+
+- num_displays = 0;
++ if (dssdev->manager)
++ dssdev->manager->unset_device(dssdev->manager);
+ }
+
+-int dss_suspend_all_displays(void)
++static int dss_suspend_device(struct device *dev, void *data)
+ {
+ int r;
+- struct omap_display *display;
+-
+- list_for_each_entry(display, &display_list, list) {
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE) {
+- display->activate_after_resume = 0;
+- continue;
+- }
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+
+- if (!display->suspend) {
+- DSSERR("display '%s' doesn't implement suspend\n",
+- display->name);
+- r = -ENOSYS;
+- goto err;
+- }
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) {
++ dssdev->activate_after_resume = false;
++ return 0;
++ }
+
+- r = display->suspend(display);
++ if (!dssdev->suspend) {
++ DSSERR("display '%s' doesn't implement suspend\n",
++ dssdev->name);
++ return -ENOSYS;
++ }
+
+- if (r)
+- goto err;
++ r = dssdev->suspend(dssdev);
++ if (r)
++ return r;
+
+- display->activate_after_resume = 1;
+- }
++ dssdev->activate_after_resume = true;
+
+ return 0;
+-err:
+- /* resume all displays that were suspended */
+- dss_resume_all_displays();
+- return r;
+ }
+
+-int dss_resume_all_displays(void)
++int dss_suspend_all_devices(void)
+ {
+ int r;
+- struct omap_display *display;
+-
+- list_for_each_entry(display, &display_list, list) {
+- if (display->activate_after_resume && display->resume) {
+- r = display->resume(display);
+- if (r)
+- return r;
+- }
++ struct bus_type *bus = dss_get_bus();
+
+- display->activate_after_resume = 0;
++ r = bus_for_each_dev(bus, NULL, NULL, dss_suspend_device);
++ if (r) {
++ /* resume all displays that were suspended */
++ dss_resume_all_devices();
++ return r;
+ }
+
+ return 0;
+ }
+
+-int omap_dss_get_num_displays(void)
+-{
+- return num_displays;
+-}
+-EXPORT_SYMBOL(omap_dss_get_num_displays);
+-
+-struct omap_display *dss_get_display(int no)
++static int dss_resume_device(struct device *dev, void *data)
+ {
+- int i = 0;
+- struct omap_display *display;
++ int r;
++ struct omap_dss_device *dssdev = to_dss_device(dev);
+
+- list_for_each_entry(display, &display_list, list) {
+- if (i++ == no)
+- return display;
++ if (dssdev->activate_after_resume && dssdev->resume) {
++ r = dssdev->resume(dssdev);
++ if (r)
++ return r;
+ }
+
+- return NULL;
++ dssdev->activate_after_resume = false;
++
++ return 0;
+ }
+
+-struct omap_display *omap_dss_get_display(int no)
++int dss_resume_all_devices(void)
+ {
+- struct omap_display *display;
++ struct bus_type *bus = dss_get_bus();
+
+- display = dss_get_display(no);
++ return bus_for_each_dev(bus, NULL, NULL, dss_resume_device);
++}
+
+- if (!display)
+- return NULL;
+
+- switch (display->type) {
+- case OMAP_DISPLAY_TYPE_VENC:
+- break;
++void omap_dss_get_device(struct omap_dss_device *dssdev)
++{
++ get_device(&dssdev->dev);
++}
++EXPORT_SYMBOL(omap_dss_get_device);
+
+- case OMAP_DISPLAY_TYPE_DPI:
+- case OMAP_DISPLAY_TYPE_SDI:
+- if (display->panel == NULL)
+- return NULL;
+- break;
++void omap_dss_put_device(struct omap_dss_device *dssdev)
++{
++ put_device(&dssdev->dev);
++}
++EXPORT_SYMBOL(omap_dss_put_device);
+
+- case OMAP_DISPLAY_TYPE_DBI:
+- case OMAP_DISPLAY_TYPE_DSI:
+- if (display->panel == NULL || display->ctrl == NULL)
+- return NULL;
+- break;
++/* ref count of the found device is incremented. ref count
++ * of from-device is decremented. */
++struct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from)
++{
++ struct device *dev;
++ struct device *dev_start = NULL;
++ struct omap_dss_device *dssdev = NULL;
+
+- default:
+- return NULL;
++ int match(struct device *dev, void *data)
++ {
++ /* skip panels connected to controllers */
++ if (to_dss_device(dev)->panel.ctrl)
++ return 0;
++
++ return 1;
+ }
+
+- if (display->ctrl) {
+- if (!try_module_get(display->ctrl->owner))
+- goto err0;
++ if (from)
++ dev_start = &from->dev;
++ dev = bus_find_device(dss_get_bus(), dev_start, NULL, match);
++ if (dev)
++ dssdev = to_dss_device(dev);
++ if (from)
++ put_device(&from->dev);
+
+- if (display->ctrl->init)
+- if (display->ctrl->init(display) != 0)
+- goto err1;
+- }
++ return dssdev;
++}
++EXPORT_SYMBOL(omap_dss_get_next_device);
+
+- if (display->panel) {
+- if (!try_module_get(display->panel->owner))
+- goto err2;
++struct omap_dss_device *omap_dss_find_device(void *data,
++ int (*match)(struct omap_dss_device *dssdev, void *data))
++{
++ struct omap_dss_device *dssdev = NULL;
+
+- if (display->panel->init)
+- if (display->panel->init(display) != 0)
+- goto err3;
++ while ((dssdev = omap_dss_get_next_device(dssdev)) != NULL)
++ {
++ if (match(dssdev, data))
++ return dssdev;
+ }
+
+- display->ref_count++;
+- /*
+- if (atomic_cmpxchg(&display->ref_count, 0, 1) != 0)
+- return 0;
+-*/
+-
+- return display;
+-err3:
+- if (display->panel)
+- module_put(display->panel->owner);
+-err2:
+- if (display->ctrl && display->ctrl->cleanup)
+- display->ctrl->cleanup(display);
+-err1:
+- if (display->ctrl)
+- module_put(display->ctrl->owner);
+-err0:
+ return NULL;
+ }
+-EXPORT_SYMBOL(omap_dss_get_display);
++EXPORT_SYMBOL(omap_dss_find_device);
+
+-void omap_dss_put_display(struct omap_display *display)
++int omap_dss_start_device(struct omap_dss_device *dssdev)
+ {
+- if (--display->ref_count > 0)
+- return;
+-/*
+- if (atomic_cmpxchg(&display->ref_count, 1, 0) != 1)
+- return;
+-*/
+- if (display->ctrl) {
+- if (display->ctrl->cleanup)
+- display->ctrl->cleanup(display);
+- module_put(display->ctrl->owner);
+- }
++ int r;
+
+- if (display->panel) {
+- if (display->panel->cleanup)
+- display->panel->cleanup(display);
+- module_put(display->panel->owner);
++ if (!dssdev->driver) {
++ DSSDBG("no driver\n");
++ r = -ENODEV;
++ goto err0;
+ }
+-}
+-EXPORT_SYMBOL(omap_dss_put_display);
+-
+-void omap_dss_register_ctrl(struct omap_ctrl *ctrl)
+-{
+- struct omap_display *display;
+
+- list_for_each_entry(display, &display_list, list) {
+- if (display->hw_config.ctrl_name &&
+- strcmp(display->hw_config.ctrl_name, ctrl->name) == 0) {
+- display->ctrl = ctrl;
+- DSSDBG("ctrl '%s' registered\n", ctrl->name);
+- }
++ if (dssdev->ctrl.panel && !dssdev->ctrl.panel->driver) {
++ DSSDBG("no panel driver\n");
++ r = -ENODEV;
++ goto err0;
+ }
+-}
+-EXPORT_SYMBOL(omap_dss_register_ctrl);
+
+-void omap_dss_register_panel(struct omap_panel *panel)
+-{
+- struct omap_display *display;
++ if(!try_module_get(dssdev->dev.driver->owner)) {
++ r = -ENODEV;
++ goto err0;
++ }
+
+- list_for_each_entry(display, &display_list, list) {
+- if (display->hw_config.panel_name &&
+- strcmp(display->hw_config.panel_name, panel->name) == 0) {
+- display->panel = panel;
+- DSSDBG("panel '%s' registered\n", panel->name);
++ if (dssdev->ctrl.panel) {
++ if(!try_module_get(dssdev->ctrl.panel->dev.driver->owner)) {
++ r = -ENODEV;
++ goto err1;
+ }
+ }
+-}
+-EXPORT_SYMBOL(omap_dss_register_panel);
+
+-void omap_dss_unregister_ctrl(struct omap_ctrl *ctrl)
+-{
+- struct omap_display *display;
+-
+- list_for_each_entry(display, &display_list, list) {
+- if (display->hw_config.ctrl_name &&
+- strcmp(display->hw_config.ctrl_name, ctrl->name) == 0)
+- display->ctrl = NULL;
+- }
++ return 0;
++err1:
++ module_put(dssdev->dev.driver->owner);
++err0:
++ return r;
+ }
+-EXPORT_SYMBOL(omap_dss_unregister_ctrl);
++EXPORT_SYMBOL(omap_dss_start_device);
+
+-void omap_dss_unregister_panel(struct omap_panel *panel)
++void omap_dss_stop_device(struct omap_dss_device *dssdev)
+ {
+- struct omap_display *display;
++ if (dssdev->ctrl.panel)
++ module_put(dssdev->ctrl.panel->dev.driver->owner);
+
+- list_for_each_entry(display, &display_list, list) {
+- if (display->hw_config.panel_name &&
+- strcmp(display->hw_config.panel_name, panel->name) == 0)
+- display->panel = NULL;
+- }
++ module_put(dssdev->dev.driver->owner);
+ }
+-EXPORT_SYMBOL(omap_dss_unregister_panel);
++EXPORT_SYMBOL(omap_dss_stop_device);
++
+diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
+index 71fffca..f5867cf 100644
+--- a/drivers/video/omap2/dss/dpi.c
++++ b/drivers/video/omap2/dss/dpi.c
+@@ -20,6 +20,8 @@
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
++#define DSS_SUBSYS_NAME "DPI"
++
+ #include <linux/kernel.h>
+ #include <linux/clk.h>
+ #include <linux/delay.h>
+@@ -83,9 +85,9 @@ static int dpi_set_dispc_clk(bool is_tft, unsigned long pck_req,
+ }
+ #endif
+
+-static int dpi_set_mode(struct omap_display *display)
++static int dpi_set_mode(struct omap_dss_device *dssdev)
+ {
+- struct omap_panel *panel = display->panel;
++ struct omap_video_timings *t = &dssdev->panel.timings;
+ int lck_div, pck_div;
+ unsigned long fck;
+ unsigned long pck;
+@@ -94,15 +96,16 @@ static int dpi_set_mode(struct omap_display *display)
+
+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- dispc_set_pol_freq(panel);
++ dispc_set_pol_freq(dssdev->panel.config, dssdev->panel.acbi,
++ dssdev->panel.acb);
+
+- is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0;
++ is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
+
+ #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
+- r = dpi_set_dsi_clk(is_tft, panel->timings.pixel_clock * 1000,
++ r = dpi_set_dsi_clk(is_tft, t->pixel_clock * 1000,
+ &fck, &lck_div, &pck_div);
+ #else
+- r = dpi_set_dispc_clk(is_tft, panel->timings.pixel_clock * 1000,
++ r = dpi_set_dispc_clk(is_tft, t->pixel_clock * 1000,
+ &fck, &lck_div, &pck_div);
+ #endif
+ if (r)
+@@ -110,97 +113,106 @@ static int dpi_set_mode(struct omap_display *display)
+
+ pck = fck / lck_div / pck_div / 1000;
+
+- if (pck != panel->timings.pixel_clock) {
++ if (pck != t->pixel_clock) {
+ DSSWARN("Could not find exact pixel clock. "
+ "Requested %d kHz, got %lu kHz\n",
+- panel->timings.pixel_clock, pck);
++ t->pixel_clock, pck);
+
+- panel->timings.pixel_clock = pck;
++ t->pixel_clock = pck;
+ }
+
+- dispc_set_lcd_timings(&panel->timings);
++ dispc_set_lcd_timings(t);
+
+ err0:
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+ return r;
+ }
+
+-static int dpi_basic_init(struct omap_display *display)
++static int dpi_basic_init(struct omap_dss_device *dssdev)
+ {
+ bool is_tft;
+
+- is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0;
++ is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
+
+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS);
+ dispc_set_lcd_display_type(is_tft ? OMAP_DSS_LCD_DISPLAY_TFT :
+ OMAP_DSS_LCD_DISPLAY_STN);
+- dispc_set_tft_data_lines(display->hw_config.u.dpi.data_lines);
++ dispc_set_tft_data_lines(dssdev->phy.dpi.data_lines);
+
+ return 0;
+ }
+
+-static int dpi_display_enable(struct omap_display *display)
++static int dpi_display_enable(struct omap_dss_device *dssdev)
+ {
+- struct omap_panel *panel = display->panel;
+ int r;
+
+- if (display->state != OMAP_DSS_DISPLAY_DISABLED) {
++ r = omap_dss_start_device(dssdev);
++ if (r) {
++ DSSERR("failed to start device\n");
++ goto err0;
++ }
++
++ if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
+ DSSERR("display already enabled\n");
+- return -EINVAL;
++ r = -EINVAL;
++ goto err1;
+ }
+
+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- r = dpi_basic_init(display);
++ r = dpi_basic_init(dssdev);
+ if (r)
+- goto err0;
++ goto err2;
+
+ #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
+ dss_clk_enable(DSS_CLK_FCK2);
+ r = dsi_pll_init(0, 1);
+ if (r)
+- goto err1;
++ goto err3;
+ #endif
+- r = dpi_set_mode(display);
++ r = dpi_set_mode(dssdev);
+ if (r)
+- goto err2;
++ goto err4;
+
+ mdelay(2);
+
+ dispc_enable_lcd_out(1);
+
+- r = panel->enable(display);
++ r = dssdev->driver->enable(dssdev);
+ if (r)
+- goto err3;
++ goto err5;
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ return 0;
+
+-err3:
++err5:
+ dispc_enable_lcd_out(0);
+-err2:
++err4:
+ #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
+ dsi_pll_uninit();
+-err1:
++err3:
+ dss_clk_disable(DSS_CLK_FCK2);
+ #endif
+-err0:
++err2:
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
++err1:
++ omap_dss_stop_device(dssdev);
++err0:
+ return r;
+ }
+
+-static int dpi_display_resume(struct omap_display *display);
++static int dpi_display_resume(struct omap_dss_device *dssdev);
+
+-static void dpi_display_disable(struct omap_display *display)
++static void dpi_display_disable(struct omap_dss_device *dssdev)
+ {
+- if (display->state == OMAP_DSS_DISPLAY_DISABLED)
++ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED)
+ return;
+
+- if (display->state == OMAP_DSS_DISPLAY_SUSPENDED)
+- dpi_display_resume(display);
++ if (dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
++ dpi_display_resume(dssdev);
+
+- display->panel->disable(display);
++ dssdev->driver->disable(dssdev);
+
+ dispc_enable_lcd_out(0);
+
+@@ -212,31 +224,33 @@ static void dpi_display_disable(struct omap_display *display)
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
++ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
++
++ omap_dss_stop_device(dssdev);
+ }
+
+-static int dpi_display_suspend(struct omap_display *display)
++static int dpi_display_suspend(struct omap_dss_device *dssdev)
+ {
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EINVAL;
+
+ DSSDBG("dpi_display_suspend\n");
+
+- if (display->panel->suspend)
+- display->panel->suspend(display);
++ if (dssdev->driver->suspend)
++ dssdev->driver->suspend(dssdev);
+
+ dispc_enable_lcd_out(0);
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- display->state = OMAP_DSS_DISPLAY_SUSPENDED;
++ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+
+ return 0;
+ }
+
+-static int dpi_display_resume(struct omap_display *display)
++static int dpi_display_resume(struct omap_dss_device *dssdev)
+ {
+- if (display->state != OMAP_DSS_DISPLAY_SUSPENDED)
++ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
+ return -EINVAL;
+
+ DSSDBG("dpi_display_resume\n");
+@@ -245,26 +259,26 @@ static int dpi_display_resume(struct omap_display *display)
+
+ dispc_enable_lcd_out(1);
+
+- if (display->panel->resume)
+- display->panel->resume(display);
++ if (dssdev->driver->resume)
++ dssdev->driver->resume(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ return 0;
+ }
+
+-static void dpi_set_timings(struct omap_display *display,
++static void dpi_set_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+ DSSDBG("dpi_set_timings\n");
+- display->panel->timings = *timings;
+- if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
+- dpi_set_mode(display);
++ dssdev->panel.timings = *timings;
++ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
++ dpi_set_mode(dssdev);
+ dispc_go(OMAP_DSS_CHANNEL_LCD);
+ }
+ }
+
+-static int dpi_check_timings(struct omap_display *display,
++static int dpi_check_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+ bool is_tft;
+@@ -300,7 +314,7 @@ static int dpi_check_timings(struct omap_display *display,
+ if (timings->pixel_clock == 0)
+ return -EINVAL;
+
+- is_tft = (display->panel->config & OMAP_DSS_LCD_TFT) != 0;
++ is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
+
+ #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
+ {
+@@ -337,13 +351,13 @@ static int dpi_check_timings(struct omap_display *display,
+ return 0;
+ }
+
+-static void dpi_get_timings(struct omap_display *display,
++static void dpi_get_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+- *timings = display->panel->timings;
++ *timings = dssdev->panel.timings;
+ }
+
+-static int dpi_display_set_update_mode(struct omap_display *display,
++static int dpi_display_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+ {
+ if (mode == OMAP_DSS_UPDATE_MANUAL)
+@@ -361,25 +375,25 @@ static int dpi_display_set_update_mode(struct omap_display *display,
+ }
+
+ static enum omap_dss_update_mode dpi_display_get_update_mode(
+- struct omap_display *display)
++ struct omap_dss_device *dssdev)
+ {
+ return dpi.update_enabled ? OMAP_DSS_UPDATE_AUTO :
+ OMAP_DSS_UPDATE_DISABLED;
+ }
+
+-void dpi_init_display(struct omap_display *display)
++void dpi_init_display(struct omap_dss_device *dssdev)
+ {
+- DSSDBG("DPI init_display\n");
+-
+- display->enable = dpi_display_enable;
+- display->disable = dpi_display_disable;
+- display->suspend = dpi_display_suspend;
+- display->resume = dpi_display_resume;
+- display->set_timings = dpi_set_timings;
+- display->check_timings = dpi_check_timings;
+- display->get_timings = dpi_get_timings;
+- display->set_update_mode = dpi_display_set_update_mode;
+- display->get_update_mode = dpi_display_get_update_mode;
++ DSSDBG("init_display\n");
++
++ dssdev->enable = dpi_display_enable;
++ dssdev->disable = dpi_display_disable;
++ dssdev->suspend = dpi_display_suspend;
++ dssdev->resume = dpi_display_resume;
++ dssdev->set_timings = dpi_set_timings;
++ dssdev->check_timings = dpi_check_timings;
++ dssdev->get_timings = dpi_get_timings;
++ dssdev->set_update_mode = dpi_display_set_update_mode;
++ dssdev->get_update_mode = dpi_display_get_update_mode;
+ }
+
+ int dpi_init(void)
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index a06fb75..fb2f7f0 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -30,6 +30,7 @@
+ #include <linux/mutex.h>
+ #include <linux/seq_file.h>
+ #include <linux/kfifo.h>
++#include <linux/platform_device.h>
+
+ #include <mach/board.h>
+ #include <mach/display.h>
+@@ -230,7 +231,7 @@ enum dsi_cmd {
+ };
+
+ struct dsi_cmd_item {
+- struct omap_display *display;
++ struct omap_dss_device *dssdev;
+
+ enum dsi_cmd cmd;
+
+@@ -256,7 +257,7 @@ static struct
+ unsigned long ddr_clk; /* Hz */
+
+ struct {
+- struct omap_display *display;
++ struct omap_dss_device *dssdev;
+ enum fifo_size fifo_size;
+ int dest_per; /* destination peripheral 0-3 */
+ } vc[4];
+@@ -317,9 +318,9 @@ module_param_named(dsi_perf, dsi_perf, bool, 0644);
+ #endif
+
+ static void dsi_process_cmd_fifo(struct work_struct *work);
+-static void dsi_push_update(struct omap_display *display,
++static void dsi_push_update(struct omap_dss_device *dssdev,
+ int x, int y, int w, int h);
+-static void dsi_push_autoupdate(struct omap_display *display);
++static void dsi_push_autoupdate(struct omap_dss_device *dssdev);
+
+ static inline void dsi_write_reg(const struct dsi_reg idx, u32 val)
+ {
+@@ -777,7 +778,7 @@ static unsigned long dsi_fclk_rate(void)
+ return r;
+ }
+
+-static int dsi_set_lp_clk_divisor(struct omap_display *display)
++static int dsi_set_lp_clk_divisor(struct omap_dss_device *dssdev)
+ {
+ unsigned n;
+ unsigned long dsi_fclk;
+@@ -785,7 +786,7 @@ static int dsi_set_lp_clk_divisor(struct omap_display *display)
+
+ dsi_fclk = dsi_fclk_rate();
+
+- lp_clk_req = display->hw_config.u.dsi.lp_clk_hz;
++ lp_clk_req = dssdev->phy.dsi.lp_clk_hz;
+
+ for (n = 1; n < (1 << 13) - 1; ++n) {
+ lp_clk = dsi_fclk / 2 / n;
+@@ -1376,16 +1377,16 @@ static int dsi_complexio_power(enum dsi_complexio_power_state state)
+ return 0;
+ }
+
+-static void dsi_complexio_config(struct omap_display *display)
++static void dsi_complexio_config(struct omap_dss_device *dssdev)
+ {
+ u32 r;
+
+- int clk_lane = display->hw_config.u.dsi.clk_lane;
+- int data1_lane = display->hw_config.u.dsi.data1_lane;
+- int data2_lane = display->hw_config.u.dsi.data2_lane;
+- int clk_pol = display->hw_config.u.dsi.clk_pol;
+- int data1_pol = display->hw_config.u.dsi.data1_pol;
+- int data2_pol = display->hw_config.u.dsi.data2_pol;
++ int clk_lane = dssdev->phy.dsi.clk_lane;
++ int data1_lane = dssdev->phy.dsi.data1_lane;
++ int data2_lane = dssdev->phy.dsi.data2_lane;
++ int clk_pol = dssdev->phy.dsi.clk_pol;
++ int data1_pol = dssdev->phy.dsi.data1_pol;
++ int data2_pol = dssdev->phy.dsi.data2_pol;
+
+ r = dsi_read_reg(DSI_COMPLEXIO_CFG1);
+ r = FLD_MOD(r, clk_lane, 2, 0);
+@@ -1497,7 +1498,7 @@ static void dsi_complexio_timings(void)
+ }
+
+
+-static int dsi_complexio_init(struct omap_display *display)
++static int dsi_complexio_init(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+@@ -1517,7 +1518,7 @@ static int dsi_complexio_init(struct omap_display *display)
+ goto err;
+ }
+
+- dsi_complexio_config(display);
++ dsi_complexio_config(dssdev);
+
+ r = dsi_complexio_power(DSI_COMPLEXIO_POWER_ON);
+
+@@ -2283,7 +2284,7 @@ static int dsi_set_hs_tx_timeout(int ns, int x4, int x16)
+
+ return 0;
+ }
+-static int dsi_proto_config(struct omap_display *display)
++static int dsi_proto_config(struct omap_dss_device *dssdev)
+ {
+ u32 r;
+ int buswidth = 0;
+@@ -2310,7 +2311,7 @@ static int dsi_proto_config(struct omap_display *display)
+ /* 10000ns * 4 */
+ dsi_set_hs_tx_timeout(10000, 1, 0);
+
+- switch (display->ctrl->pixel_size) {
++ switch (dssdev->ctrl.pixel_size) {
+ case 16:
+ buswidth = 0;
+ break;
+@@ -2355,7 +2356,7 @@ static int dsi_proto_config(struct omap_display *display)
+ return 0;
+ }
+
+-static void dsi_proto_timings(struct omap_display *display)
++static void dsi_proto_timings(struct omap_dss_device *dssdev)
+ {
+ unsigned tlpx, tclk_zero, tclk_prepare, tclk_trail;
+ unsigned tclk_pre, tclk_post;
+@@ -2387,8 +2388,8 @@ static void dsi_proto_timings(struct omap_display *display)
+ tclk_post = ns2ddr(60) + 26;
+
+ /* ths_eot is 2 for 2 datalanes and 4 for 1 datalane */
+- if (display->hw_config.u.dsi.data1_lane != 0 &&
+- display->hw_config.u.dsi.data2_lane != 0)
++ if (dssdev->phy.dsi.data1_lane != 0 &&
++ dssdev->phy.dsi.data2_lane != 0)
+ ths_eot = 2;
+ else
+ ths_eot = 4;
+@@ -2412,6 +2413,7 @@ static void dsi_proto_timings(struct omap_display *display)
+ enter_hs_mode_lat = 1 + DIV_ROUND_UP(tlpx, 4) +
+ DIV_ROUND_UP(ths_prepare, 4) +
+ DIV_ROUND_UP(ths_zero + 3, 4);
++
+ exit_hs_mode_lat = DIV_ROUND_UP(ths_trail + ths_exit, 4) + 1 + ths_eot;
+
+ r = FLD_VAL(enter_hs_mode_lat, 31, 16) |
+@@ -2441,7 +2443,7 @@ static void dsi_proto_timings(struct omap_display *display)
+ DSI_FLUSH(ch); \
+ } while (0)
+
+-static int dsi_update_screen_l4(struct omap_display *display,
++static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ int x, int y, int w, int h)
+ {
+ /* Note: supports only 24bit colors in 32bit container */
+@@ -2464,12 +2466,12 @@ static int dsi_update_screen_l4(struct omap_display *display,
+ DSSDBG("dsi_update_screen_l4 (%d,%d %dx%d)\n",
+ x, y, w, h);
+
+- ovl = display->manager->overlays[0];
++ ovl = dssdev->manager->overlays[0];
+
+ if (ovl->info.color_mode != OMAP_DSS_COLOR_RGB24U)
+ return -EINVAL;
+
+- if (display->ctrl->pixel_size != 24)
++ if (dssdev->ctrl.pixel_size != 24)
+ return -EINVAL;
+
+ scr_width = ovl->info.screen_width;
+@@ -2497,7 +2499,7 @@ static int dsi_update_screen_l4(struct omap_display *display,
+
+ dsi_bus_lock();
+
+- display->ctrl->setup_update(display, x, y, w, h);
++ dssdev->driver->setup_update(dssdev, x, y, w, h);
+
+ pixels_left = w * h;
+
+@@ -2595,101 +2597,7 @@ static int dsi_update_screen_l4(struct omap_display *display,
+ return 0;
+ }
+
+-#if 0
+-static void dsi_clear_screen_l4(struct omap_display *display,
+- int x, int y, int w, int h)
+-{
+- int first = 1;
+- int fifo_stalls = 0;
+- int max_dsi_packet_size;
+- int max_data_per_packet;
+- int max_pixels_per_packet;
+- int pixels_left;
+- int bytespp = 3;
+- int pixnum;
+-
+- debug_irq = 0;
+-
+- DSSDBG("dsi_clear_screen_l4 (%d,%d %dx%d)\n",
+- x, y, w, h);
+-
+- if (display->ctrl->bpp != 24)
+- return -EINVAL;
+-
+- /* We need header(4) + DCSCMD(1) + pixels(numpix*bytespp)
+- * bytes in fifo */
+-
+- /* When using CPU, max long packet size is TX buffer size */
+- max_dsi_packet_size = dsi.vc[0].fifo_size * 32 * 4;
+-
+- max_data_per_packet = max_dsi_packet_size - 4 - 1;
+-
+- max_pixels_per_packet = max_data_per_packet / bytespp;
+-
+- enable_clocks(1);
+-
+- display->ctrl->setup_update(display, x, y, w, h);
+-
+- pixels_left = w * h;
+-
+- dsi.update_region.x = x;
+- dsi.update_region.y = y;
+- dsi.update_region.w = w;
+- dsi.update_region.h = h;
+- dsi.update_region.bytespp = bytespp;
+-
+- start_measuring();
+-
+- pixnum = 0;
+-
+- while (pixels_left > 0) {
+- /* 0x2c = write_memory_start */
+- /* 0x3c = write_memory_continue */
+- u8 dcs_cmd = first ? 0x2c : 0x3c;
+- int pixels;
+- DSI_DECL_VARS;
+- first = 0;
+-
+- /* TX_FIFO_NOT_EMPTY */
+- while (FLD_GET(dsi_read_reg(DSI_VC_CTRL(0)), 5, 5)) {
+- fifo_stalls++;
+- if (fifo_stalls > 0xfffff) {
+- DSSERR("fifo stalls overflow\n");
+- dsi_if_enable(0);
+- enable_clocks(0);
+- return;
+- }
+- }
+-
+- pixels = min(max_pixels_per_packet, pixels_left);
+-
+- pixels_left -= pixels;
+-
+- dsi_vc_write_long_header(0, DSI_DT_DCS_LONG_WRITE,
+- 1 + pixels * bytespp, 0);
+-
+- DSI_PUSH(0, dcs_cmd);
+-
+- while (pixels-- > 0) {
+- u32 pix;
+-
+- pix = 0x000000;
+-
+- DSI_PUSH(0, (pix >> 16) & 0xff);
+- DSI_PUSH(0, (pix >> 8) & 0xff);
+- DSI_PUSH(0, (pix >> 0) & 0xff);
+- }
+-
+- DSI_FLUSH(0);
+- }
+-
+- enable_clocks(0);
+-
+- end_measuring("L4 CLEAR");
+-}
+-#endif
+-
+-static void dsi_setup_update_dispc(struct omap_display *display,
++static void dsi_setup_update_dispc(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+ DSSDBG("dsi_setup_update_dispc(%d,%d %dx%d)\n",
+@@ -2703,16 +2611,16 @@ static void dsi_setup_update_dispc(struct omap_display *display,
+ dsi.update_region.bytespp = 3; // XXX
+ #endif
+
+- dispc_setup_partial_planes(display, &x, &y, &w, &h);
++ dispc_setup_partial_planes(dssdev, &x, &y, &w, &h);
+
+ dispc_set_lcd_size(w, h);
+ }
+
+-static void dsi_setup_autoupdate_dispc(struct omap_display *display)
++static void dsi_setup_autoupdate_dispc(struct omap_dss_device *dssdev)
+ {
+ u16 w, h;
+
+- display->get_resolution(display, &w, &h);
++ dssdev->get_resolution(dssdev, &w, &h);
+
+ #ifdef DEBUG
+ dsi.update_region.x = 0;
+@@ -2724,14 +2632,14 @@ static void dsi_setup_autoupdate_dispc(struct omap_display *display)
+
+ /* the overlay settings may not have been applied, if we were in manual
+ * mode earlier, so do it here */
+- display->manager->apply(display->manager);
++ dssdev->manager->apply(dssdev->manager);
+
+ dispc_set_lcd_size(w, h);
+
+ dsi.autoupdate_setup = 0;
+ }
+
+-static void dsi_update_screen_dispc(struct omap_display *display,
++static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+ int bytespp = 3;
+@@ -2760,10 +2668,10 @@ static void dsi_update_screen_dispc(struct omap_display *display,
+
+ dsi_bus_lock();
+
+- display->ctrl->setup_update(display, x, y, w, h);
++ dssdev->driver->setup_update(dssdev, x, y, w, h);
+
+- if (dsi.use_ext_te && display->ctrl->wait_for_te)
+- display->ctrl->wait_for_te(display);
++ if (dsi.use_ext_te && dssdev->wait_for_te)
++ dssdev->wait_for_te(dssdev);
+
+ if (0)
+ dsi_vc_print_status(1);
+@@ -2811,7 +2719,7 @@ static void framedone_timeout_callback(struct work_struct *work)
+ /* We check for target_update_mode, not update_mode. No reason to push
+ * new updates if we're turning auto update off */
+ if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_push_autoupdate(dsi.vc[1].display);
++ dsi_push_autoupdate(dsi.vc[1].dssdev);
+
+ atomic_set(&dsi.cmd_pending, 0);
+ dsi_process_cmd_fifo(NULL);
+@@ -2895,19 +2803,19 @@ static void framedone_worker(struct work_struct *work)
+ /* We check for target_update_mode, not update_mode. No reason to push
+ * new updates if we're turning auto update off */
+ if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_push_autoupdate(dsi.vc[1].display);
++ dsi_push_autoupdate(dsi.vc[1].dssdev);
+
+ atomic_set(&dsi.cmd_pending, 0);
+ dsi_process_cmd_fifo(NULL);
+ }
+
+-static void dsi_start_auto_update(struct omap_display *display)
++static void dsi_start_auto_update(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("starting auto update\n");
+
+ dsi.autoupdate_setup = 1;
+
+- dsi_push_autoupdate(display);
++ dsi_push_autoupdate(dssdev);
+
+ perf_mark_start_auto();
+ }
+@@ -2936,7 +2844,7 @@ static void dsi_signal_fifo_waiters(void)
+ }
+
+ /* returns 1 for async op, and 0 for sync op */
+-static int dsi_do_update(struct omap_display *display,
++static int dsi_do_update(struct omap_dss_device *dssdev,
+ struct dsi_cmd_update *upd)
+ {
+ int r;
+@@ -2946,10 +2854,10 @@ static int dsi_do_update(struct omap_display *display,
+ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED)
+ return 0;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return 0;
+
+- display->get_resolution(display, &dw, &dh);
++ dssdev->get_resolution(dssdev, &dw, &dh);
+ if (x > dw || y > dh)
+ return 0;
+
+@@ -2963,12 +2871,12 @@ static int dsi_do_update(struct omap_display *display,
+
+ perf_mark_setup();
+
+- if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+- dsi_setup_update_dispc(display, x, y, w, h);
+- dsi_update_screen_dispc(display, x, y, w, h);
++ if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ dsi_setup_update_dispc(dssdev, x, y, w, h);
++ dsi_update_screen_dispc(dssdev, x, y, w, h);
+ return 1;
+ } else {
+- r = dsi_update_screen_l4(display, x, y, w, h);
++ r = dsi_update_screen_l4(dssdev, x, y, w, h);
+ if (r)
+ DSSERR("L4 update failed\n");
+ return 0;
+@@ -2976,7 +2884,7 @@ static int dsi_do_update(struct omap_display *display,
+ }
+
+ /* returns 1 for async op, and 0 for sync op */
+-static int dsi_do_autoupdate(struct omap_display *display)
++static int dsi_do_autoupdate(struct omap_dss_device *dssdev)
+ {
+ int r;
+ u16 w, h;
+@@ -2984,34 +2892,34 @@ static int dsi_do_autoupdate(struct omap_display *display)
+ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED)
+ return 0;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return 0;
+
+- display->get_resolution(display, &w, &h);
++ dssdev->get_resolution(dssdev, &w, &h);
+
+ perf_mark_setup();
+
+- if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+ if (dsi.autoupdate_setup)
+- dsi_setup_autoupdate_dispc(display);
+- dsi_update_screen_dispc(display, 0, 0, w, h);
++ dsi_setup_autoupdate_dispc(dssdev);
++ dsi_update_screen_dispc(dssdev, 0, 0, w, h);
+ return 1;
+ } else {
+- r = dsi_update_screen_l4(display, 0, 0, w, h);
++ r = dsi_update_screen_l4(dssdev, 0, 0, w, h);
+ if (r)
+ DSSERR("L4 update failed\n");
+ return 0;
+ }
+ }
+
+-static void dsi_do_cmd_mem_read(struct omap_display *display,
++static void dsi_do_cmd_mem_read(struct omap_dss_device *dssdev,
+ struct dsi_cmd_mem_read *mem_read)
+ {
+ int r;
+
+ dsi_bus_lock();
+
+- r = display->ctrl->memory_read(display,
++ r = dssdev->driver->memory_read(dssdev,
+ mem_read->buf,
+ mem_read->size,
+ mem_read->x,
+@@ -3025,14 +2933,14 @@ static void dsi_do_cmd_mem_read(struct omap_display *display,
+ complete(mem_read->completion);
+ }
+
+-static void dsi_do_cmd_test(struct omap_display *display,
++static void dsi_do_cmd_test(struct omap_dss_device *dssdev,
+ struct dsi_cmd_test *test)
+ {
+ int r = 0;
+
+ DSSDBGF("");
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
+ dsi_bus_lock();
+@@ -3040,14 +2948,8 @@ static void dsi_do_cmd_test(struct omap_display *display,
+ /* run test first in low speed mode */
+ dsi_vc_enable_hs(0, 0);
+
+- if (display->ctrl->run_test) {
+- r = display->ctrl->run_test(display, test->test_num);
+- if (r)
+- goto end;
+- }
+-
+- if (display->panel->run_test) {
+- r = display->panel->run_test(display, test->test_num);
++ if (dssdev->driver->run_test) {
++ r = dssdev->driver->run_test(dssdev, test->test_num);
+ if (r)
+ goto end;
+ }
+@@ -3055,15 +2957,12 @@ static void dsi_do_cmd_test(struct omap_display *display,
+ /* then in high speed */
+ dsi_vc_enable_hs(0, 1);
+
+- if (display->ctrl->run_test) {
+- r = display->ctrl->run_test(display, test->test_num);
++ if (dssdev->driver->run_test) {
++ r = dssdev->driver->run_test(dssdev, test->test_num);
+ if (r)
+ goto end;
+ }
+
+- if (display->panel->run_test)
+- r = display->panel->run_test(display, test->test_num);
+-
+ end:
+ dsi_vc_enable_hs(0, 1);
+
+@@ -3075,21 +2974,21 @@ end:
+ DSSDBG("test end\n");
+ }
+
+-static void dsi_do_cmd_set_te(struct omap_display *display, bool enable)
++static void dsi_do_cmd_set_te(struct omap_dss_device *dssdev, bool enable)
+ {
+- if (!display->hw_config.u.dsi.ext_te)
++ if (!dssdev->phy.dsi.ext_te)
+ dsi.use_te = enable;
+ else
+ dsi.use_ext_te = enable;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
+ dsi_bus_lock();
+- display->ctrl->enable_te(display, enable);
++ dssdev->driver->enable_te(dssdev, enable);
+ dsi_bus_unlock();
+
+- if (!display->hw_config.u.dsi.ext_te) {
++ if (!dssdev->phy.dsi.ext_te) {
+ if (enable) {
+ /* disable LP_RX_TO, so that we can receive TE.
+ * Time to wait for TE is longer than the timer allows */
+@@ -3100,16 +2999,16 @@ static void dsi_do_cmd_set_te(struct omap_display *display, bool enable)
+ }
+ }
+
+-static void dsi_do_cmd_set_update_mode(struct omap_display *display,
++static void dsi_do_cmd_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+ {
+ dsi.update_mode = mode;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return;
+
+ if (mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_start_auto_update(display);
++ dsi_start_auto_update(dssdev);
+ }
+
+ static void dsi_process_cmd_fifo(struct work_struct *work)
+@@ -3117,7 +3016,7 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+ int len;
+ struct dsi_cmd_item p;
+ unsigned long flags;
+- struct omap_display *display;
++ struct omap_dss_device *dssdev;
+ int exit = 0;
+
+ if (dsi.debug_process)
+@@ -3146,14 +3045,14 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+
+ BUG_ON(len != sizeof(p));
+
+- display = p.display;
++ dssdev = p.dssdev;
+
+ if (dsi.debug_process)
+ DSSDBG("processing cmd %d\n", p.cmd);
+
+ switch (p.cmd) {
+ case DSI_CMD_UPDATE:
+- if (dsi_do_update(display, &p.u.r)) {
++ if (dsi_do_update(dssdev, &p.u.r)) {
+ if (dsi.debug_process)
+ DSSDBG("async update\n");
+ exit = 1;
+@@ -3164,7 +3063,7 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+ break;
+
+ case DSI_CMD_AUTOUPDATE:
+- if (dsi_do_autoupdate(display)) {
++ if (dsi_do_autoupdate(dssdev)) {
+ if (dsi.debug_process)
+ DSSDBG("async autoupdate\n");
+ exit = 1;
+@@ -3181,24 +3080,24 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+ break;
+
+ case DSI_CMD_MEM_READ:
+- dsi_do_cmd_mem_read(display, &p.u.mem_read);
++ dsi_do_cmd_mem_read(dssdev, &p.u.mem_read);
+ break;
+
+ case DSI_CMD_TEST:
+- dsi_do_cmd_test(display, &p.u.test);
++ dsi_do_cmd_test(dssdev, &p.u.test);
+ break;
+
+ case DSI_CMD_SET_TE:
+- dsi_do_cmd_set_te(display, p.u.te);
++ dsi_do_cmd_set_te(dssdev, p.u.te);
+ break;
+
+ case DSI_CMD_SET_UPDATE_MODE:
+- dsi_do_cmd_set_update_mode(display, p.u.update_mode);
++ dsi_do_cmd_set_update_mode(dssdev, p.u.update_mode);
+ break;
+
+ case DSI_CMD_SET_ROTATE:
+ dsi_bus_lock();
+- display->ctrl->set_rotate(display, p.u.rotate);
++ dssdev->driver->set_rotate(dssdev, p.u.rotate);
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
+ dsi.autoupdate_setup = 1;
+ dsi_bus_unlock();
+@@ -3206,7 +3105,7 @@ static void dsi_process_cmd_fifo(struct work_struct *work)
+
+ case DSI_CMD_SET_MIRROR:
+ dsi_bus_lock();
+- display->ctrl->set_mirror(display, p.u.mirror);
++ dssdev->driver->set_mirror(dssdev, p.u.mirror);
+ dsi_bus_unlock();
+ break;
+
+@@ -3263,12 +3162,12 @@ static void dsi_push_cmd(struct dsi_cmd_item *p)
+ queue_work(dsi.workqueue, &dsi.process_work);
+ }
+
+-static void dsi_push_update(struct omap_display *display,
++static void dsi_push_update(struct omap_dss_device *dssdev,
+ int x, int y, int w, int h)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_UPDATE;
+
+ p.u.r.x = x;
+@@ -3281,22 +3180,22 @@ static void dsi_push_update(struct omap_display *display,
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_autoupdate(struct omap_display *display)
++static void dsi_push_autoupdate(struct omap_dss_device *dssdev)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_AUTOUPDATE;
+
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_sync(struct omap_display *display,
++static void dsi_push_sync(struct omap_dss_device *dssdev,
+ struct completion *sync_comp)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_SYNC;
+ p.u.sync = sync_comp;
+
+@@ -3305,12 +3204,12 @@ static void dsi_push_sync(struct omap_display *display,
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_mem_read(struct omap_display *display,
++static void dsi_push_mem_read(struct omap_dss_device *dssdev,
+ struct dsi_cmd_mem_read *mem_read)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_MEM_READ;
+ p.u.mem_read = *mem_read;
+
+@@ -3319,12 +3218,12 @@ static void dsi_push_mem_read(struct omap_display *display,
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_test(struct omap_display *display, int test_num,
++static void dsi_push_test(struct omap_dss_device *dssdev, int test_num,
+ int *result, struct completion *completion)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_TEST;
+ p.u.test.test_num = test_num;
+ p.u.test.result = result;
+@@ -3335,11 +3234,11 @@ static void dsi_push_test(struct omap_display *display, int test_num,
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_set_te(struct omap_display *display, bool enable)
++static void dsi_push_set_te(struct omap_dss_device *dssdev, bool enable)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_SET_TE;
+ p.u.te = enable;
+
+@@ -3348,12 +3247,12 @@ static void dsi_push_set_te(struct omap_display *display, bool enable)
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_set_update_mode(struct omap_display *display,
++static void dsi_push_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_SET_UPDATE_MODE;
+ p.u.update_mode = mode;
+
+@@ -3362,11 +3261,11 @@ static void dsi_push_set_update_mode(struct omap_display *display,
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_set_rotate(struct omap_display *display, int rotate)
++static void dsi_push_set_rotate(struct omap_dss_device *dssdev, int rotate)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_SET_ROTATE;
+ p.u.rotate = rotate;
+
+@@ -3375,11 +3274,11 @@ static void dsi_push_set_rotate(struct omap_display *display, int rotate)
+ dsi_push_cmd(&p);
+ }
+
+-static void dsi_push_set_mirror(struct omap_display *display, int mirror)
++static void dsi_push_set_mirror(struct omap_dss_device *dssdev, int mirror)
+ {
+ struct dsi_cmd_item p;
+
+- p.display = display;
++ p.dssdev = dssdev;
+ p.cmd = DSI_CMD_SET_MIRROR;
+ p.u.mirror = mirror;
+
+@@ -3388,7 +3287,7 @@ static void dsi_push_set_mirror(struct omap_display *display, int mirror)
+ dsi_push_cmd(&p);
+ }
+
+-static int dsi_wait_sync(struct omap_display *display)
++static int dsi_wait_sync(struct omap_dss_device *dssdev)
+ {
+ long wait = msecs_to_jiffies(2000);
+ struct completion compl;
+@@ -3396,7 +3295,7 @@ static int dsi_wait_sync(struct omap_display *display)
+ DSSDBGF("");
+
+ init_completion(&compl);
+- dsi_push_sync(display, &compl);
++ dsi_push_sync(dssdev, &compl);
+
+ DSSDBG("Waiting for SYNC to happen...\n");
+ wait = wait_for_completion_timeout(&compl, wait);
+@@ -3423,7 +3322,7 @@ static int dsi_wait_sync(struct omap_display *display)
+
+ /* Display funcs */
+
+-static int dsi_display_init_dispc(struct omap_display *display)
++static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
+ {
+ int r;
+
+@@ -3439,7 +3338,7 @@ static int dsi_display_init_dispc(struct omap_display *display)
+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_DSI);
+ dispc_enable_fifohandcheck(1);
+
+- dispc_set_tft_data_lines(display->ctrl->pixel_size);
++ dispc_set_tft_data_lines(dssdev->ctrl.pixel_size);
+
+ {
+ struct omap_video_timings timings = {
+@@ -3457,13 +3356,13 @@ static int dsi_display_init_dispc(struct omap_display *display)
+ return 0;
+ }
+
+-static void dsi_display_uninit_dispc(struct omap_display *display)
++static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev)
+ {
+ omap_dispc_unregister_isr(framedone_callback, NULL,
+ DISPC_IRQ_FRAMEDONE);
+ }
+
+-static int dsi_display_init_dsi(struct omap_display *display)
++static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
+ {
+ struct dsi_clock_info cinfo;
+ int r;
+@@ -3476,7 +3375,7 @@ static int dsi_display_init_dsi(struct omap_display *display)
+ if (r)
+ goto err0;
+
+- r = dsi_pll_calc_ddrfreq(display->hw_config.u.dsi.ddr_clk_hz, &cinfo);
++ r = dsi_pll_calc_ddrfreq(dssdev->phy.dsi.ddr_clk_hz, &cinfo);
+ if (r)
+ goto err1;
+
+@@ -3486,19 +3385,19 @@ static int dsi_display_init_dsi(struct omap_display *display)
+
+ DSSDBG("PLL OK\n");
+
+- r = dsi_complexio_init(display);
++ r = dsi_complexio_init(dssdev);
+ if (r)
+ goto err1;
+
+ _dsi_print_reset_status();
+
+- dsi_proto_timings(display);
+- dsi_set_lp_clk_divisor(display);
++ dsi_proto_timings(dssdev);
++ dsi_set_lp_clk_divisor(dssdev);
+
+ if (1)
+ _dsi_print_reset_status();
+
+- r = dsi_proto_config(display);
++ r = dsi_proto_config(dssdev);
+ if (r)
+ goto err2;
+
+@@ -3508,27 +3407,18 @@ static int dsi_display_init_dsi(struct omap_display *display)
+ dsi_if_enable(1);
+ dsi_force_tx_stop_mode_io();
+
+- if (display->ctrl && display->ctrl->enable) {
+- r = display->ctrl->enable(display);
++ if (dssdev->driver->enable) {
++ r = dssdev->driver->enable(dssdev);
+ if (r)
+ goto err3;
+ }
+
+- if (display->panel && display->panel->enable) {
+- r = display->panel->enable(display);
+- if (r)
+- goto err4;
+- }
+-
+ /* enable high-speed after initial config */
+ dsi_vc_enable_hs(0, 1);
+
+ dsi_bus_unlock();
+
+ return 0;
+-err4:
+- if (display->ctrl && display->ctrl->disable)
+- display->ctrl->disable(display);
+ err3:
+ dsi_if_enable(0);
+ err2:
+@@ -3540,13 +3430,11 @@ err0:
+ return r;
+ }
+
+-static void dsi_display_uninit_dsi(struct omap_display *display)
++static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev)
+ {
+ dsi_bus_lock();
+- if (display->panel && display->panel->disable)
+- display->panel->disable(display);
+- if (display->ctrl && display->ctrl->disable)
+- display->ctrl->disable(display);
++ if (dssdev->driver->disable)
++ dssdev->driver->disable(dssdev);
+ dsi_bus_unlock();
+
+ dsi_complexio_uninit();
+@@ -3569,7 +3457,7 @@ static int dsi_core_init(void)
+ return 0;
+ }
+
+-static int dsi_display_enable(struct omap_display *display)
++static int dsi_display_enable(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+@@ -3577,101 +3465,177 @@ static int dsi_display_enable(struct omap_display *display)
+
+ mutex_lock(&dsi.lock);
+
+- if (display->state != OMAP_DSS_DISPLAY_DISABLED) {
+- DSSERR("display already enabled\n");
+- r = -EINVAL;
++ r = omap_dss_start_device(dssdev);
++ if (r) {
++ DSSERR("failed to start device\n");
+ goto err0;
+ }
+
++ if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
++ DSSERR("dssdev already enabled\n");
++ r = -EINVAL;
++ goto err1;
++ }
++
+ enable_clocks(1);
+ dsi_enable_pll_clock(1);
+
+ r = _dsi_reset();
+ if (r)
+- return r;
++ goto err2;
+
+ dsi_core_init();
+
+- r = dsi_display_init_dispc(display);
++ r = dsi_display_init_dispc(dssdev);
+ if (r)
+- goto err1;
++ goto err2;
+
+- r = dsi_display_init_dsi(display);
++ r = dsi_display_init_dsi(dssdev);
+ if (r)
+- goto err2;
++ goto err3;
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ if (dsi.use_te || dsi.use_ext_te)
+- dsi_push_set_te(display, 1);
++ dsi_push_set_te(dssdev, 1);
+
+- dsi_push_set_update_mode(display, dsi.user_update_mode);
++ dsi_push_set_update_mode(dssdev, dsi.user_update_mode);
+ dsi.target_update_mode = dsi.user_update_mode;
+
+ mutex_unlock(&dsi.lock);
+
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+
++err3:
++ dsi_display_uninit_dispc(dssdev);
+ err2:
+- dsi_display_uninit_dispc(display);
+-err1:
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
++err1:
++ omap_dss_stop_device(dssdev);
+ err0:
+ mutex_unlock(&dsi.lock);
+ DSSDBG("dsi_display_enable FAILED\n");
+ return r;
+ }
+
+-static void dsi_display_disable(struct omap_display *display)
++static void dsi_display_disable(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("dsi_display_disable\n");
+
+ mutex_lock(&dsi.lock);
+
+- if (display->state == OMAP_DSS_DISPLAY_DISABLED ||
+- display->state == OMAP_DSS_DISPLAY_SUSPENDED)
++ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED ||
++ dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
+ goto end;
+
+ if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) {
+- dsi_push_set_update_mode(display, OMAP_DSS_UPDATE_DISABLED);
++ dsi_push_set_update_mode(dssdev, OMAP_DSS_UPDATE_DISABLED);
+ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
+ }
+
+- dsi_wait_sync(display);
++ dsi_wait_sync(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
++ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
+- dsi_display_uninit_dispc(display);
++ dsi_display_uninit_dispc(dssdev);
+
+- dsi_display_uninit_dsi(display);
++ dsi_display_uninit_dsi(dssdev);
+
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
++
++ omap_dss_stop_device(dssdev);
+ end:
+ mutex_unlock(&dsi.lock);
+ }
+
+-static int dsi_display_suspend(struct omap_display *display)
++static int dsi_display_suspend(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("dsi_display_suspend\n");
+
+- dsi_display_disable(display);
++ mutex_lock(&dsi.lock);
++
++ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED ||
++ dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
++ goto end;
+
+- display->state = OMAP_DSS_DISPLAY_SUSPENDED;
++ if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) {
++ dsi_push_set_update_mode(dssdev, OMAP_DSS_UPDATE_DISABLED);
++ dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
++ }
++
++ dsi_wait_sync(dssdev);
++
++ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
++
++ dsi_display_uninit_dispc(dssdev);
++
++ dsi_display_uninit_dsi(dssdev);
++
++ enable_clocks(0);
++ dsi_enable_pll_clock(0);
++end:
++ mutex_unlock(&dsi.lock);
+
+ return 0;
+ }
+
+-static int dsi_display_resume(struct omap_display *display)
++static int dsi_display_resume(struct omap_dss_device *dssdev)
+ {
++ int r;
++
+ DSSDBG("dsi_display_resume\n");
+
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
+- return dsi_display_enable(display);
++ mutex_lock(&dsi.lock);
++
++ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) {
++ DSSERR("dssdev not suspended\n");
++ r = -EINVAL;
++ goto err0;
++ }
++
++ enable_clocks(1);
++ dsi_enable_pll_clock(1);
++
++ r = _dsi_reset();
++ if (r)
++ goto err1;
++
++ dsi_core_init();
++
++ r = dsi_display_init_dispc(dssdev);
++ if (r)
++ goto err1;
++
++ r = dsi_display_init_dsi(dssdev);
++ if (r)
++ goto err2;
++
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
++
++ if (dsi.use_te || dsi.use_ext_te)
++ dsi_push_set_te(dssdev, 1);
++
++ dsi_push_set_update_mode(dssdev, dsi.user_update_mode);
++ dsi.target_update_mode = dsi.user_update_mode;
++
++ mutex_unlock(&dsi.lock);
++
++ return dsi_wait_sync(dssdev);
++
++err2:
++ dsi_display_uninit_dispc(dssdev);
++err1:
++ enable_clocks(0);
++ dsi_enable_pll_clock(0);
++err0:
++ mutex_unlock(&dsi.lock);
++ DSSDBG("dsi_display_resume FAILED\n");
++ return r;
+ }
+
+-static int dsi_display_update(struct omap_display *display,
++static int dsi_display_update(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+ DSSDBG("dsi_display_update(%d,%d %dx%d)\n", x, y, w, h);
+@@ -3682,7 +3646,7 @@ static int dsi_display_update(struct omap_display *display,
+ mutex_lock(&dsi.lock);
+
+ if (dsi.target_update_mode == OMAP_DSS_UPDATE_MANUAL)
+- dsi_push_update(display, x, y, w, h);
++ dsi_push_update(dssdev, x, y, w, h);
+ /* XXX else return error? */
+
+ mutex_unlock(&dsi.lock);
+@@ -3690,13 +3654,13 @@ static int dsi_display_update(struct omap_display *display,
+ return 0;
+ }
+
+-static int dsi_display_sync(struct omap_display *display)
++static int dsi_display_sync(struct omap_dss_device *dssdev)
+ {
+ DSSDBGF("");
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+ }
+
+-static int dsi_display_set_update_mode(struct omap_display *display,
++static int dsi_display_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+ {
+ DSSDBGF("%d", mode);
+@@ -3704,7 +3668,7 @@ static int dsi_display_set_update_mode(struct omap_display *display,
+ mutex_lock(&dsi.lock);
+
+ if (dsi.target_update_mode != mode) {
+- dsi_push_set_update_mode(display, mode);
++ dsi_push_set_update_mode(dssdev, mode);
+
+ dsi.target_update_mode = mode;
+ dsi.user_update_mode = mode;
+@@ -3712,88 +3676,88 @@ static int dsi_display_set_update_mode(struct omap_display *display,
+
+ mutex_unlock(&dsi.lock);
+
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+ }
+
+ static enum omap_dss_update_mode dsi_display_get_update_mode(
+- struct omap_display *display)
++ struct omap_dss_device *dssdev)
+ {
+ return dsi.update_mode;
+ }
+
+-static int dsi_display_enable_te(struct omap_display *display, bool enable)
++static int dsi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ {
+ DSSDBGF("%d", enable);
+
+- if (!display->ctrl->enable_te)
++ if (!dssdev->driver->enable_te)
+ return -ENOENT;
+
+- dsi_push_set_te(display, enable);
++ dsi_push_set_te(dssdev, enable);
+
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+ }
+
+-static int dsi_display_get_te(struct omap_display *display)
++static int dsi_display_get_te(struct omap_dss_device *dssdev)
+ {
+ return dsi.use_te | dsi.use_ext_te;
+ }
+
+
+
+-static int dsi_display_set_rotate(struct omap_display *display, u8 rotate)
++static int dsi_display_set_rotate(struct omap_dss_device *dssdev, u8 rotate)
+ {
+ DSSDBGF("%d", rotate);
+
+- if (!display->ctrl->set_rotate || !display->ctrl->get_rotate)
++ if (!dssdev->driver->set_rotate || !dssdev->driver->get_rotate)
+ return -EINVAL;
+
+- dsi_push_set_rotate(display, rotate);
++ dsi_push_set_rotate(dssdev, rotate);
+
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+ }
+
+-static u8 dsi_display_get_rotate(struct omap_display *display)
++static u8 dsi_display_get_rotate(struct omap_dss_device *dssdev)
+ {
+- if (!display->ctrl->set_rotate || !display->ctrl->get_rotate)
++ if (!dssdev->driver->set_rotate || !dssdev->driver->get_rotate)
+ return 0;
+
+- return display->ctrl->get_rotate(display);
++ return dssdev->driver->get_rotate(dssdev);
+ }
+
+-static int dsi_display_set_mirror(struct omap_display *display, bool mirror)
++static int dsi_display_set_mirror(struct omap_dss_device *dssdev, bool mirror)
+ {
+ DSSDBGF("%d", mirror);
+
+- if (!display->ctrl->set_mirror || !display->ctrl->get_mirror)
++ if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror)
+ return -EINVAL;
+
+- dsi_push_set_mirror(display, mirror);
++ dsi_push_set_mirror(dssdev, mirror);
+
+- return dsi_wait_sync(display);
++ return dsi_wait_sync(dssdev);
+ }
+
+-static bool dsi_display_get_mirror(struct omap_display *display)
++static bool dsi_display_get_mirror(struct omap_dss_device *dssdev)
+ {
+- if (!display->ctrl->set_mirror || !display->ctrl->get_mirror)
++ if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror)
+ return 0;
+
+- return display->ctrl->get_mirror(display);
++ return dssdev->driver->get_mirror(dssdev);
+ }
+
+-static int dsi_display_run_test(struct omap_display *display, int test_num)
++static int dsi_display_run_test(struct omap_dss_device *dssdev, int test_num)
+ {
+ long wait = msecs_to_jiffies(60000);
+ struct completion compl;
+ int result;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EIO;
+
+ DSSDBGF("%d", test_num);
+
+ init_completion(&compl);
+
+- dsi_push_test(display, test_num, &result, &compl);
++ dsi_push_test(dssdev, test_num, &result, &compl);
+
+ DSSDBG("Waiting for SYNC to happen...\n");
+ wait = wait_for_completion_timeout(&compl, wait);
+@@ -3807,7 +3771,7 @@ static int dsi_display_run_test(struct omap_display *display, int test_num)
+ return result;
+ }
+
+-static int dsi_display_memory_read(struct omap_display *display,
++static int dsi_display_memory_read(struct omap_dss_device *dssdev,
+ void *buf, size_t size,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+@@ -3818,10 +3782,10 @@ static int dsi_display_memory_read(struct omap_display *display,
+
+ DSSDBGF("");
+
+- if (!display->ctrl->memory_read)
++ if (!dssdev->driver->memory_read)
+ return -EINVAL;
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EIO;
+
+ init_completion(&compl);
+@@ -3835,7 +3799,7 @@ static int dsi_display_memory_read(struct omap_display *display,
+ mem_read.ret_size = &ret_size;
+ mem_read.completion = &compl;
+
+- dsi_push_mem_read(display, &mem_read);
++ dsi_push_mem_read(dssdev, &mem_read);
+
+ DSSDBG("Waiting for SYNC to happen...\n");
+ wait = wait_for_completion_timeout(&compl, wait);
+@@ -3865,39 +3829,39 @@ static void dsi_configure_overlay(struct omap_overlay *ovl)
+ dispc_setup_plane_fifo(plane, low, high);
+ }
+
+-void dsi_init_display(struct omap_display *display)
++void dsi_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("DSI init\n");
+
+- display->enable = dsi_display_enable;
+- display->disable = dsi_display_disable;
+- display->suspend = dsi_display_suspend;
+- display->resume = dsi_display_resume;
+- display->update = dsi_display_update;
+- display->sync = dsi_display_sync;
+- display->set_update_mode = dsi_display_set_update_mode;
+- display->get_update_mode = dsi_display_get_update_mode;
+- display->enable_te = dsi_display_enable_te;
+- display->get_te = dsi_display_get_te;
++ dssdev->enable = dsi_display_enable;
++ dssdev->disable = dsi_display_disable;
++ dssdev->suspend = dsi_display_suspend;
++ dssdev->resume = dsi_display_resume;
++ dssdev->update = dsi_display_update;
++ dssdev->sync = dsi_display_sync;
++ dssdev->set_update_mode = dsi_display_set_update_mode;
++ dssdev->get_update_mode = dsi_display_get_update_mode;
++ dssdev->enable_te = dsi_display_enable_te;
++ dssdev->get_te = dsi_display_get_te;
+
+- display->get_rotate = dsi_display_get_rotate;
+- display->set_rotate = dsi_display_set_rotate;
++ dssdev->get_rotate = dsi_display_get_rotate;
++ dssdev->set_rotate = dsi_display_set_rotate;
+
+- display->get_mirror = dsi_display_get_mirror;
+- display->set_mirror = dsi_display_set_mirror;
++ dssdev->get_mirror = dsi_display_get_mirror;
++ dssdev->set_mirror = dsi_display_set_mirror;
+
+- display->run_test = dsi_display_run_test;
+- display->memory_read = dsi_display_memory_read;
++ dssdev->run_test = dsi_display_run_test;
++ dssdev->memory_read = dsi_display_memory_read;
+
+- display->configure_overlay = dsi_configure_overlay;
++ dssdev->configure_overlay = dsi_configure_overlay;
+
+- display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
++ dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
+
+- dsi.vc[0].display = display;
+- dsi.vc[1].display = display;
++ dsi.vc[0].dssdev = dssdev;
++ dsi.vc[1].dssdev = dssdev;
+ }
+
+-int dsi_init(void)
++int dsi_init(struct platform_device *pdev)
+ {
+ u32 rev;
+
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index d51ffe4..6180968 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -163,17 +163,22 @@ void dss_clk_disable(enum dss_clock clks);
+ unsigned long dss_clk_get_rate(enum dss_clock clk);
+ int dss_need_ctx_restore(void);
+ void dss_dump_clocks(struct seq_file *s);
+-
++struct bus_type *dss_get_bus(void);
+ int dss_dsi_power_up(void);
+ void dss_dsi_power_down(void);
+
++#define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
++#define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
++
+ /* display */
+-void dss_init_displays(struct platform_device *pdev);
+-void dss_uninit_displays(struct platform_device *pdev);
+-int dss_suspend_all_displays(void);
+-int dss_resume_all_displays(void);
+-struct omap_display *dss_get_display(int no);
+-bool dss_use_replication(struct omap_display *display,
++int dss_suspend_all_devices(void);
++int dss_resume_all_devices(void);
++
++void dss_init_device(struct platform_device *pdev,
++ struct omap_dss_device *dssdev);
++void dss_uninit_device(struct platform_device *pdev,
++ struct omap_dss_device *dssdev);
++bool dss_use_replication(struct omap_dss_device *dssdev,
+ enum omap_color_mode mode);
+
+ /* manager */
+@@ -181,10 +186,11 @@ int dss_init_overlay_managers(struct platform_device *pdev);
+ void dss_uninit_overlay_managers(struct platform_device *pdev);
+
+ /* overlay */
+-void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name);
++void dss_init_overlays(struct platform_device *pdev);
+ void dss_uninit_overlays(struct platform_device *pdev);
+-int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display);
++int dss_check_overlay(struct omap_overlay *ovl, struct omap_dss_device *dssdev);
+ void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr);
++void dss_recheck_connections(struct omap_dss_device *dssdev, bool force);
+
+ /* DSS */
+ int dss_init(bool skip_init);
+@@ -208,10 +214,10 @@ void dss_set_dac_pwrdn_bgz(bool enable);
+ /* SDI */
+ int sdi_init(bool skip_init);
+ void sdi_exit(void);
+-void sdi_init_display(struct omap_display *display);
++void sdi_init_display(struct omap_dss_device *display);
+
+ /* DSI */
+-int dsi_init(void);
++int dsi_init(struct platform_device *pdev);
+ void dsi_exit(void);
+
+ void dsi_dump_clocks(struct seq_file *s);
+@@ -220,7 +226,7 @@ void dsi_dump_regs(struct seq_file *s);
+ void dsi_save_context(void);
+ void dsi_restore_context(void);
+
+-void dsi_init_display(struct omap_display *display);
++void dsi_init_display(struct omap_dss_device *display);
+ void dsi_irq_handler(void);
+ unsigned long dsi_get_dsi1_pll_rate(void);
+ unsigned long dsi_get_dsi2_pll_rate(void);
+@@ -233,7 +239,7 @@ void dsi_pll_uninit(void);
+ /* DPI */
+ int dpi_init(void);
+ void dpi_exit(void);
+-void dpi_init_display(struct omap_display *display);
++void dpi_init_display(struct omap_dss_device *dssdev);
+
+ /* DISPC */
+ int dispc_init(void);
+@@ -306,7 +312,7 @@ void dispc_set_lcd_timings(struct omap_video_timings *timings);
+ unsigned long dispc_fclk_rate(void);
+ unsigned long dispc_lclk_rate(void);
+ unsigned long dispc_pclk_rate(void);
+-void dispc_set_pol_freq(struct omap_panel *panel);
++void dispc_set_pol_freq(enum omap_panel_config config, u8 acbi, u8 acb);
+ void find_lck_pck_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
+ u16 *lck_div, u16 *pck_div);
+ int dispc_calc_clock_div(bool is_tft, unsigned long req_pck,
+@@ -315,16 +321,16 @@ int dispc_set_clock_div(struct dispc_clock_info *cinfo);
+ int dispc_get_clock_div(struct dispc_clock_info *cinfo);
+ void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div);
+
+-void dispc_setup_partial_planes(struct omap_display *display,
++void dispc_setup_partial_planes(struct omap_dss_device *dssdev,
+ u16 *x, u16 *y, u16 *w, u16 *h);
+-void dispc_draw_partial_planes(struct omap_display *display);
++void dispc_draw_partial_planes(struct omap_dss_device *dssdev);
+
+
+ /* VENC */
+-int venc_init(void);
++int venc_init(struct platform_device *pdev);
+ void venc_exit(void);
+ void venc_dump_regs(struct seq_file *s);
+-void venc_init_display(struct omap_display *display);
++void venc_init_display(struct omap_dss_device *display);
+
+ /* RFBI */
+ int rfbi_init(void);
+@@ -337,6 +343,6 @@ void rfbi_transfer_area(u16 width, u16 height,
+ void (callback)(void *data), void *data);
+ void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t);
+ unsigned long rfbi_get_max_tx_rate(void);
+-void rfbi_init_display(struct omap_display *display);
++void rfbi_init_display(struct omap_dss_device *display);
+
+ #endif
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 8d5d00f..c68b9af 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -41,58 +41,68 @@ static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf)
+ static ssize_t manager_display_show(struct omap_overlay_manager *mgr, char *buf)
+ {
+ return snprintf(buf, PAGE_SIZE, "%s\n",
+- mgr->display ? mgr->display->name : "<none>");
++ mgr->device ? mgr->device->name : "<none>");
+ }
+
+ static ssize_t manager_display_store(struct omap_overlay_manager *mgr, const char *buf, size_t size)
+ {
+- int r, i;
+- int len = size;
+- struct omap_display *display = NULL;
++ int r = 0;
++ size_t len = size;
++ struct omap_dss_device *dssdev = NULL;
++
++ int match(struct omap_dss_device *dssdev, void *data)
++ {
++ const char *str = data;
++ return strcmp(dssdev->name, str) == 0;
++ }
+
+ if (buf[size-1] == '\n')
+ --len;
+
+ if (len > 0) {
+- for (i = 0; i < omap_dss_get_num_displays(); ++i) {
+- display = dss_get_display(i);
++ char name[64];
++ int n;
+
+- if (strncmp(buf, display->name, len) == 0)
+- break;
++ n = min(len, sizeof(name) - 1);
++ strncpy(name, buf, n);
++ name[n - 1] = 0;
+
+- display = NULL;
+- }
++ dssdev = omap_dss_find_device(name, match);
+ }
+
+- if (len > 0 && display == NULL)
++ if (len > 0 && dssdev == NULL)
+ return -EINVAL;
+
+- if (display)
+- DSSDBG("display %s found\n", display->name);
++ if (dssdev)
++ DSSDBG("display %s found\n", dssdev->name);
+
+- if (mgr->display) {
+- r = mgr->unset_display(mgr);
++ if (mgr->device) {
++ r = mgr->unset_device(mgr);
+ if (r) {
+ DSSERR("failed to unset display\n");
+- return r;
++ goto put_device;
+ }
+ }
+
+- if (display) {
+- r = mgr->set_display(mgr, display);
++ if (dssdev) {
++ r = mgr->set_device(mgr, dssdev);
+ if (r) {
+ DSSERR("failed to set manager\n");
+- return r;
++ goto put_device;
+ }
+
+ r = mgr->apply(mgr);
+ if (r) {
+ DSSERR("failed to apply dispc config\n");
+- return r;
++ goto put_device;
+ }
+ }
+
+- return size;
++put_device:
++ if (dssdev)
++ omap_dss_put_device(dssdev);
++
++ return r ? r : size;
+ }
+
+ static ssize_t manager_default_color_show(struct omap_overlay_manager *mgr,
+@@ -334,21 +344,21 @@ static struct kobj_type manager_ktype = {
+ .default_attrs = manager_sysfs_attrs,
+ };
+
+-static int omap_dss_set_display(struct omap_overlay_manager *mgr,
+- struct omap_display *display)
++static int omap_dss_set_device(struct omap_overlay_manager *mgr,
++ struct omap_dss_device *dssdev)
+ {
+ int i;
+ int r;
+
+- if (display->manager) {
++ if (dssdev->manager) {
+ DSSERR("display '%s' already has a manager '%s'\n",
+- display->name, display->manager->name);
++ dssdev->name, dssdev->manager->name);
+ return -EINVAL;
+ }
+
+- if ((mgr->supported_displays & display->type) == 0) {
++ if ((mgr->supported_displays & dssdev->type) == 0) {
+ DSSERR("display '%s' does not support manager '%s'\n",
+- display->name, mgr->name);
++ dssdev->name, mgr->name);
+ return -EINVAL;
+ }
+
+@@ -358,26 +368,26 @@ static int omap_dss_set_display(struct omap_overlay_manager *mgr,
+ if (ovl->manager != mgr || !ovl->info.enabled)
+ continue;
+
+- r = dss_check_overlay(ovl, display);
++ r = dss_check_overlay(ovl, dssdev);
+ if (r)
+ return r;
+ }
+
+- display->manager = mgr;
+- mgr->display = display;
++ dssdev->manager = mgr;
++ mgr->device = dssdev;
+
+ return 0;
+ }
+
+-static int omap_dss_unset_display(struct omap_overlay_manager *mgr)
++static int omap_dss_unset_device(struct omap_overlay_manager *mgr)
+ {
+- if (!mgr->display) {
++ if (!mgr->device) {
+ DSSERR("failed to unset display, display not set.\n");
+ return -EINVAL;
+ }
+
+- mgr->display->manager = NULL;
+- mgr->display = NULL;
++ mgr->device->manager = NULL;
++ mgr->device = NULL;
+
+ return 0;
+ }
+@@ -385,7 +395,7 @@ static int omap_dss_unset_display(struct omap_overlay_manager *mgr)
+
+ static int overlay_enabled(struct omap_overlay *ovl)
+ {
+- return ovl->info.enabled && ovl->manager && ovl->manager->display;
++ return ovl->info.enabled && ovl->manager && ovl->manager->device;
+ }
+
+ /* We apply settings to both managers here so that we can use optimizations
+@@ -396,7 +406,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ int i;
+ int ret = 0;
+ enum omap_dss_update_mode mode;
+- struct omap_display *display;
++ struct omap_dss_device *dssdev;
+ struct omap_overlay *ovl;
+ bool ilace = 0;
+ int outw, outh;
+@@ -419,9 +429,9 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ continue;
+ }
+
+- display = ovl->manager->display;
++ dssdev = ovl->manager->device;
+
+- if (dss_check_overlay(ovl, display)) {
++ if (dss_check_overlay(ovl, dssdev)) {
+ dispc_enable_plane(ovl->id, 0);
+ continue;
+ }
+@@ -431,14 +441,14 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ /* On a manual update display, in manual update mode, update()
+ * handles configuring planes */
+ mode = OMAP_DSS_UPDATE_AUTO;
+- if (display->get_update_mode)
+- mode = display->get_update_mode(mgr->display);
++ if (dssdev->get_update_mode)
++ mode = dssdev->get_update_mode(dssdev);
+
+- if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
++ if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
+ mode != OMAP_DSS_UPDATE_AUTO)
+ continue;
+
+- if (display->type == OMAP_DISPLAY_TYPE_VENC)
++ if (dssdev->type == OMAP_DISPLAY_TYPE_VENC)
+ ilace = 1;
+
+ if (ovl->info.out_width == 0)
+@@ -474,7 +484,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ continue;
+ }
+
+- if (dss_use_replication(display, ovl->info.color_mode))
++ if (dss_use_replication(dssdev, ovl->info.color_mode))
+ dispc_enable_replication(ovl->id, true);
+ else
+ dispc_enable_replication(ovl->id, false);
+@@ -498,7 +508,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ continue;
+ }
+
+- ovl->manager->display->configure_overlay(ovl);
++ ovl->manager->device->configure_overlay(ovl);
+ }
+
+ /* Issue GO for managers */
+@@ -506,15 +516,15 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ if (!(mgr->caps & OMAP_DSS_OVL_MGR_CAP_DISPC))
+ continue;
+
+- display = mgr->display;
++ dssdev = mgr->device;
+
+- if (!display)
++ if (!dssdev)
+ continue;
+
+ /* We don't need GO with manual update display. LCD iface will
+ * always be turned off after frame, and new settings will
+ * be taken in to use at next update */
+- if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
++ if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
+ continue;
+
+ dispc_go(mgr->id);
+@@ -605,8 +615,8 @@ int dss_init_overlay_managers(struct platform_device *pdev)
+ break;
+ }
+
+- mgr->set_display = &omap_dss_set_display;
+- mgr->unset_display = &omap_dss_unset_display;
++ mgr->set_device = &omap_dss_set_device;
++ mgr->unset_device = &omap_dss_unset_device;
+ mgr->apply = &omap_dss_mgr_apply;
+ mgr->set_default_color = &omap_dss_mgr_set_def_color;
+ mgr->set_trans_key_type_and_value =
+diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
+index 035a57a..3704727 100644
+--- a/drivers/video/omap2/dss/overlay.c
++++ b/drivers/video/omap2/dss/overlay.c
+@@ -301,13 +301,13 @@ static struct kobj_type overlay_ktype = {
+ };
+
+ /* Check if overlay parameters are compatible with display */
+-int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display)
++int dss_check_overlay(struct omap_overlay *ovl, struct omap_dss_device *dssdev)
+ {
+ struct omap_overlay_info *info;
+ u16 outw, outh;
+ u16 dw, dh;
+
+- if (!display)
++ if (!dssdev)
+ return 0;
+
+ if (!ovl->info.enabled)
+@@ -320,7 +320,7 @@ int dss_check_overlay(struct omap_overlay *ovl, struct omap_display *display)
+ return -EINVAL;
+ }
+
+- display->get_resolution(display, &dw, &dh);
++ dssdev->get_resolution(dssdev, &dw, &dh);
+
+ DSSDBG("check_overlay %d: (%d,%d %dx%d -> %dx%d) disp (%dx%d)\n",
+ ovl->id,
+@@ -374,7 +374,7 @@ static int dss_ovl_set_overlay_info(struct omap_overlay *ovl,
+ ovl->info = *info;
+
+ if (ovl->manager) {
+- r = dss_check_overlay(ovl, ovl->manager->display);
++ r = dss_check_overlay(ovl, ovl->manager->device);
+ if (r) {
+ ovl->info = old_info;
+ return r;
+@@ -400,7 +400,7 @@ static int omap_dss_set_manager(struct omap_overlay *ovl,
+ ovl->name, ovl->manager->name);
+ }
+
+- r = dss_check_overlay(ovl, mgr->display);
++ r = dss_check_overlay(ovl, mgr->device);
+ if (r)
+ return r;
+
+@@ -455,12 +455,9 @@ void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr)
+ mgr->overlays = dispc_overlays;
+ }
+
+-void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name)
++void dss_init_overlays(struct platform_device *pdev)
+ {
+ int i, r;
+- struct omap_overlay_manager *lcd_mgr;
+- struct omap_overlay_manager *tv_mgr;
+- struct omap_overlay_manager *def_mgr = NULL;
+
+ INIT_LIST_HEAD(&overlay_list);
+
+@@ -515,71 +512,49 @@ void dss_init_overlays(struct platform_device *pdev, const char *def_disp_name)
+
+ dispc_overlays[i] = ovl;
+ }
++}
++
++/* connect overlays to the new device, if not already connected. if force
++ * selected, connect always. */
++void dss_recheck_connections(struct omap_dss_device *dssdev, bool force)
++{
++ int i;
++ struct omap_overlay_manager *lcd_mgr;
++ struct omap_overlay_manager *tv_mgr;
++ struct omap_overlay_manager *mgr = NULL;
+
+ lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD);
+ tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV);
+
+- if (def_disp_name) {
+- for (i = 0; i < omap_dss_get_num_displays() ; i++) {
+- struct omap_display *display = dss_get_display(i);
+-
+- if (strcmp(display->name, def_disp_name) == 0) {
+- if (display->type != OMAP_DISPLAY_TYPE_VENC) {
+- lcd_mgr->set_display(lcd_mgr, display);
+- def_mgr = lcd_mgr;
+- } else {
+- lcd_mgr->set_display(tv_mgr, display);
+- def_mgr = tv_mgr;
+- }
+-
+- break;
+- }
+- }
+-
+- if (!def_mgr)
+- DSSWARN("default display %s not found\n",
+- def_disp_name);
+- }
+-
+- if (def_mgr != lcd_mgr) {
+- /* connect lcd manager to first non-VENC display found */
+- for (i = 0; i < omap_dss_get_num_displays(); i++) {
+- struct omap_display *display = dss_get_display(i);
+- if (display->type != OMAP_DISPLAY_TYPE_VENC) {
+- lcd_mgr->set_display(lcd_mgr, display);
+-
+- if (!def_mgr)
+- def_mgr = lcd_mgr;
+-
+- break;
+- }
++ if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) {
++ if (!lcd_mgr->device || force) {
++ if (lcd_mgr->device)
++ lcd_mgr->unset_device(lcd_mgr);
++ lcd_mgr->set_device(lcd_mgr, dssdev);
++ mgr = lcd_mgr;
+ }
+ }
+
+- if (def_mgr != tv_mgr) {
+- /* connect tv manager to first VENC display found */
+- for (i = 0; i < omap_dss_get_num_displays(); i++) {
+- struct omap_display *display = dss_get_display(i);
+- if (display->type == OMAP_DISPLAY_TYPE_VENC) {
+- tv_mgr->set_display(tv_mgr, display);
+-
+- if (!def_mgr)
+- def_mgr = tv_mgr;
+-
+- break;
+- }
++ if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) {
++ if (!tv_mgr->device || force) {
++ if (tv_mgr->device)
++ tv_mgr->unset_device(tv_mgr);
++ tv_mgr->set_device(tv_mgr, dssdev);
++ mgr = tv_mgr;
+ }
+ }
+
+- /* connect all dispc overlays to def_mgr */
+- if (def_mgr) {
++ if (mgr) {
+ for (i = 0; i < 3; i++) {
+ struct omap_overlay *ovl;
+ ovl = omap_dss_get_overlay(i);
+- omap_dss_set_manager(ovl, def_mgr);
++ if (!ovl->manager || force) {
++ if (ovl->manager)
++ omap_dss_unset_manager(ovl);
++ omap_dss_set_manager(ovl, mgr);
++ }
+ }
+ }
+-
+ #ifdef L4_EXAMPLE
+ /* setup L4 overlay as an example */
+ {
+diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
+index 3e9ae1e..e3cf799 100644
+--- a/drivers/video/omap2/dss/rfbi.c
++++ b/drivers/video/omap2/dss/rfbi.c
+@@ -119,7 +119,7 @@ static struct {
+ void (*framedone_callback)(void *data);
+ void *framedone_callback_data;
+
+- struct omap_display *display[2];
++ struct omap_dss_device *dssdev[2];
+
+ struct kfifo *cmd_fifo;
+ spinlock_t cmd_lock;
+@@ -938,12 +938,12 @@ int rfbi_configure(int rfbi_module, int bpp, int lines)
+ }
+ EXPORT_SYMBOL(rfbi_configure);
+
+-static int rfbi_find_display(struct omap_display *disp)
++static int rfbi_find_display(struct omap_dss_device *dssdev)
+ {
+- if (disp == rfbi.display[0])
++ if (dssdev == rfbi.dssdev[0])
+ return 0;
+
+- if (disp == rfbi.display[1])
++ if (dssdev == rfbi.dssdev[1])
+ return 1;
+
+ BUG();
+@@ -961,7 +961,7 @@ static void signal_fifo_waiters(void)
+ }
+
+ /* returns 1 for async op, and 0 for sync op */
+-static int do_update(struct omap_display *display, struct update_region *upd)
++static int do_update(struct omap_dss_device *dssdev, struct update_region *upd)
+ {
+ u16 x = upd->x;
+ u16 y = upd->y;
+@@ -970,18 +970,18 @@ static int do_update(struct omap_display *display, struct update_region *upd)
+
+ perf_mark_setup();
+
+- if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+- /*display->ctrl->enable_te(display, 1); */
+- dispc_setup_partial_planes(display, &x, &y, &w, &h);
++ if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ /*dssdev->driver->enable_te(dssdev, 1); */
++ dispc_setup_partial_planes(dssdev, &x, &y, &w, &h);
+ }
+
+ #ifdef MEASURE_PERF
+ rfbi.perf_bytes = w * h * 2; /* XXX always 16bit */
+ #endif
+
+- display->ctrl->setup_update(display, x, y, w, h);
++ dssdev->driver->setup_update(dssdev, x, y, w, h);
+
+- if (display->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+ rfbi_transfer_area(w, h, NULL, NULL);
+ return 1;
+ } else {
+@@ -989,7 +989,7 @@ static int do_update(struct omap_display *display, struct update_region *upd)
+ void __iomem *addr;
+ int scr_width;
+
+- ovl = display->manager->overlays[0];
++ ovl = dssdev->manager->overlays[0];
+ scr_width = ovl->info.screen_width;
+ addr = ovl->info.vaddr;
+
+@@ -1005,7 +1005,7 @@ static void process_cmd_fifo(void)
+ {
+ int len;
+ struct update_param p;
+- struct omap_display *display;
++ struct omap_dss_device *dssdev;
+ unsigned long flags;
+
+ if (atomic_inc_return(&rfbi.cmd_pending) != 1)
+@@ -1030,10 +1030,10 @@ static void process_cmd_fifo(void)
+ BUG_ON(len != sizeof(struct update_param));
+ BUG_ON(p.rfbi_module > 1);
+
+- display = rfbi.display[p.rfbi_module];
++ dssdev = rfbi.dssdev[p.rfbi_module];
+
+ if (p.cmd == RFBI_CMD_UPDATE) {
+- if (do_update(display, &p.par.r))
++ if (do_update(dssdev, &p.par.r))
+ break; /* async op */
+ } else if (p.cmd == RFBI_CMD_SYNC) {
+ DSSDBG("Signaling SYNC done!\n");
+@@ -1203,7 +1203,7 @@ void rfbi_exit(void)
+ }
+
+ /* struct omap_display support */
+-static int rfbi_display_update(struct omap_display *display,
++static int rfbi_display_update(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+ int rfbi_module;
+@@ -1211,19 +1211,19 @@ static int rfbi_display_update(struct omap_display *display,
+ if (w == 0 || h == 0)
+ return 0;
+
+- rfbi_module = rfbi_find_display(display);
++ rfbi_module = rfbi_find_display(dssdev);
+
+ rfbi_push_update(rfbi_module, x, y, w, h);
+
+ return 0;
+ }
+
+-static int rfbi_display_sync(struct omap_display *display)
++static int rfbi_display_sync(struct omap_dss_device *dssdev)
+ {
+ struct completion sync_comp;
+ int rfbi_module;
+
+- rfbi_module = rfbi_find_display(display);
++ rfbi_module = rfbi_find_display(dssdev);
+
+ init_completion(&sync_comp);
+ rfbi_push_sync(rfbi_module, &sync_comp);
+@@ -1233,72 +1233,76 @@ static int rfbi_display_sync(struct omap_display *display)
+ return 0;
+ }
+
+-static int rfbi_display_enable_te(struct omap_display *display, bool enable)
++static int rfbi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ {
+- display->ctrl->enable_te(display, enable);
++ dssdev->driver->enable_te(dssdev, enable);
+ return 0;
+ }
+
+-static int rfbi_display_enable(struct omap_display *display)
++static int rfbi_display_enable(struct omap_dss_device *dssdev)
+ {
+ int r;
+
+- BUG_ON(display->panel == NULL || display->ctrl == NULL);
++ r = omap_dss_start_device(dssdev);
++ if (r) {
++ DSSERR("failed to start device\n");
++ goto err0;
++ }
+
+ r = omap_dispc_register_isr(framedone_callback, NULL,
+ DISPC_IRQ_FRAMEDONE);
+ if (r) {
+ DSSERR("can't get FRAMEDONE irq\n");
+- return r;
++ goto err1;
+ }
+
+ dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT);
+
+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_RFBI);
+
+- dispc_set_tft_data_lines(display->ctrl->pixel_size);
++ dispc_set_tft_data_lines(dssdev->ctrl.pixel_size);
+
+- rfbi_configure(display->hw_config.u.rfbi.channel,
+- display->ctrl->pixel_size,
+- display->hw_config.u.rfbi.data_lines);
++ rfbi_configure(dssdev->phy.rfbi.channel,
++ dssdev->ctrl.pixel_size,
++ dssdev->phy.rfbi.data_lines);
+
+- rfbi_set_timings(display->hw_config.u.rfbi.channel,
+- &display->ctrl->timings);
++ rfbi_set_timings(dssdev->phy.rfbi.channel,
++ &dssdev->ctrl.rfbi_timings);
+
+
+- if (display->ctrl && display->ctrl->enable) {
+- r = display->ctrl->enable(display);
++ if (dssdev->driver->enable) {
++ r = dssdev->driver->enable(dssdev);
+ if (r)
+- goto err;
+- }
+-
+- if (display->panel && display->panel->enable) {
+- r = display->panel->enable(display);
+- if (r)
+- goto err;
++ goto err2;
+ }
+
+ return 0;
+-err:
+- return -ENODEV;
++err2:
++ omap_dispc_unregister_isr(framedone_callback, NULL,
++ DISPC_IRQ_FRAMEDONE);
++err1:
++ omap_dss_stop_device(dssdev);
++err0:
++ return r;
+ }
+
+-static void rfbi_display_disable(struct omap_display *display)
++static void rfbi_display_disable(struct omap_dss_device *dssdev)
+ {
+- display->ctrl->disable(display);
++ dssdev->driver->disable(dssdev);
+ omap_dispc_unregister_isr(framedone_callback, NULL,
+ DISPC_IRQ_FRAMEDONE);
++ omap_dss_stop_device(dssdev);
+ }
+
+-void rfbi_init_display(struct omap_display *display)
++void rfbi_init_display(struct omap_dss_device *dssdev)
+ {
+- display->enable = rfbi_display_enable;
+- display->disable = rfbi_display_disable;
+- display->update = rfbi_display_update;
+- display->sync = rfbi_display_sync;
+- display->enable_te = rfbi_display_enable_te;
++ dssdev->enable = rfbi_display_enable;
++ dssdev->disable = rfbi_display_disable;
++ dssdev->update = rfbi_display_update;
++ dssdev->sync = rfbi_display_sync;
++ dssdev->enable_te = rfbi_display_enable_te;
+
+- rfbi.display[display->hw_config.u.rfbi.channel] = display;
++ rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;
+
+- display->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
++ dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
+ }
+diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
+index fbff2b2..393fcd5 100644
+--- a/drivers/video/omap2/dss/sdi.c
++++ b/drivers/video/omap2/dss/sdi.c
+@@ -43,18 +43,25 @@ static void sdi_basic_init(void)
+ dispc_lcd_enable_signal_polarity(1);
+ }
+
+-static int sdi_display_enable(struct omap_display *display)
++static int sdi_display_enable(struct omap_dss_device *dssdev)
+ {
++ struct omap_video_timings *t = &dssdev->panel.timings;
+ struct dispc_clock_info cinfo;
+ u16 lck_div, pck_div;
+ unsigned long fck;
+- struct omap_panel *panel = display->panel;
+ unsigned long pck;
+ int r;
+
+- if (display->state != OMAP_DSS_DISPLAY_DISABLED) {
+- DSSERR("display already enabled\n");
+- return -EINVAL;
++ r = omap_dss_start_device(dssdev);
++ if (r) {
++ DSSERR("failed to start device\n");
++ goto err0;
++ }
++
++ if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
++ DSSERR("dssdev already enabled\n");
++ r = -EINVAL;
++ goto err1;
+ }
+
+ /* In case of skip_init sdi_init has already enabled the clocks */
+@@ -64,18 +71,19 @@ static int sdi_display_enable(struct omap_display *display)
+ sdi_basic_init();
+
+ /* 15.5.9.1.2 */
+- panel->config |= OMAP_DSS_LCD_RF | OMAP_DSS_LCD_ONOFF;
++ dssdev->panel.config |= OMAP_DSS_LCD_RF | OMAP_DSS_LCD_ONOFF;
+
+- dispc_set_pol_freq(panel);
++ dispc_set_pol_freq(dssdev->panel.config, dssdev->panel.acbi,
++ dssdev->panel.acb);
+
+ if (!sdi.skip_init)
+- r = dispc_calc_clock_div(1, panel->timings.pixel_clock * 1000,
++ r = dispc_calc_clock_div(1, t->pixel_clock * 1000,
+ &cinfo);
+ else
+ r = dispc_get_clock_div(&cinfo);
+
+ if (r)
+- goto err0;
++ goto err2;
+
+ fck = cinfo.fck;
+ lck_div = cinfo.lck_div;
+@@ -83,57 +91,62 @@ static int sdi_display_enable(struct omap_display *display)
+
+ pck = fck / lck_div / pck_div / 1000;
+
+- if (pck != panel->timings.pixel_clock) {
++ if (pck != t->pixel_clock) {
+ DSSWARN("Could not find exact pixel clock. Requested %d kHz, "
+ "got %lu kHz\n",
+- panel->timings.pixel_clock, pck);
++ t->pixel_clock, pck);
+
+- panel->timings.pixel_clock = pck;
++ t->pixel_clock = pck;
+ }
+
+
+- dispc_set_lcd_timings(&panel->timings);
++ dispc_set_lcd_timings(t);
+
+ r = dispc_set_clock_div(&cinfo);
+ if (r)
+- goto err1;
++ goto err2;
+
+ if (!sdi.skip_init) {
+- dss_sdi_init(display->hw_config.u.sdi.datapairs);
++ dss_sdi_init(dssdev->phy.sdi.datapairs);
+ dss_sdi_enable();
+ mdelay(2);
+ }
+
+ dispc_enable_lcd_out(1);
+
+- r = panel->enable(display);
+- if (r)
+- goto err2;
++ if (dssdev->driver->enable) {
++ r = dssdev->driver->enable(dssdev);
++ if (r)
++ goto err3;
++ }
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ sdi.skip_init = 0;
+
+ return 0;
+-err2:
++err3:
+ dispc_enable_lcd_out(0);
++err2:
++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+ err1:
++ omap_dss_stop_device(dssdev);
+ err0:
+- dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+ return r;
+ }
+
+-static int sdi_display_resume(struct omap_display *display);
++static int sdi_display_resume(struct omap_dss_device *dssdev);
+
+-static void sdi_display_disable(struct omap_display *display)
++static void sdi_display_disable(struct omap_dss_device *dssdev)
+ {
+- if (display->state == OMAP_DSS_DISPLAY_DISABLED)
++ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED)
+ return;
+
+- if (display->state == OMAP_DSS_DISPLAY_SUSPENDED)
+- sdi_display_resume(display);
++ if (dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
++ sdi_display_resume(dssdev);
+
+- display->panel->disable(display);
++ if (dssdev->driver->disable)
++ dssdev->driver->disable(dssdev);
+
+ dispc_enable_lcd_out(0);
+
+@@ -141,16 +154,18 @@ static void sdi_display_disable(struct omap_display *display)
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
++ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
++
++ omap_dss_stop_device(dssdev);
+ }
+
+-static int sdi_display_suspend(struct omap_display *display)
++static int sdi_display_suspend(struct omap_dss_device *dssdev)
+ {
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE)
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EINVAL;
+
+- if (display->panel->suspend)
+- display->panel->suspend(display);
++ if (dssdev->driver->suspend)
++ dssdev->driver->suspend(dssdev);
+
+ dispc_enable_lcd_out(0);
+
+@@ -158,14 +173,14 @@ static int sdi_display_suspend(struct omap_display *display)
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- display->state = OMAP_DSS_DISPLAY_SUSPENDED;
++ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+
+ return 0;
+ }
+
+-static int sdi_display_resume(struct omap_display *display)
++static int sdi_display_resume(struct omap_dss_device *dssdev)
+ {
+- if (display->state != OMAP_DSS_DISPLAY_SUSPENDED)
++ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
+ return -EINVAL;
+
+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
+@@ -175,15 +190,15 @@ static int sdi_display_resume(struct omap_display *display)
+
+ dispc_enable_lcd_out(1);
+
+- if (display->panel->resume)
+- display->panel->resume(display);
++ if (dssdev->driver->resume)
++ dssdev->driver->resume(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ return 0;
+ }
+
+-static int sdi_display_set_update_mode(struct omap_display *display,
++static int sdi_display_set_update_mode(struct omap_dss_device *dssdev,
+ enum omap_dss_update_mode mode)
+ {
+ if (mode == OMAP_DSS_UPDATE_MANUAL)
+@@ -201,29 +216,29 @@ static int sdi_display_set_update_mode(struct omap_display *display,
+ }
+
+ static enum omap_dss_update_mode sdi_display_get_update_mode(
+- struct omap_display *display)
++ struct omap_dss_device *dssdev)
+ {
+ return sdi.update_enabled ? OMAP_DSS_UPDATE_AUTO :
+ OMAP_DSS_UPDATE_DISABLED;
+ }
+
+-static void sdi_get_timings(struct omap_display *display,
++static void sdi_get_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+- *timings = display->panel->timings;
++ *timings = dssdev->panel.timings;
+ }
+
+-void sdi_init_display(struct omap_display *display)
++void sdi_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("SDI init\n");
+
+- display->enable = sdi_display_enable;
+- display->disable = sdi_display_disable;
+- display->suspend = sdi_display_suspend;
+- display->resume = sdi_display_resume;
+- display->set_update_mode = sdi_display_set_update_mode;
+- display->get_update_mode = sdi_display_get_update_mode;
+- display->get_timings = sdi_get_timings;
++ dssdev->enable = sdi_display_enable;
++ dssdev->disable = sdi_display_disable;
++ dssdev->suspend = sdi_display_suspend;
++ dssdev->resume = sdi_display_resume;
++ dssdev->set_update_mode = sdi_display_set_update_mode;
++ dssdev->get_update_mode = sdi_display_get_update_mode;
++ dssdev->get_timings = sdi_get_timings;
+ }
+
+ int sdi_init(bool skip_init)
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index b0f0795..a83d170 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -31,6 +31,7 @@
+ #include <linux/delay.h>
+ #include <linux/string.h>
+ #include <linux/seq_file.h>
++#include <linux/platform_device.h>
+
+ #include <mach/display.h>
+ #include <mach/cpu.h>
+@@ -292,10 +293,6 @@ static struct {
+ u32 wss_data;
+ } venc;
+
+-static struct omap_panel venc_panel = {
+- .name = "tv-out",
+-};
+-
+ static inline void venc_write_reg(int idx, u32 val)
+ {
+ __raw_writel(val, venc.base + idx);
+@@ -400,7 +397,76 @@ static const struct venc_config *venc_timings_to_config(
+ BUG();
+ }
+
+-int venc_init(void)
++
++
++
++
++/* driver */
++static int venc_panel_probe(struct omap_dss_device *dssdev)
++{
++ //dssdev->name = "tv-out";
++ dssdev->panel.timings = omap_dss_pal_timings;
++
++ return 0;
++}
++
++static void venc_panel_remove(struct omap_dss_device *dssdev)
++{
++}
++
++static int venc_panel_enable(struct omap_dss_device *dssdev)
++{
++ int r = 0;
++
++ /* wait couple of vsyncs until enabling the LCD */
++ msleep(50);
++
++ if (dssdev->platform_enable)
++ r = dssdev->platform_enable(dssdev);
++
++ return r;
++}
++
++static void venc_panel_disable(struct omap_dss_device *dssdev)
++{
++ if (dssdev->platform_disable)
++ dssdev->platform_disable(dssdev);
++
++ /* wait at least 5 vsyncs after disabling the LCD */
++
++ msleep(100);
++}
++
++static int venc_panel_suspend(struct omap_dss_device *dssdev)
++{
++ venc_panel_disable(dssdev);
++ return 0;
++}
++
++static int venc_panel_resume(struct omap_dss_device *dssdev)
++{
++ return venc_panel_enable(dssdev);
++}
++
++static struct omap_dss_driver venc_driver = {
++ .probe = venc_panel_probe,
++ .remove = venc_panel_remove,
++
++ .enable = venc_panel_enable,
++ .disable = venc_panel_disable,
++ .suspend = venc_panel_suspend,
++ .resume = venc_panel_resume,
++
++ .driver = {
++ .name = "venc",
++ .owner = THIS_MODULE,
++ },
++};
++/* driver end */
++
++
++
++int venc_init(struct platform_device *pdev)
+ {
+ u8 rev_id;
+
+@@ -408,8 +474,6 @@ int venc_init(void)
+
+ venc.wss_data = 0;
+
+- venc_panel.timings = omap_dss_pal_timings;
+-
+ venc.base = ioremap(VENC_BASE, SZ_1K);
+ if (!venc.base) {
+ DSSERR("can't ioremap VENC\n");
+@@ -423,25 +487,29 @@ int venc_init(void)
+
+ venc_enable_clocks(0);
+
+- return 0;
++ return omap_dss_register_driver(&venc_driver);
++
++ //return 0;
+ }
+
+ void venc_exit(void)
+ {
++ omap_dss_unregister_driver(&venc_driver);
++
+ iounmap(venc.base);
+ }
+
+-static void venc_power_on(struct omap_display *display)
++static void venc_power_on(struct omap_dss_device *dssdev)
+ {
+ venc_enable_clocks(1);
+
+ venc_reset();
+- venc_write_config(venc_timings_to_config(&display->panel->timings));
++ venc_write_config(venc_timings_to_config(&dssdev->panel.timings));
+
+- dss_set_venc_output(display->hw_config.u.venc.type);
++ dss_set_venc_output(dssdev->phy.venc.type);
+ dss_set_dac_pwrdn_bgz(1);
+
+- if (display->hw_config.u.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE) {
++ if (dssdev->phy.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE) {
+ if (cpu_is_omap24xx())
+ venc_write_reg(VENC_OUTPUT_CONTROL, 0x2);
+ else
+@@ -450,29 +518,29 @@ static void venc_power_on(struct omap_display *display)
+ venc_write_reg(VENC_OUTPUT_CONTROL, 0xd);
+ }
+
+- dispc_set_digit_size(display->panel->timings.x_res,
+- display->panel->timings.y_res/2);
++ dispc_set_digit_size(dssdev->panel.timings.x_res,
++ dssdev->panel.timings.y_res/2);
+
+- if (display->hw_config.panel_enable)
+- display->hw_config.panel_enable(display);
++ if (dssdev->platform_enable)
++ dssdev->platform_enable(dssdev);
+
+ dispc_enable_digit_out(1);
+ }
+
+-static void venc_power_off(struct omap_display *display)
++static void venc_power_off(struct omap_dss_device *dssdev)
+ {
+ venc_write_reg(VENC_OUTPUT_CONTROL, 0);
+ dss_set_dac_pwrdn_bgz(0);
+
+ dispc_enable_digit_out(0);
+
+- if (display->hw_config.panel_disable)
+- display->hw_config.panel_disable(display);
++ if (dssdev->platform_disable)
++ dssdev->platform_disable(dssdev);
+
+ venc_enable_clocks(0);
+ }
+
+-static int venc_enable_display(struct omap_display *display)
++static int venc_enable_display(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+@@ -480,43 +548,45 @@ static int venc_enable_display(struct omap_display *display)
+
+ mutex_lock(&venc.venc_lock);
+
+- if (display->state != OMAP_DSS_DISPLAY_DISABLED) {
++ if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
+ r = -EINVAL;
+ goto err;
+ }
+
+- venc_power_on(display);
++ venc_power_on(dssdev);
++
++ venc.wss_data = 0;
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+ err:
+ mutex_unlock(&venc.venc_lock);
+
+ return r;
+ }
+
+-static void venc_disable_display(struct omap_display *display)
++static void venc_disable_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("venc_disable_display\n");
+
+ mutex_lock(&venc.venc_lock);
+
+- if (display->state == OMAP_DSS_DISPLAY_DISABLED)
++ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED)
+ goto end;
+
+- if (display->state == OMAP_DSS_DISPLAY_SUSPENDED) {
++ if (dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED) {
+ /* suspended is the same as disabled with venc */
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
++ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+ goto end;
+ }
+
+- venc_power_off(display);
++ venc_power_off(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_DISABLED;
++ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+ end:
+ mutex_unlock(&venc.venc_lock);
+ }
+
+-static int venc_display_suspend(struct omap_display *display)
++static int venc_display_suspend(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+@@ -524,21 +594,21 @@ static int venc_display_suspend(struct omap_display *display)
+
+ mutex_lock(&venc.venc_lock);
+
+- if (display->state != OMAP_DSS_DISPLAY_ACTIVE) {
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) {
+ r = -EINVAL;
+ goto err;
+ }
+
+- venc_power_off(display);
++ venc_power_off(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_SUSPENDED;
++ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+ err:
+ mutex_unlock(&venc.venc_lock);
+
+ return r;
+ }
+
+-static int venc_display_resume(struct omap_display *display)
++static int venc_display_resume(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+@@ -546,44 +616,44 @@ static int venc_display_resume(struct omap_display *display)
+
+ mutex_lock(&venc.venc_lock);
+
+- if (display->state != OMAP_DSS_DISPLAY_SUSPENDED) {
++ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) {
+ r = -EINVAL;
+ goto err;
+ }
+
+- venc_power_on(display);
++ venc_power_on(dssdev);
+
+- display->state = OMAP_DSS_DISPLAY_ACTIVE;
++ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+ err:
+ mutex_unlock(&venc.venc_lock);
+
+ return r;
+ }
+
+-static void venc_get_timings(struct omap_display *display,
++static void venc_get_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+- *timings = venc_panel.timings;
++ *timings = dssdev->panel.timings;
+ }
+
+-static void venc_set_timings(struct omap_display *display,
++static void venc_set_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+ DSSDBG("venc_set_timings\n");
+
+ /* Reset WSS data when the TV standard changes. */
+- if (memcmp(&display->panel->timings, timings, sizeof(*timings)))
++ if (memcmp(&dssdev->panel.timings, timings, sizeof(*timings)))
+ venc.wss_data = 0;
+
+- display->panel->timings = *timings;
+- if (display->state == OMAP_DSS_DISPLAY_ACTIVE) {
++ dssdev->panel.timings = *timings;
++ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
+ /* turn the venc off and on to get new timings to use */
+- venc_disable_display(display);
+- venc_enable_display(display);
++ venc_disable_display(dssdev);
++ venc_enable_display(dssdev);
+ }
+ }
+
+-static int venc_check_timings(struct omap_display *display,
++static int venc_check_timings(struct omap_dss_device *dssdev,
+ struct omap_video_timings *timings)
+ {
+ DSSDBG("venc_check_timings\n");
+@@ -597,14 +667,13 @@ static int venc_check_timings(struct omap_display *display,
+ return -EINVAL;
+ }
+
+-static u32 venc_get_wss(struct omap_display *display)
++static u32 venc_get_wss(struct omap_dss_device *dssdev)
+ {
+ /* Invert due to VENC_L21_WC_CTL:INV=1 */
+ return (venc.wss_data >> 8) ^ 0xfffff;
+ }
+
+-static int venc_set_wss(struct omap_display *display,
+- u32 wss)
++static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
+ {
+ const struct venc_config *config;
+
+@@ -612,7 +681,7 @@ static int venc_set_wss(struct omap_display *display,
+
+ mutex_lock(&venc.venc_lock);
+
+- config = venc_timings_to_config(&display->panel->timings);
++ config = venc_timings_to_config(&dssdev->panel.timings);
+
+ /* Invert due to VENC_L21_WC_CTL:INV=1 */
+ venc.wss_data = (wss ^ 0xfffff) << 8;
+@@ -628,18 +697,19 @@ static int venc_set_wss(struct omap_display *display,
+ return 0;
+ }
+
+-void venc_init_display(struct omap_display *display)
++void venc_init_display(struct omap_dss_device *dssdev)
+ {
+- display->panel = &venc_panel;
+- display->enable = venc_enable_display;
+- display->disable = venc_disable_display;
+- display->suspend = venc_display_suspend;
+- display->resume = venc_display_resume;
+- display->get_timings = venc_get_timings;
+- display->set_timings = venc_set_timings;
+- display->check_timings = venc_check_timings;
+- display->get_wss = venc_get_wss;
+- display->set_wss = venc_set_wss;
++ DSSDBG("init_display\n");
++
++ dssdev->enable = venc_enable_display;
++ dssdev->disable = venc_disable_display;
++ dssdev->suspend = venc_display_suspend;
++ dssdev->resume = venc_display_resume;
++ dssdev->get_timings = venc_get_timings;
++ dssdev->set_timings = venc_set_timings;
++ dssdev->check_timings = venc_check_timings;
++ dssdev->get_wss = venc_get_wss;
++ dssdev->set_wss = venc_set_wss;
+ }
+
+ void venc_dump_regs(struct seq_file *s)
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 57e6287..0ca57db 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -37,7 +37,7 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ struct omap_overlay *ovl;
+ struct omap_overlay_info info;
+ int r = 0;
+@@ -191,7 +191,7 @@ static int omapfb_update_window(struct fb_info *fbi,
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ u16 dw, dh;
+
+ if (!display)
+@@ -217,7 +217,7 @@ static int omapfb_set_update_mode(struct fb_info *fbi,
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ enum omap_dss_update_mode um;
+ int r;
+
+@@ -253,7 +253,7 @@ static int omapfb_get_update_mode(struct fb_info *fbi,
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ enum omap_dss_update_mode m;
+
+ if (!display || !display->get_update_mode)
+@@ -396,7 +396,7 @@ err:
+ static int omapfb_memory_read(struct fb_info *fbi,
+ struct omapfb_memory_read *mr)
+ {
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+ void *buf;
+@@ -484,7 +484,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+
+ union {
+ struct omapfb_update_window_old uwnd_o;
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index c3690b8..df5ede3 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -454,7 +454,7 @@ void set_fb_fix(struct fb_info *fbi)
+ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ unsigned long max_frame_size;
+ unsigned long line_size;
+ int xres_min, yres_min;
+@@ -615,7 +615,7 @@ static int omapfb_release(struct fb_info *fbi, int user)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+
+ DBG("Closing fb with plane index %d\n", ofbi->id);
+
+@@ -1057,7 +1057,7 @@ static int omapfb_blank(int blank, struct fb_info *fbi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ int do_update = 0;
+ int r = 0;
+
+@@ -1263,7 +1263,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
+ unsigned long paddr)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omap_display *display;
++ struct omap_dss_device *display;
+ int bytespp;
+
+ display = fb2display(fbi);
+@@ -1307,6 +1307,9 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
+ size = w * h * bytespp;
+ }
+
++ if (!size)
++ return 0;
++
+ return omapfb_alloc_fbmem(fbi, size, paddr);
+ }
+
+@@ -1485,7 +1488,7 @@ int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ struct omapfb2_mem_region *rg = &ofbi->region;
+ unsigned long old_size = rg->size;
+ unsigned long old_paddr = rg->paddr;
+@@ -1563,7 +1566,7 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+ {
+ struct fb_var_screeninfo *var = &fbi->var;
+ struct fb_fix_screeninfo *fix = &fbi->fix;
+- struct omap_display *display = fb2display(fbi);
++ struct omap_dss_device *display = fb2display(fbi);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ int r = 0;
+
+@@ -1695,7 +1698,7 @@ static void omapfb_free_resources(struct omapfb2_device *fbdev)
+ if (fbdev->displays[i]->state != OMAP_DSS_DISPLAY_DISABLED)
+ fbdev->displays[i]->disable(fbdev->displays[i]);
+
+- omap_dss_put_display(fbdev->displays[i]);
++ omap_dss_put_device(fbdev->displays[i]);
+ }
+
+ dev_set_drvdata(fbdev->dev, NULL);
+@@ -1874,7 +1877,7 @@ int omapfb_mode_to_timings(const char *mode_str,
+ }
+ }
+
+-static int omapfb_set_def_mode(struct omap_display *display, char *mode_str)
++static int omapfb_set_def_mode(struct omap_dss_device *display, char *mode_str)
+ {
+ int r;
+ u8 bpp;
+@@ -1884,7 +1887,7 @@ static int omapfb_set_def_mode(struct omap_display *display, char *mode_str)
+ if (r)
+ return r;
+
+- display->panel->recommended_bpp = bpp;
++ display->panel.recommended_bpp = bpp;
+
+ if (!display->check_timings || !display->set_timings)
+ return -EINVAL;
+@@ -1909,7 +1912,7 @@ static int omapfb_parse_def_modes(struct omapfb2_device *fbdev)
+
+ while (!r && (this_opt = strsep(&options, ",")) != NULL) {
+ char *p, *display_str, *mode_str;
+- struct omap_display *display;
++ struct omap_dss_device *display;
+ int i;
+
+ p = strchr(this_opt, ':');
+@@ -1950,9 +1953,10 @@ static int omapfb_probe(struct platform_device *pdev)
+ {
+ struct omapfb2_device *fbdev = NULL;
+ int r = 0;
+- int i, t;
++ int i;
+ struct omap_overlay *ovl;
+- struct omap_display *def_display;
++ struct omap_dss_device *def_display;
++ struct omap_dss_device *dssdev;
+
+ DBG("omapfb_probe\n");
+
+@@ -1974,17 +1978,10 @@ static int omapfb_probe(struct platform_device *pdev)
+ platform_set_drvdata(pdev, fbdev);
+
+ fbdev->num_displays = 0;
+- t = omap_dss_get_num_displays();
+- for (i = 0; i < t; i++) {
+- struct omap_display *display;
+- display = omap_dss_get_display(i);
+- if (!display) {
+- dev_err(&pdev->dev, "can't get display %d\n", i);
+- r = -EINVAL;
+- goto cleanup;
+- }
+-
+- fbdev->displays[fbdev->num_displays++] = display;
++ dssdev = NULL;
++ for_each_dss_dev(dssdev) {
++ omap_dss_get_device(dssdev);
++ fbdev->displays[fbdev->num_displays++] = dssdev;
+ }
+
+ if (fbdev->num_displays == 0) {
+@@ -2005,8 +2002,8 @@ static int omapfb_probe(struct platform_device *pdev)
+ /* gfx overlay should be the default one. find a display
+ * connected to that, and use it as default display */
+ ovl = omap_dss_get_overlay(0);
+- if (ovl->manager && ovl->manager->display) {
+- def_display = ovl->manager->display;
++ if (ovl->manager && ovl->manager->device) {
++ def_display = ovl->manager->device;
+ } else {
+ dev_err(&pdev->dev, "cannot find default display\n");
+ r = -EINVAL;
+@@ -2063,7 +2060,7 @@ static int omapfb_probe(struct platform_device *pdev)
+ }
+
+ for (i = 0; i < fbdev->num_displays; i++) {
+- struct omap_display *display = fbdev->displays[i];
++ struct omap_dss_device *display = fbdev->displays[i];
+ u16 w, h;
+
+ if (!display->get_update_mode || !display->update)
+diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h
+index e750bc0..6ca8ba6 100644
+--- a/drivers/video/omap2/omapfb/omapfb.h
++++ b/drivers/video/omap2/omapfb/omapfb.h
+@@ -78,7 +78,7 @@ struct omapfb2_device {
+ struct fb_info *fbs[10];
+
+ unsigned num_displays;
+- struct omap_display *displays[10];
++ struct omap_dss_device *displays[10];
+ unsigned num_overlays;
+ struct omap_overlay *overlays[10];
+ unsigned num_managers;
+@@ -115,7 +115,7 @@ int dss_mode_to_fb_mode(enum omap_color_mode dssmode,
+ struct fb_var_screeninfo *var);
+
+ /* find the display connected to this fb, if any */
+-static inline struct omap_display *fb2display(struct fb_info *fbi)
++static inline struct omap_dss_device *fb2display(struct fb_info *fbi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ int i;
+@@ -123,7 +123,7 @@ static inline struct omap_display *fb2display(struct fb_info *fbi)
+ /* XXX: returns the display connected to first attached overlay */
+ for (i = 0; i < ofbi->num_overlays; i++) {
+ if (ofbi->overlays[i]->manager)
+- return ofbi->overlays[i]->manager->display;
++ return ofbi->overlays[i]->manager->device;
+ }
+
+ return NULL;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0088-DSS2-Board-file-changes-for-new-device-model.patch b/recipes/linux/linux-omap-pm/dss2/0088-DSS2-Board-file-changes-for-new-device-model.patch
new file mode 100644
index 0000000000..fbab306f97
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0088-DSS2-Board-file-changes-for-new-device-model.patch
@@ -0,0 +1,496 @@
+From 026ceab45d93841cabd7a0fc734a919171543c46 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 28 May 2009 13:27:43 +0300
+Subject: [PATCH 088/146] DSS2: Board file changes for new device model
+
+Changes to Beagle, SDP, Overo board files
+---
+ arch/arm/mach-omap2/board-3430sdp.c | 102 ++++++++--------
+ arch/arm/mach-omap2/board-omap3beagle.c | 195 ++++++++++++++++---------------
+ arch/arm/mach-omap2/board-overo.c | 43 ++++---
+ 3 files changed, 173 insertions(+), 167 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
+index 2ee6cbb..ec0c358 100644
+--- a/arch/arm/mach-omap2/board-3430sdp.c
++++ b/arch/arm/mach-omap2/board-3430sdp.c
+@@ -178,21 +178,6 @@ static unsigned enable_gpio;
+ static int lcd_enabled;
+ static int dvi_enabled;
+
+-static struct platform_device sdp3430_lcd_device = {
+- .name = "sdp2430_lcd",
+- .id = -1,
+-};
+-
+-static struct regulator_consumer_supply sdp3430_vdac_supply = {
+- .supply = "vdac",
+- .dev = &sdp3430_lcd_device.dev,
+-};
+-
+-static struct regulator_consumer_supply sdp3430_vdvi_supply = {
+- .supply = "vdvi",
+- .dev = &sdp3430_lcd_device.dev,
+-};
+-
+ static void enable_vpll2(int enable)
+ {
+ u8 ded_val, grp_val;
+@@ -253,7 +238,7 @@ err0:
+ return;
+ }
+
+-static int sdp3430_panel_enable_lcd(struct omap_display *display)
++static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
+ {
+ u8 ded_val, ded_reg;
+ u8 grp_val, grp_reg;
+@@ -283,7 +268,7 @@ static int sdp3430_panel_enable_lcd(struct omap_display *display)
+ return 0;
+ }
+
+-static void sdp3430_panel_disable_lcd(struct omap_display *display)
++static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
+ {
+ lcd_enabled = 0;
+
+@@ -293,16 +278,7 @@ static void sdp3430_panel_disable_lcd(struct omap_display *display)
+ gpio_direction_output(backlight_gpio, 0);
+ }
+
+-static struct omap_dss_display_config sdp3430_display_data = {
+- .type = OMAP_DISPLAY_TYPE_DPI,
+- .name = "lcd",
+- .panel_name = "sharp-ls037v7dw01",
+- .u.dpi.data_lines = 16,
+- .panel_enable = sdp3430_panel_enable_lcd,
+- .panel_disable = sdp3430_panel_disable_lcd,
+-};
+-
+-static int sdp3430_panel_enable_dvi(struct omap_display *display)
++static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
+ {
+ if (lcd_enabled) {
+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+@@ -316,24 +292,14 @@ static int sdp3430_panel_enable_dvi(struct omap_display *display)
+ return 0;
+ }
+
+-static void sdp3430_panel_disable_dvi(struct omap_display *display)
++static void sdp3430_panel_disable_dvi(struct omap_dss_device *dssdev)
+ {
+ sdp3430_dsi_power_down();
+
+ dvi_enabled = 0;
+ }
+
+-
+-static struct omap_dss_display_config sdp3430_display_data_dvi = {
+- .type = OMAP_DISPLAY_TYPE_DPI,
+- .name = "dvi",
+- .panel_name = "panel-generic",
+- .u.dpi.data_lines = 24,
+- .panel_enable = sdp3430_panel_enable_dvi,
+- .panel_disable = sdp3430_panel_disable_dvi,
+-};
+-
+-static int sdp3430_panel_enable_tv(struct omap_display *display)
++static int sdp3430_panel_enable_tv(struct omap_dss_device *dssdev)
+ {
+ #define ENABLE_VDAC_DEDICATED 0x03
+ #define ENABLE_VDAC_DEV_GRP 0x20
+@@ -347,7 +313,7 @@ static int sdp3430_panel_enable_tv(struct omap_display *display)
+ return 0;
+ }
+
+-static void sdp3430_panel_disable_tv(struct omap_display *display)
++static void sdp3430_panel_disable_tv(struct omap_dss_device *dssdev)
+ {
+ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+ TWL4030_VDAC_DEDICATED);
+@@ -355,23 +321,47 @@ static void sdp3430_panel_disable_tv(struct omap_display *display)
+ TWL4030_VDAC_DEV_GRP);
+ }
+
+-static struct omap_dss_display_config sdp3430_display_data_tv = {
+- .type = OMAP_DISPLAY_TYPE_VENC,
++
++static struct omap_dss_device sdp3430_lcd_device = {
++ .name = "lcd",
++ .driver_name = "sharp_ls_panel",
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .phy.dpi.data_lines = 16,
++ .platform_enable = sdp3430_panel_enable_lcd,
++ .platform_disable = sdp3430_panel_disable_lcd,
++};
++
++static struct omap_dss_device sdp3430_dvi_device = {
++ .name = "dvi",
++ .driver_name = "generic_panel",
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .phy.dpi.data_lines = 24,
++ .platform_enable = sdp3430_panel_enable_dvi,
++ .platform_disable = sdp3430_panel_disable_dvi,
++};
++
++static struct omap_dss_device sdp3430_tv_device = {
+ .name = "tv",
+- .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+- .panel_enable = sdp3430_panel_enable_tv,
+- .panel_disable = sdp3430_panel_disable_tv,
++ .driver_name = "venc",
++ .type = OMAP_DISPLAY_TYPE_VENC,
++ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
++ .platform_enable = sdp3430_panel_enable_tv,
++ .platform_disable = sdp3430_panel_disable_tv,
++};
++
++
++static struct omap_dss_device *sdp3430_dss_devices[] = {
++ &sdp3430_lcd_device,
++ &sdp3430_dvi_device,
++ &sdp3430_tv_device,
+ };
+
+ static struct omap_dss_board_info sdp3430_dss_data = {
++ .num_devices = ARRAY_SIZE(sdp3430_dss_devices),
++ .devices = sdp3430_dss_devices,
++ .default_device = &sdp3430_lcd_device,
+ .dsi_power_up = sdp3430_dsi_power_up,
+ .dsi_power_down = sdp3430_dsi_power_down,
+- .num_displays = 3,
+- .displays = {
+- &sdp3430_display_data,
+- &sdp3430_display_data_dvi,
+- &sdp3430_display_data_tv,
+- }
+ };
+
+ static struct platform_device sdp3430_dss_device = {
+@@ -382,6 +372,16 @@ static struct platform_device sdp3430_dss_device = {
+ },
+ };
+
++static struct regulator_consumer_supply sdp3430_vdac_supply = {
++ .supply = "vdac",
++ .dev = &sdp3430_dss_device.dev,
++};
++
++static struct regulator_consumer_supply sdp3430_vdvi_supply = {
++ .supply = "vdvi",
++ .dev = &sdp3430_dss_device.dev,
++};
++
+ static struct platform_device *sdp3430_devices[] __initdata = {
+ &sdp3430_dss_device,
+ };
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 4ab7396..67e1d5c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -108,6 +108,105 @@ static struct platform_device omap3beagle_nand_device = {
+ .resource = &omap3beagle_nand_resource,
+ };
+
++/* DSS */
++
++static int beagle_enable_dvi(struct omap_dss_device *dssdev)
++{
++ if (dssdev->reset_gpio != -1)
++ gpio_set_value(dssdev->reset_gpio, 1);
++
++ return 0;
++}
++
++static void beagle_disable_dvi(struct omap_dss_device *dssdev)
++{
++ if (dssdev->reset_gpio != -1)
++ gpio_set_value(dssdev->reset_gpio, 0);
++}
++
++static struct omap_dss_device beagle_dvi_device = {
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .name = "dvi",
++ .driver_name = "generic_panel",
++ .phy.dpi.data_lines = 24,
++ .reset_gpio = 170,
++ .platform_enable = beagle_enable_dvi,
++ .platform_disable = beagle_disable_dvi,
++};
++
++static int beagle_panel_enable_tv(struct omap_dss_device *dssdev)
++{
++#define ENABLE_VDAC_DEDICATED 0x03
++#define ENABLE_VDAC_DEV_GRP 0x20
++
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ ENABLE_VDAC_DEDICATED,
++ TWL4030_VDAC_DEDICATED);
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
++
++ return 0;
++}
++
++static void beagle_panel_disable_tv(struct omap_dss_device *dssdev)
++{
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
++ TWL4030_VDAC_DEDICATED);
++ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
++ TWL4030_VDAC_DEV_GRP);
++}
++
++static struct omap_dss_device beagle_tv_device = {
++ .name = "tv",
++ .driver_name = "venc",
++ .type = OMAP_DISPLAY_TYPE_VENC,
++ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
++ .platform_enable = beagle_panel_enable_tv,
++ .platform_disable = beagle_panel_disable_tv,
++};
++
++static struct omap_dss_device *beagle_dss_devices[] = {
++ &beagle_dvi_device,
++ &beagle_tv_device,
++};
++
++static struct omap_dss_board_info beagle_dss_data = {
++ .num_devices = ARRAY_SIZE(beagle_dss_devices),
++ .devices = beagle_dss_devices,
++ .default_device = &beagle_dvi_device,
++};
++
++static struct platform_device beagle_dss_device = {
++ .name = "omapdss",
++ .id = -1,
++ .dev = {
++ .platform_data = &beagle_dss_data,
++ },
++};
++
++static struct regulator_consumer_supply beagle_vdac_supply = {
++ .supply = "vdac",
++ .dev = &beagle_dss_device.dev,
++};
++
++static struct regulator_consumer_supply beagle_vdvi_supply = {
++ .supply = "vdvi",
++ .dev = &beagle_dss_device.dev,
++};
++
++static void __init beagle_display_init(void)
++{
++ int r;
++
++ r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset");
++ if (r < 0) {
++ printk(KERN_ERR "Unable to get DVI reset GPIO\n");
++ return;
++ }
++
++ gpio_direction_output(beagle_dvi_device.reset_gpio, 0);
++}
++
+ #include "sdram-micron-mt46h32m32lf-6.h"
+
+ static struct omap_uart_config omap3_beagle_uart_config __initdata = {
+@@ -182,16 +281,6 @@ static struct twl4030_gpio_platform_data beagle_gpio_data = {
+ .setup = beagle_twl_gpio_setup,
+ };
+
+-static struct regulator_consumer_supply beagle_vdac_supply = {
+- .supply = "vdac",
+- .dev = &omap3_beagle_lcd_device.dev,
+-};
+-
+-static struct regulator_consumer_supply beagle_vdvi_supply = {
+- .supply = "vdvi",
+- .dev = &omap3_beagle_lcd_device.dev,
+-};
+-
+ /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
+ static struct regulator_init_data beagle_vmmc1 = {
+ .constraints = {
+@@ -345,92 +434,6 @@ static struct platform_device keys_gpio = {
+ },
+ };
+
+-/* DSS */
+-
+-static int beagle_enable_dvi(struct omap_display *display)
+-{
+- if (display->hw_config.panel_reset_gpio != -1)
+- gpio_set_value(display->hw_config.panel_reset_gpio, 1);
+-
+- return 0;
+-}
+-
+-static void beagle_disable_dvi(struct omap_display *display)
+-{
+- if (display->hw_config.panel_reset_gpio != -1)
+- gpio_set_value(display->hw_config.panel_reset_gpio, 0);
+-}
+-
+-static struct omap_dss_display_config beagle_display_data_dvi = {
+- .type = OMAP_DISPLAY_TYPE_DPI,
+- .name = "dvi",
+- .panel_name = "panel-generic",
+- .u.dpi.data_lines = 24,
+- .panel_reset_gpio = 170,
+- .panel_enable = beagle_enable_dvi,
+- .panel_disable = beagle_disable_dvi,
+-};
+-
+-
+-static int beagle_panel_enable_tv(struct omap_display *display)
+-{
+-#define ENABLE_VDAC_DEDICATED 0x03
+-#define ENABLE_VDAC_DEV_GRP 0x20
+-
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEDICATED,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
+-
+- return 0;
+-}
+-
+-static void beagle_panel_disable_tv(struct omap_display *display)
+-{
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEV_GRP);
+-}
+-
+-static struct omap_dss_display_config beagle_display_data_tv = {
+- .type = OMAP_DISPLAY_TYPE_VENC,
+- .name = "tv",
+- .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+- .panel_enable = beagle_panel_enable_tv,
+- .panel_disable = beagle_panel_disable_tv,
+-};
+-
+-static struct omap_dss_board_info beagle_dss_data = {
+- .num_displays = 2,
+- .displays = {
+- &beagle_display_data_dvi,
+- &beagle_display_data_tv,
+- }
+-};
+-
+-static struct platform_device beagle_dss_device = {
+- .name = "omapdss",
+- .id = -1,
+- .dev = {
+- .platform_data = &beagle_dss_data,
+- },
+-};
+-
+-static void __init beagle_display_init(void)
+-{
+- int r;
+-
+- r = gpio_request(beagle_display_data_dvi.panel_reset_gpio, "DVI reset");
+- if (r < 0) {
+- printk(KERN_ERR "Unable to get DVI reset GPIO\n");
+- return;
+- }
+-
+- gpio_direction_output(beagle_display_data_dvi.panel_reset_gpio, 0);
+-}
+-
+ static struct omap_board_config_kernel omap3_beagle_config[] __initdata = {
+ { OMAP_TAG_UART, &omap3_beagle_uart_config },
+ };
+diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
+index 7bcac03..39f95f5 100644
+--- a/arch/arm/mach-omap2/board-overo.c
++++ b/arch/arm/mach-omap2/board-overo.c
+@@ -386,7 +386,7 @@ static void __init overo_display_init(void)
+ gpio_export(OVERO_GPIO_LCD_EN, 0);
+ }
+
+-static int overo_panel_enable_dvi(struct omap_display *display)
++static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
+ {
+ if (lcd_enabled) {
+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+@@ -399,23 +399,23 @@ static int overo_panel_enable_dvi(struct omap_display *display)
+ return 0;
+ }
+
+-static void overo_panel_disable_dvi(struct omap_display *display)
++static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
+ {
+ gpio_set_value(OVERO_GPIO_LCD_EN, 0);
+
+ dvi_enabled = 0;
+ }
+
+-static struct omap_dss_display_config overo_display_data_dvi = {
++static struct omap_dss_device overo_dvi_device = {
+ .type = OMAP_DISPLAY_TYPE_DPI,
+ .name = "dvi",
+- .panel_name = "panel-generic",
+- .u.dpi.data_lines = 24,
+- .panel_enable = overo_panel_enable_dvi,
+- .panel_disable = overo_panel_disable_dvi,
++ .driver_name = "panel_generic",
++ .phy.dpi.data_lines = 24,
++ .platform_enable = overo_panel_enable_dvi,
++ .platform_disable = overo_panel_disable_dvi,
+ };
+
+-static int overo_panel_enable_lcd(struct omap_display *display)
++static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
+ {
+ if (dvi_enabled) {
+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+@@ -427,27 +427,30 @@ static int overo_panel_enable_lcd(struct omap_display *display)
+ return 0;
+ }
+
+-static void overo_panel_disable_lcd(struct omap_display *display)
++static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
+ {
+ gpio_set_value(OVERO_GPIO_LCD_EN, 0);
+ lcd_enabled = 0;
+ }
+
+-static struct omap_dss_display_config overo_display_data_lcd = {
++static struct omap_dss_device overo_lcd_device = {
+ .type = OMAP_DISPLAY_TYPE_DPI,
+ .name = "lcd",
+- .panel_name = "samsung-lte430wq-f0c",
+- .u.dpi.data_lines = 24,
+- .panel_enable = overo_panel_enable_lcd,
+- .panel_disable = overo_panel_disable_lcd,
+- };
++ .driver_name = "samsung-lte430wq-f0c",
++ .phy.dpi.data_lines = 24,
++ .platform_enable = overo_panel_enable_lcd,
++ .platform_disable = overo_panel_disable_lcd,
++};
++
++static struct omap_dss_device *overo_dss_devices[] = {
++ &overo_dvi_device,
++ &overo_lcd_device,
++};
+
+ static struct omap_dss_board_info overo_dss_data = {
+- .num_displays = 2,
+- .displays = {
+- &overo_display_data_dvi,
+- &overo_display_data_lcd,
+- }
++ .num_devices = ARRAY_SIZE(overo_dss_devices),
++ .devices = overo_dss_devices,
++ .default_device = &overo_dvi_device,
+ };
+
+ static struct platform_device overo_dss_device = {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0089-DSS2-Panel-driver-changes-for-new-device-model.patch b/recipes/linux/linux-omap-pm/dss2/0089-DSS2-Panel-driver-changes-for-new-device-model.patch
new file mode 100644
index 0000000000..97098e1554
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0089-DSS2-Panel-driver-changes-for-new-device-model.patch
@@ -0,0 +1,400 @@
+From 449ff8409e92f76f71baf538867f600a832f92e3 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 28 May 2009 13:29:55 +0300
+Subject: [PATCH 089/146] DSS2: Panel driver changes for new device model
+
+Changes to generic, samsung and sharp panel drivers
+---
+ drivers/video/omap2/displays/panel-generic.c | 72 ++++++++++--------
+ .../omap2/displays/panel-samsung-lte430wq-f0c.c | 77 ++++++++++---------
+ .../video/omap2/displays/panel-sharp-ls037v7dw01.c | 79 ++++++++++----------
+ 3 files changed, 122 insertions(+), 106 deletions(-)
+
+diff --git a/drivers/video/omap2/displays/panel-generic.c b/drivers/video/omap2/displays/panel-generic.c
+index 8382acb..738147e 100644
+--- a/drivers/video/omap2/displays/panel-generic.c
++++ b/drivers/video/omap2/displays/panel-generic.c
+@@ -22,73 +22,81 @@
+
+ #include <mach/display.h>
+
+-static int generic_panel_init(struct omap_display *display)
++static struct omap_video_timings generic_panel_timings = {
++ /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
++ .x_res = 640,
++ .y_res = 480,
++ .pixel_clock = 23500,
++ .hfp = 48,
++ .hsw = 32,
++ .hbp = 80,
++ .vfp = 3,
++ .vsw = 4,
++ .vbp = 7,
++};
++
++static int generic_panel_probe(struct omap_dss_device *dssdev)
+ {
++ dssdev->panel.config = OMAP_DSS_LCD_TFT;
++ dssdev->panel.timings = generic_panel_timings;
++
+ return 0;
+ }
+
+-static int generic_panel_enable(struct omap_display *display)
++static void generic_panel_remove(struct omap_dss_device *dssdev)
++{
++}
++
++static int generic_panel_enable(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+- if (display->hw_config.panel_enable)
+- r = display->hw_config.panel_enable(display);
++ if (dssdev->platform_enable)
++ r = dssdev->platform_enable(dssdev);
+
+ return r;
+ }
+
+-static void generic_panel_disable(struct omap_display *display)
++static void generic_panel_disable(struct omap_dss_device *dssdev)
+ {
+- if (display->hw_config.panel_disable)
+- display->hw_config.panel_disable(display);
++ if (dssdev->platform_disable)
++ dssdev->platform_disable(dssdev);
+ }
+
+-static int generic_panel_suspend(struct omap_display *display)
++static int generic_panel_suspend(struct omap_dss_device *dssdev)
+ {
+- generic_panel_disable(display);
++ generic_panel_disable(dssdev);
+ return 0;
+ }
+
+-static int generic_panel_resume(struct omap_display *display)
++static int generic_panel_resume(struct omap_dss_device *dssdev)
+ {
+- return generic_panel_enable(display);
++ return generic_panel_enable(dssdev);
+ }
+
+-static struct omap_panel generic_panel = {
+- .owner = THIS_MODULE,
+- .name = "panel-generic",
+- .init = generic_panel_init,
++static struct omap_dss_driver generic_driver = {
++ .probe = generic_panel_probe,
++ .remove = generic_panel_remove,
++
+ .enable = generic_panel_enable,
+ .disable = generic_panel_disable,
+ .suspend = generic_panel_suspend,
+ .resume = generic_panel_resume,
+
+- .timings = {
+- /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
+- .x_res = 640,
+- .y_res = 480,
+- .pixel_clock = 23500,
+- .hfp = 48,
+- .hsw = 32,
+- .hbp = 80,
+- .vfp = 3,
+- .vsw = 4,
+- .vbp = 7,
++ .driver = {
++ .name = "generic_panel",
++ .owner = THIS_MODULE,
+ },
+-
+- .config = OMAP_DSS_LCD_TFT,
+ };
+
+-
+ static int __init generic_panel_drv_init(void)
+ {
+- omap_dss_register_panel(&generic_panel);
+- return 0;
++ return omap_dss_register_driver(&generic_driver);
+ }
+
+ static void __exit generic_panel_drv_exit(void)
+ {
+- omap_dss_unregister_panel(&generic_panel);
++ omap_dss_unregister_driver(&generic_driver);
+ }
+
+ module_init(generic_panel_drv_init);
+diff --git a/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c
+index e4bb781..eafe581 100644
+--- a/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c
++++ b/drivers/video/omap2/displays/panel-samsung-lte430wq-f0c.c
+@@ -21,86 +21,91 @@
+
+ #include <mach/display.h>
+
+-static int samsung_lte_panel_init(struct omap_display *display)
++static struct omap_video_timings samsung_lte_timings = {
++ .x_res = 480,
++ .y_res = 272,
++
++ .pixel_clock = 9200,
++
++ .hsw = 41,
++ .hfp = 8,
++ .hbp = 45-41,
++
++ .vsw = 10,
++ .vfp = 4,
++ .vbp = 12-10,
++};
++
++static int samsung_lte_panel_probe(struct omap_dss_device *dssdev)
+ {
++ dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
++ OMAP_DSS_LCD_IHS;
++ dssdev->panel.timings = samsung_lte_timings;
++
+ return 0;
+ }
+
+-static void samsung_lte_panel_cleanup(struct omap_display *display)
++static void samsung_lte_panel_remove(struct omap_dss_device *dssdev)
+ {
+ }
+
+-static int samsung_lte_panel_enable(struct omap_display *display)
++static int samsung_lte_panel_enable(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+ /* wait couple of vsyncs until enabling the LCD */
+ msleep(50);
+
+- if (display->hw_config.panel_enable)
+- r = display->hw_config.panel_enable(display);
++ if (dssdev->platform_enable)
++ r = dssdev->platform_enable(dssdev);
+
+ return r;
+ }
+
+-static void samsung_lte_panel_disable(struct omap_display *display)
++static void samsung_lte_panel_disable(struct omap_dss_device *dssdev)
+ {
+- if (display->hw_config.panel_disable)
+- display->hw_config.panel_disable(display);
++ if (dssdev->platform_disable)
++ dssdev->platform_disable(dssdev);
+
+ /* wait at least 5 vsyncs after disabling the LCD */
++
+ msleep(100);
+ }
+
+-static int samsung_lte_panel_suspend(struct omap_display *display)
++static int samsung_lte_panel_suspend(struct omap_dss_device *dssdev)
+ {
+- samsung_lte_panel_disable(display);
++ samsung_lte_panel_disable(dssdev);
+ return 0;
+ }
+
+-static int samsung_lte_panel_resume(struct omap_display *display)
++static int samsung_lte_panel_resume(struct omap_dss_device *dssdev)
+ {
+- return samsung_lte_panel_enable(display);
++ return samsung_lte_panel_enable(dssdev);
+ }
+
+-static struct omap_panel samsung_lte_panel = {
+- .owner = THIS_MODULE,
+- .name = "samsung-lte430wq-f0c",
+- .init = samsung_lte_panel_init,
+- .cleanup = samsung_lte_panel_cleanup,
++static struct omap_dss_driver samsung_lte_driver = {
++ .probe = samsung_lte_panel_probe,
++ .remove = samsung_lte_panel_remove,
++
+ .enable = samsung_lte_panel_enable,
+ .disable = samsung_lte_panel_disable,
+ .suspend = samsung_lte_panel_suspend,
+ .resume = samsung_lte_panel_resume,
+
+- .timings = {
+- .x_res = 480,
+- .y_res = 272,
+-
+- .pixel_clock = 9200,
+-
+- .hsw = 41,
+- .hfp = 8,
+- .hbp = 45-41,
+-
+- .vsw = 10,
+- .vfp = 4,
+- .vbp = 12-10,
++ .driver = {
++ .name = "samsung_lte_panel",
++ .owner = THIS_MODULE,
+ },
+-
+- .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IVS,
+ };
+
+-
+ static int __init samsung_lte_panel_drv_init(void)
+ {
+- omap_dss_register_panel(&samsung_lte_panel);
+- return 0;
++ return omap_dss_register_driver(&samsung_lte_driver);
+ }
+
+ static void __exit samsung_lte_panel_drv_exit(void)
+ {
+- omap_dss_unregister_panel(&samsung_lte_panel);
++ omap_dss_unregister_driver(&samsung_lte_driver);
+ }
+
+ module_init(samsung_lte_panel_drv_init);
+diff --git a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
+index 1f99150..6b93ea5 100644
+--- a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
++++ b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
+@@ -22,89 +22,92 @@
+
+ #include <mach/display.h>
+
+-static int sharp_ls_panel_init(struct omap_display *display)
++static struct omap_video_timings sharp_ls_timings = {
++ .x_res = 480,
++ .y_res = 640,
++
++ .pixel_clock = 19200,
++
++ .hsw = 2,
++ .hfp = 1,
++ .hbp = 28,
++
++ .vsw = 1,
++ .vfp = 1,
++ .vbp = 1,
++};
++
++static int sharp_ls_panel_probe(struct omap_dss_device *dssdev)
+ {
++ dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
++ OMAP_DSS_LCD_IHS;
++ dssdev->panel.acb = 0x28;
++ dssdev->panel.timings = sharp_ls_timings;
++
+ return 0;
+ }
+
+-static void sharp_ls_panel_cleanup(struct omap_display *display)
++static void sharp_ls_panel_remove(struct omap_dss_device *dssdev)
+ {
+ }
+
+-static int sharp_ls_panel_enable(struct omap_display *display)
++static int sharp_ls_panel_enable(struct omap_dss_device *dssdev)
+ {
+ int r = 0;
+
+ /* wait couple of vsyncs until enabling the LCD */
+ msleep(50);
+
+- if (display->hw_config.panel_enable)
+- r = display->hw_config.panel_enable(display);
++ if (dssdev->platform_enable)
++ r = dssdev->platform_enable(dssdev);
+
+ return r;
+ }
+
+-static void sharp_ls_panel_disable(struct omap_display *display)
++static void sharp_ls_panel_disable(struct omap_dss_device *dssdev)
+ {
+- if (display->hw_config.panel_disable)
+- display->hw_config.panel_disable(display);
++ if (dssdev->platform_disable)
++ dssdev->platform_disable(dssdev);
+
+ /* wait at least 5 vsyncs after disabling the LCD */
+
+ msleep(100);
+ }
+
+-static int sharp_ls_panel_suspend(struct omap_display *display)
++static int sharp_ls_panel_suspend(struct omap_dss_device *dssdev)
+ {
+- sharp_ls_panel_disable(display);
++ sharp_ls_panel_disable(dssdev);
+ return 0;
+ }
+
+-static int sharp_ls_panel_resume(struct omap_display *display)
++static int sharp_ls_panel_resume(struct omap_dss_device *dssdev)
+ {
+- return sharp_ls_panel_enable(display);
++ return sharp_ls_panel_enable(dssdev);
+ }
+
+-static struct omap_panel sharp_ls_panel = {
+- .owner = THIS_MODULE,
+- .name = "sharp-ls037v7dw01",
+- .init = sharp_ls_panel_init,
+- .cleanup = sharp_ls_panel_cleanup,
++static struct omap_dss_driver sharp_ls_driver = {
++ .probe = sharp_ls_panel_probe,
++ .remove = sharp_ls_panel_remove,
++
+ .enable = sharp_ls_panel_enable,
+ .disable = sharp_ls_panel_disable,
+ .suspend = sharp_ls_panel_suspend,
+ .resume = sharp_ls_panel_resume,
+
+- .timings = {
+- .x_res = 480,
+- .y_res = 640,
+-
+- .pixel_clock = 19200,
+-
+- .hsw = 2,
+- .hfp = 1,
+- .hbp = 28,
+-
+- .vsw = 1,
+- .vfp = 1,
+- .vbp = 1,
++ .driver = {
++ .name = "sharp_ls_panel",
++ .owner = THIS_MODULE,
+ },
+-
+- .acb = 0x28,
+-
+- .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS,
+ };
+
+-
+ static int __init sharp_ls_panel_drv_init(void)
+ {
+- omap_dss_register_panel(&sharp_ls_panel);
+- return 0;
++ return omap_dss_register_driver(&sharp_ls_driver);
+ }
+
+ static void __exit sharp_ls_panel_drv_exit(void)
+ {
+- omap_dss_unregister_panel(&sharp_ls_panel);
++ omap_dss_unregister_driver(&sharp_ls_driver);
+ }
+
+ module_init(sharp_ls_panel_drv_init);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0090-DSS2-VENC-venc-uses-regulator-framework.patch b/recipes/linux/linux-omap-pm/dss2/0090-DSS2-VENC-venc-uses-regulator-framework.patch
new file mode 100644
index 0000000000..91870fe489
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0090-DSS2-VENC-venc-uses-regulator-framework.patch
@@ -0,0 +1,74 @@
+From 5c06f74553d932aee9cba73ca2620a16f1bb610e Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 28 May 2009 17:01:35 +0300
+Subject: [PATCH 090/146] DSS2: VENC: venc uses regulator framework
+
+Venc needs vdda_dac regulator
+---
+ drivers/video/omap2/dss/venc.c | 15 +++++++++++++++
+ 1 files changed, 15 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index a83d170..d06dc38 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -32,6 +32,7 @@
+ #include <linux/string.h>
+ #include <linux/seq_file.h>
+ #include <linux/platform_device.h>
++#include <linux/regulator/consumer.h>
+
+ #include <mach/display.h>
+ #include <mach/cpu.h>
+@@ -291,6 +292,7 @@ static struct {
+ void __iomem *base;
+ struct mutex venc_lock;
+ u32 wss_data;
++ struct regulator *vdda_dac_reg;
+ } venc;
+
+ static inline void venc_write_reg(int idx, u32 val)
+@@ -480,6 +482,13 @@ int venc_init(struct platform_device *pdev)
+ return -ENOMEM;
+ }
+
++ venc.vdda_dac_reg = regulator_get(&pdev->dev, "vdda_dac");
++ if (IS_ERR(venc.vdda_dac_reg)) {
++ iounmap(venc.base);
++ DSSERR("can't get VDDA_DAC regulator\n");
++ return PTR_ERR(venc.vdda_dac_reg);
++ }
++
+ venc_enable_clocks(1);
+
+ rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff);
+@@ -496,6 +505,8 @@ void venc_exit(void)
+ {
+ omap_dss_unregister_driver(&venc_driver);
+
++ regulator_put(venc.vdda_dac_reg);
++
+ iounmap(venc.base);
+ }
+
+@@ -521,6 +532,8 @@ static void venc_power_on(struct omap_dss_device *dssdev)
+ dispc_set_digit_size(dssdev->panel.timings.x_res,
+ dssdev->panel.timings.y_res/2);
+
++ regulator_enable(venc.vdda_dac_reg);
++
+ if (dssdev->platform_enable)
+ dssdev->platform_enable(dssdev);
+
+@@ -537,6 +550,8 @@ static void venc_power_off(struct omap_dss_device *dssdev)
+ if (dssdev->platform_disable)
+ dssdev->platform_disable(dssdev);
+
++ regulator_disable(venc.vdda_dac_reg);
++
+ venc_enable_clocks(0);
+ }
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0091-DSS2-DSI-Use-regulator-framework.patch b/recipes/linux/linux-omap-pm/dss2/0091-DSS2-DSI-Use-regulator-framework.patch
new file mode 100644
index 0000000000..a9dbe70560
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0091-DSS2-DSI-Use-regulator-framework.patch
@@ -0,0 +1,134 @@
+From d643b84bbc463075017b5ec61406455ad8e55374 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 28 May 2009 17:19:48 +0300
+Subject: [PATCH 091/146] DSS2: DSI: Use regulator framework
+
+DSI needs vdds_dsi regulator
+---
+ arch/arm/plat-omap/include/mach/display.h | 2 --
+ drivers/video/omap2/dss/core.c | 24 ------------------------
+ drivers/video/omap2/dss/dsi.c | 18 +++++++++++++++---
+ 3 files changed, 15 insertions(+), 29 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 57bb8ff..94585ba 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -219,8 +219,6 @@ struct omap_dss_board_info {
+ int num_devices;
+ struct omap_dss_device **devices;
+ struct omap_dss_device *default_device;
+- int (*dsi_power_up)(void);
+- void (*dsi_power_down)(void);
+ };
+
+ struct omap_video_timings {
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index c56c431..212b774 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -411,30 +411,6 @@ static void dss_uninitialize_debugfs(void)
+ }
+ #endif /* CONFIG_DEBUG_FS && CONFIG_OMAP2_DSS_DEBUG_SUPPORT */
+
+-
+-/* DSI powers */
+-int dss_dsi_power_up(void)
+-{
+- struct omap_dss_board_info *pdata = core.pdev->dev.platform_data;
+-
+- if (!pdata->dsi_power_up)
+- return 0; /* presume power is always on then */
+-
+- return pdata->dsi_power_up();
+-}
+-
+-void dss_dsi_power_down(void)
+-{
+- struct omap_dss_board_info *pdata = core.pdev->dev.platform_data;
+-
+- if (!pdata->dsi_power_down)
+- return;
+-
+- pdata->dsi_power_down();
+-}
+-
+-
+-
+ /* PLATFORM DEVICE */
+ static int omap_dss_probe(struct platform_device *pdev)
+ {
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index fb2f7f0..9c8488e 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -31,6 +31,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/kfifo.h>
+ #include <linux/platform_device.h>
++#include <linux/regulator/consumer.h>
+
+ #include <mach/board.h>
+ #include <mach/display.h>
+@@ -256,6 +257,8 @@ static struct
+ unsigned long dsiphy; /* Hz */
+ unsigned long ddr_clk; /* Hz */
+
++ struct regulator *vdds_dsi_reg;
++
+ struct {
+ struct omap_dss_device *dssdev;
+ enum fifo_size fifo_size;
+@@ -1177,7 +1180,7 @@ int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv)
+ goto err0;
+ }
+
+- r = dss_dsi_power_up();
++ r = regulator_enable(dsi.vdds_dsi_reg);
+ if (r)
+ goto err0;
+
+@@ -1212,7 +1215,7 @@ int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv)
+
+ return 0;
+ err1:
+- dss_dsi_power_down();
++ regulator_disable(dsi.vdds_dsi_reg);
+ err0:
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
+@@ -1226,7 +1229,7 @@ void dsi_pll_uninit(void)
+
+ dsi.pll_locked = 0;
+ dsi_pll_power(DSI_PLL_POWER_OFF);
+- dss_dsi_power_down();
++ regulator_disable(dsi.vdds_dsi_reg);
+ DSSDBG("PLL uninit done\n");
+ }
+
+@@ -3898,6 +3901,13 @@ int dsi_init(struct platform_device *pdev)
+ return -ENOMEM;
+ }
+
++ dsi.vdds_dsi_reg = regulator_get(&pdev->dev, "vdds_dsi");
++ if (IS_ERR(dsi.vdds_dsi_reg)) {
++ iounmap(dsi.base);
++ DSSERR("can't get VDDS_DSI regulator\n");
++ return PTR_ERR(dsi.vdds_dsi_reg);
++ }
++
+ enable_clocks(1);
+
+ rev = dsi_read_reg(DSI_REVISION);
+@@ -3914,6 +3924,8 @@ void dsi_exit(void)
+ flush_workqueue(dsi.workqueue);
+ destroy_workqueue(dsi.workqueue);
+
++ regulator_put(dsi.vdds_dsi_reg);
++
+ iounmap(dsi.base);
+
+ kfifo_free(dsi.cmd_fifo);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0092-DSS2-SDP-regulators-for-VDAC-DSI.patch b/recipes/linux/linux-omap-pm/dss2/0092-DSS2-SDP-regulators-for-VDAC-DSI.patch
new file mode 100644
index 0000000000..76e0710032
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0092-DSS2-SDP-regulators-for-VDAC-DSI.patch
@@ -0,0 +1,225 @@
+From 5243c9ebcadbb074a381769fab9dff266c9d6a84 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 29 May 2009 12:07:07 +0300
+Subject: [PATCH 092/146] DSS2: SDP: regulators for VDAC, DSI
+
+---
+ arch/arm/mach-omap2/board-3430sdp.c | 114 +++++-----------------------------
+ 1 files changed, 17 insertions(+), 97 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
+index ec0c358..ef8cf4f 100644
+--- a/arch/arm/mach-omap2/board-3430sdp.c
++++ b/arch/arm/mach-omap2/board-3430sdp.c
+@@ -150,65 +150,14 @@ static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
+ };
+
+
+-#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91
+-#define SDP2430_LCD_PANEL_ENABLE_GPIO 154
+-#if 0
+-#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 24
+-#define SDP3430_LCD_PANEL_ENABLE_GPIO 28
+-#else
+ #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8
+ #define SDP3430_LCD_PANEL_ENABLE_GPIO 5
+-#endif
+-
+-#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER
+-#define ENABLE_VAUX2_DEDICATED 0x09
+-#define ENABLE_VAUX2_DEV_GRP 0x20
+-#define ENABLE_VAUX3_DEDICATED 0x03
+-#define ENABLE_VAUX3_DEV_GRP 0x20
+-
+-#define ENABLE_VPLL2_DEDICATED 0x05
+-#define ENABLE_VPLL2_DEV_GRP 0xE0
+-#define TWL4030_VPLL2_DEV_GRP 0x33
+-#define TWL4030_VPLL2_DEDICATED 0x36
+-
+-#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v)
+
+ static unsigned backlight_gpio;
+ static unsigned enable_gpio;
+ static int lcd_enabled;
+ static int dvi_enabled;
+
+-static void enable_vpll2(int enable)
+-{
+- u8 ded_val, grp_val;
+-
+- if (enable) {
+- ded_val = ENABLE_VPLL2_DEDICATED;
+- grp_val = ENABLE_VPLL2_DEV_GRP;
+- } else {
+- ded_val = 0;
+- grp_val = 0;
+- }
+-
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ded_val, TWL4030_VPLL2_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- grp_val, TWL4030_VPLL2_DEV_GRP);
+-}
+-
+-static int sdp3430_dsi_power_up(void)
+-{
+- if (omap_rev() > OMAP3430_REV_ES1_0)
+- enable_vpll2(1);
+- return 0;
+-}
+-
+-static void sdp3430_dsi_power_down(void)
+-{
+- if (omap_rev() > OMAP3430_REV_ES1_0)
+- enable_vpll2(0);
+-}
+-
+ static void __init sdp3430_display_init(void)
+ {
+ int r;
+@@ -240,29 +189,14 @@ err0:
+
+ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
+ {
+- u8 ded_val, ded_reg;
+- u8 grp_val, grp_reg;
+-
+ if (dvi_enabled) {
+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+ return -EINVAL;
+ }
+
+- ded_reg = TWL4030_VAUX3_DEDICATED;
+- ded_val = ENABLE_VAUX3_DEDICATED;
+- grp_reg = TWL4030_VAUX3_DEV_GRP;
+- grp_val = ENABLE_VAUX3_DEV_GRP;
+-
+ gpio_direction_output(enable_gpio, 1);
+ gpio_direction_output(backlight_gpio, 1);
+
+- if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg))
+- return -EIO;
+- if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg))
+- return -EIO;
+-
+- sdp3430_dsi_power_up();
+-
+ lcd_enabled = 1;
+
+ return 0;
+@@ -272,8 +206,6 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
+ {
+ lcd_enabled = 0;
+
+- sdp3430_dsi_power_down();
+-
+ gpio_direction_output(enable_gpio, 0);
+ gpio_direction_output(backlight_gpio, 0);
+ }
+@@ -285,8 +217,6 @@ static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
+ return -EINVAL;
+ }
+
+- sdp3430_dsi_power_up();
+-
+ dvi_enabled = 1;
+
+ return 0;
+@@ -294,31 +224,16 @@ static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
+
+ static void sdp3430_panel_disable_dvi(struct omap_dss_device *dssdev)
+ {
+- sdp3430_dsi_power_down();
+-
+ dvi_enabled = 0;
+ }
+
+ static int sdp3430_panel_enable_tv(struct omap_dss_device *dssdev)
+ {
+-#define ENABLE_VDAC_DEDICATED 0x03
+-#define ENABLE_VDAC_DEV_GRP 0x20
+-
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEDICATED,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
+-
+ return 0;
+ }
+
+ static void sdp3430_panel_disable_tv(struct omap_dss_device *dssdev)
+ {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEV_GRP);
+ }
+
+
+@@ -360,8 +275,6 @@ static struct omap_dss_board_info sdp3430_dss_data = {
+ .num_devices = ARRAY_SIZE(sdp3430_dss_devices),
+ .devices = sdp3430_dss_devices,
+ .default_device = &sdp3430_lcd_device,
+- .dsi_power_up = sdp3430_dsi_power_up,
+- .dsi_power_down = sdp3430_dsi_power_down,
+ };
+
+ static struct platform_device sdp3430_dss_device = {
+@@ -372,13 +285,8 @@ static struct platform_device sdp3430_dss_device = {
+ },
+ };
+
+-static struct regulator_consumer_supply sdp3430_vdac_supply = {
+- .supply = "vdac",
+- .dev = &sdp3430_dss_device.dev,
+-};
+-
+-static struct regulator_consumer_supply sdp3430_vdvi_supply = {
+- .supply = "vdvi",
++static struct regulator_consumer_supply sdp3430_vdda_dac_supply = {
++ .supply = "vdda_dac",
+ .dev = &sdp3430_dss_device.dev,
+ };
+
+@@ -605,22 +513,34 @@ static struct regulator_init_data sdp3430_vdac = {
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+- .consumer_supplies = &sdp3430_vdac_supply,
++ .consumer_supplies = &sdp3430_vdda_dac_supply,
+ };
+
+ /* VPLL2 for digital video outputs */
++static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
++ {
++ .supply = "vdvi",
++ .dev = &sdp3430_lcd_device.dev,
++ },
++ {
++ .supply = "vdds_dsi",
++ .dev = &sdp3430_dss_device.dev,
++ }
++};
++
+ static struct regulator_init_data sdp3430_vpll2 = {
+ .constraints = {
+ .name = "VDVI",
+ .min_uV = 1800000,
+ .max_uV = 1800000,
++ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+ | REGULATOR_CHANGE_STATUS,
+ },
+- .num_consumer_supplies = 1,
+- .consumer_supplies = &sdp3430_vdvi_supply,
++ .num_consumer_supplies = ARRAY_SIZE(sdp3430_vpll2_supplies),
++ .consumer_supplies = sdp3430_vpll2_supplies,
+ };
+
+ static struct twl4030_platform_data sdp3430_twldata = {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0093-DSS2-Sharp-panel-use-regulator-fw.patch b/recipes/linux/linux-omap-pm/dss2/0093-DSS2-Sharp-panel-use-regulator-fw.patch
new file mode 100644
index 0000000000..933a22dc36
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0093-DSS2-Sharp-panel-use-regulator-fw.patch
@@ -0,0 +1,100 @@
+From feaf5b69b627c85e3ea40accf50ab5771125cf00 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 29 May 2009 12:07:27 +0300
+Subject: [PATCH 093/146] DSS2: Sharp panel: use regulator fw
+
+---
+ .../video/omap2/displays/panel-sharp-ls037v7dw01.c | 38 ++++++++++++++++++++
+ 1 files changed, 38 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
+index 6b93ea5..cb8ce34 100644
+--- a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
++++ b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c
+@@ -19,9 +19,20 @@
+
+ #include <linux/module.h>
+ #include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/regulator/consumer.h>
++#include <linux/err.h>
+
+ #include <mach/display.h>
+
++struct sharp_data {
++ /* XXX This regulator should actually be in SDP board file, not here,
++ * as it doesn't actually power the LCD, but something else that
++ * affects the output to LCD (I think. Somebody clarify). It doesn't do
++ * harm here, as SDP is the only board using this currently */
++ struct regulator *vdvi_reg;
++};
++
+ static struct omap_video_timings sharp_ls_timings = {
+ .x_res = 480,
+ .y_res = 640,
+@@ -39,25 +50,48 @@ static struct omap_video_timings sharp_ls_timings = {
+
+ static int sharp_ls_panel_probe(struct omap_dss_device *dssdev)
+ {
++ struct sharp_data *sd;
++
+ dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
+ OMAP_DSS_LCD_IHS;
+ dssdev->panel.acb = 0x28;
+ dssdev->panel.timings = sharp_ls_timings;
+
++ sd = kzalloc(sizeof(*sd), GFP_KERNEL);
++ if (!sd)
++ return -ENOMEM;
++
++ dev_set_drvdata(&dssdev->dev, sd);
++
++ sd->vdvi_reg = regulator_get(&dssdev->dev, "vdvi");
++ if (IS_ERR(sd->vdvi_reg)) {
++ kfree(sd);
++ printk("failed to get VDVI regulator\n");
++ return PTR_ERR(sd->vdvi_reg);
++ }
++
+ return 0;
+ }
+
+ static void sharp_ls_panel_remove(struct omap_dss_device *dssdev)
+ {
++ struct sharp_data *sd = dev_get_drvdata(&dssdev->dev);
++
++ regulator_put(sd->vdvi_reg);
++
++ kfree(sd);
+ }
+
+ static int sharp_ls_panel_enable(struct omap_dss_device *dssdev)
+ {
++ struct sharp_data *sd = dev_get_drvdata(&dssdev->dev);
+ int r = 0;
+
+ /* wait couple of vsyncs until enabling the LCD */
+ msleep(50);
+
++ regulator_enable(sd->vdvi_reg);
++
+ if (dssdev->platform_enable)
+ r = dssdev->platform_enable(dssdev);
+
+@@ -66,9 +100,13 @@ static int sharp_ls_panel_enable(struct omap_dss_device *dssdev)
+
+ static void sharp_ls_panel_disable(struct omap_dss_device *dssdev)
+ {
++ struct sharp_data *sd = dev_get_drvdata(&dssdev->dev);
++
+ if (dssdev->platform_disable)
+ dssdev->platform_disable(dssdev);
+
++ regulator_disable(sd->vdvi_reg);
++
+ /* wait at least 5 vsyncs after disabling the LCD */
+
+ msleep(100);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0094-DSS2-Beagle-regulators-for-VDAC-DSI.patch b/recipes/linux/linux-omap-pm/dss2/0094-DSS2-Beagle-regulators-for-VDAC-DSI.patch
new file mode 100644
index 0000000000..e57a433e3a
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0094-DSS2-Beagle-regulators-for-VDAC-DSI.patch
@@ -0,0 +1,52 @@
+From bf864e242e238f99124d63be457d2783d28894c9 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 29 May 2009 13:52:50 +0300
+Subject: [PATCH 094/146] DSS2: Beagle: regulators for VDAC, DSI
+
+---
+ arch/arm/mach-omap2/board-omap3beagle.c | 12 ++++++------
+ 1 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 67e1d5c..977bbbe 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -184,13 +184,13 @@ static struct platform_device beagle_dss_device = {
+ },
+ };
+
+-static struct regulator_consumer_supply beagle_vdac_supply = {
+- .supply = "vdac",
++static struct regulator_consumer_supply beagle_vdda_dac_supply = {
++ .supply = "vdda_dac",
+ .dev = &beagle_dss_device.dev,
+ };
+
+-static struct regulator_consumer_supply beagle_vdvi_supply = {
+- .supply = "vdvi",
++static struct regulator_consumer_supply beagle_vdds_dsi_supply = {
++ .supply = "vdds_dsi",
+ .dev = &beagle_dss_device.dev,
+ };
+
+@@ -322,7 +322,7 @@ static struct regulator_init_data beagle_vdac = {
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+- .consumer_supplies = &beagle_vdac_supply,
++ .consumer_supplies = &beagle_vdda_dac_supply,
+ };
+
+ /* VPLL2 for digital video outputs */
+@@ -337,7 +337,7 @@ static struct regulator_init_data beagle_vpll2 = {
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+- .consumer_supplies = &beagle_vdvi_supply,
++ .consumer_supplies = &beagle_vdds_dsi_supply,
+ };
+
+ static struct twl4030_platform_data beagle_twldata = {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0095-DSS2-Fix-checkpatch-complaints.patch b/recipes/linux/linux-omap-pm/dss2/0095-DSS2-Fix-checkpatch-complaints.patch
new file mode 100644
index 0000000000..3c5959d4f5
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0095-DSS2-Fix-checkpatch-complaints.patch
@@ -0,0 +1,740 @@
+From 978ac67a1c8f75579548ee692312fb69986e6cb0 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 1 Jun 2009 18:02:00 +0300
+Subject: [PATCH 095/146] DSS2: Fix checkpatch complaints
+
+---
+ arch/arm/plat-omap/vrfb.c | 9 ++---
+ drivers/video/omap2/dss/core.c | 9 +++--
+ drivers/video/omap2/dss/dispc.c | 35 +++++++++++++-----
+ drivers/video/omap2/dss/display.c | 39 +++++++++++---------
+ drivers/video/omap2/dss/dsi.c | 32 ++++++++++------
+ drivers/video/omap2/dss/manager.c | 12 ++++---
+ drivers/video/omap2/dss/overlay.c | 56 ++++++++++++++++++++---------
+ drivers/video/omap2/dss/venc.c | 9 ++---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 5 ++-
+ drivers/video/omap2/omapfb/omapfb-main.c | 35 +++++++++---------
+ drivers/video/omap2/omapfb/omapfb-sysfs.c | 17 +++++----
+ 11 files changed, 158 insertions(+), 100 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 59ac66a..0c7d943 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -1,9 +1,8 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/ioport.h>
+-
+-#include <asm/io.h>
+-#include <asm/bitops.h>
++#include <linux/io.h>
++#include <linux/bitops.h>
+
+ #include <mach/io.h>
+ #include <mach/vrfb.h>
+@@ -55,7 +54,7 @@ static struct {
+ u32 size;
+ } vrfb_hw_context[VRFB_NUM_CTXS];
+
+-static void inline restore_hw_context(int ctx)
++static inline void restore_hw_context(int ctx)
+ {
+ omap_writel(vrfb_hw_context[ctx].control, SMS_ROT_CONTROL(ctx));
+ omap_writel(vrfb_hw_context[ctx].size, SMS_ROT_SIZE(ctx));
+@@ -180,7 +179,7 @@ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+ clear_bit(ctx, &ctx_map);
+
+ for (rot = 0; rot < 4; ++rot) {
+- if(vrfb->paddr[rot]) {
++ if (vrfb->paddr[rot]) {
+ release_mem_region(vrfb->paddr[rot], OMAP_VRFB_SIZE);
+ vrfb->paddr[rot] = 0;
+ }
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index 212b774..3f544dc 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -73,8 +73,8 @@ static int dss_get_ctx_id(void)
+ return 0;
+ r = pdata->get_last_off_on_transaction_id(&core.pdev->dev);
+ if (r < 0) {
+- dev_err(&core.pdev->dev,
+- "getting transaction ID failed, will force context restore\n");
++ dev_err(&core.pdev->dev, "getting transaction ID failed, "
++ "will force context restore\n");
+ r = -1;
+ }
+ return r;
+@@ -157,7 +157,7 @@ static int dss_get_clocks(void)
+ char *omap2_name;
+ char *omap3_name;
+ } clocks[5] = {
+- { &core.dss_ick, "dss_ick", "dss_ick" }, /* L3 & L4 ick */
++ { &core.dss_ick, "dss_ick", "dss_ick" }, /* L3 & L4 ick */
+ { &core.dss1_fck, "dss1_fck", "dss1_alwon_fck" },
+ { &core.dss2_fck, "dss2_fck", "dss2_alwon_fck" },
+ { &core.dss_54m_fck, "dss_54m_fck", "dss_tv_fck" },
+@@ -766,7 +766,8 @@ static void reset_device(struct device *dev, int check)
+ dev->platform_data = NULL;
+ while (dev_p < dev_end) {
+ if (*dev_p) {
+- WARN("%s: struct device fields will be discarded\n",
++ WARN("%s: struct device fields will be "
++ "discarded\n",
+ __func__);
+ break;
+ }
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 52170f8..229c4b1 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1120,17 +1120,33 @@ static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation,
+
+ if (mirroring) {
+ switch (rotation) {
+- case 0: vidrot = 2; break;
+- case 1: vidrot = 1; break;
+- case 2: vidrot = 0; break;
+- case 3: vidrot = 3; break;
++ case 0:
++ vidrot = 2;
++ break;
++ case 1:
++ vidrot = 1;
++ break;
++ case 2:
++ vidrot = 0;
++ break;
++ case 3:
++ vidrot = 3;
++ break;
+ }
+ } else {
+ switch (rotation) {
+- case 0: vidrot = 0; break;
+- case 1: vidrot = 1; break;
+- case 2: vidrot = 2; break;
+- case 3: vidrot = 3; break;
++ case 0:
++ vidrot = 0;
++ break;
++ case 1:
++ vidrot = 1;
++ break;
++ case 2:
++ vidrot = 2;
++ break;
++ case 3:
++ vidrot = 3;
++ break;
+ }
+ }
+
+@@ -1923,7 +1939,8 @@ bool dispc_trans_key_enabled(enum omap_channel ch)
+ enabled = REG_GET(DISPC_CONFIG, 10, 10);
+ else if (ch == OMAP_DSS_CHANNEL_DIGIT)
+ enabled = REG_GET(DISPC_CONFIG, 12, 12);
+- else BUG();
++ else
++ BUG();
+ enable_clocks(0);
+
+ return enabled;
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 2251bff..20fb1ca 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -85,16 +85,17 @@ static ssize_t display_upd_mode_store(struct device *dev,
+ val = simple_strtoul(buf, NULL, 10);
+
+ switch (val) {
+- case OMAP_DSS_UPDATE_DISABLED:
+- case OMAP_DSS_UPDATE_AUTO:
+- case OMAP_DSS_UPDATE_MANUAL:
+- mode = (enum omap_dss_update_mode)val;
+- break;
+- default:
+- return -EINVAL;
++ case OMAP_DSS_UPDATE_DISABLED:
++ case OMAP_DSS_UPDATE_AUTO:
++ case OMAP_DSS_UPDATE_MANUAL:
++ mode = (enum omap_dss_update_mode)val;
++ break;
++ default:
++ return -EINVAL;
+ }
+
+- if ((r = dssdev->set_update_mode(dssdev, mode)))
++ r = dssdev->set_update_mode(dssdev, mode);
++ if (r)
+ return r;
+
+ return size;
+@@ -120,7 +121,8 @@ static ssize_t display_tear_store(struct device *dev,
+
+ te = simple_strtoul(buf, NULL, 0);
+
+- if ((r = dssdev->enable_te(dssdev, te)))
++ r = dssdev->enable_te(dssdev, te);
++ if (r)
+ return r;
+
+ return size;
+@@ -169,7 +171,8 @@ static ssize_t display_timings_store(struct device *dev,
+ &t.y_res, &t.vfp, &t.vbp, &t.vsw) != 9)
+ return -EINVAL;
+
+- if ((r = dssdev->check_timings(dssdev, &t)))
++ r = dssdev->check_timings(dssdev, &t);
++ if (r)
+ return r;
+
+ dssdev->set_timings(dssdev, &t);
+@@ -200,7 +203,8 @@ static ssize_t display_rotate_store(struct device *dev,
+
+ rot = simple_strtoul(buf, NULL, 0);
+
+- if ((r = dssdev->set_rotate(dssdev, rot)))
++ r = dssdev->set_rotate(dssdev, rot);
++ if (r)
+ return r;
+
+ return size;
+@@ -229,7 +233,8 @@ static ssize_t display_mirror_store(struct device *dev,
+
+ mirror = simple_strtoul(buf, NULL, 0);
+
+- if ((r = dssdev->set_mirror(dssdev, mirror)))
++ r = dssdev->set_mirror(dssdev, mirror);
++ if (r)
+ return r;
+
+ return size;
+@@ -265,7 +270,8 @@ static ssize_t display_wss_store(struct device *dev,
+ if (wss > 0xfffff)
+ return -EINVAL;
+
+- if ((r = dssdev->set_wss(dssdev, wss)))
++ r = dssdev->set_wss(dssdev, wss);
++ if (r)
+ return r;
+
+ return size;
+@@ -596,8 +602,7 @@ struct omap_dss_device *omap_dss_find_device(void *data,
+ {
+ struct omap_dss_device *dssdev = NULL;
+
+- while ((dssdev = omap_dss_get_next_device(dssdev)) != NULL)
+- {
++ while ((dssdev = omap_dss_get_next_device(dssdev)) != NULL) {
+ if (match(dssdev, data))
+ return dssdev;
+ }
+@@ -622,13 +627,13 @@ int omap_dss_start_device(struct omap_dss_device *dssdev)
+ goto err0;
+ }
+
+- if(!try_module_get(dssdev->dev.driver->owner)) {
++ if (!try_module_get(dssdev->dev.driver->owner)) {
+ r = -ENODEV;
+ goto err0;
+ }
+
+ if (dssdev->ctrl.panel) {
+- if(!try_module_get(dssdev->ctrl.panel->dev.driver->owner)) {
++ if (!try_module_get(dssdev->ctrl.panel->dev.driver->owner)) {
+ r = -ENODEV;
+ goto err1;
+ }
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 9c8488e..9181a45 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -448,7 +448,8 @@ static void perf_show(const char *name)
+ total_time_auto = ktime_sub(t, dsi.perf_start_time_auto);
+ total_time_auto_us = (u32)ktime_to_us(total_time_auto);
+
+- printk("DSI(%s): %u fps, setup %u/%u/%u, trans %u/%u/%u\n",
++ printk(KERN_INFO "DSI(%s): %u fps, setup %u/%u/%u, "
++ "trans %u/%u/%u\n",
+ name,
+ 1000 * 1000 * numframes / total_time_auto_us,
+ s_min_setup_us,
+@@ -466,8 +467,8 @@ static void perf_show(const char *name)
+ s_max_trans_us = 0;
+ perf_mark_start_auto();
+ } else {
+- printk("DSI(%s): %u us + %u us = %u us (%uHz), %u bytes, "
+- "%u kbytes/sec\n",
++ printk(KERN_INFO "DSI(%s): %u us + %u us = %u us (%uHz), "
++ "%u bytes, %u kbytes/sec\n",
+ name,
+ setup_us,
+ trans_us,
+@@ -844,9 +845,12 @@ int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck,
+ struct dsi_clock_info cur, best;
+ int min_fck_per_pck;
+ int match = 0;
++ unsigned long dss_clk_fck2;
++
++ dss_clk_fck2 = dss_clk_get_rate(DSS_CLK_FCK2);
+
+ if (req_pck == dsi.cache_req_pck &&
+- dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) {
++ dsi.cache_cinfo.clkin == dss_clk_fck2) {
+ DSSDBG("DSI clock info found from cache\n");
+ *cinfo = dsi.cache_cinfo;
+ return 0;
+@@ -868,7 +872,7 @@ retry:
+ memset(&best, 0, sizeof(best));
+
+ memset(&cur, 0, sizeof(cur));
+- cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2);
++ cur.clkin = dss_clk_fck2;
+ cur.use_dss2_fck = 1;
+ cur.highfreq = 0;
+
+@@ -973,11 +977,14 @@ static int dsi_pll_calc_ddrfreq(unsigned long clk_freq,
+ struct dsi_clock_info cur, best;
+ const bool use_dss2_fck = 1;
+ unsigned long datafreq;
++ unsigned long dss_clk_fck2;
+
+ DSSDBG("dsi_pll_calc_ddrfreq\n");
+
++ dss_clk_fck2 = dss_clk_get_rate(DSS_CLK_FCK2);
++
+ if (clk_freq == dsi.cache_clk_freq &&
+- dsi.cache_cinfo.clkin == dss_clk_get_rate(DSS_CLK_FCK2)) {
++ dsi.cache_cinfo.clkin == dss_clk_fck2) {
+ DSSDBG("DSI clock info found from cache\n");
+ *cinfo = dsi.cache_cinfo;
+ return 0;
+@@ -990,7 +997,7 @@ static int dsi_pll_calc_ddrfreq(unsigned long clk_freq,
+ memset(&cur, 0, sizeof(cur));
+ cur.use_dss2_fck = use_dss2_fck;
+ if (use_dss2_fck) {
+- cur.clkin = dss_clk_get_rate(DSS_CLK_FCK2);
++ cur.clkin = dss_clk_fck2;
+ cur.highfreq = 0;
+ } else {
+ cur.clkin = dispc_pclk_rate();
+@@ -2081,7 +2088,8 @@ int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen)
+ if (r)
+ return r;
+
+- if (REG_GET(DSI_VC_CTRL(channel), 20, 20) == 0) { /* RX_FIFO_NOT_EMPTY */
++ /* RX_FIFO_NOT_EMPTY */
++ if (REG_GET(DSI_VC_CTRL(channel), 20, 20) == 0) {
+ DSSERR("RX fifo empty when trying to read.\n");
+ return -EIO;
+ }
+@@ -2611,7 +2619,7 @@ static void dsi_setup_update_dispc(struct omap_dss_device *dssdev,
+ dsi.update_region.y = y;
+ dsi.update_region.w = w;
+ dsi.update_region.h = h;
+- dsi.update_region.bytespp = 3; // XXX
++ dsi.update_region.bytespp = 3; /* XXX */
+ #endif
+
+ dispc_setup_partial_planes(dssdev, &x, &y, &w, &h);
+@@ -2630,7 +2638,7 @@ static void dsi_setup_autoupdate_dispc(struct omap_dss_device *dssdev)
+ dsi.update_region.y = 0;
+ dsi.update_region.w = w;
+ dsi.update_region.h = h;
+- dsi.update_region.bytespp = 3; // XXX
++ dsi.update_region.bytespp = 3; /* XXX */
+ #endif
+
+ /* the overlay settings may not have been applied, if we were in manual
+@@ -2993,8 +3001,8 @@ static void dsi_do_cmd_set_te(struct omap_dss_device *dssdev, bool enable)
+
+ if (!dssdev->phy.dsi.ext_te) {
+ if (enable) {
+- /* disable LP_RX_TO, so that we can receive TE.
+- * Time to wait for TE is longer than the timer allows */
++ /* disable LP_RX_TO, so that we can receive TE. Time
++ * to wait for TE is longer than the timer allows */
+ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
+ } else {
+ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index c68b9af..e183fcc 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -44,7 +44,8 @@ static ssize_t manager_display_show(struct omap_overlay_manager *mgr, char *buf)
+ mgr->device ? mgr->device->name : "<none>");
+ }
+
+-static ssize_t manager_display_store(struct omap_overlay_manager *mgr, const char *buf, size_t size)
++static ssize_t manager_display_store(struct omap_overlay_manager *mgr,
++ const char *buf, size_t size)
+ {
+ int r = 0;
+ size_t len = size;
+@@ -288,7 +289,8 @@ static MANAGER_ATTR(color_key_type, S_IRUGO|S_IWUSR,
+ static MANAGER_ATTR(color_key_value, S_IRUGO|S_IWUSR,
+ manager_color_key_value_show, manager_color_key_value_store);
+ static MANAGER_ATTR(color_key_enabled, S_IRUGO|S_IWUSR,
+- manager_color_key_enabled_show, manager_color_key_enabled_store);
++ manager_color_key_enabled_show,
++ manager_color_key_enabled_store);
+ static MANAGER_ATTR(alpha_blending_enabled, S_IRUGO|S_IWUSR,
+ manager_alpha_blending_enabled_show,
+ manager_alpha_blending_enabled_store);
+@@ -305,7 +307,8 @@ static struct attribute *manager_sysfs_attrs[] = {
+ NULL
+ };
+
+-static ssize_t manager_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
++static ssize_t manager_attr_show(struct kobject *kobj, struct attribute *attr,
++ char *buf)
+ {
+ struct omap_overlay_manager *manager;
+ struct manager_attribute *manager_attr;
+@@ -504,9 +507,8 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC))
+ continue;
+
+- if (!overlay_enabled(ovl)) {
++ if (!overlay_enabled(ovl))
+ continue;
+- }
+
+ ovl->manager->device->configure_overlay(ovl);
+ }
+diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
+index 3704727..31385f3 100644
+--- a/drivers/video/omap2/dss/overlay.c
++++ b/drivers/video/omap2/dss/overlay.c
+@@ -47,7 +47,8 @@ static ssize_t overlay_manager_show(struct omap_overlay *ovl, char *buf)
+ ovl->manager ? ovl->manager->name : "<none>");
+ }
+
+-static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf, size_t size)
++static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
++ size_t size)
+ {
+ int i, r;
+ struct omap_overlay_manager *mgr = NULL;
+@@ -92,8 +93,11 @@ static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
+ }
+ }
+
+- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+- return r;
++ if (ovl->manager) {
++ r = ovl->manager->apply(ovl->manager);
++ if (r)
++ return r;
++ }
+
+ return size;
+ }
+@@ -131,11 +135,15 @@ static ssize_t overlay_position_store(struct omap_overlay *ovl,
+
+ info.pos_y = simple_strtoul(last, &last, 10);
+
+- if ((r = ovl->set_overlay_info(ovl, &info)))
++ r = ovl->set_overlay_info(ovl, &info);
++ if (r)
+ return r;
+
+- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+- return r;
++ if (ovl->manager) {
++ r = ovl->manager->apply(ovl->manager);
++ if (r)
++ return r;
++ }
+
+ return size;
+ }
+@@ -162,11 +170,15 @@ static ssize_t overlay_output_size_store(struct omap_overlay *ovl,
+
+ info.out_height = simple_strtoul(last, &last, 10);
+
+- if ((r = ovl->set_overlay_info(ovl, &info)))
++ r = ovl->set_overlay_info(ovl, &info);
++ if (r)
+ return r;
+
+- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+- return r;
++ if (ovl->manager) {
++ r = ovl->manager->apply(ovl->manager);
++ if (r)
++ return r;
++ }
+
+ return size;
+ }
+@@ -176,7 +188,8 @@ static ssize_t overlay_enabled_show(struct omap_overlay *ovl, char *buf)
+ return snprintf(buf, PAGE_SIZE, "%d\n", ovl->info.enabled);
+ }
+
+-static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf, size_t size)
++static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf,
++ size_t size)
+ {
+ int r;
+ struct omap_overlay_info info;
+@@ -185,11 +198,15 @@ static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf,
+
+ info.enabled = simple_strtoul(buf, NULL, 10);
+
+- if ((r = ovl->set_overlay_info(ovl, &info)))
++ r = ovl->set_overlay_info(ovl, &info);
++ if (r)
+ return r;
+
+- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+- return r;
++ if (ovl->manager) {
++ r = ovl->manager->apply(ovl->manager);
++ if (r)
++ return r;
++ }
+
+ return size;
+ }
+@@ -216,11 +233,15 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
+ else
+ info.global_alpha = simple_strtoul(buf, NULL, 10);
+
+- if ((r = ovl->set_overlay_info(ovl, &info)))
++ r = ovl->set_overlay_info(ovl, &info);
++ if (r)
+ return r;
+
+- if (ovl->manager && (r = ovl->manager->apply(ovl->manager)))
+- return r;
++ if (ovl->manager) {
++ r = ovl->manager->apply(ovl->manager);
++ if (r)
++ return r;
++ }
+
+ return size;
+ }
+@@ -261,7 +282,8 @@ static struct attribute *overlay_sysfs_attrs[] = {
+ NULL
+ };
+
+-static ssize_t overlay_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
++static ssize_t overlay_attr_show(struct kobject *kobj, struct attribute *attr,
++ char *buf)
+ {
+ struct omap_overlay *overlay;
+ struct overlay_attribute *overlay_attr;
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index d06dc38..740c8c0 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -320,7 +320,8 @@ static void venc_write_config(const struct venc_config *config)
+ venc_write_reg(VENC_BLACK_LEVEL, config->black_level);
+ venc_write_reg(VENC_BLANK_LEVEL, config->blank_level);
+ venc_write_reg(VENC_M_CONTROL, config->m_control);
+- venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data | venc.wss_data);
++ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
++ venc.wss_data);
+ venc_write_reg(VENC_S_CARR, config->s_carr);
+ venc_write_reg(VENC_L21__WC_CTL, config->l21__wc_ctl);
+ venc_write_reg(VENC_SAVID__EAVID, config->savid__eavid);
+@@ -406,7 +407,6 @@ static const struct venc_config *venc_timings_to_config(
+ /* driver */
+ static int venc_panel_probe(struct omap_dss_device *dssdev)
+ {
+- //dssdev->name = "tv-out";
+ dssdev->panel.timings = omap_dss_pal_timings;
+
+ return 0;
+@@ -497,8 +497,6 @@ int venc_init(struct platform_device *pdev)
+ venc_enable_clocks(0);
+
+ return omap_dss_register_driver(&venc_driver);
+-
+- //return 0;
+ }
+
+ void venc_exit(void)
+@@ -703,7 +701,8 @@ static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
+
+ venc_enable_clocks(1);
+
+- venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data | venc.wss_data);
++ venc_write_reg(VENC_BSTAMP_WSS_DATA, config->bstamp_wss_data |
++ venc.wss_data);
+
+ venc_enable_clocks(0);
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 0ca57db..806b4e7 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -299,7 +299,7 @@ static int _omapfb_set_color_key(struct omap_overlay_manager *mgr,
+ return 0;
+ }
+
+- switch(ck->key_type) {
++ switch (ck->key_type) {
+ case OMAPFB_COLOR_KEY_GFX_DST:
+ kt = OMAP_DSS_COLOR_KEY_GFX_DST;
+ break;
+@@ -646,7 +646,8 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+
+ case OMAPFB_GET_COLOR_KEY:
+ DBG("ioctl GET_COLOR_KEY\n");
+- if ((r = omapfb_get_color_key(fbi, &p.color_key)) < 0)
++ r = omapfb_get_color_key(fbi, &p.color_key);
++ if (r)
+ break;
+ if (copy_to_user((void __user *)arg, &p.color_key,
+ sizeof(p.color_key)))
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index df5ede3..4e93bd6 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -1119,7 +1119,7 @@ ssize_t omapfb_write(struct fb_info *info, const char __user *buf,
+ size_t count, loff_t *ppos)
+ {
+ DBG("omapfb_write %d, %lu\n", count, (unsigned long)*ppos);
+- // XXX needed for VRFB
++ /* XXX needed for VRFB */
+ return count;
+ }
+ #endif
+@@ -1139,7 +1139,7 @@ static struct fb_ops omapfb_ops = {
+ .fb_mmap = omapfb_mmap,
+ .fb_setcolreg = omapfb_setcolreg,
+ .fb_setcmap = omapfb_setcmap,
+- //.fb_write = omapfb_write,
++ /*.fb_write = omapfb_write,*/
+ };
+
+ static void omapfb_free_fbmem(struct fb_info *fbi)
+@@ -1237,7 +1237,7 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size,
+ /* only ioremap the 0 angle view */
+ va = ioremap_wc(rg->vrfb.paddr[0], size);
+
+- if(!va) {
++ if (!va) {
+ printk(KERN_ERR "vrfb: ioremap failed\n");
+ omap_vrfb_release_ctx(&rg->vrfb);
+ return -ENOMEM;
+@@ -1295,8 +1295,8 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
+
+ omap_vrfb_adjust_size(&w, &h, bytespp);
+
+- /* Because we change the resolution of the 0 degree view,
+- * we need to alloc max(w, h) for height */
++ /* Because we change the resolution of the 0 degree
++ * view, we need to alloc max(w, h) for height */
+ h = max(w, h);
+ w = OMAP_VRFB_LINE_LEN;
+
+@@ -1313,11 +1313,11 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
+ return omapfb_alloc_fbmem(fbi, size, paddr);
+ }
+
+-static enum omap_color_mode fb_format_to_dss_mode(enum omapfb_color_format format)
++static enum omap_color_mode fb_format_to_dss_mode(enum omapfb_color_format fmt)
+ {
+ enum omap_color_mode mode;
+
+- switch (format) {
++ switch (fmt) {
+ case OMAPFB_COLOR_RGB565:
+ mode = OMAP_DSS_COLOR_RGB16;
+ break;
+@@ -1633,15 +1633,16 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+
+ if (!var->bits_per_pixel) {
+ switch (display->get_recommended_bpp(display)) {
+- case 16:
+- var->bits_per_pixel = 16;
+- break;
+- case 24:
+- var->bits_per_pixel = 32;
+- break;
+- default:
+- dev_err(fbdev->dev, "illegal display bpp\n");
+- return -EINVAL;
++ case 16:
++ var->bits_per_pixel = 16;
++ break;
++ case 24:
++ var->bits_per_pixel = 32;
++ break;
++ default:
++ dev_err(fbdev->dev, "illegal display "
++ "bpp\n");
++ return -EINVAL;
+ }
+ }
+ } else {
+@@ -1801,7 +1802,7 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
+ if (fbdev->num_fbs > 0) {
+ struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[0]);
+
+- if (ofbi->num_overlays > 0 ) {
++ if (ofbi->num_overlays > 0) {
+ struct omap_overlay *ovl = ofbi->overlays[0];
+
+ r = omapfb_overlay_enable(ovl, 1);
+diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+index dcec42b..a00f61a 100644
+--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c
++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+@@ -72,8 +72,8 @@ static ssize_t store_rotate_type(struct device *dev,
+ ofbi->rotation_type = rot_type;
+
+ /*
+- * Since the VRAM for this FB is not allocated at the moment we don't need to
+- * do any further parameter checking at this point.
++ * Since the VRAM for this FB is not allocated at the moment we don't
++ * need to do any further parameter checking at this point.
+ */
+ out:
+ omapfb_unlock(fbdev);
+@@ -321,8 +321,8 @@ static ssize_t show_overlays_rotate(struct device *dev,
+ return l;
+ }
+
+-static ssize_t store_overlays_rotate(struct device *dev, struct device_attribute *attr,
+- const char *buf, size_t count)
++static ssize_t store_overlays_rotate(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
+ {
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+@@ -451,11 +451,13 @@ static ssize_t show_virt(struct device *dev,
+ }
+
+ static struct device_attribute omapfb_attrs[] = {
+- __ATTR(rotate_type, S_IRUGO | S_IWUSR, show_rotate_type, store_rotate_type),
++ __ATTR(rotate_type, S_IRUGO | S_IWUSR, show_rotate_type,
++ store_rotate_type),
+ __ATTR(mirror, S_IRUGO | S_IWUSR, show_mirror, store_mirror),
+ __ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size),
+ __ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays),
+- __ATTR(overlays_rotate, S_IRUGO | S_IWUSR, show_overlays_rotate, store_overlays_rotate),
++ __ATTR(overlays_rotate, S_IRUGO | S_IWUSR, show_overlays_rotate,
++ store_overlays_rotate),
+ __ATTR(phys_addr, S_IRUGO, show_phys, NULL),
+ __ATTR(virt_addr, S_IRUGO, show_virt, NULL),
+ };
+@@ -473,7 +475,8 @@ int omapfb_create_sysfs(struct omapfb2_device *fbdev)
+ &omapfb_attrs[t]);
+
+ if (r) {
+- dev_err(fbdev->dev, "failed to create sysfs file\n");
++ dev_err(fbdev->dev, "failed to create sysfs "
++ "file\n");
+ return r;
+ }
+ }
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0096-DSS2-Overo-add-vdac-dsi-regulators-fix-panel-name.patch b/recipes/linux/linux-omap-pm/dss2/0096-DSS2-Overo-add-vdac-dsi-regulators-fix-panel-name.patch
new file mode 100644
index 0000000000..c81d79e7ca
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0096-DSS2-Overo-add-vdac-dsi-regulators-fix-panel-name.patch
@@ -0,0 +1,278 @@
+From 1ccb690cf0a478e3bbbf9bf1ee0f03a33918b87e Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 1 Jun 2009 20:17:40 +0300
+Subject: [PATCH 096/146] DSS2: Overo: add vdac/dsi regulators, fix panel names
+
+---
+ arch/arm/mach-omap2/board-overo.c | 224 ++++++++++++++++++++++---------------
+ 1 files changed, 132 insertions(+), 92 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
+index 39f95f5..07868f9 100644
+--- a/arch/arm/mach-omap2/board-overo.c
++++ b/arch/arm/mach-omap2/board-overo.c
+@@ -183,9 +183,110 @@ static inline void __init overo_init_smsc911x(void)
+ static inline void __init overo_init_smsc911x(void) { return; }
+ #endif
+
++/* DSS */
+ static int lcd_enabled;
+ static int dvi_enabled;
+
++#define OVERO_GPIO_LCD_EN 144
++
++static void __init overo_display_init(void)
++{
++ int r;
++
++ r = gpio_request(OVERO_GPIO_LCD_EN, "display enable");
++ if (r)
++ printk("fail1\n");
++ r = gpio_direction_output(OVERO_GPIO_LCD_EN, 1);
++ if (r)
++ printk("fail2\n");
++ gpio_export(OVERO_GPIO_LCD_EN, 0);
++}
++
++static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
++{
++ if (lcd_enabled) {
++ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
++ return -EINVAL;
++ }
++ dvi_enabled = 1;
++
++ gpio_set_value(OVERO_GPIO_LCD_EN, 1);
++
++ return 0;
++}
++
++static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
++{
++ gpio_set_value(OVERO_GPIO_LCD_EN, 0);
++
++ dvi_enabled = 0;
++}
++
++static struct omap_dss_device overo_dvi_device = {
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .name = "dvi",
++ .driver_name = "generic_panel",
++ .phy.dpi.data_lines = 24,
++ .platform_enable = overo_panel_enable_dvi,
++ .platform_disable = overo_panel_disable_dvi,
++};
++
++static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
++{
++ if (dvi_enabled) {
++ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
++ return -EINVAL;
++ }
++
++ gpio_set_value(OVERO_GPIO_LCD_EN, 1);
++ lcd_enabled = 1;
++ return 0;
++}
++
++static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
++{
++ gpio_set_value(OVERO_GPIO_LCD_EN, 0);
++ lcd_enabled = 0;
++}
++
++static struct omap_dss_device overo_lcd_device = {
++ .type = OMAP_DISPLAY_TYPE_DPI,
++ .name = "lcd",
++ .driver_name = "samsung_lte_panel",
++ .phy.dpi.data_lines = 24,
++ .platform_enable = overo_panel_enable_lcd,
++ .platform_disable = overo_panel_disable_lcd,
++};
++
++static struct omap_dss_device *overo_dss_devices[] = {
++ &overo_dvi_device,
++ &overo_lcd_device,
++};
++
++static struct omap_dss_board_info overo_dss_data = {
++ .num_devices = ARRAY_SIZE(overo_dss_devices),
++ .devices = overo_dss_devices,
++ .default_device = &overo_dvi_device,
++};
++
++static struct platform_device overo_dss_device = {
++ .name = "omapdss",
++ .id = -1,
++ .dev = {
++ .platform_data = &overo_dss_data,
++ },
++};
++
++static struct regulator_consumer_supply overo_vdda_dac_supply = {
++ .supply = "vdda_dac",
++ .dev = &overo_dss_device.dev,
++};
++
++static struct regulator_consumer_supply overo_vdds_dsi_supply = {
++ .supply = "vdds_dsi",
++ .dev = &overo_dss_device.dev,
++};
++
+ static struct mtd_partition overo_nand_partitions[] = {
+ {
+ .name = "xloader",
+@@ -235,7 +336,6 @@ static struct platform_device overo_nand_device = {
+ .resource = &overo_nand_resource,
+ };
+
+-
+ static void __init overo_flash_init(void)
+ {
+ u8 cs = 0;
+@@ -334,6 +434,35 @@ static struct regulator_init_data overo_vmmc1 = {
+ .consumer_supplies = &overo_vmmc1_supply,
+ };
+
++/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
++static struct regulator_init_data overo_vdac = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &overo_vdda_dac_supply,
++};
++
++/* VPLL2 for digital video outputs */
++static struct regulator_init_data overo_vpll2 = {
++ .constraints = {
++ .name = "VDVI",
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &overo_vdds_dsi_supply,
++};
++
+ /* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */
+
+ static struct twl4030_platform_data overo_twldata = {
+@@ -342,6 +471,8 @@ static struct twl4030_platform_data overo_twldata = {
+ .gpio = &overo_gpio_data,
+ .usb = &overo_usb_data,
+ .vmmc1 = &overo_vmmc1,
++ .vdac = &overo_vdac,
++ .vpll2 = &overo_vpll2,
+ };
+
+ static struct i2c_board_info __initdata overo_i2c_boardinfo[] = {
+@@ -369,97 +500,6 @@ static void __init overo_init_irq(void)
+ omap_gpio_init();
+ }
+
+-/* DSS */
+-
+-#define OVERO_GPIO_LCD_EN 144
+-
+-static void __init overo_display_init(void)
+-{
+- int r;
+-
+- r = gpio_request(OVERO_GPIO_LCD_EN, "display enable");
+- if (r)
+- printk("fail1\n");
+- r = gpio_direction_output(OVERO_GPIO_LCD_EN, 1);
+- if (r)
+- printk("fail2\n");
+- gpio_export(OVERO_GPIO_LCD_EN, 0);
+-}
+-
+-static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
+-{
+- if (lcd_enabled) {
+- printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+- return -EINVAL;
+- }
+- dvi_enabled = 1;
+-
+- gpio_set_value(OVERO_GPIO_LCD_EN, 1);
+-
+- return 0;
+-}
+-
+-static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
+-{
+- gpio_set_value(OVERO_GPIO_LCD_EN, 0);
+-
+- dvi_enabled = 0;
+-}
+-
+-static struct omap_dss_device overo_dvi_device = {
+- .type = OMAP_DISPLAY_TYPE_DPI,
+- .name = "dvi",
+- .driver_name = "panel_generic",
+- .phy.dpi.data_lines = 24,
+- .platform_enable = overo_panel_enable_dvi,
+- .platform_disable = overo_panel_disable_dvi,
+-};
+-
+-static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
+-{
+- if (dvi_enabled) {
+- printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+- return -EINVAL;
+- }
+-
+- gpio_set_value(OVERO_GPIO_LCD_EN, 1);
+- lcd_enabled = 1;
+- return 0;
+-}
+-
+-static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
+-{
+- gpio_set_value(OVERO_GPIO_LCD_EN, 0);
+- lcd_enabled = 0;
+-}
+-
+-static struct omap_dss_device overo_lcd_device = {
+- .type = OMAP_DISPLAY_TYPE_DPI,
+- .name = "lcd",
+- .driver_name = "samsung-lte430wq-f0c",
+- .phy.dpi.data_lines = 24,
+- .platform_enable = overo_panel_enable_lcd,
+- .platform_disable = overo_panel_disable_lcd,
+-};
+-
+-static struct omap_dss_device *overo_dss_devices[] = {
+- &overo_dvi_device,
+- &overo_lcd_device,
+-};
+-
+-static struct omap_dss_board_info overo_dss_data = {
+- .num_devices = ARRAY_SIZE(overo_dss_devices),
+- .devices = overo_dss_devices,
+- .default_device = &overo_dvi_device,
+-};
+-
+-static struct platform_device overo_dss_device = {
+- .name = "omapdss",
+- .id = -1,
+- .dev = {
+- .platform_data = &overo_dss_data,
+- },
+-};
+
+ static struct omap_board_config_kernel overo_config[] __initdata = {
+ { OMAP_TAG_UART, &overo_uart_config },
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0097-DSS2-implement-overlay_manager_info.patch b/recipes/linux/linux-omap-pm/dss2/0097-DSS2-implement-overlay_manager_info.patch
new file mode 100644
index 0000000000..34dca0cc0c
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0097-DSS2-implement-overlay_manager_info.patch
@@ -0,0 +1,649 @@
+From aaa65c193e129dda3518e1e088ad8b3af68165d0 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 2 Jun 2009 16:51:49 +0300
+Subject: [PATCH 097/146] DSS2: implement overlay_manager_info
+
+Store manager config in similar as overlay config. Config
+is applied with mgr->apply(). Also change transparency color key
+variable names from color_key to trans_key.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ Documentation/arm/OMAP/DSS | 10 +-
+ arch/arm/plat-omap/include/mach/display.h | 31 ++--
+ drivers/video/omap2/dss/dispc.c | 4 +-
+ drivers/video/omap2/dss/dss.h | 4 +-
+ drivers/video/omap2/dss/manager.c | 278 ++++++++++++++---------------
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 49 +++---
+ 6 files changed, 186 insertions(+), 190 deletions(-)
+
+diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS
+index 751000b..958686a 100644
+--- a/Documentation/arm/OMAP/DSS
++++ b/Documentation/arm/OMAP/DSS
+@@ -138,11 +138,11 @@ global_alpha global alpha 0-255 0=transparent 255=opaque
+ /sys/devices/platform/omapdss/manager? directory:
+ display Destination display
+ name
+-alpha_blending_enabled 0=off 1=on
+-color_key_enabled 0=off 1=on
+-color_key_type gfx-destination video-source
+-color_key_value 0 to 2^24
+-default_color default background color RGB24 0 to 2^24
++alpha_blending_enabled 0=off, 1=on
++trans_key_enabled 0=off, 1=on
++trans_key_type gfx-destination, video-source
++trans_key_value transparency color key (RGB24)
++default_color default background color (RGB24)
+
+ /sys/devices/platform/omapdss/display? directory:
+ ctrl_name Controller name
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 94585ba..4ccbe4c 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -110,7 +110,7 @@ enum omap_dss_load_mode {
+ OMAP_DSS_LOAD_CLUT_ONCE_FRAME = 3,
+ };
+
+-enum omap_dss_color_key_type {
++enum omap_dss_trans_key_type {
+ OMAP_DSS_COLOR_KEY_GFX_DST = 0,
+ OMAP_DSS_COLOR_KEY_VID_SRC = 1,
+ };
+@@ -292,6 +292,16 @@ struct omap_overlay {
+ struct omap_overlay_info *info);
+ };
+
++struct omap_overlay_manager_info {
++ u32 default_color;
++
++ enum omap_dss_trans_key_type trans_key_type;
++ u32 trans_key;
++ bool trans_enabled;
++
++ bool alpha_enabled;
++};
++
+ struct omap_overlay_manager {
+ struct kobject kobj;
+ struct list_head list;
+@@ -299,6 +309,7 @@ struct omap_overlay_manager {
+ const char *name;
+ int id;
+ enum omap_overlay_manager_caps caps;
++ struct omap_overlay_manager_info info;
+ struct omap_dss_device *device;
+ int num_overlays;
+ struct omap_overlay **overlays;
+@@ -310,20 +321,10 @@ struct omap_overlay_manager {
+
+ int (*apply)(struct omap_overlay_manager *mgr);
+
+- void (*set_default_color)(struct omap_overlay_manager *mgr, u32 color);
+- u32 (*get_default_color)(struct omap_overlay_manager *mgr);
+- bool (*get_alpha_blending_status)(struct omap_overlay_manager *mgr);
+- bool (*get_trans_key_status)(struct omap_overlay_manager *mgr);
+- void (*get_trans_key_type_and_value)(struct omap_overlay_manager *mgr,
+- enum omap_dss_color_key_type *type,
+- u32 *trans_key);
+- void (*set_trans_key_type_and_value)(struct omap_overlay_manager *mgr,
+- enum omap_dss_color_key_type type,
+- u32 trans_key);
+- void (*enable_trans_key)(struct omap_overlay_manager *mgr,
+- bool enable);
+- void (*enable_alpha_blending)(struct omap_overlay_manager *mgr,
+- bool enable);
++ int (*set_manager_info)(struct omap_overlay_manager *mgr,
++ struct omap_overlay_manager_info *info);
++ void (*get_manager_info)(struct omap_overlay_manager *mgr,
++ struct omap_overlay_manager_info *info);
+ };
+
+ struct omap_dss_device {
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 229c4b1..5ef9a32 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1856,7 +1856,7 @@ u32 dispc_get_default_color(enum omap_channel channel)
+ }
+
+ void dispc_set_trans_key(enum omap_channel ch,
+- enum omap_dss_color_key_type type,
++ enum omap_dss_trans_key_type type,
+ u32 trans_key)
+ {
+ const struct dispc_reg tr_reg[] = {
+@@ -1873,7 +1873,7 @@ void dispc_set_trans_key(enum omap_channel ch,
+ }
+
+ void dispc_get_trans_key(enum omap_channel ch,
+- enum omap_dss_color_key_type *type,
++ enum omap_dss_trans_key_type *type,
+ u32 *trans_key)
+ {
+ const struct dispc_reg tr_reg[] = {
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 6180968..9a3aea1 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -298,10 +298,10 @@ void dispc_set_loadmode(enum omap_dss_load_mode mode);
+ void dispc_set_default_color(enum omap_channel channel, u32 color);
+ u32 dispc_get_default_color(enum omap_channel channel);
+ void dispc_set_trans_key(enum omap_channel ch,
+- enum omap_dss_color_key_type type,
++ enum omap_dss_trans_key_type type,
+ u32 trans_key);
+ void dispc_get_trans_key(enum omap_channel ch,
+- enum omap_dss_color_key_type *type,
++ enum omap_dss_trans_key_type *type,
+ u32 *trans_key);
+ void dispc_enable_trans_key(enum omap_channel ch, bool enable);
+ void dispc_enable_alpha_blending(enum omap_channel ch, bool enable);
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index e183fcc..6afc1cb 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -109,166 +109,175 @@ put_device:
+ static ssize_t manager_default_color_show(struct omap_overlay_manager *mgr,
+ char *buf)
+ {
+- return snprintf(buf, PAGE_SIZE, "%d",
+- mgr->get_default_color(mgr));
++ return snprintf(buf, PAGE_SIZE, "%d", mgr->info.default_color);
+ }
+
+ static ssize_t manager_default_color_store(struct omap_overlay_manager *mgr,
+ const char *buf, size_t size)
+ {
+- u32 default_color;
++ struct omap_overlay_manager_info info;
++ u32 color;
++ int r;
+
+- if (sscanf(buf, "%d", &default_color) != 1)
++ if (sscanf(buf, "%d", &color) != 1)
+ return -EINVAL;
+- dispc_set_default_color(mgr->id, default_color);
++
++ mgr->get_manager_info(mgr, &info);
++
++ info.default_color = color;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++ if (r)
++ return r;
+
+ return size;
+ }
+
+-static const char *color_key_type_str[] = {
++static const char *trans_key_type_str[] = {
+ "gfx-destination",
+ "video-source",
+ };
+
+-static ssize_t manager_color_key_type_show(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_type_show(struct omap_overlay_manager *mgr,
+ char *buf)
+ {
+- enum omap_dss_color_key_type key_type;
++ enum omap_dss_trans_key_type key_type;
+
+- mgr->get_trans_key_type_and_value(mgr, &key_type, NULL);
+- BUG_ON(key_type >= ARRAY_SIZE(color_key_type_str));
++ key_type = mgr->info.trans_key_type;
++ BUG_ON(key_type >= ARRAY_SIZE(trans_key_type_str));
+
+- return snprintf(buf, PAGE_SIZE, "%s\n", color_key_type_str[key_type]);
++ return snprintf(buf, PAGE_SIZE, "%s\n", trans_key_type_str[key_type]);
+ }
+
+-static ssize_t manager_color_key_type_store(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_type_store(struct omap_overlay_manager *mgr,
+ const char *buf, size_t size)
+ {
+- enum omap_dss_color_key_type key_type;
+- u32 key_value;
++ enum omap_dss_trans_key_type key_type;
++ struct omap_overlay_manager_info info;
++ int r;
+
+ for (key_type = OMAP_DSS_COLOR_KEY_GFX_DST;
+- key_type < ARRAY_SIZE(color_key_type_str); key_type++) {
+- if (sysfs_streq(buf, color_key_type_str[key_type]))
++ key_type < ARRAY_SIZE(trans_key_type_str); key_type++) {
++ if (sysfs_streq(buf, trans_key_type_str[key_type]))
+ break;
+ }
+- if (key_type == ARRAY_SIZE(color_key_type_str))
++
++ if (key_type == ARRAY_SIZE(trans_key_type_str))
+ return -EINVAL;
+- /* OMAP does not support destination color key and alpha blending
+- * simultaneously. So if alpha blending and color keying both are
+- * enabled then refrain from setting the color key type to
+- * gfx-destination
+- */
+- if (!key_type) {
+- bool color_key_enabled;
+- bool alpha_blending_enabled;
+- color_key_enabled = mgr->get_trans_key_status(mgr);
+- alpha_blending_enabled = mgr->get_alpha_blending_status(mgr);
+- if (color_key_enabled && alpha_blending_enabled)
+- return -EINVAL;
+- }
+
+- mgr->get_trans_key_type_and_value(mgr, NULL, &key_value);
+- mgr->set_trans_key_type_and_value(mgr, key_type, key_value);
++ mgr->get_manager_info(mgr, &info);
++
++ info.trans_key_type = key_type;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++ if (r)
++ return r;
+
+ return size;
+ }
+
+-static ssize_t manager_color_key_value_show(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_value_show(struct omap_overlay_manager *mgr,
+ char *buf)
+ {
+- u32 key_value;
+-
+- mgr->get_trans_key_type_and_value(mgr, NULL, &key_value);
+-
+- return snprintf(buf, PAGE_SIZE, "%d\n", key_value);
++ return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.trans_key);
+ }
+
+-static ssize_t manager_color_key_value_store(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_value_store(struct omap_overlay_manager *mgr,
+ const char *buf, size_t size)
+ {
+- enum omap_dss_color_key_type key_type;
++ struct omap_overlay_manager_info info;
+ u32 key_value;
++ int r;
+
+ if (sscanf(buf, "%d", &key_value) != 1)
+ return -EINVAL;
+- mgr->get_trans_key_type_and_value(mgr, &key_type, NULL);
+- mgr->set_trans_key_type_and_value(mgr, key_type, key_value);
++
++ mgr->get_manager_info(mgr, &info);
++
++ info.trans_key = key_value;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++ if (r)
++ return r;
+
+ return size;
+ }
+
+-static ssize_t manager_color_key_enabled_show(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_enabled_show(struct omap_overlay_manager *mgr,
+ char *buf)
+ {
+- return snprintf(buf, PAGE_SIZE, "%d\n",
+- mgr->get_trans_key_status(mgr));
++ return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.trans_enabled);
+ }
+
+-static ssize_t manager_color_key_enabled_store(struct omap_overlay_manager *mgr,
++static ssize_t manager_trans_key_enabled_store(struct omap_overlay_manager *mgr,
+ const char *buf, size_t size)
+ {
++ struct omap_overlay_manager_info info;
+ int enable;
++ int r;
+
+ if (sscanf(buf, "%d", &enable) != 1)
+ return -EINVAL;
+
+- /* OMAP does not support destination color keying and
+- * alpha blending simultaneously. so if alpha blending
+- * is enabled refrain from enabling destination color
+- * keying.
+- */
+- if (enable) {
+- bool enabled;
+- enabled = mgr->get_alpha_blending_status(mgr);
+- if (enabled) {
+- enum omap_dss_color_key_type key_type;
+- mgr->get_trans_key_type_and_value(mgr,
+- &key_type, NULL);
+- if (!key_type)
+- return -EINVAL;
+- }
++ mgr->get_manager_info(mgr, &info);
+
+- }
+- mgr->enable_trans_key(mgr, enable);
++ info.trans_enabled = enable ? true : false;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++ if (r)
++ return r;
+
+ return size;
+ }
++
+ static ssize_t manager_alpha_blending_enabled_show(
+ struct omap_overlay_manager *mgr, char *buf)
+ {
+- return snprintf(buf, PAGE_SIZE, "%d\n",
+- mgr->get_alpha_blending_status(mgr));
++ return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.alpha_enabled);
+ }
++
+ static ssize_t manager_alpha_blending_enabled_store(
+ struct omap_overlay_manager *mgr,
+ const char *buf, size_t size)
+ {
++ struct omap_overlay_manager_info info;
+ int enable;
++ int r;
++
+ if (sscanf(buf, "%d", &enable) != 1)
+ return -EINVAL;
+- /* OMAP does not support destination color keying and
+- * alpha blending simultaneously. so if destination
+- * color keying is enabled refrain from enabling
+- * alpha blending
+- */
+- if (enable) {
+- bool enabled;
+- enabled = mgr->get_trans_key_status(mgr);
+- if (enabled) {
+- enum omap_dss_color_key_type key_type;
+- mgr->get_trans_key_type_and_value(mgr, &key_type, NULL);
+- if (!key_type)
+- return -EINVAL;
+
+- }
++ mgr->get_manager_info(mgr, &info);
++
++ info.alpha_enabled = enable ? true : false;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++ if (r)
++ return r;
+
+- }
+- mgr->enable_alpha_blending(mgr, enable);
+ return size;
+ }
+
+-
+ struct manager_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct omap_overlay_manager *, char *);
+@@ -284,13 +293,13 @@ static MANAGER_ATTR(display, S_IRUGO|S_IWUSR,
+ manager_display_show, manager_display_store);
+ static MANAGER_ATTR(default_color, S_IRUGO|S_IWUSR,
+ manager_default_color_show, manager_default_color_store);
+-static MANAGER_ATTR(color_key_type, S_IRUGO|S_IWUSR,
+- manager_color_key_type_show, manager_color_key_type_store);
+-static MANAGER_ATTR(color_key_value, S_IRUGO|S_IWUSR,
+- manager_color_key_value_show, manager_color_key_value_store);
+-static MANAGER_ATTR(color_key_enabled, S_IRUGO|S_IWUSR,
+- manager_color_key_enabled_show,
+- manager_color_key_enabled_store);
++static MANAGER_ATTR(trans_key_type, S_IRUGO|S_IWUSR,
++ manager_trans_key_type_show, manager_trans_key_type_store);
++static MANAGER_ATTR(trans_key_value, S_IRUGO|S_IWUSR,
++ manager_trans_key_value_show, manager_trans_key_value_store);
++static MANAGER_ATTR(trans_key_enabled, S_IRUGO|S_IWUSR,
++ manager_trans_key_enabled_show,
++ manager_trans_key_enabled_store);
+ static MANAGER_ATTR(alpha_blending_enabled, S_IRUGO|S_IWUSR,
+ manager_alpha_blending_enabled_show,
+ manager_alpha_blending_enabled_store);
+@@ -300,9 +309,9 @@ static struct attribute *manager_sysfs_attrs[] = {
+ &manager_attr_name.attr,
+ &manager_attr_display.attr,
+ &manager_attr_default_color.attr,
+- &manager_attr_color_key_type.attr,
+- &manager_attr_color_key_value.attr,
+- &manager_attr_color_key_enabled.attr,
++ &manager_attr_trans_key_type.attr,
++ &manager_attr_trans_key_value.attr,
++ &manager_attr_trans_key_enabled.attr,
+ &manager_attr_alpha_blending_enabled.attr,
+ NULL
+ };
+@@ -513,7 +522,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ ovl->manager->device->configure_overlay(ovl);
+ }
+
+- /* Issue GO for managers */
++ /* Configure managers, and issue GO */
+ list_for_each_entry(mgr, &manager_list, list) {
+ if (!(mgr->caps & OMAP_DSS_OVL_MGR_CAP_DISPC))
+ continue;
+@@ -523,6 +532,11 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ if (!dssdev)
+ continue;
+
++ dispc_set_trans_key(mgr->id, mgr->info.trans_key_type,
++ mgr->info.trans_key);
++ dispc_enable_trans_key(mgr->id, mgr->info.trans_enabled);
++ dispc_enable_alpha_blending(mgr->id, mgr->info.alpha_enabled);
++
+ /* We don't need GO with manual update display. LCD iface will
+ * always be turned off after frame, and new settings will
+ * be taken in to use at next update */
+@@ -537,49 +551,40 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ return ret;
+ }
+
+-static void omap_dss_mgr_set_def_color(struct omap_overlay_manager *mgr,
+- u32 color)
++static int dss_check_manager(struct omap_overlay_manager *mgr)
+ {
+- dispc_set_default_color(mgr->id, color);
+-}
++ /* OMAP does not support destination color keying and alpha blending
++ * simultaneously. */
+
+-static void omap_dss_mgr_set_trans_key_type_and_value(
+- struct omap_overlay_manager *mgr,
+- enum omap_dss_color_key_type type,
+- u32 trans_key)
+-{
+- dispc_set_trans_key(mgr->id, type, trans_key);
+-}
+-static void omap_dss_mgr_get_trans_key_type_and_value(
+- struct omap_overlay_manager *mgr,
+- enum omap_dss_color_key_type *type,
+- u32 *trans_key)
+-{
+- dispc_get_trans_key(mgr->id, type, trans_key);
+-}
++ if (mgr->info.alpha_enabled && mgr->info.trans_enabled &&
++ mgr->info.trans_key_type == OMAP_DSS_COLOR_KEY_GFX_DST)
++ return -EINVAL;
+
+-static void omap_dss_mgr_enable_trans_key(struct omap_overlay_manager *mgr,
+- bool enable)
+-{
+- dispc_enable_trans_key(mgr->id, enable);
+-}
+-static void omap_dss_mgr_enable_alpha_blending(struct omap_overlay_manager *mgr,
+- bool enable)
+-{
+- dispc_enable_alpha_blending(mgr->id, enable);
+-}
+-static bool omap_dss_mgr_get_alpha_blending_status(
+- struct omap_overlay_manager *mgr)
+-{
+- return dispc_alpha_blending_enabled(mgr->id);
++ return 0;
+ }
+-static u32 omap_dss_mgr_get_default_color(struct omap_overlay_manager *mgr)
++
++static int omap_dss_mgr_set_info(struct omap_overlay_manager *mgr,
++ struct omap_overlay_manager_info *info)
+ {
+- return dispc_get_default_color(mgr->id);
++ int r;
++ struct omap_overlay_manager_info old_info;
++
++ old_info = mgr->info;
++ mgr->info = *info;
++
++ r = dss_check_manager(mgr);
++ if (r) {
++ mgr->info = old_info;
++ return r;
++ }
++
++ return 0;
+ }
+-static bool omap_dss_mgr_get_trans_key_status(struct omap_overlay_manager *mgr)
++
++static void omap_dss_mgr_get_info(struct omap_overlay_manager *mgr,
++ struct omap_overlay_manager_info *info)
+ {
+- return dispc_trans_key_enabled(mgr->id);
++ *info = mgr->info;
+ }
+
+ static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager)
+@@ -620,18 +625,9 @@ int dss_init_overlay_managers(struct platform_device *pdev)
+ mgr->set_device = &omap_dss_set_device;
+ mgr->unset_device = &omap_dss_unset_device;
+ mgr->apply = &omap_dss_mgr_apply;
+- mgr->set_default_color = &omap_dss_mgr_set_def_color;
+- mgr->set_trans_key_type_and_value =
+- &omap_dss_mgr_set_trans_key_type_and_value;
+- mgr->get_trans_key_type_and_value =
+- &omap_dss_mgr_get_trans_key_type_and_value;
+- mgr->enable_trans_key = &omap_dss_mgr_enable_trans_key;
+- mgr->get_trans_key_status = &omap_dss_mgr_get_trans_key_status;
+- mgr->enable_alpha_blending =
+- &omap_dss_mgr_enable_alpha_blending;
+- mgr->get_alpha_blending_status =
+- omap_dss_mgr_get_alpha_blending_status;
+- mgr->get_default_color = &omap_dss_mgr_get_default_color;
++ mgr->set_manager_info = &omap_dss_mgr_set_info;
++ mgr->get_manager_info = &omap_dss_mgr_get_info;
++
+ mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC;
+
+ dss_overlay_setup_dispc_manager(mgr);
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 806b4e7..c513fe0 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -286,17 +286,23 @@ static struct omapfb_color_key omapfb_color_keys[2];
+ static int _omapfb_set_color_key(struct omap_overlay_manager *mgr,
+ struct omapfb_color_key *ck)
+ {
+- enum omap_dss_color_key_type kt;
++ struct omap_overlay_manager_info info;
++ enum omap_dss_trans_key_type kt;
++ int r;
+
+- if (!mgr->set_default_color ||
+- !mgr->set_trans_key_type_and_value ||
+- !mgr->enable_trans_key)
+- return 0;
++ mgr->get_manager_info(mgr, &info);
+
+ if (ck->key_type == OMAPFB_COLOR_KEY_DISABLED) {
+- mgr->enable_trans_key(mgr, 0);
++ info.trans_enabled = false;
+ omapfb_color_keys[mgr->id] = *ck;
+- return 0;
++
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++
++ return r;
+ }
+
+ switch (ck->key_type) {
+@@ -310,13 +316,20 @@ static int _omapfb_set_color_key(struct omap_overlay_manager *mgr,
+ return -EINVAL;
+ }
+
+- mgr->set_default_color(mgr, ck->background);
+- mgr->set_trans_key_type_and_value(mgr, kt, ck->trans_key);
+- mgr->enable_trans_key(mgr, 1);
++ info.default_color = ck->background;
++ info.trans_key = ck->trans_key;
++ info.trans_key_type = kt;
++ info.trans_enabled = true;
+
+ omapfb_color_keys[mgr->id] = *ck;
+
+- return 0;
++ r = mgr->set_manager_info(mgr, &info);
++ if (r)
++ return r;
++
++ r = mgr->apply(mgr);
++
++ return r;
+ }
+
+ static int omapfb_set_color_key(struct fb_info *fbi,
+@@ -342,13 +355,6 @@ static int omapfb_set_color_key(struct fb_info *fbi,
+ goto err;
+ }
+
+- if (!mgr->set_default_color ||
+- !mgr->set_trans_key_type_and_value ||
+- !mgr->enable_trans_key) {
+- r = -ENODEV;
+- goto err;
+- }
+-
+ r = _omapfb_set_color_key(mgr, ck);
+ err:
+ omapfb_unlock(fbdev);
+@@ -379,13 +385,6 @@ static int omapfb_get_color_key(struct fb_info *fbi,
+ goto err;
+ }
+
+- if (!mgr->set_default_color ||
+- !mgr->set_trans_key_type_and_value ||
+- !mgr->enable_trans_key) {
+- r = -ENODEV;
+- goto err;
+- }
+-
+ *ck = omapfb_color_keys[mgr->id];
+ err:
+ omapfb_unlock(fbdev);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0098-DSS2-use-sysfs_streq-to-compare-display-names.patch b/recipes/linux/linux-omap-pm/dss2/0098-DSS2-use-sysfs_streq-to-compare-display-names.patch
new file mode 100644
index 0000000000..79b3704c1d
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0098-DSS2-use-sysfs_streq-to-compare-display-names.patch
@@ -0,0 +1,43 @@
+From 10b82544210f731f5c02e7bfc277f8ecb57c9263 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 2 Jun 2009 17:11:24 +0300
+Subject: [PATCH 098/146] DSS2: use sysfs_streq() to compare display names
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/manager.c | 14 +++-----------
+ 1 files changed, 3 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 6afc1cb..798867c 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -54,22 +54,14 @@ static ssize_t manager_display_store(struct omap_overlay_manager *mgr,
+ int match(struct omap_dss_device *dssdev, void *data)
+ {
+ const char *str = data;
+- return strcmp(dssdev->name, str) == 0;
++ return sysfs_streq(dssdev->name, str);
+ }
+
+ if (buf[size-1] == '\n')
+ --len;
+
+- if (len > 0) {
+- char name[64];
+- int n;
+-
+- n = min(len, sizeof(name) - 1);
+- strncpy(name, buf, n);
+- name[n - 1] = 0;
+-
+- dssdev = omap_dss_find_device(name, match);
+- }
++ if (len > 0)
++ dssdev = omap_dss_find_device((void *)buf, match);
+
+ if (len > 0 && dssdev == NULL)
+ return -EINVAL;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0099-DSS2-Implement-function-to-verify-lcd-timings.patch b/recipes/linux/linux-omap-pm/dss2/0099-DSS2-Implement-function-to-verify-lcd-timings.patch
new file mode 100644
index 0000000000..0ba203f5ee
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0099-DSS2-Implement-function-to-verify-lcd-timings.patch
@@ -0,0 +1,144 @@
+From 875cf440d5450f5d91b2ef1ba6f051f93e77b8eb Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 3 Jun 2009 10:45:54 +0300
+Subject: [PATCH 099/146] DSS2: Implement function to verify lcd timings
+
+---
+ drivers/video/omap2/dss/dispc.c | 52 +++++++++++++++++++++++++++------------
+ drivers/video/omap2/dss/dpi.c | 25 +-----------------
+ drivers/video/omap2/dss/dss.h | 1 +
+ 3 files changed, 39 insertions(+), 39 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 5ef9a32..762a0f1 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -2015,34 +2015,49 @@ void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode)
+ enable_clocks(0);
+ }
+
++static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp,
++ int vsw, int vfp, int vbp)
++{
++ if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
++ if (hsw < 1 || hsw > 64 ||
++ hfp < 1 || hfp > 256 ||
++ hbp < 1 || hbp > 256 ||
++ vsw < 1 || vsw > 64 ||
++ vfp < 0 || vfp > 255 ||
++ vbp < 0 || vbp > 255)
++ return false;
++ } else {
++ if (hsw < 1 || hsw > 256 ||
++ hfp < 1 || hfp > 4096 ||
++ hbp < 1 || hbp > 4096 ||
++ vsw < 1 || vsw > 256 ||
++ vfp < 0 || vfp > 4095 ||
++ vbp < 0 || vbp > 4095)
++ return false;
++ }
++
++ return true;
++}
++
++bool dispc_lcd_timings_ok(struct omap_video_timings *timings)
++{
++ return _dispc_lcd_timings_ok(timings->hsw, timings->hfp,
++ timings->hbp, timings->vsw,
++ timings->vfp, timings->vbp);
++}
++
+ static void _dispc_set_lcd_timings(int hsw, int hfp, int hbp,
+ int vsw, int vfp, int vbp)
+ {
+ u32 timing_h, timing_v;
+
+ if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
+- BUG_ON(hsw < 1 || hsw > 64);
+- BUG_ON(hfp < 1 || hfp > 256);
+- BUG_ON(hbp < 1 || hbp > 256);
+-
+- BUG_ON(vsw < 1 || vsw > 64);
+- BUG_ON(vfp < 0 || vfp > 255);
+- BUG_ON(vbp < 0 || vbp > 255);
+-
+ timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) |
+ FLD_VAL(hbp-1, 27, 20);
+
+ timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) |
+ FLD_VAL(vbp, 27, 20);
+ } else {
+- BUG_ON(hsw < 1 || hsw > 256);
+- BUG_ON(hfp < 1 || hfp > 4096);
+- BUG_ON(hbp < 1 || hbp > 4096);
+-
+- BUG_ON(vsw < 1 || vsw > 256);
+- BUG_ON(vfp < 0 || vfp > 4095);
+- BUG_ON(vbp < 0 || vbp > 4095);
+-
+ timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) |
+ FLD_VAL(hbp-1, 31, 20);
+
+@@ -2062,6 +2077,11 @@ void dispc_set_lcd_timings(struct omap_video_timings *timings)
+ unsigned xtot, ytot;
+ unsigned long ht, vt;
+
++ if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp,
++ timings->hbp, timings->vsw,
++ timings->vfp, timings->vbp))
++ BUG();
++
+ _dispc_set_lcd_timings(timings->hsw, timings->hfp, timings->hbp,
+ timings->vsw, timings->vfp, timings->vbp);
+
+diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
+index f5867cf..d244e54 100644
+--- a/drivers/video/omap2/dss/dpi.c
++++ b/drivers/video/omap2/dss/dpi.c
+@@ -287,29 +287,8 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,
+ unsigned long fck;
+ unsigned long pck;
+
+- if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
+- if (timings->hsw < 1 || timings->hsw > 64 ||
+- timings->hfp < 1 || timings->hfp > 256 ||
+- timings->hbp < 1 || timings->hbp > 256) {
+- return -EINVAL;
+- }
+-
+- if (timings->vsw < 1 || timings->vsw > 64 ||
+- timings->vfp > 255 || timings->vbp > 255) {
+- return -EINVAL;
+- }
+- } else {
+- if (timings->hsw < 1 || timings->hsw > 256 ||
+- timings->hfp < 1 || timings->hfp > 4096 ||
+- timings->hbp < 1 || timings->hbp > 4096) {
+- return -EINVAL;
+- }
+-
+- if (timings->vsw < 1 || timings->vsw > 64 ||
+- timings->vfp > 4095 || timings->vbp > 4095) {
+- return -EINVAL;
+- }
+- }
++ if (!dispc_lcd_timings_ok(timings))
++ return -EINVAL;
+
+ if (timings->pixel_clock == 0)
+ return -EINVAL;
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 9a3aea1..370c54b 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -308,6 +308,7 @@ void dispc_enable_alpha_blending(enum omap_channel ch, bool enable);
+ bool dispc_trans_key_enabled(enum omap_channel ch);
+ bool dispc_alpha_blending_enabled(enum omap_channel ch);
+
++bool dispc_lcd_timings_ok(struct omap_video_timings *timings);
+ void dispc_set_lcd_timings(struct omap_video_timings *timings);
+ unsigned long dispc_fclk_rate(void);
+ unsigned long dispc_lclk_rate(void);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0100-DSS2-Remove-non-existing-dsi-power-funcs-from-dss.h.patch b/recipes/linux/linux-omap-pm/dss2/0100-DSS2-Remove-non-existing-dsi-power-funcs-from-dss.h.patch
new file mode 100644
index 0000000000..b3266cf635
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0100-DSS2-Remove-non-existing-dsi-power-funcs-from-dss.h.patch
@@ -0,0 +1,25 @@
+From 193e9e6c7206d21b9cd3eff752432fd2ce4da38c Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 3 Jun 2009 10:51:49 +0300
+Subject: [PATCH 100/146] DSS2: Remove non-existing dsi power funcs from dss.h
+
+---
+ drivers/video/omap2/dss/dss.h | 2 --
+ 1 files changed, 0 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 370c54b..6608f90 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -164,8 +164,6 @@ unsigned long dss_clk_get_rate(enum dss_clock clk);
+ int dss_need_ctx_restore(void);
+ void dss_dump_clocks(struct seq_file *s);
+ struct bus_type *dss_get_bus(void);
+-int dss_dsi_power_up(void);
+-void dss_dsi_power_down(void);
+
+ #define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
+ #define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0101-DSS2-move-to_dss_driver-and-to_dss_device-to-pu.patch b/recipes/linux/linux-omap-pm/dss2/0101-DSS2-move-to_dss_driver-and-to_dss_device-to-pu.patch
new file mode 100644
index 0000000000..b9597efae1
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0101-DSS2-move-to_dss_driver-and-to_dss_device-to-pu.patch
@@ -0,0 +1,40 @@
+From 76be132d45253ddca015c1bb8653a7ed9f7c684a Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 4 Jun 2009 10:58:13 +0300
+Subject: [PATCH 101/146] DSS2: move to_dss_driver() and to_dss_device() to public header
+
+---
+ arch/arm/plat-omap/include/mach/display.h | 4 ++++
+ drivers/video/omap2/dss/dss.h | 3 ---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 4ccbe4c..3d8ed69 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -518,4 +518,8 @@ int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
+ int omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout);
+ int omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask,
+ unsigned long timeout);
++
++#define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
++#define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
++
+ #endif
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 6608f90..1e40830 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -165,9 +165,6 @@ int dss_need_ctx_restore(void);
+ void dss_dump_clocks(struct seq_file *s);
+ struct bus_type *dss_get_bus(void);
+
+-#define to_dss_driver(x) container_of((x), struct omap_dss_driver, driver)
+-#define to_dss_device(x) container_of((x), struct omap_dss_device, dev)
+-
+ /* display */
+ int dss_suspend_all_devices(void);
+ int dss_resume_all_devices(void);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0102-DSS2-CLK-change-omapfb-omapdss-in-clock-framewo.patch b/recipes/linux/linux-omap-pm/dss2/0102-DSS2-CLK-change-omapfb-omapdss-in-clock-framewo.patch
new file mode 100644
index 0000000000..d63fb58800
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0102-DSS2-CLK-change-omapfb-omapdss-in-clock-framewo.patch
@@ -0,0 +1,53 @@
+From 93859ac92c1f76585c6130e651d79ff14bc10c29 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 4 Jun 2009 15:06:22 +0300
+Subject: [PATCH 102/146] DSS2: CLK: change omapfb -> omapdss in clock framework
+
+---
+ arch/arm/mach-omap2/clock24xx.c | 8 ++++----
+ arch/arm/mach-omap2/clock34xx.c | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/clock24xx.c b/arch/arm/mach-omap2/clock24xx.c
+index 44de027..402a3d4 100644
+--- a/arch/arm/mach-omap2/clock24xx.c
++++ b/arch/arm/mach-omap2/clock24xx.c
+@@ -103,10 +103,10 @@ static struct omap_clk omap24xx_clks[] = {
+ CLK(NULL, "mdm_ick", &mdm_ick, CK_243X),
+ CLK(NULL, "mdm_osc_ck", &mdm_osc_ck, CK_243X),
+ /* DSS domain clocks */
+- CLK("omapfb", "ick", &dss_ick, CK_243X | CK_242X),
+- CLK("omapfb", "dss1_fck", &dss1_fck, CK_243X | CK_242X),
+- CLK("omapfb", "dss2_fck", &dss2_fck, CK_243X | CK_242X),
+- CLK("omapfb", "tv_fck", &dss_54m_fck, CK_243X | CK_242X),
++ CLK("omapdss", "ick", &dss_ick, CK_243X | CK_242X),
++ CLK("omapdss", "dss1_fck", &dss1_fck, CK_243X | CK_242X),
++ CLK("omapdss", "dss2_fck", &dss2_fck, CK_243X | CK_242X),
++ CLK("omapdss", "tv_fck", &dss_54m_fck, CK_243X | CK_242X),
+ /* L3 domain clocks */
+ CLK(NULL, "core_l3_ck", &core_l3_ck, CK_243X | CK_242X),
+ CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_243X | CK_242X),
+diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c
+index 045da92..dd7bba2 100644
+--- a/arch/arm/mach-omap2/clock34xx.c
++++ b/arch/arm/mach-omap2/clock34xx.c
+@@ -200,11 +200,11 @@ static struct omap_clk omap34xx_clks[] = {
+ CLK("omap_rng", "ick", &rng_ick, CK_343X),
+ CLK(NULL, "sha11_ick", &sha11_ick, CK_343X),
+ CLK(NULL, "des1_ick", &des1_ick, CK_343X),
+- CLK("omapfb", "dss1_fck", &dss1_alwon_fck, CK_343X),
+- CLK("omapfb", "tv_fck", &dss_tv_fck, CK_343X),
+- CLK("omapfb", "video_fck", &dss_96m_fck, CK_343X),
+- CLK("omapfb", "dss2_fck", &dss2_alwon_fck, CK_343X),
+- CLK("omapfb", "ick", &dss_ick, CK_343X),
++ CLK("omapdss", "dss1_fck", &dss1_alwon_fck, CK_343X),
++ CLK("omapdss", "tv_fck", &dss_tv_fck, CK_343X),
++ CLK("omapdss", "video_fck", &dss_96m_fck, CK_343X),
++ CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_343X),
++ CLK("omapdss", "ick", &dss_ick, CK_343X),
+ CLK(NULL, "cam_mclk", &cam_mclk, CK_343X),
+ CLK(NULL, "cam_ick", &cam_ick, CK_343X),
+ CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X),
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0103-DSS2-Use-clkdev.patch b/recipes/linux/linux-omap-pm/dss2/0103-DSS2-Use-clkdev.patch
new file mode 100644
index 0000000000..294380594b
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0103-DSS2-Use-clkdev.patch
@@ -0,0 +1,122 @@
+From a41c88224dc74dc2feebe16e579fc5df28ad85a4 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 4 Jun 2009 15:07:14 +0300
+Subject: [PATCH 103/146] DSS2: Use clkdev
+
+---
+ drivers/video/omap2/dss/core.c | 85 ++++++++++++++++++++++------------------
+ 1 files changed, 47 insertions(+), 38 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
+index 3f544dc..e8d430c 100644
+--- a/drivers/video/omap2/dss/core.c
++++ b/drivers/video/omap2/dss/core.c
+@@ -150,58 +150,67 @@ void dss_dump_clocks(struct seq_file *s)
+ }
+ }
+
+-static int dss_get_clocks(void)
++static int dss_get_clock(struct clk **clock, const char *clk_name)
+ {
+- const struct {
+- struct clk **clock;
+- char *omap2_name;
+- char *omap3_name;
+- } clocks[5] = {
+- { &core.dss_ick, "dss_ick", "dss_ick" }, /* L3 & L4 ick */
+- { &core.dss1_fck, "dss1_fck", "dss1_alwon_fck" },
+- { &core.dss2_fck, "dss2_fck", "dss2_alwon_fck" },
+- { &core.dss_54m_fck, "dss_54m_fck", "dss_tv_fck" },
+- { &core.dss_96m_fck, NULL, "dss_96m_fck" },
+- };
++ struct clk *clk;
+
+- int r = 0;
+- int i;
+- const int num_clocks = 5;
++ clk = clk_get(&core.pdev->dev, clk_name);
+
+- for (i = 0; i < num_clocks; i++)
+- *clocks[i].clock = NULL;
++ if (IS_ERR(clk)) {
++ DSSERR("can't get clock %s", clk_name);
++ return PTR_ERR(clk);
++ }
+
+- for (i = 0; i < num_clocks; i++) {
+- struct clk *clk;
+- const char *clk_name;
++ *clock = clk;
+
+- clk_name = cpu_is_omap34xx() ? clocks[i].omap3_name
+- : clocks[i].omap2_name;
++ DSSDBG("clk %s, rate %ld\n", clk_name, clk_get_rate(clk));
+
+- if (!clk_name)
+- continue;
++ return 0;
++}
+
+- clk = clk_get(NULL, clk_name);
++static int dss_get_clocks(void)
++{
++ int r;
+
+- if (IS_ERR(clk)) {
+- DSSERR("can't get clock %s", clk_name);
+- r = PTR_ERR(clk);
+- goto err;
+- }
++ core.dss_ick = NULL;
++ core.dss1_fck = NULL;
++ core.dss2_fck = NULL;
++ core.dss_54m_fck = NULL;
++ core.dss_96m_fck = NULL;
+
+- DSSDBG("clk %s, rate %ld\n",
+- clk_name, clk_get_rate(clk));
++ r = dss_get_clock(&core.dss_ick, "ick");
++ if (r)
++ goto err;
+
+- *clocks[i].clock = clk;
+- }
++ r = dss_get_clock(&core.dss1_fck, "dss1_fck");
++ if (r)
++ goto err;
++
++ r = dss_get_clock(&core.dss2_fck, "dss2_fck");
++ if (r)
++ goto err;
++
++ r = dss_get_clock(&core.dss_54m_fck, "tv_fck");
++ if (r)
++ goto err;
++
++ r = dss_get_clock(&core.dss_96m_fck, "video_fck");
++ if (r)
++ goto err;
+
+ return 0;
+
+ err:
+- for (i = 0; i < num_clocks; i++) {
+- if (!IS_ERR(*clocks[i].clock))
+- clk_put(*clocks[i].clock);
+- }
++ if (core.dss_ick)
++ clk_put(core.dss_ick);
++ if (core.dss1_fck)
++ clk_put(core.dss1_fck);
++ if (core.dss2_fck)
++ clk_put(core.dss2_fck);
++ if (core.dss_54m_fck)
++ clk_put(core.dss_54m_fck);
++ if (core.dss_96m_fck)
++ clk_put(core.dss_96m_fck);
+
+ return r;
+ }
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0104-DSS2-Fix-documentation.patch b/recipes/linux/linux-omap-pm/dss2/0104-DSS2-Fix-documentation.patch
new file mode 100644
index 0000000000..479c850127
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0104-DSS2-Fix-documentation.patch
@@ -0,0 +1,38 @@
+From 9b9a9009fbb2d13adf0db67a2c27d27e7d624258 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 5 Jun 2009 11:21:13 +0300
+Subject: [PATCH 104/146] DSS2: Fix documentation
+
+---
+ Documentation/arm/OMAP/DSS | 8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS
+index 958686a..0af0e9e 100644
+--- a/Documentation/arm/OMAP/DSS
++++ b/Documentation/arm/OMAP/DSS
+@@ -195,8 +195,8 @@ FB2 --- VID2 -/ TV ----- TV
+ Example: Switch from LCD to DVI
+ ----------------------
+
+-w=`cat $dvi/horizontal | cut -d "," -f 1`
+-h=`cat $dvi/vertical | cut -d "," -f 1`
++w=`cat $dvi/timings | cut -d "," -f 2 | cut -d "/" -f 1`
++h=`cat $dvi/timings | cut -d "," -f 3 | cut -d "/" -f 1`
+
+ echo "0" > $lcd/enabled
+ echo "" > $mgr0/display
+@@ -214,8 +214,8 @@ FB2 --- VID2 -/ TV ----- TV
+ Example: Clone GFX overlay to LCD and TV
+ -------------------------------
+
+-w=`cat $tv/horizontal | cut -d "," -f 1`
+-h=`cat $tv/vertical | cut -d "," -f 1`
++w=`cat $tv/timings | cut -d "," -f 2 | cut -d "/" -f 1`
++h=`cat $tv/timings | cut -d "," -f 3 | cut -d "/" -f 1`
+
+ echo "0" > $ovl0/enabled
+ echo "0" > $ovl1/enabled
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0105-DSS2-OMAPFB-first-set-TE-then-update-mode.patch b/recipes/linux/linux-omap-pm/dss2/0105-DSS2-OMAPFB-first-set-TE-then-update-mode.patch
new file mode 100644
index 0000000000..40831a0428
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0105-DSS2-OMAPFB-first-set-TE-then-update-mode.patch
@@ -0,0 +1,38 @@
+From f2fecd510357dbfb1f7a235ba9a74f1241b5224f Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 9 Jun 2009 11:50:55 +0300
+Subject: [PATCH 105/146] DSS2: OMAPFB: first set TE, then update mode
+
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 8 ++++----
+ 1 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 4e93bd6..1fe770c 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -2042,17 +2042,17 @@ static int omapfb_probe(struct platform_device *pdev)
+ /* set the update mode */
+ if (def_display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
+ #ifdef CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE
++ if (def_display->enable_te)
++ def_display->enable_te(def_display, 1);
+ if (def_display->set_update_mode)
+ def_display->set_update_mode(def_display,
+ OMAP_DSS_UPDATE_AUTO);
+- if (def_display->enable_te)
+- def_display->enable_te(def_display, 1);
+ #else
++ if (def_display->enable_te)
++ def_display->enable_te(def_display, 0);
+ if (def_display->set_update_mode)
+ def_display->set_update_mode(def_display,
+ OMAP_DSS_UPDATE_MANUAL);
+- if (def_display->enable_te)
+- def_display->enable_te(def_display, 0);
+ #endif
+ } else {
+ if (def_display->set_update_mode)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0106-DSS2-OMAPFB-Disable-forced-display-update-on-fb-cl.patch b/recipes/linux/linux-omap-pm/dss2/0106-DSS2-OMAPFB-Disable-forced-display-update-on-fb-cl.patch
new file mode 100644
index 0000000000..bf7febce2c
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0106-DSS2-OMAPFB-Disable-forced-display-update-on-fb-cl.patch
@@ -0,0 +1,48 @@
+From fc26a92aecdb3ea3f72196f4e17bbd55589a75a8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 10 Jun 2009 14:14:35 +0300
+Subject: [PATCH 106/146] DSS2: OMAPFB: Disable forced display update on fb close
+
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 1fe770c..b4ac9ec 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -613,6 +613,7 @@ static int omapfb_open(struct fb_info *fbi, int user)
+
+ static int omapfb_release(struct fb_info *fbi, int user)
+ {
++#if 0
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ struct omapfb2_device *fbdev = ofbi->fbdev;
+ struct omap_dss_device *display = fb2display(fbi);
+@@ -620,7 +621,7 @@ static int omapfb_release(struct fb_info *fbi, int user)
+ DBG("Closing fb with plane index %d\n", ofbi->id);
+
+ omapfb_lock(fbdev);
+-#if 1
++
+ if (display && display->get_update_mode && display->update) {
+ /* XXX this update should be removed, I think. But it's
+ * good for debugging */
+@@ -635,13 +636,12 @@ static int omapfb_release(struct fb_info *fbi, int user)
+ display->update(display, 0, 0, w, h);
+ }
+ }
+-#endif
+
+ if (display && display->sync)
+ display->sync(display);
+
+ omapfb_unlock(fbdev);
+-
++#endif
+ return 0;
+ }
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0107-DSS2-DSI-use-INIT_COMPLETION-not-init_completion.patch b/recipes/linux/linux-omap-pm/dss2/0107-DSS2-DSI-use-INIT_COMPLETION-not-init_completion.patch
new file mode 100644
index 0000000000..d0449bcaba
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0107-DSS2-DSI-use-INIT_COMPLETION-not-init_completion.patch
@@ -0,0 +1,25 @@
+From f33fa27066daa62b038fea897159756f78d5faf8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 11 Jun 2009 09:11:10 +0300
+Subject: [PATCH 107/146] DSS2: DSI: use INIT_COMPLETION, not init_completion
+
+---
+ drivers/video/omap2/dss/dsi.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 9181a45..b0294b8 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -1878,7 +1878,7 @@ static int dsi_vc_send_bta_sync(int channel)
+ int r = 0;
+ u32 err;
+
+- init_completion(&dsi.bta_completion);
++ INIT_COMPLETION(dsi.bta_completion);
+
+ dsi_vc_enable_bta_irq(channel);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0108-DSS2-DSI-Rewrite-of-the-DSI-update-and-cmd-queue.patch b/recipes/linux/linux-omap-pm/dss2/0108-DSS2-DSI-Rewrite-of-the-DSI-update-and-cmd-queue.patch
new file mode 100644
index 0000000000..e872bfdda9
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0108-DSS2-DSI-Rewrite-of-the-DSI-update-and-cmd-queue.patch
@@ -0,0 +1,1860 @@
+From 218fd1516751829b239e4c64f71291d291c6bc2c Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 11 Jun 2009 09:11:45 +0300
+Subject: [PATCH 108/146] DSS2: DSI: Rewrite of the DSI update and cmd queue
+
+---
+ drivers/video/omap2/dss/dsi.c | 1157 +++++++++++--------------------------
+ drivers/video/omap2/dss/dss.h | 3 +
+ drivers/video/omap2/dss/manager.c | 45 ++-
+ drivers/video/omap2/dss/overlay.c | 65 ++-
+ 4 files changed, 419 insertions(+), 851 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index b0294b8..f98da6f 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -26,12 +26,12 @@
+ #include <linux/err.h>
+ #include <linux/interrupt.h>
+ #include <linux/delay.h>
+-#include <linux/workqueue.h>
+ #include <linux/mutex.h>
+ #include <linux/seq_file.h>
+-#include <linux/kfifo.h>
+ #include <linux/platform_device.h>
+ #include <linux/regulator/consumer.h>
++#include <linux/kthread.h>
++#include <linux/wait.h>
+
+ #include <mach/board.h>
+ #include <mach/display.h>
+@@ -192,60 +192,10 @@ enum fifo_size {
+ DSI_FIFO_SIZE_128 = 4,
+ };
+
+-#define DSI_CMD_FIFO_LEN 16
+-
+-struct dsi_cmd_update {
+- int bytespp;
+- u16 x;
+- u16 y;
+- u16 w;
+- u16 h;
+-};
+-
+-struct dsi_cmd_mem_read {
+- void *buf;
+- size_t size;
+- u16 x;
+- u16 y;
+- u16 w;
+- u16 h;
+- size_t *ret_size;
+- struct completion *completion;
+-};
+-
+-struct dsi_cmd_test {
+- int test_num;
+- int *result;
+- struct completion *completion;
+-};
+-
+-enum dsi_cmd {
+- DSI_CMD_UPDATE,
+- DSI_CMD_AUTOUPDATE,
+- DSI_CMD_SYNC,
+- DSI_CMD_MEM_READ,
+- DSI_CMD_TEST,
+- DSI_CMD_SET_TE,
+- DSI_CMD_SET_UPDATE_MODE,
+- DSI_CMD_SET_ROTATE,
+- DSI_CMD_SET_MIRROR,
+-};
+-
+-struct dsi_cmd_item {
+- struct omap_dss_device *dssdev;
+-
+- enum dsi_cmd cmd;
+-
+- union {
+- struct dsi_cmd_update r;
+- struct completion *sync;
+- struct dsi_cmd_mem_read mem_read;
+- struct dsi_cmd_test test;
+- int te;
+- enum omap_dss_update_mode update_mode;
+- int rotate;
+- int mirror;
+- } u;
++struct dsi_update_region {
++ bool dirty;
++ u16 x, y, w, h;
++ struct omap_dss_device *device;
+ };
+
+ static struct
+@@ -272,30 +222,24 @@ static struct
+
+ struct completion bta_completion;
+
+- struct work_struct framedone_work;
+- struct work_struct process_work;
+- struct delayed_work framedone_timeout_work;
+- struct workqueue_struct *workqueue;
++ struct task_struct *thread;
++ wait_queue_head_t waitqueue;
++
++ spinlock_t update_lock;
++ bool framedone_received;
++ struct dsi_update_region update_region;
++ struct dsi_update_region active_update_region;
++ struct completion update_completion;
+
+ enum omap_dss_update_mode user_update_mode;
+- enum omap_dss_update_mode target_update_mode;
+ enum omap_dss_update_mode update_mode;
+- bool use_te;
++ bool te_enabled;
+ bool use_ext_te;
+- int framedone_scheduled; /* helps to catch strange framedone bugs */
+
+ unsigned long cache_req_pck;
+ unsigned long cache_clk_freq;
+ struct dsi_clock_info cache_cinfo;
+
+- struct kfifo *cmd_fifo;
+- spinlock_t cmd_lock;
+- struct completion cmd_done;
+- atomic_t cmd_fifo_full;
+- atomic_t cmd_pending;
+-
+- bool autoupdate_setup;
+-
+ u32 errors;
+ spinlock_t errors_lock;
+ #ifdef DEBUG
+@@ -303,14 +247,7 @@ static struct
+ ktime_t perf_start_time;
+ ktime_t perf_start_time_auto;
+ int perf_measure_frames;
+-
+- struct {
+- int x, y, w, h;
+- int bytespp;
+- } update_region;
+-
+ #endif
+- int debug_process;
+ int debug_read;
+ int debug_write;
+ } dsi;
+@@ -320,11 +257,6 @@ static unsigned int dsi_perf;
+ module_param_named(dsi_perf, dsi_perf, bool, 0644);
+ #endif
+
+-static void dsi_process_cmd_fifo(struct work_struct *work);
+-static void dsi_push_update(struct omap_dss_device *dssdev,
+- int x, int y, int w, int h);
+-static void dsi_push_autoupdate(struct omap_dss_device *dssdev);
+-
+ static inline void dsi_write_reg(const struct dsi_reg idx, u32 val)
+ {
+ __raw_writel(val, dsi.base + idx.idx);
+@@ -370,23 +302,23 @@ static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum,
+ }
+
+ #ifdef DEBUG
+-static void perf_mark_setup(void)
++static void dsi_perf_mark_setup(void)
+ {
+ dsi.perf_setup_time = ktime_get();
+ }
+
+-static void perf_mark_start(void)
++static void dsi_perf_mark_start(void)
+ {
+ dsi.perf_start_time = ktime_get();
+ }
+
+-static void perf_mark_start_auto(void)
++static void dsi_perf_mark_start_auto(void)
+ {
+ dsi.perf_measure_frames = 0;
+ dsi.perf_start_time_auto = ktime_get();
+ }
+
+-static void perf_show(const char *name)
++static void dsi_perf_show(const char *name)
+ {
+ ktime_t t, setup_time, trans_time;
+ u32 total_bytes;
+@@ -412,9 +344,9 @@ static void perf_show(const char *name)
+
+ total_us = setup_us + trans_us;
+
+- total_bytes = dsi.update_region.w *
+- dsi.update_region.h *
+- dsi.update_region.bytespp;
++ total_bytes = dsi.active_update_region.w *
++ dsi.active_update_region.h *
++ dsi.active_update_region.device->ctrl.pixel_size / 8;
+
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) {
+ static u32 s_total_trans_us, s_total_setup_us;
+@@ -465,7 +397,7 @@ static void perf_show(const char *name)
+ s_total_trans_us = 0;
+ s_min_trans_us = 0xffffffff;
+ s_max_trans_us = 0;
+- perf_mark_start_auto();
++ dsi_perf_mark_start_auto();
+ } else {
+ printk(KERN_INFO "DSI(%s): %u us + %u us = %u us (%uHz), "
+ "%u bytes, %u kbytes/sec\n",
+@@ -479,9 +411,10 @@ static void perf_show(const char *name)
+ }
+ }
+ #else
+-#define perf_mark_setup()
+-#define perf_mark_start()
+-#define perf_show(x)
++#define dsi_perf_mark_setup()
++#define dsi_perf_mark_start()
++#define dsi_perf_mark_start_auto()
++#define dsi_perf_show(x)
+ #endif
+
+ static void print_irq_status(u32 status)
+@@ -2464,7 +2397,7 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ int max_data_per_packet;
+ int max_pixels_per_packet;
+ int pixels_left;
+- int bytespp = 3;
++ int bytespp = dssdev->ctrl.pixel_size / 8;
+ int scr_width;
+ u32 __iomem *data;
+ int start_offset;
+@@ -2508,26 +2441,12 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+
+ DSSDBG("max_pixels_per_packet %d\n", max_pixels_per_packet);
+
+- dsi_bus_lock();
+-
+- dssdev->driver->setup_update(dssdev, x, y, w, h);
+-
+ pixels_left = w * h;
+
+ DSSDBG("total pixels %d\n", pixels_left);
+
+ data += start_offset;
+
+-#ifdef DEBUG
+- dsi.update_region.x = x;
+- dsi.update_region.y = y;
+- dsi.update_region.w = w;
+- dsi.update_region.h = h;
+- dsi.update_region.bytespp = bytespp;
+-#endif
+-
+- perf_mark_start();
+-
+ while (pixels_left > 0) {
+ /* 0x2c = write_memory_start */
+ /* 0x3c = write_memory_continue */
+@@ -2546,7 +2465,6 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
+- dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2559,7 +2477,6 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
+- dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2570,7 +2487,6 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ DSSERR("fifo stalls overflow, pixels left %d\n",
+ pixels_left);
+ dsi_if_enable(0);
+- dsi_bus_unlock();
+ return -EIO;
+ }
+ }
+@@ -2601,64 +2517,21 @@ static int dsi_update_screen_l4(struct omap_dss_device *dssdev,
+ DSI_FLUSH(0);
+ }
+
+- perf_show("L4");
+-
+- dsi_bus_unlock();
+-
+ return 0;
+ }
+
+-static void dsi_setup_update_dispc(struct omap_dss_device *dssdev,
+- u16 x, u16 y, u16 w, u16 h)
+-{
+- DSSDBG("dsi_setup_update_dispc(%d,%d %dx%d)\n",
+- x, y, w, h);
+-
+-#ifdef DEBUG
+- dsi.update_region.x = x;
+- dsi.update_region.y = y;
+- dsi.update_region.w = w;
+- dsi.update_region.h = h;
+- dsi.update_region.bytespp = 3; /* XXX */
+-#endif
+-
+- dispc_setup_partial_planes(dssdev, &x, &y, &w, &h);
+-
+- dispc_set_lcd_size(w, h);
+-}
+-
+-static void dsi_setup_autoupdate_dispc(struct omap_dss_device *dssdev)
+-{
+- u16 w, h;
+-
+- dssdev->get_resolution(dssdev, &w, &h);
+-
+-#ifdef DEBUG
+- dsi.update_region.x = 0;
+- dsi.update_region.y = 0;
+- dsi.update_region.w = w;
+- dsi.update_region.h = h;
+- dsi.update_region.bytespp = 3; /* XXX */
+-#endif
+-
+- /* the overlay settings may not have been applied, if we were in manual
+- * mode earlier, so do it here */
+- dssdev->manager->apply(dssdev->manager);
+-
+- dispc_set_lcd_size(w, h);
+-
+- dsi.autoupdate_setup = 0;
+-}
+-
+ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+- int bytespp = 3;
++ int bytespp = dssdev->ctrl.pixel_size / 8;
+ int len;
+ int total_len;
+ int packet_payload;
+ int packet_len;
+ u32 l;
++ bool use_te_trigger;
++
++ use_te_trigger = dsi.te_enabled && !dsi.use_ext_te;
+
+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL)
+ DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n",
+@@ -2677,24 +2550,15 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+ if (len % packet_payload)
+ total_len += (len % packet_payload) + 1;
+
+- dsi_bus_lock();
+-
+- dssdev->driver->setup_update(dssdev, x, y, w, h);
+-
+- if (dsi.use_ext_te && dssdev->wait_for_te)
+- dssdev->wait_for_te(dssdev);
+-
+ if (0)
+ dsi_vc_print_status(1);
+
+- perf_mark_start();
+-
+ l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
+ dsi_write_reg(DSI_VC_TE(1), l);
+
+ dsi_vc_write_long_header(1, DSI_DT_DCS_LONG_WRITE, packet_len, 0);
+
+- if (dsi.use_te)
++ if (use_te_trigger)
+ l = FLD_MOD(l, 1, 30, 30); /* TE_EN */
+ else
+ l = FLD_MOD(l, 1, 31, 31); /* TE_START */
+@@ -2702,62 +2566,81 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+
+ dispc_disable_sidle();
+
+- queue_delayed_work(dsi.workqueue, &dsi.framedone_timeout_work,
+- msecs_to_jiffies(1000));
+-
+ dispc_enable_lcd_out(1);
+
+- if (dsi.use_te)
++ if (use_te_trigger)
+ dsi_vc_send_bta(1);
+ }
+
+-static void framedone_timeout_callback(struct work_struct *work)
++static void dsi_framedone_irq_callback(void *data, u32 mask)
+ {
+- DSSERR("framedone timeout\n");
+-
+- dispc_enable_lcd_out(0);
++ dispc_enable_sidle();
+
+- /* XXX TODO: cancel the transfer properly */
++ dsi.framedone_received = true;
++ wake_up(&dsi.waitqueue);
++}
+
+- dsi_bus_unlock();
++static void dsi_set_update_region(struct omap_dss_device *dssdev,
++ u16 x, u16 y, u16 w, u16 h)
++{
++ spin_lock(&dsi.update_lock);
++ if (dsi.update_region.dirty) {
++ dsi.update_region.x = min(x, dsi.update_region.x);
++ dsi.update_region.y = min(y, dsi.update_region.y);
++ dsi.update_region.w = max(w, dsi.update_region.w);
++ dsi.update_region.h = max(h, dsi.update_region.h);
++ } else {
++ dsi.update_region.x = x;
++ dsi.update_region.y = y;
++ dsi.update_region.w = w;
++ dsi.update_region.h = h;
++ }
+
+- /* Schedule, so that other threads that want dsi-bus-lock can get it.
+- * Otherwise with autoupdate we may be holding it all the time */
+- schedule();
++ dsi.update_region.device = dssdev;
++ dsi.update_region.dirty = true;
+
+- /* XXX check that fifo is not full. otherwise we would sleep and never
+- * get to process_cmd_fifo below */
+- /* We check for target_update_mode, not update_mode. No reason to push
+- * new updates if we're turning auto update off */
+- if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_push_autoupdate(dsi.vc[1].dssdev);
++ spin_unlock(&dsi.update_lock);
+
+- atomic_set(&dsi.cmd_pending, 0);
+- dsi_process_cmd_fifo(NULL);
+ }
+
+-static void framedone_callback(void *data, u32 mask)
++static void dsi_start_auto_update(struct omap_dss_device *dssdev)
+ {
+- if (dsi.framedone_scheduled) {
+- DSSERR("Framedone already scheduled. Bogus FRAMEDONE IRQ?\n");
+- return;
+- }
++ u16 w, h;
++
++ DSSDBG("starting auto update\n");
+
+- cancel_delayed_work(&dsi.framedone_timeout_work);
++ /* In automatic mode the overlay settings are applied like on DPI/SDI.
++ * The overlay settings may not have been applied, if we were in manual
++ * mode earlier, so do it here */
++ dssdev->manager->apply(dssdev->manager);
+
+- dispc_enable_sidle();
++ dssdev->get_resolution(dssdev, &w, &h);
+
+- dsi.framedone_scheduled = 1;
++ dsi_set_update_region(dssdev, 0, 0, w, h);
+
+- /* We get FRAMEDONE when DISPC has finished sending pixels and turns
+- * itself off. However, DSI still has the pixels in its buffers, and
+- * is sending the data. Thus we have to wait until we can do a new
+- * transfer or turn the clocks off. We do that in a separate work
+- * func. */
+- queue_work(dsi.workqueue, &dsi.framedone_work);
++ dsi_perf_mark_start_auto();
++
++ wake_up(&dsi.waitqueue);
+ }
+
+-static void framedone_worker(struct work_struct *work)
++static int dsi_set_te(struct omap_dss_device *dssdev, bool enable)
++{
++ dssdev->driver->enable_te(dssdev, enable);
++
++ if (!dsi.use_ext_te) {
++ if (enable) {
++ /* disable LP_RX_TO, so that we can receive TE. Time
++ * to wait for TE is longer than the timer allows */
++ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
++ } else {
++ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
++ }
++ }
++
++ return 0;
++}
++
++static void dsi_handle_framedone(void)
+ {
+ u32 l;
+ unsigned long tmo;
+@@ -2765,17 +2648,21 @@ static void framedone_worker(struct work_struct *work)
+
+ l = REG_GET(DSI_VC_TE(1), 23, 0); /* TE_SIZE */
+
+- /* There shouldn't be much stuff in DSI buffers, if any, so we'll
+- * just busyloop */
++ /* We get FRAMEDONE when DISPC has finished sending pixels and turns
++ * itself off. However, DSI still has the pixels in its buffers, and is
++ * sending the data. Thus we have to wait until we can do a new
++ * transfer or turn the clocks off. There shouldn't be much stuff in
++ * DSI buffers, if any, so we'll just busyloop */
+ if (l > 0) {
+ tmo = jiffies + msecs_to_jiffies(50);
+ while (REG_GET(DSI_VC_TE(1), 23, 0) > 0) { /* TE_SIZE */
+ i++;
+ if (time_after(jiffies, tmo)) {
+- DSSERR("timeout waiting TE_SIZE to zero\n");
++ DSSERR("timeout waiting TE_SIZE to zero: %u\n",
++ REG_GET(DSI_VC_TE(1), 23, 0));
+ break;
+ }
+- cpu_relax();
++ schedule();
+ }
+ }
+
+@@ -2785,8 +2672,6 @@ static void framedone_worker(struct work_struct *work)
+ if (REG_GET(DSI_VC_TE(1), 31, 31))
+ DSSERR("TE_START not zero\n");
+
+- perf_show("DISPC");
+-
+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL)
+ DSSDBG("FRAMEDONE\n");
+
+@@ -2801,543 +2686,145 @@ static void framedone_worker(struct work_struct *work)
+ #ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC
+ dispc_fake_vsync_irq();
+ #endif
+- dsi.framedone_scheduled = 0;
+-
+- dsi_bus_unlock();
+-
+- /* Schedule, so that other threads that want dsi-bus-lock can get it.
+- * Otherwise with autoupdate we may be holding it all the time */
+- schedule();
+-
+- /* XXX check that fifo is not full. otherwise we would sleep and never
+- * get to process_cmd_fifo below */
+- /* We check for target_update_mode, not update_mode. No reason to push
+- * new updates if we're turning auto update off */
+- if (dsi.target_update_mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_push_autoupdate(dsi.vc[1].dssdev);
+-
+- atomic_set(&dsi.cmd_pending, 0);
+- dsi_process_cmd_fifo(NULL);
+ }
+
+-static void dsi_start_auto_update(struct omap_dss_device *dssdev)
+-{
+- DSSDBG("starting auto update\n");
+-
+- dsi.autoupdate_setup = 1;
+-
+- dsi_push_autoupdate(dssdev);
+-
+- perf_mark_start_auto();
+-}
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-/* FIFO functions */
+-
+-static void dsi_signal_fifo_waiters(void)
++static int dsi_update_thread(void *data)
+ {
+- if (atomic_read(&dsi.cmd_fifo_full) > 0) {
+- DSSDBG("SIGNALING: Fifo not full for waiter!\n");
+- complete(&dsi.cmd_done);
+- atomic_dec(&dsi.cmd_fifo_full);
+- }
+-}
++ unsigned long timeout;
++ struct omap_dss_device *device;
++ u16 x, y, w, h;
+
+-/* returns 1 for async op, and 0 for sync op */
+-static int dsi_do_update(struct omap_dss_device *dssdev,
+- struct dsi_cmd_update *upd)
+-{
+- int r;
+- u16 x = upd->x, y = upd->y, w = upd->w, h = upd->h;
+- u16 dw, dh;
+-
+- if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED)
+- return 0;
+-
+- if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+- return 0;
+-
+- dssdev->get_resolution(dssdev, &dw, &dh);
+- if (x > dw || y > dh)
+- return 0;
+-
+- if (x + w > dw)
+- w = dw - x;
+-
+- if (y + h > dh)
+- h = dh - y;
+-
+- DSSDBGF("%d,%d %dx%d", x, y, w, h);
+-
+- perf_mark_setup();
+-
+- if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+- dsi_setup_update_dispc(dssdev, x, y, w, h);
+- dsi_update_screen_dispc(dssdev, x, y, w, h);
+- return 1;
+- } else {
+- r = dsi_update_screen_l4(dssdev, x, y, w, h);
+- if (r)
+- DSSERR("L4 update failed\n");
+- return 0;
+- }
+-}
+-
+-/* returns 1 for async op, and 0 for sync op */
+-static int dsi_do_autoupdate(struct omap_dss_device *dssdev)
+-{
+- int r;
+- u16 w, h;
+-
+- if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED)
+- return 0;
+-
+- if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+- return 0;
+-
+- dssdev->get_resolution(dssdev, &w, &h);
+-
+- perf_mark_setup();
+-
+- if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+- if (dsi.autoupdate_setup)
+- dsi_setup_autoupdate_dispc(dssdev);
+- dsi_update_screen_dispc(dssdev, 0, 0, w, h);
+- return 1;
+- } else {
+- r = dsi_update_screen_l4(dssdev, 0, 0, w, h);
+- if (r)
+- DSSERR("L4 update failed\n");
+- return 0;
+- }
+-}
+-
+-static void dsi_do_cmd_mem_read(struct omap_dss_device *dssdev,
+- struct dsi_cmd_mem_read *mem_read)
+-{
+- int r;
+-
+- dsi_bus_lock();
+-
+- r = dssdev->driver->memory_read(dssdev,
+- mem_read->buf,
+- mem_read->size,
+- mem_read->x,
+- mem_read->y,
+- mem_read->w,
+- mem_read->h);
+-
+- dsi_bus_unlock();
+-
+- *mem_read->ret_size = (size_t)r;
+- complete(mem_read->completion);
+-}
+-
+-static void dsi_do_cmd_test(struct omap_dss_device *dssdev,
+- struct dsi_cmd_test *test)
+-{
+- int r = 0;
+-
+- DSSDBGF("");
+-
+- if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+- return;
+-
+- dsi_bus_lock();
+-
+- /* run test first in low speed mode */
+- dsi_vc_enable_hs(0, 0);
+-
+- if (dssdev->driver->run_test) {
+- r = dssdev->driver->run_test(dssdev, test->test_num);
+- if (r)
+- goto end;
+- }
+-
+- /* then in high speed */
+- dsi_vc_enable_hs(0, 1);
+-
+- if (dssdev->driver->run_test) {
+- r = dssdev->driver->run_test(dssdev, test->test_num);
+- if (r)
+- goto end;
+- }
+-
+-end:
+- dsi_vc_enable_hs(0, 1);
+-
+- dsi_bus_unlock();
+-
+- *test->result = r;
+- complete(test->completion);
+-
+- DSSDBG("test end\n");
+-}
+-
+-static void dsi_do_cmd_set_te(struct omap_dss_device *dssdev, bool enable)
+-{
+- if (!dssdev->phy.dsi.ext_te)
+- dsi.use_te = enable;
+- else
+- dsi.use_ext_te = enable;
+-
+- if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+- return;
+-
+- dsi_bus_lock();
+- dssdev->driver->enable_te(dssdev, enable);
+- dsi_bus_unlock();
+-
+- if (!dssdev->phy.dsi.ext_te) {
+- if (enable) {
+- /* disable LP_RX_TO, so that we can receive TE. Time
+- * to wait for TE is longer than the timer allows */
+- REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
+- } else {
+- REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
+- }
+- }
+-}
+-
+-static void dsi_do_cmd_set_update_mode(struct omap_dss_device *dssdev,
+- enum omap_dss_update_mode mode)
+-{
+- dsi.update_mode = mode;
+-
+- if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+- return;
+-
+- if (mode == OMAP_DSS_UPDATE_AUTO)
+- dsi_start_auto_update(dssdev);
+-}
+-
+-static void dsi_process_cmd_fifo(struct work_struct *work)
+-{
+- int len;
+- struct dsi_cmd_item p;
+- unsigned long flags;
+- struct omap_dss_device *dssdev;
+- int exit = 0;
+-
+- if (dsi.debug_process)
+- DSSDBGF("");
+-
+- if (atomic_cmpxchg(&dsi.cmd_pending, 0, 1) == 1) {
+- if (dsi.debug_process)
+- DSSDBG("cmd pending, skip process\n");
+- return;
+- }
+-
+- while (!exit) {
+- spin_lock_irqsave(dsi.cmd_fifo->lock, flags);
+-
+- len = __kfifo_get(dsi.cmd_fifo, (unsigned char *)&p,
+- sizeof(p));
+- if (len == 0) {
+- if (dsi.debug_process)
+- DSSDBG("nothing more in fifo, atomic clear\n");
+- atomic_set(&dsi.cmd_pending, 0);
+- spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags);
+- break;
+- }
+-
+- spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags);
+-
+- BUG_ON(len != sizeof(p));
+-
+- dssdev = p.dssdev;
+-
+- if (dsi.debug_process)
+- DSSDBG("processing cmd %d\n", p.cmd);
+-
+- switch (p.cmd) {
+- case DSI_CMD_UPDATE:
+- if (dsi_do_update(dssdev, &p.u.r)) {
+- if (dsi.debug_process)
+- DSSDBG("async update\n");
+- exit = 1;
+- } else {
+- if (dsi.debug_process)
+- DSSDBG("sync update\n");
+- }
+- break;
+-
+- case DSI_CMD_AUTOUPDATE:
+- if (dsi_do_autoupdate(dssdev)) {
+- if (dsi.debug_process)
+- DSSDBG("async autoupdate\n");
+- exit = 1;
+- } else {
+- if (dsi.debug_process)
+- DSSDBG("sync autoupdate\n");
+- }
+- break;
+-
+- case DSI_CMD_SYNC:
+- if (dsi.debug_process)
+- DSSDBG("Signaling SYNC done!\n");
+- complete(p.u.sync);
+- break;
+-
+- case DSI_CMD_MEM_READ:
+- dsi_do_cmd_mem_read(dssdev, &p.u.mem_read);
+- break;
++ while (1) {
++ bool sched;
+
+- case DSI_CMD_TEST:
+- dsi_do_cmd_test(dssdev, &p.u.test);
+- break;
++ wait_event_interruptible(dsi.waitqueue,
++ dsi.update_mode == OMAP_DSS_UPDATE_AUTO ||
++ (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL &&
++ dsi.update_region.dirty == true) ||
++ kthread_should_stop());
+
+- case DSI_CMD_SET_TE:
+- dsi_do_cmd_set_te(dssdev, p.u.te);
++ if (kthread_should_stop())
+ break;
+
+- case DSI_CMD_SET_UPDATE_MODE:
+- dsi_do_cmd_set_update_mode(dssdev, p.u.update_mode);
+- break;
+-
+- case DSI_CMD_SET_ROTATE:
+- dsi_bus_lock();
+- dssdev->driver->set_rotate(dssdev, p.u.rotate);
+- if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
+- dsi.autoupdate_setup = 1;
+- dsi_bus_unlock();
+- break;
++ dsi_bus_lock();
+
+- case DSI_CMD_SET_MIRROR:
+- dsi_bus_lock();
+- dssdev->driver->set_mirror(dssdev, p.u.mirror);
++ if (dsi.update_mode == OMAP_DSS_UPDATE_DISABLED ||
++ kthread_should_stop()) {
+ dsi_bus_unlock();
+ break;
+-
+- default:
+- BUG();
+ }
+- }
+-
+- if (dsi.debug_process)
+- DSSDBG("exit dsi_process_cmd_fifo\n");
+-
+- dsi_signal_fifo_waiters();
+-}
+-
+-static void dsi_push_cmd(struct dsi_cmd_item *p)
+-{
+- int ret;
+
+- if (dsi.debug_process)
+- DSSDBGF("");
++ dsi_perf_mark_setup();
+
+- while (1) {
+- unsigned long flags;
+- unsigned avail, used;
+-
+- spin_lock_irqsave(dsi.cmd_fifo->lock, flags);
+- used = __kfifo_len(dsi.cmd_fifo) / sizeof(struct dsi_cmd_item);
+- avail = DSI_CMD_FIFO_LEN - used;
+-
+- if (dsi.debug_process)
+- DSSDBG("%u/%u items left in fifo\n", avail, used);
+-
+- if (avail == 0) {
+- if (dsi.debug_process)
+- DSSDBG("cmd fifo full, waiting...\n");
+- spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags);
+- atomic_inc(&dsi.cmd_fifo_full);
+- wait_for_completion(&dsi.cmd_done);
+- if (dsi.debug_process)
+- DSSDBG("cmd fifo not full, woke up\n");
+- continue;
++ if (dsi.update_region.dirty) {
++ spin_lock(&dsi.update_lock);
++ dsi.active_update_region = dsi.update_region;
++ dsi.update_region.dirty = false;
++ spin_unlock(&dsi.update_lock);
+ }
+
+- ret = __kfifo_put(dsi.cmd_fifo, (unsigned char *)p,
+- sizeof(*p));
+-
+- spin_unlock_irqrestore(dsi.cmd_fifo->lock, flags);
+-
+- BUG_ON(ret != sizeof(*p));
+-
+- break;
+- }
+-
+- queue_work(dsi.workqueue, &dsi.process_work);
+-}
+-
+-static void dsi_push_update(struct omap_dss_device *dssdev,
+- int x, int y, int w, int h)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_UPDATE;
+-
+- p.u.r.x = x;
+- p.u.r.y = y;
+- p.u.r.w = w;
+- p.u.r.h = h;
+-
+- DSSDBG("pushing UPDATE %d,%d %dx%d\n", x, y, w, h);
+-
+- dsi_push_cmd(&p);
+-}
+-
+-static void dsi_push_autoupdate(struct omap_dss_device *dssdev)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_AUTOUPDATE;
+-
+- dsi_push_cmd(&p);
+-}
+-
+-static void dsi_push_sync(struct omap_dss_device *dssdev,
+- struct completion *sync_comp)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_SYNC;
+- p.u.sync = sync_comp;
+-
+- DSSDBG("pushing SYNC\n");
+-
+- dsi_push_cmd(&p);
+-}
+-
+-static void dsi_push_mem_read(struct omap_dss_device *dssdev,
+- struct dsi_cmd_mem_read *mem_read)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_MEM_READ;
+- p.u.mem_read = *mem_read;
++ device = dsi.active_update_region.device;
++ x = dsi.active_update_region.x;
++ y = dsi.active_update_region.y;
++ w = dsi.active_update_region.w;
++ h = dsi.active_update_region.h;
+
+- DSSDBG("pushing MEM_READ\n");
+-
+- dsi_push_cmd(&p);
+-}
+-
+-static void dsi_push_test(struct omap_dss_device *dssdev, int test_num,
+- int *result, struct completion *completion)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_TEST;
+- p.u.test.test_num = test_num;
+- p.u.test.result = result;
+- p.u.test.completion = completion;
+-
+- DSSDBG("pushing TEST\n");
+-
+- dsi_push_cmd(&p);
+-}
++ if (device->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+
+-static void dsi_push_set_te(struct omap_dss_device *dssdev, bool enable)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_SET_TE;
+- p.u.te = enable;
+-
+- DSSDBG("pushing SET_TE\n");
+-
+- dsi_push_cmd(&p);
+-}
+-
+-static void dsi_push_set_update_mode(struct omap_dss_device *dssdev,
+- enum omap_dss_update_mode mode)
+-{
+- struct dsi_cmd_item p;
+-
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_SET_UPDATE_MODE;
+- p.u.update_mode = mode;
+-
+- DSSDBG("pushing SET_UPDATE_MODE\n");
+-
+- dsi_push_cmd(&p);
+-}
++ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) {
++ dispc_setup_partial_planes(device,
++ &x, &y, &w, &h);
++#if 1
++ /* XXX there seems to be a bug in this driver
++ * or OMAP hardware. Some updates with certain
++ * widths and x coordinates fail. These widths
++ * are always odd, so "fix" it here for now */
++ if (w & 1) {
++ u16 dw, dh;
++ device->get_resolution(device, &dw, &dh);
++ if (x + w == dw)
++ x &= ~1;
++ ++w;
++
++ dispc_setup_partial_planes(device,
++ &x, &y, &w, &h);
++ }
++#endif
++ }
+
+-static void dsi_push_set_rotate(struct omap_dss_device *dssdev, int rotate)
+-{
+- struct dsi_cmd_item p;
++ dispc_set_lcd_size(w, h);
++ }
+
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_SET_ROTATE;
+- p.u.rotate = rotate;
++ /* XXX We don't need to send the update area coords to the
++ * panel every time. But for some reason TE doesn't work if we
++ * don't send at least a BTA here... */
++#if 0
++ if (dsi.active_update_region.dirty) {
++ dsi.active_update_region.dirty = false;
++ device->driver->setup_update(device, x, y, w, h);
++ }
++#else
++ device->driver->setup_update(device, x, y, w, h);
++#endif
+
+- DSSDBG("pushing SET_ROTATE\n");
++ if (dsi.te_enabled && dsi.use_ext_te && device->wait_for_te)
++ device->wait_for_te(device);
+
+- dsi_push_cmd(&p);
+-}
++ dsi_perf_mark_start();
+
+-static void dsi_push_set_mirror(struct omap_dss_device *dssdev, int mirror)
+-{
+- struct dsi_cmd_item p;
++ if (device->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ dsi_update_screen_dispc(device, x, y, w, h);
+
+- p.dssdev = dssdev;
+- p.cmd = DSI_CMD_SET_MIRROR;
+- p.u.mirror = mirror;
++ /* wait for framedone */
++ timeout = msecs_to_jiffies(500);
++ timeout = wait_event_timeout(dsi.waitqueue,
++ dsi.framedone_received == true,
++ timeout);
+
+- DSSDBG("pushing SET_MIRROR\n");
++ dsi.framedone_received = false;
+
+- dsi_push_cmd(&p);
+-}
++ if (timeout == 0) {
++ DSSERR("framedone timeout\n");
++ DSSERR("failed update %d,%d %dx%d\n",
++ x, y, w, h);
+
+-static int dsi_wait_sync(struct omap_dss_device *dssdev)
+-{
+- long wait = msecs_to_jiffies(2000);
+- struct completion compl;
++ dispc_enable_sidle();
++ dispc_enable_lcd_out(0);
++ } else {
++ dsi_handle_framedone();
++ dsi_perf_show("DISPC");
++ }
++ } else {
++ dsi_update_screen_l4(device, x, y, w, h);
++ dsi_perf_show("L4");
++ }
+
+- DSSDBGF("");
++ sched = atomic_read(&dsi.bus_lock.count) < 0;
+
+- init_completion(&compl);
+- dsi_push_sync(dssdev, &compl);
++ complete_all(&dsi.update_completion);
+
+- DSSDBG("Waiting for SYNC to happen...\n");
+- wait = wait_for_completion_timeout(&compl, wait);
+- DSSDBG("Released from SYNC\n");
++ dsi_bus_unlock();
+
+- if (wait == 0) {
+- DSSERR("timeout waiting sync\n");
+- return -ETIME;
++ /* XXX We need to give others chance to get the bus lock. Is
++ * there a better way for this? */
++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO && sched)
++ schedule_timeout_interruptible(1);
+ }
+
++ DSSDBG("update thread exiting\n");
++
+ return 0;
+ }
+
+
+
+-
+-
+-
+-
+-
+-
+-
+-
+-
+ /* Display funcs */
+
+ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
+ {
+ int r;
+
+- r = omap_dispc_register_isr(framedone_callback, NULL,
++ r = omap_dispc_register_isr(dsi_framedone_irq_callback, NULL,
+ DISPC_IRQ_FRAMEDONE);
+ if (r) {
+ DSSERR("can't get FRAMEDONE irq\n");
+@@ -3369,7 +2856,7 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
+
+ static void dsi_display_uninit_dispc(struct omap_dss_device *dssdev)
+ {
+- omap_dispc_unregister_isr(framedone_callback, NULL,
++ omap_dispc_unregister_isr(dsi_framedone_irq_callback, NULL,
+ DISPC_IRQ_FRAMEDONE);
+ }
+
+@@ -3380,8 +2867,6 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
+
+ _dsi_print_reset_status();
+
+- dsi_bus_lock();
+-
+ r = dsi_pll_init(1, 0);
+ if (r)
+ goto err0;
+@@ -3427,8 +2912,6 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
+ /* enable high-speed after initial config */
+ dsi_vc_enable_hs(0, 1);
+
+- dsi_bus_unlock();
+-
+ return 0;
+ err3:
+ dsi_if_enable(0);
+@@ -3437,16 +2920,13 @@ err2:
+ err1:
+ dsi_pll_uninit();
+ err0:
+- dsi_bus_unlock();
+ return r;
+ }
+
+ static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev)
+ {
+- dsi_bus_lock();
+ if (dssdev->driver->disable)
+ dssdev->driver->disable(dssdev);
+- dsi_bus_unlock();
+
+ dsi_complexio_uninit();
+ dsi_pll_uninit();
+@@ -3475,6 +2955,7 @@ static int dsi_display_enable(struct omap_dss_device *dssdev)
+ DSSDBG("dsi_display_enable\n");
+
+ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
+
+ r = omap_dss_start_device(dssdev);
+ if (r) {
+@@ -3507,15 +2988,17 @@ static int dsi_display_enable(struct omap_dss_device *dssdev)
+
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+- if (dsi.use_te || dsi.use_ext_te)
+- dsi_push_set_te(dssdev, 1);
++ dsi.use_ext_te = dssdev->phy.dsi.ext_te;
++ dsi_set_te(dssdev, dsi.te_enabled);
+
+- dsi_push_set_update_mode(dssdev, dsi.user_update_mode);
+- dsi.target_update_mode = dsi.user_update_mode;
++ dsi.update_mode = dsi.user_update_mode;
++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
++ dsi_start_auto_update(dssdev);
+
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+
+- return dsi_wait_sync(dssdev);
++ return 0;
+
+ err3:
+ dsi_display_uninit_dispc(dssdev);
+@@ -3525,6 +3008,7 @@ err2:
+ err1:
+ omap_dss_stop_device(dssdev);
+ err0:
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+ DSSDBG("dsi_display_enable FAILED\n");
+ return r;
+@@ -3535,18 +3019,13 @@ static void dsi_display_disable(struct omap_dss_device *dssdev)
+ DSSDBG("dsi_display_disable\n");
+
+ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
+
+ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED ||
+ dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
+ goto end;
+
+- if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) {
+- dsi_push_set_update_mode(dssdev, OMAP_DSS_UPDATE_DISABLED);
+- dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
+- }
+-
+- dsi_wait_sync(dssdev);
+-
++ dsi.update_mode = OMAP_DSS_UPDATE_DISABLED;
+ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
+ dsi_display_uninit_dispc(dssdev);
+@@ -3558,6 +3037,7 @@ static void dsi_display_disable(struct omap_dss_device *dssdev)
+
+ omap_dss_stop_device(dssdev);
+ end:
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+ }
+
+@@ -3566,18 +3046,13 @@ static int dsi_display_suspend(struct omap_dss_device *dssdev)
+ DSSDBG("dsi_display_suspend\n");
+
+ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
+
+ if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED ||
+ dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
+ goto end;
+
+- if (dsi.target_update_mode != OMAP_DSS_UPDATE_DISABLED) {
+- dsi_push_set_update_mode(dssdev, OMAP_DSS_UPDATE_DISABLED);
+- dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
+- }
+-
+- dsi_wait_sync(dssdev);
+-
++ dsi.update_mode = OMAP_DSS_UPDATE_DISABLED;
+ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+
+ dsi_display_uninit_dispc(dssdev);
+@@ -3587,6 +3062,7 @@ static int dsi_display_suspend(struct omap_dss_device *dssdev)
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
+ end:
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+
+ return 0;
+@@ -3599,6 +3075,7 @@ static int dsi_display_resume(struct omap_dss_device *dssdev)
+ DSSDBG("dsi_display_resume\n");
+
+ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
+
+ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) {
+ DSSERR("dssdev not suspended\n");
+@@ -3625,15 +3102,16 @@ static int dsi_display_resume(struct omap_dss_device *dssdev)
+
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+- if (dsi.use_te || dsi.use_ext_te)
+- dsi_push_set_te(dssdev, 1);
++ dsi_set_te(dssdev, dsi.te_enabled);
+
+- dsi_push_set_update_mode(dssdev, dsi.user_update_mode);
+- dsi.target_update_mode = dsi.user_update_mode;
++ dsi.update_mode = dsi.user_update_mode;
++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
++ dsi_start_auto_update(dssdev);
+
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+
+- return dsi_wait_sync(dssdev);
++ return 0;
+
+ err2:
+ dsi_display_uninit_dispc(dssdev);
+@@ -3641,6 +3119,7 @@ err1:
+ enable_clocks(0);
+ dsi_enable_pll_clock(0);
+ err0:
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+ DSSDBG("dsi_display_resume FAILED\n");
+ return r;
+@@ -3649,26 +3128,68 @@ err0:
+ static int dsi_display_update(struct omap_dss_device *dssdev,
+ u16 x, u16 y, u16 w, u16 h)
+ {
++ int r = 0;
++ u16 dw, dh;
++
+ DSSDBG("dsi_display_update(%d,%d %dx%d)\n", x, y, w, h);
+
++ mutex_lock(&dsi.lock);
++
++ if (dsi.update_mode != OMAP_DSS_UPDATE_MANUAL)
++ goto end;
++
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
++ goto end;
++
++ dssdev->get_resolution(dssdev, &dw, &dh);
++
++ if (x > dw || y > dh)
++ goto end;
++
++ if (x + w > dw)
++ w = dw - x;
++
++ if (y + h > dh)
++ h = dh - y;
++
+ if (w == 0 || h == 0)
+- return 0;
++ goto end;
+
+- mutex_lock(&dsi.lock);
++ dsi_set_update_region(dssdev, x, y, w, h);
+
+- if (dsi.target_update_mode == OMAP_DSS_UPDATE_MANUAL)
+- dsi_push_update(dssdev, x, y, w, h);
+- /* XXX else return error? */
++ wake_up(&dsi.waitqueue);
+
++end:
+ mutex_unlock(&dsi.lock);
+
+- return 0;
++ return r;
+ }
+
+ static int dsi_display_sync(struct omap_dss_device *dssdev)
+ {
+- DSSDBGF("");
+- return dsi_wait_sync(dssdev);
++ bool wait;
++
++ DSSDBG("dsi_display_sync()\n");
++
++ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
++
++ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL &&
++ dsi.update_region.dirty) {
++ INIT_COMPLETION(dsi.update_completion);
++ wait = true;
++ } else {
++ wait = false;
++ }
++
++ dsi_bus_unlock();
++ mutex_unlock(&dsi.lock);
++
++ if (wait)
++ wait_for_completion_interruptible(&dsi.update_completion);
++
++ DSSDBG("dsi_display_sync() done\n");
++ return 0;
+ }
+
+ static int dsi_display_set_update_mode(struct omap_dss_device *dssdev,
+@@ -3677,17 +3198,21 @@ static int dsi_display_set_update_mode(struct omap_dss_device *dssdev,
+ DSSDBGF("%d", mode);
+
+ mutex_lock(&dsi.lock);
++ dsi_bus_lock();
+
+- if (dsi.target_update_mode != mode) {
+- dsi_push_set_update_mode(dssdev, mode);
+-
+- dsi.target_update_mode = mode;
++ if (dsi.update_mode != mode) {
+ dsi.user_update_mode = mode;
++ dsi.update_mode = mode;
++
++ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE &&
++ mode == OMAP_DSS_UPDATE_AUTO)
++ dsi_start_auto_update(dssdev);
+ }
+
++ dsi_bus_unlock();
+ mutex_unlock(&dsi.lock);
+
+- return dsi_wait_sync(dssdev);
++ return 0;
+ }
+
+ static enum omap_dss_update_mode dsi_display_get_update_mode(
+@@ -3696,6 +3221,7 @@ static enum omap_dss_update_mode dsi_display_get_update_mode(
+ return dsi.update_mode;
+ }
+
++
+ static int dsi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ {
+ DSSDBGF("%d", enable);
+@@ -3703,28 +3229,45 @@ static int dsi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ if (!dssdev->driver->enable_te)
+ return -ENOENT;
+
+- dsi_push_set_te(dssdev, enable);
++ dsi_bus_lock();
++
++ dsi.te_enabled = enable;
++
++ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
++ goto end;
+
+- return dsi_wait_sync(dssdev);
++ dsi_set_te(dssdev, enable);
++end:
++ dsi_bus_unlock();
++
++ return 0;
+ }
+
+ static int dsi_display_get_te(struct omap_dss_device *dssdev)
+ {
+- return dsi.use_te | dsi.use_ext_te;
++ return dsi.te_enabled;
+ }
+
+-
+-
+ static int dsi_display_set_rotate(struct omap_dss_device *dssdev, u8 rotate)
+ {
++
+ DSSDBGF("%d", rotate);
+
+ if (!dssdev->driver->set_rotate || !dssdev->driver->get_rotate)
+ return -EINVAL;
+
+- dsi_push_set_rotate(dssdev, rotate);
++ dsi_bus_lock();
++ dssdev->driver->set_rotate(dssdev, rotate);
++ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO) {
++ u16 w, h;
++ /* the display dimensions may have changed, so set a new
++ * update region */
++ dssdev->get_resolution(dssdev, &w, &h);
++ dsi_set_update_region(dssdev, 0, 0, w, h);
++ }
++ dsi_bus_unlock();
+
+- return dsi_wait_sync(dssdev);
++ return 0;
+ }
+
+ static u8 dsi_display_get_rotate(struct omap_dss_device *dssdev)
+@@ -3742,9 +3285,11 @@ static int dsi_display_set_mirror(struct omap_dss_device *dssdev, bool mirror)
+ if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror)
+ return -EINVAL;
+
+- dsi_push_set_mirror(dssdev, mirror);
++ dsi_bus_lock();
++ dssdev->driver->set_mirror(dssdev, mirror);
++ dsi_bus_unlock();
+
+- return dsi_wait_sync(dssdev);
++ return 0;
+ }
+
+ static bool dsi_display_get_mirror(struct omap_dss_device *dssdev)
+@@ -3757,39 +3302,46 @@ static bool dsi_display_get_mirror(struct omap_dss_device *dssdev)
+
+ static int dsi_display_run_test(struct omap_dss_device *dssdev, int test_num)
+ {
+- long wait = msecs_to_jiffies(60000);
+- struct completion compl;
+- int result;
++ int r;
+
+ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EIO;
+
+ DSSDBGF("%d", test_num);
+
+- init_completion(&compl);
++ dsi_bus_lock();
+
+- dsi_push_test(dssdev, test_num, &result, &compl);
++ /* run test first in low speed mode */
++ dsi_vc_enable_hs(0, 0);
+
+- DSSDBG("Waiting for SYNC to happen...\n");
+- wait = wait_for_completion_timeout(&compl, wait);
+- DSSDBG("Released from SYNC\n");
++ if (dssdev->driver->run_test) {
++ r = dssdev->driver->run_test(dssdev, test_num);
++ if (r)
++ goto end;
++ }
+
+- if (wait == 0) {
+- DSSERR("timeout waiting test sync\n");
+- return -ETIME;
++ /* then in high speed */
++ dsi_vc_enable_hs(0, 1);
++
++ if (dssdev->driver->run_test) {
++ r = dssdev->driver->run_test(dssdev, test_num);
++ if (r)
++ goto end;
+ }
+
+- return result;
++end:
++ dsi_vc_enable_hs(0, 1);
++
++ dsi_bus_unlock();
++
++ return r;
+ }
+
+ static int dsi_display_memory_read(struct omap_dss_device *dssdev,
+ void *buf, size_t size,
+ u16 x, u16 y, u16 w, u16 h)
+ {
+- long wait = msecs_to_jiffies(60000);
+- struct completion compl;
+- struct dsi_cmd_mem_read mem_read;
+- size_t ret_size;
++ int r;
+
+ DSSDBGF("");
+
+@@ -3799,29 +3351,14 @@ static int dsi_display_memory_read(struct omap_dss_device *dssdev,
+ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ return -EIO;
+
+- init_completion(&compl);
+-
+- mem_read.x = x;
+- mem_read.y = y;
+- mem_read.w = w;
+- mem_read.h = h;
+- mem_read.buf = buf;
+- mem_read.size = size;
+- mem_read.ret_size = &ret_size;
+- mem_read.completion = &compl;
+-
+- dsi_push_mem_read(dssdev, &mem_read);
++ dsi_bus_lock();
+
+- DSSDBG("Waiting for SYNC to happen...\n");
+- wait = wait_for_completion_timeout(&compl, wait);
+- DSSDBG("Released from SYNC\n");
++ r = dssdev->driver->memory_read(dssdev, buf, size,
++ x, y, w, h);
+
+- if (wait == 0) {
+- DSSERR("timeout waiting mem read sync\n");
+- return -ETIME;
+- }
++ dsi_bus_unlock();
+
+- return ret_size;
++ return r;
+ }
+
+ static void dsi_configure_overlay(struct omap_overlay *ovl)
+@@ -3879,28 +3416,23 @@ int dsi_init(struct platform_device *pdev)
+ spin_lock_init(&dsi.errors_lock);
+ dsi.errors = 0;
+
+- spin_lock_init(&dsi.cmd_lock);
+- dsi.cmd_fifo = kfifo_alloc(
+- DSI_CMD_FIFO_LEN * sizeof(struct dsi_cmd_item),
+- GFP_KERNEL,
+- &dsi.cmd_lock);
+-
+- init_completion(&dsi.cmd_done);
+- atomic_set(&dsi.cmd_fifo_full, 0);
+- atomic_set(&dsi.cmd_pending, 0);
++ /* XXX fail properly */
+
+ init_completion(&dsi.bta_completion);
++ init_completion(&dsi.update_completion);
+
+- dsi.workqueue = create_singlethread_workqueue("dsi");
+- INIT_WORK(&dsi.framedone_work, framedone_worker);
+- INIT_WORK(&dsi.process_work, dsi_process_cmd_fifo);
+- INIT_DELAYED_WORK(&dsi.framedone_timeout_work,
+- framedone_timeout_callback);
++ dsi.thread = kthread_create(dsi_update_thread, NULL, "dsi");
++ if (IS_ERR(dsi.thread)) {
++ DSSERR("cannot create kthread\n");
++ return PTR_ERR(dsi.thread);
++ }
++ init_waitqueue_head(&dsi.waitqueue);
++ spin_lock_init(&dsi.update_lock);
+
+ mutex_init(&dsi.lock);
+ mutex_init(&dsi.bus_lock);
+
+- dsi.target_update_mode = OMAP_DSS_UPDATE_DISABLED;
++ dsi.update_mode = OMAP_DSS_UPDATE_DISABLED;
+ dsi.user_update_mode = OMAP_DSS_UPDATE_DISABLED;
+
+ dsi.base = ioremap(DSI_BASE, DSI_SZ_REGS);
+@@ -3924,20 +3456,19 @@ int dsi_init(struct platform_device *pdev)
+
+ enable_clocks(0);
+
++ wake_up_process(dsi.thread);
++
+ return 0;
+ }
+
+ void dsi_exit(void)
+ {
+- flush_workqueue(dsi.workqueue);
+- destroy_workqueue(dsi.workqueue);
++ kthread_stop(dsi.thread);
+
+ regulator_put(dsi.vdds_dsi_reg);
+
+ iounmap(dsi.base);
+
+- kfifo_free(dsi.cmd_fifo);
+-
+ DSSDBG("omap_dsi_exit\n");
+ }
+
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 1e40830..36f401b 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -185,6 +185,9 @@ void dss_init_overlays(struct platform_device *pdev);
+ void dss_uninit_overlays(struct platform_device *pdev);
+ int dss_check_overlay(struct omap_overlay *ovl, struct omap_dss_device *dssdev);
+ void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr);
++#ifdef L4_EXAMPLE
++void dss_overlay_setup_l4_manager(struct omap_overlay_manager *mgr);
++#endif
+ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force);
+
+ /* DSS */
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 798867c..eeca3f9 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -635,6 +635,42 @@ int dss_init_overlay_managers(struct platform_device *pdev)
+ }
+ }
+
++#ifdef L4_EXAMPLE
++ {
++ int omap_dss_mgr_apply_l4(struct omap_overlay_manager *mgr)
++ {
++ DSSDBG("omap_dss_mgr_apply_l4(%s)\n", mgr->name);
++
++ return 0;
++ }
++
++ struct omap_overlay_manager *mgr;
++ mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
++
++ BUG_ON(mgr == NULL);
++
++ mgr->name = "l4";
++ mgr->supported_displays =
++ OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI;
++
++ mgr->set_device = &omap_dss_set_device;
++ mgr->unset_device = &omap_dss_unset_device;
++ mgr->apply = &omap_dss_mgr_apply_l4;
++ mgr->set_manager_info = &omap_dss_mgr_set_info;
++ mgr->get_manager_info = &omap_dss_mgr_get_info;
++
++ dss_overlay_setup_l4_manager(mgr);
++
++ omap_dss_add_overlay_manager(mgr);
++
++ r = kobject_init_and_add(&mgr->kobj, &manager_ktype,
++ &pdev->dev.kobj, "managerl4");
++
++ if (r)
++ DSSERR("failed to create sysfs file\n");
++ }
++#endif
++
+ return 0;
+ }
+
+@@ -674,12 +710,3 @@ struct omap_overlay_manager *omap_dss_get_overlay_manager(int num)
+ }
+ EXPORT_SYMBOL(omap_dss_get_overlay_manager);
+
+-#ifdef L4_EXAMPLE
+-static int ovl_mgr_apply_l4(struct omap_overlay_manager *mgr)
+-{
+- DSSDBG("omap_dss_mgr_apply_l4(%s)\n", mgr->name);
+-
+- return 0;
+-}
+-#endif
+-
+diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
+index 31385f3..9f883aa 100644
+--- a/drivers/video/omap2/dss/overlay.c
++++ b/drivers/video/omap2/dss/overlay.c
+@@ -477,6 +477,15 @@ void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr)
+ mgr->overlays = dispc_overlays;
+ }
+
++#ifdef L4_EXAMPLE
++static struct omap_overlay *l4_overlays[1];
++void dss_overlay_setup_l4_manager(struct omap_overlay_manager *mgr)
++{
++ mgr->num_overlays = 1;
++ mgr->overlays = l4_overlays;
++}
++#endif
++
+ void dss_init_overlays(struct platform_device *pdev)
+ {
+ int i, r;
+@@ -534,6 +543,33 @@ void dss_init_overlays(struct platform_device *pdev)
+
+ dispc_overlays[i] = ovl;
+ }
++
++#ifdef L4_EXAMPLE
++ {
++ struct omap_overlay *ovl;
++ ovl = kzalloc(sizeof(*ovl), GFP_KERNEL);
++
++ BUG_ON(ovl == NULL);
++
++ ovl->name = "l4";
++ ovl->supported_modes = OMAP_DSS_COLOR_RGB24U;
++
++ ovl->set_manager = &omap_dss_set_manager;
++ ovl->unset_manager = &omap_dss_unset_manager;
++ ovl->set_overlay_info = &dss_ovl_set_overlay_info;
++ ovl->get_overlay_info = &dss_ovl_get_overlay_info;
++
++ omap_dss_add_overlay(ovl);
++
++ r = kobject_init_and_add(&ovl->kobj, &overlay_ktype,
++ &pdev->dev.kobj, "overlayl4");
++
++ if (r)
++ DSSERR("failed to create sysfs file\n");
++
++ l4_overlays[0] = ovl;
++ }
++#endif
+ }
+
+ /* connect overlays to the new device, if not already connected. if force
+@@ -577,35 +613,6 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force)
+ }
+ }
+ }
+-#ifdef L4_EXAMPLE
+- /* setup L4 overlay as an example */
+- {
+- static struct omap_overlay ovl = {
+- .name = "l4-ovl",
+- .supported_modes = OMAP_DSS_COLOR_RGB24U,
+- .set_manager = &omap_dss_set_manager,
+- .unset_manager = &omap_dss_unset_manager,
+- .setup_input = &omap_dss_setup_overlay_input,
+- .setup_output = &omap_dss_setup_overlay_output,
+- .enable = &omap_dss_enable_overlay,
+- };
+-
+- static struct omap_overlay_manager mgr = {
+- .name = "l4",
+- .num_overlays = 1,
+- .overlays = &ovl,
+- .set_display = &omap_dss_set_display,
+- .unset_display = &omap_dss_unset_display,
+- .apply = &ovl_mgr_apply_l4,
+- .supported_displays =
+- OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI,
+- };
+-
+- omap_dss_add_overlay(&ovl);
+- omap_dss_add_overlay_manager(&mgr);
+- omap_dss_set_manager(&ovl, &mgr);
+- }
+-#endif
+ }
+
+ void dss_uninit_overlays(struct platform_device *pdev)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0109-DSS2-let-init_display-return-an-error-code.patch b/recipes/linux/linux-omap-pm/dss2/0109-DSS2-let-init_display-return-an-error-code.patch
new file mode 100644
index 0000000000..5c24815c3f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0109-DSS2-let-init_display-return-an-error-code.patch
@@ -0,0 +1,235 @@
+From 858535f0afbc6d9fa345480408644d4a00584909 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 11:10:14 +0300
+Subject: [PATCH 109/146] DSS2: let init_display return an error code
+
+This is needed by an upcoming patch, in which sdi->init_display can
+fail.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+
+Conflicts:
+
+ drivers/video/omap2/dss/display.c
+ drivers/video/omap2/dss/dpi.c
+ drivers/video/omap2/dss/dsi.c
+ drivers/video/omap2/dss/dss.h
+ drivers/video/omap2/dss/rfbi.c
+ drivers/video/omap2/dss/sdi.c
+ drivers/video/omap2/dss/venc.c
+---
+ drivers/video/omap2/dss/display.c | 15 ++++++++++-----
+ drivers/video/omap2/dss/dpi.c | 4 +++-
+ drivers/video/omap2/dss/dsi.c | 4 +++-
+ drivers/video/omap2/dss/dss.h | 10 +++++-----
+ drivers/video/omap2/dss/rfbi.c | 4 +++-
+ drivers/video/omap2/dss/sdi.c | 4 +++-
+ drivers/video/omap2/dss/venc.c | 4 +++-
+ 7 files changed, 30 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 20fb1ca..1242c39 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -436,32 +436,37 @@ void dss_init_device(struct platform_device *pdev,
+
+ switch (dssdev->type) {
+ case OMAP_DISPLAY_TYPE_DPI:
+- dpi_init_display(dssdev);
++ r = dpi_init_display(dssdev);
+ break;
+ #ifdef CONFIG_OMAP2_DSS_RFBI
+ case OMAP_DISPLAY_TYPE_DBI:
+- rfbi_init_display(dssdev);
++ r = rfbi_init_display(dssdev);
+ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_VENC
+ case OMAP_DISPLAY_TYPE_VENC:
+- venc_init_display(dssdev);
++ r = venc_init_display(dssdev);
+ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_SDI
+ case OMAP_DISPLAY_TYPE_SDI:
+- sdi_init_display(dssdev);
++ r = sdi_init_display(dssdev);
+ break;
+ #endif
+ #ifdef CONFIG_OMAP2_DSS_DSI
+ case OMAP_DISPLAY_TYPE_DSI:
+- dsi_init_display(dssdev);
++ r = dsi_init_display(dssdev);
+ break;
+ #endif
+ default:
+ BUG();
+ }
+
++ if (r) {
++ DSSERR("failed to init display %s\n", dssdev->name);
++ return;
++ }
++
+ /* create device sysfs files */
+ i = 0;
+ while ((attr = display_sysfs_attrs[i++]) != NULL) {
+diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
+index d244e54..b6543c8 100644
+--- a/drivers/video/omap2/dss/dpi.c
++++ b/drivers/video/omap2/dss/dpi.c
+@@ -360,7 +360,7 @@ static enum omap_dss_update_mode dpi_display_get_update_mode(
+ OMAP_DSS_UPDATE_DISABLED;
+ }
+
+-void dpi_init_display(struct omap_dss_device *dssdev)
++int dpi_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("init_display\n");
+
+@@ -373,6 +373,8 @@ void dpi_init_display(struct omap_dss_device *dssdev)
+ dssdev->get_timings = dpi_get_timings;
+ dssdev->set_update_mode = dpi_display_set_update_mode;
+ dssdev->get_update_mode = dpi_display_get_update_mode;
++
++ return 0;
+ }
+
+ int dpi_init(void)
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index f98da6f..ffac77b 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -3377,7 +3377,7 @@ static void dsi_configure_overlay(struct omap_overlay *ovl)
+ dispc_setup_plane_fifo(plane, low, high);
+ }
+
+-void dsi_init_display(struct omap_dss_device *dssdev)
++int dsi_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("DSI init\n");
+
+@@ -3407,6 +3407,8 @@ void dsi_init_display(struct omap_dss_device *dssdev)
+
+ dsi.vc[0].dssdev = dssdev;
+ dsi.vc[1].dssdev = dssdev;
++
++ return 0;
+ }
+
+ int dsi_init(struct platform_device *pdev)
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 36f401b..53f0f3d 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -212,7 +212,7 @@ void dss_set_dac_pwrdn_bgz(bool enable);
+ /* SDI */
+ int sdi_init(bool skip_init);
+ void sdi_exit(void);
+-void sdi_init_display(struct omap_dss_device *display);
++int sdi_init_display(struct omap_dss_device *display);
+
+ /* DSI */
+ int dsi_init(struct platform_device *pdev);
+@@ -224,7 +224,7 @@ void dsi_dump_regs(struct seq_file *s);
+ void dsi_save_context(void);
+ void dsi_restore_context(void);
+
+-void dsi_init_display(struct omap_dss_device *display);
++int dsi_init_display(struct omap_dss_device *display);
+ void dsi_irq_handler(void);
+ unsigned long dsi_get_dsi1_pll_rate(void);
+ unsigned long dsi_get_dsi2_pll_rate(void);
+@@ -237,7 +237,7 @@ void dsi_pll_uninit(void);
+ /* DPI */
+ int dpi_init(void);
+ void dpi_exit(void);
+-void dpi_init_display(struct omap_dss_device *dssdev);
++int dpi_init_display(struct omap_dss_device *dssdev);
+
+ /* DISPC */
+ int dispc_init(void);
+@@ -329,7 +329,7 @@ void dispc_draw_partial_planes(struct omap_dss_device *dssdev);
+ int venc_init(struct platform_device *pdev);
+ void venc_exit(void);
+ void venc_dump_regs(struct seq_file *s);
+-void venc_init_display(struct omap_dss_device *display);
++int venc_init_display(struct omap_dss_device *display);
+
+ /* RFBI */
+ int rfbi_init(void);
+@@ -342,6 +342,6 @@ void rfbi_transfer_area(u16 width, u16 height,
+ void (callback)(void *data), void *data);
+ void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t);
+ unsigned long rfbi_get_max_tx_rate(void);
+-void rfbi_init_display(struct omap_dss_device *display);
++int rfbi_init_display(struct omap_dss_device *display);
+
+ #endif
+diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
+index e3cf799..96602ae 100644
+--- a/drivers/video/omap2/dss/rfbi.c
++++ b/drivers/video/omap2/dss/rfbi.c
+@@ -1294,7 +1294,7 @@ static void rfbi_display_disable(struct omap_dss_device *dssdev)
+ omap_dss_stop_device(dssdev);
+ }
+
+-void rfbi_init_display(struct omap_dss_device *dssdev)
++int rfbi_init_display(struct omap_dss_device *dssdev)
+ {
+ dssdev->enable = rfbi_display_enable;
+ dssdev->disable = rfbi_display_disable;
+@@ -1305,4 +1305,6 @@ void rfbi_init_display(struct omap_dss_device *dssdev)
+ rfbi.dssdev[dssdev->phy.rfbi.channel] = dssdev;
+
+ dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
++
++ return 0;
+ }
+diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
+index 393fcd5..86b9a56 100644
+--- a/drivers/video/omap2/dss/sdi.c
++++ b/drivers/video/omap2/dss/sdi.c
+@@ -228,7 +228,7 @@ static void sdi_get_timings(struct omap_dss_device *dssdev,
+ *timings = dssdev->panel.timings;
+ }
+
+-void sdi_init_display(struct omap_dss_device *dssdev)
++int sdi_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("SDI init\n");
+
+@@ -239,6 +239,8 @@ void sdi_init_display(struct omap_dss_device *dssdev)
+ dssdev->set_update_mode = sdi_display_set_update_mode;
+ dssdev->get_update_mode = sdi_display_get_update_mode;
+ dssdev->get_timings = sdi_get_timings;
++
++ return 0;
+ }
+
+ int sdi_init(bool skip_init)
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index 740c8c0..d8a83b2 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -711,7 +711,7 @@ static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
+ return 0;
+ }
+
+-void venc_init_display(struct omap_dss_device *dssdev)
++int venc_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("init_display\n");
+
+@@ -724,6 +724,8 @@ void venc_init_display(struct omap_dss_device *dssdev)
+ dssdev->check_timings = venc_check_timings;
+ dssdev->get_wss = venc_get_wss;
+ dssdev->set_wss = venc_set_wss;
++
++ return 0;
+ }
+
+ void venc_dump_regs(struct seq_file *s)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0110-DSS2-isolate-the-SDI-pads-when-SDI-is-disabled.patch b/recipes/linux/linux-omap-pm/dss2/0110-DSS2-isolate-the-SDI-pads-when-SDI-is-disabled.patch
new file mode 100644
index 0000000000..5a45e433a0
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0110-DSS2-isolate-the-SDI-pads-when-SDI-is-disabled.patch
@@ -0,0 +1,209 @@
+From 964c2a99d0b9db59bc716022c7f9f6da580f44d6 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 11:17:15 +0300
+Subject: [PATCH 110/146] DSS2: isolate the SDI pads when SDI is disabled
+
+When SDI is disabled there is still ~1.6mA drain through the VSDI_CSI
+regulator. This seems to be internal to the SDI module, since even
+disconnecting the LCD panel doesn't get rid of the drain. Also
+disabling/resetting the SDI or the DSS module doesn't help. The only
+solution is to configure the SDI pads to safe mode with pull up
+resistors enabled on them when SDI gets disabled.
+
+Bootloader / platform code is still responsible for setting up the
+muxing, so in the driver check if all required pads are in SDI mode
+or all of them are in non-configured state.
+
+Signed-off-by: Imre Deak <imre.deak@nokia.com>
+
+Conflicts:
+
+ arch/arm/plat-omap/include/mach/display.h
+---
+ arch/arm/plat-omap/include/mach/display.h | 2 +
+ drivers/video/omap2/dss/sdi.c | 110 ++++++++++++++++++++++++++++-
+ 2 files changed, 111 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 3d8ed69..0695497 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -344,6 +344,8 @@ struct omap_dss_device {
+
+ struct {
+ u8 datapairs;
++ unsigned pad_off_pe : 1; /* pull pads if disabled */
++ unsigned pad_off_pu : 1; /* pull up */
+ } sdi;
+
+ struct {
+diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
+index 86b9a56..c484e0c 100644
+--- a/drivers/video/omap2/dss/sdi.c
++++ b/drivers/video/omap2/dss/sdi.c
+@@ -23,17 +23,120 @@
+ #include <linux/clk.h>
+ #include <linux/delay.h>
+ #include <linux/err.h>
++#include <linux/io.h>
+
+ #include <mach/board.h>
+ #include <mach/display.h>
+ #include "dss.h"
+
++#define CONTROL_PADCONF_BASE 0x48002000
++
++#define OMAP_SDI_PAD_DIS(pe,pu) ((7 << 0) | /* MODE 7 = safe */ \
++ (((pe) ? 1 : 0) << 3) | /* PULL_ENA */ \
++ (((pu) ? 1 : 0) << 4) | /* PULL_UP */ \
++ (1 << 8)) /* INPUT_EN */
++
++#define OMAP_SDI_PAD_EN (1 << 0) /* MODE 1 = SDI_xx */
++
++#define OMAP_SDI_PAD_MASK OMAP_SDI_PAD_DIS(1, 1)
+
+ static struct {
+ bool skip_init;
+ bool update_enabled;
+ } sdi;
+
++/* CONTROL_PADCONF_DSS_DATAXX */
++const u16 sdi_pads[] =
++{
++ 0x0f0, /* 10[ 7..0]:SDI_DAT1N */
++ 0x0f2, /* 10[15..0]:SDI_DAT1P */
++ 0x0f4, /* 12[ 7..0]:SDI_DAT2N */
++ 0x0f6, /* 12[15..0]:SDI_DAT2P */
++ 0x0f8, /* 14[ 7..0]:SDI_DAT3N */
++ 0x0fa, /* 14[15..0]:SDI_DAT3P */
++ 0x108, /* 22[ 7..0]:SDI_CLKN */
++ 0x10a, /* 22[15..0]:SDI_CLKP */
++};
++
++/*
++ * Check if bootloader / platform code has configured the SDI pads properly.
++ * This means it either configured all required pads for SDI mode, or that it
++ * left all the required pads unconfigured.
++ */
++static int sdi_pad_init(struct omap_dss_device *dssdev)
++{
++ unsigned req_map;
++ bool configured = false;
++ bool unconfigured = false;
++ int data_pairs;
++ int i;
++
++ data_pairs = dssdev->phy.sdi.datapairs;
++ req_map = (1 << (data_pairs * 2)) - 1; /* data lanes */
++ req_map |= 3 << 6; /* clk lane */
++ for (i = 0; i < ARRAY_SIZE(sdi_pads); i++) {
++ u32 reg;
++ u32 val;
++
++ if (!((1 << i) & req_map))
++ /* Ignore unneded pads. */
++ continue;
++ reg = CONTROL_PADCONF_BASE + sdi_pads[i];
++ val = omap_readw(reg);
++ switch (val & 0x07) { /* pad mode */
++ case 1:
++ if (unconfigured)
++ break;
++ /* Is the pull configuration ok for SDI mode? */
++ if ((val & OMAP_SDI_PAD_MASK) != OMAP_SDI_PAD_EN)
++ break;
++ configured = true;
++ break;
++ case 0:
++ case 7:
++ if (configured)
++ break;
++ unconfigured = true;
++ break;
++ default:
++ break;
++ }
++ }
++ if (i != ARRAY_SIZE(sdi_pads)) {
++ DSSERR("SDI: invalid pad configuration\n");
++ return -1;
++ }
++
++ return 0;
++}
++
++static void sdi_pad_config(struct omap_dss_device *dssdev, bool enable)
++{
++ int data_pairs;
++ bool pad_off_pe, pad_off_pu;
++ unsigned req_map;
++ int i;
++
++ data_pairs = dssdev->phy.sdi.datapairs;
++ pad_off_pe = dssdev->phy.sdi.pad_off_pe;
++ pad_off_pu = dssdev->phy.sdi.pad_off_pu;
++ req_map = (1 << (data_pairs * 2)) - 1; /* data lanes */
++ req_map |= 3 << 6; /* clk lane */
++ for (i = 0; i < ARRAY_SIZE(sdi_pads); i++) {
++ u32 reg;
++ u16 val;
++
++ if (!((1 << i) & req_map))
++ continue;
++ if (enable)
++ val = OMAP_SDI_PAD_EN;
++ else
++ val = OMAP_SDI_PAD_DIS(pad_off_pe, pad_off_pu);
++ reg = CONTROL_PADCONF_BASE + sdi_pads[i];
++ omap_writew(val, reg);
++ }
++}
++
+ static void sdi_basic_init(void)
+ {
+ dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS);
+@@ -64,6 +167,8 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
+ goto err1;
+ }
+
++ sdi_pad_config(dssdev, 1);
++
+ /* In case of skip_init sdi_init has already enabled the clocks */
+ if (!sdi.skip_init)
+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
+@@ -153,6 +258,7 @@ static void sdi_display_disable(struct omap_dss_device *dssdev)
+ dss_sdi_disable();
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
++ sdi_pad_config(dssdev, 0);
+
+ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
+@@ -172,6 +278,7 @@ static int sdi_display_suspend(struct omap_dss_device *dssdev)
+ dss_sdi_disable();
+
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
++ sdi_pad_config(dssdev, 0);
+
+ dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
+
+@@ -183,6 +290,7 @@ static int sdi_display_resume(struct omap_dss_device *dssdev)
+ if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED)
+ return -EINVAL;
+
++ sdi_pad_config(dssdev, 1);
+ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+ dss_sdi_enable();
+@@ -240,7 +348,7 @@ int sdi_init_display(struct omap_dss_device *dssdev)
+ dssdev->get_update_mode = sdi_display_get_update_mode;
+ dssdev->get_timings = sdi_get_timings;
+
+- return 0;
++ return sdi_pad_init(dssdev);
+ }
+
+ int sdi_init(bool skip_init)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0111-DSS2-Fix-bottom-field-initial-starting-line.patch b/recipes/linux/linux-omap-pm/dss2/0111-DSS2-Fix-bottom-field-initial-starting-line.patch
new file mode 100644
index 0000000000..a7970dca21
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0111-DSS2-Fix-bottom-field-initial-starting-line.patch
@@ -0,0 +1,210 @@
+From 740a3556ebdb8b046b91287a48a6c0fd84fdc1b2 Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com>
+Date: Mon, 1 Jun 2009 17:06:26 +0200
+Subject: [PATCH 111/146] DSS2: Fix bottom field initial starting line
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+When downscaling the bottom field offset may be several source lines.
+Unfortunately the registers for the initial accumulator value will only
+hold the fractional part of of that offset so the integer part must be
+added to the bottom field base address. The TV-out quality is
+significantly improved as a result. Additionally this fixes the bottom
+field offset with DMA rotation and mirroring enabled as it was
+previously miscalculated.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+---
+ drivers/video/omap2/dss/dispc.c | 69 +++++++++++++++++++++++++-------------
+ 1 files changed, 45 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 762a0f1..2463bab 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1100,7 +1100,7 @@ static void _dispc_set_scaling(enum omap_plane plane,
+ */
+ if (ilace && !fieldmode) {
+ accu1 = 0;
+- accu0 = fir_vinc / 2;
++ accu0 = (fir_vinc / 2) & 0x3ff;
+ if (accu0 >= 1024/2) {
+ accu1 = 1024/2;
+ accu0 -= accu1;
+@@ -1178,6 +1178,7 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+ u16 screen_width,
+ u16 width, u16 height,
+ enum omap_color_mode color_mode, bool fieldmode,
++ unsigned int field_offset,
+ unsigned *offset0, unsigned *offset1,
+ s32 *row_inc, s32 *pix_inc)
+ {
+@@ -1227,8 +1228,8 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+ case 1:
+ case 3:
+ *offset1 = 0;
+- if (fieldmode)
+- *offset0 = screen_width * ps;
++ if (field_offset)
++ *offset0 = field_offset * screen_width * ps;
+ else
+ *offset0 = 0;
+
+@@ -1249,8 +1250,8 @@ static void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
+ case 5:
+ case 7:
+ *offset1 = 0;
+- if (fieldmode)
+- *offset0 = screen_width * ps;
++ if (field_offset)
++ *offset0 = field_offset * screen_width * ps;
+ else
+ *offset0 = 0;
+ *row_inc = pixinc(1 - (screen_width + width) -
+@@ -1268,6 +1269,7 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ u16 screen_width,
+ u16 width, u16 height,
+ enum omap_color_mode color_mode, bool fieldmode,
++ unsigned int field_offset,
+ unsigned *offset0, unsigned *offset1,
+ s32 *row_inc, s32 *pix_inc)
+ {
+@@ -1320,10 +1322,10 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ switch (rotation + mirror * 4) {
+ case 0:
+ *offset1 = 0;
+- if (fieldmode)
+- *offset0 = screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 + field_offset * screen_width * ps;
+ else
+- *offset0 = 0;
++ *offset0 = *offset1;
+ *row_inc = pixinc(1 + (screen_width - fbw) +
+ (fieldmode ? screen_width : 0),
+ ps);
+@@ -1331,8 +1333,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ break;
+ case 1:
+ *offset1 = screen_width * (fbh - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 + ps;
++ if (field_offset)
++ *offset0 = *offset1 + field_offset * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(screen_width * (fbh - 1) + 1 +
+@@ -1341,8 +1343,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ break;
+ case 2:
+ *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 - screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 - field_offset * screen_width * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(-1 -
+@@ -1353,8 +1355,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ break;
+ case 3:
+ *offset1 = (fbw - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 - ps;
++ if (field_offset)
++ *offset0 = *offset1 - field_offset * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(-screen_width * (fbh - 1) - 1 -
+@@ -1365,8 +1367,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+ /* mirroring */
+ case 0 + 4:
+ *offset1 = (fbw - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 + screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 + field_offset * screen_width * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(screen_width * 2 - 1 +
+@@ -1377,8 +1379,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+
+ case 1 + 4:
+ *offset1 = 0;
+- if (fieldmode)
+- *offset0 = *offset1 + screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 + field_offset * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(-screen_width * (fbh - 1) + 1 +
+@@ -1389,8 +1391,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+
+ case 2 + 4:
+ *offset1 = screen_width * (fbh - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 + screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 - field_offset * screen_width * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(1 - screen_width * 2 -
+@@ -1401,8 +1403,8 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror,
+
+ case 3 + 4:
+ *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
+- if (fieldmode)
+- *offset0 = *offset1 + screen_width * ps;
++ if (field_offset)
++ *offset0 = *offset1 - field_offset * ps;
+ else
+ *offset0 = *offset1;
+ *row_inc = pixinc(screen_width * (fbh - 1) - 1 -
+@@ -1498,6 +1500,7 @@ static int _dispc_setup_plane(enum omap_plane plane,
+ s32 row_inc;
+ s32 pix_inc;
+ u16 frame_height = height;
++ unsigned int field_offset = 0;
+
+ if (paddr == 0)
+ return -EINVAL;
+@@ -1596,15 +1599,33 @@ static int _dispc_setup_plane(enum omap_plane plane,
+ return -EINVAL;
+ }
+
++ if (ilace && !fieldmode) {
++ /*
++ * when downscaling the bottom field may have to start several
++ * source lines below the top field. Unfortunately ACCUI
++ * registers will only hold the fractional part of the offset
++ * so the integer part must be added to the base address of the
++ * bottom field.
++ */
++ if (!height || height == out_height)
++ field_offset = 0;
++ else
++ field_offset = height / out_height / 2;
++ }
++
++ /* Fields are independent but interleaved in memory. */
++ if (fieldmode)
++ field_offset = 1;
++
+ if (rotation_type == OMAP_DSS_ROT_DMA)
+ calc_dma_rotation_offset(rotation, mirror,
+ screen_width, width, frame_height, color_mode,
+- fieldmode,
++ fieldmode, field_offset,
+ &offset0, &offset1, &row_inc, &pix_inc);
+ else
+ calc_vrfb_rotation_offset(rotation, mirror,
+ screen_width, width, frame_height, color_mode,
+- fieldmode,
++ fieldmode, field_offset,
+ &offset0, &offset1, &row_inc, &pix_inc);
+
+ DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0112-DSS2-Correctly-determine-if-an-interlaced-display-i.patch b/recipes/linux/linux-omap-pm/dss2/0112-DSS2-Correctly-determine-if-an-interlaced-display-i.patch
new file mode 100644
index 0000000000..0a3a1be555
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0112-DSS2-Correctly-determine-if-an-interlaced-display-i.patch
@@ -0,0 +1,50 @@
+From a9a5c0bd138aaf83b4eeff0b2923abdb255be55c Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 11:22:24 +0300
+Subject: [PATCH 112/146] DSS2: Correctly determine if an interlaced display is used
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+When applying the settings to all the overlays ilace is initialzed to 0
+in the beginning and then changed to 1 when the first overlay directed
+to an interlaced display is found. If there are more overlays after that
+one which are not directed to an interlaced display the code would still
+pass ilace=1 to the the dispc code which would halve the output height of
+the overlay. Fix the problem by correctly setting ilace for each overlay.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+
+Conflicts:
+
+ drivers/video/omap2/dss/manager.c
+---
+ drivers/video/omap2/dss/manager.c | 5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index eeca3f9..f6df4d6 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -412,7 +412,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ enum omap_dss_update_mode mode;
+ struct omap_dss_device *dssdev;
+ struct omap_overlay *ovl;
+- bool ilace = 0;
++ bool ilace;
+ int outw, outh;
+ int r;
+ int num_planes_enabled = 0;
+@@ -452,8 +452,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+ mode != OMAP_DSS_UPDATE_AUTO)
+ continue;
+
+- if (dssdev->type == OMAP_DISPLAY_TYPE_VENC)
+- ilace = 1;
++ ilace = dssdev->type == OMAP_DISPLAY_TYPE_VENC;
+
+ if (ovl->info.out_width == 0)
+ outw = ovl->info.width;
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0113-DSS2-Fix-omapfb-framebuffer-name.patch b/recipes/linux/linux-omap-pm/dss2/0113-DSS2-Fix-omapfb-framebuffer-name.patch
new file mode 100644
index 0000000000..020e065a76
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0113-DSS2-Fix-omapfb-framebuffer-name.patch
@@ -0,0 +1,115 @@
+From e9115293f6b4c7f737a5eeba34c2769dfd030e5d Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 11:25:19 +0300
+Subject: [PATCH 113/146] DSS2: Fix omapfb framebuffer name
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+
+After clearing the fix and var screeninfos fix.id should be reset to
+the proper value. Move the relevant memset() and strncpy() calls into
+a helper function which does the right thing.
+
+Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
+
+Conflicts:
+
+ drivers/video/omap2/omapfb/omapfb-main.c
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 30 +++++++++++++++---------------
+ 1 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index b4ac9ec..dc9c06c 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -1171,6 +1171,13 @@ static void omapfb_free_fbmem(struct fb_info *fbi)
+ rg->size = 0;
+ }
+
++static void clear_fb_info(struct fb_info *fbi)
++{
++ memset(&fbi->var, 0, sizeof(fbi->var));
++ memset(&fbi->fix, 0, sizeof(fbi->fix));
++ strlcpy(fbi->fix.id, MODULE_NAME, sizeof(fbi->fix.id));
++}
++
+ static int omapfb_free_all_fbmem(struct omapfb2_device *fbdev)
+ {
+ int i;
+@@ -1180,8 +1187,7 @@ static int omapfb_free_all_fbmem(struct omapfb2_device *fbdev)
+ for (i = 0; i < fbdev->num_fbs; i++) {
+ struct fb_info *fbi = fbdev->fbs[i];
+ omapfb_free_fbmem(fbi);
+- memset(&fbi->fix, 0, sizeof(fbi->fix));
+- memset(&fbi->var, 0, sizeof(fbi->var));
++ clear_fb_info(fbi);
+ }
+
+ return 0;
+@@ -1509,8 +1515,7 @@ int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type)
+ omapfb_free_fbmem(fbi);
+
+ if (size == 0) {
+- memset(&fbi->fix, 0, sizeof(fbi->fix));
+- memset(&fbi->var, 0, sizeof(fbi->var));
++ clear_fb_info(fbi);
+ return 0;
+ }
+
+@@ -1520,10 +1525,8 @@ int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type)
+ if (old_size)
+ omapfb_alloc_fbmem(fbi, old_size, old_paddr);
+
+- if (rg->size == 0) {
+- memset(&fbi->fix, 0, sizeof(fbi->fix));
+- memset(&fbi->var, 0, sizeof(fbi->var));
+- }
++ if (rg->size == 0)
++ clear_fb_info(fbi);
+
+ return r;
+ }
+@@ -1556,8 +1559,7 @@ int omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type)
+ return 0;
+ err:
+ omapfb_free_fbmem(fbi);
+- memset(&fbi->fix, 0, sizeof(fbi->fix));
+- memset(&fbi->var, 0, sizeof(fbi->var));
++ clear_fb_info(fbi);
+ return r;
+ }
+
+@@ -1565,7 +1567,6 @@ err:
+ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+ {
+ struct fb_var_screeninfo *var = &fbi->var;
+- struct fb_fix_screeninfo *fix = &fbi->fix;
+ struct omap_dss_device *display = fb2display(fbi);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+ int r = 0;
+@@ -1574,11 +1575,8 @@ int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
+ fbi->flags = FBINFO_FLAG_DEFAULT;
+ fbi->pseudo_palette = fbdev->pseudo_palette;
+
+- strncpy(fix->id, MODULE_NAME, sizeof(fix->id));
+-
+ if (ofbi->region.size == 0) {
+- memset(&fbi->fix, 0, sizeof(fbi->fix));
+- memset(&fbi->var, 0, sizeof(fbi->var));
++ clear_fb_info(fbi);
+ return 0;
+ }
+
+@@ -1728,6 +1726,8 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
+ return -ENOMEM;
+ }
+
++ clear_fb_info(fbi);
++
+ fbdev->fbs[i] = fbi;
+
+ ofbi = FB2OFB(fbi);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0114-DSS2-Overo-update-defconfig-to-lighter-one.patch b/recipes/linux/linux-omap-pm/dss2/0114-DSS2-Overo-update-defconfig-to-lighter-one.patch
new file mode 100644
index 0000000000..dcd293c407
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0114-DSS2-Overo-update-defconfig-to-lighter-one.patch
@@ -0,0 +1,1217 @@
+From acd5985012f2e205a2613d29487ba347a99c5393 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 21:57:15 +0300
+Subject: [PATCH 114/146] DSS2: Overo: update defconfig to lighter one
+
+---
+ arch/arm/configs/dss_overo_defconfig | 598 ++++++++++------------------------
+ 1 files changed, 174 insertions(+), 424 deletions(-)
+
+diff --git a/arch/arm/configs/dss_overo_defconfig b/arch/arm/configs/dss_overo_defconfig
+index 755a1b6..38a452c 100644
+--- a/arch/arm/configs/dss_overo_defconfig
++++ b/arch/arm/configs/dss_overo_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-omap1
+-# Thu Apr 2 11:30:57 2009
++# Linux kernel version: 2.6.31-rc1-omap1
++# Thu Jul 2 17:24:24 2009
+ #
+ CONFIG_ARM=y
+ CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+@@ -9,7 +9,6 @@ CONFIG_GENERIC_GPIO=y
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_MMU=y
+-# CONFIG_NO_IOPORT is not set
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_STACKTRACE_SUPPORT=y
+ CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+@@ -18,23 +17,23 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+ CONFIG_OPROFILE_ARMV7=y
+ CONFIG_VECTORS_BASE=0xffff0000
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++CONFIG_CONSTRUCTORS=y
+
+ #
+ # General setup
+ #
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+ CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_LOCALVERSION_AUTO is not set
+ CONFIG_SWAP=y
+ CONFIG_SYSVIPC=y
+ CONFIG_SYSVIPC_SYSCTL=y
+@@ -67,6 +66,9 @@ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_NAMESPACES is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ CONFIG_ANON_INODES=y
+@@ -88,21 +90,32 @@ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_AIO=y
++
++#
++# Performance Counters
++#
+ CONFIG_VM_EVENT_COUNTERS=y
+ CONFIG_SLUB_DEBUG=y
++# CONFIG_STRIP_ASM_SYMS is not set
+ # CONFIG_COMPAT_BRK is not set
+ # CONFIG_SLAB is not set
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ CONFIG_PROFILING=y
+ CONFIG_TRACEPOINTS=y
+-# CONFIG_MARKERS is not set
++CONFIG_MARKERS=y
+ CONFIG_OPROFILE=y
+ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
+ CONFIG_HAVE_CLK=y
++
++#
++# GCOV-based kernel profiling
++#
++# CONFIG_GCOV_KERNEL is not set
++# CONFIG_SLOW_WORK is not set
+ CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+@@ -114,8 +127,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
+ CONFIG_MODVERSIONS=y
+ CONFIG_MODULE_SRCVERSION_ALL=y
+ CONFIG_BLOCK=y
+-CONFIG_LBD=y
+-# CONFIG_BLK_DEV_IO_TRACE is not set
++CONFIG_LBDAF=y
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -142,12 +154,14 @@ CONFIG_FREEZER=y
+ # CONFIG_ARCH_VERSATILE is not set
+ # CONFIG_ARCH_AT91 is not set
+ # CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_GEMINI is not set
+ # CONFIG_ARCH_EBSA110 is not set
+ # CONFIG_ARCH_EP93XX is not set
+ # CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_MXC is not set
++# CONFIG_ARCH_STMP3XXX is not set
+ # CONFIG_ARCH_NETX is not set
+ # CONFIG_ARCH_H720X is not set
+-# CONFIG_ARCH_IMX is not set
+ # CONFIG_ARCH_IOP13XX is not set
+ # CONFIG_ARCH_IOP32X is not set
+ # CONFIG_ARCH_IOP33X is not set
+@@ -156,24 +170,25 @@ CONFIG_FREEZER=y
+ # CONFIG_ARCH_IXP4XX is not set
+ # CONFIG_ARCH_L7200 is not set
+ # CONFIG_ARCH_KIRKWOOD is not set
+-# CONFIG_ARCH_KS8695 is not set
+-# CONFIG_ARCH_NS9XXX is not set
+ # CONFIG_ARCH_LOKI is not set
+ # CONFIG_ARCH_MV78XX0 is not set
+-# CONFIG_ARCH_MXC is not set
+ # CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_W90X900 is not set
+ # CONFIG_ARCH_PNX4008 is not set
+ # CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MSM is not set
+ # CONFIG_ARCH_RPC is not set
+ # CONFIG_ARCH_SA1100 is not set
+ # CONFIG_ARCH_S3C2410 is not set
+ # CONFIG_ARCH_S3C64XX is not set
+ # CONFIG_ARCH_SHARK is not set
+ # CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_U300 is not set
+ # CONFIG_ARCH_DAVINCI is not set
+ CONFIG_ARCH_OMAP=y
+-# CONFIG_ARCH_MSM is not set
+-# CONFIG_ARCH_W90X900 is not set
+
+ #
+ # TI OMAP Implementations
+@@ -182,26 +197,20 @@ CONFIG_ARCH_OMAP_OTG=y
+ # CONFIG_ARCH_OMAP1 is not set
+ # CONFIG_ARCH_OMAP2 is not set
+ CONFIG_ARCH_OMAP3=y
++# CONFIG_ARCH_OMAP4 is not set
+
+ #
+ # OMAP Feature Selections
+ #
+ # CONFIG_OMAP_DEBUG_POWERDOMAIN is not set
+ # CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set
+-CONFIG_OMAP_SMARTREFLEX=y
+-# CONFIG_OMAP_SMARTREFLEX_TESTING is not set
+ # CONFIG_OMAP_RESET_CLOCKS is not set
+-CONFIG_OMAP_BOOT_TAG=y
+-CONFIG_OMAP_BOOT_REASON=y
+-# CONFIG_OMAP_COMPONENT_VERSION is not set
+-# CONFIG_OMAP_GPIO_SWITCH is not set
+ # CONFIG_OMAP_MUX is not set
+ CONFIG_OMAP_MCBSP=y
+ # CONFIG_OMAP_MBOX_FWK is not set
+ # CONFIG_OMAP_MPU_TIMER is not set
+ CONFIG_OMAP_32K_TIMER=y
+ CONFIG_OMAP_32K_TIMER_HZ=128
+-CONFIG_OMAP_TICK_GPTIMER=1
+ CONFIG_OMAP_DM_TIMER=y
+ # CONFIG_OMAP_LL_DEBUG_UART1 is not set
+ # CONFIG_OMAP_LL_DEBUG_UART2 is not set
+@@ -219,6 +228,7 @@ CONFIG_ARCH_OMAP3430=y
+ # CONFIG_MACH_OMAP3_BEAGLE is not set
+ CONFIG_MACH_OVERO=y
+ # CONFIG_MACH_OMAP3_PANDORA is not set
++# CONFIG_MACH_OMAP_ZOOM2 is not set
+
+ #
+ # Processor Type
+@@ -246,7 +256,10 @@ CONFIG_ARM_THUMBEE=y
+ # CONFIG_CPU_DCACHE_DISABLE is not set
+ # CONFIG_CPU_BPREDICT_DISABLE is not set
+ CONFIG_HAS_TLS_REG=y
+-# CONFIG_OUTER_CACHE is not set
++# CONFIG_ARM_ERRATA_430973 is not set
++# CONFIG_ARM_ERRATA_458693 is not set
++# CONFIG_ARM_ERRATA_460075 is not set
++CONFIG_COMMON_CLKDEV=y
+
+ #
+ # Bus support
+@@ -266,13 +279,13 @@ CONFIG_VMSPLIT_3G=y
+ # CONFIG_VMSPLIT_2G is not set
+ # CONFIG_VMSPLIT_1G is not set
+ CONFIG_PAGE_OFFSET=0xC0000000
+-# CONFIG_PREEMPT is not set
++CONFIG_PREEMPT=y
+ CONFIG_HZ=128
+ CONFIG_AEABI=y
+ # CONFIG_OABI_COMPAT is not set
+-CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+ # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+ # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+@@ -284,9 +297,12 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+ CONFIG_LEDS=y
+ CONFIG_ALIGNMENT_TRAP=y
++# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+ #
+ # Boot options
+@@ -352,7 +368,6 @@ CONFIG_NET=y
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -379,10 +394,10 @@ CONFIG_IP_PNP_RARP=y
+ # CONFIG_INET_ESP is not set
+ # CONFIG_INET_IPCOMP is not set
+ # CONFIG_INET_XFRM_TUNNEL is not set
+-CONFIG_INET_TUNNEL=m
+-CONFIG_INET_XFRM_MODE_TRANSPORT=y
+-CONFIG_INET_XFRM_MODE_TUNNEL=y
+-CONFIG_INET_XFRM_MODE_BEET=y
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
+ # CONFIG_INET_LRO is not set
+ CONFIG_INET_DIAG=y
+ CONFIG_INET_TCP_DIAG=y
+@@ -390,25 +405,7 @@ CONFIG_INET_TCP_DIAG=y
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+-CONFIG_IPV6=m
+-# CONFIG_IPV6_PRIVACY is not set
+-# CONFIG_IPV6_ROUTER_PREF is not set
+-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+-# CONFIG_INET6_AH is not set
+-# CONFIG_INET6_ESP is not set
+-# CONFIG_INET6_IPCOMP is not set
+-# CONFIG_IPV6_MIP6 is not set
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+-CONFIG_INET6_XFRM_MODE_TUNNEL=m
+-CONFIG_INET6_XFRM_MODE_BEET=m
+-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+-CONFIG_IPV6_SIT=m
+-CONFIG_IPV6_NDISC_NODETYPE=y
+-# CONFIG_IPV6_TUNNEL is not set
+-# CONFIG_IPV6_MULTIPLE_TABLES is not set
+-# CONFIG_IPV6_MROUTE is not set
++# CONFIG_IPV6 is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+ # CONFIG_IP_DCCP is not set
+@@ -426,6 +423,8 @@ CONFIG_IPV6_NDISC_NODETYPE=y
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_IEEE802154 is not set
+ # CONFIG_NET_SCHED is not set
+ # CONFIG_DCB is not set
+
+@@ -433,58 +432,13 @@ CONFIG_IPV6_NDISC_NODETYPE=y
+ # Network testing
+ #
+ # CONFIG_NET_PKTGEN is not set
++# CONFIG_NET_DROP_MONITOR is not set
+ # CONFIG_HAMRADIO is not set
+ # CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+-CONFIG_BT=y
+-CONFIG_BT_L2CAP=y
+-CONFIG_BT_SCO=y
+-CONFIG_BT_RFCOMM=y
+-CONFIG_BT_RFCOMM_TTY=y
+-CONFIG_BT_BNEP=y
+-CONFIG_BT_BNEP_MC_FILTER=y
+-CONFIG_BT_BNEP_PROTO_FILTER=y
+-CONFIG_BT_HIDP=y
+-
+-#
+-# Bluetooth device drivers
+-#
+-# CONFIG_BT_HCIBTSDIO is not set
+-CONFIG_BT_HCIUART=y
+-CONFIG_BT_HCIUART_H4=y
+-CONFIG_BT_HCIUART_BCSP=y
+-# CONFIG_BT_HCIUART_LL is not set
+-# CONFIG_BT_HCIBRF6150 is not set
+-# CONFIG_BT_HCIH4P is not set
+-# CONFIG_BT_HCIVHCI is not set
++# CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
+-CONFIG_CFG80211=y
+-# CONFIG_CFG80211_REG_DEBUG is not set
+-CONFIG_NL80211=y
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+-CONFIG_WIRELESS_EXT=y
+-CONFIG_WIRELESS_EXT_SYSFS=y
+-CONFIG_LIB80211=y
+-CONFIG_LIB80211_CRYPT_WEP=m
+-CONFIG_LIB80211_CRYPT_CCMP=m
+-CONFIG_LIB80211_CRYPT_TKIP=m
+-# CONFIG_LIB80211_DEBUG is not set
+-CONFIG_MAC80211=y
+-
+-#
+-# Rate control algorithm selection
+-#
+-CONFIG_MAC80211_RC_PID=y
+-CONFIG_MAC80211_RC_MINSTREL=y
+-CONFIG_MAC80211_RC_DEFAULT_PID=y
+-# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set
+-CONFIG_MAC80211_RC_DEFAULT="pid"
+-# CONFIG_MAC80211_MESH is not set
+-CONFIG_MAC80211_LEDS=y
+-# CONFIG_MAC80211_DEBUGFS is not set
+-# CONFIG_MAC80211_DEBUG_MENU is not set
++# CONFIG_WIRELESS is not set
+ # CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+@@ -595,20 +549,20 @@ CONFIG_MTD_NAND_IDS=y
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ CONFIG_BLK_DEV_LOOP=y
+-CONFIG_BLK_DEV_CRYPTOLOOP=m
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=16384
+ # CONFIG_BLK_DEV_XIP is not set
+-CONFIG_CDROM_PKTCDVD=m
+-CONFIG_CDROM_PKTCDVD_BUFFERS=8
+-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
++# CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
++# CONFIG_MG_DISK is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_OMAP_STI is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_ISL29003 is not set
+ # CONFIG_C2PORT is not set
+
+ #
+@@ -617,6 +571,7 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_AT24 is not set
+ # CONFIG_EEPROM_AT25 is not set
+ # CONFIG_EEPROM_LEGACY is not set
++# CONFIG_EEPROM_MAX6875 is not set
+ CONFIG_EEPROM_93CX6=m
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+@@ -624,7 +579,7 @@ CONFIG_HAVE_IDE=y
+ #
+ # SCSI device support
+ #
+-CONFIG_RAID_ATTRS=m
++# CONFIG_RAID_ATTRS is not set
+ CONFIG_SCSI=y
+ CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+@@ -638,12 +593,8 @@ CONFIG_BLK_DEV_SD=y
+ # CONFIG_CHR_DEV_ST is not set
+ # CONFIG_CHR_DEV_OSST is not set
+ # CONFIG_BLK_DEV_SR is not set
+-CONFIG_CHR_DEV_SG=m
++# CONFIG_CHR_DEV_SG is not set
+ # CONFIG_CHR_DEV_SCH is not set
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+ CONFIG_SCSI_MULTI_LUN=y
+ # CONFIG_SCSI_CONSTANTS is not set
+ # CONFIG_SCSI_LOGGING is not set
+@@ -661,34 +612,18 @@ CONFIG_SCSI_WAIT_SCAN=m
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+ # CONFIG_LIBFC is not set
++# CONFIG_LIBFCOE is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
+ # CONFIG_ATA is not set
+-CONFIG_MD=y
+-CONFIG_BLK_DEV_MD=m
+-CONFIG_MD_LINEAR=m
+-CONFIG_MD_RAID0=m
+-CONFIG_MD_RAID1=m
+-CONFIG_MD_RAID10=m
+-CONFIG_MD_RAID456=m
+-CONFIG_MD_RAID5_RESHAPE=y
+-CONFIG_MD_MULTIPATH=m
+-CONFIG_MD_FAULTY=m
+-CONFIG_BLK_DEV_DM=m
+-# CONFIG_DM_DEBUG is not set
+-CONFIG_DM_CRYPT=m
+-CONFIG_DM_SNAPSHOT=m
+-CONFIG_DM_MIRROR=m
+-CONFIG_DM_ZERO=m
+-CONFIG_DM_MULTIPATH=m
+-CONFIG_DM_DELAY=m
+-# CONFIG_DM_UEVENT is not set
++# CONFIG_MD is not set
+ CONFIG_NETDEVICES=y
+-CONFIG_DUMMY=m
++# CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+-CONFIG_TUN=m
++# CONFIG_TUN is not set
+ # CONFIG_VETH is not set
+ # CONFIG_NET_ETHERNET is not set
+ # CONFIG_NETDEV_1000 is not set
+@@ -698,37 +633,14 @@ CONFIG_TUN=m
+ # Wireless LAN
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+-CONFIG_WLAN_80211=y
+-CONFIG_LIBERTAS=y
+-CONFIG_LIBERTAS_SDIO=y
+-CONFIG_LIBERTAS_DEBUG=y
+-# CONFIG_LIBERTAS_THINFIRM is not set
+-# CONFIG_MAC80211_HWSIM is not set
+-CONFIG_P54_COMMON=m
+-# CONFIG_IWLWIFI_LEDS is not set
+-CONFIG_HOSTAP=m
+-CONFIG_HOSTAP_FIRMWARE=y
+-CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+-# CONFIG_B43 is not set
+-# CONFIG_B43LEGACY is not set
+-# CONFIG_RT2X00 is not set
++# CONFIG_WLAN_80211 is not set
+
+ #
+ # Enable WiMAX (Networking options) to see the WiMAX drivers
+ #
+ # CONFIG_WAN is not set
+-CONFIG_PPP=m
+-# CONFIG_PPP_MULTILINK is not set
+-# CONFIG_PPP_FILTER is not set
+-CONFIG_PPP_ASYNC=m
+-CONFIG_PPP_SYNC_TTY=m
+-CONFIG_PPP_DEFLATE=m
+-CONFIG_PPP_BSDCOMP=m
+-CONFIG_PPP_MPPE=m
+-CONFIG_PPPOE=m
+-# CONFIG_PPPOL2TP is not set
++# CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+-CONFIG_SLHC=m
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -762,7 +674,6 @@ CONFIG_INPUT_KEYBOARD=y
+ # CONFIG_KEYBOARD_XTKBD is not set
+ # CONFIG_KEYBOARD_NEWTON is not set
+ # CONFIG_KEYBOARD_STOWAWAY is not set
+-# CONFIG_KEYBOARD_TWL4030 is not set
+ # CONFIG_KEYBOARD_LM8323 is not set
+ # CONFIG_KEYBOARD_GPIO is not set
+ CONFIG_INPUT_MOUSE=y
+@@ -778,6 +689,7 @@ CONFIG_MOUSE_PS2_TRACKPOINT=y
+ # CONFIG_MOUSE_BCM5974 is not set
+ # CONFIG_MOUSE_VSXXXAA is not set
+ # CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+ # CONFIG_INPUT_JOYSTICK is not set
+ # CONFIG_INPUT_TABLET is not set
+ # CONFIG_INPUT_TOUCHSCREEN is not set
+@@ -819,6 +731,7 @@ CONFIG_SERIAL_8250_RSA=y
+ #
+ # Non-8250 serial port support
+ #
++# CONFIG_SERIAL_MAX3100 is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ CONFIG_UNIX98_PTYS=y
+@@ -826,6 +739,7 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ CONFIG_HW_RANDOM=y
++# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+@@ -841,6 +755,7 @@ CONFIG_I2C_HELPER_AUTO=y
+ #
+ # I2C system bus drivers (mostly embedded / system-on-chip)
+ #
++# CONFIG_I2C_DESIGNWARE is not set
+ # CONFIG_I2C_GPIO is not set
+ # CONFIG_I2C_OCORES is not set
+ CONFIG_I2C_OMAP=y
+@@ -865,12 +780,7 @@ CONFIG_I2C_OMAP=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+-# CONFIG_SENSORS_PCF8591 is not set
+-CONFIG_TWL4030_MADC=m
+-CONFIG_TWL4030_POWEROFF=y
+-# CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+-# CONFIG_SENSORS_TSL2563 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+@@ -889,8 +799,6 @@ CONFIG_SPI_OMAP24XX=y
+ #
+ # SPI Protocol Masters
+ #
+-# CONFIG_SPI_TSC210X is not set
+-# CONFIG_SPI_TSC2301 is not set
+ # CONFIG_SPI_SPIDEV is not set
+ # CONFIG_SPI_TLE62X0 is not set
+ CONFIG_ARCH_REQUIRE_GPIOLIB=y
+@@ -920,12 +828,7 @@ CONFIG_GPIO_TWL4030=y
+ # CONFIG_GPIO_MAX7301 is not set
+ # CONFIG_GPIO_MCP23S08 is not set
+ # CONFIG_W1 is not set
+-CONFIG_POWER_SUPPLY=m
+-# CONFIG_POWER_SUPPLY_DEBUG is not set
+-# CONFIG_PDA_POWER is not set
+-# CONFIG_BATTERY_DS2760 is not set
+-# CONFIG_TWL4030_BCI_BATTERY is not set
+-# CONFIG_BATTERY_BQ27x00 is not set
++# CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
+ # CONFIG_SENSORS_AD7414 is not set
+@@ -946,6 +849,7 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_F71805F is not set
+ # CONFIG_SENSORS_F71882FG is not set
+ # CONFIG_SENSORS_F75375S is not set
++# CONFIG_SENSORS_G760A is not set
+ # CONFIG_SENSORS_GL518SM is not set
+ # CONFIG_SENSORS_GL520SM is not set
+ # CONFIG_SENSORS_IT87 is not set
+@@ -961,18 +865,23 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
+ # CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_LTC4215 is not set
+ # CONFIG_SENSORS_LTC4245 is not set
++# CONFIG_SENSORS_LM95241 is not set
+ # CONFIG_SENSORS_MAX1111 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+ # CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_SHT15 is not set
+ # CONFIG_SENSORS_DME1737 is not set
+ # CONFIG_SENSORS_SMSC47M1 is not set
+ # CONFIG_SENSORS_SMSC47M192 is not set
+ # CONFIG_SENSORS_SMSC47B397 is not set
+ # CONFIG_SENSORS_ADS7828 is not set
+ # CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_TMP401 is not set
+ # CONFIG_SENSORS_VT1211 is not set
+ # CONFIG_SENSORS_W83781D is not set
+ # CONFIG_SENSORS_W83791D is not set
+@@ -982,6 +891,7 @@ CONFIG_HWMON=y
+ # CONFIG_SENSORS_W83L786NG is not set
+ # CONFIG_SENSORS_W83627HF is not set
+ # CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_SENSORS_LIS3_SPI is not set
+ # CONFIG_SENSORS_TSC210X is not set
+ CONFIG_SENSORS_OMAP34XX=y
+ # CONFIG_HWMON_DEBUG_CHIP is not set
+@@ -995,6 +905,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+ CONFIG_OMAP_WATCHDOG=y
++# CONFIG_TWL4030_WATCHDOG is not set
+ CONFIG_SSB_POSSIBLE=y
+
+ #
+@@ -1012,7 +923,6 @@ CONFIG_SSB_POSSIBLE=y
+ # CONFIG_HTC_PASIC3 is not set
+ # CONFIG_TPS65010 is not set
+ CONFIG_TWL4030_CORE=y
+-# CONFIG_TWL4030_POWER is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_MFD_T7L66XB is not set
+ # CONFIG_MFD_TC6387XB is not set
+@@ -1021,154 +931,9 @@ CONFIG_TWL4030_CORE=y
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+ # CONFIG_MFD_PCF50633 is not set
+-
+-#
+-# Multimedia devices
+-#
+-
+-#
+-# Multimedia core support
+-#
+-CONFIG_VIDEO_DEV=m
+-CONFIG_VIDEO_V4L2_COMMON=m
+-CONFIG_VIDEO_ALLOW_V4L1=y
+-CONFIG_VIDEO_V4L1_COMPAT=y
+-CONFIG_DVB_CORE=m
+-CONFIG_VIDEO_MEDIA=m
+-
+-#
+-# Multimedia drivers
+-#
+-CONFIG_MEDIA_ATTACH=y
+-CONFIG_MEDIA_TUNER=m
+-# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
+-CONFIG_MEDIA_TUNER_SIMPLE=m
+-CONFIG_MEDIA_TUNER_TDA8290=m
+-CONFIG_MEDIA_TUNER_TDA9887=m
+-CONFIG_MEDIA_TUNER_TEA5761=m
+-CONFIG_MEDIA_TUNER_TEA5767=m
+-CONFIG_MEDIA_TUNER_MT20XX=m
+-CONFIG_MEDIA_TUNER_XC2028=m
+-CONFIG_MEDIA_TUNER_XC5000=m
+-CONFIG_VIDEO_V4L2=m
+-CONFIG_VIDEO_V4L1=m
+-CONFIG_VIDEO_CAPTURE_DRIVERS=y
+-# CONFIG_VIDEO_ADV_DEBUG is not set
+-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+-CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+-# CONFIG_VIDEO_VIVI is not set
+-# CONFIG_VIDEO_CPIA is not set
+-# CONFIG_VIDEO_SAA5246A is not set
+-# CONFIG_VIDEO_SAA5249 is not set
+-# CONFIG_SOC_CAMERA is not set
+-CONFIG_RADIO_ADAPTERS=y
+-# CONFIG_RADIO_TEA5764 is not set
+-# CONFIG_DVB_DYNAMIC_MINORS is not set
+-CONFIG_DVB_CAPTURE_DRIVERS=y
+-# CONFIG_TTPCI_EEPROM is not set
+-# CONFIG_DVB_B2C2_FLEXCOP is not set
+-
+-#
+-# Supported DVB Frontends
+-#
+-
+-#
+-# Customise DVB Frontends
+-#
+-# CONFIG_DVB_FE_CUSTOMISE is not set
+-
+-#
+-# Multistandard (satellite) frontends
+-#
+-# CONFIG_DVB_STB0899 is not set
+-# CONFIG_DVB_STB6100 is not set
+-
+-#
+-# DVB-S (satellite) frontends
+-#
+-CONFIG_DVB_CX24110=m
+-CONFIG_DVB_CX24123=m
+-CONFIG_DVB_MT312=m
+-CONFIG_DVB_S5H1420=m
+-# CONFIG_DVB_STV0288 is not set
+-# CONFIG_DVB_STB6000 is not set
+-CONFIG_DVB_STV0299=m
+-CONFIG_DVB_TDA8083=m
+-CONFIG_DVB_TDA10086=m
+-# CONFIG_DVB_TDA8261 is not set
+-CONFIG_DVB_VES1X93=m
+-CONFIG_DVB_TUNER_ITD1000=m
+-# CONFIG_DVB_TUNER_CX24113 is not set
+-CONFIG_DVB_TDA826X=m
+-CONFIG_DVB_TUA6100=m
+-# CONFIG_DVB_CX24116 is not set
+-# CONFIG_DVB_SI21XX is not set
+-
+-#
+-# DVB-T (terrestrial) frontends
+-#
+-CONFIG_DVB_SP8870=m
+-CONFIG_DVB_SP887X=m
+-CONFIG_DVB_CX22700=m
+-CONFIG_DVB_CX22702=m
+-# CONFIG_DVB_DRX397XD is not set
+-CONFIG_DVB_L64781=m
+-CONFIG_DVB_TDA1004X=m
+-CONFIG_DVB_NXT6000=m
+-CONFIG_DVB_MT352=m
+-CONFIG_DVB_ZL10353=m
+-CONFIG_DVB_DIB3000MB=m
+-CONFIG_DVB_DIB3000MC=m
+-CONFIG_DVB_DIB7000M=m
+-CONFIG_DVB_DIB7000P=m
+-CONFIG_DVB_TDA10048=m
+-
+-#
+-# DVB-C (cable) frontends
+-#
+-CONFIG_DVB_VES1820=m
+-CONFIG_DVB_TDA10021=m
+-CONFIG_DVB_TDA10023=m
+-CONFIG_DVB_STV0297=m
+-
+-#
+-# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
+-#
+-CONFIG_DVB_NXT200X=m
+-# CONFIG_DVB_OR51211 is not set
+-# CONFIG_DVB_OR51132 is not set
+-CONFIG_DVB_BCM3510=m
+-CONFIG_DVB_LGDT330X=m
+-# CONFIG_DVB_LGDT3304 is not set
+-CONFIG_DVB_S5H1409=m
+-CONFIG_DVB_AU8522=m
+-CONFIG_DVB_S5H1411=m
+-
+-#
+-# ISDB-T (terrestrial) frontends
+-#
+-# CONFIG_DVB_S921 is not set
+-
+-#
+-# Digital terrestrial only tuners/PLL
+-#
+-CONFIG_DVB_PLL=m
+-CONFIG_DVB_TUNER_DIB0070=m
+-
+-#
+-# SEC control devices for DVB-S
+-#
+-CONFIG_DVB_LNBP21=m
+-# CONFIG_DVB_ISL6405 is not set
+-CONFIG_DVB_ISL6421=m
+-# CONFIG_DVB_LGS8GL5 is not set
+-
+-#
+-# Tools to develop new frontends
+-#
+-# CONFIG_DVB_DUMMY_FE is not set
+-# CONFIG_DVB_AF9013 is not set
+-# CONFIG_DAB is not set
++# CONFIG_AB3100_CORE is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MEDIA_SUPPORT is not set
+
+ #
+ # Graphics support
+@@ -1201,6 +966,7 @@ CONFIG_FB_CFB_IMAGEBLIT=m
+ # CONFIG_FB_VIRTUAL is not set
+ # CONFIG_FB_METRONOME is not set
+ # CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
+ # CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+ CONFIG_OMAP2_DSS=m
+ CONFIG_OMAP2_DSS_VRAM_SIZE=12
+@@ -1242,53 +1008,8 @@ CONFIG_DISPLAY_SUPPORT=y
+ CONFIG_DUMMY_CONSOLE=y
+ # CONFIG_FRAMEBUFFER_CONSOLE is not set
+ # CONFIG_LOGO is not set
+-CONFIG_SOUND=y
+-CONFIG_SOUND_OSS_CORE=y
+-CONFIG_SND=y
+-CONFIG_SND_TIMER=y
+-CONFIG_SND_PCM=y
+-CONFIG_SND_SEQUENCER=m
+-# CONFIG_SND_SEQ_DUMMY is not set
+-CONFIG_SND_OSSEMUL=y
+-CONFIG_SND_MIXER_OSS=y
+-CONFIG_SND_PCM_OSS=y
+-CONFIG_SND_PCM_OSS_PLUGINS=y
+-CONFIG_SND_SEQUENCER_OSS=y
+-# CONFIG_SND_HRTIMER is not set
+-# CONFIG_SND_DYNAMIC_MINORS is not set
+-CONFIG_SND_SUPPORT_OLD_API=y
+-CONFIG_SND_VERBOSE_PROCFS=y
+-CONFIG_SND_VERBOSE_PRINTK=y
+-CONFIG_SND_DEBUG=y
+-# CONFIG_SND_DEBUG_VERBOSE is not set
+-# CONFIG_SND_PCM_XRUN_DEBUG is not set
+-CONFIG_SND_DRIVERS=y
+-# CONFIG_SND_DUMMY is not set
+-# CONFIG_SND_VIRMIDI is not set
+-# CONFIG_SND_MTPAV is not set
+-# CONFIG_SND_SERIAL_U16550 is not set
+-# CONFIG_SND_MPU401 is not set
+-CONFIG_SND_ARM=y
+-CONFIG_SND_SPI=y
+-CONFIG_SND_SOC=y
+-CONFIG_SND_OMAP_SOC=y
+-CONFIG_SND_OMAP_SOC_MCBSP=y
+-CONFIG_SND_OMAP_SOC_OVERO=y
+-CONFIG_SND_SOC_I2C_AND_SPI=y
+-# CONFIG_SND_SOC_ALL_CODECS is not set
+-CONFIG_SND_SOC_TWL4030=y
+-# CONFIG_SOUND_PRIME is not set
+-CONFIG_HID_SUPPORT=y
+-CONFIG_HID=y
+-CONFIG_HID_DEBUG=y
+-# CONFIG_HIDRAW is not set
+-# CONFIG_HID_PID is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+-# CONFIG_HID_APPLE is not set
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+@@ -1312,7 +1033,7 @@ CONFIG_USB_INVENTRA_DMA=y
+ # CONFIG_USB_MUSB_DEBUG is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+ #
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG is not set
+@@ -1327,6 +1048,7 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_OMAP is not set
+ # CONFIG_USB_GADGET_PXA25X is not set
+ # CONFIG_USB_GADGET_PXA27X is not set
++# CONFIG_USB_GADGET_S3C_HSOTG is not set
+ # CONFIG_USB_GADGET_S3C2410 is not set
+ # CONFIG_USB_GADGET_IMX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
+@@ -1335,9 +1057,11 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_CI13XXX is not set
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_GOKU is not set
++# CONFIG_USB_GADGET_LANGWELL is not set
+ # CONFIG_USB_GADGET_DUMMY_HCD is not set
+ CONFIG_USB_GADGET_DUALSPEED=y
+ # CONFIG_USB_ZERO is not set
++# CONFIG_USB_AUDIO is not set
+ CONFIG_USB_ETH=y
+ CONFIG_USB_ETH_RNDIS=y
+ # CONFIG_USB_GADGETFS is not set
+@@ -1354,6 +1078,7 @@ CONFIG_USB_OTG_UTILS=y
+ # CONFIG_USB_GPIO_VBUS is not set
+ # CONFIG_ISP1301_OMAP is not set
+ CONFIG_TWL4030_USB=y
++# CONFIG_NOP_USB_XCEIV is not set
+ CONFIG_MMC=y
+ # CONFIG_MMC_DEBUG is not set
+ CONFIG_MMC_UNSAFE_RESUME=y
+@@ -1385,8 +1110,11 @@ CONFIG_LEDS_CLASS=y
+ # CONFIG_LEDS_OMAP_PWM is not set
+ # CONFIG_LEDS_PCA9532 is not set
+ CONFIG_LEDS_GPIO=y
++CONFIG_LEDS_GPIO_PLATFORM=y
+ # CONFIG_LEDS_LP5521 is not set
+ # CONFIG_LEDS_PCA955X is not set
++# CONFIG_LEDS_DAC124S085 is not set
++# CONFIG_LEDS_BD2802 is not set
+
+ #
+ # LED Triggers
+@@ -1395,7 +1123,12 @@ CONFIG_LEDS_TRIGGERS=y
+ CONFIG_LEDS_TRIGGER_TIMER=y
+ CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+ # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
++# CONFIG_LEDS_TRIGGER_GPIO is not set
+ # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++
++#
++# iptables trigger is under Netfilter config (LED target)
++#
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -1428,6 +1161,7 @@ CONFIG_RTC_DRV_TWL4030=y
+ # CONFIG_RTC_DRV_S35390A is not set
+ # CONFIG_RTC_DRV_FM3130 is not set
+ # CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
+
+ #
+ # SPI RTC drivers
+@@ -1459,12 +1193,16 @@ CONFIG_RTC_DRV_TWL4030=y
+ # on-CPU RTC drivers
+ #
+ # CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
+ CONFIG_REGULATOR=y
+ # CONFIG_REGULATOR_DEBUG is not set
+ # CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+ # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+ # CONFIG_REGULATOR_BQ24022 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
+ CONFIG_REGULATOR_TWL4030=y
++# CONFIG_REGULATOR_LP3971 is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
+
+@@ -1480,6 +1218,7 @@ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+ # CONFIG_EXT3_FS_XATTR is not set
+ # CONFIG_EXT4_FS is not set
+ CONFIG_JBD=y
+@@ -1487,15 +1226,12 @@ CONFIG_JBD=y
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+-CONFIG_XFS_FS=m
+-# CONFIG_XFS_QUOTA is not set
+-# CONFIG_XFS_POSIX_ACL is not set
+-# CONFIG_XFS_RT is not set
+-# CONFIG_XFS_DEBUG is not set
++# CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ # CONFIG_BTRFS_FS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_FSNOTIFY=y
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1508,16 +1244,18 @@ CONFIG_QFMT_V2=y
+ CONFIG_QUOTACTL=y
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+-CONFIG_FUSE_FS=m
++# CONFIG_FUSE_FS is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
+
+ #
+ # CD-ROM/DVD Filesystems
+ #
+-CONFIG_ISO9660_FS=m
+-CONFIG_JOLIET=y
+-CONFIG_ZISOFS=y
+-CONFIG_UDF_FS=m
+-CONFIG_UDF_NLS=y
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
+
+ #
+ # DOS/FAT/NT Filesystems
+@@ -1575,20 +1313,20 @@ CONFIG_JFFS2_CMODE_PRIORITY=y
+ # CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
++# CONFIG_NFS_V4_1 is not set
+ CONFIG_ROOT_NFS=y
+ # CONFIG_NFSD is not set
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+-CONFIG_EXPORTFS=m
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ # CONFIG_SMB_FS is not set
+@@ -1676,12 +1414,17 @@ CONFIG_DEBUG_KERNEL=y
+ CONFIG_DETECT_SOFTLOCKUP=y
+ # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
++CONFIG_DETECT_HUNG_TASK=y
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ CONFIG_SCHEDSTATS=y
+ CONFIG_TIMER_STATS=y
+ # CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_SLUB_DEBUG_ON is not set
+ # CONFIG_SLUB_STATS is not set
++# CONFIG_DEBUG_KMEMLEAK is not set
++CONFIG_DEBUG_PREEMPT=y
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -1701,7 +1444,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_DEBUG_NOTIFIERS is not set
+-CONFIG_FRAME_POINTER=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1709,26 +1451,34 @@ CONFIG_FRAME_POINTER=y
+ # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
++# CONFIG_PAGE_POISONING is not set
+ CONFIG_NOP_TRACER=y
+ CONFIG_HAVE_FUNCTION_TRACER=y
+ CONFIG_RING_BUFFER=y
++CONFIG_EVENT_TRACING=y
++CONFIG_CONTEXT_SWITCH_TRACER=y
+ CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
++CONFIG_TRACING_SUPPORT=y
++CONFIG_FTRACE=y
+ # CONFIG_FUNCTION_TRACER is not set
+ # CONFIG_IRQSOFF_TRACER is not set
++# CONFIG_PREEMPT_TRACER is not set
+ # CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
++CONFIG_BRANCH_PROFILE_NONE=y
++# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
++# CONFIG_PROFILE_ALL_BRANCHES is not set
+ # CONFIG_STACK_TRACER is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_RING_BUFFER_BENCHMARK is not set
++# CONFIG_DYNAMIC_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
+ CONFIG_DEBUG_USER=y
+ CONFIG_DEBUG_ERRORS=y
+ # CONFIG_DEBUG_STACK_USAGE is not set
+@@ -1741,10 +1491,6 @@ CONFIG_DEBUG_ERRORS=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITYFS is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+-CONFIG_XOR_BLOCKS=m
+-CONFIG_ASYNC_CORE=m
+-CONFIG_ASYNC_MEMCPY=m
+-CONFIG_ASYNC_XOR=m
+ CONFIG_CRYPTO=y
+
+ #
+@@ -1759,13 +1505,15 @@ CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_HASH2=y
+ CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_PCOMP=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_MANAGER2=y
+-CONFIG_CRYPTO_GF128MUL=m
+-CONFIG_CRYPTO_NULL=m
+-CONFIG_CRYPTO_CRYPTD=m
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_NULL is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++# CONFIG_CRYPTO_CRYPTD is not set
+ # CONFIG_CRYPTO_AUTHENC is not set
+-CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_TEST is not set
+
+ #
+ # Authenticated Encryption with Associated Data
+@@ -1780,65 +1528,66 @@ CONFIG_CRYPTO_TEST=m
+ CONFIG_CRYPTO_CBC=y
+ # CONFIG_CRYPTO_CTR is not set
+ # CONFIG_CRYPTO_CTS is not set
+-CONFIG_CRYPTO_ECB=y
+-CONFIG_CRYPTO_LRW=m
+-CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_ECB is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_PCBC is not set
+ # CONFIG_CRYPTO_XTS is not set
+
+ #
+ # Hash modes
+ #
+-CONFIG_CRYPTO_HMAC=m
+-CONFIG_CRYPTO_XCBC=m
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_XCBC is not set
+
+ #
+ # Digest
+ #
+ CONFIG_CRYPTO_CRC32C=y
+-CONFIG_CRYPTO_MD4=m
++# CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=y
+-CONFIG_CRYPTO_MICHAEL_MIC=y
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
+ # CONFIG_CRYPTO_RMD128 is not set
+ # CONFIG_CRYPTO_RMD160 is not set
+ # CONFIG_CRYPTO_RMD256 is not set
+ # CONFIG_CRYPTO_RMD320 is not set
+-CONFIG_CRYPTO_SHA1=m
+-CONFIG_CRYPTO_SHA256=m
+-CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_TGR192=m
+-CONFIG_CRYPTO_WP512=m
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_WP512 is not set
+
+ #
+ # Ciphers
+ #
+-CONFIG_CRYPTO_AES=y
+-CONFIG_CRYPTO_ANUBIS=m
+-CONFIG_CRYPTO_ARC4=y
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_CAMELLIA=m
+-CONFIG_CRYPTO_CAST5=m
+-CONFIG_CRYPTO_CAST6=m
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
+ CONFIG_CRYPTO_DES=y
+-CONFIG_CRYPTO_FCRYPT=m
+-CONFIG_CRYPTO_KHAZAD=m
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_KHAZAD is not set
+ # CONFIG_CRYPTO_SALSA20 is not set
+ # CONFIG_CRYPTO_SEED is not set
+-CONFIG_CRYPTO_SERPENT=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
+
+ #
+ # Compression
+ #
+-CONFIG_CRYPTO_DEFLATE=m
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
+ # CONFIG_CRYPTO_LZO is not set
+
+ #
+ # Random Number Generation
+ #
+ # CONFIG_CRYPTO_ANSI_CPRNG is not set
+-CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_HW is not set
++CONFIG_BINARY_PRINTF=y
+
+ #
+ # Library routines
+@@ -1856,7 +1605,8 @@ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=y
+ CONFIG_LZO_COMPRESS=y
+ CONFIG_LZO_DECOMPRESS=y
+-CONFIG_PLIST=y
++CONFIG_DECOMPRESS_GZIP=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0115-DSS2-SDI-make-sdi_pads-static.patch b/recipes/linux/linux-omap-pm/dss2/0115-DSS2-SDI-make-sdi_pads-static.patch
new file mode 100644
index 0000000000..59681c08ba
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0115-DSS2-SDI-make-sdi_pads-static.patch
@@ -0,0 +1,26 @@
+From 81a652bad3261a822821fd49d3bc21a165a8d26f Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 16:17:44 +0300
+Subject: [PATCH 115/146] DSS2: SDI: make sdi_pads static
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/sdi.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
+index c484e0c..ef07c7c 100644
+--- a/drivers/video/omap2/dss/sdi.c
++++ b/drivers/video/omap2/dss/sdi.c
+@@ -46,7 +46,7 @@ static struct {
+ } sdi;
+
+ /* CONTROL_PADCONF_DSS_DATAXX */
+-const u16 sdi_pads[] =
++static const u16 sdi_pads[] =
+ {
+ 0x0f0, /* 10[ 7..0]:SDI_DAT1N */
+ 0x0f2, /* 10[15..0]:SDI_DAT1P */
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0116-DSS2-Fix-default_color-sysfs-output.patch b/recipes/linux/linux-omap-pm/dss2/0116-DSS2-Fix-default_color-sysfs-output.patch
new file mode 100644
index 0000000000..97506adbf6
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0116-DSS2-Fix-default_color-sysfs-output.patch
@@ -0,0 +1,26 @@
+From 501537af71157a95e5947a5827514014909a6608 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 15 Jun 2009 15:13:25 +0300
+Subject: [PATCH 116/146] DSS2: Fix default_color sysfs output
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/manager.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index f6df4d6..0b0c51e 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -101,7 +101,7 @@ put_device:
+ static ssize_t manager_default_color_show(struct omap_overlay_manager *mgr,
+ char *buf)
+ {
+- return snprintf(buf, PAGE_SIZE, "%d", mgr->info.default_color);
++ return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.default_color);
+ }
+
+ static ssize_t manager_default_color_store(struct omap_overlay_manager *mgr,
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0117-DSS2-Locking-for-VRFB.patch b/recipes/linux/linux-omap-pm/dss2/0117-DSS2-Locking-for-VRFB.patch
new file mode 100644
index 0000000000..7902d2225c
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0117-DSS2-Locking-for-VRFB.patch
@@ -0,0 +1,125 @@
+From 4044386e8f32ea442478809d945f50c5a3a66f88 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 16 Jun 2009 15:18:30 +0300
+Subject: [PATCH 117/146] DSS2: Locking for VRFB
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/vrfb.c | 25 ++++++++++++++++++++++---
+ 1 files changed, 22 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 0c7d943..7cd7c61 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -3,6 +3,7 @@
+ #include <linux/ioport.h>
+ #include <linux/io.h>
+ #include <linux/bitops.h>
++#include <linux/mutex.h>
+
+ #include <mach/io.h>
+ #include <mach/vrfb.h>
+@@ -42,6 +43,8 @@ static unsigned long ctx_map;
+ /* bitmap of contexts for which we have to keep the HW context valid */
+ static unsigned long ctx_map_active;
+
++static DEFINE_MUTEX(ctx_lock);
++
+ /*
+ * Access to this happens from client drivers or the PM core after wake-up.
+ * For the first case we require locking at the driver level, for the second
+@@ -171,6 +174,8 @@ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+
+ DBG("release ctx %d\n", ctx);
+
++ mutex_lock(&ctx_lock);
++
+ if (!(ctx_map & (1 << ctx))) {
+ BUG();
+ return;
+@@ -186,6 +191,8 @@ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+ }
+
+ vrfb->context = 0xff;
++
++ mutex_unlock(&ctx_lock);
+ }
+ EXPORT_SYMBOL(omap_vrfb_release_ctx);
+
+@@ -194,16 +201,20 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ int rot;
+ u32 paddr;
+ u8 ctx;
++ int r;
+
+ DBG("request ctx\n");
+
++ mutex_lock(&ctx_lock);
++
+ for (ctx = 0; ctx < VRFB_NUM_CTXS; ++ctx)
+ if ((ctx_map & (1 << ctx)) == 0)
+ break;
+
+ if (ctx == VRFB_NUM_CTXS) {
+ printk(KERN_ERR "vrfb: no free contexts\n");
+- return -EBUSY;
++ r = -EBUSY;
++ goto out;
+ }
+
+ DBG("found free ctx %d\n", ctx);
+@@ -223,7 +234,8 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ "area for ctx %d, rotation %d\n",
+ ctx, rot * 90);
+ omap_vrfb_release_ctx(vrfb);
+- return -ENOMEM;
++ r = -ENOMEM;
++ goto out;
+ }
+
+ vrfb->paddr[rot] = paddr;
+@@ -231,25 +243,31 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ DBG("VRFB %d/%d: %lx\n", ctx, rot*90, vrfb->paddr[rot]);
+ }
+
+- return 0;
++ r = 0;
++out:
++ mutex_unlock(&ctx_lock);
++ return r;
+ }
+ EXPORT_SYMBOL(omap_vrfb_request_ctx);
+
+ void omap_vrfb_suspend_ctx(struct vrfb *vrfb)
+ {
+ DBG("suspend ctx %d\n", vrfb->context);
++ mutex_lock(&ctx_lock);
+ if (vrfb->context >= VRFB_NUM_CTXS ||
+ (!(1 << vrfb->context) & ctx_map_active)) {
+ BUG();
+ return;
+ }
+ clear_bit(vrfb->context, &ctx_map_active);
++ mutex_unlock(&ctx_lock);
+ }
+ EXPORT_SYMBOL(omap_vrfb_suspend_ctx);
+
+ void omap_vrfb_resume_ctx(struct vrfb *vrfb)
+ {
+ DBG("resume ctx %d\n", vrfb->context);
++ mutex_lock(&ctx_lock);
+ if (vrfb->context >= VRFB_NUM_CTXS ||
+ ((1 << vrfb->context) & ctx_map_active)) {
+ BUG();
+@@ -263,6 +281,7 @@ void omap_vrfb_resume_ctx(struct vrfb *vrfb)
+ */
+ restore_hw_context(vrfb->context);
+ set_bit(vrfb->context, &ctx_map_active);
++ mutex_unlock(&ctx_lock);
+ }
+ EXPORT_SYMBOL(omap_vrfb_resume_ctx);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch b/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch
new file mode 100644
index 0000000000..c01ece605b
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch
@@ -0,0 +1,54 @@
+From 32720bafdbb70ab9f534d93b75a954c891bed8cc Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Sat, 13 Jun 2009 13:38:54 +0300
+Subject: [PATCH 118/146] DSS2: DISPC: fix locking issue with irq handling
+
+Fix the problem that an irq handler couldn't unregister
+itself
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dispc.c | 12 +++++++++++-
+ 1 files changed, 11 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 2463bab..4e1da6b 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -2732,6 +2732,7 @@ void dispc_irq_handler(void)
+ u32 handledirqs = 0;
+ u32 unhandled_errors;
+ struct omap_dispc_isr_data *isr_data;
++ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
+
+ spin_lock(&dispc.irq_lock);
+
+@@ -2745,8 +2746,15 @@ void dispc_irq_handler(void)
+ * off */
+ dispc_write_reg(DISPC_IRQSTATUS, irqstatus);
+
++ /* make a copy and unlock, so that isrs can unregister
++ * themselves */
++ memcpy(registered_isr, dispc.registered_isr,
++ sizeof(registered_isr));
++
++ spin_unlock(&dispc.irq_lock);
++
+ for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
+- isr_data = &dispc.registered_isr[i];
++ isr_data = &registered_isr[i];
+
+ if (!isr_data->isr)
+ continue;
+@@ -2757,6 +2765,8 @@ void dispc_irq_handler(void)
+ }
+ }
+
++ spin_lock(&dispc.irq_lock);
++
+ unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask;
+
+ if (unhandled_errors) {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0119-DSS2-OMAPFB-remove-unneeded-locks.patch b/recipes/linux/linux-omap-pm/dss2/0119-DSS2-OMAPFB-remove-unneeded-locks.patch
new file mode 100644
index 0000000000..2b0ba2da78
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0119-DSS2-OMAPFB-remove-unneeded-locks.patch
@@ -0,0 +1,391 @@
+From 995d5a236d8b1f7fe24da9dcacb1e89c214afdba Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 16 Jun 2009 14:33:07 +0300
+Subject: [PATCH 119/146] DSS2: OMAPFB: remove unneeded locks
+
+omapfb_lock() locks the whole omapfb device, meaning all framebuffers.
+Usually it is enough to lock only the framebuffer that is being
+manipulated, and for IOCTLs the fb framework does this already.
+
+Thus, we can remove many omapfb_lock()s totally, and change some
+to lock_fb_info().
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 47 ++--------------------------
+ drivers/video/omap2/omapfb/omapfb-main.c | 5 ---
+ drivers/video/omap2/omapfb/omapfb-sysfs.c | 32 ++++++++++++-------
+ 3 files changed, 24 insertions(+), 60 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index c513fe0..91308c2 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -44,8 +44,6 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
+
+ DBG("omapfb_setup_plane\n");
+
+- omapfb_lock(fbdev);
+-
+ if (ofbi->num_overlays != 1) {
+ r = -EINVAL;
+ goto out;
+@@ -94,7 +92,6 @@ static int omapfb_setup_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
+ }
+
+ out:
+- omapfb_unlock(fbdev);
+ if (r)
+ dev_err(fbdev->dev, "setup_plane failed\n");
+ return r;
+@@ -103,9 +100,6 @@ out:
+ static int omapfb_query_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+-
+- omapfb_lock(fbdev);
+
+ if (ofbi->num_overlays != 1) {
+ memset(pi, 0, sizeof(*pi));
+@@ -125,8 +119,6 @@ static int omapfb_query_plane(struct fb_info *fbi, struct omapfb_plane_info *pi)
+ pi->out_height = ovli->out_height;
+ }
+
+- omapfb_unlock(fbdev);
+-
+ return 0;
+ }
+
+@@ -145,43 +137,32 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
+
+ rg = &ofbi->region;
+
+- omapfb_lock(fbdev);
+-
+ for (i = 0; i < ofbi->num_overlays; i++) {
+- if (ofbi->overlays[i]->info.enabled) {
+- r = -EBUSY;
+- goto out;
+- }
++ if (ofbi->overlays[i]->info.enabled)
++ return -EBUSY;
+ }
+
+ if (rg->size != size || rg->type != mi->type) {
+ r = omapfb_realloc_fbmem(fbi, size, mi->type);
+ if (r) {
+ dev_err(fbdev->dev, "realloc fbmem failed\n");
+- goto out;
++ return r;
+ }
+ }
+
+- r = 0;
+-out:
+- omapfb_unlock(fbdev);
+-
+- return r;
++ return 0;
+ }
+
+ static int omapfb_query_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ struct omapfb2_mem_region *rg;
+
+ rg = &ofbi->region;
+ memset(mi, 0, sizeof(*mi));
+
+- omapfb_lock(fbdev);
+ mi->size = rg->size;
+ mi->type = rg->type;
+- omapfb_unlock(fbdev);
+
+ return 0;
+ }
+@@ -189,8 +170,6 @@ static int omapfb_query_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
+ static int omapfb_update_window(struct fb_info *fbi,
+ u32 x, u32 y, u32 w, u32 h)
+ {
+- struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ struct omap_dss_device *display = fb2display(fbi);
+ u16 dw, dh;
+
+@@ -205,9 +184,7 @@ static int omapfb_update_window(struct fb_info *fbi,
+ if (x + w > dw || y + h > dh)
+ return -EINVAL;
+
+- omapfb_lock(fbdev);
+ display->update(display, x, y, w, h);
+- omapfb_unlock(fbdev);
+
+ return 0;
+ }
+@@ -215,8 +192,6 @@ static int omapfb_update_window(struct fb_info *fbi,
+ static int omapfb_set_update_mode(struct fb_info *fbi,
+ enum omapfb_update_mode mode)
+ {
+- struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ struct omap_dss_device *display = fb2display(fbi);
+ enum omap_dss_update_mode um;
+ int r;
+@@ -241,9 +216,7 @@ static int omapfb_set_update_mode(struct fb_info *fbi,
+ return -EINVAL;
+ }
+
+- omapfb_lock(fbdev);
+ r = display->set_update_mode(display, um);
+- omapfb_unlock(fbdev);
+
+ return r;
+ }
+@@ -251,17 +224,13 @@ static int omapfb_set_update_mode(struct fb_info *fbi,
+ static int omapfb_get_update_mode(struct fb_info *fbi,
+ enum omapfb_update_mode *mode)
+ {
+- struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ struct omap_dss_device *display = fb2display(fbi);
+ enum omap_dss_update_mode m;
+
+ if (!display || !display->get_update_mode)
+ return -EINVAL;
+
+- omapfb_lock(fbdev);
+ m = display->get_update_mode(display);
+- omapfb_unlock(fbdev);
+
+ switch (m) {
+ case OMAP_DSS_UPDATE_DISABLED:
+@@ -396,8 +365,6 @@ static int omapfb_memory_read(struct fb_info *fbi,
+ struct omapfb_memory_read *mr)
+ {
+ struct omap_dss_device *display = fb2display(fbi);
+- struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ void *buf;
+ int r;
+
+@@ -416,8 +383,6 @@ static int omapfb_memory_read(struct fb_info *fbi,
+ return -ENOMEM;
+ }
+
+- omapfb_lock(fbdev);
+-
+ r = display->memory_read(display, buf, mr->buffer_size,
+ mr->x, mr->y, mr->w, mr->h);
+
+@@ -428,8 +393,6 @@ static int omapfb_memory_read(struct fb_info *fbi,
+
+ vfree(buf);
+
+- omapfb_unlock(fbdev);
+-
+ return r;
+ }
+
+@@ -509,9 +472,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ break;
+ }
+
+- omapfb_lock(fbdev);
+ r = display->sync(display);
+- omapfb_unlock(fbdev);
+ break;
+
+ case OMAPFB_UPDATE_WINDOW_OLD:
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index dc9c06c..1473581 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -848,13 +848,10 @@ static int omapfb_pan_display(struct fb_var_screeninfo *var,
+ struct fb_info *fbi)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ int r = 0;
+
+ DBG("pan_display(%d)\n", ofbi->id);
+
+- omapfb_lock(fbdev);
+-
+ if (var->xoffset != fbi->var.xoffset ||
+ var->yoffset != fbi->var.yoffset) {
+ struct fb_var_screeninfo new_var;
+@@ -872,8 +869,6 @@ static int omapfb_pan_display(struct fb_var_screeninfo *var,
+ }
+ }
+
+- omapfb_unlock(fbdev);
+-
+ return r;
+ }
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+index a00f61a..ef30e0e 100644
+--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c
++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c
+@@ -49,7 +49,6 @@ static ssize_t store_rotate_type(struct device *dev,
+ {
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ enum omap_dss_rotation_type rot_type;
+ int r;
+
+@@ -58,7 +57,7 @@ static ssize_t store_rotate_type(struct device *dev,
+ if (rot_type != OMAP_DSS_ROT_DMA && rot_type != OMAP_DSS_ROT_VRFB)
+ return -EINVAL;
+
+- omapfb_lock(fbdev);
++ lock_fb_info(fbi);
+
+ r = 0;
+ if (rot_type == ofbi->rotation_type)
+@@ -76,7 +75,7 @@ static ssize_t store_rotate_type(struct device *dev,
+ * need to do any further parameter checking at this point.
+ */
+ out:
+- omapfb_unlock(fbdev);
++ unlock_fb_info(fbi);
+
+ return r ? r : count;
+ }
+@@ -97,7 +96,6 @@ static ssize_t store_mirror(struct device *dev,
+ {
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ bool mirror;
+ int r;
+ struct fb_var_screeninfo new_var;
+@@ -107,7 +105,7 @@ static ssize_t store_mirror(struct device *dev,
+ if (mirror != 0 && mirror != 1)
+ return -EINVAL;
+
+- omapfb_lock(fbdev);
++ lock_fb_info(fbi);
+
+ ofbi->mirror = mirror;
+
+@@ -125,7 +123,7 @@ static ssize_t store_mirror(struct device *dev,
+
+ r = count;
+ out:
+- omapfb_unlock(fbdev);
++ unlock_fb_info(fbi);
+
+ return r;
+ }
+@@ -139,6 +137,9 @@ static ssize_t show_overlays(struct device *dev,
+ ssize_t l = 0;
+ int t;
+
++ omapfb_lock(fbdev);
++ lock_fb_info(fbi);
++
+ for (t = 0; t < ofbi->num_overlays; t++) {
+ struct omap_overlay *ovl = ofbi->overlays[t];
+ int ovlnum;
+@@ -153,6 +154,9 @@ static ssize_t show_overlays(struct device *dev,
+
+ l += snprintf(buf + l, PAGE_SIZE - l, "\n");
+
++ unlock_fb_info(fbi);
++ omapfb_unlock(fbdev);
++
+ return l;
+ }
+
+@@ -192,6 +196,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+ len = len - 1;
+
+ omapfb_lock(fbdev);
++ lock_fb_info(fbi);
+
+ if (len > 0) {
+ char *p = (char *)buf;
+@@ -298,6 +303,7 @@ static ssize_t store_overlays(struct device *dev, struct device_attribute *attr,
+
+ r = count;
+ out:
++ unlock_fb_info(fbi);
+ omapfb_unlock(fbdev);
+
+ return r;
+@@ -311,6 +317,8 @@ static ssize_t show_overlays_rotate(struct device *dev,
+ ssize_t l = 0;
+ int t;
+
++ lock_fb_info(fbi);
++
+ for (t = 0; t < ofbi->num_overlays; t++) {
+ l += snprintf(buf + l, PAGE_SIZE - l, "%s%d",
+ t == 0 ? "" : ",", ofbi->rotation[t]);
+@@ -318,6 +326,8 @@ static ssize_t show_overlays_rotate(struct device *dev,
+
+ l += snprintf(buf + l, PAGE_SIZE - l, "\n");
+
++ unlock_fb_info(fbi);
++
+ return l;
+ }
+
+@@ -326,7 +336,6 @@ static ssize_t store_overlays_rotate(struct device *dev,
+ {
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ int num_ovls = 0, r, i;
+ int len;
+ bool changed = false;
+@@ -336,7 +345,7 @@ static ssize_t store_overlays_rotate(struct device *dev,
+ if (buf[len - 1] == '\n')
+ len = len - 1;
+
+- omapfb_lock(fbdev);
++ lock_fb_info(fbi);
+
+ if (len > 0) {
+ char *p = (char *)buf;
+@@ -382,7 +391,7 @@ static ssize_t store_overlays_rotate(struct device *dev,
+
+ r = count;
+ out:
+- omapfb_unlock(fbdev);
++ unlock_fb_info(fbi);
+
+ return r;
+ }
+@@ -401,14 +410,13 @@ static ssize_t store_size(struct device *dev, struct device_attribute *attr,
+ {
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+- struct omapfb2_device *fbdev = ofbi->fbdev;
+ unsigned long size;
+ int r;
+ int i;
+
+ size = PAGE_ALIGN(simple_strtoul(buf, NULL, 0));
+
+- omapfb_lock(fbdev);
++ lock_fb_info(fbi);
+
+ for (i = 0; i < ofbi->num_overlays; i++) {
+ if (ofbi->overlays[i]->info.enabled) {
+@@ -427,7 +435,7 @@ static ssize_t store_size(struct device *dev, struct device_attribute *attr,
+
+ r = count;
+ out:
+- omapfb_unlock(fbdev);
++ unlock_fb_info(fbi);
+
+ return r;
+ }
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0120-DSS2-DISPC-configuration-management.patch b/recipes/linux/linux-omap-pm/dss2/0120-DSS2-DISPC-configuration-management.patch
new file mode 100644
index 0000000000..ef94abfd0c
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0120-DSS2-DISPC-configuration-management.patch
@@ -0,0 +1,2006 @@
+From 43e7fcaa40dd3726bda3317b8419d4be4e73dbfb Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 12 Jun 2009 10:55:49 +0300
+Subject: [PATCH 120/146] DSS2: DISPC configuration management
+
+This commit implements caching and synchronization of DISPC shadow
+registers.
+
+I had to disable fifomerging, enabling it needs more thought and
+work.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/display.h | 30 +-
+ drivers/video/omap2/dss/dispc.c | 307 ++--------
+ drivers/video/omap2/dss/display.c | 21 +-
+ drivers/video/omap2/dss/dsi.c | 41 +-
+ drivers/video/omap2/dss/dss.h | 19 +-
+ drivers/video/omap2/dss/manager.c | 933 ++++++++++++++++++++++++++---
+ drivers/video/omap2/dss/overlay.c | 64 ++-
+ drivers/video/omap2/dss/rfbi.c | 2 +-
+ drivers/video/omap2/dss/venc.c | 10 +
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 26 +
+ include/linux/omapfb.h | 1 +
+ 11 files changed, 1047 insertions(+), 407 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 0695497..be07c35 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -275,13 +275,19 @@ struct omap_overlay {
+ struct kobject kobj;
+ struct list_head list;
+
++ /* static fields */
+ const char *name;
+ int id;
+- struct omap_overlay_manager *manager;
+ enum omap_color_mode supported_modes;
+- struct omap_overlay_info info;
+ enum omap_overlay_caps caps;
+
++ /* dynamic fields */
++ struct omap_overlay_manager *manager;
++ struct omap_overlay_info info;
++
++ /* if true, info has been changed, but not applied() yet */
++ bool info_dirty;
++
+ int (*set_manager)(struct omap_overlay *ovl,
+ struct omap_overlay_manager *mgr);
+ int (*unset_manager)(struct omap_overlay *ovl);
+@@ -290,6 +296,8 @@ struct omap_overlay {
+ struct omap_overlay_info *info);
+ void (*get_overlay_info)(struct omap_overlay *ovl,
+ struct omap_overlay_info *info);
++
++ int (*wait_for_go)(struct omap_overlay *ovl);
+ };
+
+ struct omap_overlay_manager_info {
+@@ -306,25 +314,33 @@ struct omap_overlay_manager {
+ struct kobject kobj;
+ struct list_head list;
+
++ /* static fields */
+ const char *name;
+ int id;
+ enum omap_overlay_manager_caps caps;
+- struct omap_overlay_manager_info info;
+- struct omap_dss_device *device;
+ int num_overlays;
+ struct omap_overlay **overlays;
+ enum omap_display_type supported_displays;
+
++ /* dynamic fields */
++ struct omap_dss_device *device;
++ struct omap_overlay_manager_info info;
++
++ bool device_changed;
++ /* if true, info has been changed but not applied() yet */
++ bool info_dirty;
++
+ int (*set_device)(struct omap_overlay_manager *mgr,
+ struct omap_dss_device *dssdev);
+ int (*unset_device)(struct omap_overlay_manager *mgr);
+
+- int (*apply)(struct omap_overlay_manager *mgr);
+-
+ int (*set_manager_info)(struct omap_overlay_manager *mgr,
+ struct omap_overlay_manager_info *info);
+ void (*get_manager_info)(struct omap_overlay_manager *mgr,
+ struct omap_overlay_manager_info *info);
++
++ int (*apply)(struct omap_overlay_manager *mgr);
++ int (*wait_for_go)(struct omap_overlay_manager *mgr);
+ };
+
+ struct omap_dss_device {
+@@ -450,8 +466,6 @@ struct omap_dss_device {
+ void *buf, size_t size,
+ u16 x, u16 y, u16 w, u16 h);
+
+- void (*configure_overlay)(struct omap_overlay *overlay);
+-
+ int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
+ u32 (*get_wss)(struct omap_dss_device *dssdev);
+
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 4e1da6b..d061d75 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -158,6 +158,8 @@ static struct {
+ unsigned long cache_prate;
+ struct dispc_clock_info cache_cinfo;
+
++ u32 fifo_size[3];
++
+ spinlock_t irq_lock;
+ u32 irq_error_mask;
+ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
+@@ -479,10 +481,21 @@ static inline void enable_clocks(bool enable)
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+ }
+
++bool dispc_go_busy(enum omap_channel channel)
++{
++ int bit;
++
++ if (channel == OMAP_DSS_CHANNEL_LCD)
++ bit = 5; /* GOLCD */
++ else
++ bit = 6; /* GODIGIT */
++
++ return REG_GET(DISPC_CONTROL, bit, bit) == 1;
++}
++
+ void dispc_go(enum omap_channel channel)
+ {
+ int bit;
+- unsigned long tmo;
+
+ enable_clocks(1);
+
+@@ -500,13 +513,9 @@ void dispc_go(enum omap_channel channel)
+ else
+ bit = 6; /* GODIGIT */
+
+- tmo = jiffies + msecs_to_jiffies(200);
+- while (REG_GET(DISPC_CONTROL, bit, bit) == 1) {
+- if (time_after(jiffies, tmo)) {
+- DSSERR("timeout waiting GO flag\n");
+- goto end;
+- }
+- cpu_relax();
++ if (REG_GET(DISPC_CONTROL, bit, bit) == 1) {
++ DSSERR("GO bit not down for channel %d\n", channel);
++ goto end;
+ }
+
+ DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : "DIGIT");
+@@ -942,31 +951,33 @@ void dispc_set_digit_size(u16 width, u16 height)
+ enable_clocks(0);
+ }
+
+-u32 dispc_get_plane_fifo_size(enum omap_plane plane)
++static void dispc_read_plane_fifo_sizes(void)
+ {
+ const struct dispc_reg fsz_reg[] = { DISPC_GFX_FIFO_SIZE_STATUS,
+ DISPC_VID_FIFO_SIZE_STATUS(0),
+ DISPC_VID_FIFO_SIZE_STATUS(1) };
+ u32 size;
++ int plane;
+
+ enable_clocks(1);
+
+- if (cpu_is_omap24xx())
+- size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0);
+- else if (cpu_is_omap34xx())
+- size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0);
+- else
+- BUG();
++ for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) {
++ if (cpu_is_omap24xx())
++ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0);
++ else if (cpu_is_omap34xx())
++ size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0);
++ else
++ BUG();
+
+- if (cpu_is_omap34xx()) {
+- /* FIFOMERGE */
+- if (REG_GET(DISPC_CONFIG, 14, 14))
+- size *= 3;
++ dispc.fifo_size[plane] = size;
+ }
+
+ enable_clocks(0);
++}
+
+- return size;
++u32 dispc_get_plane_fifo_size(enum omap_plane plane)
++{
++ return dispc.fifo_size[plane];
+ }
+
+ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high)
+@@ -974,16 +985,10 @@ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high)
+ const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD,
+ DISPC_VID_FIFO_THRESHOLD(0),
+ DISPC_VID_FIFO_THRESHOLD(1) };
+- u32 size;
+-
+ enable_clocks(1);
+
+- size = dispc_get_plane_fifo_size(plane);
+-
+- BUG_ON(low > size || high > size);
+-
+- DSSDBG("fifo(%d) size %d, low/high old %u/%u, new %u/%u\n",
+- plane, size,
++ DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n",
++ plane,
+ REG_GET(ftrs_reg[plane], 11, 0),
+ REG_GET(ftrs_reg[plane], 27, 16),
+ low, high);
+@@ -1480,8 +1485,14 @@ static unsigned long calc_fclk(u16 width, u16 height,
+ return dispc_pclk_rate() * vf * hf;
+ }
+
++void dispc_set_channel_out(enum omap_plane plane, enum omap_channel channel_out)
++{
++ enable_clocks(1);
++ _dispc_set_channel_out(plane, channel_out);
++ enable_clocks(0);
++}
++
+ static int _dispc_setup_plane(enum omap_plane plane,
+- enum omap_channel channel_out,
+ u32 paddr, u16 screen_width,
+ u16 pos_x, u16 pos_y,
+ u16 width, u16 height,
+@@ -1631,7 +1642,6 @@ static int _dispc_setup_plane(enum omap_plane plane,
+ DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
+ offset0, offset1, row_inc, pix_inc);
+
+- _dispc_set_channel_out(plane, channel_out);
+ _dispc_set_color_mode(plane, color_mode);
+
+ _dispc_set_plane_ba0(plane, paddr + offset0);
+@@ -3068,6 +3078,8 @@ static void _omap_dispc_initial_config(void)
+ _dispc_setup_color_conv_coef();
+
+ dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY);
++
++ dispc_read_plane_fifo_sizes();
+ }
+
+ int dispc_init(void)
+@@ -3127,7 +3139,7 @@ int dispc_enable_plane(enum omap_plane plane, bool enable)
+ return 0;
+ }
+
+-int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
++int dispc_setup_plane(enum omap_plane plane,
+ u32 paddr, u16 screen_width,
+ u16 pos_x, u16 pos_y,
+ u16 width, u16 height,
+@@ -3139,9 +3151,9 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+ {
+ int r = 0;
+
+- DSSDBG("dispc_setup_plane %d, ch %d, pa %x, sw %d, %d,%d, %dx%d -> "
++ DSSDBG("dispc_setup_plane %d, pa %x, sw %d, %d,%d, %dx%d -> "
+ "%dx%d, ilace %d, cmode %x, rot %d, mir %d\n",
+- plane, channel_out, paddr, screen_width, pos_x, pos_y,
++ plane, paddr, screen_width, pos_x, pos_y,
+ width, height,
+ out_width, out_height,
+ ilace, color_mode,
+@@ -3149,7 +3161,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+
+ enable_clocks(1);
+
+- r = _dispc_setup_plane(plane, channel_out,
++ r = _dispc_setup_plane(plane,
+ paddr, screen_width,
+ pos_x, pos_y,
+ width, height,
+@@ -3163,230 +3175,3 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+
+ return r;
+ }
+-
+-static int dispc_is_intersecting(int x1, int y1, int w1, int h1,
+- int x2, int y2, int w2, int h2)
+-{
+- if (x1 >= (x2+w2))
+- return 0;
+-
+- if ((x1+w1) <= x2)
+- return 0;
+-
+- if (y1 >= (y2+h2))
+- return 0;
+-
+- if ((y1+h1) <= y2)
+- return 0;
+-
+- return 1;
+-}
+-
+-static int dispc_is_overlay_scaled(struct omap_overlay_info *pi)
+-{
+- if (pi->width != pi->out_width)
+- return 1;
+-
+- if (pi->height != pi->out_height)
+- return 1;
+-
+- return 0;
+-}
+-
+-/* returns the area that needs updating */
+-void dispc_setup_partial_planes(struct omap_dss_device *dssdev,
+- u16 *xi, u16 *yi, u16 *wi, u16 *hi)
+-{
+- struct omap_overlay_manager *mgr;
+- int i;
+-
+- int x, y, w, h;
+-
+- x = *xi;
+- y = *yi;
+- w = *wi;
+- h = *hi;
+-
+- DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n",
+- *xi, *yi, *wi, *hi);
+-
+-
+- mgr = dssdev->manager;
+-
+- if (!mgr) {
+- DSSDBG("no manager\n");
+- return;
+- }
+-
+- for (i = 0; i < mgr->num_overlays; i++) {
+- struct omap_overlay *ovl;
+- struct omap_overlay_info *pi;
+- ovl = mgr->overlays[i];
+-
+- if (ovl->manager != mgr)
+- continue;
+-
+- if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0)
+- continue;
+-
+- pi = &ovl->info;
+-
+- if (!pi->enabled)
+- continue;
+- /*
+- * If the plane is intersecting and scaled, we
+- * enlarge the update region to accomodate the
+- * whole area
+- */
+-
+- if (dispc_is_intersecting(x, y, w, h,
+- pi->pos_x, pi->pos_y,
+- pi->out_width, pi->out_height)) {
+- if (dispc_is_overlay_scaled(pi)) {
+-
+- int x1, y1, x2, y2;
+-
+- if (x > pi->pos_x)
+- x1 = pi->pos_x;
+- else
+- x1 = x;
+-
+- if (y > pi->pos_y)
+- y1 = pi->pos_y;
+- else
+- y1 = y;
+-
+- if ((x + w) < (pi->pos_x + pi->out_width))
+- x2 = pi->pos_x + pi->out_width;
+- else
+- x2 = x + w;
+-
+- if ((y + h) < (pi->pos_y + pi->out_height))
+- y2 = pi->pos_y + pi->out_height;
+- else
+- y2 = y + h;
+-
+- x = x1;
+- y = y1;
+- w = x2 - x1;
+- h = y2 - y1;
+-
+- DSSDBG("Update area after enlarge due to "
+- "scaling %d, %d %dx%d\n",
+- x, y, w, h);
+- }
+- }
+- }
+-
+- for (i = 0; i < mgr->num_overlays; i++) {
+- struct omap_overlay *ovl = mgr->overlays[i];
+- struct omap_overlay_info *pi = &ovl->info;
+-
+- int px = pi->pos_x;
+- int py = pi->pos_y;
+- int pw = pi->width;
+- int ph = pi->height;
+- int pow = pi->out_width;
+- int poh = pi->out_height;
+- u32 pa = pi->paddr;
+- int psw = pi->screen_width;
+- int bpp;
+-
+- if (ovl->manager != mgr)
+- continue;
+-
+- /*
+- * If plane is not enabled or the update region
+- * does not intersect with the plane in question,
+- * we really disable the plane from hardware
+- */
+-
+- if (!pi->enabled ||
+- !dispc_is_intersecting(x, y, w, h,
+- px, py, pow, poh)) {
+- dispc_enable_plane(ovl->id, 0);
+- continue;
+- }
+-
+- switch (pi->color_mode) {
+- case OMAP_DSS_COLOR_RGB16:
+- case OMAP_DSS_COLOR_ARGB16:
+- case OMAP_DSS_COLOR_YUV2:
+- case OMAP_DSS_COLOR_UYVY:
+- bpp = 16;
+- break;
+-
+- case OMAP_DSS_COLOR_RGB24P:
+- bpp = 24;
+- break;
+-
+- case OMAP_DSS_COLOR_RGB24U:
+- case OMAP_DSS_COLOR_ARGB32:
+- case OMAP_DSS_COLOR_RGBA32:
+- case OMAP_DSS_COLOR_RGBX32:
+- bpp = 32;
+- break;
+-
+- default:
+- BUG();
+- return;
+- }
+-
+- if (x > pi->pos_x) {
+- px = 0;
+- pw -= (x - pi->pos_x);
+- pa += (x - pi->pos_x) * bpp / 8;
+- } else {
+- px = pi->pos_x - x;
+- }
+-
+- if (y > pi->pos_y) {
+- py = 0;
+- ph -= (y - pi->pos_y);
+- pa += (y - pi->pos_y) * psw * bpp / 8;
+- } else {
+- py = pi->pos_y - y;
+- }
+-
+- if (w < (px+pw))
+- pw -= (px+pw) - (w);
+-
+- if (h < (py+ph))
+- ph -= (py+ph) - (h);
+-
+- /* Can't scale the GFX plane */
+- if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0 ||
+- dispc_is_overlay_scaled(pi) == 0) {
+- pow = pw;
+- poh = ph;
+- }
+-
+- DSSDBG("calc plane %d, %x, sw %d, %d,%d, %dx%d -> %dx%d\n",
+- ovl->id, pa, psw, px, py, pw, ph, pow, poh);
+-
+- dispc_setup_plane(ovl->id, mgr->id,
+- pa, psw,
+- px, py,
+- pw, ph,
+- pow, poh,
+- pi->color_mode, 0,
+- pi->rotation_type,
+- pi->rotation,
+- pi->mirror,
+- pi->global_alpha);
+-
+- if (dss_use_replication(dssdev, ovl->info.color_mode))
+- dispc_enable_replication(ovl->id, true);
+- else
+- dispc_enable_replication(ovl->id, false);
+-
+- dispc_enable_plane(ovl->id, 1);
+- }
+-
+- *xi = x;
+- *yi = y;
+- *wi = w;
+- *hi = h;
+-
+-}
+-
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index 1242c39..6b5d0cf 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -310,21 +310,17 @@ static void default_get_resolution(struct omap_dss_device *dssdev,
+ *yres = dssdev->panel.timings.y_res;
+ }
+
+-static void default_configure_overlay(struct omap_overlay *ovl)
++void default_get_overlay_fifo_thresholds(enum omap_plane plane,
++ u32 fifo_size, enum omap_burst_size *burst_size,
++ u32 *fifo_low, u32 *fifo_high)
+ {
+- unsigned low, high, size;
+- enum omap_burst_size burst;
+- enum omap_plane plane = ovl->id;
++ unsigned burst_size_bytes;
+
+- burst = OMAP_DSS_BURST_16x32;
+- size = 16 * 32 / 8;
++ *burst_size = OMAP_DSS_BURST_16x32;
++ burst_size_bytes = 16 * 32 / 8;
+
+- dispc_set_burst_size(plane, burst);
+-
+- high = dispc_get_plane_fifo_size(plane) - 1;
+- low = dispc_get_plane_fifo_size(plane) - size;
+-
+- dispc_setup_plane_fifo(plane, low, high);
++ *fifo_high = fifo_size - 1;
++ *fifo_low = fifo_size - burst_size_bytes;
+ }
+
+ static int default_wait_vsync(struct omap_dss_device *dssdev)
+@@ -431,7 +427,6 @@ void dss_init_device(struct platform_device *pdev,
+
+ dssdev->get_resolution = default_get_resolution;
+ dssdev->get_recommended_bpp = default_get_recommended_bpp;
+- dssdev->configure_overlay = default_configure_overlay;
+ dssdev->wait_vsync = default_wait_vsync;
+
+ switch (dssdev->type) {
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index ffac77b..875be0c 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -2566,7 +2566,7 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+
+ dispc_disable_sidle();
+
+- dispc_enable_lcd_out(1);
++ dss_start_update(dssdev);
+
+ if (use_te_trigger)
+ dsi_vc_send_bta(1);
+@@ -2606,12 +2606,19 @@ static void dsi_set_update_region(struct omap_dss_device *dssdev,
+ static void dsi_start_auto_update(struct omap_dss_device *dssdev)
+ {
+ u16 w, h;
++ int i;
+
+ DSSDBG("starting auto update\n");
+
+ /* In automatic mode the overlay settings are applied like on DPI/SDI.
+- * The overlay settings may not have been applied, if we were in manual
+- * mode earlier, so do it here */
++ * Mark the overlays dirty, so that we get the overlays configured, as
++ * manual mode has left them in bad shape after config partia planes */
++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
++ struct omap_overlay *ovl;
++ ovl = omap_dss_get_overlay(i);
++ if (ovl->manager == dssdev->manager)
++ ovl->info_dirty = true;
++ }
+ dssdev->manager->apply(dssdev->manager);
+
+ dssdev->get_resolution(dssdev, &w, &h);
+@@ -2732,7 +2739,7 @@ static int dsi_update_thread(void *data)
+ if (device->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+
+ if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL) {
+- dispc_setup_partial_planes(device,
++ dss_setup_partial_planes(device,
+ &x, &y, &w, &h);
+ #if 1
+ /* XXX there seems to be a bug in this driver
+@@ -2741,12 +2748,13 @@ static int dsi_update_thread(void *data)
+ * are always odd, so "fix" it here for now */
+ if (w & 1) {
+ u16 dw, dh;
+- device->get_resolution(device, &dw, &dh);
++ device->get_resolution(device,
++ &dw, &dh);
+ if (x + w == dw)
+ x &= ~1;
+ ++w;
+
+- dispc_setup_partial_planes(device,
++ dss_setup_partial_planes(device,
+ &x, &y, &w, &h);
+ }
+ #endif
+@@ -3361,20 +3369,17 @@ static int dsi_display_memory_read(struct omap_dss_device *dssdev,
+ return r;
+ }
+
+-static void dsi_configure_overlay(struct omap_overlay *ovl)
++void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
++ u32 fifo_size, enum omap_burst_size *burst_size,
++ u32 *fifo_low, u32 *fifo_high)
+ {
+- unsigned low, high, size;
+- enum omap_burst_size burst;
+- enum omap_plane plane = ovl->id;
++ unsigned burst_size_bytes;
+
+- burst = OMAP_DSS_BURST_16x32;
+- size = 16 * 32 / 8;
++ *burst_size = OMAP_DSS_BURST_16x32;
++ burst_size_bytes = 16 * 32 / 8;
+
+- dispc_set_burst_size(plane, burst);
+-
+- high = dispc_get_plane_fifo_size(plane) - size;
+- low = 0;
+- dispc_setup_plane_fifo(plane, low, high);
++ *fifo_high = fifo_size - burst_size_bytes;
++ *fifo_low = 0;
+ }
+
+ int dsi_init_display(struct omap_dss_device *dssdev)
+@@ -3401,8 +3406,6 @@ int dsi_init_display(struct omap_dss_device *dssdev)
+ dssdev->run_test = dsi_display_run_test;
+ dssdev->memory_read = dsi_display_memory_read;
+
+- dssdev->configure_overlay = dsi_configure_overlay;
+-
+ dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
+
+ dsi.vc[0].dssdev = dssdev;
+diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
+index 53f0f3d..50f7f5f 100644
+--- a/drivers/video/omap2/dss/dss.h
++++ b/drivers/video/omap2/dss/dss.h
+@@ -175,10 +175,17 @@ void dss_uninit_device(struct platform_device *pdev,
+ struct omap_dss_device *dssdev);
+ bool dss_use_replication(struct omap_dss_device *dssdev,
+ enum omap_color_mode mode);
++void default_get_overlay_fifo_thresholds(enum omap_plane plane,
++ u32 fifo_size, enum omap_burst_size *burst_size,
++ u32 *fifo_low, u32 *fifo_high);
+
+ /* manager */
+ int dss_init_overlay_managers(struct platform_device *pdev);
+ void dss_uninit_overlay_managers(struct platform_device *pdev);
++int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl);
++void dss_setup_partial_planes(struct omap_dss_device *dssdev,
++ u16 *x, u16 *y, u16 *w, u16 *h);
++void dss_start_update(struct omap_dss_device *dssdev);
+
+ /* overlay */
+ void dss_init_overlays(struct platform_device *pdev);
+@@ -233,6 +240,9 @@ int dsi_pll_calc_pck(bool is_tft, unsigned long req_pck,
+ int dsi_pll_program(struct dsi_clock_info *cinfo);
+ int dsi_pll_init(bool enable_hsclk, bool enable_hsdiv);
+ void dsi_pll_uninit(void);
++void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
++ u32 fifo_size, enum omap_burst_size *burst_size,
++ u32 *fifo_low, u32 *fifo_high);
+
+ /* DPI */
+ int dpi_init(void);
+@@ -270,8 +280,10 @@ void dispc_set_plane_ba0(enum omap_plane plane, u32 paddr);
+ void dispc_set_plane_ba1(enum omap_plane plane, u32 paddr);
+ void dispc_set_plane_pos(enum omap_plane plane, u16 x, u16 y);
+ void dispc_set_plane_size(enum omap_plane plane, u16 width, u16 height);
++void dispc_set_channel_out(enum omap_plane plane,
++ enum omap_channel channel_out);
+
+-int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
++int dispc_setup_plane(enum omap_plane plane,
+ u32 paddr, u16 screen_width,
+ u16 pos_x, u16 pos_y,
+ u16 width, u16 height,
+@@ -282,6 +294,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out,
+ u8 rotation, bool mirror,
+ u8 global_alpha);
+
++bool dispc_go_busy(enum omap_channel channel);
+ void dispc_go(enum omap_channel channel);
+ void dispc_enable_lcd_out(bool enable);
+ void dispc_enable_digit_out(bool enable);
+@@ -320,10 +333,6 @@ int dispc_set_clock_div(struct dispc_clock_info *cinfo);
+ int dispc_get_clock_div(struct dispc_clock_info *cinfo);
+ void dispc_set_lcd_divisor(u16 lck_div, u16 pck_div);
+
+-void dispc_setup_partial_planes(struct omap_dss_device *dssdev,
+- u16 *x, u16 *y, u16 *w, u16 *h);
+-void dispc_draw_partial_planes(struct omap_dss_device *dssdev);
+-
+
+ /* VENC */
+ int venc_init(struct platform_device *pdev);
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 0b0c51e..7b8e556 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -25,8 +25,11 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include <linux/jiffies.h>
+
+ #include <mach/display.h>
++#include <mach/cpu.h>
+
+ #include "dss.h"
+
+@@ -348,6 +351,106 @@ static struct kobj_type manager_ktype = {
+ .default_attrs = manager_sysfs_attrs,
+ };
+
++/*
++ * We have 4 levels of cache for the dispc settings. First two are in SW and
++ * the latter two in HW.
++ *
++ * +--------------------+
++ * |overlay/manager_info|
++ * +--------------------+
++ * v
++ * apply()
++ * v
++ * +--------------------+
++ * | dss_cache |
++ * +--------------------+
++ * v
++ * configure()
++ * v
++ * +--------------------+
++ * | shadow registers |
++ * +--------------------+
++ * v
++ * VFP or lcd/digit_enable
++ * v
++ * +--------------------+
++ * | registers |
++ * +--------------------+
++ */
++
++struct overlay_cache_data {
++ /* If true, cache changed, but not written to shadow registers. Set
++ * in apply(), cleared when registers written. */
++ bool dirty;
++ /* If true, shadow registers contain changed values not yet in real
++ * registers. Set when writing to shadow registers, cleared at
++ * VSYNC/EVSYNC */
++ bool shadow_dirty;
++
++ bool enabled;
++
++ u32 paddr;
++ void __iomem *vaddr;
++ u16 screen_width;
++ u16 width;
++ u16 height;
++ enum omap_color_mode color_mode;
++ u8 rotation;
++ enum omap_dss_rotation_type rotation_type;
++ bool mirror;
++
++ u16 pos_x;
++ u16 pos_y;
++ u16 out_width; /* if 0, out_width == width */
++ u16 out_height; /* if 0, out_height == height */
++ u8 global_alpha;
++
++ enum omap_channel channel;
++ bool replication;
++ bool ilace;
++
++ enum omap_burst_size burst_size;
++ u32 fifo_low;
++ u32 fifo_high;
++
++ bool manual_update;
++};
++
++struct manager_cache_data {
++ /* If true, cache changed, but not written to shadow registers. Set
++ * in apply(), cleared when registers written. */
++ bool dirty;
++ /* If true, shadow registers contain changed values not yet in real
++ * registers. Set when writing to shadow registers, cleared at
++ * VSYNC/EVSYNC */
++ bool shadow_dirty;
++
++ u32 default_color;
++
++ enum omap_dss_trans_key_type trans_key_type;
++ u32 trans_key;
++ bool trans_enabled;
++
++ bool alpha_enabled;
++
++ bool manual_upd_display;
++ bool manual_update;
++ bool do_manual_update;
++
++ /* manual update region */
++ u16 x, y, w, h;
++};
++
++static struct {
++ spinlock_t lock;
++ struct overlay_cache_data overlay_cache[3];
++ struct manager_cache_data manager_cache[2];
++
++ bool irq_enabled;
++} dss_cache;
++
++
++
+ static int omap_dss_set_device(struct omap_overlay_manager *mgr,
+ struct omap_dss_device *dssdev)
+ {
+@@ -379,6 +482,7 @@ static int omap_dss_set_device(struct omap_overlay_manager *mgr,
+
+ dssdev->manager = mgr;
+ mgr->device = dssdev;
++ mgr->device_changed = true;
+
+ return 0;
+ }
+@@ -392,154 +496,814 @@ static int omap_dss_unset_device(struct omap_overlay_manager *mgr)
+
+ mgr->device->manager = NULL;
+ mgr->device = NULL;
++ mgr->device_changed = true;
+
+ return 0;
+ }
+
++static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
++{
++ unsigned long timeout = msecs_to_jiffies(500);
++ struct manager_cache_data *mc;
++ enum omap_channel channel;
++ u32 irq;
++ int r;
++ int i;
++
++ if (!mgr->device)
++ return 0;
++
++ if (mgr->device->type == OMAP_DISPLAY_TYPE_VENC) {
++ irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
++ channel = OMAP_DSS_CHANNEL_DIGIT;
++ } else {
++ if (mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
++ enum omap_dss_update_mode mode;
++ mode = mgr->device->get_update_mode(mgr->device);
++ if (mode != OMAP_DSS_UPDATE_AUTO)
++ return 0;
++
++ irq = DISPC_IRQ_FRAMEDONE;
++ } else {
++ irq = DISPC_IRQ_VSYNC;
++ }
++ channel = OMAP_DSS_CHANNEL_LCD;
++ }
++
++ mc = &dss_cache.manager_cache[mgr->id];
++ i = 0;
++ while (1) {
++ unsigned long flags;
++ bool shadow_dirty, dirty;
++
++ spin_lock_irqsave(&dss_cache.lock, flags);
++ dirty = mc->dirty;
++ shadow_dirty = mc->shadow_dirty;
++ spin_unlock_irqrestore(&dss_cache.lock, flags);
++
++ if (!dirty && !shadow_dirty) {
++ r = 0;
++ break;
++ }
++
++ /* 4 iterations is the worst case:
++ * 1 - initial iteration, dirty = true (between VFP and VSYNC)
++ * 2 - first VSYNC, dirty = true
++ * 3 - dirty = false, shadow_dirty = true
++ * 4 - shadow_dirty = false */
++ if (i++ == 3) {
++ DSSERR("mgr(%d)->wait_for_go() not finishing\n",
++ mgr->id);
++ r = 0;
++ break;
++ }
++
++ r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
++ if (r == -ERESTARTSYS)
++ break;
++
++ if (r) {
++ DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id);
++ break;
++ }
++ }
++
++ return r;
++}
++
++int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
++{
++ unsigned long timeout = msecs_to_jiffies(500);
++ enum omap_channel channel;
++ struct overlay_cache_data *oc;
++ struct omap_dss_device *dssdev;
++ u32 irq;
++ int r;
++ int i;
++
++ if (!ovl->manager || !ovl->manager->device)
++ return 0;
++
++ dssdev = ovl->manager->device;
++
++ if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) {
++ irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
++ channel = OMAP_DSS_CHANNEL_DIGIT;
++ } else {
++ if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
++ enum omap_dss_update_mode mode;
++ mode = dssdev->get_update_mode(dssdev);
++ if (mode != OMAP_DSS_UPDATE_AUTO)
++ return 0;
++
++ irq = DISPC_IRQ_FRAMEDONE;
++ } else {
++ irq = DISPC_IRQ_VSYNC;
++ }
++ channel = OMAP_DSS_CHANNEL_LCD;
++ }
++
++ oc = &dss_cache.overlay_cache[ovl->id];
++ i = 0;
++ while (1) {
++ unsigned long flags;
++ bool shadow_dirty, dirty;
++
++ spin_lock_irqsave(&dss_cache.lock, flags);
++ dirty = oc->dirty;
++ shadow_dirty = oc->shadow_dirty;
++ spin_unlock_irqrestore(&dss_cache.lock, flags);
++
++ if (!dirty && !shadow_dirty) {
++ r = 0;
++ break;
++ }
++
++ /* 4 iterations is the worst case:
++ * 1 - initial iteration, dirty = true (between VFP and VSYNC)
++ * 2 - first VSYNC, dirty = true
++ * 3 - dirty = false, shadow_dirty = true
++ * 4 - shadow_dirty = false */
++ if (i++ == 3) {
++ DSSERR("ovl(%d)->wait_for_go() not finishing\n",
++ ovl->id);
++ r = 0;
++ break;
++ }
++
++ r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
++ if (r == -ERESTARTSYS)
++ break;
++
++ if (r) {
++ DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id);
++ break;
++ }
++ }
++
++ return r;
++}
+
+ static int overlay_enabled(struct omap_overlay *ovl)
+ {
+ return ovl->info.enabled && ovl->manager && ovl->manager->device;
+ }
+
+-/* We apply settings to both managers here so that we can use optimizations
+- * like fifomerge. Shadow registers can be changed first and the non-shadowed
+- * should be changed last, at the same time with GO */
+-static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
++/* Is rect1 a subset of rect2? */
++static bool rectangle_subset(int x1, int y1, int w1, int h1,
++ int x2, int y2, int w2, int h2)
+ {
++ if (x1 < x2 || y1 < y2)
++ return false;
++
++ if (x1 + w1 > x2 + w2)
++ return false;
++
++ if (y1 + h1 > y2 + h2)
++ return false;
++
++ return true;
++}
++
++/* Do rect1 and rect2 overlap? */
++static bool rectangle_intersects(int x1, int y1, int w1, int h1,
++ int x2, int y2, int w2, int h2)
++{
++ if (x1 >= x2 + w2)
++ return false;
++
++ if (x2 >= x1 + w1)
++ return false;
++
++ if (y1 >= y2 + h2)
++ return false;
++
++ if (y2 >= y1 + h1)
++ return false;
++
++ return true;
++}
++
++static bool dispc_is_overlay_scaled(struct overlay_cache_data *oc)
++{
++ if (oc->out_width != 0 && oc->width != oc->out_width)
++ return true;
++
++ if (oc->out_height != 0 && oc->height != oc->out_height)
++ return true;
++
++ return false;
++}
++
++static int configure_overlay(enum omap_plane plane)
++{
++ struct overlay_cache_data *c;
++ struct manager_cache_data *mc;
++ u16 outw, outh;
++ u16 x, y, w, h;
++ u32 paddr;
++ int r;
++
++ DSSDBGF("%d", plane);
++
++ c = &dss_cache.overlay_cache[plane];
++
++ if (!c->enabled) {
++ dispc_enable_plane(plane, 0);
++ return 0;
++ }
++
++ mc = &dss_cache.manager_cache[c->channel];
++
++ x = c->pos_x;
++ y = c->pos_y;
++ w = c->width;
++ h = c->height;
++ outw = c->out_width == 0 ? c->width : c->out_width;
++ outh = c->out_height == 0 ? c->height : c->out_height;
++ paddr = c->paddr;
++
++ if (c->manual_update && mc->do_manual_update) {
++ unsigned bpp;
++ /* If the overlay is outside the update region, disable it */
++ if (!rectangle_intersects(mc->x, mc->y, mc->w, mc->h,
++ x, y, outw, outh)) {
++ dispc_enable_plane(plane, 0);
++ return 0;
++ }
++
++ switch (c->color_mode) {
++ case OMAP_DSS_COLOR_RGB16:
++ case OMAP_DSS_COLOR_ARGB16:
++ case OMAP_DSS_COLOR_YUV2:
++ case OMAP_DSS_COLOR_UYVY:
++ bpp = 16;
++ break;
++
++ case OMAP_DSS_COLOR_RGB24P:
++ bpp = 24;
++ break;
++
++ case OMAP_DSS_COLOR_RGB24U:
++ case OMAP_DSS_COLOR_ARGB32:
++ case OMAP_DSS_COLOR_RGBA32:
++ case OMAP_DSS_COLOR_RGBX32:
++ bpp = 32;
++ break;
++
++ default:
++ BUG();
++ }
++
++ if (mc->x > c->pos_x) {
++ x = 0;
++ w -= (mc->x - c->pos_x);
++ paddr += (mc->x - c->pos_x) * bpp / 8;
++ } else {
++ x = c->pos_x - mc->x;
++ }
++
++ if (mc->y > c->pos_y) {
++ y = 0;
++ h -= (mc->y - c->pos_y);
++ paddr += (mc->y - c->pos_y) * c->screen_width * bpp / 8;
++ } else {
++ y = c->pos_y - mc->y;
++ }
++
++ if (mc->w < (x+w))
++ w -= (x+w) - (mc->w);
++
++ if (mc->h < (y+h))
++ h -= (y+h) - (mc->h);
++
++ if (!dispc_is_overlay_scaled(c)) {
++ outw = w;
++ outh = h;
++ }
++ }
++
++ r = dispc_setup_plane(plane,
++ paddr,
++ c->screen_width,
++ x, y,
++ w, h,
++ outw, outh,
++ c->color_mode,
++ c->ilace,
++ c->rotation_type,
++ c->rotation,
++ c->mirror,
++ c->global_alpha);
++
++ if (r) {
++ /* this shouldn't happen */
++ DSSERR("dispc_setup_plane failed for ovl %d\n", plane);
++ dispc_enable_plane(plane, 0);
++ return r;
++ }
++
++ dispc_enable_replication(plane, c->replication);
++
++ dispc_set_burst_size(plane, c->burst_size);
++ dispc_setup_plane_fifo(plane, c->fifo_low, c->fifo_high);
++
++ dispc_enable_plane(plane, 1);
++
++ return 0;
++}
++
++static void configure_manager(enum omap_channel channel)
++{
++ struct manager_cache_data *c;
++
++ DSSDBGF("%d", channel);
++
++ c = &dss_cache.manager_cache[channel];
++
++ dispc_set_trans_key(channel, c->trans_key_type, c->trans_key);
++ dispc_enable_trans_key(channel, c->trans_enabled);
++ dispc_enable_alpha_blending(channel, c->alpha_enabled);
++}
++
++/* configure_dispc() tries to write values from cache to shadow registers.
++ * It writes only to those managers/overlays that are not busy.
++ * returns 0 if everything could be written to shadow registers.
++ * returns 1 if not everything could be written to shadow registers. */
++static int configure_dispc(void)
++{
++ struct overlay_cache_data *oc;
++ struct manager_cache_data *mc;
++ const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
++ const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
+ int i;
+- int ret = 0;
+- enum omap_dss_update_mode mode;
+- struct omap_dss_device *dssdev;
+- struct omap_overlay *ovl;
+- bool ilace;
+- int outw, outh;
+ int r;
+- int num_planes_enabled = 0;
++ bool mgr_busy[2];
++ bool mgr_go[2];
++ bool busy;
+
+- DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
++ r = 0;
++ busy = false;
+
+- dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
++ mgr_busy[0] = dispc_go_busy(0);
++ mgr_busy[1] = dispc_go_busy(1);
++ mgr_go[0] = false;
++ mgr_go[1] = false;
+
+- /* Configure normal overlay parameters and disable unused overlays */
+- for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
+- ovl = omap_dss_get_overlay(i);
++ /* Commit overlay settings */
++ for (i = 0; i < num_ovls; ++i) {
++ oc = &dss_cache.overlay_cache[i];
++ mc = &dss_cache.manager_cache[oc->channel];
+
+- if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC))
++ if (!oc->dirty)
+ continue;
+
+- if (!overlay_enabled(ovl)) {
+- dispc_enable_plane(ovl->id, 0);
++ if (oc->manual_update && !mc->do_manual_update)
++ continue;
++
++ if (mgr_busy[oc->channel]) {
++ busy = true;
+ continue;
+ }
+
+- dssdev = ovl->manager->device;
++ r = configure_overlay(i);
++ if (r)
++ DSSERR("configure_overlay %d failed\n", i);
+
+- if (dss_check_overlay(ovl, dssdev)) {
+- dispc_enable_plane(ovl->id, 0);
++ oc->dirty = false;
++ oc->shadow_dirty = true;
++ mgr_go[oc->channel] = true;
++ }
++
++ /* Commit manager settings */
++ for (i = 0; i < num_mgrs; ++i) {
++ mc = &dss_cache.manager_cache[i];
++
++ if (!mc->dirty)
++ continue;
++
++ if (mc->manual_update && !mc->do_manual_update)
++ continue;
++
++ if (mgr_busy[i]) {
++ busy = true;
+ continue;
+ }
+
+- ++num_planes_enabled;
++ configure_manager(i);
++ mc->dirty = false;
++ mc->shadow_dirty = true;
++ mgr_go[i] = true;
++ }
+
+- /* On a manual update display, in manual update mode, update()
+- * handles configuring planes */
+- mode = OMAP_DSS_UPDATE_AUTO;
+- if (dssdev->get_update_mode)
+- mode = dssdev->get_update_mode(dssdev);
++ /* set GO */
++ for (i = 0; i < num_mgrs; ++i) {
++ mc = &dss_cache.manager_cache[i];
+
+- if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
+- mode != OMAP_DSS_UPDATE_AUTO)
++ if (!mgr_go[i])
+ continue;
+
+- ilace = dssdev->type == OMAP_DISPLAY_TYPE_VENC;
++ /* We don't need GO with manual update display. LCD iface will
++ * always be turned off after frame, and new settings will be
++ * taken in to use at next update */
++ if (!mc->manual_upd_display)
++ dispc_go(i);
++ }
++
++ if (busy)
++ r = 1;
++ else
++ r = 0;
++
++ return r;
++}
+
+- if (ovl->info.out_width == 0)
+- outw = ovl->info.width;
++/* Configure dispc for partial update. Return possibly modified update
++ * area */
++void dss_setup_partial_planes(struct omap_dss_device *dssdev,
++ u16 *xi, u16 *yi, u16 *wi, u16 *hi)
++{
++ struct overlay_cache_data *oc;
++ struct manager_cache_data *mc;
++ const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
++ struct omap_overlay_manager *mgr;
++ int i;
++ u16 x, y, w, h;
++ unsigned long flags;
++
++ x = *xi;
++ y = *yi;
++ w = *wi;
++ h = *hi;
++
++ DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n",
++ *xi, *yi, *wi, *hi);
++
++ mgr = dssdev->manager;
++
++ if (!mgr) {
++ DSSDBG("no manager\n");
++ return;
++ }
++
++ spin_lock_irqsave(&dss_cache.lock, flags);
++
++ /* We need to show the whole overlay if it is scaled. So look for
++ * those, and make the update area larger if found.
++ * Also mark the overlay cache dirty */
++ for (i = 0; i < num_ovls; ++i) {
++ unsigned x1, y1, x2, y2;
++ unsigned outw, outh;
++
++ oc = &dss_cache.overlay_cache[i];
++
++ if (oc->channel != mgr->id)
++ continue;
++
++ oc->dirty = true;
++
++ if (!oc->enabled)
++ continue;
++
++ if (!dispc_is_overlay_scaled(oc))
++ continue;
++
++ outw = oc->out_width == 0 ? oc->width : oc->out_width;
++ outh = oc->out_height == 0 ? oc->height : oc->out_height;
++
++ /* is the overlay outside the update region? */
++ if (!rectangle_intersects(x, y, w, h,
++ oc->pos_x, oc->pos_y,
++ outw, outh))
++ continue;
++
++ /* if the overlay totally inside the update region? */
++ if (rectangle_subset(oc->pos_x, oc->pos_y, outw, outh,
++ x, y, w, h))
++ continue;
++
++ if (x > oc->pos_x)
++ x1 = oc->pos_x;
+ else
+- outw = ovl->info.out_width;
++ x1 = x;
+
+- if (ovl->info.out_height == 0)
+- outh = ovl->info.height;
++ if (y > oc->pos_y)
++ y1 = oc->pos_y;
+ else
+- outh = ovl->info.out_height;
+-
+- r = dispc_setup_plane(ovl->id, ovl->manager->id,
+- ovl->info.paddr,
+- ovl->info.screen_width,
+- ovl->info.pos_x,
+- ovl->info.pos_y,
+- ovl->info.width,
+- ovl->info.height,
+- outw,
+- outh,
+- ovl->info.color_mode,
+- ilace,
+- ovl->info.rotation_type,
+- ovl->info.rotation,
+- ovl->info.mirror,
+- ovl->info.global_alpha);
++ y1 = y;
+
+- if (r) {
+- DSSERR("dispc_setup_plane failed for ovl %d\n",
+- ovl->id);
+- dispc_enable_plane(ovl->id, 0);
+- continue;
+- }
++ if ((x + w) < (oc->pos_x + outw))
++ x2 = oc->pos_x + outw;
++ else
++ x2 = x + w;
+
+- if (dss_use_replication(dssdev, ovl->info.color_mode))
+- dispc_enable_replication(ovl->id, true);
++ if ((y + h) < (oc->pos_y + outh))
++ y2 = oc->pos_y + outh;
+ else
+- dispc_enable_replication(ovl->id, false);
++ y2 = y + h;
++
++ x = x1;
++ y = y1;
++ w = x2 - x1;
++ h = y2 - y1;
++
++ DSSDBG("changing upd area due to ovl(%d) scaling %d,%d %dx%d\n",
++ i, x, y, w, h);
++ }
++
++ mc = &dss_cache.manager_cache[mgr->id];
++ mc->do_manual_update = true;
++ mc->x = x;
++ mc->y = y;
++ mc->w = w;
++ mc->h = h;
++
++ configure_dispc();
++
++ mc->do_manual_update = false;
++
++ spin_unlock_irqrestore(&dss_cache.lock, flags);
++
++ *xi = x;
++ *yi = y;
++ *wi = w;
++ *hi = h;
++}
++
++void dss_start_update(struct omap_dss_device *dssdev)
++{
++ struct manager_cache_data *mc;
++ struct overlay_cache_data *oc;
++ const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
++ const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
++ struct omap_overlay_manager *mgr;
++ int i;
++
++ mgr = dssdev->manager;
++
++ for (i = 0; i < num_ovls; ++i) {
++ oc = &dss_cache.overlay_cache[i];
++ if (oc->channel != mgr->id)
++ continue;
++
++ oc->shadow_dirty = false;
++ }
++
++ for (i = 0; i < num_mgrs; ++i) {
++ mc = &dss_cache.manager_cache[i];
++ if (mgr->id != i)
++ continue;
++
++ mc->shadow_dirty = false;
++ }
++
++ dispc_enable_lcd_out(1);
++}
++
++static void dss_apply_irq_handler(void *data, u32 mask)
++{
++ struct manager_cache_data *mc;
++ struct overlay_cache_data *oc;
++ const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
++ const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
++ int i, r;
++ bool mgr_busy[2];
++
++ mgr_busy[0] = dispc_go_busy(0);
++ mgr_busy[1] = dispc_go_busy(1);
++
++ spin_lock(&dss_cache.lock);
++
++ for (i = 0; i < num_ovls; ++i) {
++ oc = &dss_cache.overlay_cache[i];
++ if (!mgr_busy[oc->channel])
++ oc->shadow_dirty = false;
++ }
++
++ for (i = 0; i < num_mgrs; ++i) {
++ mc = &dss_cache.manager_cache[i];
++ if (!mgr_busy[i])
++ mc->shadow_dirty = false;
++ }
++
++ r = configure_dispc();
++ if (r == 1)
++ goto end;
++
++ /* re-read busy flags */
++ mgr_busy[0] = dispc_go_busy(0);
++ mgr_busy[1] = dispc_go_busy(1);
+
+- dispc_enable_plane(ovl->id, 1);
++ /* keep running as long as there are busy managers, so that
++ * we can collect overlay-applied information */
++ for (i = 0; i < num_mgrs; ++i) {
++ if (mgr_busy[i])
++ goto end;
+ }
+
+- /* Enable fifo merge if possible */
+- dispc_enable_fifomerge(num_planes_enabled == 1);
++ omap_dispc_unregister_isr(dss_apply_irq_handler, NULL,
++ DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
++ DISPC_IRQ_EVSYNC_EVEN);
++ dss_cache.irq_enabled = false;
++
++end:
++ spin_unlock(&dss_cache.lock);
++}
++
++static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
++{
++ struct overlay_cache_data *oc;
++ struct manager_cache_data *mc;
++ int i;
++ struct omap_overlay *ovl;
++ int num_planes_enabled = 0;
++ bool use_fifomerge;
++ unsigned long flags;
++ int r;
+
+- /* Go through overlays again. This time we configure fifos. We have to
+- * do this after enabling/disabling fifomerge so that we have correct
+- * knowledge of fifo sizes */
++ DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
++
++ spin_lock_irqsave(&dss_cache.lock, flags);
++
++ /* Configure overlays */
+ for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
++ struct omap_dss_device *dssdev;
++
+ ovl = omap_dss_get_overlay(i);
+
+ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC))
+ continue;
+
+- if (!overlay_enabled(ovl))
++ oc = &dss_cache.overlay_cache[ovl->id];
++
++ if (!overlay_enabled(ovl)) {
++ if (oc->enabled) {
++ oc->enabled = false;
++ oc->dirty = true;
++ }
++ continue;
++ }
++
++ if (!ovl->info_dirty) {
++ if (oc->enabled)
++ ++num_planes_enabled;
++ continue;
++ }
++
++ dssdev = ovl->manager->device;
++
++ if (dss_check_overlay(ovl, dssdev)) {
++ if (oc->enabled) {
++ oc->enabled = false;
++ oc->dirty = true;
++ }
+ continue;
++ }
++
++ ovl->info_dirty = false;
++ oc->dirty = true;
++
++ oc->paddr = ovl->info.paddr;
++ oc->vaddr = ovl->info.vaddr;
++ oc->screen_width = ovl->info.screen_width;
++ oc->width = ovl->info.width;
++ oc->height = ovl->info.height;
++ oc->color_mode = ovl->info.color_mode;
++ oc->rotation = ovl->info.rotation;
++ oc->rotation_type = ovl->info.rotation_type;
++ oc->mirror = ovl->info.mirror;
++ oc->pos_x = ovl->info.pos_x;
++ oc->pos_y = ovl->info.pos_y;
++ oc->out_width = ovl->info.out_width;
++ oc->out_height = ovl->info.out_height;
++ oc->global_alpha = ovl->info.global_alpha;
+
+- ovl->manager->device->configure_overlay(ovl);
++ oc->replication =
++ dss_use_replication(dssdev, ovl->info.color_mode);
++
++ oc->ilace = dssdev->type == OMAP_DISPLAY_TYPE_VENC;
++
++ oc->channel = ovl->manager->id;
++
++ oc->enabled = true;
++
++ oc->manual_update =
++ dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
++ dssdev->get_update_mode(dssdev) != OMAP_DSS_UPDATE_AUTO;
++
++ ++num_planes_enabled;
+ }
+
+- /* Configure managers, and issue GO */
++ /* Configure managers */
+ list_for_each_entry(mgr, &manager_list, list) {
++ struct omap_dss_device *dssdev;
++
+ if (!(mgr->caps & OMAP_DSS_OVL_MGR_CAP_DISPC))
+ continue;
+
++ mc = &dss_cache.manager_cache[mgr->id];
++
++ if (mgr->device_changed) {
++ mgr->device_changed = false;
++ mgr->info_dirty = true;
++ }
++
++ if (!mgr->info_dirty)
++ continue;
++
++ if (!mgr->device)
++ continue;
++
+ dssdev = mgr->device;
+
+- if (!dssdev)
++ mgr->info_dirty = false;
++ mc->dirty = true;
++
++ mc->default_color = mgr->info.default_color;
++ mc->trans_key_type = mgr->info.trans_key_type;
++ mc->trans_key = mgr->info.trans_key;
++ mc->trans_enabled = mgr->info.trans_enabled;
++ mc->alpha_enabled = mgr->info.alpha_enabled;
++
++ mc->manual_upd_display =
++ dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
++
++ mc->manual_update =
++ dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
++ dssdev->get_update_mode(dssdev) != OMAP_DSS_UPDATE_AUTO;
++ }
++
++ /* XXX TODO: Try to get fifomerge working. The problem is that it
++ * affects both managers, not individually but at the same time. This
++ * means the change has to be well synchronized. I guess the proper way
++ * is to have a two step process for fifo merge:
++ * fifomerge enable:
++ * 1. disable other planes, leaving one plane enabled
++ * 2. wait until the planes are disabled on HW
++ * 3. config merged fifo thresholds, enable fifomerge
++ * fifomerge disable:
++ * 1. config unmerged fifo thresholds, disable fifomerge
++ * 2. wait until fifo changes are in HW
++ * 3. enable planes
++ */
++ use_fifomerge = false;
++
++ /* Configure overlay fifos */
++ for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
++ struct omap_dss_device *dssdev;
++ u32 size;
++
++ ovl = omap_dss_get_overlay(i);
++
++ if (!(ovl->caps & OMAP_DSS_OVL_CAP_DISPC))
+ continue;
+
+- dispc_set_trans_key(mgr->id, mgr->info.trans_key_type,
+- mgr->info.trans_key);
+- dispc_enable_trans_key(mgr->id, mgr->info.trans_enabled);
+- dispc_enable_alpha_blending(mgr->id, mgr->info.alpha_enabled);
++ oc = &dss_cache.overlay_cache[ovl->id];
+
+- /* We don't need GO with manual update display. LCD iface will
+- * always be turned off after frame, and new settings will
+- * be taken in to use at next update */
+- if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
++ if (!oc->enabled)
+ continue;
+
+- dispc_go(mgr->id);
++ dssdev = ovl->manager->device;
++
++ size = dispc_get_plane_fifo_size(ovl->id);
++ if (use_fifomerge)
++ size *= 3;
++
++ switch (dssdev->type) {
++ case OMAP_DISPLAY_TYPE_DPI:
++ case OMAP_DISPLAY_TYPE_DBI:
++ case OMAP_DISPLAY_TYPE_SDI:
++ case OMAP_DISPLAY_TYPE_VENC:
++ default_get_overlay_fifo_thresholds(ovl->id, size,
++ &oc->burst_size, &oc->fifo_low,
++ &oc->fifo_high);
++ break;
++#ifdef CONFIG_OMAP2_DSS_DSI
++ case OMAP_DISPLAY_TYPE_DSI:
++ dsi_get_overlay_fifo_thresholds(ovl->id, size,
++ &oc->burst_size, &oc->fifo_low,
++ &oc->fifo_high);
++ break;
++#endif
++ default:
++ BUG();
++ }
+ }
+
++ r = 0;
++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
++ if (!dss_cache.irq_enabled) {
++ r = omap_dispc_register_isr(dss_apply_irq_handler, NULL,
++ DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
++ DISPC_IRQ_EVSYNC_EVEN);
++ dss_cache.irq_enabled = true;
++ }
++ configure_dispc();
+ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
+
+- return ret;
++ spin_unlock_irqrestore(&dss_cache.lock, flags);
++
++ return r;
+ }
+
+ static int dss_check_manager(struct omap_overlay_manager *mgr)
+@@ -569,6 +1333,8 @@ static int omap_dss_mgr_set_info(struct omap_overlay_manager *mgr,
+ return r;
+ }
+
++ mgr->info_dirty = true;
++
+ return 0;
+ }
+
+@@ -588,6 +1354,8 @@ int dss_init_overlay_managers(struct platform_device *pdev)
+ {
+ int i, r;
+
++ spin_lock_init(&dss_cache.lock);
++
+ INIT_LIST_HEAD(&manager_list);
+
+ num_managers = 0;
+@@ -618,6 +1386,7 @@ int dss_init_overlay_managers(struct platform_device *pdev)
+ mgr->apply = &omap_dss_mgr_apply;
+ mgr->set_manager_info = &omap_dss_mgr_set_info;
+ mgr->get_manager_info = &omap_dss_mgr_get_info;
++ mgr->wait_for_go = &dss_mgr_wait_for_go;
+
+ mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC;
+
+diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
+index 9f883aa..3652106 100644
+--- a/drivers/video/omap2/dss/overlay.c
++++ b/drivers/video/omap2/dss/overlay.c
+@@ -52,6 +52,7 @@ static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
+ {
+ int i, r;
+ struct omap_overlay_manager *mgr = NULL;
++ struct omap_overlay_manager *old_mgr;
+ int len = size;
+
+ if (buf[size-1] == '\n')
+@@ -74,27 +75,32 @@ static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
+ if (mgr)
+ DSSDBG("manager %s found\n", mgr->name);
+
+- if (mgr != ovl->manager) {
+- /* detach old manager */
+- if (ovl->manager) {
+- r = ovl->unset_manager(ovl);
+- if (r) {
+- DSSERR("detach failed\n");
+- return r;
+- }
+- }
++ if (mgr == ovl->manager)
++ return size;
+
+- if (mgr) {
+- r = ovl->set_manager(ovl, mgr);
+- if (r) {
+- DSSERR("Failed to attach overlay\n");
+- return r;
+- }
++ old_mgr = ovl->manager;
++
++ /* detach old manager */
++ if (old_mgr) {
++ r = ovl->unset_manager(ovl);
++ if (r) {
++ DSSERR("detach failed\n");
++ return r;
+ }
++
++ r = old_mgr->apply(old_mgr);
++ if (r)
++ return r;
+ }
+
+- if (ovl->manager) {
+- r = ovl->manager->apply(ovl->manager);
++ if (mgr) {
++ r = ovl->set_manager(ovl, mgr);
++ if (r) {
++ DSSERR("Failed to attach overlay\n");
++ return r;
++ }
++
++ r = mgr->apply(mgr);
+ if (r)
+ return r;
+ }
+@@ -403,6 +409,8 @@ static int dss_ovl_set_overlay_info(struct omap_overlay *ovl,
+ }
+ }
+
++ ovl->info_dirty = true;
++
+ return 0;
+ }
+
+@@ -412,22 +420,40 @@ static void dss_ovl_get_overlay_info(struct omap_overlay *ovl,
+ *info = ovl->info;
+ }
+
++static int dss_ovl_wait_for_go(struct omap_overlay *ovl)
++{
++ return dss_mgr_wait_for_go_ovl(ovl);
++}
++
+ static int omap_dss_set_manager(struct omap_overlay *ovl,
+ struct omap_overlay_manager *mgr)
+ {
+ int r;
+
++ if (!mgr)
++ return -EINVAL;
++
+ if (ovl->manager) {
+ DSSERR("overlay '%s' already has a manager '%s'\n",
+ ovl->name, ovl->manager->name);
++ return -EINVAL;
+ }
+
+- r = dss_check_overlay(ovl, mgr->device);
++ r = ovl->wait_for_go(ovl);
+ if (r)
+ return r;
+
++ if (ovl->info.enabled) {
++ DSSERR("overlay has to be disabled to change the manager\n");
++ return -EINVAL;
++ }
++
+ ovl->manager = mgr;
+
++ dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
++ dispc_set_channel_out(ovl->id, mgr->id);
++ dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
++
+ return 0;
+ }
+
+@@ -439,6 +465,7 @@ static int omap_dss_unset_manager(struct omap_overlay *ovl)
+ }
+
+ ovl->manager = NULL;
++ /* XXX disable overlay? */
+
+ return 0;
+ }
+@@ -530,6 +557,7 @@ void dss_init_overlays(struct platform_device *pdev)
+ ovl->unset_manager = &omap_dss_unset_manager;
+ ovl->set_overlay_info = &dss_ovl_set_overlay_info;
+ ovl->get_overlay_info = &dss_ovl_get_overlay_info;
++ ovl->wait_for_go = &dss_ovl_wait_for_go;
+
+ omap_dss_add_overlay(ovl);
+
+diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
+index 96602ae..9dd2349 100644
+--- a/drivers/video/omap2/dss/rfbi.c
++++ b/drivers/video/omap2/dss/rfbi.c
+@@ -972,7 +972,7 @@ static int do_update(struct omap_dss_device *dssdev, struct update_region *upd)
+
+ if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
+ /*dssdev->driver->enable_te(dssdev, 1); */
+- dispc_setup_partial_planes(dssdev, &x, &y, &w, &h);
++ dss_setup_partial_planes(dssdev, &x, &y, &w, &h);
+ }
+
+ #ifdef MEASURE_PERF
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index d8a83b2..a9a5a8c 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -711,6 +711,15 @@ static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
+ return 0;
+ }
+
++static enum omap_dss_update_mode venc_display_get_update_mode(
++ struct omap_dss_device *dssdev)
++{
++ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
++ return OMAP_DSS_UPDATE_AUTO;
++ else
++ return OMAP_DSS_UPDATE_DISABLED;
++}
++
+ int venc_init_display(struct omap_dss_device *dssdev)
+ {
+ DSSDBG("init_display\n");
+@@ -724,6 +733,7 @@ int venc_init_display(struct omap_dss_device *dssdev)
+ dssdev->check_timings = venc_check_timings;
+ dssdev->get_wss = venc_get_wss;
+ dssdev->set_wss = venc_set_wss;
++ dssdev->get_update_mode = venc_display_get_update_mode;
+
+ return 0;
+ }
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 91308c2..257f7cb 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -442,6 +442,22 @@ static int omapfb_get_ovl_colormode(struct omapfb2_device *fbdev,
+ return 0;
+ }
+
++static int omapfb_wait_for_go(struct fb_info *fbi)
++{
++ struct omapfb_info *ofbi = FB2OFB(fbi);
++ int r = 0;
++ int i;
++
++ for (i = 0; i < ofbi->num_overlays; ++i) {
++ struct omap_overlay *ovl = ofbi->overlays[i];
++ r = ovl->wait_for_go(ovl);
++ if (r)
++ break;
++ }
++
++ return r;
++}
++
+ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ {
+ struct omapfb_info *ofbi = FB2OFB(fbi);
+@@ -624,6 +640,16 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ r = display->wait_vsync(display);
+ break;
+
++ case OMAPFB_WAITFORGO:
++ DBG("ioctl WAITFORGO\n");
++ if (!display) {
++ r = -EINVAL;
++ break;
++ }
++
++ r = omapfb_wait_for_go(fbi);
++ break;
++
+ /* LCD and CTRL tests do the same thing for backward
+ * compatibility */
+ case OMAPFB_LCD_TEST:
+diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h
+index fd522d3..5014d2e 100644
+--- a/include/linux/omapfb.h
++++ b/include/linux/omapfb.h
+@@ -55,6 +55,7 @@
+ #define OMAPFB_WAITFORVSYNC OMAP_IO(57)
+ #define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read)
+ #define OMAPFB_GET_OVERLAY_COLORMODE OMAP_IOR(59, struct omapfb_ovl_colormode)
++#define OMAPFB_WAITFORGO OMAP_IO(60)
+
+ #define OMAPFB_CAPS_GENERIC_MASK 0x00000fff
+ #define OMAPFB_CAPS_LCDC_MASK 0x00fff000
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0121-DSS2-VRFB-clean-up-BUG-calls.patch b/recipes/linux/linux-omap-pm/dss2/0121-DSS2-VRFB-clean-up-BUG-calls.patch
new file mode 100644
index 0000000000..fe988632be
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0121-DSS2-VRFB-clean-up-BUG-calls.patch
@@ -0,0 +1,70 @@
+From 1011922e3dd0c5f0f375fef28caa7222f68d4601 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 16 Jun 2009 17:14:03 +0300
+Subject: [PATCH 121/146] DSS2: VRFB: clean up BUG() calls
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/vrfb.c | 25 ++++++++++---------------
+ 1 files changed, 10 insertions(+), 15 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 7cd7c61..201640a 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -121,7 +121,6 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
+
+ default:
+ BUG();
+- return;
+ }
+
+ if (color_mode == OMAP_DSS_COLOR_YUV2 ||
+@@ -176,10 +175,8 @@ void omap_vrfb_release_ctx(struct vrfb *vrfb)
+
+ mutex_lock(&ctx_lock);
+
+- if (!(ctx_map & (1 << ctx))) {
+- BUG();
+- return;
+- }
++ BUG_ON(!(ctx_map & (1 << ctx)));
++
+ clear_bit(ctx, &ctx_map_active);
+ clear_bit(ctx, &ctx_map);
+
+@@ -254,11 +251,10 @@ void omap_vrfb_suspend_ctx(struct vrfb *vrfb)
+ {
+ DBG("suspend ctx %d\n", vrfb->context);
+ mutex_lock(&ctx_lock);
+- if (vrfb->context >= VRFB_NUM_CTXS ||
+- (!(1 << vrfb->context) & ctx_map_active)) {
+- BUG();
+- return;
+- }
++
++ BUG_ON(vrfb->context >= VRFB_NUM_CTXS);
++ BUG_ON(!((1 << vrfb->context) & ctx_map_active));
++
+ clear_bit(vrfb->context, &ctx_map_active);
+ mutex_unlock(&ctx_lock);
+ }
+@@ -268,11 +264,10 @@ void omap_vrfb_resume_ctx(struct vrfb *vrfb)
+ {
+ DBG("resume ctx %d\n", vrfb->context);
+ mutex_lock(&ctx_lock);
+- if (vrfb->context >= VRFB_NUM_CTXS ||
+- ((1 << vrfb->context) & ctx_map_active)) {
+- BUG();
+- return;
+- }
++
++ BUG_ON(vrfb->context >= VRFB_NUM_CTXS);
++ BUG_ON((1 << vrfb->context) & ctx_map_active);
++
+ /*
+ * omap_vrfb_restore_context is normally called by the core domain
+ * save / restore logic, but since this VRFB context was suspended
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0122-DSS2-OMAPFB-don-t-fail-even-if-default-display-doe.patch b/recipes/linux/linux-omap-pm/dss2/0122-DSS2-OMAPFB-don-t-fail-even-if-default-display-doe.patch
new file mode 100644
index 0000000000..1438deac19
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0122-DSS2-OMAPFB-don-t-fail-even-if-default-display-doe.patch
@@ -0,0 +1,139 @@
+From 9abe23c8bc711a0883dfe8fd73371e35f48dddf0 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 23 Jun 2009 11:55:52 +0300
+Subject: [PATCH 122/146] DSS2: OMAPFB: don't fail even if default display doesn't start
+
+This will allow secondary displays to be used even if the
+main display is out of order.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-main.c | 91 ++++++++++++------------------
+ 1 files changed, 37 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index 1473581..b806dc9 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -1994,21 +1994,9 @@ static int omapfb_probe(struct platform_device *pdev)
+ for (i = 0; i < fbdev->num_managers; i++)
+ fbdev->managers[i] = omap_dss_get_overlay_manager(i);
+
+-
+- /* gfx overlay should be the default one. find a display
+- * connected to that, and use it as default display */
+- ovl = omap_dss_get_overlay(0);
+- if (ovl->manager && ovl->manager->device) {
+- def_display = ovl->manager->device;
+- } else {
+- dev_err(&pdev->dev, "cannot find default display\n");
+- r = -EINVAL;
+- goto cleanup;
+- }
+-
+ if (def_mode && strlen(def_mode) > 0) {
+ if (omapfb_parse_def_modes(fbdev))
+- dev_err(&pdev->dev, "cannot parse default modes\n");
++ dev_warn(&pdev->dev, "cannot parse default modes\n");
+ }
+
+ r = omapfb_create_framebuffers(fbdev);
+@@ -2019,59 +2007,54 @@ static int omapfb_probe(struct platform_device *pdev)
+ struct omap_overlay_manager *mgr;
+ mgr = fbdev->managers[i];
+ r = mgr->apply(mgr);
+- if (r) {
+- dev_err(fbdev->dev, "failed to apply dispc config\n");
+- goto cleanup;
+- }
++ if (r)
++ dev_warn(fbdev->dev, "failed to apply dispc config\n");
+ }
+
+ DBG("mgr->apply'ed\n");
+
+- r = def_display->enable(def_display);
+- if (r) {
+- dev_err(fbdev->dev, "Failed to enable display '%s'\n",
+- def_display->name);
+- goto cleanup;
+- }
+-
+- /* set the update mode */
+- if (def_display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
+-#ifdef CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE
+- if (def_display->enable_te)
+- def_display->enable_te(def_display, 1);
+- if (def_display->set_update_mode)
+- def_display->set_update_mode(def_display,
+- OMAP_DSS_UPDATE_AUTO);
+-#else
+- if (def_display->enable_te)
+- def_display->enable_te(def_display, 0);
+- if (def_display->set_update_mode)
+- def_display->set_update_mode(def_display,
+- OMAP_DSS_UPDATE_MANUAL);
+-#endif
++ /* gfx overlay should be the default one. find a display
++ * connected to that, and use it as default display */
++ ovl = omap_dss_get_overlay(0);
++ if (ovl->manager && ovl->manager->device) {
++ def_display = ovl->manager->device;
+ } else {
+- if (def_display->set_update_mode)
+- def_display->set_update_mode(def_display,
+- OMAP_DSS_UPDATE_AUTO);
++ dev_warn(&pdev->dev, "cannot find default display\n");
++ def_display = NULL;
+ }
+
+- for (i = 0; i < fbdev->num_displays; i++) {
+- struct omap_dss_device *display = fbdev->displays[i];
++ if (def_display) {
+ u16 w, h;
++ r = def_display->enable(def_display);
++ if (r)
++ dev_warn(fbdev->dev, "Failed to enable display '%s'\n",
++ def_display->name);
+
+- if (!display->get_update_mode || !display->update)
+- continue;
+-
+- if (display->get_update_mode(display) ==
+- OMAP_DSS_UPDATE_MANUAL) {
+-
+- display->get_resolution(display, &w, &h);
+- display->update(display, 0, 0, w, h);
++ /* set the update mode */
++ if (def_display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
++#ifdef CONFIG_FB_OMAP2_FORCE_AUTO_UPDATE
++ if (def_display->enable_te)
++ def_display->enable_te(def_display, 1);
++ if (def_display->set_update_mode)
++ def_display->set_update_mode(def_display,
++ OMAP_DSS_UPDATE_AUTO);
++#else /* MANUAL_UPDATE */
++ if (def_display->enable_te)
++ def_display->enable_te(def_display, 0);
++ if (def_display->set_update_mode)
++ def_display->set_update_mode(def_display,
++ OMAP_DSS_UPDATE_MANUAL);
++
++ def_display->get_resolution(def_display, &w, &h);
++ def_display->update(def_display, 0, 0, w, h);
++#endif
++ } else {
++ if (def_display->set_update_mode)
++ def_display->set_update_mode(def_display,
++ OMAP_DSS_UPDATE_AUTO);
+ }
+ }
+
+- DBG("display->updated\n");
+-
+ return 0;
+
+ cleanup:
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0123-DSS2-DSI-Fix-external-TE-wait.patch b/recipes/linux/linux-omap-pm/dss2/0123-DSS2-DSI-Fix-external-TE-wait.patch
new file mode 100644
index 0000000000..1860c63160
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0123-DSS2-DSI-Fix-external-TE-wait.patch
@@ -0,0 +1,41 @@
+From 063a0c3e0e45a9de3d12811885463565655cbfde Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 26 Jun 2009 11:53:21 +0300
+Subject: [PATCH 123/146] DSS2: DSI: Fix external TE wait
+
+---
+ arch/arm/plat-omap/include/mach/display.h | 1 -
+ drivers/video/omap2/dss/dsi.c | 5 +++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index be07c35..92603eb 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -453,7 +453,6 @@ struct omap_dss_device {
+
+ int (*enable_te)(struct omap_dss_device *dssdev, bool enable);
+ int (*get_te)(struct omap_dss_device *dssdev);
+- int (*wait_for_te)(struct omap_dss_device *dssdev);
+
+ u8 (*get_rotate)(struct omap_dss_device *dssdev);
+ int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate);
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 875be0c..f3553f8 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -2775,8 +2775,9 @@ static int dsi_update_thread(void *data)
+ device->driver->setup_update(device, x, y, w, h);
+ #endif
+
+- if (dsi.te_enabled && dsi.use_ext_te && device->wait_for_te)
+- device->wait_for_te(device);
++ if (dsi.te_enabled && dsi.use_ext_te &&
++ device->driver->wait_for_te)
++ device->driver->wait_for_te(device);
+
+ dsi_perf_mark_start();
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0124-DSS2-DSI-Increase-framedone-timeout-to-1s.patch b/recipes/linux/linux-omap-pm/dss2/0124-DSS2-DSI-Increase-framedone-timeout-to-1s.patch
new file mode 100644
index 0000000000..99e76dfc9e
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0124-DSS2-DSI-Increase-framedone-timeout-to-1s.patch
@@ -0,0 +1,28 @@
+From 57da7b3252f9cbcf8ba536a6bde7a92937b5d7c8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 26 Jun 2009 14:50:47 +0300
+Subject: [PATCH 124/146] DSS2: DSI: Increase framedone timeout to 1s
+
+It seems that with heavy CPU load it may take more time
+until the work thread wakes up. I was unable to increase
+the priority so that the thread would wake up earlier.
+---
+ drivers/video/omap2/dss/dsi.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index f3553f8..97a67e5 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -2785,7 +2785,7 @@ static int dsi_update_thread(void *data)
+ dsi_update_screen_dispc(device, x, y, w, h);
+
+ /* wait for framedone */
+- timeout = msecs_to_jiffies(500);
++ timeout = msecs_to_jiffies(1000);
+ timeout = wait_event_timeout(dsi.waitqueue,
+ dsi.framedone_received == true,
+ timeout);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0125-DSS2-VRAM-Add-function-to-get-free-vram-info.patch b/recipes/linux/linux-omap-pm/dss2/0125-DSS2-VRAM-Add-function-to-get-free-vram-info.patch
new file mode 100644
index 0000000000..d3d62ce7a2
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0125-DSS2-VRAM-Add-function-to-get-free-vram-info.patch
@@ -0,0 +1,76 @@
+From 0d16c11a3df3e09cb8ba20883174f600ac3611b5 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 24 Jun 2009 14:55:54 +0300
+Subject: [PATCH 125/146] DSS2: VRAM: Add function to get free vram info
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vram.h | 2 +
+ arch/arm/plat-omap/vram.c | 38 ++++++++++++++++++++++++++++++++
+ 2 files changed, 40 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index 8639e08..494ddde 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -28,6 +28,8 @@ extern int omap_vram_add_region(unsigned long paddr, size_t size);
+ extern int omap_vram_free(unsigned long paddr, size_t size);
+ extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr);
+ extern int omap_vram_reserve(unsigned long paddr, size_t size);
++extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram,
++ unsigned long *largest_free_block);
+ extern void omap2_set_sdram_vram(u32 size, u32 start);
+ extern void omap2_set_sram_vram(u32 size, u32 start);
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index f3ce849..d4a8110 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -398,6 +398,44 @@ int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr)
+ }
+ EXPORT_SYMBOL(omap_vram_alloc);
+
++void omap_vram_get_info(unsigned long *vram,
++ unsigned long *free_vram,
++ unsigned long *largest_free_block)
++{
++ struct vram_region *vr;
++ struct vram_alloc *va;
++
++ *vram = 0;
++ *free_vram = 0;
++ *largest_free_block = 0;
++
++ mutex_lock(&region_mutex);
++
++ list_for_each_entry(vr, &region_list, list) {
++ unsigned free;
++ unsigned long pa;
++
++ pa = vr->paddr;
++ *vram += vr->pages << PAGE_SHIFT;
++
++ list_for_each_entry(va, &vr->alloc_list, list) {
++ free = va->paddr - pa;
++ *free_vram += free;
++ if (free > *largest_free_block)
++ *largest_free_block = free;
++ pa = va->paddr + (va->pages << PAGE_SHIFT);
++ }
++
++ free = vr->paddr + (vr->pages << PAGE_SHIFT) - pa;
++ *free_vram += free;
++ if (free > *largest_free_block)
++ *largest_free_block = free;
++ }
++
++ mutex_unlock(&region_mutex);
++}
++EXPORT_SYMBOL(omap_vram_get_info);
++
+ #if defined(CONFIG_DEBUG_FS)
+ static int vram_debug_show(struct seq_file *s, void *unused)
+ {
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0126-DSS2-OMAPFB-implement-OMAPFB_GET_VRAM_INFO-ioctl.patch b/recipes/linux/linux-omap-pm/dss2/0126-DSS2-OMAPFB-implement-OMAPFB_GET_VRAM_INFO-ioctl.patch
new file mode 100644
index 0000000000..287a82cb81
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0126-DSS2-OMAPFB-implement-OMAPFB_GET_VRAM_INFO-ioctl.patch
@@ -0,0 +1,86 @@
+From fbc4a50eafe5d5023ef1c0a32d362c2166946164 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 24 Jun 2009 14:56:29 +0300
+Subject: [PATCH 126/146] DSS2: OMAPFB: implement OMAPFB_GET_VRAM_INFO ioctl
+
+This ioctl can be used to guess how big buffers it is possible to
+reserve.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/omapfb/omapfb-ioctl.c | 18 ++++++++++++++++++
+ include/linux/omapfb.h | 8 ++++++++
+ 2 files changed, 26 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+index 257f7cb..70fb64e 100644
+--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
++++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
+@@ -30,6 +30,7 @@
+
+ #include <mach/display.h>
+ #include <mach/vrfb.h>
++#include <mach/vram.h>
+
+ #include "omapfb.h"
+
+@@ -475,6 +476,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+ enum omapfb_update_mode update_mode;
+ int test_num;
+ struct omapfb_memory_read memory_read;
++ struct omapfb_vram_info vram_info;
+ } p;
+
+ int r = 0;
+@@ -695,6 +697,22 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
+
+ break;
+
++ case OMAPFB_GET_VRAM_INFO: {
++ unsigned long vram, free, largest;
++
++ DBG("ioctl GET_VRAM_INFO\n");
++
++ omap_vram_get_info(&vram, &free, &largest);
++ p.vram_info.total = vram;
++ p.vram_info.free = free;
++ p.vram_info.largest_free_block = largest;
++
++ if (copy_to_user((void __user *)arg, &p.vram_info,
++ sizeof(p.vram_info)))
++ r = -EFAULT;
++ break;
++ }
++
+ default:
+ dev_err(fbdev->dev, "Unknown ioctl 0x%x\n", cmd);
+ r = -EINVAL;
+diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h
+index 5014d2e..0df0df9 100644
+--- a/include/linux/omapfb.h
++++ b/include/linux/omapfb.h
+@@ -56,6 +56,7 @@
+ #define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read)
+ #define OMAPFB_GET_OVERLAY_COLORMODE OMAP_IOR(59, struct omapfb_ovl_colormode)
+ #define OMAPFB_WAITFORGO OMAP_IO(60)
++#define OMAPFB_GET_VRAM_INFO OMAP_IOR(61, struct omapfb_vram_info)
+
+ #define OMAPFB_CAPS_GENERIC_MASK 0x00000fff
+ #define OMAPFB_CAPS_LCDC_MASK 0x00fff000
+@@ -194,6 +195,13 @@ struct omapfb_ovl_colormode {
+ struct fb_bitfield transp;
+ };
+
++struct omapfb_vram_info {
++ __u32 total;
++ __u32 free;
++ __u32 largest_free_block;
++ __u32 reserved[5];
++};
++
+ #ifdef __KERNEL__
+
+ #include <linux/completion.h>
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0127-DSS2-DSI-increase-dsi-thread-priority.patch b/recipes/linux/linux-omap-pm/dss2/0127-DSS2-DSI-increase-dsi-thread-priority.patch
new file mode 100644
index 0000000000..213b846c85
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0127-DSS2-DSI-increase-dsi-thread-priority.patch
@@ -0,0 +1,37 @@
+From e847a1241c2707453701d5b680fafbb2ce2ae1d8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 26 Jun 2009 15:22:37 +0300
+Subject: [PATCH 127/146] DSS2: DSI: increase dsi thread priority
+
+This should help keep the framerates up even if there's
+lots of CPU load.
+---
+ drivers/video/omap2/dss/dsi.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 97a67e5..d2c5b94 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -3418,6 +3418,9 @@ int dsi_init_display(struct omap_dss_device *dssdev)
+ int dsi_init(struct platform_device *pdev)
+ {
+ u32 rev;
++ struct sched_param param = {
++ .sched_priority = MAX_USER_RT_PRIO-1
++ };
+
+ spin_lock_init(&dsi.errors_lock);
+ dsi.errors = 0;
+@@ -3432,6 +3435,8 @@ int dsi_init(struct platform_device *pdev)
+ DSSERR("cannot create kthread\n");
+ return PTR_ERR(dsi.thread);
+ }
++ sched_setscheduler(dsi.thread, SCHED_FIFO, &param);
++
+ init_waitqueue_head(&dsi.waitqueue);
+ spin_lock_init(&dsi.update_lock);
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0128-DSS2-DSI-check-bus_lock-in-send_bta.patch b/recipes/linux/linux-omap-pm/dss2/0128-DSS2-DSI-check-bus_lock-in-send_bta.patch
new file mode 100644
index 0000000000..c12c712dbf
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0128-DSS2-DSI-check-bus_lock-in-send_bta.patch
@@ -0,0 +1,28 @@
+From 57cf924ba722d0ef7f48b4a0f8a44a0ddeefc470 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 26 Jun 2009 17:14:25 +0300
+Subject: [PATCH 128/146] DSS2: DSI: check bus_lock in send_bta()
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dsi.c | 4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index d2c5b94..3b15684 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -1786,7 +1786,9 @@ static int dsi_vc_send_bta(int channel)
+ {
+ unsigned long tmo;
+
+- /*DSSDBG("dsi_vc_send_bta_sync %d\n", channel); */
++ DSSDBG("dsi_vc_send_bta %d\n", channel);
++
++ WARN_ON(!mutex_is_locked(&dsi.bus_lock));
+
+ if (REG_GET(DSI_VC_CTRL(channel), 20, 20)) { /* RX_FIFO_NOT_EMPTY */
+ DSSERR("rx fifo not empty when sending BTA, dumping data:\n");
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0129-DSS2-DSI-export-dsi_vc_send_bta_sync.patch b/recipes/linux/linux-omap-pm/dss2/0129-DSS2-DSI-export-dsi_vc_send_bta_sync.patch
new file mode 100644
index 0000000000..8e72043652
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0129-DSS2-DSI-export-dsi_vc_send_bta_sync.patch
@@ -0,0 +1,47 @@
+From b3624e06210fe8f8306f4794a0e1059f25a7e74d Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Mon, 29 Jun 2009 14:38:58 +0300
+Subject: [PATCH 129/146] DSS2: DSI: export dsi_vc_send_bta_sync()
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/display.h | 1 +
+ drivers/video/omap2/dss/dsi.c | 3 ++-
+ 2 files changed, 3 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 92603eb..6df28dc 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -212,6 +212,7 @@ int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len);
+ int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen);
+ int dsi_vc_set_max_rx_packet_size(int channel, u16 len);
+ int dsi_vc_send_null(int channel);
++int dsi_vc_send_bta_sync(int channel);
+
+ /* Board specific data */
+ struct omap_dss_board_info {
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 3b15684..1e18fdf 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -1808,7 +1808,7 @@ static int dsi_vc_send_bta(int channel)
+ return 0;
+ }
+
+-static int dsi_vc_send_bta_sync(int channel)
++int dsi_vc_send_bta_sync(int channel)
+ {
+ int r = 0;
+ u32 err;
+@@ -1839,6 +1839,7 @@ err:
+
+ return r;
+ }
++EXPORT_SYMBOL(dsi_vc_send_bta_sync);
+
+ static inline void dsi_vc_write_long_header(int channel, u8 data_type,
+ u16 len, u8 ecc)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0130-DSS2-DSI-clear-BTA-irq-before-enabling-it.patch b/recipes/linux/linux-omap-pm/dss2/0130-DSS2-DSI-clear-BTA-irq-before-enabling-it.patch
new file mode 100644
index 0000000000..5d0c557150
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0130-DSS2-DSI-clear-BTA-irq-before-enabling-it.patch
@@ -0,0 +1,26 @@
+From 852518e23aafed505a8432a3105d8045bf51a3f2 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 30 Jun 2009 11:39:30 +0300
+Subject: [PATCH 130/146] DSS2: DSI: clear BTA irq before enabling it
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dsi.c | 2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 1e18fdf..45df3f7 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -616,6 +616,8 @@ static void dsi_vc_enable_bta_irq(int channel)
+ {
+ u32 l;
+
++ dsi_write_reg(DSI_VC_IRQSTATUS(channel), DSI_VC_IRQ_BTA);
++
+ l = dsi_read_reg(DSI_VC_IRQENABLE(channel));
+ l |= DSI_VC_IRQ_BTA;
+ dsi_write_reg(DSI_VC_IRQENABLE(channel), l);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0131-DSS2-DSI-check-dsi_set_te-return-value.patch b/recipes/linux/linux-omap-pm/dss2/0131-DSS2-DSI-check-dsi_set_te-return-value.patch
new file mode 100644
index 0000000000..b462d59310
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0131-DSS2-DSI-check-dsi_set_te-return-value.patch
@@ -0,0 +1,62 @@
+From b46425082619fb329b56f7628ee5c196d7301bd3 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 30 Jun 2009 11:43:56 +0300
+Subject: [PATCH 131/146] DSS2: DSI: check dsi_set_te() return value
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dsi.c | 14 ++++++++++----
+ 1 files changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 45df3f7..03cf2d6 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -3003,7 +3003,9 @@ static int dsi_display_enable(struct omap_dss_device *dssdev)
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+ dsi.use_ext_te = dssdev->phy.dsi.ext_te;
+- dsi_set_te(dssdev, dsi.te_enabled);
++ r = dsi_set_te(dssdev, dsi.te_enabled);
++ if (r)
++ goto err3;
+
+ dsi.update_mode = dsi.user_update_mode;
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
+@@ -3116,7 +3118,9 @@ static int dsi_display_resume(struct omap_dss_device *dssdev)
+
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+
+- dsi_set_te(dssdev, dsi.te_enabled);
++ r = dsi_set_te(dssdev, dsi.te_enabled);
++ if (r)
++ goto err2;
+
+ dsi.update_mode = dsi.user_update_mode;
+ if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO)
+@@ -3238,6 +3242,8 @@ static enum omap_dss_update_mode dsi_display_get_update_mode(
+
+ static int dsi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ {
++ int r = 0;
++
+ DSSDBGF("%d", enable);
+
+ if (!dssdev->driver->enable_te)
+@@ -3250,11 +3256,11 @@ static int dsi_display_enable_te(struct omap_dss_device *dssdev, bool enable)
+ if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+ goto end;
+
+- dsi_set_te(dssdev, enable);
++ r = dsi_set_te(dssdev, enable);
+ end:
+ dsi_bus_unlock();
+
+- return 0;
++ return r;
+ }
+
+ static int dsi_display_get_te(struct omap_dss_device *dssdev)
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0132-DSS2-DSI-use-only-1-VC.-Fixes-to-TE.patch b/recipes/linux/linux-omap-pm/dss2/0132-DSS2-DSI-use-only-1-VC.-Fixes-to-TE.patch
new file mode 100644
index 0000000000..c01c2520ec
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0132-DSS2-DSI-use-only-1-VC.-Fixes-to-TE.patch
@@ -0,0 +1,406 @@
+From 29cb3408c094bacd42d8bb17cbafb6f1c57f6cc8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Tue, 30 Jun 2009 11:47:38 +0300
+Subject: [PATCH 132/146] DSS2: DSI: use only 1 VC. Fixes to TE.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ drivers/video/omap2/dss/dsi.c | 197 +++++++++++++++++++++++++---------------
+ 1 files changed, 123 insertions(+), 74 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
+index 03cf2d6..becaf64 100644
+--- a/drivers/video/omap2/dss/dsi.c
++++ b/drivers/video/omap2/dss/dsi.c
+@@ -192,6 +192,11 @@ enum fifo_size {
+ DSI_FIFO_SIZE_128 = 4,
+ };
+
++enum dsi_vc_mode {
++ DSI_VC_MODE_L4 = 0,
++ DSI_VC_MODE_VP,
++};
++
+ struct dsi_update_region {
+ bool dirty;
+ u16 x, y, w, h;
+@@ -210,6 +215,7 @@ static struct
+ struct regulator *vdds_dsi_reg;
+
+ struct {
++ enum dsi_vc_mode mode;
+ struct omap_dss_device *dssdev;
+ enum fifo_size fifo_size;
+ int dest_per; /* destination peripheral 0-3 */
+@@ -1629,14 +1635,36 @@ static void dsi_vc_print_status(int channel)
+ DSSDBG("EMPTINESS %d\n", (r >> (8 * channel)) & 0xff);
+ }
+
+-static void dsi_vc_config(int channel)
++static int dsi_vc_enable(int channel, bool enable)
++{
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO)
++ DSSDBG("dsi_vc_enable channel %d, enable %d\n",
++ channel, enable);
++
++ enable = enable ? 1 : 0;
++
++ REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 0, 0);
++
++ if (wait_for_bit_change(DSI_VC_CTRL(channel), 0, enable) != enable) {
++ DSSERR("Failed to set dsi_vc_enable to %d\n", enable);
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static void dsi_vc_initial_config(int channel)
+ {
+ u32 r;
+
+- DSSDBG("dsi_vc_config %d\n", channel);
++ DSSDBGF("%d", channel);
+
+ r = dsi_read_reg(DSI_VC_CTRL(channel));
+
++ if (FLD_GET(r, 15, 15)) /* VC_BUSY */
++ DSSERR("VC(%d) busy when trying to configure it!\n",
++ channel);
++
+ r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */
+ r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */
+ r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */
+@@ -1649,47 +1677,51 @@ static void dsi_vc_config(int channel)
+ r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */
+
+ dsi_write_reg(DSI_VC_CTRL(channel), r);
++
++ dsi.vc[channel].mode = DSI_VC_MODE_L4;
+ }
+
+-static void dsi_vc_config_vp(int channel)
++static void dsi_vc_config_l4(int channel)
+ {
+- u32 r;
++ if (dsi.vc[channel].mode == DSI_VC_MODE_L4)
++ return;
+
+- DSSDBG("dsi_vc_config_vp\n");
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO)
++ DSSDBGF("%d", channel);
+
+- r = dsi_read_reg(DSI_VC_CTRL(channel));
++ dsi_vc_enable(channel, 0);
+
+- r = FLD_MOD(r, 1, 1, 1); /* SOURCE, 1 = video port */
+- r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */
+- r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */
+- r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */
+- r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */
+- r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */
+- r = FLD_MOD(r, 1, 9, 9); /* MODE_SPEED, high speed on/off */
++ if(REG_GET(DSI_VC_CTRL(channel), 15, 15)) /* VC_BUSY */
++ DSSERR("vc(%d) busy when trying to config for L4\n", channel);
+
+- r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */
+- r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */
++ REG_FLD_MOD(DSI_VC_CTRL(channel), 0, 1, 1); /* SOURCE, 0 = L4 */
+
+- dsi_write_reg(DSI_VC_CTRL(channel), r);
+-}
++ dsi_vc_enable(channel, 1);
+
++ dsi.vc[channel].mode = DSI_VC_MODE_L4;
++}
+
+-static int dsi_vc_enable(int channel, bool enable)
++static void dsi_vc_config_vp(int channel)
+ {
+- DSSDBG("dsi_vc_enable channel %d, enable %d\n", channel, enable);
++ if (dsi.vc[channel].mode == DSI_VC_MODE_VP)
++ return;
+
+- enable = enable ? 1 : 0;
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO)
++ DSSDBGF("%d", channel);
+
+- REG_FLD_MOD(DSI_VC_CTRL(channel), enable, 0, 0);
++ dsi_vc_enable(channel, 0);
+
+- if (wait_for_bit_change(DSI_VC_CTRL(channel), 0, enable) != enable) {
+- DSSERR("Failed to set dsi_vc_enable to %d\n", enable);
+- return -EIO;
+- }
++ if(REG_GET(DSI_VC_CTRL(channel), 15, 15)) /* VC_BUSY */
++ DSSERR("vc(%d) busy when trying to config for VP\n", channel);
+
+- return 0;
++ REG_FLD_MOD(DSI_VC_CTRL(channel), 1, 1, 1); /* SOURCE, 1 = video port */
++
++ dsi_vc_enable(channel, 1);
++
++ dsi.vc[channel].mode = DSI_VC_MODE_VP;
+ }
+
++
+ static void dsi_vc_enable_hs(int channel, bool enable)
+ {
+ DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable);
+@@ -1788,7 +1820,9 @@ static int dsi_vc_send_bta(int channel)
+ {
+ unsigned long tmo;
+
+- DSSDBG("dsi_vc_send_bta %d\n", channel);
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO &&
++ (dsi.debug_write || dsi.debug_read))
++ DSSDBG("dsi_vc_send_bta %d\n", channel);
+
+ WARN_ON(!mutex_is_locked(&dsi.bus_lock));
+
+@@ -1976,6 +2010,12 @@ int dsi_vc_dcs_write_nosync(int channel, u8 *data, int len)
+
+ BUG_ON(len == 0);
+
++ if (REG_GET(DSI_VC_CTRL(channel), 1, 1) != 0) {
++ DSSERR("vc(%d) not in L4 mode when trying to write\n",
++ channel);
++ return -EIO;
++ }
++
+ if (len == 1) {
+ r = dsi_vc_send_short(channel, DSI_DT_DCS_SHORT_WRITE_0,
+ data[0], 0);
+@@ -2000,9 +2040,6 @@ int dsi_vc_dcs_write(int channel, u8 *data, int len)
+ if (r)
+ return r;
+
+- /* Some devices need time to process the msg in low power mode.
+- This also makes the write synchronous, and checks that
+- the peripheral is still alive */
+ r = dsi_vc_send_bta_sync(channel);
+
+ return r;
+@@ -2016,7 +2053,7 @@ int dsi_vc_dcs_read(int channel, u8 dcs_cmd, u8 *buf, int buflen)
+ int r;
+
+ if (dsi.debug_read)
+- DSSDBG("dsi_vc_dcs_read\n");
++ DSSDBG("dsi_vc_dcs_read(ch%d, dcs_cmd %u)\n", channel, dcs_cmd);
+
+ r = dsi_vc_send_short(channel, DSI_DT_DCS_READ, dcs_cmd, 0);
+ if (r)
+@@ -2291,10 +2328,7 @@ static int dsi_proto_config(struct omap_dss_device *dssdev)
+
+ dsi_write_reg(DSI_CTRL, r);
+
+- /* we configure vc0 for L4 communication, and
+- * vc1 for dispc */
+- dsi_vc_config(0);
+- dsi_vc_config_vp(1);
++ dsi_vc_initial_config(0);
+
+ /* set all vc targets to peripheral 0 */
+ dsi.vc[0].dest_per = 0;
+@@ -2535,10 +2569,11 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+ int packet_len;
+ u32 l;
+ bool use_te_trigger;
++ const int channel = 0;
+
+ use_te_trigger = dsi.te_enabled && !dsi.use_ext_te;
+
+- if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL)
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO)
+ DSSDBG("dsi_update_screen_dispc(%d,%d %dx%d)\n",
+ x, y, w, h);
+
+@@ -2559,22 +2594,27 @@ static void dsi_update_screen_dispc(struct omap_dss_device *dssdev,
+ dsi_vc_print_status(1);
+
+ l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */
+- dsi_write_reg(DSI_VC_TE(1), l);
++ dsi_write_reg(DSI_VC_TE(channel), l);
+
+- dsi_vc_write_long_header(1, DSI_DT_DCS_LONG_WRITE, packet_len, 0);
++ dsi_vc_write_long_header(channel, DSI_DT_DCS_LONG_WRITE, packet_len, 0);
+
+ if (use_te_trigger)
+ l = FLD_MOD(l, 1, 30, 30); /* TE_EN */
+ else
+ l = FLD_MOD(l, 1, 31, 31); /* TE_START */
+- dsi_write_reg(DSI_VC_TE(1), l);
++ dsi_write_reg(DSI_VC_TE(channel), l);
+
+ dispc_disable_sidle();
+
+ dss_start_update(dssdev);
+
+- if (use_te_trigger)
+- dsi_vc_send_bta(1);
++ if (use_te_trigger) {
++ /* disable LP_RX_TO, so that we can receive TE. Time to wait
++ * for TE is longer than the timer allows */
++ REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
++
++ dsi_vc_send_bta(channel);
++ }
+ }
+
+ static void dsi_framedone_irq_callback(void *data, u32 mask)
+@@ -2637,19 +2677,12 @@ static void dsi_start_auto_update(struct omap_dss_device *dssdev)
+
+ static int dsi_set_te(struct omap_dss_device *dssdev, bool enable)
+ {
+- dssdev->driver->enable_te(dssdev, enable);
+-
+- if (!dsi.use_ext_te) {
+- if (enable) {
+- /* disable LP_RX_TO, so that we can receive TE. Time
+- * to wait for TE is longer than the timer allows */
+- REG_FLD_MOD(DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */
+- } else {
+- REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
+- }
+- }
+-
+- return 0;
++ int r;
++ r = dssdev->driver->enable_te(dssdev, enable);
++ /* XXX for some reason, DSI TE breaks if we don't wait here.
++ * Panel bug? Needs more studying */
++ msleep(100);
++ return r;
+ }
+
+ static void dsi_handle_framedone(void)
+@@ -2657,8 +2690,14 @@ static void dsi_handle_framedone(void)
+ u32 l;
+ unsigned long tmo;
+ int i = 0;
++ int r;
++ const int channel = 0;
++ u32 te_size;
++ bool use_te_trigger;
++
++ use_te_trigger = dsi.te_enabled && !dsi.use_ext_te;
+
+- l = REG_GET(DSI_VC_TE(1), 23, 0); /* TE_SIZE */
++ l = REG_GET(DSI_VC_TE(channel), 23, 0); /* TE_SIZE */
+
+ /* We get FRAMEDONE when DISPC has finished sending pixels and turns
+ * itself off. However, DSI still has the pixels in its buffers, and is
+@@ -2667,24 +2706,26 @@ static void dsi_handle_framedone(void)
+ * DSI buffers, if any, so we'll just busyloop */
+ if (l > 0) {
+ tmo = jiffies + msecs_to_jiffies(50);
+- while (REG_GET(DSI_VC_TE(1), 23, 0) > 0) { /* TE_SIZE */
++ te_size = REG_GET(DSI_VC_TE(channel), 23, 0); /* TE_SIZE */
++ while (te_size > 0) {
+ i++;
+ if (time_after(jiffies, tmo)) {
+ DSSERR("timeout waiting TE_SIZE to zero: %u\n",
+- REG_GET(DSI_VC_TE(1), 23, 0));
++ te_size);
+ break;
+ }
+ schedule();
++ te_size = REG_GET(DSI_VC_TE(channel), 23, 0); /* TE_SIZE */
+ }
+ }
+
+- if (REG_GET(DSI_VC_TE(1), 30, 30))
++ if (REG_GET(DSI_VC_TE(channel), 30, 30))
+ DSSERR("TE_EN not zero\n");
+
+- if (REG_GET(DSI_VC_TE(1), 31, 31))
++ if (REG_GET(DSI_VC_TE(channel), 31, 31))
+ DSSERR("TE_START not zero\n");
+
+- if (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL)
++ if (dsi.update_mode != OMAP_DSS_UPDATE_AUTO)
+ DSSDBG("FRAMEDONE\n");
+
+ #if 0
+@@ -2698,6 +2739,16 @@ static void dsi_handle_framedone(void)
+ #ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC
+ dispc_fake_vsync_irq();
+ #endif
++ if (use_te_trigger) {
++ /* enable LP_RX_TO again after the TE */
++ REG_FLD_MOD(DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */
++
++ /* send BTA after the frame, because we need to BTA after
++ * every trasmission for the TE to work */
++ r = dsi_vc_send_bta_sync(channel);
++ if (r)
++ DSSERR("BTA after framedone failed\n");
++ }
+ }
+
+ static int dsi_update_thread(void *data)
+@@ -2768,25 +2819,24 @@ static int dsi_update_thread(void *data)
+ dispc_set_lcd_size(w, h);
+ }
+
+- /* XXX We don't need to send the update area coords to the
+- * panel every time. But for some reason TE doesn't work if we
+- * don't send at least a BTA here... */
+-#if 0
+ if (dsi.active_update_region.dirty) {
+ dsi.active_update_region.dirty = false;
++ /* XXX TODO we don't need to send the coords, if they
++ * are the same that are already programmed to the
++ * panel. That should speed up manual update a bit */
+ device->driver->setup_update(device, x, y, w, h);
+ }
+-#else
+- device->driver->setup_update(device, x, y, w, h);
+-#endif
+-
+- if (dsi.te_enabled && dsi.use_ext_te &&
+- device->driver->wait_for_te)
+- device->driver->wait_for_te(device);
+
+ dsi_perf_mark_start();
+
+ if (device->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
++ dsi_vc_config_vp(0);
++
++ if (dsi.te_enabled && dsi.use_ext_te)
++ device->driver->wait_for_te(device);
++
++ dsi.framedone_received = false;
++
+ dsi_update_screen_dispc(device, x, y, w, h);
+
+ /* wait for framedone */
+@@ -2795,8 +2845,6 @@ static int dsi_update_thread(void *data)
+ dsi.framedone_received == true,
+ timeout);
+
+- dsi.framedone_received = false;
+-
+ if (timeout == 0) {
+ DSSERR("framedone timeout\n");
+ DSSERR("failed update %d,%d %dx%d\n",
+@@ -2808,6 +2856,8 @@ static int dsi_update_thread(void *data)
+ dsi_handle_framedone();
+ dsi_perf_show("DISPC");
+ }
++
++ dsi_vc_config_l4(0);
+ } else {
+ dsi_update_screen_l4(device, x, y, w, h);
+ dsi_perf_show("L4");
+@@ -2913,7 +2963,6 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
+
+ /* enable interface */
+ dsi_vc_enable(0, 1);
+- dsi_vc_enable(1, 1);
+ dsi_if_enable(1);
+ dsi_force_tx_stop_mode_io();
+
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0133-DSS2-VRAM-Remove-unused-defines.patch b/recipes/linux/linux-omap-pm/dss2/0133-DSS2-VRAM-Remove-unused-defines.patch
new file mode 100644
index 0000000000..8815149684
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0133-DSS2-VRAM-Remove-unused-defines.patch
@@ -0,0 +1,41 @@
+From bc4dd8997279f25e115e27781a8b9f90315cb3ef Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 1 Jul 2009 12:34:05 +0300
+Subject: [PATCH 133/146] DSS2: VRAM: Remove unused defines
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/vram.c | 11 ++---------
+ 1 files changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index d4a8110..940c25d 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -1,7 +1,7 @@
+ /*
+- * linux/arch/arm/plat-omap/vram.c
++ * arch/arm/plat-omap/vram.c
+ *
+- * Copyright (C) 2008 Nokia Corporation
++ * Copyright (C) 2009 Nokia Corporation
+ * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+ *
+ * Some code and ideas taken from drivers/video/omap/ driver
+@@ -49,13 +49,6 @@
+ /* Maximum size, in reality this is smaller if SRAM is partially locked. */
+ #define OMAP2_SRAM_SIZE 0xa0000 /* 640k */
+
+-#define REG_MAP_SIZE(_page_cnt) \
+- ((_page_cnt + (sizeof(unsigned long) * 8) - 1) / 8)
+-#define REG_MAP_PTR(_rg, _page_nr) \
+- (((_rg)->map) + (_page_nr) / (sizeof(unsigned long) * 8))
+-#define REG_MAP_MASK(_page_nr) \
+- (1 << ((_page_nr) & (sizeof(unsigned long) * 8 - 1)))
+-
+ #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
+
+ /* postponed regions are used to temporarily store region information at boot
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0134-DSS2-VENC-Add-invert_polarity-flag.patch b/recipes/linux/linux-omap-pm/dss2/0134-DSS2-VENC-Add-invert_polarity-flag.patch
new file mode 100644
index 0000000000..57d5c65f94
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0134-DSS2-VENC-Add-invert_polarity-flag.patch
@@ -0,0 +1,65 @@
+From 324ac5a3f4ea601d1854eadff1388a4310ce660e Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 1 Jul 2009 13:43:55 +0300
+Subject: [PATCH 134/146] DSS2: VENC: Add invert_polarity flag
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/display.h | 1 +
+ drivers/video/omap2/dss/venc.c | 21 +++++++++++++--------
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h
+index 6df28dc..9477ccb 100644
+--- a/arch/arm/plat-omap/include/mach/display.h
++++ b/arch/arm/plat-omap/include/mach/display.h
+@@ -381,6 +381,7 @@ struct omap_dss_device {
+
+ struct {
+ enum omap_dss_venc_type type;
++ bool invert_polarity;
+ } venc;
+ } phy;
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index a9a5a8c..091ecc4 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -510,6 +510,8 @@ void venc_exit(void)
+
+ static void venc_power_on(struct omap_dss_device *dssdev)
+ {
++ u32 l;
++
+ venc_enable_clocks(1);
+
+ venc_reset();
+@@ -518,14 +520,17 @@ static void venc_power_on(struct omap_dss_device *dssdev)
+ dss_set_venc_output(dssdev->phy.venc.type);
+ dss_set_dac_pwrdn_bgz(1);
+
+- if (dssdev->phy.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE) {
+- if (cpu_is_omap24xx())
+- venc_write_reg(VENC_OUTPUT_CONTROL, 0x2);
+- else
+- venc_write_reg(VENC_OUTPUT_CONTROL, 0xa);
+- } else { /* S-Video */
+- venc_write_reg(VENC_OUTPUT_CONTROL, 0xd);
+- }
++ l = 0;
++
++ if (dssdev->phy.venc.type == OMAP_DSS_VENC_TYPE_COMPOSITE)
++ l |= 1 << 1;
++ else /* S-Video */
++ l |= (1 << 0) | (1 << 2);
++
++ if (dssdev->phy.venc.invert_polarity == false)
++ l |= 1 << 3;
++
++ venc_write_reg(VENC_OUTPUT_CONTROL, l);
+
+ dispc_set_digit_size(dssdev->panel.timings.x_res,
+ dssdev->panel.timings.y_res/2);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0135-DSS2-VRAM-Add-defines-for-VRAM-types.patch b/recipes/linux/linux-omap-pm/dss2/0135-DSS2-VRAM-Add-defines-for-VRAM-types.patch
new file mode 100644
index 0000000000..a139847f4f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0135-DSS2-VRAM-Add-defines-for-VRAM-types.patch
@@ -0,0 +1,89 @@
+From 9a472e2308e253e64652ff35954c05525abfb10a Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Wed, 1 Jul 2009 14:42:52 +0300
+Subject: [PATCH 135/146] DSS2: VRAM: Add defines for VRAM types
+
+Also clean up includes a bit.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vram.h | 4 ++++
+ arch/arm/plat-omap/vram.c | 11 +++++------
+ drivers/video/omap2/omapfb/omapfb-main.c | 2 +-
+ 3 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index 494ddde..66b788e 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -24,6 +24,10 @@
+
+ #include <asm/types.h>
+
++#define OMAP_VRAM_MEMTYPE_SDRAM 0
++#define OMAP_VRAM_MEMTYPE_SRAM 1
++#define OMAP_VRAM_MEMTYPE_MAX 1
++
+ extern int omap_vram_add_region(unsigned long paddr, size_t size);
+ extern int omap_vram_free(unsigned long paddr, size_t size);
+ extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr);
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index 940c25d..2954764 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -22,16 +22,15 @@
+
+ /*#define DEBUG*/
+
+-#include <linux/vmalloc.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+ #include <linux/list.h>
+-#include <linux/dma-mapping.h>
+ #include <linux/seq_file.h>
+ #include <linux/bootmem.h>
+-#include <linux/omapfb.h>
+ #include <linux/completion.h>
+ #include <linux/debugfs.h>
++#include <linux/jiffies.h>
++#include <linux/module.h>
+
+ #include <asm/setup.h>
+
+@@ -82,9 +81,9 @@ static inline int region_mem_type(unsigned long paddr)
+ {
+ if (paddr >= OMAP2_SRAM_START &&
+ paddr < OMAP2_SRAM_START + OMAP2_SRAM_SIZE)
+- return OMAPFB_MEMTYPE_SRAM;
++ return OMAP_VRAM_MEMTYPE_SRAM;
+ else
+- return OMAPFB_MEMTYPE_SDRAM;
++ return OMAP_VRAM_MEMTYPE_SDRAM;
+ }
+
+ static struct vram_region *omap_vram_create_region(unsigned long paddr,
+@@ -374,7 +373,7 @@ int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr)
+ unsigned pages;
+ int r;
+
+- BUG_ON(mtype > OMAPFB_MEMTYPE_MAX || !size);
++ BUG_ON(mtype > OMAP_VRAM_MEMTYPE_MAX || !size);
+
+ DBG("alloc mem type %d size %d\n", mtype, size);
+
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index b806dc9..45f087f 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -1204,7 +1204,7 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size,
+
+ if (!paddr) {
+ DBG("allocating %lu bytes for fb %d\n", size, ofbi->id);
+- r = omap_vram_alloc(OMAPFB_MEMTYPE_SDRAM, size, &paddr);
++ r = omap_vram_alloc(OMAP_VRAM_MEMTYPE_SDRAM, size, &paddr);
+ } else {
+ DBG("reserving %lu bytes at %lx for fb %d\n", size, paddr,
+ ofbi->id);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0136-DSS2-VRAM-separate-VRAM-setup-from-the-old-fb-vram.patch b/recipes/linux/linux-omap-pm/dss2/0136-DSS2-VRAM-separate-VRAM-setup-from-the-old-fb-vram.patch
new file mode 100644
index 0000000000..d9a87d12bf
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0136-DSS2-VRAM-separate-VRAM-setup-from-the-old-fb-vram.patch
@@ -0,0 +1,311 @@
+From 623b67b81b32b758915a58816bc75e092aa33bb8 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:05:08 +0300
+Subject: [PATCH 136/146] DSS2: VRAM: separate VRAM setup from the old fb vram setup
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/mach-omap2/io.c | 2 +
+ arch/arm/plat-omap/fb.c | 11 +++++-
+ arch/arm/plat-omap/include/mach/vram.h | 6 +++
+ arch/arm/plat-omap/sram.c | 15 +++++---
+ arch/arm/plat-omap/vram.c | 60 ++++++++++++++++----------------
+ include/linux/omapfb.h | 5 +++
+ 6 files changed, 62 insertions(+), 37 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
+index 5c91f36..221c60f 100644
+--- a/arch/arm/mach-omap2/io.c
++++ b/arch/arm/mach-omap2/io.c
+@@ -32,6 +32,7 @@
+ #include <mach/sram.h>
+ #include <mach/sdrc.h>
+ #include <mach/gpmc.h>
++#include <mach/vram.h>
+
+ #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */
+ #include "clock.h"
+@@ -240,6 +241,7 @@ void __init omap2_map_common_io(void)
+ omap2_check_revision();
+ omap_sram_init();
+ omapfb_reserve_sdram();
++ omap_vram_reserve_sdram();
+ }
+
+ /*
+diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c
+index 1dc3415..70fbeae 100644
+--- a/arch/arm/plat-omap/fb.c
++++ b/arch/arm/plat-omap/fb.c
+@@ -355,6 +355,16 @@ static inline int omap_init_fb(void)
+
+ arch_initcall(omap_init_fb);
+
++void omapfb_reserve_sdram(void) {}
++unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
++ unsigned long sram_vstart,
++ unsigned long sram_size,
++ unsigned long start_avail,
++ unsigned long size_avail)
++{
++ return 0;
++}
++
+ #else
+
+ void omapfb_reserve_sdram(void) {}
+@@ -367,5 +377,4 @@ unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
+ return 0;
+ }
+
+-
+ #endif
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index 66b788e..8d26b05 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -37,4 +37,10 @@ extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram,
+ extern void omap2_set_sdram_vram(u32 size, u32 start);
+ extern void omap2_set_sram_vram(u32 size, u32 start);
+
++extern void omap_vram_reserve_sdram(void);
++extern unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
++ unsigned long sram_vstart,
++ unsigned long sram_size,
++ unsigned long pstart_avail,
++ unsigned long size_avail);
+ #endif
+diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
+index 4ea7380..26797e7 100644
+--- a/arch/arm/plat-omap/sram.c
++++ b/arch/arm/plat-omap/sram.c
+@@ -19,6 +19,7 @@
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/io.h>
++#include <linux/omapfb.h>
+
+ #include <asm/tlb.h>
+ #include <asm/cacheflush.h>
+@@ -28,6 +29,7 @@
+ #include <mach/sram.h>
+ #include <mach/board.h>
+ #include <mach/cpu.h>
++#include <mach/vram.h>
+
+ #include <mach/control.h>
+
+@@ -76,12 +78,6 @@ static unsigned long omap_sram_base;
+ static unsigned long omap_sram_size;
+ static unsigned long omap_sram_ceil;
+
+-extern unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
+- unsigned long sram_vstart,
+- unsigned long sram_size,
+- unsigned long pstart_avail,
+- unsigned long size_avail);
+-
+ /*
+ * Depending on the target RAMFS firewall setup, the public usable amount of
+ * SRAM varies. The default accessible size for all device types is 2k. A GP
+@@ -185,6 +181,13 @@ void __init omap_detect_sram(void)
+ omap_sram_start + SRAM_BOOTLOADER_SZ,
+ omap_sram_size - SRAM_BOOTLOADER_SZ);
+ omap_sram_size -= reserved;
++
++ reserved = omap_vram_reserve_sram(omap_sram_start, omap_sram_base,
++ omap_sram_size,
++ omap_sram_start + SRAM_BOOTLOADER_SZ,
++ omap_sram_size - SRAM_BOOTLOADER_SZ);
++ omap_sram_size -= reserved;
++
+ omap_sram_ceil = omap_sram_base + omap_sram_size;
+ }
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index 2954764..6c4bc18 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -39,7 +39,7 @@
+ #include <mach/dma.h>
+
+ #ifdef DEBUG
+-#define DBG(format, ...) printk(KERN_DEBUG "VRAM: " format, ## __VA_ARGS__)
++#define DBG(format, ...) pr_debug("VRAM: " format, ## __VA_ARGS__)
+ #else
+ #define DBG(format, ...)
+ #endif
+@@ -239,7 +239,7 @@ static int _omap_vram_reserve(unsigned long paddr, unsigned pages)
+ if (!(start <= paddr && end >= paddr + size - 1))
+ continue;
+ found:
+- DBG("FOUND area start %lx, end %lx\n", start, end);
++ DBG("found area start %lx, end %lx\n", start, end);
+
+ if (omap_vram_create_allocation(rm, paddr, pages) == NULL)
+ return -ENOMEM;
+@@ -352,7 +352,7 @@ found:
+ if (end - start < pages << PAGE_SHIFT)
+ continue;
+
+- DBG("FOUND %lx, end %lx\n", start, end);
++ DBG("found %lx, end %lx\n", start, end);
+
+ alloc = omap_vram_create_allocation(rm, start, pages);
+ if (alloc == NULL)
+@@ -504,30 +504,30 @@ arch_initcall(omap_vram_init);
+ /* boottime vram alloc stuff */
+
+ /* set from board file */
+-static u32 omapfb_sram_vram_start __initdata;
+-static u32 omapfb_sram_vram_size __initdata;
++static u32 omap_vram_sram_start __initdata;
++static u32 omap_vram_sram_size __initdata;
+
+ /* set from board file */
+-static u32 omapfb_sdram_vram_start __initdata;
+-static u32 omapfb_sdram_vram_size __initdata;
++static u32 omap_vram_sdram_start __initdata;
++static u32 omap_vram_sdram_size __initdata;
+
+ /* set from kernel cmdline */
+-static u32 omapfb_def_sdram_vram_size __initdata;
+-static u32 omapfb_def_sdram_vram_start __initdata;
++static u32 omap_vram_def_sdram_size __initdata;
++static u32 omap_vram_def_sdram_start __initdata;
+
+-static void __init omapfb_early_vram(char **p)
++static void __init omap_vram_early_vram(char **p)
+ {
+- omapfb_def_sdram_vram_size = memparse(*p, p);
++ omap_vram_def_sdram_size = memparse(*p, p);
+ if (**p == ',')
+- omapfb_def_sdram_vram_start = simple_strtoul((*p) + 1, p, 16);
++ omap_vram_def_sdram_start = simple_strtoul((*p) + 1, p, 16);
+ }
+-__early_param("vram=", omapfb_early_vram);
++__early_param("vram=", omap_vram_early_vram);
+
+ /*
+ * Called from map_io. We need to call to this early enough so that we
+ * can reserve the fixed SDRAM regions before VM could get hold of them.
+ */
+-void __init omapfb_reserve_sdram(void)
++void __init omap_vram_reserve_sdram(void)
+ {
+ struct bootmem_data *bdata;
+ unsigned long sdram_start, sdram_size;
+@@ -535,14 +535,14 @@ void __init omapfb_reserve_sdram(void)
+ u32 size = 0;
+
+ /* cmdline arg overrides the board file definition */
+- if (omapfb_def_sdram_vram_size) {
+- size = omapfb_def_sdram_vram_size;
+- paddr = omapfb_def_sdram_vram_start;
++ if (omap_vram_def_sdram_size) {
++ size = omap_vram_def_sdram_size;
++ paddr = omap_vram_def_sdram_start;
+ }
+
+ if (!size) {
+- size = omapfb_sdram_vram_size;
+- paddr = omapfb_sdram_vram_start;
++ size = omap_vram_sdram_size;
++ paddr = omap_vram_sdram_start;
+ }
+
+ #ifdef CONFIG_OMAP2_DSS_VRAM_SIZE
+@@ -564,7 +564,7 @@ void __init omapfb_reserve_sdram(void)
+ if (paddr) {
+ if ((paddr & ~PAGE_MASK) || paddr < sdram_start ||
+ paddr + size > sdram_start + sdram_size) {
+- printk(KERN_ERR "Illegal SDRAM region for VRAM\n");
++ pr_err("Illegal SDRAM region for VRAM\n");
+ return;
+ }
+
+@@ -574,7 +574,7 @@ void __init omapfb_reserve_sdram(void)
+ }
+ } else {
+ if (size > sdram_size) {
+- printk(KERN_ERR "Illegal SDRAM size for VRAM\n");
++ pr_err("Illegal SDRAM size for VRAM\n");
+ return;
+ }
+
+@@ -597,7 +597,7 @@ void __init omapfb_reserve_sdram(void)
+ * this point, since the driver built as a module would have problem with
+ * freeing / reallocating the regions.
+ */
+-unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart,
++unsigned long __init omap_vram_reserve_sram(unsigned long sram_pstart,
+ unsigned long sram_vstart,
+ unsigned long sram_size,
+ unsigned long pstart_avail,
+@@ -608,8 +608,8 @@ unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart,
+ u32 paddr;
+ u32 size;
+
+- paddr = omapfb_sram_vram_start;
+- size = omapfb_sram_vram_size;
++ paddr = omap_vram_sram_start;
++ size = omap_vram_sram_size;
+
+ if (!size)
+ return 0;
+@@ -620,7 +620,7 @@ unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart,
+ if (!paddr) {
+ /* Dynamic allocation */
+ if ((size_avail & PAGE_MASK) < size) {
+- printk(KERN_ERR "Not enough SRAM for VRAM\n");
++ pr_err("Not enough SRAM for VRAM\n");
+ return 0;
+ }
+ size_avail = (size_avail - size) & PAGE_MASK;
+@@ -629,7 +629,7 @@ unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart,
+
+ if (paddr < sram_pstart ||
+ paddr + size > sram_pstart + sram_size) {
+- printk(KERN_ERR "Illegal SRAM region for VRAM\n");
++ pr_err("Illegal SRAM region for VRAM\n");
+ return 0;
+ }
+
+@@ -648,14 +648,14 @@ unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart,
+
+ void __init omap2_set_sdram_vram(u32 size, u32 start)
+ {
+- omapfb_sdram_vram_start = start;
+- omapfb_sdram_vram_size = size;
++ omap_vram_sdram_start = start;
++ omap_vram_sdram_size = size;
+ }
+
+ void __init omap2_set_sram_vram(u32 size, u32 start)
+ {
+- omapfb_sram_vram_start = start;
+- omapfb_sram_vram_size = size;
++ omap_vram_sram_start = start;
++ omap_vram_sram_size = size;
+ }
+
+ #endif
+diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h
+index 0df0df9..67dc375 100644
+--- a/include/linux/omapfb.h
++++ b/include/linux/omapfb.h
+@@ -424,6 +424,11 @@ extern struct lcd_ctrl omap2_disp_ctrl;
+ extern void omapfb_set_platform_data(struct omapfb_platform_data *data);
+
+ extern void omapfb_reserve_sdram(void);
++extern unsigned long omapfb_reserve_sram(unsigned long sram_pstart,
++ unsigned long sram_vstart,
++ unsigned long sram_size,
++ unsigned long pstart_avail,
++ unsigned long size_avail);
+ extern void omapfb_register_panel(struct lcd_panel *panel);
+ extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval);
+ extern void omapfb_notify_clients(struct omapfb_device *fbdev,
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0137-DSS2-VRFB-Update-license-information.patch b/recipes/linux/linux-omap-pm/dss2/0137-DSS2-VRFB-Update-license-information.patch
new file mode 100644
index 0000000000..e447b07bb0
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0137-DSS2-VRFB-Update-license-information.patch
@@ -0,0 +1,77 @@
+From 87bf295895fd2ee8a9019ddfcbef37cd98d28e20 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:18:43 +0300
+Subject: [PATCH 137/146] DSS2: VRFB: Update license information
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vrfb.h | 15 ++++++---------
+ arch/arm/plat-omap/vrfb.c | 20 ++++++++++++++++++++
+ 2 files changed, 26 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h
+index 9647d82..1a53c0e 100644
+--- a/arch/arm/plat-omap/include/mach/vrfb.h
++++ b/arch/arm/plat-omap/include/mach/vrfb.h
+@@ -1,15 +1,12 @@
+ /*
+- * File: arch/arm/plat-omap/include/mach/vrfb.h
+- *
+- * VRFB
++ * VRFB Rotation Engine
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+ *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+@@ -21,8 +18,8 @@
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+-#ifndef __VRFB_H
+-#define __VRFB_H
++#ifndef __OMAP_VRFB_H__
++#define __OMAP_VRFB_H__
+
+ #include <mach/display.h>
+ #define OMAP_VRFB_LINE_LEN 2048
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 201640a..24ea412 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -1,3 +1,23 @@
++/*
++ * VRFB Rotation Engine
++ *
++ * Copyright (C) 2009 Nokia Corporation
++ * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with this program; if not, write to the Free Software Foundation, Inc.,
++ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/ioport.h>
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0138-DSS2-VRAM-Update-license-information.patch b/recipes/linux/linux-omap-pm/dss2/0138-DSS2-VRAM-Update-license-information.patch
new file mode 100644
index 0000000000..cc83693ac3
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0138-DSS2-VRAM-Update-license-information.patch
@@ -0,0 +1,86 @@
+From 35ef20ad839dafe564b19561fd779af256460152 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:19:20 +0300
+Subject: [PATCH 138/146] DSS2: VRAM: Update license information
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vram.h | 13 ++++++-------
+ arch/arm/plat-omap/vram.c | 24 +++++++++++-------------
+ 2 files changed, 17 insertions(+), 20 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index 8d26b05..f6bb9fb 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -1,13 +1,12 @@
+ /*
+- * File: arch/arm/plat-omap/include/mach/vram.h
++ * VRAM manager for OMAP
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+ *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+@@ -19,8 +18,8 @@
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+-#ifndef __OMAPVRAM_H
+-#define __OMAPVRAM_H
++#ifndef __OMAP_VRAM_H__
++#define __OMAP_VRAM_H__
+
+ #include <asm/types.h>
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index 6c4bc18..0fd5b13 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -1,23 +1,21 @@
+ /*
+- * arch/arm/plat-omap/vram.c
++ * VRAM manager for OMAP
+ *
+ * Copyright (C) 2009 Nokia Corporation
+ * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+ *
+- * Some code and ideas taken from drivers/video/omap/ driver
+- * by Imre Deak.
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
+ *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License version 2 as published by
+- * the Free Software Foundation.
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
+ *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program. If not, see <http://www.gnu.org/licenses/>.
++ * You should have received a copy of the GNU General Public License along
++ * with this program; if not, write to the Free Software Foundation, Inc.,
++ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+ /*#define DEBUG*/
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0139-DSS2-VRFB-use-pr_-instead-of-printk.patch b/recipes/linux/linux-omap-pm/dss2/0139-DSS2-VRFB-use-pr_-instead-of-printk.patch
new file mode 100644
index 0000000000..abaf1f73f2
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0139-DSS2-VRFB-use-pr_-instead-of-printk.patch
@@ -0,0 +1,43 @@
+From c9a738cd1c5afda7f7c5a92cce23caa90d901c41 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:21:27 +0300
+Subject: [PATCH 139/146] DSS2: VRFB: use pr_* instead of printk
+
+---
+ arch/arm/plat-omap/vrfb.c | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
+index 24ea412..f526ee1 100644
+--- a/arch/arm/plat-omap/vrfb.c
++++ b/arch/arm/plat-omap/vrfb.c
+@@ -30,7 +30,7 @@
+ /*#define DEBUG*/
+
+ #ifdef DEBUG
+-#define DBG(format, ...) printk(KERN_DEBUG "VRFB: " format, ## __VA_ARGS__)
++#define DBG(format, ...) pr_debug("VRFB: " format, ## __VA_ARGS__)
+ #else
+ #define DBG(format, ...)
+ #endif
+@@ -229,7 +229,7 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ break;
+
+ if (ctx == VRFB_NUM_CTXS) {
+- printk(KERN_ERR "vrfb: no free contexts\n");
++ pr_err("vrfb: no free contexts\n");
+ r = -EBUSY;
+ goto out;
+ }
+@@ -247,7 +247,7 @@ int omap_vrfb_request_ctx(struct vrfb *vrfb)
+ for (rot = 0; rot < 4; ++rot) {
+ paddr = SMS_ROT_VIRT_BASE(ctx, rot);
+ if (!request_mem_region(paddr, OMAP_VRFB_SIZE, "vrfb")) {
+- printk(KERN_ERR "vrfb: failed to reserve VRFB "
++ pr_err("vrfb: failed to reserve VRFB "
+ "area for ctx %d, rotation %d\n",
+ ctx, rot * 90);
+ omap_vrfb_release_ctx(vrfb);
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0140-DSS2-VRAM-Change-CONFIG_OMAP2_DSS_VRAM_SIZE-name.patch b/recipes/linux/linux-omap-pm/dss2/0140-DSS2-VRAM-Change-CONFIG_OMAP2_DSS_VRAM_SIZE-name.patch
new file mode 100644
index 0000000000..ea57a9514f
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0140-DSS2-VRAM-Change-CONFIG_OMAP2_DSS_VRAM_SIZE-name.patch
@@ -0,0 +1,49 @@
+From 7f7e699c5481a69428c4c01b291f14a8eec5c52c Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:27:13 +0300
+Subject: [PATCH 140/146] DSS2: VRAM: Change CONFIG_OMAP2_DSS_VRAM_SIZE name
+
+Changed to CONFIG_OMAP2_VRAM_SIZE
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/vram.c | 4 ++--
+ drivers/video/omap2/dss/Kconfig | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index 0fd5b13..89ae1cf 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -543,9 +543,9 @@ void __init omap_vram_reserve_sdram(void)
+ paddr = omap_vram_sdram_start;
+ }
+
+-#ifdef CONFIG_OMAP2_DSS_VRAM_SIZE
++#ifdef CONFIG_OMAP2_VRAM_SIZE
+ if (!size) {
+- size = CONFIG_OMAP2_DSS_VRAM_SIZE * 1024 * 1024;
++ size = CONFIG_OMAP2_VRAM_SIZE * 1024 * 1024;
+ paddr = 0;
+ }
+ #endif
+diff --git a/drivers/video/omap2/dss/Kconfig b/drivers/video/omap2/dss/Kconfig
+index f2ce068..71d8dec 100644
+--- a/drivers/video/omap2/dss/Kconfig
++++ b/drivers/video/omap2/dss/Kconfig
+@@ -6,10 +6,10 @@ menuconfig OMAP2_DSS
+
+ if OMAP2_DSS
+
+-config OMAP2_DSS_VRAM_SIZE
++config OMAP2_VRAM_SIZE
+ int "VRAM size (MB)"
+ range 0 32
+- default 4
++ default 0
+ help
+ The amount of SDRAM to reserve at boot time for video RAM use.
+ This VRAM will be used by omapfb and other drivers that need
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0141-DSS2-VRAM-add-CONFIG_OMAP2_VRAM-flag.patch b/recipes/linux/linux-omap-pm/dss2/0141-DSS2-VRAM-add-CONFIG_OMAP2_VRAM-flag.patch
new file mode 100644
index 0000000000..562ad7a1e2
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0141-DSS2-VRAM-add-CONFIG_OMAP2_VRAM-flag.patch
@@ -0,0 +1,141 @@
+From 6f66d2245dc6359f7de98796f5d999a308f74179 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:49:07 +0300
+Subject: [PATCH 141/146] DSS2: VRAM: add CONFIG_OMAP2_VRAM flag
+
+CONFIG_OMAP2_VRAM controls wheter VRAM manager is compiled in or not.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/Kconfig | 3 +++
+ arch/arm/plat-omap/Makefile | 3 ++-
+ arch/arm/plat-omap/include/mach/vram.h | 22 ++++++++++++++++++++--
+ arch/arm/plat-omap/vram.c | 9 ++-------
+ drivers/video/omap2/omapfb/Kconfig | 1 +
+ 5 files changed, 28 insertions(+), 10 deletions(-)
+
+diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
+index efe85d0..ca06037 100644
+--- a/arch/arm/plat-omap/Kconfig
++++ b/arch/arm/plat-omap/Kconfig
+@@ -183,6 +183,9 @@ config OMAP_SERIAL_WAKE
+ to data on the serial RX line. This allows you to wake the
+ system from serial console.
+
++config OMAP2_VRAM
++ bool
++
+ endmenu
+
+ endif
+diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
+index cfc0967..3232edc 100644
+--- a/arch/arm/plat-omap/Makefile
++++ b/arch/arm/plat-omap/Makefile
+@@ -4,7 +4,7 @@
+
+ # Common support
+ obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \
+- usb.o fb.o vram.o vrfb.o io.o
++ usb.o fb.o vrfb.o io.o
+ obj-m :=
+ obj-n :=
+ obj- :=
+@@ -25,3 +25,4 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y)
+ # OMAP mailbox framework
+ obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o
+
++obj-$(CONFIG_OMAP2_VRAM) += vram.o
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index f6bb9fb..4f2c2e6 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -21,6 +21,7 @@
+ #ifndef __OMAP_VRAM_H__
+ #define __OMAP_VRAM_H__
+
++#include <linux/autoconf.h>
+ #include <asm/types.h>
+
+ #define OMAP_VRAM_MEMTYPE_SDRAM 0
+@@ -33,8 +34,10 @@ extern int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr);
+ extern int omap_vram_reserve(unsigned long paddr, size_t size);
+ extern void omap_vram_get_info(unsigned long *vram, unsigned long *free_vram,
+ unsigned long *largest_free_block);
+-extern void omap2_set_sdram_vram(u32 size, u32 start);
+-extern void omap2_set_sram_vram(u32 size, u32 start);
++
++#ifdef CONFIG_OMAP2_VRAM
++extern void omap_vram_set_sdram_vram(u32 size, u32 start);
++extern void omap_vram_set_sram_vram(u32 size, u32 start);
+
+ extern void omap_vram_reserve_sdram(void);
+ extern unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
+@@ -42,4 +45,19 @@ extern unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
+ unsigned long sram_size,
+ unsigned long pstart_avail,
+ unsigned long size_avail);
++#else
++static inline void omap_vram_set_sdram_vram(u32 size, u32 start) { }
++static inline void omap_vram_set_sram_vram(u32 size, u32 start) { }
++
++static inline void omap_vram_reserve_sdram(void) { }
++static inline unsigned long omap_vram_reserve_sram(unsigned long sram_pstart,
++ unsigned long sram_vstart,
++ unsigned long sram_size,
++ unsigned long pstart_avail,
++ unsigned long size_avail)
++{
++ return 0;
++}
++#endif
++
+ #endif
+diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c
+index 89ae1cf..634ce23 100644
+--- a/arch/arm/plat-omap/vram.c
++++ b/arch/arm/plat-omap/vram.c
+@@ -46,8 +46,6 @@
+ /* Maximum size, in reality this is smaller if SRAM is partially locked. */
+ #define OMAP2_SRAM_SIZE 0xa0000 /* 640k */
+
+-#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
+-
+ /* postponed regions are used to temporarily store region information at boot
+ * time when we cannot yet allocate the region list */
+ #define MAX_POSTPONED_REGIONS 10
+@@ -644,17 +642,14 @@ unsigned long __init omap_vram_reserve_sram(unsigned long sram_pstart,
+ return reserved;
+ }
+
+-void __init omap2_set_sdram_vram(u32 size, u32 start)
++void __init omap_vram_set_sdram_vram(u32 size, u32 start)
+ {
+ omap_vram_sdram_start = start;
+ omap_vram_sdram_size = size;
+ }
+
+-void __init omap2_set_sram_vram(u32 size, u32 start)
++void __init omap_vram_set_sram_vram(u32 size, u32 start)
+ {
+ omap_vram_sram_start = start;
+ omap_vram_sram_size = size;
+ }
+-
+-#endif
+-
+diff --git a/drivers/video/omap2/omapfb/Kconfig b/drivers/video/omap2/omapfb/Kconfig
+index 4f66033..220c58b 100644
+--- a/drivers/video/omap2/omapfb/Kconfig
++++ b/drivers/video/omap2/omapfb/Kconfig
+@@ -2,6 +2,7 @@ menuconfig FB_OMAP2
+ tristate "OMAP2/3 frame buffer support (EXPERIMENTAL)"
+ depends on FB && OMAP2_DSS
+
++ select OMAP2_VRAM
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+ select FB_CFB_IMAGEBLIT
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0142-DSS2-VRFB-Add-CONFIG_OMAP2_VRFB-flag.patch b/recipes/linux/linux-omap-pm/dss2/0142-DSS2-VRFB-Add-CONFIG_OMAP2_VRFB-flag.patch
new file mode 100644
index 0000000000..fdf96915b5
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0142-DSS2-VRFB-Add-CONFIG_OMAP2_VRFB-flag.patch
@@ -0,0 +1,61 @@
+From 861c91bae473d89d11bf38036dd68ee7cd33f9c4 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 11:53:26 +0300
+Subject: [PATCH 142/146] DSS2: VRFB: Add CONFIG_OMAP2_VRFB flag
+
+CONFIG_OMAP2_VRFB controls if VRFB is compiled in or not.
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/Kconfig | 3 +++
+ arch/arm/plat-omap/Makefile | 3 ++-
+ drivers/video/omap2/omapfb/Kconfig | 1 +
+ 3 files changed, 6 insertions(+), 1 deletions(-)
+
+diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
+index ca06037..2d6ae55 100644
+--- a/arch/arm/plat-omap/Kconfig
++++ b/arch/arm/plat-omap/Kconfig
+@@ -186,6 +186,9 @@ config OMAP_SERIAL_WAKE
+ config OMAP2_VRAM
+ bool
+
++config OMAP2_VRFB
++ bool
++
+ endmenu
+
+ endif
+diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
+index 3232edc..462edf3 100644
+--- a/arch/arm/plat-omap/Makefile
++++ b/arch/arm/plat-omap/Makefile
+@@ -4,7 +4,7 @@
+
+ # Common support
+ obj-y := common.o sram.o clock.o devices.o dma.o mux.o gpio.o \
+- usb.o fb.o vrfb.o io.o
++ usb.o fb.o io.o
+ obj-m :=
+ obj-n :=
+ obj- :=
+@@ -26,3 +26,4 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y)
+ obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o
+
+ obj-$(CONFIG_OMAP2_VRAM) += vram.o
++obj-$(CONFIG_OMAP2_VRFB) += vrfb.o
+diff --git a/drivers/video/omap2/omapfb/Kconfig b/drivers/video/omap2/omapfb/Kconfig
+index 220c58b..bb694cc 100644
+--- a/drivers/video/omap2/omapfb/Kconfig
++++ b/drivers/video/omap2/omapfb/Kconfig
+@@ -3,6 +3,7 @@ menuconfig FB_OMAP2
+ depends on FB && OMAP2_DSS
+
+ select OMAP2_VRAM
++ select OMAP2_VRFB
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+ select FB_CFB_IMAGEBLIT
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0143-DSS2-VRFB-VRAM-fix-checkpatch-warnings.patch b/recipes/linux/linux-omap-pm/dss2/0143-DSS2-VRFB-VRAM-fix-checkpatch-warnings.patch
new file mode 100644
index 0000000000..f9951f3403
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0143-DSS2-VRFB-VRAM-fix-checkpatch-warnings.patch
@@ -0,0 +1,41 @@
+From 3ef64847bf3139f00aa254f1c5dda46b5c13470d Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 15:14:57 +0300
+Subject: [PATCH 143/146] DSS2: VRFB/VRAM: fix checkpatch warnings
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ arch/arm/plat-omap/include/mach/vram.h | 2 +-
+ arch/arm/plat-omap/include/mach/vrfb.h | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/arch/arm/plat-omap/include/mach/vram.h b/arch/arm/plat-omap/include/mach/vram.h
+index 4f2c2e6..fe72f81 100644
+--- a/arch/arm/plat-omap/include/mach/vram.h
++++ b/arch/arm/plat-omap/include/mach/vram.h
+@@ -22,7 +22,7 @@
+ #define __OMAP_VRAM_H__
+
+ #include <linux/autoconf.h>
+-#include <asm/types.h>
++#include <linux/types.h>
+
+ #define OMAP_VRAM_MEMTYPE_SDRAM 0
+ #define OMAP_VRAM_MEMTYPE_SRAM 1
+diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h
+index 1a53c0e..dee929c 100644
+--- a/arch/arm/plat-omap/include/mach/vrfb.h
++++ b/arch/arm/plat-omap/include/mach/vrfb.h
+@@ -24,8 +24,7 @@
+ #include <mach/display.h>
+ #define OMAP_VRFB_LINE_LEN 2048
+
+-struct vrfb
+-{
++struct vrfb {
+ u8 context;
+ void __iomem *vaddr[4];
+ unsigned long paddr[4];
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0144-DSS2-fixes-to-dss_omap_3430sdp_defconfig-to-make-it.patch b/recipes/linux/linux-omap-pm/dss2/0144-DSS2-fixes-to-dss_omap_3430sdp_defconfig-to-make-it.patch
new file mode 100644
index 0000000000..908133d04e
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0144-DSS2-fixes-to-dss_omap_3430sdp_defconfig-to-make-it.patch
@@ -0,0 +1,1675 @@
+From 7d29cea64fc73b3f7f4524d4ce27ef721ed8b717 Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 16:12:26 +0300
+Subject: [PATCH 144/146] DSS2: fixes to dss_omap_3430sdp_defconfig to make it boot
+
+---
+ arch/arm/configs/dss_omap_3430sdp_defconfig | 866 ++++++++++++++++++---------
+ 1 files changed, 598 insertions(+), 268 deletions(-)
+
+diff --git a/arch/arm/configs/dss_omap_3430sdp_defconfig b/arch/arm/configs/dss_omap_3430sdp_defconfig
+index dc30dce..cf44088 100644
+--- a/arch/arm/configs/dss_omap_3430sdp_defconfig
++++ b/arch/arm/configs/dss_omap_3430sdp_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-omap1
+-# Thu Apr 2 11:11:24 2009
++# Linux kernel version: 2.6.31-rc1-omap1
++# Thu Jul 2 17:25:15 2009
+ #
+ CONFIG_ARM=y
+ CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+@@ -9,7 +9,6 @@ CONFIG_GENERIC_GPIO=y
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_MMU=y
+-# CONFIG_NO_IOPORT is not set
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_STACKTRACE_SUPPORT=y
+ CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+@@ -18,13 +17,13 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
++CONFIG_OPROFILE_ARMV7=y
+ CONFIG_VECTORS_BASE=0xffff0000
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++CONFIG_CONSTRUCTORS=y
+
+ #
+ # General setup
+@@ -33,7 +32,7 @@ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+ CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_LOCALVERSION_AUTO is not set
+ CONFIG_SWAP=y
+ CONFIG_SYSVIPC=y
+ CONFIG_SYSVIPC_SYSCTL=y
+@@ -51,7 +50,8 @@ CONFIG_CLASSIC_RCU=y
+ # CONFIG_PREEMPT_RCU is not set
+ # CONFIG_TREE_RCU_TRACE is not set
+ # CONFIG_PREEMPT_RCU_TRACE is not set
+-# CONFIG_IKCONFIG is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+@@ -65,6 +65,9 @@ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_NAMESPACES is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ CONFIG_ANON_INODES=y
+@@ -73,11 +76,11 @@ CONFIG_UID16=y
+ # CONFIG_SYSCTL_SYSCALL is not set
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_ALL is not set
+-CONFIG_KALLSYMS_EXTRA_PASS=y
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
+ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+-CONFIG_ELF_CORE=y
++# CONFIG_ELF_CORE is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+@@ -86,17 +89,32 @@ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_AIO=y
++
++#
++# Performance Counters
++#
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_COMPAT_BRK=y
+-CONFIG_SLAB=y
+-# CONFIG_SLUB is not set
++CONFIG_SLUB_DEBUG=y
++# CONFIG_STRIP_ASM_SYMS is not set
++# CONFIG_COMPAT_BRK is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+-# CONFIG_PROFILING is not set
++CONFIG_PROFILING=y
++CONFIG_TRACEPOINTS=y
++CONFIG_MARKERS=y
++CONFIG_OPROFILE=y
+ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
+ CONFIG_HAVE_CLK=y
++
++#
++# GCOV-based kernel profiling
++#
++# CONFIG_GCOV_KERNEL is not set
++# CONFIG_SLOW_WORK is not set
+ CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+@@ -104,12 +122,11 @@ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+-# CONFIG_MODULE_FORCE_UNLOAD is not set
++CONFIG_MODULE_FORCE_UNLOAD=y
+ CONFIG_MODVERSIONS=y
+ CONFIG_MODULE_SRCVERSION_ALL=y
+ CONFIG_BLOCK=y
+-# CONFIG_LBD is not set
+-# CONFIG_BLK_DEV_IO_TRACE is not set
++CONFIG_LBDAF=y
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -120,11 +137,11 @@ CONFIG_IOSCHED_NOOP=y
+ CONFIG_IOSCHED_AS=y
+ CONFIG_IOSCHED_DEADLINE=y
+ CONFIG_IOSCHED_CFQ=y
+-CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_AS is not set
+ # CONFIG_DEFAULT_DEADLINE is not set
+-# CONFIG_DEFAULT_CFQ is not set
++CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+-CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_DEFAULT_IOSCHED="cfq"
+ CONFIG_FREEZER=y
+
+ #
+@@ -136,12 +153,14 @@ CONFIG_FREEZER=y
+ # CONFIG_ARCH_VERSATILE is not set
+ # CONFIG_ARCH_AT91 is not set
+ # CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_GEMINI is not set
+ # CONFIG_ARCH_EBSA110 is not set
+ # CONFIG_ARCH_EP93XX is not set
+ # CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_MXC is not set
++# CONFIG_ARCH_STMP3XXX is not set
+ # CONFIG_ARCH_NETX is not set
+ # CONFIG_ARCH_H720X is not set
+-# CONFIG_ARCH_IMX is not set
+ # CONFIG_ARCH_IOP13XX is not set
+ # CONFIG_ARCH_IOP32X is not set
+ # CONFIG_ARCH_IOP33X is not set
+@@ -150,24 +169,25 @@ CONFIG_FREEZER=y
+ # CONFIG_ARCH_IXP4XX is not set
+ # CONFIG_ARCH_L7200 is not set
+ # CONFIG_ARCH_KIRKWOOD is not set
+-# CONFIG_ARCH_KS8695 is not set
+-# CONFIG_ARCH_NS9XXX is not set
+ # CONFIG_ARCH_LOKI is not set
+ # CONFIG_ARCH_MV78XX0 is not set
+-# CONFIG_ARCH_MXC is not set
+ # CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_W90X900 is not set
+ # CONFIG_ARCH_PNX4008 is not set
+ # CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MSM is not set
+ # CONFIG_ARCH_RPC is not set
+ # CONFIG_ARCH_SA1100 is not set
+ # CONFIG_ARCH_S3C2410 is not set
+ # CONFIG_ARCH_S3C64XX is not set
+ # CONFIG_ARCH_SHARK is not set
+ # CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_U300 is not set
+ # CONFIG_ARCH_DAVINCI is not set
+ CONFIG_ARCH_OMAP=y
+-# CONFIG_ARCH_MSM is not set
+-# CONFIG_ARCH_W90X900 is not set
+
+ #
+ # TI OMAP Implementations
+@@ -176,33 +196,28 @@ CONFIG_ARCH_OMAP_OTG=y
+ # CONFIG_ARCH_OMAP1 is not set
+ # CONFIG_ARCH_OMAP2 is not set
+ CONFIG_ARCH_OMAP3=y
++# CONFIG_ARCH_OMAP4 is not set
+
+ #
+ # OMAP Feature Selections
+ #
+ # CONFIG_OMAP_DEBUG_POWERDOMAIN is not set
+ # CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set
+-CONFIG_OMAP_SMARTREFLEX=y
+-# CONFIG_OMAP_SMARTREFLEX_TESTING is not set
+-CONFIG_OMAP_RESET_CLOCKS=y
+-CONFIG_OMAP_BOOT_TAG=y
+-CONFIG_OMAP_BOOT_REASON=y
+-# CONFIG_OMAP_COMPONENT_VERSION is not set
+-# CONFIG_OMAP_GPIO_SWITCH is not set
++# CONFIG_OMAP_RESET_CLOCKS is not set
+ CONFIG_OMAP_MUX=y
+ CONFIG_OMAP_MUX_DEBUG=y
+ CONFIG_OMAP_MUX_WARNINGS=y
+-# CONFIG_OMAP_MCBSP is not set
++CONFIG_OMAP_MCBSP=y
+ # CONFIG_OMAP_MBOX_FWK is not set
+ # CONFIG_OMAP_MPU_TIMER is not set
+ CONFIG_OMAP_32K_TIMER=y
+ CONFIG_OMAP_32K_TIMER_HZ=128
+-CONFIG_OMAP_TICK_GPTIMER=1
+ CONFIG_OMAP_DM_TIMER=y
+ CONFIG_OMAP_LL_DEBUG_UART1=y
+ # CONFIG_OMAP_LL_DEBUG_UART2 is not set
+ # CONFIG_OMAP_LL_DEBUG_UART3 is not set
+-CONFIG_OMAP_SERIAL_WAKE=y
++CONFIG_OMAP2_VRAM=y
++CONFIG_OMAP2_VRFB=y
+ CONFIG_ARCH_OMAP34XX=y
+ CONFIG_ARCH_OMAP3430=y
+
+@@ -210,12 +225,13 @@ CONFIG_ARCH_OMAP3430=y
+ # OMAP Board Type
+ #
+ # CONFIG_MACH_NOKIA_RX51 is not set
+-# CONFIG_MACH_OMAP_LDP is not set
++CONFIG_MACH_OMAP_LDP=y
+ CONFIG_MACH_OMAP_3430SDP=y
+ # CONFIG_MACH_OMAP3EVM is not set
+-# CONFIG_MACH_OMAP3_BEAGLE is not set
+-# CONFIG_MACH_OVERO is not set
+-# CONFIG_MACH_OMAP3_PANDORA is not set
++CONFIG_MACH_OMAP3_BEAGLE=y
++CONFIG_MACH_OVERO=y
++CONFIG_MACH_OMAP3_PANDORA=y
++# CONFIG_MACH_OMAP_ZOOM2 is not set
+
+ #
+ # Processor Type
+@@ -238,12 +254,15 @@ CONFIG_CPU_CP15_MMU=y
+ # Processor Features
+ #
+ CONFIG_ARM_THUMB=y
+-# CONFIG_ARM_THUMBEE is not set
++CONFIG_ARM_THUMBEE=y
+ # CONFIG_CPU_ICACHE_DISABLE is not set
+ # CONFIG_CPU_DCACHE_DISABLE is not set
+ # CONFIG_CPU_BPREDICT_DISABLE is not set
+ CONFIG_HAS_TLS_REG=y
+-# CONFIG_OUTER_CACHE is not set
++# CONFIG_ARM_ERRATA_430973 is not set
++# CONFIG_ARM_ERRATA_458693 is not set
++# CONFIG_ARM_ERRATA_460075 is not set
++CONFIG_COMMON_CLKDEV=y
+
+ #
+ # Bus support
+@@ -266,10 +285,10 @@ CONFIG_PAGE_OFFSET=0xC0000000
+ # CONFIG_PREEMPT is not set
+ CONFIG_HZ=128
+ CONFIG_AEABI=y
+-CONFIG_OABI_COMPAT=y
+-CONFIG_ARCH_FLATMEM_HAS_HOLES=y
++# CONFIG_OABI_COMPAT is not set
+ # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+ # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+@@ -281,23 +300,41 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+-# CONFIG_LEDS is not set
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
++CONFIG_LEDS=y
+ CONFIG_ALIGNMENT_TRAP=y
++# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+ #
+ # Boot options
+ #
+ CONFIG_ZBOOT_ROM_TEXT=0x0
+ CONFIG_ZBOOT_ROM_BSS=0x0
+-CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:tgt:eth0:off rw console=ttyS2,115200n8"
++CONFIG_CMDLINE="console=ttyS2,115200 root=/dev/mmcblk0p3 rootwait debug"
+ # CONFIG_XIP_KERNEL is not set
+-# CONFIG_KEXEC is not set
++CONFIG_KEXEC=y
++CONFIG_ATAGS_PROC=y
+
+ #
+ # CPU Power Management
+ #
+-# CONFIG_CPU_FREQ is not set
++CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_TABLE=y
++# CONFIG_CPU_FREQ_DEBUG is not set
++CONFIG_CPU_FREQ_STAT=y
++CONFIG_CPU_FREQ_STAT_DETAILS=y
++CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
++# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
++CONFIG_CPU_FREQ_GOV_USERSPACE=y
++CONFIG_CPU_FREQ_GOV_ONDEMAND=y
++# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+ # CONFIG_CPU_IDLE is not set
+
+ #
+@@ -307,20 +344,16 @@ CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.0.1:/home/user/buildroot ip=192.16
+ #
+ # At least one emulation must be selected
+ #
+-CONFIG_FPE_NWFPE=y
+-# CONFIG_FPE_NWFPE_XP is not set
+-# CONFIG_FPE_FASTFPE is not set
+ CONFIG_VFP=y
+ CONFIG_VFPv3=y
+-# CONFIG_NEON is not set
++CONFIG_NEON=y
+
+ #
+ # Userspace binary formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+ CONFIG_HAVE_AOUT=y
+-# CONFIG_BINFMT_AOUT is not set
++CONFIG_BINFMT_AOUT=m
+ CONFIG_BINFMT_MISC=y
+
+ #
+@@ -338,9 +371,8 @@ CONFIG_NET=y
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
++CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+ CONFIG_XFRM=y
+ # CONFIG_XFRM_USER is not set
+@@ -365,7 +397,7 @@ CONFIG_IP_PNP_RARP=y
+ # CONFIG_INET_ESP is not set
+ # CONFIG_INET_IPCOMP is not set
+ # CONFIG_INET_XFRM_TUNNEL is not set
+-# CONFIG_INET_TUNNEL is not set
++CONFIG_INET_TUNNEL=m
+ CONFIG_INET_XFRM_MODE_TRANSPORT=y
+ CONFIG_INET_XFRM_MODE_TUNNEL=y
+ CONFIG_INET_XFRM_MODE_BEET=y
+@@ -376,7 +408,25 @@ CONFIG_INET_TCP_DIAG=y
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+-# CONFIG_IPV6 is not set
++CONFIG_IPV6=m
++# CONFIG_IPV6_PRIVACY is not set
++# CONFIG_IPV6_ROUTER_PREF is not set
++# CONFIG_IPV6_OPTIMISTIC_DAD is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++# CONFIG_IPV6_MIP6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
++CONFIG_IPV6_SIT=m
++CONFIG_IPV6_NDISC_NODETYPE=y
++# CONFIG_IPV6_TUNNEL is not set
++# CONFIG_IPV6_MULTIPLE_TABLES is not set
++# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+ # CONFIG_IP_DCCP is not set
+@@ -394,6 +444,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_IEEE802154 is not set
+ # CONFIG_NET_SCHED is not set
+ # CONFIG_DCB is not set
+
+@@ -401,18 +453,62 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # Network testing
+ #
+ # CONFIG_NET_PKTGEN is not set
++# CONFIG_NET_DROP_MONITOR is not set
+ # CONFIG_HAMRADIO is not set
+ # CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+-# CONFIG_BT is not set
++CONFIG_BT=y
++CONFIG_BT_L2CAP=y
++CONFIG_BT_SCO=y
++CONFIG_BT_RFCOMM=y
++CONFIG_BT_RFCOMM_TTY=y
++CONFIG_BT_BNEP=y
++CONFIG_BT_BNEP_MC_FILTER=y
++CONFIG_BT_BNEP_PROTO_FILTER=y
++CONFIG_BT_HIDP=y
++
++#
++# Bluetooth device drivers
++#
++# CONFIG_BT_HCIBTUSB is not set
++# CONFIG_BT_HCIBTSDIO is not set
++CONFIG_BT_HCIUART=y
++CONFIG_BT_HCIUART_H4=y
++CONFIG_BT_HCIUART_BCSP=y
++# CONFIG_BT_HCIUART_LL is not set
++CONFIG_BT_HCIBCM203X=y
++CONFIG_BT_HCIBPA10X=y
++# CONFIG_BT_HCIBFUSB is not set
++# CONFIG_BT_HCIVHCI is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+ CONFIG_WIRELESS=y
+-# CONFIG_CFG80211 is not set
++CONFIG_CFG80211=y
++# CONFIG_CFG80211_REG_DEBUG is not set
++# CONFIG_CFG80211_DEBUGFS is not set
+ CONFIG_WIRELESS_OLD_REGULATORY=y
+-# CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+-# CONFIG_MAC80211 is not set
++CONFIG_WIRELESS_EXT=y
++CONFIG_WIRELESS_EXT_SYSFS=y
++CONFIG_LIB80211=y
++CONFIG_LIB80211_CRYPT_WEP=m
++CONFIG_LIB80211_CRYPT_CCMP=m
++CONFIG_LIB80211_CRYPT_TKIP=m
++# CONFIG_LIB80211_DEBUG is not set
++CONFIG_MAC80211=y
++CONFIG_MAC80211_DEFAULT_PS=y
++CONFIG_MAC80211_DEFAULT_PS_VALUE=1
++
++#
++# Rate control algorithm selection
++#
++CONFIG_MAC80211_RC_PID=y
++# CONFIG_MAC80211_RC_MINSTREL is not set
++CONFIG_MAC80211_RC_DEFAULT_PID=y
++# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set
++CONFIG_MAC80211_RC_DEFAULT="pid"
++# CONFIG_MAC80211_MESH is not set
++CONFIG_MAC80211_LEDS=y
++# CONFIG_MAC80211_DEBUGFS is not set
++# CONFIG_MAC80211_DEBUG_MENU is not set
+ # CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+@@ -427,7 +523,9 @@ CONFIG_WIRELESS_OLD_REGULATORY=y
+ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+ CONFIG_STANDALONE=y
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+-# CONFIG_FW_LOADER is not set
++CONFIG_FW_LOADER=y
++CONFIG_FIRMWARE_IN_KERNEL=y
++CONFIG_EXTRA_FIRMWARE=""
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -438,7 +536,7 @@ CONFIG_MTD_CONCAT=y
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
++# CONFIG_MTD_CMDLINE_PARTS is not set
+ # CONFIG_MTD_AFS_PARTS is not set
+ # CONFIG_MTD_AR7_PARTS is not set
+
+@@ -458,10 +556,8 @@ CONFIG_MTD_BLOCK=y
+ #
+ # RAM/ROM/Flash chip drivers
+ #
+-CONFIG_MTD_CFI=y
++# CONFIG_MTD_CFI is not set
+ # CONFIG_MTD_JEDECPROBE is not set
+-CONFIG_MTD_GEN_PROBE=y
+-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+ CONFIG_MTD_MAP_BANK_WIDTH_1=y
+ CONFIG_MTD_MAP_BANK_WIDTH_2=y
+ CONFIG_MTD_MAP_BANK_WIDTH_4=y
+@@ -472,10 +568,6 @@ CONFIG_MTD_CFI_I1=y
+ CONFIG_MTD_CFI_I2=y
+ # CONFIG_MTD_CFI_I4 is not set
+ # CONFIG_MTD_CFI_I8 is not set
+-CONFIG_MTD_CFI_INTELEXT=y
+-# CONFIG_MTD_CFI_AMDSTD is not set
+-# CONFIG_MTD_CFI_STAA is not set
+-CONFIG_MTD_CFI_UTIL=y
+ # CONFIG_MTD_RAM is not set
+ # CONFIG_MTD_ROM is not set
+ # CONFIG_MTD_ABSENT is not set
+@@ -484,9 +576,6 @@ CONFIG_MTD_CFI_UTIL=y
+ # Mapping drivers for chip access
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-# CONFIG_MTD_PHYSMAP is not set
+-# CONFIG_MTD_ARM_INTEGRATOR is not set
+-CONFIG_MTD_OMAP_NOR=y
+ # CONFIG_MTD_PLATRAM is not set
+
+ #
+@@ -507,22 +596,16 @@ CONFIG_MTD_OMAP_NOR=y
+ # CONFIG_MTD_DOC2001PLUS is not set
+ CONFIG_MTD_NAND=y
+ # CONFIG_MTD_NAND_VERIFY_WRITE is not set
+-CONFIG_MTD_NAND_ECC_SMC=y
++# CONFIG_MTD_NAND_ECC_SMC is not set
+ # CONFIG_MTD_NAND_MUSEUM_IDS is not set
+ # CONFIG_MTD_NAND_GPIO is not set
+-CONFIG_MTD_NAND_OMAP2=y
++# CONFIG_MTD_NAND_OMAP2 is not set
+ CONFIG_MTD_NAND_IDS=y
+ # CONFIG_MTD_NAND_DISKONCHIP is not set
+ # CONFIG_MTD_NAND_NANDSIM is not set
+ # CONFIG_MTD_NAND_PLATFORM is not set
+ # CONFIG_MTD_ALAUDA is not set
+-CONFIG_MTD_ONENAND=y
+-CONFIG_MTD_ONENAND_VERIFY_WRITE=y
+-# CONFIG_MTD_ONENAND_GENERIC is not set
+-CONFIG_MTD_ONENAND_OMAP2=y
+-# CONFIG_MTD_ONENAND_OTP is not set
+-# CONFIG_MTD_ONENAND_2X_PROGRAM is not set
+-# CONFIG_MTD_ONENAND_SIM is not set
++# CONFIG_MTD_ONENAND is not set
+
+ #
+ # LPDDR flash memory drivers
+@@ -537,19 +620,23 @@ CONFIG_MTD_ONENAND_OMAP2=y
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ CONFIG_BLK_DEV_LOOP=y
+-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++CONFIG_BLK_DEV_CRYPTOLOOP=m
+ # CONFIG_BLK_DEV_NBD is not set
+ # CONFIG_BLK_DEV_UB is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=16384
+ # CONFIG_BLK_DEV_XIP is not set
+-# CONFIG_CDROM_PKTCDVD is not set
++CONFIG_CDROM_PKTCDVD=m
++CONFIG_CDROM_PKTCDVD_BUFFERS=8
++# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+ # CONFIG_ATA_OVER_ETH is not set
++# CONFIG_MG_DISK is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_OMAP_STI is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
++# CONFIG_ISL29003 is not set
+ # CONFIG_C2PORT is not set
+
+ #
+@@ -558,14 +645,15 @@ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_AT24 is not set
+ # CONFIG_EEPROM_AT25 is not set
+ # CONFIG_EEPROM_LEGACY is not set
+-# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_EEPROM_MAX6875 is not set
++CONFIG_EEPROM_93CX6=m
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+ #
+ # SCSI device support
+ #
+-# CONFIG_RAID_ATTRS is not set
++CONFIG_RAID_ATTRS=m
+ CONFIG_SCSI=y
+ CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+@@ -579,13 +667,9 @@ CONFIG_BLK_DEV_SD=y
+ # CONFIG_CHR_DEV_ST is not set
+ # CONFIG_CHR_DEV_OSST is not set
+ # CONFIG_BLK_DEV_SR is not set
+-# CONFIG_CHR_DEV_SG is not set
++CONFIG_CHR_DEV_SG=m
+ # CONFIG_CHR_DEV_SCH is not set
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+-# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SCSI_MULTI_LUN=y
+ # CONFIG_SCSI_CONSTANTS is not set
+ # CONFIG_SCSI_LOGGING is not set
+ # CONFIG_SCSI_SCAN_ASYNC is not set
+@@ -602,26 +686,69 @@ CONFIG_SCSI_WAIT_SCAN=m
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+ # CONFIG_LIBFC is not set
++# CONFIG_LIBFCOE is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
+ # CONFIG_ATA is not set
+-# CONFIG_MD is not set
++CONFIG_MD=y
++CONFIG_BLK_DEV_MD=m
++CONFIG_MD_LINEAR=m
++CONFIG_MD_RAID0=m
++CONFIG_MD_RAID1=m
++CONFIG_MD_RAID10=m
++CONFIG_MD_RAID456=m
++CONFIG_MD_RAID6_PQ=m
++CONFIG_MD_MULTIPATH=m
++CONFIG_MD_FAULTY=m
++CONFIG_BLK_DEV_DM=m
++# CONFIG_DM_DEBUG is not set
++CONFIG_DM_CRYPT=m
++CONFIG_DM_SNAPSHOT=m
++CONFIG_DM_MIRROR=m
++# CONFIG_DM_LOG_USERSPACE is not set
++CONFIG_DM_ZERO=m
++CONFIG_DM_MULTIPATH=m
++# CONFIG_DM_MULTIPATH_QL is not set
++# CONFIG_DM_MULTIPATH_ST is not set
++CONFIG_DM_DELAY=m
++# CONFIG_DM_UEVENT is not set
+ CONFIG_NETDEVICES=y
+-# CONFIG_DUMMY is not set
++CONFIG_DUMMY=m
+ # CONFIG_BONDING is not set
+ # CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+-# CONFIG_TUN is not set
++CONFIG_TUN=m
+ # CONFIG_VETH is not set
+-# CONFIG_PHYLIB is not set
++CONFIG_PHYLIB=y
++
++#
++# MII PHY device drivers
++#
++# CONFIG_MARVELL_PHY is not set
++# CONFIG_DAVICOM_PHY is not set
++# CONFIG_QSEMI_PHY is not set
++# CONFIG_LXT_PHY is not set
++# CONFIG_CICADA_PHY is not set
++# CONFIG_VITESSE_PHY is not set
++CONFIG_SMSC_PHY=y
++# CONFIG_BROADCOM_PHY is not set
++# CONFIG_ICPLUS_PHY is not set
++# CONFIG_REALTEK_PHY is not set
++# CONFIG_NATIONAL_PHY is not set
++# CONFIG_STE10XP is not set
++# CONFIG_LSI_ET1011C_PHY is not set
++# CONFIG_FIXED_PHY is not set
++# CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+ # CONFIG_AX88796 is not set
+ CONFIG_SMC91X=y
+ # CONFIG_DM9000 is not set
+ # CONFIG_ENC28J60 is not set
+-# CONFIG_SMC911X is not set
+-# CONFIG_SMSC911X is not set
++# CONFIG_ETHOC is not set
++CONFIG_SMC911X=m
++CONFIG_SMSC911X=m
+ # CONFIG_DNET is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+@@ -631,15 +758,41 @@ CONFIG_SMC91X=y
+ # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+ # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ # CONFIG_B44 is not set
+-CONFIG_NETDEV_1000=y
+-CONFIG_NETDEV_10000=y
++# CONFIG_KS8842 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
+
+ #
+ # Wireless LAN
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+-# CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
++CONFIG_WLAN_80211=y
++CONFIG_LIBERTAS=y
++CONFIG_LIBERTAS_USB=y
++CONFIG_LIBERTAS_SDIO=y
++# CONFIG_LIBERTAS_SPI is not set
++CONFIG_LIBERTAS_DEBUG=y
++# CONFIG_LIBERTAS_THINFIRM is not set
++# CONFIG_AT76C50X_USB is not set
++CONFIG_USB_ZD1201=m
++# CONFIG_USB_NET_RNDIS_WLAN is not set
++CONFIG_RTL8187=m
++CONFIG_RTL8187_LEDS=y
++# CONFIG_MAC80211_HWSIM is not set
++CONFIG_P54_COMMON=m
++CONFIG_P54_USB=m
++# CONFIG_P54_SPI is not set
++CONFIG_P54_LEDS=y
++# CONFIG_AR9170_USB is not set
++CONFIG_HOSTAP=m
++CONFIG_HOSTAP_FIRMWARE=y
++CONFIG_HOSTAP_FIRMWARE_NVRAM=y
++# CONFIG_B43 is not set
++# CONFIG_B43LEGACY is not set
++# CONFIG_ZD1211RW is not set
++# CONFIG_RT2X00 is not set
++# CONFIG_WL12XX is not set
++# CONFIG_IWM is not set
+
+ #
+ # Enable WiMAX (Networking options) to see the WiMAX drivers
+@@ -648,14 +801,43 @@ CONFIG_NETDEV_10000=y
+ #
+ # USB Network Adapters
+ #
+-# CONFIG_USB_CATC is not set
+-# CONFIG_USB_KAWETH is not set
+-# CONFIG_USB_PEGASUS is not set
+-# CONFIG_USB_RTL8150 is not set
+-# CONFIG_USB_USBNET is not set
++CONFIG_USB_CATC=m
++CONFIG_USB_KAWETH=m
++CONFIG_USB_PEGASUS=m
++CONFIG_USB_RTL8150=m
++CONFIG_USB_USBNET=y
++CONFIG_USB_NET_AX8817X=y
++CONFIG_USB_NET_CDCETHER=y
++# CONFIG_USB_NET_CDC_EEM is not set
++CONFIG_USB_NET_DM9601=m
++# CONFIG_USB_NET_SMSC95XX is not set
++CONFIG_USB_NET_GL620A=m
++CONFIG_USB_NET_NET1080=m
++CONFIG_USB_NET_PLUSB=m
++CONFIG_USB_NET_MCS7830=m
++CONFIG_USB_NET_RNDIS_HOST=m
++CONFIG_USB_NET_CDC_SUBSET=m
++CONFIG_USB_ALI_M5632=y
++CONFIG_USB_AN2720=y
++CONFIG_USB_BELKIN=y
++CONFIG_USB_ARMLINUX=y
++CONFIG_USB_EPSON2888=y
++CONFIG_USB_KC2190=y
++CONFIG_USB_NET_ZAURUS=m
++# CONFIG_USB_NET_INT51X1 is not set
+ # CONFIG_WAN is not set
+-# CONFIG_PPP is not set
++CONFIG_PPP=m
++# CONFIG_PPP_MULTILINK is not set
++# CONFIG_PPP_FILTER is not set
++CONFIG_PPP_ASYNC=m
++CONFIG_PPP_SYNC_TTY=m
++CONFIG_PPP_DEFLATE=m
++CONFIG_PPP_BSDCOMP=m
++CONFIG_PPP_MPPE=m
++CONFIG_PPPOE=m
++# CONFIG_PPPOL2TP is not set
+ # CONFIG_SLIP is not set
++CONFIG_SLHC=m
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -671,7 +853,10 @@ CONFIG_INPUT=y
+ #
+ # Userland interfaces
+ #
+-# CONFIG_INPUT_MOUSEDEV is not set
++CONFIG_INPUT_MOUSEDEV=y
++CONFIG_INPUT_MOUSEDEV_PSAUX=y
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
+ CONFIG_INPUT_EVDEV=y
+ # CONFIG_INPUT_EVBUG is not set
+@@ -686,34 +871,34 @@ CONFIG_INPUT_KEYBOARD=y
+ # CONFIG_KEYBOARD_XTKBD is not set
+ # CONFIG_KEYBOARD_NEWTON is not set
+ # CONFIG_KEYBOARD_STOWAWAY is not set
+-CONFIG_KEYBOARD_TWL4030=y
++# CONFIG_KEYBOARD_LM8323 is not set
+ # CONFIG_KEYBOARD_GPIO is not set
+-# CONFIG_INPUT_MOUSE is not set
++CONFIG_INPUT_MOUSE=y
++CONFIG_MOUSE_PS2=y
++CONFIG_MOUSE_PS2_ALPS=y
++CONFIG_MOUSE_PS2_LOGIPS2PP=y
++CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_TRACKPOINT=y
++# CONFIG_MOUSE_PS2_ELANTECH is not set
++# CONFIG_MOUSE_PS2_TOUCHKIT is not set
++# CONFIG_MOUSE_SERIAL is not set
++# CONFIG_MOUSE_APPLETOUCH is not set
++# CONFIG_MOUSE_BCM5974 is not set
++# CONFIG_MOUSE_VSXXXAA is not set
++# CONFIG_MOUSE_GPIO is not set
++# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+ # CONFIG_INPUT_JOYSTICK is not set
+ # CONFIG_INPUT_TABLET is not set
+-CONFIG_INPUT_TOUCHSCREEN=y
+-CONFIG_TOUCHSCREEN_ADS7846=y
+-# CONFIG_TOUCHSCREEN_FUJITSU is not set
+-# CONFIG_TOUCHSCREEN_GUNZE is not set
+-# CONFIG_TOUCHSCREEN_ELO is not set
+-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+-# CONFIG_TOUCHSCREEN_MTOUCH is not set
+-# CONFIG_TOUCHSCREEN_INEXIO is not set
+-# CONFIG_TOUCHSCREEN_MK712 is not set
+-# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+-# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+-# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+-# CONFIG_TOUCHSCREEN_TSC2005 is not set
+-# CONFIG_TOUCHSCREEN_TSC210X is not set
+-# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+-# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+-# CONFIG_TOUCHSCREEN_TSC2007 is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
+ # CONFIG_INPUT_MISC is not set
+
+ #
+ # Hardware I/O ports
+ #
+-# CONFIG_SERIO is not set
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
+ # CONFIG_GAMEPORT is not set
+
+ #
+@@ -723,7 +908,7 @@ CONFIG_VT=y
+ CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+-# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_VT_HW_CONSOLE_BINDING=y
+ CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+@@ -743,6 +928,7 @@ CONFIG_SERIAL_8250_RSA=y
+ #
+ # Non-8250 serial port support
+ #
++# CONFIG_SERIAL_MAX3100 is not set
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ CONFIG_UNIX98_PTYS=y
+@@ -750,6 +936,7 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ CONFIG_HW_RANDOM=y
++# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+@@ -765,6 +952,7 @@ CONFIG_I2C_HELPER_AUTO=y
+ #
+ # I2C system bus drivers (mostly embedded / system-on-chip)
+ #
++# CONFIG_I2C_DESIGNWARE is not set
+ # CONFIG_I2C_GPIO is not set
+ # CONFIG_I2C_OCORES is not set
+ CONFIG_I2C_OMAP=y
+@@ -790,10 +978,6 @@ CONFIG_I2C_OMAP=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+-# CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TWL4030_MADC is not set
+-# CONFIG_TWL4030_POWEROFF is not set
+-# CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+@@ -813,14 +997,12 @@ CONFIG_SPI_OMAP24XX=y
+ #
+ # SPI Protocol Masters
+ #
+-# CONFIG_SPI_TSC210X is not set
+-# CONFIG_SPI_TSC2301 is not set
+ # CONFIG_SPI_SPIDEV is not set
+ # CONFIG_SPI_TLE62X0 is not set
+ CONFIG_ARCH_REQUIRE_GPIOLIB=y
+ CONFIG_GPIOLIB=y
+-# CONFIG_DEBUG_GPIO is not set
+-# CONFIG_GPIO_SYSFS is not set
++CONFIG_DEBUG_GPIO=y
++CONFIG_GPIO_SYSFS=y
+
+ #
+ # Memory mapped GPIO expanders:
+@@ -844,8 +1026,78 @@ CONFIG_GPIO_TWL4030=y
+ # CONFIG_GPIO_MAX7301 is not set
+ # CONFIG_GPIO_MCP23S08 is not set
+ # CONFIG_W1 is not set
+-# CONFIG_POWER_SUPPLY is not set
+-# CONFIG_HWMON is not set
++CONFIG_POWER_SUPPLY=m
++# CONFIG_POWER_SUPPLY_DEBUG is not set
++# CONFIG_PDA_POWER is not set
++# CONFIG_BATTERY_DS2760 is not set
++# CONFIG_BATTERY_BQ27x00 is not set
++# CONFIG_BATTERY_MAX17040 is not set
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_AD7414 is not set
++# CONFIG_SENSORS_AD7418 is not set
++# CONFIG_SENSORS_ADCXX is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ADT7462 is not set
++# CONFIG_SENSORS_ADT7470 is not set
++# CONFIG_SENSORS_ADT7473 is not set
++# CONFIG_SENSORS_ADT7475 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_F71882FG is not set
++# CONFIG_SENSORS_F75375S is not set
++# CONFIG_SENSORS_G760A is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM70 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_LM93 is not set
++# CONFIG_SENSORS_LTC4215 is not set
++# CONFIG_SENSORS_LTC4245 is not set
++# CONFIG_SENSORS_LM95241 is not set
++# CONFIG_SENSORS_MAX1111 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_MAX6650 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_SHT15 is not set
++# CONFIG_SENSORS_DME1737 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_ADS7828 is not set
++# CONFIG_SENSORS_THMC50 is not set
++# CONFIG_SENSORS_TMP401 is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83L786NG is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_SENSORS_LIS3_SPI is not set
++# CONFIG_SENSORS_TSC210X is not set
++# CONFIG_SENSORS_OMAP34XX is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
+ # CONFIG_THERMAL is not set
+ # CONFIG_THERMAL_HWMON is not set
+ CONFIG_WATCHDOG=y
+@@ -855,7 +1107,8 @@ CONFIG_WATCHDOG_NOWAYOUT=y
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_OMAP_WATCHDOG=y
++# CONFIG_OMAP_WATCHDOG is not set
++# CONFIG_TWL4030_WATCHDOG is not set
+
+ #
+ # USB-based Watchdog Cards
+@@ -878,7 +1131,6 @@ CONFIG_SSB_POSSIBLE=y
+ # CONFIG_HTC_PASIC3 is not set
+ # CONFIG_TPS65010 is not set
+ CONFIG_TWL4030_CORE=y
+-# CONFIG_TWL4030_POWER is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_MFD_T7L66XB is not set
+ # CONFIG_MFD_TC6387XB is not set
+@@ -887,29 +1139,15 @@ CONFIG_TWL4030_CORE=y
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+ # CONFIG_MFD_PCF50633 is not set
+-
+-#
+-# Multimedia devices
+-#
+-
+-#
+-# Multimedia core support
+-#
+-# CONFIG_VIDEO_DEV is not set
+-# CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+-CONFIG_DAB=y
+-# CONFIG_USB_DABUSB is not set
++# CONFIG_AB3100_CORE is not set
++# CONFIG_EZX_PCAP is not set
++# CONFIG_MEDIA_SUPPORT is not set
+
+ #
+ # Graphics support
+ #
+ # CONFIG_VGASTATE is not set
+-CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+@@ -936,10 +1174,11 @@ CONFIG_FB_CFB_IMAGEBLIT=m
+ # CONFIG_FB_VIRTUAL is not set
+ # CONFIG_FB_METRONOME is not set
+ # CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
+ # CONFIG_FB_OMAP_LCD_VGA is not set
+ # CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+ CONFIG_OMAP2_DSS=m
+-CONFIG_OMAP2_DSS_VRAM_SIZE=8
++CONFIG_OMAP2_VRAM_SIZE=8
+ CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y
+ # CONFIG_OMAP2_DSS_RFBI is not set
+ CONFIG_OMAP2_DSS_VENC=y
+@@ -965,7 +1204,11 @@ CONFIG_FB_OMAP2_NUM_FBS=3
+ #
+ # Display device support
+ #
+-# CONFIG_DISPLAY_SUPPORT is not set
++CONFIG_DISPLAY_SUPPORT=y
++
++#
++# Display hardware drivers
++#
+
+ #
+ # Console display driver support
+@@ -977,7 +1220,7 @@ CONFIG_DUMMY_CONSOLE=y
+ # CONFIG_SOUND is not set
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+-# CONFIG_HID_DEBUG is not set
++CONFIG_HID_DEBUG=y
+ # CONFIG_HIDRAW is not set
+
+ #
+@@ -990,28 +1233,35 @@ CONFIG_USB_HID=y
+ #
+ # Special HID drivers
+ #
+-CONFIG_HID_COMPAT=y
+-# CONFIG_HID_A4TECH is not set
+-# CONFIG_HID_APPLE is not set
+-# CONFIG_HID_BELKIN is not set
+-# CONFIG_HID_CHERRY is not set
+-# CONFIG_HID_CHICONY is not set
+-# CONFIG_HID_CYPRESS is not set
+-# CONFIG_HID_EZKEY is not set
+-# CONFIG_HID_GYRATION is not set
+-# CONFIG_HID_LOGITECH is not set
+-# CONFIG_HID_MICROSOFT is not set
+-# CONFIG_HID_MONTEREY is not set
++CONFIG_HID_A4TECH=y
++CONFIG_HID_APPLE=y
++CONFIG_HID_BELKIN=y
++CONFIG_HID_CHERRY=y
++CONFIG_HID_CHICONY=y
++CONFIG_HID_CYPRESS=y
++# CONFIG_HID_DRAGONRISE is not set
++CONFIG_HID_EZKEY=y
++# CONFIG_HID_KYE is not set
++CONFIG_HID_GYRATION=y
++# CONFIG_HID_KENSINGTON is not set
++CONFIG_HID_LOGITECH=y
++# CONFIG_LOGITECH_FF is not set
++# CONFIG_LOGIRUMBLEPAD2_FF is not set
++CONFIG_HID_MICROSOFT=y
++CONFIG_HID_MONTEREY=y
+ # CONFIG_HID_NTRIG is not set
+-# CONFIG_HID_PANTHERLORD is not set
+-# CONFIG_HID_PETALYNX is not set
+-# CONFIG_HID_SAMSUNG is not set
+-# CONFIG_HID_SONY is not set
+-# CONFIG_HID_SUNPLUS is not set
+-# CONFIG_GREENASIA_FF is not set
++CONFIG_HID_PANTHERLORD=y
++# CONFIG_PANTHERLORD_FF is not set
++CONFIG_HID_PETALYNX=y
++CONFIG_HID_SAMSUNG=y
++CONFIG_HID_SONY=y
++CONFIG_HID_SUNPLUS=y
++# CONFIG_HID_GREENASIA is not set
++# CONFIG_HID_SMARTJOYPLUS is not set
+ # CONFIG_HID_TOPSEED is not set
+-# CONFIG_THRUSTMASTER_FF is not set
+-# CONFIG_ZEROPLUS_FF is not set
++# CONFIG_HID_THRUSTMASTER is not set
++# CONFIG_HID_WACOM is not set
++# CONFIG_HID_ZEROPLUS is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+@@ -1024,8 +1274,8 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+ # Miscellaneous USB options
+ #
+ CONFIG_USB_DEVICEFS=y
+-# CONFIG_USB_DEVICE_CLASS is not set
+-# CONFIG_USB_DYNAMIC_MINORS is not set
++CONFIG_USB_DEVICE_CLASS=y
++CONFIG_USB_DYNAMIC_MINORS=y
+ CONFIG_USB_SUSPEND=y
+ CONFIG_USB_OTG=y
+ # CONFIG_USB_OTG_WHITELIST is not set
+@@ -1038,13 +1288,10 @@ CONFIG_USB_MON=y
+ # USB Host Controller Drivers
+ #
+ # CONFIG_USB_C67X00_HCD is not set
+-CONFIG_USB_EHCI_HCD=m
+-CONFIG_OMAP_EHCI_PHY_MODE=y
+-# CONFIG_OMAP_EHCI_TLL_MODE is not set
+-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
++# CONFIG_USB_EHCI_HCD is not set
+ # CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ # CONFIG_USB_OHCI_HCD is not set
+ # CONFIG_USB_SL811_HCD is not set
+ # CONFIG_USB_R8A66597_HCD is not set
+@@ -1060,28 +1307,26 @@ CONFIG_USB_MUSB_SOC=y
+ CONFIG_USB_MUSB_OTG=y
+ CONFIG_USB_GADGET_MUSB_HDRC=y
+ CONFIG_USB_MUSB_HDRC_HCD=y
+-# CONFIG_MUSB_PIO_ONLY is not set
+-CONFIG_USB_INVENTRA_DMA=y
+-# CONFIG_USB_TI_CPPI_DMA is not set
++CONFIG_MUSB_PIO_ONLY=y
+ # CONFIG_USB_MUSB_DEBUG is not set
+
+ #
+ # USB Device Class drivers
+ #
+ # CONFIG_USB_ACM is not set
+-# CONFIG_USB_PRINTER is not set
+-# CONFIG_USB_WDM is not set
++CONFIG_USB_PRINTER=y
++CONFIG_USB_WDM=y
+ # CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# also be needed; see USB_STORAGE Help for more info
+ #
+ CONFIG_USB_STORAGE=y
+-CONFIG_USB_STORAGE_DEBUG=y
++# CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
+@@ -1120,7 +1365,6 @@ CONFIG_USB_STORAGE_DEBUG=y
+ # CONFIG_USB_LED is not set
+ # CONFIG_USB_CYPRESS_CY7C63 is not set
+ # CONFIG_USB_CYTHERM is not set
+-# CONFIG_USB_PHIDGET is not set
+ # CONFIG_USB_IDMOUSE is not set
+ # CONFIG_USB_FTDI_ELAN is not set
+ # CONFIG_USB_APPLEDISPLAY is not set
+@@ -1128,12 +1372,12 @@ CONFIG_USB_STORAGE_DEBUG=y
+ # CONFIG_USB_LD is not set
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+-CONFIG_USB_TEST=y
++# CONFIG_USB_TEST is not set
+ # CONFIG_USB_ISIGHTFW is not set
+ # CONFIG_USB_VST is not set
+ CONFIG_USB_GADGET=y
+-CONFIG_USB_GADGET_DEBUG=y
+-CONFIG_USB_GADGET_DEBUG_FILES=y
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
+ # CONFIG_USB_GADGET_DEBUG_FS is not set
+ CONFIG_USB_GADGET_VBUS_DRAW=2
+ CONFIG_USB_GADGET_SELECTED=y
+@@ -1144,6 +1388,7 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_OMAP is not set
+ # CONFIG_USB_GADGET_PXA25X is not set
+ # CONFIG_USB_GADGET_PXA27X is not set
++# CONFIG_USB_GADGET_S3C_HSOTG is not set
+ # CONFIG_USB_GADGET_S3C2410 is not set
+ # CONFIG_USB_GADGET_IMX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
+@@ -1152,11 +1397,13 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_CI13XXX is not set
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_GOKU is not set
++# CONFIG_USB_GADGET_LANGWELL is not set
+ # CONFIG_USB_GADGET_DUMMY_HCD is not set
+ CONFIG_USB_GADGET_DUALSPEED=y
+-CONFIG_USB_ZERO=m
+-# CONFIG_USB_ZERO_HNPTEST is not set
+-# CONFIG_USB_ETH is not set
++# CONFIG_USB_ZERO is not set
++# CONFIG_USB_AUDIO is not set
++CONFIG_USB_ETH=m
++CONFIG_USB_ETH_RNDIS=y
+ # CONFIG_USB_GADGETFS is not set
+ # CONFIG_USB_FILE_STORAGE is not set
+ # CONFIG_USB_G_SERIAL is not set
+@@ -1171,27 +1418,57 @@ CONFIG_USB_OTG_UTILS=y
+ # CONFIG_USB_GPIO_VBUS is not set
+ # CONFIG_ISP1301_OMAP is not set
+ CONFIG_TWL4030_USB=y
++# CONFIG_NOP_USB_XCEIV is not set
+ CONFIG_MMC=y
+ # CONFIG_MMC_DEBUG is not set
+-# CONFIG_MMC_UNSAFE_RESUME is not set
++CONFIG_MMC_UNSAFE_RESUME=y
+
+ #
+ # MMC/SD/SDIO Card Drivers
+ #
+ CONFIG_MMC_BLOCK=y
+ CONFIG_MMC_BLOCK_BOUNCE=y
+-# CONFIG_SDIO_UART is not set
++CONFIG_SDIO_UART=y
+ # CONFIG_MMC_TEST is not set
+
+ #
+ # MMC/SD/SDIO Host Controller Drivers
+ #
+ # CONFIG_MMC_SDHCI is not set
+-CONFIG_MMC_OMAP_HS=m
++CONFIG_MMC_OMAP_HS=y
+ # CONFIG_MMC_SPI is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_ACCESSIBILITY is not set
+-# CONFIG_NEW_LEDS is not set
++CONFIG_NEW_LEDS=y
++CONFIG_LEDS_CLASS=y
++
++#
++# LED drivers
++#
++# CONFIG_LEDS_OMAP_DEBUG is not set
++# CONFIG_LEDS_OMAP is not set
++# CONFIG_LEDS_OMAP_PWM is not set
++# CONFIG_LEDS_PCA9532 is not set
++CONFIG_LEDS_GPIO=y
++CONFIG_LEDS_GPIO_PLATFORM=y
++# CONFIG_LEDS_LP5521 is not set
++# CONFIG_LEDS_PCA955X is not set
++# CONFIG_LEDS_DAC124S085 is not set
++# CONFIG_LEDS_BD2802 is not set
++
++#
++# LED Triggers
++#
++CONFIG_LEDS_TRIGGERS=y
++CONFIG_LEDS_TRIGGER_TIMER=y
++CONFIG_LEDS_TRIGGER_HEARTBEAT=y
++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
++# CONFIG_LEDS_TRIGGER_GPIO is not set
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++
++#
++# iptables trigger is under Netfilter config (LED target)
++#
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -1224,6 +1501,7 @@ CONFIG_RTC_DRV_TWL4030=y
+ # CONFIG_RTC_DRV_S35390A is not set
+ # CONFIG_RTC_DRV_FM3130 is not set
+ # CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
+
+ #
+ # SPI RTC drivers
+@@ -1255,12 +1533,16 @@ CONFIG_RTC_DRV_TWL4030=y
+ # on-CPU RTC drivers
+ #
+ # CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
+ CONFIG_REGULATOR=y
+ # CONFIG_REGULATOR_DEBUG is not set
+ # CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+ # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+ # CONFIG_REGULATOR_BQ24022 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
+ CONFIG_REGULATOR_TWL4030=y
++# CONFIG_REGULATOR_LP3971 is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
+
+@@ -1276,17 +1558,24 @@ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+ # CONFIG_EXT3_FS_XATTR is not set
+ # CONFIG_EXT4_FS is not set
+ CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-# CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+-# CONFIG_XFS_FS is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_XFS_FS=m
++# CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_POSIX_ACL is not set
++# CONFIG_XFS_RT is not set
++# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ # CONFIG_BTRFS_FS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_FSNOTIFY=y
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1299,13 +1588,22 @@ CONFIG_QFMT_V2=y
+ CONFIG_QUOTACTL=y
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+-# CONFIG_FUSE_FS is not set
++CONFIG_FUSE_FS=m
++# CONFIG_CUSE is not set
++
++#
++# Caches
++#
++# CONFIG_FSCACHE is not set
+
+ #
+ # CD-ROM/DVD Filesystems
+ #
+-# CONFIG_ISO9660_FS is not set
+-# CONFIG_UDF_FS is not set
++CONFIG_ISO9660_FS=m
++CONFIG_JOLIET=y
++CONFIG_ZISOFS=y
++CONFIG_UDF_FS=m
++CONFIG_UDF_NLS=y
+
+ #
+ # DOS/FAT/NT Filesystems
+@@ -1340,13 +1638,15 @@ CONFIG_JFFS2_FS=y
+ CONFIG_JFFS2_FS_DEBUG=0
+ CONFIG_JFFS2_FS_WRITEBUFFER=y
+ # CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+-# CONFIG_JFFS2_SUMMARY is not set
+-# CONFIG_JFFS2_FS_XATTR is not set
++CONFIG_JFFS2_SUMMARY=y
++CONFIG_JFFS2_FS_XATTR=y
++CONFIG_JFFS2_FS_POSIX_ACL=y
++CONFIG_JFFS2_FS_SECURITY=y
+ CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+ CONFIG_JFFS2_ZLIB=y
+-# CONFIG_JFFS2_LZO is not set
++CONFIG_JFFS2_LZO=y
+ CONFIG_JFFS2_RTIME=y
+-# CONFIG_JFFS2_RUBIN is not set
++CONFIG_JFFS2_RUBIN=y
+ # CONFIG_JFFS2_CMODE_NONE is not set
+ CONFIG_JFFS2_CMODE_PRIORITY=y
+ # CONFIG_JFFS2_CMODE_SIZE is not set
+@@ -1361,19 +1661,21 @@ CONFIG_JFFS2_CMODE_PRIORITY=y
+ # CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
++# CONFIG_NFS_V4_1 is not set
+ CONFIG_ROOT_NFS=y
+ # CONFIG_NFSD is not set
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=m
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ # CONFIG_SMB_FS is not set
+@@ -1461,11 +1763,16 @@ CONFIG_DEBUG_KERNEL=y
+ CONFIG_DETECT_SOFTLOCKUP=y
+ # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
++CONFIG_DETECT_HUNG_TASK=y
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+-# CONFIG_SCHEDSTATS is not set
+-# CONFIG_TIMER_STATS is not set
++CONFIG_SCHEDSTATS=y
++CONFIG_TIMER_STATS=y
+ # CONFIG_DEBUG_OBJECTS is not set
+-# CONFIG_DEBUG_SLAB is not set
++# CONFIG_SLUB_DEBUG_ON is not set
++# CONFIG_SLUB_STATS is not set
++# CONFIG_DEBUG_KMEMLEAK is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -1475,16 +1782,16 @@ CONFIG_DEBUG_MUTEXES=y
+ # CONFIG_LOCK_STAT is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++CONFIG_STACKTRACE=y
+ # CONFIG_DEBUG_KOBJECT is not set
+ CONFIG_DEBUG_BUGVERBOSE=y
+-CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+ # CONFIG_DEBUG_WRITECOUNT is not set
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_DEBUG_NOTIFIERS is not set
+-CONFIG_FRAME_POINTER=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1492,22 +1799,33 @@ CONFIG_FRAME_POINTER=y
+ # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
++# CONFIG_PAGE_POISONING is not set
++CONFIG_NOP_TRACER=y
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-
+-#
+-# Tracers
+-#
++CONFIG_RING_BUFFER=y
++CONFIG_EVENT_TRACING=y
++CONFIG_CONTEXT_SWITCH_TRACER=y
++CONFIG_TRACING=y
++CONFIG_TRACING_SUPPORT=y
++CONFIG_FTRACE=y
+ # CONFIG_FUNCTION_TRACER is not set
+ # CONFIG_IRQSOFF_TRACER is not set
+ # CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
++# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
++CONFIG_BRANCH_PROFILE_NONE=y
++# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
++# CONFIG_PROFILE_ALL_BRANCHES is not set
+ # CONFIG_STACK_TRACER is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
++# CONFIG_KMEMTRACE is not set
++# CONFIG_WORKQUEUE_TRACER is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_RING_BUFFER_BENCHMARK is not set
++# CONFIG_DYNAMIC_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
+ CONFIG_DEBUG_USER=y
+ CONFIG_DEBUG_ERRORS=y
+ # CONFIG_DEBUG_STACK_USAGE is not set
+@@ -1520,6 +1838,10 @@ CONFIG_DEBUG_ERRORS=y
+ # CONFIG_SECURITY is not set
+ # CONFIG_SECURITYFS is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_XOR_BLOCKS=m
++CONFIG_ASYNC_CORE=m
++CONFIG_ASYNC_MEMCPY=m
++CONFIG_ASYNC_XOR=m
+ CONFIG_CRYPTO=y
+
+ #
+@@ -1534,13 +1856,15 @@ CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_HASH2=y
+ CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_PCOMP=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_GF128MUL is not set
+-# CONFIG_CRYPTO_NULL is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_GF128MUL=m
++CONFIG_CRYPTO_NULL=m
++CONFIG_CRYPTO_WORKQUEUE=y
++CONFIG_CRYPTO_CRYPTD=m
+ # CONFIG_CRYPTO_AUTHENC is not set
+-# CONFIG_CRYPTO_TEST is not set
++CONFIG_CRYPTO_TEST=m
+
+ #
+ # Authenticated Encryption with Associated Data
+@@ -1555,57 +1879,59 @@ CONFIG_CRYPTO_MANAGER2=y
+ CONFIG_CRYPTO_CBC=y
+ # CONFIG_CRYPTO_CTR is not set
+ # CONFIG_CRYPTO_CTS is not set
+-CONFIG_CRYPTO_ECB=m
+-# CONFIG_CRYPTO_LRW is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_LRW=m
+ CONFIG_CRYPTO_PCBC=m
+ # CONFIG_CRYPTO_XTS is not set
+
+ #
+ # Hash modes
+ #
+-# CONFIG_CRYPTO_HMAC is not set
+-# CONFIG_CRYPTO_XCBC is not set
++CONFIG_CRYPTO_HMAC=m
++CONFIG_CRYPTO_XCBC=m
+
+ #
+ # Digest
+ #
+ CONFIG_CRYPTO_CRC32C=y
+-# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
++CONFIG_CRYPTO_MICHAEL_MIC=y
+ # CONFIG_CRYPTO_RMD128 is not set
+ # CONFIG_CRYPTO_RMD160 is not set
+ # CONFIG_CRYPTO_RMD256 is not set
+ # CONFIG_CRYPTO_RMD320 is not set
+-# CONFIG_CRYPTO_SHA1 is not set
+-# CONFIG_CRYPTO_SHA256 is not set
+-# CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+-# CONFIG_CRYPTO_WP512 is not set
++CONFIG_CRYPTO_SHA1=m
++CONFIG_CRYPTO_SHA256=m
++CONFIG_CRYPTO_SHA512=m
++CONFIG_CRYPTO_TGR192=m
++CONFIG_CRYPTO_WP512=m
+
+ #
+ # Ciphers
+ #
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-# CONFIG_CRYPTO_CAST5 is not set
+-# CONFIG_CRYPTO_CAST6 is not set
++CONFIG_CRYPTO_AES=y
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_ARC4=y
++CONFIG_CRYPTO_BLOWFISH=m
++CONFIG_CRYPTO_CAMELLIA=m
++CONFIG_CRYPTO_CAST5=m
++CONFIG_CRYPTO_CAST6=m
+ CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
+-# CONFIG_CRYPTO_KHAZAD is not set
++CONFIG_CRYPTO_FCRYPT=m
++CONFIG_CRYPTO_KHAZAD=m
+ # CONFIG_CRYPTO_SALSA20 is not set
+ # CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
+
+ #
+ # Compression
+ #
+-# CONFIG_CRYPTO_DEFLATE is not set
++CONFIG_CRYPTO_DEFLATE=m
++# CONFIG_CRYPTO_ZLIB is not set
+ # CONFIG_CRYPTO_LZO is not set
+
+ #
+@@ -1613,6 +1939,7 @@ CONFIG_CRYPTO_DES=y
+ #
+ # CONFIG_CRYPTO_ANSI_CPRNG is not set
+ CONFIG_CRYPTO_HW=y
++CONFIG_BINARY_PRINTF=y
+
+ #
+ # Library routines
+@@ -1620,15 +1947,18 @@ CONFIG_CRYPTO_HW=y
+ CONFIG_BITREVERSE=y
+ CONFIG_GENERIC_FIND_LAST_BIT=y
+ CONFIG_CRC_CCITT=y
+-# CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+-# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC16=m
++CONFIG_CRC_T10DIF=y
++CONFIG_CRC_ITU_T=y
+ CONFIG_CRC32=y
+-# CONFIG_CRC7 is not set
++CONFIG_CRC7=y
+ CONFIG_LIBCRC32C=y
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=y
+-CONFIG_PLIST=y
++CONFIG_LZO_COMPRESS=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_DECOMPRESS_GZIP=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0145-DSS2-BEAGLE-get-DSS2-working-again-on-beagle.patch b/recipes/linux/linux-omap-pm/dss2/0145-DSS2-BEAGLE-get-DSS2-working-again-on-beagle.patch
new file mode 100644
index 0000000000..dee24393c5
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0145-DSS2-BEAGLE-get-DSS2-working-again-on-beagle.patch
@@ -0,0 +1,724 @@
+From 9389c500be4538327d33d656b73f0830cbb24d8d Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Thu, 2 Jul 2009 17:03:35 +0300
+Subject: [PATCH 145/146] DSS2: BEAGLE: get DSS2 working again on beagle
+
+---
+ arch/arm/configs/dss_omap3_beagle_defconfig | 185 +++++++++++++++------------
+ arch/arm/mach-omap2/board-omap3beagle.c | 30 +---
+ 2 files changed, 111 insertions(+), 104 deletions(-)
+
+diff --git a/arch/arm/configs/dss_omap3_beagle_defconfig b/arch/arm/configs/dss_omap3_beagle_defconfig
+index 7143168..2d6a70f 100644
+--- a/arch/arm/configs/dss_omap3_beagle_defconfig
++++ b/arch/arm/configs/dss_omap3_beagle_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-omap1
+-# Thu Apr 2 11:24:09 2009
++# Linux kernel version: 2.6.31-rc1-omap1
++# Thu Jul 2 17:25:47 2009
+ #
+ CONFIG_ARM=y
+ CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+@@ -9,7 +9,6 @@ CONFIG_GENERIC_GPIO=y
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_MMU=y
+-# CONFIG_NO_IOPORT is not set
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_STACKTRACE_SUPPORT=y
+ CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+@@ -18,13 +17,12 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+ CONFIG_HARDIRQS_SW_RESEND=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+ CONFIG_VECTORS_BASE=0xffff0000
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++CONFIG_CONSTRUCTORS=y
+
+ #
+ # General setup
+@@ -33,7 +31,7 @@ CONFIG_EXPERIMENTAL=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+ CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
++# CONFIG_LOCALVERSION_AUTO is not set
+ CONFIG_SWAP=y
+ CONFIG_SYSVIPC=y
+ CONFIG_SYSVIPC_SYSCTL=y
+@@ -65,6 +63,9 @@ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_NAMESPACES is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
++CONFIG_RD_GZIP=y
++# CONFIG_RD_BZIP2 is not set
++# CONFIG_RD_LZMA is not set
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+ CONFIG_ANON_INODES=y
+@@ -86,17 +87,29 @@ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_AIO=y
++
++#
++# Performance Counters
++#
+ CONFIG_VM_EVENT_COUNTERS=y
++# CONFIG_STRIP_ASM_SYMS is not set
+ CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
+ CONFIG_HAVE_CLK=y
++
++#
++# GCOV-based kernel profiling
++#
++# CONFIG_GCOV_KERNEL is not set
++# CONFIG_SLOW_WORK is not set
+ CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+@@ -108,8 +121,7 @@ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODVERSIONS=y
+ CONFIG_MODULE_SRCVERSION_ALL=y
+ CONFIG_BLOCK=y
+-# CONFIG_LBD is not set
+-# CONFIG_BLK_DEV_IO_TRACE is not set
++CONFIG_LBDAF=y
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -136,12 +148,14 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
+ # CONFIG_ARCH_VERSATILE is not set
+ # CONFIG_ARCH_AT91 is not set
+ # CONFIG_ARCH_CLPS711X is not set
++# CONFIG_ARCH_GEMINI is not set
+ # CONFIG_ARCH_EBSA110 is not set
+ # CONFIG_ARCH_EP93XX is not set
+ # CONFIG_ARCH_FOOTBRIDGE is not set
++# CONFIG_ARCH_MXC is not set
++# CONFIG_ARCH_STMP3XXX is not set
+ # CONFIG_ARCH_NETX is not set
+ # CONFIG_ARCH_H720X is not set
+-# CONFIG_ARCH_IMX is not set
+ # CONFIG_ARCH_IOP13XX is not set
+ # CONFIG_ARCH_IOP32X is not set
+ # CONFIG_ARCH_IOP33X is not set
+@@ -150,24 +164,25 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
+ # CONFIG_ARCH_IXP4XX is not set
+ # CONFIG_ARCH_L7200 is not set
+ # CONFIG_ARCH_KIRKWOOD is not set
+-# CONFIG_ARCH_KS8695 is not set
+-# CONFIG_ARCH_NS9XXX is not set
+ # CONFIG_ARCH_LOKI is not set
+ # CONFIG_ARCH_MV78XX0 is not set
+-# CONFIG_ARCH_MXC is not set
+ # CONFIG_ARCH_ORION5X is not set
++# CONFIG_ARCH_MMP is not set
++# CONFIG_ARCH_KS8695 is not set
++# CONFIG_ARCH_NS9XXX is not set
++# CONFIG_ARCH_W90X900 is not set
+ # CONFIG_ARCH_PNX4008 is not set
+ # CONFIG_ARCH_PXA is not set
++# CONFIG_ARCH_MSM is not set
+ # CONFIG_ARCH_RPC is not set
+ # CONFIG_ARCH_SA1100 is not set
+ # CONFIG_ARCH_S3C2410 is not set
+ # CONFIG_ARCH_S3C64XX is not set
+ # CONFIG_ARCH_SHARK is not set
+ # CONFIG_ARCH_LH7A40X is not set
++# CONFIG_ARCH_U300 is not set
+ # CONFIG_ARCH_DAVINCI is not set
+ CONFIG_ARCH_OMAP=y
+-# CONFIG_ARCH_MSM is not set
+-# CONFIG_ARCH_W90X900 is not set
+
+ #
+ # TI OMAP Implementations
+@@ -176,29 +191,26 @@ CONFIG_ARCH_OMAP_OTG=y
+ # CONFIG_ARCH_OMAP1 is not set
+ # CONFIG_ARCH_OMAP2 is not set
+ CONFIG_ARCH_OMAP3=y
++# CONFIG_ARCH_OMAP4 is not set
+
+ #
+ # OMAP Feature Selections
+ #
+ # CONFIG_OMAP_DEBUG_POWERDOMAIN is not set
+ # CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set
+-# CONFIG_OMAP_SMARTREFLEX is not set
+ # CONFIG_OMAP_RESET_CLOCKS is not set
+-CONFIG_OMAP_BOOT_TAG=y
+-CONFIG_OMAP_BOOT_REASON=y
+-# CONFIG_OMAP_COMPONENT_VERSION is not set
+-# CONFIG_OMAP_GPIO_SWITCH is not set
+ # CONFIG_OMAP_MUX is not set
+ # CONFIG_OMAP_MCBSP is not set
+ # CONFIG_OMAP_MBOX_FWK is not set
+ # CONFIG_OMAP_MPU_TIMER is not set
+ CONFIG_OMAP_32K_TIMER=y
+ CONFIG_OMAP_32K_TIMER_HZ=128
+-CONFIG_OMAP_TICK_GPTIMER=12
+ CONFIG_OMAP_DM_TIMER=y
+ # CONFIG_OMAP_LL_DEBUG_UART1 is not set
+ # CONFIG_OMAP_LL_DEBUG_UART2 is not set
+ CONFIG_OMAP_LL_DEBUG_UART3=y
++CONFIG_OMAP2_VRAM=y
++CONFIG_OMAP2_VRFB=y
+ CONFIG_ARCH_OMAP34XX=y
+ CONFIG_ARCH_OMAP3430=y
+
+@@ -212,6 +224,7 @@ CONFIG_ARCH_OMAP3430=y
+ CONFIG_MACH_OMAP3_BEAGLE=y
+ # CONFIG_MACH_OVERO is not set
+ # CONFIG_MACH_OMAP3_PANDORA is not set
++# CONFIG_MACH_OMAP_ZOOM2 is not set
+
+ #
+ # Processor Type
+@@ -239,7 +252,10 @@ CONFIG_ARM_THUMB=y
+ # CONFIG_CPU_DCACHE_DISABLE is not set
+ # CONFIG_CPU_BPREDICT_DISABLE is not set
+ CONFIG_HAS_TLS_REG=y
+-# CONFIG_OUTER_CACHE is not set
++# CONFIG_ARM_ERRATA_430973 is not set
++# CONFIG_ARM_ERRATA_458693 is not set
++# CONFIG_ARM_ERRATA_460075 is not set
++CONFIG_COMMON_CLKDEV=y
+
+ #
+ # Bus support
+@@ -263,9 +279,9 @@ CONFIG_PAGE_OFFSET=0xC0000000
+ CONFIG_HZ=128
+ CONFIG_AEABI=y
+ CONFIG_OABI_COMPAT=y
+-CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+ # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+ # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_HIGHMEM is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+@@ -277,16 +293,19 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
++CONFIG_HAVE_MLOCK=y
++CONFIG_HAVE_MLOCKED_PAGE_BIT=y
++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+ # CONFIG_LEDS is not set
+ CONFIG_ALIGNMENT_TRAP=y
++# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+ #
+ # Boot options
+ #
+ CONFIG_ZBOOT_ROM_TEXT=0x0
+ CONFIG_ZBOOT_ROM_BSS=0x0
+-CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.2.14:/tftpboot/rootfs ip=192.168.2.15 nolock,rsize=1024,wsize=1024 rw"
++CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.2.14:/tftpboot/rootfs ip=192.168.2.15 nolock,rsize=1024,wsize=1024 rw console=ttyS2,115200n8"
+ # CONFIG_XIP_KERNEL is not set
+ # CONFIG_KEXEC is not set
+
+@@ -322,17 +341,13 @@ CONFIG_BINFMT_MISC=y
+ #
+ # Power management options
+ #
+-CONFIG_PM=y
+-# CONFIG_PM_DEBUG is not set
+-# CONFIG_SUSPEND is not set
+-# CONFIG_APM_EMULATION is not set
++# CONFIG_PM is not set
+ CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -388,6 +403,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++# CONFIG_PHONET is not set
++# CONFIG_IEEE802154 is not set
+ # CONFIG_NET_SCHED is not set
+ # CONFIG_DCB is not set
+
+@@ -400,13 +417,16 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+ CONFIG_WIRELESS=y
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
++# CONFIG_WIRELESS_OLD_REGULATORY is not set
+ # CONFIG_WIRELESS_EXT is not set
+ # CONFIG_LIB80211 is not set
+-# CONFIG_MAC80211 is not set
++
++#
++# CFG80211 needs to be enabled for MAC80211
++#
++CONFIG_MAC80211_DEFAULT_PS_VALUE=0
+ # CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+@@ -493,7 +513,7 @@ CONFIG_MTD_NAND=y
+ # CONFIG_MTD_NAND_ECC_SMC is not set
+ # CONFIG_MTD_NAND_MUSEUM_IDS is not set
+ # CONFIG_MTD_NAND_GPIO is not set
+-CONFIG_MTD_NAND_OMAP2=y
++# CONFIG_MTD_NAND_OMAP2 is not set
+ CONFIG_MTD_NAND_IDS=y
+ # CONFIG_MTD_NAND_DISKONCHIP is not set
+ # CONFIG_MTD_NAND_NANDSIM is not set
+@@ -521,6 +541,7 @@ CONFIG_BLK_DEV_RAM_SIZE=16384
+ # CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
++# CONFIG_MG_DISK is not set
+ # CONFIG_MISC_DEVICES is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+@@ -544,10 +565,6 @@ CONFIG_BLK_DEV_SD=y
+ # CONFIG_BLK_DEV_SR is not set
+ # CONFIG_CHR_DEV_SG is not set
+ # CONFIG_CHR_DEV_SCH is not set
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+ # CONFIG_SCSI_MULTI_LUN is not set
+ # CONFIG_SCSI_CONSTANTS is not set
+ # CONFIG_SCSI_LOGGING is not set
+@@ -565,8 +582,10 @@ CONFIG_SCSI_WAIT_SCAN=m
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+ # CONFIG_LIBFC is not set
++# CONFIG_LIBFCOE is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_DH is not set
++# CONFIG_SCSI_OSD_INITIATOR is not set
+ # CONFIG_ATA is not set
+ # CONFIG_MD is not set
+ CONFIG_NETDEVICES=y
+@@ -585,7 +604,6 @@ CONFIG_NETDEVICES=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+
+ #
+ # Enable WiMAX (Networking options) to see the WiMAX drivers
+@@ -663,6 +681,7 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+ CONFIG_HW_RANDOM=y
++# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+@@ -678,6 +697,7 @@ CONFIG_I2C_HELPER_AUTO=y
+ #
+ # I2C system bus drivers (mostly embedded / system-on-chip)
+ #
++# CONFIG_I2C_DESIGNWARE is not set
+ # CONFIG_I2C_GPIO is not set
+ # CONFIG_I2C_OCORES is not set
+ CONFIG_I2C_OMAP=y
+@@ -702,10 +722,6 @@ CONFIG_I2C_OMAP=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+-# CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_TWL4030_MADC is not set
+-# CONFIG_TWL4030_POWEROFF is not set
+-# CONFIG_SENSORS_MAX6875 is not set
+ # CONFIG_SENSORS_TSL2550 is not set
+ # CONFIG_I2C_DEBUG_CORE is not set
+ # CONFIG_I2C_DEBUG_ALGO is not set
+@@ -727,7 +743,7 @@ CONFIG_GPIOLIB=y
+ # CONFIG_GPIO_MAX732X is not set
+ # CONFIG_GPIO_PCA953X is not set
+ # CONFIG_GPIO_PCF857X is not set
+-CONFIG_GPIO_TWL4030=y
++# CONFIG_GPIO_TWL4030 is not set
+
+ #
+ # PCI GPIO expanders:
+@@ -759,7 +775,6 @@ CONFIG_SSB_POSSIBLE=y
+ # CONFIG_HTC_PASIC3 is not set
+ # CONFIG_TPS65010 is not set
+ CONFIG_TWL4030_CORE=y
+-# CONFIG_TWL4030_POWER is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_MFD_T7L66XB is not set
+ # CONFIG_MFD_TC6387XB is not set
+@@ -768,22 +783,8 @@ CONFIG_TWL4030_CORE=y
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+ # CONFIG_MFD_PCF50633 is not set
+-
+-#
+-# Multimedia devices
+-#
+-
+-#
+-# Multimedia core support
+-#
+-# CONFIG_VIDEO_DEV is not set
+-# CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+-CONFIG_DAB=y
++# CONFIG_AB3100_CORE is not set
++# CONFIG_MEDIA_SUPPORT is not set
+
+ #
+ # Graphics support
+@@ -816,9 +817,10 @@ CONFIG_FB_CFB_IMAGEBLIT=m
+ # CONFIG_FB_VIRTUAL is not set
+ # CONFIG_FB_METRONOME is not set
+ # CONFIG_FB_MB862XX is not set
++# CONFIG_FB_BROADSHEET is not set
+ # CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+ CONFIG_OMAP2_DSS=m
+-CONFIG_OMAP2_DSS_VRAM_SIZE=12
++CONFIG_OMAP2_VRAM_SIZE=8
+ CONFIG_OMAP2_DSS_DEBUG_SUPPORT=y
+ # CONFIG_OMAP2_DSS_RFBI is not set
+ CONFIG_OMAP2_DSS_VENC=y
+@@ -860,8 +862,8 @@ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ # CONFIG_USB is not set
+-# CONFIG_USB_OTG_WHITELIST is not set
+-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
++CONFIG_USB_OTG_WHITELIST=y
++CONFIG_USB_OTG_BLACKLIST_HUB=y
+ CONFIG_USB_MUSB_HDRC=y
+ CONFIG_USB_MUSB_SOC=y
+
+@@ -878,7 +880,7 @@ CONFIG_USB_INVENTRA_DMA=y
+ # CONFIG_USB_MUSB_DEBUG is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+ #
+ CONFIG_USB_GADGET=y
+ # CONFIG_USB_GADGET_DEBUG is not set
+@@ -893,6 +895,7 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_OMAP is not set
+ # CONFIG_USB_GADGET_PXA25X is not set
+ # CONFIG_USB_GADGET_PXA27X is not set
++# CONFIG_USB_GADGET_S3C_HSOTG is not set
+ # CONFIG_USB_GADGET_S3C2410 is not set
+ # CONFIG_USB_GADGET_IMX is not set
+ # CONFIG_USB_GADGET_M66592 is not set
+@@ -901,9 +904,11 @@ CONFIG_USB_GADGET_SELECTED=y
+ # CONFIG_USB_GADGET_CI13XXX is not set
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_GOKU is not set
++# CONFIG_USB_GADGET_LANGWELL is not set
+ # CONFIG_USB_GADGET_DUMMY_HCD is not set
+ CONFIG_USB_GADGET_DUALSPEED=y
+ # CONFIG_USB_ZERO is not set
++# CONFIG_USB_AUDIO is not set
+ CONFIG_USB_ETH=y
+ CONFIG_USB_ETH_RNDIS=y
+ # CONFIG_USB_GADGETFS is not set
+@@ -920,6 +925,7 @@ CONFIG_USB_OTG_UTILS=y
+ # CONFIG_USB_GPIO_VBUS is not set
+ # CONFIG_ISP1301_OMAP is not set
+ CONFIG_TWL4030_USB=y
++# CONFIG_NOP_USB_XCEIV is not set
+ CONFIG_MMC=y
+ # CONFIG_MMC_DEBUG is not set
+ # CONFIG_MMC_UNSAFE_RESUME is not set
+@@ -936,7 +942,7 @@ CONFIG_MMC_BLOCK_BOUNCE=y
+ # MMC/SD/SDIO Host Controller Drivers
+ #
+ # CONFIG_MMC_SDHCI is not set
+-CONFIG_MMC_OMAP_HS=y
++# CONFIG_MMC_OMAP_HS is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_ACCESSIBILITY is not set
+ # CONFIG_NEW_LEDS is not set
+@@ -968,10 +974,11 @@ CONFIG_RTC_INTF_DEV=y
+ # CONFIG_RTC_DRV_PCF8563 is not set
+ # CONFIG_RTC_DRV_PCF8583 is not set
+ # CONFIG_RTC_DRV_M41T80 is not set
+-CONFIG_RTC_DRV_TWL4030=y
++# CONFIG_RTC_DRV_TWL4030 is not set
+ # CONFIG_RTC_DRV_S35390A is not set
+ # CONFIG_RTC_DRV_FM3130 is not set
+ # CONFIG_RTC_DRV_RX8581 is not set
++# CONFIG_RTC_DRV_RX8025 is not set
+
+ #
+ # SPI RTC drivers
+@@ -996,12 +1003,16 @@ CONFIG_RTC_DRV_TWL4030=y
+ # on-CPU RTC drivers
+ #
+ # CONFIG_DMADEVICES is not set
++# CONFIG_AUXDISPLAY is not set
+ CONFIG_REGULATOR=y
+ # CONFIG_REGULATOR_DEBUG is not set
+ # CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+ # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+ # CONFIG_REGULATOR_BQ24022 is not set
++# CONFIG_REGULATOR_MAX1586 is not set
+ CONFIG_REGULATOR_TWL4030=y
++# CONFIG_REGULATOR_LP3971 is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
+
+@@ -1017,6 +1028,7 @@ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
++# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+ # CONFIG_EXT3_FS_XATTR is not set
+ # CONFIG_EXT4_FS is not set
+ CONFIG_JBD=y
+@@ -1024,10 +1036,12 @@ CONFIG_JBD=y
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ # CONFIG_BTRFS_FS is not set
++CONFIG_FILE_LOCKING=y
++CONFIG_FSNOTIFY=y
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1043,6 +1057,11 @@ CONFIG_QUOTACTL=y
+ # CONFIG_FUSE_FS is not set
+
+ #
++# Caches
++#
++# CONFIG_FSCACHE is not set
++
++#
+ # CD-ROM/DVD Filesystems
+ #
+ # CONFIG_ISO9660_FS is not set
+@@ -1098,11 +1117,13 @@ CONFIG_JFFS2_RTIME=y
+ # CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
++# CONFIG_NILFS2_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
++# CONFIG_NFS_V4_1 is not set
+ CONFIG_ROOT_NFS=y
+ # CONFIG_NFSD is not set
+ CONFIG_LOCKD=y
+@@ -1110,7 +1131,6 @@ CONFIG_LOCKD_V4=y
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ # CONFIG_SMB_FS is not set
+@@ -1198,11 +1218,15 @@ CONFIG_DEBUG_KERNEL=y
+ CONFIG_DETECT_SOFTLOCKUP=y
+ # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
++CONFIG_DETECT_HUNG_TASK=y
++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
++CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+ # CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
++# CONFIG_DEBUG_KMEMLEAK is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+ # CONFIG_DEBUG_SPINLOCK is not set
+@@ -1221,7 +1245,6 @@ CONFIG_DEBUG_INFO=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_DEBUG_NOTIFIERS is not set
+-CONFIG_FRAME_POINTER=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1229,22 +1252,15 @@ CONFIG_FRAME_POINTER=y
+ # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
++# CONFIG_PAGE_POISONING is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_FUNCTION_TRACER is not set
+-# CONFIG_IRQSOFF_TRACER is not set
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_STACK_TRACER is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
++CONFIG_TRACING_SUPPORT=y
++# CONFIG_FTRACE is not set
++# CONFIG_DYNAMIC_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
++CONFIG_ARM_UNWIND=y
+ CONFIG_DEBUG_USER=y
+ CONFIG_DEBUG_ERRORS=y
+ # CONFIG_DEBUG_STACK_USAGE is not set
+@@ -1271,10 +1287,12 @@ CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_HASH2=y
+ CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_PCOMP=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
++CONFIG_CRYPTO_WORKQUEUE=y
+ # CONFIG_CRYPTO_CRYPTD is not set
+ # CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_TEST is not set
+@@ -1343,6 +1361,7 @@ CONFIG_CRYPTO_DES=y
+ # Compression
+ #
+ # CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_ZLIB is not set
+ # CONFIG_CRYPTO_LZO is not set
+
+ #
+@@ -1350,6 +1369,7 @@ CONFIG_CRYPTO_DES=y
+ #
+ # CONFIG_CRYPTO_ANSI_CPRNG is not set
+ CONFIG_CRYPTO_HW=y
++# CONFIG_BINARY_PRINTF is not set
+
+ #
+ # Library routines
+@@ -1365,7 +1385,8 @@ CONFIG_CRC32=y
+ CONFIG_LIBCRC32C=y
+ CONFIG_ZLIB_INFLATE=y
+ CONFIG_ZLIB_DEFLATE=y
+-CONFIG_PLIST=y
++CONFIG_DECOMPRESS_GZIP=y
+ CONFIG_HAS_IOMEM=y
+ CONFIG_HAS_IOPORT=y
+ CONFIG_HAS_DMA=y
++CONFIG_NLATTR=y
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 977bbbe..25aa7b6 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -136,24 +136,11 @@ static struct omap_dss_device beagle_dvi_device = {
+
+ static int beagle_panel_enable_tv(struct omap_dss_device *dssdev)
+ {
+-#define ENABLE_VDAC_DEDICATED 0x03
+-#define ENABLE_VDAC_DEV_GRP 0x20
+-
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEDICATED,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
+-
+ return 0;
+ }
+
+ static void beagle_panel_disable_tv(struct omap_dss_device *dssdev)
+ {
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEDICATED);
+- twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
+- TWL4030_VDAC_DEV_GRP);
+ }
+
+ static struct omap_dss_device beagle_tv_device = {
+@@ -222,15 +209,6 @@ static struct twl4030_hsmmc_info mmc[] = {
+ {} /* Terminator */
+ };
+
+-static struct platform_device omap3_beagle_lcd_device = {
+- .name = "omap3beagle_lcd",
+- .id = -1,
+-};
+-
+-static struct omap_lcd_config omap3_beagle_lcd_config __initdata = {
+- .ctrl_name = "internal",
+-};
+-
+ static struct regulator_consumer_supply beagle_vmmc1_supply = {
+ .supply = "vmmc",
+ };
+@@ -316,6 +294,7 @@ static struct regulator_init_data beagle_vdac = {
+ .constraints = {
+ .min_uV = 1800000,
+ .max_uV = 1800000,
++ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+@@ -340,11 +319,18 @@ static struct regulator_init_data beagle_vpll2 = {
+ .consumer_supplies = &beagle_vdds_dsi_supply,
+ };
+
++static struct twl4030_usb_data beagle_usb_data = {
++ .usb_mode = T2_USB_MODE_ULPI,
++};
++
+ static struct twl4030_platform_data beagle_twldata = {
+ .irq_base = TWL4030_IRQ_BASE,
+ .irq_end = TWL4030_IRQ_END,
+
+ /* platform_data for children goes here */
++ .usb = &beagle_usb_data,
++
++ /* platform_data for children goes here */
+ .gpio = &beagle_gpio_data,
+ .vmmc1 = &beagle_vmmc1,
+ .vsim = &beagle_vsim,
+--
+1.6.2.4
+
diff --git a/recipes/linux/linux-omap-pm/dss2/0146-DSS2-change-include-asm-.-to-linux-.-in-oma.patch b/recipes/linux/linux-omap-pm/dss2/0146-DSS2-change-include-asm-.-to-linux-.-in-oma.patch
new file mode 100644
index 0000000000..7867385443
--- /dev/null
+++ b/recipes/linux/linux-omap-pm/dss2/0146-DSS2-change-include-asm-.-to-linux-.-in-oma.patch
@@ -0,0 +1,29 @@
+From 7ae220f46384b34e72b8c3b0c2075a674a3f74fe Mon Sep 17 00:00:00 2001
+From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+Date: Fri, 3 Jul 2009 08:53:11 +0300
+Subject: [PATCH 146/146] DSS2: change include <asm/...> to <linux/...> in omapfb.h
+
+Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
+---
+ include/linux/omapfb.h | 5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/include/linux/omapfb.h b/include/linux/omapfb.h
+index 67dc375..0290584 100644
+--- a/include/linux/omapfb.h
++++ b/include/linux/omapfb.h
+@@ -25,9 +25,8 @@
+ #define __OMAPFB_H
+
+ #include <linux/fb.h>
+-
+-#include <asm/ioctl.h>
+-#include <asm/types.h>
++#include <linux/ioctl.h>
++#include <linux/types.h>
+
+ /* IOCTL commands. */
+
+--
+1.6.2.4
+