]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 8 Apr 2014 16:52:16 +0000 (09:52 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 8 Apr 2014 16:52:16 +0000 (09:52 -0700)
Pull drm updates from Dave Airlie:
 "Highlights:

   - drm:

     Generic display port aux features, primary plane support, drm
     master management fixes, logging cleanups, enforced locking checks
     (instead of docs), documentation improvements, minor number
     handling cleanup, pseudofs for shared inodes.

   - ttm:

     add ability to allocate from both ends

   - i915:

     broadwell features, power domain and runtime pm, per-process
     address space infrastructure (not enabled)

   - msm:

     power management, hdmi audio support

   - nouveau:

     ongoing GPU fault recovery, initial maxwell support, random fixes

   - exynos:

     refactored driver to clean up a lot of abstraction, DP support
     moved into drm, LVDS bridge support added, parallel panel support

   - gma500:

     SGX MMU support, SGX irq handling, asle irq work fixes

   - radeon:

     video engine bringup, ring handling fixes, use dp aux helpers

   - vmwgfx:

     add rendernode support"

* 'drm-next' of git://people.freedesktop.org/~airlied/linux: (849 commits)
  DRM: armada: fix corruption while loading cursors
  drm/dp_helper: don't return EPROTO for defers (v2)
  drm/bridge: export ptn3460_init function
  drm/exynos: remove MODULE_DEVICE_TABLE definitions
  ARM: dts: exynos4412-trats2: enable exynos/fimd node
  ARM: dts: exynos4210-trats: enable exynos/fimd node
  ARM: dts: exynos4412-trats2: add panel node
  ARM: dts: exynos4210-trats: add panel node
  ARM: dts: exynos4: add MIPI DSI Master node
  drm/panel: add S6E8AA0 driver
  ARM: dts: exynos4210-universal_c210: add proper panel node
  drm/panel: add ld9040 driver
  panel/ld9040: add DT bindings
  panel/s6e8aa0: add DT bindings
  drm/exynos: add DSIM driver
  exynos/dsim: add DT bindings
  drm/exynos: disallow fbdev initialization if no device is connected
  drm/mipi_dsi: create dsi devices only for nodes with reg property
  drm/mipi_dsi: add flags to DSI messages
  Skip intel_crt_init for Dell XPS 8700
  ...

14 files changed:
1  2 
MAINTAINERS
arch/arm/boot/dts/exynos4.dtsi
arch/arm/boot/dts/exynos4210-trats.dts
arch/arm/boot/dts/exynos4210-universal_c210.dts
arch/arm/boot/dts/exynos4412-trats2.dts
drivers/gpu/drm/drm_crtc_helper.c
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/gma500/mmu.c
drivers/staging/imx-drm/ipuv3-crtc.c
drivers/staging/imx-drm/ipuv3-plane.c
fs/dcache.c
include/drm/drm_fb_helper.h

diff --combined MAINTAINERS
index d0b8afe261236d806950610e4e23e8abdb2d7649,719e6279b80a40eb575e2ddf3843613ba29a1501..7faf310014373593fe25ecc44f5d218eb75d1c5d
@@@ -242,8 -242,8 +242,8 @@@ S: Maintaine
  F:    drivers/platform/x86/acer-wmi.c
  
  ACPI
 -M:    Len Brown <lenb@kernel.org>
  M:    Rafael J. Wysocki <rjw@rjwysocki.net>
 +M:    Len Brown <lenb@kernel.org>
  L:    linux-acpi@vger.kernel.org
  W:    https://01.org/linux-acpi
  Q:    https://patchwork.kernel.org/project/linux-acpi/list/
@@@ -536,13 -536,6 +536,13 @@@ S:       Odd Fixe
  L:    linux-alpha@vger.kernel.org
  F:    arch/alpha/
  
 +ALTERA TRIPLE SPEED ETHERNET DRIVER
 +M:    Vince Bridgers <vbridgers2013@gmail.com
 +L:    netdev@vger.kernel.org
 +L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/net/ethernet/altera/
 +
  ALTERA UART/JTAG UART SERIAL DRIVERS
  M:    Tobias Klauser <tklauser@distanz.ch>
  L:    linux-serial@vger.kernel.org
@@@ -824,7 -817,7 +824,7 @@@ ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECT
  M:    Alexander Shiyan <shc_work@mail.ru>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Odd Fixes
 -F:    arch/arm/mach-clps711x/
 +N:    clps711x
  
  ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
  M:    Hartley Sweeten <hsweeten@visionengravers.com>
@@@ -1175,14 -1168,6 +1175,14 @@@ L:    linux-arm-kernel@lists.infradead.or
  W:    http://www.arm.linux.org.uk/
  S:    Maintained
  
 +ARM/QUALCOMM SUPPORT
 +M:    Kumar Gala <galak@codeaurora.org>
 +M:    David Brown <davidb@codeaurora.org>
 +L:    linux-arm-msm@vger.kernel.org
 +S:    Maintained
 +F:    arch/arm/mach-qcom/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom.git
 +
  ARM/RADISYS ENP2611 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1291,21 -1276,13 +1291,21 @@@ S:   Maintaine
  F:    drivers/clk/socfpga/
  
  ARM/STI ARCHITECTURE
 -M:    Srinivas Kandagatla <srinivas.kandagatla@st.com>
 -M:    Stuart Menefy <stuart.menefy@st.com>
 +M:    Srinivas Kandagatla <srinivas.kandagatla@gmail.com>
 +M:    Maxime Coquelin <maxime.coquelin@st.com>
 +M:    Patrice Chotard <patrice.chotard@st.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    kernel@stlinux.com
  W:    http://www.stlinux.com
  S:    Maintained
  F:    arch/arm/mach-sti/
 +F:    arch/arm/boot/dts/sti*
 +F:    drivers/clocksource/arm_global_timer.c
 +F:    drivers/reset/sti/
 +F:    drivers/pinctrl/pinctrl-st.c
 +F:    drivers/media/rc/st_rc.c
 +F:    drivers/i2c/busses/i2c-st.c
 +F:    drivers/tty/serial/st-asc.c
  
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -1343,7 -1320,6 +1343,7 @@@ M:      Linus Walleij <linus.walleij@linaro.
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    arch/arm/mach-u300/
 +F:    drivers/clocksource/timer-u300.c
  F:    drivers/i2c/busses/i2c-stu300.c
  F:    drivers/rtc/rtc-coh901331.c
  F:    drivers/watchdog/coh901327_wdt.c
@@@ -1720,8 -1696,6 +1720,8 @@@ F:      drivers/net/wireless/b43legacy
  
  BACKLIGHT CLASS/SUBSYSTEM
  M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Bryan Wu <cooloney@gmail.com>
 +M:    Lee Jones <lee.jones@linaro.org>
  S:    Maintained
  F:    drivers/video/backlight/
  F:    include/linux/backlight.h
@@@ -1873,12 -1847,6 +1873,12 @@@ L:    netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/broadcom/b44.*
  
 +BROADCOM GENET ETHERNET DRIVER
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/ethernet/broadcom/genet/
 +
  BROADCOM BNX2 GIGABIT ETHERNET DRIVER
  M:    Michael Chan <mchan@broadcom.com>
  L:    netdev@vger.kernel.org
@@@ -1910,19 -1878,11 +1910,19 @@@ M:   Stephen Warren <swarren@wwwdotorg.or
  L:    linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-rpi.git
  S:    Maintained
 -F:    arch/arm/mach-bcm2835/
 +F:    arch/arm/mach-bcm/board_bcm2835.c
  F:    arch/arm/boot/dts/bcm2835*
  F:    arch/arm/configs/bcm2835_defconfig
  F:    drivers/*/*bcm2835*
  
 +BROADCOM BCM5301X ARM ARCHICTURE
 +M:    Hauke Mehrtens <hauke@hauke-m.de>
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    arch/arm/mach-bcm/bcm_5301x.c
 +F:    arch/arm/boot/dts/bcm5301x.dtsi
 +F:    arch/arm/boot/dts/bcm470*
 +
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
  M:    Nithin Nayak Sujir <nsujir@broadcom.com>
  M:    Michael Chan <mchan@broadcom.com>
@@@ -1952,13 -1912,6 +1952,13 @@@ L:    linux-scsi@vger.kernel.or
  S:    Supported
  F:    drivers/scsi/bnx2i/
  
 +BROADCOM KONA GPIO DRIVER
 +M:    Markus Mayer <markus.mayer@linaro.org>
 +L:    bcm-kernel-feedback-list@broadcom.com
 +S:    Supported
 +F:    drivers/gpio/gpio-bcm-kona.c
 +F:    Documentation/devicetree/bindings/gpio/gpio-bcm-kona.txt
 +
  BROADCOM SPECIFIC AMBA DRIVER (BCMA)
  M:    Rafał Miłecki <zajec5@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -1967,8 -1920,8 +1967,8 @@@ F:      drivers/bcma
  F:    include/linux/bcma/
  
  BROCADE BFA FC SCSI DRIVER
 -M:    Anil Gurumurthy <agurumur@brocade.com>
 -M:    Vijaya Mohan Guvva <vmohan@brocade.com>
 +M:    Anil Gurumurthy <anil.gurumurthy@qlogic.com>
 +M:    Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/bfa/
@@@ -2250,13 -2203,6 +2250,13 @@@ L:    alsa-devel@alsa-project.org (moderat
  S:    Odd Fixes
  F:    sound/soc/codecs/cs4270*
  
 +CIRRUS LOGIC AUDIO CODEC DRIVERS
 +M:    Brian Austin <brian.austin@cirrus.com>
 +M:    Paul Handrigan <Paul.Handrigan@cirrus.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    sound/soc/codecs/cs*
 +
  CLEANCACHE API
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  L:    linux-kernel@vger.kernel.org
@@@ -2318,7 -2264,7 +2318,7 @@@ F:      include/uapi/linux/coda*.
  
  COMMON CLK FRAMEWORK
  M:    Mike Turquette <mturquette@linaro.org>
 -L:    linux-arm-kernel@lists.infradead.org (same as CLK API & CLKDEV)
 +L:    linux-kernel@vger.kernel.org
  T:    git git://git.linaro.org/people/mturquette/linux.git
  S:    Maintained
  F:    drivers/clk/
@@@ -2761,31 -2707,6 +2761,31 @@@ F:    include/linux/device-mapper.
  F:    include/linux/dm-*.h
  F:    include/uapi/linux/dm-*.h
  
 +DIALOG SEMICONDUCTOR DRIVERS
 +M:    Support Opensource <support.opensource@diasemi.com>
 +W:    http://www.dialog-semiconductor.com/products
 +S:    Supported
 +F:    Documentation/hwmon/da90??
 +F:    drivers/gpio/gpio-da90??.c
 +F:    drivers/hwmon/da90??-hwmon.c
 +F:    drivers/input/misc/da90??_onkey.c
 +F:    drivers/input/touchscreen/da9052_tsi.c
 +F:    drivers/leds/leds-da90??.c
 +F:    drivers/mfd/da903x.c
 +F:    drivers/mfd/da90??-*.c
 +F:    drivers/power/da9052-battery.c
 +F:    drivers/regulator/da903x.c
 +F:    drivers/regulator/da9???-regulator.[ch]
 +F:    drivers/rtc/rtc-da90??.c
 +F:    drivers/video/backlight/da90??_bl.c
 +F:    drivers/watchdog/da90??_wdt.c
 +F:    include/linux/mfd/da903x.h
 +F:    include/linux/mfd/da9052/
 +F:    include/linux/mfd/da9055/
 +F:    include/linux/mfd/da9063/
 +F:    include/sound/da[79]*.h
 +F:    sound/soc/codecs/da[79]*.[ch]
 +
  DIGI NEO AND CLASSIC PCI PRODUCTS
  M:    Lidza Louina <lidza.louina@gmail.com>
  L:    driverdev-devel@linuxdriverproject.org
@@@ -2945,6 -2866,16 +2945,16 @@@ F:    drivers/gpu/drm/radeon
  F:    include/drm/radeon*
  F:    include/uapi/drm/radeon*
  
+ DRM PANEL DRIVERS
+ M:    Thierry Reding <thierry.reding@gmail.com>
+ L:    dri-devel@lists.freedesktop.org
+ T:    git git://anongit.freedesktop.org/tegra/linux.git
+ S:    Maintained
+ F:    drivers/gpu/drm/drm_panel.c
+ F:    drivers/gpu/drm/panel/
+ F:    include/drm/drm_panel.h
+ F:    Documentation/devicetree/bindings/panel/
  INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
  M:    Daniel Vetter <daniel.vetter@ffwll.ch>
  M:    Jani Nikula <jani.nikula@linux.intel.com>
@@@ -3459,9 -3390,7 +3469,9 @@@ F:      Documentation/filesystems/ext4.tx
  F:    fs/ext4/
  
  Extended Verification Module (EVM)
 -M:    Mimi Zohar <zohar@us.ibm.com>
 +M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +L:    linux-ima-devel@lists.sourceforge.net
 +L:    linux-security-module@vger.kernel.org
  S:    Supported
  F:    security/integrity/evm/
  
@@@ -3474,12 -3403,6 +3484,6 @@@ S:     Maintaine
  F:    drivers/extcon/
  F:    Documentation/extcon/
  
- EXYNOS DP DRIVER
- M:    Jingoo Han <jg1.han@samsung.com>
- L:    linux-fbdev@vger.kernel.org
- S:    Maintained
- F:    drivers/video/exynos/exynos_dp*
  EXYNOS MIPI DISPLAY DRIVERS
  M:    Inki Dae <inki.dae@samsung.com>
  M:    Donghwa Lee <dh09.lee@samsung.com>
@@@ -3545,8 -3468,7 +3549,8 @@@ F:      include/scsi/libfcoe.
  F:    include/uapi/scsi/fc/
  
  FILE LOCKING (flock() and fcntl()/lockf())
 -M:    Matthew Wilcox <matthew@wil.cx>
 +M:    Jeff Layton <jlayton@redhat.com>
 +M:    J. Bruce Fields <bfields@fieldses.org>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
  F:    include/linux/fcntl.h
@@@ -3739,8 -3661,8 +3743,8 @@@ S:      Maintaine
  F:    fs/freevxfs/
  
  FREEZER
 -M:    Pavel Machek <pavel@ucw.cz>
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
 +M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    Documentation/power/freezing-of-tasks.txt
@@@ -4104,8 -4026,8 +4108,8 @@@ S:      Maintaine
  F:    drivers/video/hgafb.c
  
  HIBERNATION (aka Software Suspend, aka swsusp)
 -M:    Pavel Machek <pavel@ucw.cz>
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
 +M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    arch/x86/power/
@@@ -4187,7 -4109,8 +4191,7 @@@ F:      include/linux/hpet.
  F:    include/uapi/linux/hpet.h
  
  HPET: x86
 -M:    "Venkatesh Pallipadi (Venki)" <venki@google.com>
 -S:    Maintained
 +S:    Orphan
  F:    arch/x86/kernel/hpet.c
  F:    arch/x86/include/asm/hpet.h
  
@@@ -4483,11 -4406,8 +4487,11 @@@ S:    Maintaine
  F:    drivers/ipack/
  
  INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
 -M:    Mimi Zohar <zohar@us.ibm.com>
 +M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
  M:    Dmitry Kasatkin <d.kasatkin@samsung.com>
 +L:    linux-ima-devel@lists.sourceforge.net
 +L:    linux-ima-user@lists.sourceforge.net
 +L:    linux-security-module@vger.kernel.org
  S:    Supported
  F:    security/integrity/ima/
  
@@@ -4542,7 -4462,8 +4546,7 @@@ K:      \b(ABS|SYN)_MT
  
  INTEL C600 SERIES SAS CONTROLLER DRIVER
  M:    Intel SCU Linux support <intel-linux-scu@intel.com>
 -M:    Lukasz Dorau <lukasz.dorau@intel.com>
 -M:    Maciej Patelczyk <maciej.patelczyk@intel.com>
 +M:    Artur Paszkiewicz <artur.paszkiewicz@intel.com>
  M:    Dave Jiang <dave.jiang@intel.com>
  L:    linux-scsi@vger.kernel.org
  T:    git git://git.code.sf.net/p/intel-sas/isci
@@@ -4677,7 -4598,7 +4681,7 @@@ F:      arch/x86/kernel/tboot.
  INTEL WIRELESS WIMAX CONNECTION 2400
  M:    Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
  M:    linux-wimax@intel.com
 -L:    wimax@linuxwimax.org
 +L:     wimax@linuxwimax.org (subscribers-only)
  S:    Supported
  W:    http://linuxwimax.org
  F:    Documentation/wimax/README.i2400m
@@@ -4883,6 -4804,22 +4887,6 @@@ S:     Maintaine
  F:    Documentation/hwmon/it87
  F:    drivers/hwmon/it87.c
  
 -IT913X MEDIA DRIVER
 -M:    Malcolm Priestley <tvboxspy@gmail.com>
 -L:    linux-media@vger.kernel.org
 -W:    http://linuxtv.org/
 -Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 -S:    Maintained
 -F:    drivers/media/usb/dvb-usb-v2/it913x*
 -
 -IT913X FE MEDIA DRIVER
 -M:    Malcolm Priestley <tvboxspy@gmail.com>
 -L:    linux-media@vger.kernel.org
 -W:    http://linuxtv.org/
 -Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 -S:    Maintained
 -F:    drivers/media/dvb-frontends/it913x-fe*
 -
  IT913X MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -5138,8 -5075,8 +5142,8 @@@ F:      include/keys
  F:    security/keys/
  
  KEYS-TRUSTED
 -M:    David Safford <safford@watson.ibm.com>
 -M:    Mimi Zohar <zohar@us.ibm.com>
 +M:    David Safford <safford@us.ibm.com>
 +M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
  L:    linux-security-module@vger.kernel.org
  L:    keyrings@linux-nfs.org
  S:    Supported
@@@ -5149,8 -5086,8 +5153,8 @@@ F:      security/keys/trusted.
  F:    security/keys/trusted.h
  
  KEYS-ENCRYPTED
 -M:    Mimi Zohar <zohar@us.ibm.com>
 -M:    David Safford <safford@watson.ibm.com>
 +M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 +M:    David Safford <safford@us.ibm.com>
  L:    linux-security-module@vger.kernel.org
  L:    keyrings@linux-nfs.org
  S:    Supported
@@@ -5313,10 -5250,11 +5317,10 @@@ F:   arch/powerpc/platforms/512x
  F:    arch/powerpc/platforms/52xx/
  
  LINUX FOR POWERPC EMBEDDED PPC4XX
 -M:    Josh Boyer <jwboyer@gmail.com>
 +M:  Alistair Popple <alistair@popple.id.au>
  M:    Matt Porter <mporter@kernel.crashing.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
  S:    Maintained
  F:    arch/powerpc/platforms/40x/
  F:    arch/powerpc/platforms/44x/
@@@ -5754,12 -5692,6 +5758,12 @@@ L:    linux-watchdog@vger.kernel.or
  S:    Supported
  F:    drivers/watchdog/mena21_wdt.c
  
 +MEN CHAMELEON BUS (mcb)
 +M:    Johannes Thumshirn <johannes.thumshirn@men.de>
 +S:    Supported
 +F:    drivers/mcb/
 +F:    include/linux/mcb.h
 +
  METAG ARCHITECTURE
  M:    James Hogan <james.hogan@imgtec.com>
  L:    linux-metag@vger.kernel.org
@@@ -5775,6 -5707,7 +5779,6 @@@ F:      fs/imgdafs
  
  MICROBLAZE ARCHITECTURE
  M:    Michal Simek <monstr@monstr.eu>
 -L:    microblaze-uclinux@itee.uq.edu.au (moderated for non-subscribers)
  W:    http://www.monstr.eu/fdt/
  T:    git git://git.monstr.eu/linux-2.6-microblaze.git
  S:    Supported
@@@ -5863,26 -5796,6 +5867,26 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Supported
  F:    drivers/platform/x86/msi-wmi.c
  
 +MSI001 MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/staging/media/msi3101/msi001*
 +
 +MSI3101 MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/staging/media/msi3101/sdr-msi3101*
 +
  MT9M032 APTINA SENSOR DRIVER
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-media@vger.kernel.org
@@@ -6121,7 -6034,6 +6125,7 @@@ L:      netdev@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next.git
  S:    Maintained
 +F:    net/core/flow.c
  F:    net/xfrm/
  F:    net/key/
  F:    net/ipv4/xfrm*
@@@ -6197,7 -6109,6 +6201,7 @@@ F:      include/net/nfc
  F:    include/uapi/linux/nfc.h
  F:    drivers/nfc/
  F:    include/linux/platform_data/pn544.h
 +F:    Documentation/devicetree/bindings/net/nfc/
  
  NFS, SUNRPC, AND LOCKD CLIENTS
  M:    Trond Myklebust <trond.myklebust@primarydata.com>
@@@ -6216,10 -6127,10 +6220,10 @@@ F:   include/uapi/linux/nfs
  F:    include/uapi/linux/sunrpc/
  
  NILFS2 FILESYSTEM
 -M:    KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
 +M:    Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  L:    linux-nilfs@vger.kernel.org
 -W:    http://www.nilfs.org/en/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git
 +W:    http://nilfs.sourceforge.net/
 +T:    git git://github.com/konis/nilfs2.git
  S:    Supported
  F:    Documentation/filesystems/nilfs2.txt
  F:    fs/nilfs2/
@@@ -7157,8 -7068,13 +7161,8 @@@ F:     Documentation/networking/LICENSE.qla
  F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
 -M:    Himanshu Madhani <himanshu.madhani@qlogic.com>
 -M:    Rajesh Borundia <rajesh.borundia@qlogic.com>
  M:    Shahed Shaikh <shahed.shaikh@qlogic.com>
 -M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
 -M:    Sony Chacko <sony.chacko@qlogic.com>
 -M:    Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
 -M:    linux-driver@qlogic.com
 +M:    Dept-HSGLinuxNICDev@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qlcnic/
@@@ -7450,16 -7366,6 +7454,16 @@@ T:    git git://linuxtv.org/anttip/media_t
  S:    Maintained
  F:    drivers/media/dvb-frontends/rtl2832*
  
 +RTL2832_SDR MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/anttip/media_tree.git
 +S:    Maintained
 +F:    drivers/staging/media/rtl2832u_sdr/rtl2832_sdr*
 +
  RTL8180 WIRELESS DRIVER
  M:    "John W. Linville" <linville@tuxdriver.com>
  L:    linux-wireless@vger.kernel.org
@@@ -7503,26 -7409,10 +7507,26 @@@ W:   http://www.ibm.com/developerworks/li
  S:    Supported
  F:    arch/s390/
  F:    drivers/s390/
 -F:    block/partitions/ibm.c
  F:    Documentation/s390/
  F:    Documentation/DocBook/s390*
  
 +S390 COMMON I/O LAYER
 +M:    Sebastian Ott <sebott@linux.vnet.ibm.com>
 +M:    Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +W:    http://www.ibm.com/developerworks/linux/linux390/
 +S:    Supported
 +F:    drivers/s390/cio/
 +
 +S390 DASD DRIVER
 +M:    Stefan Weinhuber <wein@de.ibm.com>
 +M:    Stefan Haberland <stefan.haberland@de.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +W:    http://www.ibm.com/developerworks/linux/linux390/
 +S:    Supported
 +F:    drivers/s390/block/dasd*
 +F:    block/partitions/ibm.c
 +
  S390 NETWORK DRIVERS
  M:    Ursula Braun <ursula.braun@de.ibm.com>
  M:    Frank Blaschka <blaschka@linux.vnet.ibm.com>
@@@ -7532,15 -7422,6 +7536,15 @@@ W:    http://www.ibm.com/developerworks/li
  S:    Supported
  F:    drivers/s390/net/
  
 +S390 PCI SUBSYSTEM
 +M:    Sebastian Ott <sebott@linux.vnet.ibm.com>
 +M:    Gerald Schaefer <gerald.schaefer@de.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +W:    http://www.ibm.com/developerworks/linux/linux390/
 +S:    Supported
 +F:    arch/s390/pci/
 +F:    drivers/pci/hotplug/s390_pci_hpc.c
 +
  S390 ZCRYPT DRIVER
  M:    Ingo Tuchscherer <ingo.tuchscherer@de.ibm.com>
  M:    linux390@de.ibm.com
@@@ -7664,15 -7545,6 +7668,15 @@@ S:    Supporte
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  F:    drivers/clk/samsung/
  
 +SAMSUNG SXGBE DRIVERS
 +M:    Byungho An <bh74.an@samsung.com>
 +M:    Girish K S <ks.giri@samsung.com>
 +M:    Siva Reddy Kallam <siva.kallam@samsung.com>
 +M:    Vipul Pandya <vipul.pandya@samsung.com>
 +S:    Supported
 +L:    netdev@vger.kernel.org
 +F:    drivers/net/ethernet/samsung/sxgbe/
 +
  SERIAL DRIVERS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  L:    linux-serial@vger.kernel.org
@@@ -7862,10 -7734,11 +7866,10 @@@ M:   Security Officers <security@kernel.o
  S:    Supported
  
  SELINUX SECURITY MODULE
 +M:    Paul Moore <paul@paul-moore.com>
  M:    Stephen Smalley <sds@tycho.nsa.gov>
 -M:    James Morris <james.l.morris@oracle.com>
  M:    Eric Paris <eparis@parisplace.org>
 -M:    Paul Moore <paul@paul-moore.com>
 -L:    selinux@tycho.nsa.gov (subscribers-only, general discussion)
 +L:    selinux@tycho.nsa.gov (moderated for non-subscribers)
  W:    http://selinuxproject.org
  T:    git git://git.infradead.org/users/pcmoore/selinux
  S:    Supported
@@@ -7932,6 -7805,13 +7936,6 @@@ F:     Documentation/ia64/serial.tx
  F:    drivers/tty/serial/ioc?_serial.c
  F:    include/linux/ioc?.h
  
 -SGI VISUAL WORKSTATION 320 AND 540
 -M:    Andrey Panin <pazke@donpac.ru>
 -L:    linux-visws-devel@lists.sf.net
 -W:    http://linux-visws.sf.net
 -S:    Maintained for 2.6.
 -F:    Documentation/sgi-visws.txt
 -
  SGI XP/XPC/XPNET DRIVER
  M:    Cliff Whickman <cpw@sgi.com>
  M:    Robin Holt <robinmholt@gmail.com>
@@@ -7992,13 -7872,15 +7996,13 @@@ F:   drivers/media/usb/siano
  F:    drivers/media/mmc/siano/
  
  SH_VEU V4L2 MEM2MEM DRIVER
 -M:    Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  L:    linux-media@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/media/platform/sh_veu.c
  
  SH_VOU V4L2 OUTPUT DRIVER
 -M:    Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  L:    linux-media@vger.kernel.org
 -S:    Odd Fixes
 +S:    Orphan
  F:    drivers/media/platform/sh_vou.c
  F:    include/media/sh_vou.h
  
@@@ -8477,12 -8359,6 +8481,12 @@@ M:    Teddy Wang <teddy.wang@siliconmotion
  S:    Odd Fixes
  F:    drivers/staging/sm7xxfb/
  
 +STAGING - SLICOSS
 +M:    Lior Dotan <liodot@gmail.com>
 +M:    Christopher Harrer <charrer@alacritech.com>
 +S:    Odd Fixes
 +F:    drivers/staging/slicoss/
 +
  STAGING - SOFTLOGIC 6x10 MPEG CODEC
  M:    Ismael Luceno <ismael.luceno@corp.bluecherry.net>
  S:    Supported
@@@ -8544,18 -8420,20 +8548,18 @@@ S:   Maintaine
  F:    drivers/net/ethernet/dlink/sundance.c
  
  SUPERH
 -M:    Paul Mundt <lethal@linux-sh.org>
  L:    linux-sh@vger.kernel.org
  W:    http://www.linux-sh.org
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
 -T:    git git://github.com/pmundt/linux-sh.git sh-latest
 -S:    Supported
 +S:    Orphan
  F:    Documentation/sh/
  F:    arch/sh/
  F:    drivers/sh/
  
  SUSPEND TO RAM
 +M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <len.brown@intel.com>
  M:    Pavel Machek <pavel@ucw.cz>
 -M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  L:    linux-pm@vger.kernel.org
  S:    Supported
  F:    Documentation/power/
@@@ -8831,7 -8709,6 +8835,7 @@@ M:      Max Filippov <jcmvbkbc@gmail.com
  L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
  F:    arch/xtensa/
 +F:    drivers/irqchip/irq-xtensa-*
  
  THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
@@@ -9167,13 -9044,6 +9171,13 @@@ F:    drivers/cdrom/cdrom.
  F:    include/linux/cdrom.h
  F:    include/uapi/linux/cdrom.h
  
 +UNISYS S-PAR DRIVERS
 +M:     Benjamin Romer <benjamin.romer@unisys.com>
 +M:     David Kershner <david.kershner@unisys.com>
 +L:     sparmaintainer@unisys.com (Unisys internal)
 +S:     Supported
 +F:     drivers/staging/unisys/
 +
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER
  M:    Vinayak Holikatti <vinholikatti@gmail.com>
  M:    Santosh Y <santoshsy@gmail.com>
@@@ -9212,7 -9082,8 +9216,7 @@@ S:      Maintaine
  F:    drivers/net/wireless/ath/ar5523/
  
  USB ATTACHED SCSI
 -M:    Matthew Wilcox <willy@linux.intel.com>
 -M:    Sarah Sharp <sarah.a.sharp@linux.intel.com>
 +M:    Hans de Goede <hdegoede@redhat.com>
  M:    Gerd Hoffmann <kraxel@redhat.com>
  L:    linux-usb@vger.kernel.org
  L:    linux-scsi@vger.kernel.org
@@@ -9438,7 -9309,7 +9442,7 @@@ S:      Maintaine
  F:    drivers/net/wireless/rndis_wlan.c
  
  USB XHCI DRIVER
 -M:    Sarah Sharp <sarah.a.sharp@linux.intel.com>
 +M:    Mathias Nyman <mathias.nyman@intel.com>
  L:    linux-usb@vger.kernel.org
  S:    Supported
  F:    drivers/usb/host/xhci*
@@@ -9522,6 -9393,7 +9526,6 @@@ F:      include/media/videobuf2-
  
  VIRTIO CONSOLE DRIVER
  M:    Amit Shah <amit.shah@redhat.com>
 -L:    virtio-dev@lists.oasis-open.org
  L:    virtualization@lists.linux-foundation.org
  S:    Maintained
  F:    drivers/char/virtio_console.c
@@@ -9531,6 -9403,7 +9535,6 @@@ F:      include/uapi/linux/virtio_console.
  VIRTIO CORE, NET AND BLOCK DRIVERS
  M:    Rusty Russell <rusty@rustcorp.com.au>
  M:    "Michael S. Tsirkin" <mst@redhat.com>
 -L:    virtio-dev@lists.oasis-open.org
  L:    virtualization@lists.linux-foundation.org
  S:    Maintained
  F:    drivers/virtio/
@@@ -9543,6 -9416,7 +9547,6 @@@ F:      include/uapi/linux/virtio_*.
  VIRTIO HOST (VHOST)
  M:    "Michael S. Tsirkin" <mst@redhat.com>
  L:    kvm@vger.kernel.org
 -L:    virtio-dev@lists.oasis-open.org
  L:    virtualization@lists.linux-foundation.org
  L:    netdev@vger.kernel.org
  S:    Maintained
@@@ -9723,7 -9597,7 +9727,7 @@@ F:      drivers/media/rc/winbond-cir.
  WIMAX STACK
  M:    Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
  M:    linux-wimax@intel.com
 -L:    wimax@linuxwimax.org
 +L:     wimax@linuxwimax.org (subscribers-only)
  S:    Supported
  W:    http://linuxwimax.org
  F:    Documentation/wimax/README.wimax
@@@ -9913,12 -9787,6 +9917,12 @@@ L:    linux-serial@vger.kernel.or
  S:    Maintained
  F:    drivers/tty/serial/uartlite.c
  
 +XTENSA XTFPGA PLATFORM SUPPORT
 +M:    Max Filippov <jcmvbkbc@gmail.com>
 +L:    linux-xtensa@linux-xtensa.org
 +S:    Maintained
 +F:    drivers/spi/spi-xtensa-xtfpga.c
 +
  YAM DRIVER FOR AX.25
  M:    Jean-Paul Roubelat <jpr@f6fbb.org>
  L:    linux-hams@vger.kernel.org
index 0401f4dba2a226717bce178e34268a69a163be73,3d14cdb0776ae289aa8a1231f5e60a12cea0490f..2f8bcd068d171644dd5bcd5266b34d64aa315de9
@@@ -19,7 -19,6 +19,7 @@@
   * published by the Free Software Foundation.
   */
  
 +#include <dt-bindings/clock/exynos4.h>
  #include "skeleton.dtsi"
  
  / {
                reg = <0x10023CE0 0x20>;
        };
  
 +      pd_gps_alive: gps-alive-power-domain@10023D00 {
 +              compatible = "samsung,exynos4210-pd";
 +              reg = <0x10023D00 0x20>;
 +      };
 +
        gic: interrupt-controller@10490000 {
                compatible = "arm,cortex-a9-gic";
                #interrupt-cells = <3>;
                reg = <0x10010000 0x400>;
        };
  
+       dsi_0: dsi@11C80000 {
+               compatible = "samsung,exynos4210-mipi-dsi";
+               reg = <0x11C80000 0x10000>;
+               interrupts = <0 79 0>;
+               samsung,power-domain = <&pd_lcd0>;
+               phys = <&mipi_phy 1>;
+               phy-names = "dsim";
+               clocks = <&clock 286>, <&clock 143>;
+               clock-names = "bus_clk", "pll_clk";
+               status = "disabled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+       };
        camera {
                compatible = "samsung,fimc", "simple-bus";
                status = "disabled";
                        compatible = "samsung,exynos4210-fimc";
                        reg = <0x11800000 0x1000>;
                        interrupts = <0 84 0>;
 -                      clocks = <&clock 256>, <&clock 128>;
 +                      clocks = <&clock CLK_FIMC0>, <&clock CLK_SCLK_FIMC0>;
                        clock-names = "fimc", "sclk_fimc";
                        samsung,power-domain = <&pd_cam>;
                        samsung,sysreg = <&sys_reg>;
                        compatible = "samsung,exynos4210-fimc";
                        reg = <0x11810000 0x1000>;
                        interrupts = <0 85 0>;
 -                      clocks = <&clock 257>, <&clock 129>;
 +                      clocks = <&clock CLK_FIMC1>, <&clock CLK_SCLK_FIMC1>;
                        clock-names = "fimc", "sclk_fimc";
                        samsung,power-domain = <&pd_cam>;
                        samsung,sysreg = <&sys_reg>;
                        compatible = "samsung,exynos4210-fimc";
                        reg = <0x11820000 0x1000>;
                        interrupts = <0 86 0>;
 -                      clocks = <&clock 258>, <&clock 130>;
 +                      clocks = <&clock CLK_FIMC2>, <&clock CLK_SCLK_FIMC2>;
                        clock-names = "fimc", "sclk_fimc";
                        samsung,power-domain = <&pd_cam>;
                        samsung,sysreg = <&sys_reg>;
                        compatible = "samsung,exynos4210-fimc";
                        reg = <0x11830000 0x1000>;
                        interrupts = <0 87 0>;
 -                      clocks = <&clock 259>, <&clock 131>;
 +                      clocks = <&clock CLK_FIMC3>, <&clock CLK_SCLK_FIMC3>;
                        clock-names = "fimc", "sclk_fimc";
                        samsung,power-domain = <&pd_cam>;
                        samsung,sysreg = <&sys_reg>;
                        compatible = "samsung,exynos4210-csis";
                        reg = <0x11880000 0x4000>;
                        interrupts = <0 78 0>;
 -                      clocks = <&clock 260>, <&clock 134>;
 +                      clocks = <&clock CLK_CSIS0>, <&clock CLK_SCLK_CSIS0>;
                        clock-names = "csis", "sclk_csis";
                        bus-width = <4>;
                        samsung,power-domain = <&pd_cam>;
                        compatible = "samsung,exynos4210-csis";
                        reg = <0x11890000 0x4000>;
                        interrupts = <0 80 0>;
 -                      clocks = <&clock 261>, <&clock 135>;
 +                      clocks = <&clock CLK_CSIS1>, <&clock CLK_SCLK_CSIS1>;
                        clock-names = "csis", "sclk_csis";
                        bus-width = <2>;
                        samsung,power-domain = <&pd_cam>;
                compatible = "samsung,s3c2410-wdt";
                reg = <0x10060000 0x100>;
                interrupts = <0 43 0>;
 -              clocks = <&clock 345>;
 +              clocks = <&clock CLK_WDT>;
                clock-names = "watchdog";
                status = "disabled";
        };
                compatible = "samsung,s3c6410-rtc";
                reg = <0x10070000 0x100>;
                interrupts = <0 44 0>, <0 45 0>;
 -              clocks = <&clock 346>;
 +              clocks = <&clock CLK_RTC>;
                clock-names = "rtc";
                status = "disabled";
        };
                compatible = "samsung,s5pv210-keypad";
                reg = <0x100A0000 0x100>;
                interrupts = <0 109 0>;
 -              clocks = <&clock 347>;
 +              clocks = <&clock CLK_KEYIF>;
                clock-names = "keypad";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-sdhci";
                reg = <0x12510000 0x100>;
                interrupts = <0 73 0>;
 -              clocks = <&clock 297>, <&clock 145>;
 +              clocks = <&clock CLK_SDMMC0>, <&clock CLK_SCLK_MMC0>;
                clock-names = "hsmmc", "mmc_busclk.2";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-sdhci";
                reg = <0x12520000 0x100>;
                interrupts = <0 74 0>;
 -              clocks = <&clock 298>, <&clock 146>;
 +              clocks = <&clock CLK_SDMMC1>, <&clock CLK_SCLK_MMC1>;
                clock-names = "hsmmc", "mmc_busclk.2";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-sdhci";
                reg = <0x12530000 0x100>;
                interrupts = <0 75 0>;
 -              clocks = <&clock 299>, <&clock 147>;
 +              clocks = <&clock CLK_SDMMC2>, <&clock CLK_SCLK_MMC2>;
                clock-names = "hsmmc", "mmc_busclk.2";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-sdhci";
                reg = <0x12540000 0x100>;
                interrupts = <0 76 0>;
 -              clocks = <&clock 300>, <&clock 148>;
 +              clocks = <&clock CLK_SDMMC3>, <&clock CLK_SCLK_MMC3>;
                clock-names = "hsmmc", "mmc_busclk.2";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-ehci";
                reg = <0x12580000 0x100>;
                interrupts = <0 70 0>;
 -              clocks = <&clock 304>;
 +              clocks = <&clock CLK_USB_HOST>;
                clock-names = "usbhost";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-ohci";
                reg = <0x12590000 0x100>;
                interrupts = <0 70 0>;
 -              clocks = <&clock 304>;
 +              clocks = <&clock CLK_USB_HOST>;
                clock-names = "usbhost";
                status = "disabled";
        };
                reg = <0x13400000 0x10000>;
                interrupts = <0 94 0>;
                samsung,power-domain = <&pd_mfc>;
 -              clocks = <&clock 273>;
 +              clocks = <&clock CLK_MFC>;
                clock-names = "mfc";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-uart";
                reg = <0x13800000 0x100>;
                interrupts = <0 52 0>;
 -              clocks = <&clock 312>, <&clock 151>;
 +              clocks = <&clock CLK_UART0>, <&clock CLK_SCLK_UART0>;
                clock-names = "uart", "clk_uart_baud0";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-uart";
                reg = <0x13810000 0x100>;
                interrupts = <0 53 0>;
 -              clocks = <&clock 313>, <&clock 152>;
 +              clocks = <&clock CLK_UART1>, <&clock CLK_SCLK_UART1>;
                clock-names = "uart", "clk_uart_baud0";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-uart";
                reg = <0x13820000 0x100>;
                interrupts = <0 54 0>;
 -              clocks = <&clock 314>, <&clock 153>;
 +              clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
                clock-names = "uart", "clk_uart_baud0";
                status = "disabled";
        };
                compatible = "samsung,exynos4210-uart";
                reg = <0x13830000 0x100>;
                interrupts = <0 55 0>;
 -              clocks = <&clock 315>, <&clock 154>;
 +              clocks = <&clock CLK_UART3>, <&clock CLK_SCLK_UART3>;
                clock-names = "uart", "clk_uart_baud0";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x13860000 0x100>;
                interrupts = <0 58 0>;
 -              clocks = <&clock 317>;
 +              clocks = <&clock CLK_I2C0>;
                clock-names = "i2c";
                pinctrl-names = "default";
                pinctrl-0 = <&i2c0_bus>;
                compatible = "samsung,s3c2440-i2c";
                reg = <0x13870000 0x100>;
                interrupts = <0 59 0>;
 -              clocks = <&clock 318>;
 +              clocks = <&clock CLK_I2C1>;
                clock-names = "i2c";
                pinctrl-names = "default";
                pinctrl-0 = <&i2c1_bus>;
                compatible = "samsung,s3c2440-i2c";
                reg = <0x13880000 0x100>;
                interrupts = <0 60 0>;
 -              clocks = <&clock 319>;
 +              clocks = <&clock CLK_I2C2>;
                clock-names = "i2c";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x13890000 0x100>;
                interrupts = <0 61 0>;
 -              clocks = <&clock 320>;
 +              clocks = <&clock CLK_I2C3>;
                clock-names = "i2c";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x138A0000 0x100>;
                interrupts = <0 62 0>;
 -              clocks = <&clock 321>;
 +              clocks = <&clock CLK_I2C4>;
                clock-names = "i2c";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x138B0000 0x100>;
                interrupts = <0 63 0>;
 -              clocks = <&clock 322>;
 +              clocks = <&clock CLK_I2C5>;
                clock-names = "i2c";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x138C0000 0x100>;
                interrupts = <0 64 0>;
 -              clocks = <&clock 323>;
 +              clocks = <&clock CLK_I2C6>;
                clock-names = "i2c";
                status = "disabled";
        };
                compatible = "samsung,s3c2440-i2c";
                reg = <0x138D0000 0x100>;
                interrupts = <0 65 0>;
 -              clocks = <&clock 324>;
 +              clocks = <&clock CLK_I2C7>;
                clock-names = "i2c";
                status = "disabled";
        };
                dma-names = "tx", "rx";
                #address-cells = <1>;
                #size-cells = <0>;
 -              clocks = <&clock 327>, <&clock 159>;
 +              clocks = <&clock CLK_SPI0>, <&clock CLK_SCLK_SPI0>;
                clock-names = "spi", "spi_busclk0";
                pinctrl-names = "default";
                pinctrl-0 = <&spi0_bus>;
                dma-names = "tx", "rx";
                #address-cells = <1>;
                #size-cells = <0>;
 -              clocks = <&clock 328>, <&clock 160>;
 +              clocks = <&clock CLK_SPI1>, <&clock CLK_SCLK_SPI1>;
                clock-names = "spi", "spi_busclk0";
                pinctrl-names = "default";
                pinctrl-0 = <&spi1_bus>;
                dma-names = "tx", "rx";
                #address-cells = <1>;
                #size-cells = <0>;
 -              clocks = <&clock 329>, <&clock 161>;
 +              clocks = <&clock CLK_SPI2>, <&clock CLK_SCLK_SPI2>;
                clock-names = "spi", "spi_busclk0";
                pinctrl-names = "default";
                pinctrl-0 = <&spi2_bus>;
                compatible = "samsung,exynos4210-pwm";
                reg = <0x139D0000 0x1000>;
                interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>;
 -              clocks = <&clock 336>;
 +              clocks = <&clock CLK_PWM>;
                clock-names = "timers";
                #pwm-cells = <2>;
                status = "disabled";
                        compatible = "arm,pl330", "arm,primecell";
                        reg = <0x12680000 0x1000>;
                        interrupts = <0 35 0>;
 -                      clocks = <&clock 292>;
 +                      clocks = <&clock CLK_PDMA0>;
                        clock-names = "apb_pclk";
                        #dma-cells = <1>;
                        #dma-channels = <8>;
                        compatible = "arm,pl330", "arm,primecell";
                        reg = <0x12690000 0x1000>;
                        interrupts = <0 36 0>;
 -                      clocks = <&clock 293>;
 +                      clocks = <&clock CLK_PDMA1>;
                        clock-names = "apb_pclk";
                        #dma-cells = <1>;
                        #dma-channels = <8>;
                        compatible = "arm,pl330", "arm,primecell";
                        reg = <0x12850000 0x1000>;
                        interrupts = <0 34 0>;
 -                      clocks = <&clock 279>;
 +                      clocks = <&clock CLK_MDMA>;
                        clock-names = "apb_pclk";
                        #dma-cells = <1>;
                        #dma-channels = <8>;
                reg = <0x11c00000 0x20000>;
                interrupt-names = "fifo", "vsync", "lcd_sys";
                interrupts = <11 0>, <11 1>, <11 2>;
 -              clocks = <&clock 140>, <&clock 283>;
 +              clocks = <&clock CLK_SCLK_FIMD0>, <&clock CLK_FIMD0>;
                clock-names = "sclk_fimd", "fimd";
                samsung,power-domain = <&pd_lcd0>;
                status = "disabled";
index 361cb58052bf28990285275222e6fd9b1c095148,02c6768f52b45606914f6192f291c0e836dd059d..63aa2bb24a4bc3de1e37131eae21a30e1fc0f097
@@@ -17,7 -17,7 +17,7 @@@
  
  / {
        model = "Samsung Trats based on Exynos4210";
 -      compatible = "samsung,trats", "samsung,exynos4210";
 +      compatible = "samsung,trats", "samsung,exynos4210", "samsung,exynos4";
  
        memory {
                reg =  <0x40000000 0x10000000
                };
        };
  
+       dsi_0: dsi@11C80000 {
+               vddcore-supply = <&vusb_reg>;
+               vddio-supply = <&vmipi_reg>;
+               samsung,pll-clock-frequency = <24000000>;
+               status = "okay";
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       port@1 {
+                               reg = <1>;
+                               dsi_out: endpoint {
+                                       remote-endpoint = <&dsi_in>;
+                                       samsung,burst-clock-frequency = <500000000>;
+                                       samsung,esc-clock-frequency = <20000000>;
+                               };
+                       };
+               };
+               panel@0 {
+                       reg = <0>;
+                       compatible = "samsung,s6e8aa0";
+                       vdd3-supply = <&vcclcd_reg>;
+                       vci-supply = <&vlcd_reg>;
+                       reset-gpios = <&gpy4 5 0>;
+                       power-on-delay= <50>;
+                       reset-delay = <100>;
+                       init-delay = <100>;
+                       flip-horizontal;
+                       flip-vertical;
+                       panel-width-mm = <58>;
+                       panel-height-mm = <103>;
+                       display-timings {
+                               timing-0 {
+                                       clock-frequency = <57153600>;
+                                       hactive = <720>;
+                                       vactive = <1280>;
+                                       hfront-porch = <5>;
+                                       hback-porch = <5>;
+                                       hsync-len = <5>;
+                                       vfront-porch = <13>;
+                                       vback-porch = <1>;
+                                       vsync-len = <2>;
+                               };
+                       };
+                       port {
+                               dsi_in: endpoint {
+                                       remote-endpoint = <&dsi_out>;
+                               };
+                       };
+               };
+       };
+       fimd@11c00000 {
+               status = "okay";
+       };
        camera {
                pinctrl-names = "default";
                pinctrl-0 = <>;
index 27d3b70ee9e3afa822fba7a925b3693eae38dee4,0a80a72368d31efb6b5f7504775834835a7fe861..63e34b24b04f7fbf35b4f78e7e17ee8b4a314d05
@@@ -17,7 -17,7 +17,7 @@@
  
  / {
        model = "Samsung Universal C210 based on Exynos4210 rev0";
 -      compatible = "samsung,universal_c210", "samsung,exynos4210";
 +      compatible = "samsung,universal_c210", "samsung,exynos4210", "samsung,exynos4";
  
        memory {
                reg =  <0x40000000 0x10000000
                };
        };
  
+       spi-lcd {
+               compatible = "spi-gpio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               gpio-sck = <&gpy3 1 0>;
+               gpio-mosi = <&gpy3 3 0>;
+               num-chipselects = <1>;
+               cs-gpios = <&gpy4 3 0>;
+               lcd@0 {
+                       compatible = "samsung,ld9040";
+                       reg = <0>;
+                       vdd3-supply = <&ldo7_reg>;
+                       vci-supply = <&ldo17_reg>;
+                       reset-gpios = <&gpy4 5 0>;
+                       spi-max-frequency = <1200000>;
+                       spi-cpol;
+                       spi-cpha;
+                       power-on-delay = <10>;
+                       reset-delay = <10>;
+                       panel-width-mm = <90>;
+                       panel-height-mm = <154>;
+                       display-timings {
+                               timing {
+                                       clock-frequency = <23492370>;
+                                       hactive = <480>;
+                                       vactive = <800>;
+                                       hback-porch = <16>;
+                                       hfront-porch = <16>;
+                                       vback-porch = <2>;
+                                       vfront-porch = <28>;
+                                       hsync-len = <2>;
+                                       vsync-len = <1>;
+                                       hsync-active = <0>;
+                                       vsync-active = <0>;
+                                       de-active = <0>;
+                                       pixelclk-active = <0>;
+                               };
+                       };
+                       port {
+                               lcd_ep: endpoint {
+                                       remote-endpoint = <&fimd_dpi_ep>;
+                               };
+                       };
+               };
+       };
+       fimd: fimd@11c00000 {
+               pinctrl-0 = <&lcd_clk>, <&lcd_data24>;
+               pinctrl-names = "default";
+               status = "okay";
+               samsung,invert-vden;
+               samsung,invert-vclk;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               port@3 {
+                       reg = <3>;
+                       fimd_dpi_ep: endpoint {
+                               remote-endpoint = <&lcd_ep>;
+                       };
+               };
+       };
        pwm@139D0000 {
                compatible = "samsung,s5p6440-pwm";
                status = "okay";
index c16b3159b8138a4d0d0222114d638c77e1184227,53c717b6eb6918fab6527a104af0bf326254dd31..9583563dd0ef7a3f0d4cd89765a20bb243b10117
@@@ -17,7 -17,7 +17,7 @@@
  
  / {
        model = "Samsung Trats 2 based on Exynos4412";
 -      compatible = "samsung,trats2", "samsung,exynos4412";
 +      compatible = "samsung,trats2", "samsung,exynos4412", "samsung,exynos4";
  
        aliases {
                i2c8 = &i2c_ak8975;
                        enable-active-high;
                };
  
+               lcd_vdd3_reg: voltage-regulator-2 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "LCD_VDD_2.2V";
+                       regulator-min-microvolt = <2200000>;
+                       regulator-max-microvolt = <2200000>;
+                       gpio = <&gpc0 1 0>;
+                       enable-active-high;
+               };
                /* More to come */
        };
  
                };
        };
  
 +      adc: adc@126C0000 {
 +              vdd-supply = <&ldo3_reg>;
 +              status = "okay";
 +      };
 +
        i2c@13890000 {
                samsung,i2c-sda-delay = <100>;
                samsung,i2c-slave-addr = <0x10>;
                };
        };
  
+       dsi_0: dsi@11C80000 {
+               vddcore-supply = <&ldo8_reg>;
+               vddio-supply = <&ldo10_reg>;
+               samsung,pll-clock-frequency = <24000000>;
+               status = "okay";
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       port@1 {
+                               reg = <1>;
+                               dsi_out: endpoint {
+                                       remote-endpoint = <&dsi_in>;
+                                       samsung,burst-clock-frequency = <500000000>;
+                                       samsung,esc-clock-frequency = <20000000>;
+                               };
+                       };
+               };
+               panel@0 {
+                       compatible = "samsung,s6e8aa0";
+                       reg = <0>;
+                       vdd3-supply = <&lcd_vdd3_reg>;
+                       vci-supply = <&ldo25_reg>;
+                       reset-gpios = <&gpy4 5 0>;
+                       power-on-delay= <50>;
+                       reset-delay = <100>;
+                       init-delay = <100>;
+                       flip-horizontal;
+                       flip-vertical;
+                       panel-width-mm = <58>;
+                       panel-height-mm = <103>;
+                       display-timings {
+                               timing-0 {
+                                       clock-frequency = <0>;
+                                       hactive = <720>;
+                                       vactive = <1280>;
+                                       hfront-porch = <5>;
+                                       hback-porch = <5>;
+                                       hsync-len = <5>;
+                                       vfront-porch = <13>;
+                                       vback-porch = <1>;
+                                       vsync-len = <2>;
+                               };
+                       };
+                       port {
+                               dsi_in: endpoint {
+                                       remote-endpoint = <&dsi_out>;
+                               };
+                       };
+               };
+       };
+       fimd@11c00000 {
+               status = "okay";
+       };
        camera {
                pinctrl-0 = <&cam_port_b_clk_active>;
                pinctrl-names = "default";
                        };
                };
        };
 +
 +      thermistor-ap@0 {
 +              compatible = "ntc,ncp15wb473";
 +              pullup-uv = <1800000>;   /* VCC_1.8V_AP */
 +              pullup-ohm = <100000>;   /* 100K */
 +              pulldown-ohm = <100000>; /* 100K */
 +              io-channels = <&adc 1>;  /* AP temperature */
 +      };
 +
 +      thermistor-battery@1 {
 +              compatible = "ntc,ncp15wb473";
 +              pullup-uv = <1800000>;   /* VCC_1.8V_AP */
 +              pullup-ohm = <100000>;   /* 100K */
 +              pulldown-ohm = <100000>; /* 100K */
 +              io-channels = <&adc 2>;  /* Battery temperature */
 +      };
  };
index f7a81209beb38b92291e616b0171eb9d3f94fa62,1fbe8427c70e536bff5233c7cf81dba1355c0342..c43825e8f5c12c0ba4fd5e9b27181cfac8dfc4d0
@@@ -105,9 -105,6 +105,6 @@@ static void drm_mode_validate_flag(stru
   * @maxX: max width for modes
   * @maxY: max height for modes
   *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
   * Based on the helper callbacks implemented by @connector try to detect all
   * valid modes.  Modes will first be added to the connector's probed_modes list,
   * then culled (based on validity and the @maxX, @maxY parameters) and put into
   * @connector vfunc for drivers that use the crtc helpers for output mode
   * filtering and detection.
   *
-  * RETURNS:
-  * Number of modes found on @connector.
+  * Returns:
+  * The number of modes found on @connector.
   */
  int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
                                            uint32_t maxX, uint32_t maxY)
        int mode_flags = 0;
        bool verbose_prune = true;
  
+       WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
                        drm_get_connector_name(connector));
        /* set all modes to the unverified state */
        drm_mode_connector_list_update(connector);
  
        if (maxX && maxY)
-               drm_mode_validate_size(dev, &connector->modes, maxX,
-                                      maxY, 0);
+               drm_mode_validate_size(dev, &connector->modes, maxX, maxY);
  
        if (connector->interlace_allowed)
                mode_flags |= DRM_MODE_FLAG_INTERLACE;
@@@ -219,18 -217,19 +217,19 @@@ EXPORT_SYMBOL(drm_helper_probe_single_c
   * drm_helper_encoder_in_use - check if a given encoder is in use
   * @encoder: encoder to check
   *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
-  * Walk @encoders's DRM device's mode_config and see if it's in use.
+  * Checks whether @encoder is with the current mode setting output configuration
+  * in use by any connector. This doesn't mean that it is actually enabled since
+  * the DPMS state is tracked separately.
   *
-  * RETURNS:
-  * True if @encoder is part of the mode_config, false otherwise.
+  * Returns:
+  * True if @encoder is used, false otherwise.
   */
  bool drm_helper_encoder_in_use(struct drm_encoder *encoder)
  {
        struct drm_connector *connector;
        struct drm_device *dev = encoder->dev;
+       WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
        list_for_each_entry(connector, &dev->mode_config.connector_list, head)
                if (connector->encoder == encoder)
                        return true;
@@@ -242,19 -241,19 +241,19 @@@ EXPORT_SYMBOL(drm_helper_encoder_in_use
   * drm_helper_crtc_in_use - check if a given CRTC is in a mode_config
   * @crtc: CRTC to check
   *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
-  * Walk @crtc's DRM device's mode_config and see if it's in use.
+  * Checks whether @crtc is with the current mode setting output configuration
+  * in use by any connector. This doesn't mean that it is actually enabled since
+  * the DPMS state is tracked separately.
   *
-  * RETURNS:
-  * True if @crtc is part of the mode_config, false otherwise.
+  * Returns:
+  * True if @crtc is used, false otherwise.
   */
  bool drm_helper_crtc_in_use(struct drm_crtc *crtc)
  {
        struct drm_encoder *encoder;
        struct drm_device *dev = crtc->dev;
-       /* FIXME: Locking around list access? */
+       WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
                if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder))
                        return true;
@@@ -279,27 -278,17 +278,17 @@@ drm_encoder_disable(struct drm_encoder 
                encoder->bridge->funcs->post_disable(encoder->bridge);
  }
  
- /**
-  * drm_helper_disable_unused_functions - disable unused objects
-  * @dev: DRM device
-  *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
-  * If an connector or CRTC isn't part of @dev's mode_config, it can be disabled
-  * by calling its dpms function, which should power it off.
-  */
- void drm_helper_disable_unused_functions(struct drm_device *dev)
+ static void __drm_helper_disable_unused_functions(struct drm_device *dev)
  {
        struct drm_encoder *encoder;
        struct drm_connector *connector;
        struct drm_crtc *crtc;
  
+       drm_warn_on_modeset_not_all_locked(dev);
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                if (!connector->encoder)
                        continue;
-               if (connector->status == connector_status_disconnected)
-                       connector->encoder = NULL;
        }
  
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
                                (*crtc_funcs->disable)(crtc);
                        else
                                (*crtc_funcs->dpms)(crtc, DRM_MODE_DPMS_OFF);
-                       crtc->fb = NULL;
+                       crtc->primary->fb = NULL;
                }
        }
  }
+ /**
+  * drm_helper_disable_unused_functions - disable unused objects
+  * @dev: DRM device
+  *
+  * This function walks through the entire mode setting configuration of @dev. It
+  * will remove any crtc links of unused encoders and encoder links of
+  * disconnected connectors. Then it will disable all unused encoders and crtcs
+  * either by calling their disable callback if available or by calling their
+  * dpms callback with DRM_MODE_DPMS_OFF.
+  */
+ void drm_helper_disable_unused_functions(struct drm_device *dev)
+ {
+       drm_modeset_lock_all(dev);
+       __drm_helper_disable_unused_functions(dev);
+       drm_modeset_unlock_all(dev);
+ }
  EXPORT_SYMBOL(drm_helper_disable_unused_functions);
  
  /*
@@@ -355,9 -361,6 +361,6 @@@ drm_crtc_prepare_encoders(struct drm_de
   * @y: vertical offset into the surface
   * @old_fb: old framebuffer, for cleanup
   *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
   * Try to set @mode on @crtc.  Give @crtc and its associated connectors a chance
   * to fixup or reject the mode prior to trying to set it. This is an internal
   * helper that drivers could e.g. use to update properties that require the
   * drm_crtc_helper_set_config() helper function to drive the mode setting
   * sequence.
   *
-  * RETURNS:
-  * True if the mode was set successfully, or false otherwise.
+  * Returns:
+  * True if the mode was set successfully, false otherwise.
   */
  bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                              struct drm_display_mode *mode,
        struct drm_encoder *encoder;
        bool ret = true;
  
+       drm_warn_on_modeset_not_all_locked(dev);
        saved_enabled = crtc->enabled;
        crtc->enabled = drm_helper_crtc_in_use(crtc);
        if (!crtc->enabled)
@@@ -552,7 -557,7 +557,7 @@@ drm_crtc_helper_disable(struct drm_crt
                }
        }
  
-       drm_helper_disable_unused_functions(dev);
+       __drm_helper_disable_unused_functions(dev);
        return 0;
  }
  
   * drm_crtc_helper_set_config - set a new config from userspace
   * @set: mode set configuration
   *
-  * LOCKING:
-  * Caller must hold mode config lock.
-  *
   * Setup a new configuration, provided by the upper layers (either an ioctl call
 - * from userspace or internally e.g. from the fbdev suppport code) in @set, and
 + * from userspace or internally e.g. from the fbdev support code) in @set, and
   * enable it. This is the main helper functions for drivers that implement
   * kernel mode setting with the crtc helper functions and the assorted
   * ->prepare(), ->modeset() and ->commit() helper callbacks.
   *
-  * RETURNS:
-  * Returns 0 on success, -ERRNO on failure.
+  * Returns:
+  * Returns 0 on success, negative errno numbers on failure.
   */
  int drm_crtc_helper_set_config(struct drm_mode_set *set)
  {
  
        dev = set->crtc->dev;
  
+       drm_warn_on_modeset_not_all_locked(dev);
        /*
         * Allocate space for the backup of all (non-pointer) encoder and
         * connector data.
        save_set.mode = &set->crtc->mode;
        save_set.x = set->crtc->x;
        save_set.y = set->crtc->y;
-       save_set.fb = set->crtc->fb;
+       save_set.fb = set->crtc->primary->fb;
  
        /* We should be able to check here if the fb has the same properties
         * and then just flip_or_move it */
-       if (set->crtc->fb != set->fb) {
+       if (set->crtc->primary->fb != set->fb) {
                /* If we have no fb then treat it as a full mode set */
-               if (set->crtc->fb == NULL) {
+               if (set->crtc->primary->fb == NULL) {
                        DRM_DEBUG_KMS("crtc has no fb, full mode set\n");
                        mode_changed = true;
                } else if (set->fb == NULL) {
                        mode_changed = true;
                } else if (set->fb->pixel_format !=
-                          set->crtc->fb->pixel_format) {
+                          set->crtc->primary->fb->pixel_format) {
                        mode_changed = true;
                } else
                        fb_changed = true;
                                if (new_encoder == NULL)
                                        /* don't break so fail path works correct */
                                        fail = 1;
-                               break;
  
                                if (connector->dpms != DRM_MODE_DPMS_ON) {
                                        DRM_DEBUG_KMS("connector dpms not on, full mode switch\n");
                                        mode_changed = true;
                                }
+                               break;
                        }
                }
  
                        DRM_DEBUG_KMS("attempting to set mode from"
                                        " userspace\n");
                        drm_mode_debug_printmodeline(set->mode);
-                       set->crtc->fb = set->fb;
+                       set->crtc->primary->fb = set->fb;
                        if (!drm_crtc_helper_set_mode(set->crtc, set->mode,
                                                      set->x, set->y,
                                                      save_set.fb)) {
                                DRM_ERROR("failed to set mode on [CRTC:%d]\n",
                                          set->crtc->base.id);
-                               set->crtc->fb = save_set.fb;
+                               set->crtc->primary->fb = save_set.fb;
                                ret = -EINVAL;
                                goto fail;
                        }
                                set->connectors[i]->funcs->dpms(set->connectors[i], DRM_MODE_DPMS_ON);
                        }
                }
-               drm_helper_disable_unused_functions(dev);
+               __drm_helper_disable_unused_functions(dev);
        } else if (fb_changed) {
                set->crtc->x = set->x;
                set->crtc->y = set->y;
-               set->crtc->fb = set->fb;
+               set->crtc->primary->fb = set->fb;
                ret = crtc_funcs->mode_set_base(set->crtc,
                                                set->x, set->y, save_set.fb);
                if (ret != 0) {
                        set->crtc->x = save_set.x;
                        set->crtc->y = save_set.y;
-                       set->crtc->fb = save_set.fb;
+                       set->crtc->primary->fb = save_set.fb;
                        goto fail;
                }
        }
@@@ -924,8 -929,16 +929,16 @@@ void drm_helper_connector_dpms(struct d
  }
  EXPORT_SYMBOL(drm_helper_connector_dpms);
  
- int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
-                                  struct drm_mode_fb_cmd2 *mode_cmd)
+ /**
+  * drm_helper_mode_fill_fb_struct - fill out framebuffer metadata
+  * @fb: drm_framebuffer object to fill out
+  * @mode_cmd: metadata from the userspace fb creation request
+  *
+  * This helper can be used in a drivers fb_create callback to pre-fill the fb's
+  * metadata fields.
+  */
+ void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
+                                   struct drm_mode_fb_cmd2 *mode_cmd)
  {
        int i;
  
        drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth,
                                    &fb->bits_per_pixel);
        fb->pixel_format = mode_cmd->pixel_format;
-       return 0;
  }
  EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
  
- int drm_helper_resume_force_mode(struct drm_device *dev)
+ /**
+  * drm_helper_resume_force_mode - force-restore mode setting configuration
+  * @dev: drm_device which should be restored
+  *
+  * Drivers which use the mode setting helpers can use this function to
+  * force-restore the mode setting configuration e.g. on resume or when something
+  * else might have trampled over the hw state (like some overzealous old BIOSen
+  * tended to do).
+  *
+  * This helper doesn't provide a error return value since restoring the old
+  * config should never fail due to resource allocation issues since the driver
+  * has successfully set the restored configuration already. Hence this should
+  * boil down to the equivalent of a few dpms on calls, which also don't provide
+  * an error code.
+  *
+  * Drivers where simply restoring an old configuration again might fail (e.g.
+  * due to slight differences in allocating shared resources when the
+  * configuration is restored in a different order than when userspace set it up)
+  * need to use their own restore logic.
+  */
+ void drm_helper_resume_force_mode(struct drm_device *dev)
  {
        struct drm_crtc *crtc;
        struct drm_encoder *encoder;
        struct drm_crtc_helper_funcs *crtc_funcs;
-       int ret, encoder_dpms;
+       int encoder_dpms;
+       bool ret;
  
+       drm_modeset_lock_all(dev);
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
  
                if (!crtc->enabled)
                        continue;
  
                ret = drm_crtc_helper_set_mode(crtc, &crtc->mode,
-                                              crtc->x, crtc->y, crtc->fb);
+                                              crtc->x, crtc->y, crtc->primary->fb);
  
+               /* Restoring the old config should never fail! */
                if (ret == false)
                        DRM_ERROR("failed to set mode on crtc %p\n", crtc);
  
                                                     drm_helper_choose_crtc_dpms(crtc));
                }
        }
        /* disable the unused connectors while restoring the modesetting */
-       drm_helper_disable_unused_functions(dev);
-       return 0;
+       __drm_helper_disable_unused_functions(dev);
+       drm_modeset_unlock_all(dev);
  }
  EXPORT_SYMBOL(drm_helper_resume_force_mode);
  
+ /**
+  * drm_kms_helper_hotplug_event - fire off KMS hotplug events
+  * @dev: drm_device whose connector state changed
+  *
+  * This function fires off the uevent for userspace and also calls the
+  * output_poll_changed function, which is most commonly used to inform the fbdev
+  * emulation code and allow it to update the fbcon output configuration.
+  *
+  * Drivers should call this from their hotplug handling code when a change is
+  * detected. Note that this function does not do any output detection of its
+  * own, like drm_helper_hpd_irq_event() does - this is assumed to be done by the
+  * driver already.
+  *
+  * This function must be called from process context with no mode
+  * setting locks held.
+  */
  void drm_kms_helper_hotplug_event(struct drm_device *dev)
  {
        /* send a uevent + call fbdev */
@@@ -1054,6 -1105,16 +1105,16 @@@ static void output_poll_execute(struct 
                schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
  }
  
+ /**
+  * drm_kms_helper_poll_disable - disable output polling
+  * @dev: drm_device
+  *
+  * This function disables the output polling work.
+  *
+  * Drivers can call this helper from their device suspend implementation. It is
+  * not an error to call this even when output polling isn't enabled or arlready
+  * disabled.
+  */
  void drm_kms_helper_poll_disable(struct drm_device *dev)
  {
        if (!dev->mode_config.poll_enabled)
  }
  EXPORT_SYMBOL(drm_kms_helper_poll_disable);
  
+ /**
+  * drm_kms_helper_poll_enable - re-enable output polling.
+  * @dev: drm_device
+  *
+  * This function re-enables the output polling work.
+  *
+  * Drivers can call this helper from their device resume implementation. It is
+  * an error to call this when the output polling support has not yet been set
+  * up.
+  */
  void drm_kms_helper_poll_enable(struct drm_device *dev)
  {
        bool poll = false;
  }
  EXPORT_SYMBOL(drm_kms_helper_poll_enable);
  
+ /**
+  * drm_kms_helper_poll_init - initialize and enable output polling
+  * @dev: drm_device
+  *
+  * This function intializes and then also enables output polling support for
+  * @dev. Drivers which do not have reliable hotplug support in hardware can use
+  * this helper infrastructure to regularly poll such connectors for changes in
+  * their connection state.
+  *
+  * Drivers can control which connectors are polled by setting the
+  * DRM_CONNECTOR_POLL_CONNECT and DRM_CONNECTOR_POLL_DISCONNECT flags. On
+  * connectors where probing live outputs can result in visual distortion drivers
+  * should not set the DRM_CONNECTOR_POLL_DISCONNECT flag to avoid this.
+  * Connectors which have no flag or only DRM_CONNECTOR_POLL_HPD set are
+  * completely ignored by the polling logic.
+  *
+  * Note that a connector can be both polled and probed from the hotplug handler,
+  * in case the hotplug interrupt is known to be unreliable.
+  */
  void drm_kms_helper_poll_init(struct drm_device *dev)
  {
        INIT_DELAYED_WORK(&dev->mode_config.output_poll_work, output_poll_execute);
  }
  EXPORT_SYMBOL(drm_kms_helper_poll_init);
  
+ /**
+  * drm_kms_helper_poll_fini - disable output polling and clean it up
+  * @dev: drm_device
+  */
  void drm_kms_helper_poll_fini(struct drm_device *dev)
  {
        drm_kms_helper_poll_disable(dev);
  }
  EXPORT_SYMBOL(drm_kms_helper_poll_fini);
  
+ /**
+  * drm_helper_hpd_irq_event - hotplug processing
+  * @dev: drm_device
+  *
+  * Drivers can use this helper function to run a detect cycle on all connectors
+  * which have the DRM_CONNECTOR_POLL_HPD flag set in their &polled member. All
+  * other connectors are ignored, which is useful to avoid reprobing fixed
+  * panels.
+  *
+  * This helper function is useful for drivers which can't or don't track hotplug
+  * interrupts for each connector.
+  *
+  * Drivers which support hotplug interrupts for each connector individually and
+  * which have a more fine-grained detect logic should bypass this code and
+  * directly call drm_kms_helper_hotplug_event() in case the connector state
+  * changed.
+  *
+  * This function must be called from process context with no mode
+  * setting locks held.
+  *
+  * Note that a connector can be both polled and probed from the hotplug handler,
+  * in case the hotplug interrupt is known to be unreliable.
+  */
  bool drm_helper_hpd_irq_event(struct drm_device *dev)
  {
        struct drm_connector *connector;
index 309023f12d7ff7ab5413baf14af4f580c2a5ccbc,a0ce39c96f8e9c7c8bb320fb00850d8f4eec09bd..e1eba0b7cd45144a8a3b6337ec0ea3ebeb688ddf
  #include <linux/slab.h>
  #include <linux/module.h>
  
- /* from BKL pushdown: note that nothing else serializes idr_find() */
+ /* from BKL pushdown */
  DEFINE_MUTEX(drm_global_mutex);
  EXPORT_SYMBOL(drm_global_mutex);
  
  static int drm_open_helper(struct inode *inode, struct file *filp,
-                          struct drm_device * dev);
+                          struct drm_minor *minor);
  
  static int drm_setup(struct drm_device * dev)
  {
   */
  int drm_open(struct inode *inode, struct file *filp)
  {
-       struct drm_device *dev = NULL;
-       int minor_id = iminor(inode);
+       struct drm_device *dev;
        struct drm_minor *minor;
-       int retcode = 0;
+       int retcode;
        int need_setup = 0;
-       struct address_space *old_mapping;
-       struct address_space *old_imapping;
-       minor = idr_find(&drm_minors_idr, minor_id);
-       if (!minor)
-               return -ENODEV;
  
-       if (!(dev = minor->dev))
-               return -ENODEV;
-       if (drm_device_is_unplugged(dev))
-               return -ENODEV;
+       minor = drm_minor_acquire(iminor(inode));
+       if (IS_ERR(minor))
+               return PTR_ERR(minor);
  
+       dev = minor->dev;
        if (!dev->open_count++)
                need_setup = 1;
-       mutex_lock(&dev->struct_mutex);
-       old_imapping = inode->i_mapping;
-       old_mapping = dev->dev_mapping;
-       if (old_mapping == NULL)
-               dev->dev_mapping = &inode->i_data;
-       /* ihold ensures nobody can remove inode with our i_data */
-       ihold(container_of(dev->dev_mapping, struct inode, i_data));
-       inode->i_mapping = dev->dev_mapping;
-       filp->f_mapping = dev->dev_mapping;
-       mutex_unlock(&dev->struct_mutex);
  
-       retcode = drm_open_helper(inode, filp, dev);
+       /* share address_space across all char-devs of a single device */
+       filp->f_mapping = dev->anon_inode->i_mapping;
+       retcode = drm_open_helper(inode, filp, minor);
        if (retcode)
                goto err_undo;
        if (need_setup) {
        return 0;
  
  err_undo:
-       mutex_lock(&dev->struct_mutex);
-       filp->f_mapping = old_imapping;
-       inode->i_mapping = old_imapping;
-       iput(container_of(dev->dev_mapping, struct inode, i_data));
-       dev->dev_mapping = old_mapping;
-       mutex_unlock(&dev->struct_mutex);
        dev->open_count--;
+       drm_minor_release(minor);
        return retcode;
  }
  EXPORT_SYMBOL(drm_open);
   */
  int drm_stub_open(struct inode *inode, struct file *filp)
  {
-       struct drm_device *dev = NULL;
+       struct drm_device *dev;
        struct drm_minor *minor;
-       int minor_id = iminor(inode);
        int err = -ENODEV;
        const struct file_operations *new_fops;
  
        DRM_DEBUG("\n");
  
        mutex_lock(&drm_global_mutex);
-       minor = idr_find(&drm_minors_idr, minor_id);
-       if (!minor)
-               goto out;
-       if (!(dev = minor->dev))
-               goto out;
-       if (drm_device_is_unplugged(dev))
-               goto out;
+       minor = drm_minor_acquire(iminor(inode));
+       if (IS_ERR(minor))
+               goto out_unlock;
  
+       dev = minor->dev;
        new_fops = fops_get(dev->driver->fops);
        if (!new_fops)
-               goto out;
+               goto out_release;
  
        replace_fops(filp, new_fops);
        if (filp->f_op->open)
                err = filp->f_op->open(inode, filp);
- out:
+ out_release:
+       drm_minor_release(minor);
+ out_unlock:
        mutex_unlock(&drm_global_mutex);
        return err;
  }
@@@ -196,16 -173,16 +173,16 @@@ static int drm_cpu_valid(void
   *
   * \param inode device inode.
   * \param filp file pointer.
-  * \param dev device.
+  * \param minor acquired minor-object.
   * \return zero on success or a negative number on failure.
   *
   * Creates and initializes a drm_file structure for the file private data in \p
   * filp and add it into the double linked list in \p dev.
   */
  static int drm_open_helper(struct inode *inode, struct file *filp,
-                          struct drm_device * dev)
+                          struct drm_minor *minor)
  {
-       int minor_id = iminor(inode);
+       struct drm_device *dev = minor->dev;
        struct drm_file *priv;
        int ret;
  
        if (dev->switch_power_state != DRM_SWITCH_POWER_ON && dev->switch_power_state != DRM_SWITCH_POWER_DYNAMIC_OFF)
                return -EINVAL;
  
-       DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor_id);
+       DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor->index);
  
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
        priv->filp = filp;
        priv->uid = current_euid();
        priv->pid = get_pid(task_pid(current));
-       priv->minor = idr_find(&drm_minors_idr, minor_id);
-       if (!priv->minor) {
-               ret = -ENODEV;
-               goto out_put_pid;
-       }
+       priv->minor = minor;
  
        /* for compatibility root is always authenticated */
        priv->always_authenticated = capable(CAP_SYS_ADMIN);
  
        /* if there is no current master make this fd it, but do not create
         * any master object for render clients */
-       mutex_lock(&dev->struct_mutex);
-       if (!priv->minor->master && !drm_is_render_client(priv)) {
+       mutex_lock(&dev->master_mutex);
+       if (drm_is_primary_client(priv) && !priv->minor->master) {
                /* create a new master */
                priv->minor->master = drm_master_create(priv->minor);
                if (!priv->minor->master) {
-                       mutex_unlock(&dev->struct_mutex);
                        ret = -ENOMEM;
                        goto out_close;
                }
                priv->is_master = 1;
                /* take another reference for the copy in the local file priv */
                priv->master = drm_master_get(priv->minor->master);
                priv->authenticated = 1;
  
-               mutex_unlock(&dev->struct_mutex);
                if (dev->driver->master_create) {
                        ret = dev->driver->master_create(dev, priv->master);
                        if (ret) {
-                               mutex_lock(&dev->struct_mutex);
                                /* drop both references if this fails */
                                drm_master_put(&priv->minor->master);
                                drm_master_put(&priv->master);
-                               mutex_unlock(&dev->struct_mutex);
                                goto out_close;
                        }
                }
-               mutex_lock(&dev->struct_mutex);
                if (dev->driver->master_set) {
                        ret = dev->driver->master_set(dev, priv, true);
                        if (ret) {
                                /* drop both references if this fails */
                                drm_master_put(&priv->minor->master);
                                drm_master_put(&priv->master);
-                               mutex_unlock(&dev->struct_mutex);
                                goto out_close;
                        }
                }
-       } else if (!drm_is_render_client(priv)) {
+       } else if (drm_is_primary_client(priv)) {
                /* get a reference to the master */
                priv->master = drm_master_get(priv->minor->master);
        }
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->master_mutex);
  
        mutex_lock(&dev->struct_mutex);
        list_add(&priv->lhead, &dev->filelist);
                        pci_dev_put(pci_dev);
                }
                if (!dev->hose) {
 -                      struct pci_bus *b = pci_bus_b(pci_root_buses.next);
 +                      struct pci_bus *b = list_entry(pci_root_buses.next,
 +                              struct pci_bus, node);
                        if (b)
                                dev->hose = b->sysdata;
                }
        return 0;
  
  out_close:
+       mutex_unlock(&dev->master_mutex);
        if (dev->driver->postclose)
                dev->driver->postclose(dev, priv);
  out_prime_destroy:
                drm_prime_destroy_file_private(&priv->prime);
        if (dev->driver->driver_features & DRIVER_GEM)
                drm_gem_release(dev, priv);
- out_put_pid:
        put_pid(priv->pid);
        kfree(priv);
        filp->private_data = NULL;
@@@ -435,7 -400,6 +401,6 @@@ int drm_lastclose(struct drm_device * d
  
        drm_legacy_dma_takedown(dev);
  
-       dev->dev_mapping = NULL;
        mutex_unlock(&dev->struct_mutex);
  
        drm_legacy_dev_reinit(dev);
  int drm_release(struct inode *inode, struct file *filp)
  {
        struct drm_file *file_priv = filp->private_data;
-       struct drm_device *dev = file_priv->minor->dev;
+       struct drm_minor *minor = file_priv->minor;
+       struct drm_device *dev = minor->dev;
        int retcode = 0;
  
        mutex_lock(&drm_global_mutex);
  
        DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
                  task_pid_nr(current),
-                 (long)old_encode_dev(file_priv->minor->device),
+                 (long)old_encode_dev(file_priv->minor->kdev->devt),
                  dev->open_count);
  
        /* Release any auth tokens that might point to this file_priv,
        }
        mutex_unlock(&dev->ctxlist_mutex);
  
-       mutex_lock(&dev->struct_mutex);
+       mutex_lock(&dev->master_mutex);
  
        if (file_priv->is_master) {
                struct drm_master *master = file_priv->master;
                struct drm_file *temp;
+               mutex_lock(&dev->struct_mutex);
                list_for_each_entry(temp, &dev->filelist, lhead) {
                        if ((temp->master == file_priv->master) &&
                            (temp != file_priv))
                        master->lock.file_priv = NULL;
                        wake_up_interruptible_all(&master->lock.lock_queue);
                }
+               mutex_unlock(&dev->struct_mutex);
  
                if (file_priv->minor->master == file_priv->master) {
                        /* drop the reference held my the minor */
                }
        }
  
-       BUG_ON(dev->dev_mapping == NULL);
-       iput(container_of(dev->dev_mapping, struct inode, i_data));
-       /* drop the reference held my the file priv */
+       /* drop the master reference held by the file priv */
        if (file_priv->master)
                drm_master_put(&file_priv->master);
        file_priv->is_master = 0;
+       mutex_unlock(&dev->master_mutex);
+       mutex_lock(&dev->struct_mutex);
        list_del(&file_priv->lhead);
        mutex_unlock(&dev->struct_mutex);
  
        }
        mutex_unlock(&drm_global_mutex);
  
+       drm_minor_release(minor);
        return retcode;
  }
  EXPORT_SYMBOL(drm_release);
index bb516fdd195d463ca7627a2a1a69cb8d665a03fb,f1437b6c8dbf7f18c24b72790cc1e9036a377662..304ca8cacbc44f3cb27829551a4ead61472c5171
@@@ -68,7 -68,8 +68,8 @@@ struct drm_prime_attachment 
        enum dma_data_direction dir;
  };
  
- static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle)
+ static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
+                                   struct dma_buf *dma_buf, uint32_t handle)
  {
        struct drm_prime_member *member;
  
@@@ -174,7 -175,7 +175,7 @@@ void drm_prime_remove_buf_handle_locked
  }
  
  static struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
-               enum dma_data_direction dir)
+                                           enum dma_data_direction dir)
  {
        struct drm_prime_attachment *prime_attach = attach->priv;
        struct drm_gem_object *obj = attach->dmabuf->priv;
  }
  
  static void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
-               struct sg_table *sgt, enum dma_data_direction dir)
+                                 struct sg_table *sgt,
+                                 enum dma_data_direction dir)
  {
        /* nothing to be done here */
  }
  
+ /**
+  * drm_gem_dmabuf_release - dma_buf release implementation for GEM
+  * @dma_buf: buffer to be released
+  *
+  * Generic release function for dma_bufs exported as PRIME buffers. GEM drivers
+  * must use this in their dma_buf ops structure as the release callback.
+  */
  void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
  {
        struct drm_gem_object *obj = dma_buf->priv;
@@@ -242,30 -251,30 +251,30 @@@ static void drm_gem_dmabuf_vunmap(struc
  }
  
  static void *drm_gem_dmabuf_kmap_atomic(struct dma_buf *dma_buf,
-               unsigned long page_num)
+                                       unsigned long page_num)
  {
        return NULL;
  }
  
  static void drm_gem_dmabuf_kunmap_atomic(struct dma_buf *dma_buf,
-               unsigned long page_num, void *addr)
+                                        unsigned long page_num, void *addr)
  {
  
  }
  static void *drm_gem_dmabuf_kmap(struct dma_buf *dma_buf,
-               unsigned long page_num)
+                                unsigned long page_num)
  {
        return NULL;
  }
  
  static void drm_gem_dmabuf_kunmap(struct dma_buf *dma_buf,
-               unsigned long page_num, void *addr)
+                                 unsigned long page_num, void *addr)
  {
  
  }
  
  static int drm_gem_dmabuf_mmap(struct dma_buf *dma_buf,
-               struct vm_area_struct *vma)
+                              struct vm_area_struct *vma)
  {
        struct drm_gem_object *obj = dma_buf->priv;
        struct drm_device *dev = obj->dev;
@@@ -315,6 -324,15 +324,15 @@@ static const struct dma_buf_ops drm_gem
   *    driver's scatter/gather table
   */
  
+ /**
+  * drm_gem_prime_export - helper library implemention of the export callback
+  * @dev: drm_device to export from
+  * @obj: GEM object to export
+  * @flags: flags like DRM_CLOEXEC
+  *
+  * This is the implementation of the gem_prime_export functions for GEM drivers
+  * using the PRIME helpers.
+  */
  struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
                                     struct drm_gem_object *obj, int flags)
  {
@@@ -355,9 -373,23 +373,23 @@@ static struct dma_buf *export_and_regis
        return dmabuf;
  }
  
+ /**
+  * drm_gem_prime_handle_to_fd - PRIME export function for GEM drivers
+  * @dev: dev to export the buffer from
+  * @file_priv: drm file-private structure
+  * @handle: buffer handle to export
+  * @flags: flags like DRM_CLOEXEC
+  * @prime_fd: pointer to storage for the fd id of the create dma-buf
+  *
+  * This is the PRIME export function which must be used mandatorily by GEM
+  * drivers to ensure correct lifetime management of the underlying GEM object.
+  * The actual exporting from GEM object to a dma-buf is done through the
+  * gem_prime_export driver callback.
+  */
  int drm_gem_prime_handle_to_fd(struct drm_device *dev,
-               struct drm_file *file_priv, uint32_t handle, uint32_t flags,
-               int *prime_fd)
+                              struct drm_file *file_priv, uint32_t handle,
+                              uint32_t flags,
+                              int *prime_fd)
  {
        struct drm_gem_object *obj;
        int ret = 0;
@@@ -441,6 -473,14 +473,14 @@@ out_unlock
  }
  EXPORT_SYMBOL(drm_gem_prime_handle_to_fd);
  
+ /**
+  * drm_gem_prime_import - helper library implemention of the import callback
+  * @dev: drm_device to import into
+  * @dma_buf: dma-buf object to import
+  *
+  * This is the implementation of the gem_prime_import functions for GEM drivers
+  * using the PRIME helpers.
+  */
  struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
                                            struct dma_buf *dma_buf)
  {
        get_dma_buf(dma_buf);
  
        sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
 -      if (IS_ERR_OR_NULL(sgt)) {
 +      if (IS_ERR(sgt)) {
                ret = PTR_ERR(sgt);
                goto fail_detach;
        }
@@@ -496,8 -536,21 +536,21 @@@ fail_detach
  }
  EXPORT_SYMBOL(drm_gem_prime_import);
  
+ /**
+  * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers
+  * @dev: dev to export the buffer from
+  * @file_priv: drm file-private structure
+  * @prime_fd: fd id of the dma-buf which should be imported
+  * @handle: pointer to storage for the handle of the imported buffer object
+  *
+  * This is the PRIME import function which must be used mandatorily by GEM
+  * drivers to ensure correct lifetime management of the underlying GEM object.
+  * The actual importing of GEM object from the dma-buf is done through the
+  * gem_import_export driver callback.
+  */
  int drm_gem_prime_fd_to_handle(struct drm_device *dev,
-               struct drm_file *file_priv, int prime_fd, uint32_t *handle)
+                              struct drm_file *file_priv, int prime_fd,
+                              uint32_t *handle)
  {
        struct dma_buf *dma_buf;
        struct drm_gem_object *obj;
@@@ -598,12 -651,14 +651,14 @@@ int drm_prime_fd_to_handle_ioctl(struc
                        args->fd, &args->handle);
  }
  
- /*
-  * drm_prime_pages_to_sg
+ /**
+  * drm_prime_pages_to_sg - converts a page array into an sg list
+  * @pages: pointer to the array of page pointers to convert
+  * @nr_pages: length of the page vector
   *
-  * this helper creates an sg table object from a set of pages
+  * This helper creates an sg table object from a set of pages
   * the driver is responsible for mapping the pages into the
-  * importers address space
+  * importers address space for use with dma_buf itself.
   */
  struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages)
  {
@@@ -628,9 -683,16 +683,16 @@@ out
  }
  EXPORT_SYMBOL(drm_prime_pages_to_sg);
  
- /* export an sg table into an array of pages and addresses
-    this is currently required by the TTM driver in order to do correct fault
-    handling */
+ /**
+  * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
+  * @sgt: scatter-gather table to convert
+  * @pages: array of page pointers to store the page array in
+  * @addrs: optional array to store the dma bus address of each page
+  * @max_pages: size of both the passed-in arrays
+  *
+  * Exports an sg table into an array of pages and addresses. This is currently
+  * required by the TTM driver in order to do correct fault handling.
+  */
  int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
                                     dma_addr_t *addrs, int max_pages)
  {
        return 0;
  }
  EXPORT_SYMBOL(drm_prime_sg_to_page_addr_arrays);
- /* helper function to cleanup a GEM/prime object */
+ /**
+  * drm_prime_gem_destroy - helper to clean up a PRIME-imported GEM object
+  * @obj: GEM object which was created from a dma-buf
+  * @sg: the sg-table which was pinned at import time
+  *
+  * This is the cleanup functions which GEM drivers need to call when they use
+  * @drm_gem_prime_import to import dma-bufs.
+  */
  void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
  {
        struct dma_buf_attachment *attach;
@@@ -683,11 -753,9 +753,9 @@@ void drm_prime_init_file_private(struc
        INIT_LIST_HEAD(&prime_fpriv->head);
        mutex_init(&prime_fpriv->lock);
  }
- EXPORT_SYMBOL(drm_prime_init_file_private);
  
  void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
  {
        /* by now drm_gem_release should've made sure the list is empty */
        WARN_ON(!list_empty(&prime_fpriv->head));
  }
- EXPORT_SYMBOL(drm_prime_destroy_file_private);
index a8f9dba2a816075781aa1e420543f7a0df488197,4c5cf6843137328f07f73100b6876009b1b5a911..ce3e6a30deaab13bffb8d0c06a1b1cdb4bd3e366
@@@ -53,22 -53,6 +53,6 @@@ enum exynos_drm_output_type 
        EXYNOS_DISPLAY_TYPE_VIDI,
  };
  
- /*
-  * Exynos drm overlay ops structure.
-  *
-  * @mode_set: copy drm overlay info to hw specific overlay info.
-  * @commit: apply hardware specific overlay data to registers.
-  * @enable: enable hardware specific overlay.
-  * @disable: disable hardware specific overlay.
-  */
- struct exynos_drm_overlay_ops {
-       void (*mode_set)(struct device *subdrv_dev,
-                        struct exynos_drm_overlay *overlay);
-       void (*commit)(struct device *subdrv_dev, int zpos);
-       void (*enable)(struct device *subdrv_dev, int zpos);
-       void (*disable)(struct device *subdrv_dev, int zpos);
- };
  /*
   * Exynos drm common overlay structure.
   *
@@@ -138,77 -122,110 +122,110 @@@ struct exynos_drm_overlay 
   * Exynos DRM Display Structure.
   *    - this structure is common to analog tv, digital tv and lcd panel.
   *
-  * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI.
-  * @is_connected: check for that display is connected or not.
-  * @get_edid: get edid modes from display driver.
-  * @get_panel: get panel object from display driver.
+  * @initialize: initializes the display with drm_dev
+  * @remove: cleans up the display for removal
+  * @mode_fixup: fix mode data comparing to hw specific display mode.
+  * @mode_set: convert drm_display_mode to hw specific display mode and
+  *          would be called by encoder->mode_set().
   * @check_mode: check if mode is valid or not.
-  * @power_on: display device on or off.
+  * @dpms: display device on or off.
+  * @commit: apply changes to hw
   */
+ struct exynos_drm_display;
  struct exynos_drm_display_ops {
+       int (*initialize)(struct exynos_drm_display *display,
+                               struct drm_device *drm_dev);
+       int (*create_connector)(struct exynos_drm_display *display,
+                               struct drm_encoder *encoder);
+       void (*remove)(struct exynos_drm_display *display);
+       void (*mode_fixup)(struct exynos_drm_display *display,
+                               struct drm_connector *connector,
+                               const struct drm_display_mode *mode,
+                               struct drm_display_mode *adjusted_mode);
+       void (*mode_set)(struct exynos_drm_display *display,
+                               struct drm_display_mode *mode);
+       int (*check_mode)(struct exynos_drm_display *display,
+                               struct drm_display_mode *mode);
+       void (*dpms)(struct exynos_drm_display *display, int mode);
+       void (*commit)(struct exynos_drm_display *display);
+ };
+ /*
+  * Exynos drm display structure, maps 1:1 with an encoder/connector
+  *
+  * @list: the list entry for this manager
+  * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI.
+  * @encoder: encoder object this display maps to
+  * @connector: connector object this display maps to
+  * @ops: pointer to callbacks for exynos drm specific functionality
+  * @ctx: A pointer to the display's implementation specific context
+  */
+ struct exynos_drm_display {
+       struct list_head list;
        enum exynos_drm_output_type type;
-       bool (*is_connected)(struct device *dev);
-       struct edid *(*get_edid)(struct device *dev,
-                       struct drm_connector *connector);
-       void *(*get_panel)(struct device *dev);
-       int (*check_mode)(struct device *dev, struct drm_display_mode *mode);
-       int (*power_on)(struct device *dev, int mode);
+       struct drm_encoder *encoder;
+       struct drm_connector *connector;
+       struct exynos_drm_display_ops *ops;
+       void *ctx;
  };
  
  /*
   * Exynos drm manager ops
   *
+  * @initialize: initializes the manager with drm_dev
+  * @remove: cleans up the manager for removal
   * @dpms: control device power.
-  * @apply: set timing, vblank and overlay data to registers.
-  * @mode_fixup: fix mode data comparing to hw specific display mode.
-  * @mode_set: convert drm_display_mode to hw specific display mode and
-  *          would be called by encoder->mode_set().
-  * @get_max_resol: get maximum resolution to specific hardware.
+  * @mode_fixup: fix mode data before applying it
+  * @mode_set: set the given mode to the manager
   * @commit: set current hw specific display mode to hw.
   * @enable_vblank: specific driver callback for enabling vblank interrupt.
   * @disable_vblank: specific driver callback for disabling vblank interrupt.
   * @wait_for_vblank: wait for vblank interrupt to make sure that
   *    hardware overlay is updated.
+  * @win_mode_set: copy drm overlay info to hw specific overlay info.
+  * @win_commit: apply hardware specific overlay data to registers.
+  * @win_enable: enable hardware specific overlay.
+  * @win_disable: disable hardware specific overlay.
   */
+ struct exynos_drm_manager;
  struct exynos_drm_manager_ops {
-       void (*dpms)(struct device *subdrv_dev, int mode);
-       void (*apply)(struct device *subdrv_dev);
-       void (*mode_fixup)(struct device *subdrv_dev,
-                               struct drm_connector *connector,
+       int (*initialize)(struct exynos_drm_manager *mgr,
+                               struct drm_device *drm_dev, int pipe);
+       void (*remove)(struct exynos_drm_manager *mgr);
+       void (*dpms)(struct exynos_drm_manager *mgr, int mode);
+       bool (*mode_fixup)(struct exynos_drm_manager *mgr,
                                const struct drm_display_mode *mode,
                                struct drm_display_mode *adjusted_mode);
-       void (*mode_set)(struct device *subdrv_dev, void *mode);
-       void (*get_max_resol)(struct device *subdrv_dev, unsigned int *width,
-                               unsigned int *height);
-       void (*commit)(struct device *subdrv_dev);
-       int (*enable_vblank)(struct device *subdrv_dev);
-       void (*disable_vblank)(struct device *subdrv_dev);
-       void (*wait_for_vblank)(struct device *subdrv_dev);
+       void (*mode_set)(struct exynos_drm_manager *mgr,
+                               const struct drm_display_mode *mode);
+       void (*commit)(struct exynos_drm_manager *mgr);
+       int (*enable_vblank)(struct exynos_drm_manager *mgr);
+       void (*disable_vblank)(struct exynos_drm_manager *mgr);
+       void (*wait_for_vblank)(struct exynos_drm_manager *mgr);
+       void (*win_mode_set)(struct exynos_drm_manager *mgr,
+                               struct exynos_drm_overlay *overlay);
+       void (*win_commit)(struct exynos_drm_manager *mgr, int zpos);
+       void (*win_enable)(struct exynos_drm_manager *mgr, int zpos);
+       void (*win_disable)(struct exynos_drm_manager *mgr, int zpos);
  };
  
  /*
-  * Exynos drm common manager structure.
+  * Exynos drm common manager structure, maps 1:1 with a crtc
   *
-  * @dev: pointer to device object for subdrv device driver.
-  *    sub drivers such as display controller or hdmi driver,
-  *    have their own device object.
-  * @ops: pointer to callbacks for exynos drm specific framebuffer.
-  *    these callbacks should be set by specific drivers such fimd
-  *    or hdmi driver and are used to control hardware global registers.
-  * @overlay_ops: pointer to callbacks for exynos drm specific framebuffer.
-  *    these callbacks should be set by specific drivers such fimd
-  *    or hdmi driver and are used to control hardware overlay reigsters.
-  * @display: pointer to callbacks for exynos drm specific framebuffer.
-  *    these callbacks should be set by specific drivers such fimd
-  *    or hdmi driver and are used to control display devices such as
-  *    analog tv, digital tv and lcd panel and also get timing data for them.
+  * @list: the list entry for this manager
+  * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI.
+  * @drm_dev: pointer to the drm device
+  * @pipe: the pipe number for this crtc/manager
+  * @ops: pointer to callbacks for exynos drm specific functionality
+  * @ctx: A pointer to the manager's implementation specific context
   */
  struct exynos_drm_manager {
-       struct device *dev;
+       struct list_head list;
+       enum exynos_drm_output_type type;
+       struct drm_device *drm_dev;
        int pipe;
        struct exynos_drm_manager_ops *ops;
-       struct exynos_drm_overlay_ops *overlay_ops;
-       struct exynos_drm_display_ops *display_ops;
+       void *ctx;
  };
  
  struct exynos_drm_g2d_private {
@@@ -237,6 -254,7 +254,6 @@@ struct drm_exynos_file_private 
   *    otherwise default one.
   * @da_space_size: size of device address space.
   *    if 0 then default value is used for it.
 - * @da_space_order: order to device address space.
   */
  struct exynos_drm_private {
        struct drm_fb_helper *fb_helper;
  
        unsigned long da_start;
        unsigned long da_space_size;
 -      unsigned long da_space_order;
  };
  
  /*
   *    by probe callback.
   * @open: this would be called with drm device file open.
   * @close: this would be called with drm device file close.
-  * @encoder: encoder object owned by this sub driver.
-  * @connector: connector object owned by this sub driver.
   */
  struct exynos_drm_subdrv {
        struct list_head list;
        struct device *dev;
        struct drm_device *drm_dev;
-       struct exynos_drm_manager *manager;
  
        int (*probe)(struct drm_device *drm_dev, struct device *dev);
        void (*remove)(struct drm_device *drm_dev, struct device *dev);
                        struct drm_file *file);
        void (*close)(struct drm_device *drm_dev, struct device *dev,
                        struct drm_file *file);
-       struct drm_encoder *encoder;
-       struct drm_connector *connector;
  };
  
  /*
@@@ -303,6 -316,16 +314,16 @@@ int exynos_drm_device_register(struct d
   */
  int exynos_drm_device_unregister(struct drm_device *dev);
  
+ int exynos_drm_initialize_managers(struct drm_device *dev);
+ void exynos_drm_remove_managers(struct drm_device *dev);
+ int exynos_drm_initialize_displays(struct drm_device *dev);
+ void exynos_drm_remove_displays(struct drm_device *dev);
+ int exynos_drm_manager_register(struct exynos_drm_manager *manager);
+ int exynos_drm_manager_unregister(struct exynos_drm_manager *manager);
+ int exynos_drm_display_register(struct exynos_drm_display *display);
+ int exynos_drm_display_unregister(struct exynos_drm_display *display);
  /*
   * this function would be called by sub drivers such as display controller
   * or hdmi driver to register this sub driver object to exynos drm driver
@@@ -338,6 -361,16 +359,16 @@@ int exynos_platform_device_ipp_register
   */
  void exynos_platform_device_ipp_unregister(void);
  
+ #ifdef CONFIG_DRM_EXYNOS_DPI
+ int exynos_dpi_probe(struct device *dev);
+ int exynos_dpi_remove(struct device *dev);
+ #else
+ static inline int exynos_dpi_probe(struct device *dev) { return 0; }
+ static inline int exynos_dpi_remove(struct device *dev) { return 0; }
+ #endif
+ extern struct platform_driver dp_driver;
+ extern struct platform_driver dsi_driver;
  extern struct platform_driver fimd_driver;
  extern struct platform_driver hdmi_driver;
  extern struct platform_driver mixer_driver;
index c3e67ba94446d34a24b420c72804e029384948d7,3e14a9b3525286de73fffc3c82cb2af838a9ac79..0eaf11c199395573b3fd5c75df6431907cb964fa
@@@ -18,6 -18,7 +18,7 @@@
  #include <drm/drmP.h>
  #include "psb_drv.h"
  #include "psb_reg.h"
+ #include "mmu.h"
  
  /*
   * Code for the SGX MMU:
   * but on average it should be fast.
   */
  
- struct psb_mmu_driver {
-       /* protects driver- and pd structures. Always take in read mode
-        * before taking the page table spinlock.
-        */
-       struct rw_semaphore sem;
-       /* protects page tables, directory tables and pt tables.
-        * and pt structures.
-        */
-       spinlock_t lock;
-       atomic_t needs_tlbflush;
-       uint8_t __iomem *register_map;
-       struct psb_mmu_pd *default_pd;
-       /*uint32_t bif_ctrl;*/
-       int has_clflush;
-       int clflush_add;
-       unsigned long clflush_mask;
-       struct drm_psb_private *dev_priv;
- };
- struct psb_mmu_pd;
- struct psb_mmu_pt {
-       struct psb_mmu_pd *pd;
-       uint32_t index;
-       uint32_t count;
-       struct page *p;
-       uint32_t *v;
- };
- struct psb_mmu_pd {
-       struct psb_mmu_driver *driver;
-       int hw_context;
-       struct psb_mmu_pt **tables;
-       struct page *p;
-       struct page *dummy_pt;
-       struct page *dummy_page;
-       uint32_t pd_mask;
-       uint32_t invalid_pde;
-       uint32_t invalid_pte;
- };
  static inline uint32_t psb_mmu_pt_index(uint32_t offset)
  {
        return (offset >> PSB_PTE_SHIFT) & 0x3FF;
@@@ -102,13 -58,13 +58,13 @@@ static inline uint32_t psb_mmu_pd_index
        return offset >> PSB_PDE_SHIFT;
  }
  
+ #if defined(CONFIG_X86)
  static inline void psb_clflush(void *addr)
  {
        __asm__ __volatile__("clflush (%0)\n" : : "r"(addr) : "memory");
  }
  
- static inline void psb_mmu_clflush(struct psb_mmu_driver *driver,
-                                  void *addr)
+ static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
  {
        if (!driver->has_clflush)
                return;
        psb_clflush(addr);
        mb();
  }
+ #else
  
- static void psb_page_clflush(struct psb_mmu_driver *driver, struct page* page)
- {
-       uint32_t clflush_add = driver->clflush_add >> PAGE_SHIFT;
-       uint32_t clflush_count = PAGE_SIZE / clflush_add;
-       int i;
-       uint8_t *clf;
-       clf = kmap_atomic(page);
-       mb();
-       for (i = 0; i < clflush_count; ++i) {
-               psb_clflush(clf);
-               clf += clflush_add;
-       }
-       mb();
-       kunmap_atomic(clf);
+ static inline void psb_mmu_clflush(struct psb_mmu_driver *driver, void *addr)
+ {;
  }
  
- static void psb_pages_clflush(struct psb_mmu_driver *driver,
-                               struct page *page[], unsigned long num_pages)
- {
-       int i;
-       if (!driver->has_clflush)
-               return ;
+ #endif
  
-       for (i = 0; i < num_pages; i++)
-               psb_page_clflush(driver, *page++);
- }
- static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver,
-                                   int force)
+ static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
  {
+       struct drm_device *dev = driver->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       if (atomic_read(&driver->needs_tlbflush) || force) {
+               uint32_t val = PSB_RSGX32(PSB_CR_BIF_CTRL);
+               PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
+               /* Make sure data cache is turned off before enabling it */
+               wmb();
+               PSB_WSGX32(val & ~_PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
+               (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
+               if (driver->msvdx_mmu_invaldc)
+                       atomic_set(driver->msvdx_mmu_invaldc, 1);
+       }
        atomic_set(&driver->needs_tlbflush, 0);
  }
  
+ #if 0
  static void psb_mmu_flush_pd(struct psb_mmu_driver *driver, int force)
  {
        down_write(&driver->sem);
        psb_mmu_flush_pd_locked(driver, force);
        up_write(&driver->sem);
  }
+ #endif
  
- void psb_mmu_flush(struct psb_mmu_driver *driver, int rc_prot)
+ void psb_mmu_flush(struct psb_mmu_driver *driver)
  {
-       if (rc_prot)
-               down_write(&driver->sem);
-       if (rc_prot)
-               up_write(&driver->sem);
+       struct drm_device *dev = driver->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       uint32_t val;
+       down_write(&driver->sem);
+       val = PSB_RSGX32(PSB_CR_BIF_CTRL);
+       if (atomic_read(&driver->needs_tlbflush))
+               PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
+       else
+               PSB_WSGX32(val | _PSB_CB_CTRL_FLUSH, PSB_CR_BIF_CTRL);
+       /* Make sure data cache is turned off and MMU is flushed before
+          restoring bank interface control register */
+       wmb();
+       PSB_WSGX32(val & ~(_PSB_CB_CTRL_FLUSH | _PSB_CB_CTRL_INVALDC),
+                  PSB_CR_BIF_CTRL);
+       (void)PSB_RSGX32(PSB_CR_BIF_CTRL);
+       atomic_set(&driver->needs_tlbflush, 0);
+       if (driver->msvdx_mmu_invaldc)
+               atomic_set(driver->msvdx_mmu_invaldc, 1);
+       up_write(&driver->sem);
  }
  
  void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context)
  {
-       /*ttm_tt_cache_flush(&pd->p, 1);*/
-       psb_pages_clflush(pd->driver, &pd->p, 1);
+       struct drm_device *dev = pd->driver->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       uint32_t offset = (hw_context == 0) ? PSB_CR_BIF_DIR_LIST_BASE0 :
+                         PSB_CR_BIF_DIR_LIST_BASE1 + hw_context * 4;
        down_write(&pd->driver->sem);
+       PSB_WSGX32(page_to_pfn(pd->p) << PAGE_SHIFT, offset);
        wmb();
        psb_mmu_flush_pd_locked(pd->driver, 1);
        pd->hw_context = hw_context;
  static inline unsigned long psb_pd_addr_end(unsigned long addr,
                                            unsigned long end)
  {
        addr = (addr + PSB_PDE_MASK + 1) & ~PSB_PDE_MASK;
        return (addr < end) ? addr : end;
  }
@@@ -223,12 -193,10 +193,10 @@@ struct psb_mmu_pd *psb_mmu_alloc_pd(str
                goto out_err3;
  
        if (!trap_pagefaults) {
-               pd->invalid_pde =
-                   psb_mmu_mask_pte(page_to_pfn(pd->dummy_pt),
-                                    invalid_type);
-               pd->invalid_pte =
-                   psb_mmu_mask_pte(page_to_pfn(pd->dummy_page),
-                                    invalid_type);
+               pd->invalid_pde = psb_mmu_mask_pte(page_to_pfn(pd->dummy_pt),
+                                                  invalid_type);
+               pd->invalid_pte = psb_mmu_mask_pte(page_to_pfn(pd->dummy_page),
+                                                  invalid_type);
        } else {
                pd->invalid_pde = 0;
                pd->invalid_pte = 0;
@@@ -279,12 -247,16 +247,16 @@@ static void psb_mmu_free_pt(struct psb_
  void psb_mmu_free_pagedir(struct psb_mmu_pd *pd)
  {
        struct psb_mmu_driver *driver = pd->driver;
+       struct drm_device *dev = driver->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
        struct psb_mmu_pt *pt;
        int i;
  
        down_write(&driver->sem);
-       if (pd->hw_context != -1)
+       if (pd->hw_context != -1) {
+               PSB_WSGX32(0, PSB_CR_BIF_DIR_LIST_BASE0 + pd->hw_context * 4);
                psb_mmu_flush_pd_locked(driver, 1);
+       }
  
        /* Should take the spinlock here, but we don't need to do that
           since we have the semaphore in write mode. */
@@@ -331,7 -303,7 +303,7 @@@ static struct psb_mmu_pt *psb_mmu_alloc
        for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i)
                *ptes++ = pd->invalid_pte;
  
+ #if defined(CONFIG_X86)
        if (pd->driver->has_clflush && pd->hw_context != -1) {
                mb();
                for (i = 0; i < clflush_count; ++i) {
                }
                mb();
        }
+ #endif
        kunmap_atomic(v);
        spin_unlock(lock);
  
        return pt;
  }
  
- static struct psb_mmu_pt *psb_mmu_pt_alloc_map_lock(struct psb_mmu_pd *pd,
+ struct psb_mmu_pt *psb_mmu_pt_alloc_map_lock(struct psb_mmu_pd *pd,
                                             unsigned long addr)
  {
        uint32_t index = psb_mmu_pd_index(addr);
                kunmap_atomic((void *) v);
  
                if (pd->hw_context != -1) {
-                       psb_mmu_clflush(pd->driver, (void *) &v[index]);
+                       psb_mmu_clflush(pd->driver, (void *)&v[index]);
                        atomic_set(&pd->driver->needs_tlbflush, 1);
                }
        }
@@@ -420,8 -392,7 +392,7 @@@ static void psb_mmu_pt_unmap_unlock(str
                pd->tables[pt->index] = NULL;
  
                if (pd->hw_context != -1) {
-                       psb_mmu_clflush(pd->driver,
-                                       (void *) &v[pt->index]);
+                       psb_mmu_clflush(pd->driver, (void *)&v[pt->index]);
                        atomic_set(&pd->driver->needs_tlbflush, 1);
                }
                kunmap_atomic(pt->v);
        spin_unlock(&pd->driver->lock);
  }
  
- static inline void psb_mmu_set_pte(struct psb_mmu_pt *pt,
-                                  unsigned long addr, uint32_t pte)
+ static inline void psb_mmu_set_pte(struct psb_mmu_pt *pt, unsigned long addr,
+                                  uint32_t pte)
  {
        pt->v[psb_mmu_pt_index(addr)] = pte;
  }
@@@ -444,69 -415,50 +415,50 @@@ static inline void psb_mmu_invalidate_p
        pt->v[psb_mmu_pt_index(addr)] = pt->pd->invalid_pte;
  }
  
- void psb_mmu_mirror_gtt(struct psb_mmu_pd *pd,
-                       uint32_t mmu_offset, uint32_t gtt_start,
-                       uint32_t gtt_pages)
+ struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver *driver)
  {
-       uint32_t *v;
-       uint32_t start = psb_mmu_pd_index(mmu_offset);
-       struct psb_mmu_driver *driver = pd->driver;
-       int num_pages = gtt_pages;
+       struct psb_mmu_pd *pd;
  
        down_read(&driver->sem);
-       spin_lock(&driver->lock);
-       v = kmap_atomic(pd->p);
-       v += start;
-       while (gtt_pages--) {
-               *v++ = gtt_start | pd->pd_mask;
-               gtt_start += PAGE_SIZE;
-       }
-       /*ttm_tt_cache_flush(&pd->p, num_pages);*/
-       psb_pages_clflush(pd->driver, &pd->p, num_pages);
-       kunmap_atomic(v);
-       spin_unlock(&driver->lock);
-       if (pd->hw_context != -1)
-               atomic_set(&pd->driver->needs_tlbflush, 1);
+       pd = driver->default_pd;
+       up_read(&driver->sem);
  
-       up_read(&pd->driver->sem);
-       psb_mmu_flush_pd(pd->driver, 0);
+       return pd;
  }
  
- struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver *driver)
+ /* Returns the physical address of the PD shared by sgx/msvdx */
+ uint32_t psb_get_default_pd_addr(struct psb_mmu_driver *driver)
  {
        struct psb_mmu_pd *pd;
  
-       /* down_read(&driver->sem); */
-       pd = driver->default_pd;
-       /* up_read(&driver->sem); */
-       return pd;
+       pd = psb_mmu_get_default_pd(driver);
+       return page_to_pfn(pd->p) << PAGE_SHIFT;
  }
  
  void psb_mmu_driver_takedown(struct psb_mmu_driver *driver)
  {
+       struct drm_device *dev = driver->dev;
+       struct drm_psb_private *dev_priv = dev->dev_private;
+       PSB_WSGX32(driver->bif_ctrl, PSB_CR_BIF_CTRL);
        psb_mmu_free_pagedir(driver->default_pd);
        kfree(driver);
  }
  
- struct psb_mmu_driver *psb_mmu_driver_init(uint8_t __iomem * registers,
-                                       int trap_pagefaults,
-                                       int invalid_type,
-                                       struct drm_psb_private *dev_priv)
+ struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
+                                          int trap_pagefaults,
+                                          int invalid_type,
+                                          atomic_t *msvdx_mmu_invaldc)
  {
        struct psb_mmu_driver *driver;
+       struct drm_psb_private *dev_priv = dev->dev_private;
  
        driver = kmalloc(sizeof(*driver), GFP_KERNEL);
  
        if (!driver)
                return NULL;
-       driver->dev_priv = dev_priv;
  
+       driver->dev = dev;
        driver->default_pd = psb_mmu_alloc_pd(driver, trap_pagefaults,
                                              invalid_type);
        if (!driver->default_pd)
        spin_lock_init(&driver->lock);
        init_rwsem(&driver->sem);
        down_write(&driver->sem);
-       driver->register_map = registers;
        atomic_set(&driver->needs_tlbflush, 1);
+       driver->msvdx_mmu_invaldc = msvdx_mmu_invaldc;
+       driver->bif_ctrl = PSB_RSGX32(PSB_CR_BIF_CTRL);
+       PSB_WSGX32(driver->bif_ctrl | _PSB_CB_CTRL_CLEAR_FAULT,
+                  PSB_CR_BIF_CTRL);
+       PSB_WSGX32(driver->bif_ctrl & ~_PSB_CB_CTRL_CLEAR_FAULT,
+                  PSB_CR_BIF_CTRL);
  
        driver->has_clflush = 0;
  
 -      if (boot_cpu_has(X86_FEATURE_CLFLSH)) {
+ #if defined(CONFIG_X86)
 +      if (boot_cpu_has(X86_FEATURE_CLFLUSH)) {
                uint32_t tfms, misc, cap0, cap4, clflush_size;
  
                /*
-                * clflush size is determined at kernel setup for x86_64
-                *  but not for i386. We have to do it here.
+                * clflush size is determined at kernel setup for x86_64 but not
+                * for i386. We have to do it here.
                 */
  
                cpuid(0x00000001, &tfms, &misc, &cap0, &cap4);
                driver->clflush_mask = driver->clflush_add - 1;
                driver->clflush_mask = ~driver->clflush_mask;
        }
+ #endif
  
        up_write(&driver->sem);
        return driver;
@@@ -545,9 -505,9 +505,9 @@@ out_err1
        return NULL;
  }
  
- static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd,
                             unsigned long address, uint32_t num_pages,
-                              uint32_t desired_tile_stride,
+ #if defined(CONFIG_X86)
static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
+                              uint32_t num_pages, uint32_t desired_tile_stride,
                               uint32_t hw_tile_stride)
  {
        struct psb_mmu_pt *pt;
        unsigned long clflush_add = pd->driver->clflush_add;
        unsigned long clflush_mask = pd->driver->clflush_mask;
  
-       if (!pd->driver->has_clflush) {
-               /*ttm_tt_cache_flush(&pd->p, num_pages);*/
-               psb_pages_clflush(pd->driver, &pd->p, num_pages);
+       if (!pd->driver->has_clflush)
                return;
-       }
  
        if (hw_tile_stride)
                rows = num_pages / desired_tile_stride;
                        if (!pt)
                                continue;
                        do {
-                               psb_clflush(&pt->v
-                                           [psb_mmu_pt_index(addr)]);
-                       } while (addr +=
-                                clflush_add,
+                               psb_clflush(&pt->v[psb_mmu_pt_index(addr)]);
+                       } while (addr += clflush_add,
                                 (addr & clflush_mask) < next);
  
                        psb_mmu_pt_unmap_unlock(pt);
        }
        mb();
  }
+ #else
+ static void psb_mmu_flush_ptes(struct psb_mmu_pd *pd, unsigned long address,
+                              uint32_t num_pages, uint32_t desired_tile_stride,
+                              uint32_t hw_tile_stride)
+ {
+       drm_ttm_cache_flush();
+ }
+ #endif
  
  void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
                                 unsigned long address, uint32_t num_pages)
@@@ -633,7 -596,7 +596,7 @@@ out
        up_read(&pd->driver->sem);
  
        if (pd->hw_context != -1)
-               psb_mmu_flush(pd->driver, 0);
+               psb_mmu_flush(pd->driver);
  
        return;
  }
@@@ -660,7 -623,7 +623,7 @@@ void psb_mmu_remove_pages(struct psb_mm
        add = desired_tile_stride << PAGE_SHIFT;
        row_add = hw_tile_stride << PAGE_SHIFT;
  
-       /* down_read(&pd->driver->sem); */
+       down_read(&pd->driver->sem);
  
        /* Make sure we only need to flush this processor's cache */
  
                psb_mmu_flush_ptes(pd, f_address, num_pages,
                                   desired_tile_stride, hw_tile_stride);
  
-       /* up_read(&pd->driver->sem); */
+       up_read(&pd->driver->sem);
  
        if (pd->hw_context != -1)
-               psb_mmu_flush(pd->driver, 0);
+               psb_mmu_flush(pd->driver);
  }
  
  int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd, uint32_t start_pfn,
        unsigned long end;
        unsigned long next;
        unsigned long f_address = address;
-       int ret = 0;
+       int ret = -ENOMEM;
  
        down_read(&pd->driver->sem);
  
                psb_mmu_pt_unmap_unlock(pt);
  
        } while (addr = next, next != end);
+       ret = 0;
  
  out:
        if (pd->hw_context != -1)
        up_read(&pd->driver->sem);
  
        if (pd->hw_context != -1)
-               psb_mmu_flush(pd->driver, 1);
+               psb_mmu_flush(pd->driver);
  
-       return ret;
+       return 0;
  }
  
  int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
                         unsigned long address, uint32_t num_pages,
-                        uint32_t desired_tile_stride,
-                        uint32_t hw_tile_stride, int type)
+                        uint32_t desired_tile_stride, uint32_t hw_tile_stride,
+                        int type)
  {
        struct psb_mmu_pt *pt;
        uint32_t rows = 1;
        unsigned long add;
        unsigned long row_add;
        unsigned long f_address = address;
-       int ret = 0;
+       int ret = -ENOMEM;
  
        if (hw_tile_stride) {
                if (num_pages % desired_tile_stride != 0)
                do {
                        next = psb_pd_addr_end(addr, end);
                        pt = psb_mmu_pt_alloc_map_lock(pd, addr);
-                       if (!pt) {
-                               ret = -ENOMEM;
+                       if (!pt)
                                goto out;
-                       }
                        do {
-                               pte =
-                                   psb_mmu_mask_pte(page_to_pfn(*pages++),
-                                                    type);
+                               pte = psb_mmu_mask_pte(page_to_pfn(*pages++),
+                                                      type);
                                psb_mmu_set_pte(pt, addr, pte);
                                pt->count++;
                        } while (addr += PAGE_SIZE, addr < next);
  
                address += row_add;
        }
+       ret = 0;
  out:
        if (pd->hw_context != -1)
                psb_mmu_flush_ptes(pd, f_address, num_pages,
        up_read(&pd->driver->sem);
  
        if (pd->hw_context != -1)
-               psb_mmu_flush(pd->driver, 1);
+               psb_mmu_flush(pd->driver);
  
        return ret;
  }
index a8d01785461577a519e5e3c7a749e2fb027a92ed,39a7519a2853b5678503fc5aae4b5653a62f3001..c48f640db0061efe76d74c8df09be47cd5fe440a
@@@ -17,7 -17,6 +17,7 @@@
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   * MA 02110-1301, USA.
   */
 +#include <linux/component.h>
  #include <linux/module.h>
  #include <linux/export.h>
  #include <linux/device.h>
@@@ -121,7 -120,7 +121,7 @@@ static int ipu_page_flip(struct drm_crt
  
        ipu_crtc->newfb = fb;
        ipu_crtc->page_flip_event = event;
-       crtc->fb = fb;
+       crtc->primary->fb = fb;
  
        return 0;
  }
@@@ -193,7 -192,7 +193,7 @@@ static int ipu_crtc_mode_set(struct drm
                return ret;
        }
  
-       return ipu_plane_mode_set(ipu_crtc->plane[0], crtc, mode, crtc->fb,
+       return ipu_plane_mode_set(ipu_crtc->plane[0], crtc, mode, crtc->primary->fb,
                                  0, 0, mode->hdisplay, mode->vdisplay,
                                  x, y, mode->hdisplay, mode->vdisplay);
  }
@@@ -219,7 -218,7 +219,7 @@@ static irqreturn_t ipu_irq_handler(int 
  
        if (ipu_crtc->newfb) {
                ipu_crtc->newfb = NULL;
-               ipu_plane_set_base(ipu_crtc->plane[0], ipu_crtc->base.fb,
+               ipu_plane_set_base(ipu_crtc->plane[0], ipu_crtc->base.primary->fb,
                                ipu_crtc->plane[0]->x, ipu_crtc->plane[0]->y);
                ipu_crtc_handle_pageflip(ipu_crtc);
        }
@@@ -285,7 -284,6 +285,7 @@@ static int ipu_set_interface_pix_fmt(st
                ipu_crtc->di_clkflags = IPU_DI_CLKMODE_SYNC |
                        IPU_DI_CLKMODE_EXT;
                break;
 +      case DRM_MODE_ENCODER_TMDS:
        case DRM_MODE_ENCODER_NONE:
                ipu_crtc->di_clkflags = 0;
                break;
@@@ -336,7 -334,7 +336,7 @@@ err_out
  }
  
  static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
 -              struct ipu_client_platformdata *pdata)
 +      struct ipu_client_platformdata *pdata, struct drm_device *drm)
  {
        struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
        int dp = -EINVAL;
                return ret;
        }
  
 -      ret = imx_drm_add_crtc(&ipu_crtc->base,
 -                      &ipu_crtc->imx_crtc,
 -                      &ipu_crtc_helper_funcs, THIS_MODULE,
 -                      ipu_crtc->dev->parent->of_node, pdata->di);
 +      ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc,
 +                      &ipu_crtc_helper_funcs, ipu_crtc->dev->of_node);
        if (ret) {
                dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret);
                goto err_put_resources;
@@@ -399,96 -399,43 +399,96 @@@ err_put_resources
        return ret;
  }
  
 -static int ipu_drm_probe(struct platform_device *pdev)
 +static struct device_node *ipu_drm_get_port_by_id(struct device_node *parent,
 +                                                int port_id)
  {
 -      struct ipu_client_platformdata *pdata = pdev->dev.platform_data;
 -      struct ipu_crtc *ipu_crtc;
 -      int ret;
 +      struct device_node *port;
 +      int id, ret;
 +
 +      port = of_get_child_by_name(parent, "port");
 +      while (port) {
 +              ret = of_property_read_u32(port, "reg", &id);
 +              if (!ret && id == port_id)
 +                      return port;
 +
 +              do {
 +                      port = of_get_next_child(parent, port);
 +                      if (!port)
 +                              return NULL;
 +              } while (of_node_cmp(port->name, "port"));
 +      }
  
 -      if (!pdata)
 -              return -EINVAL;
 +      return NULL;
 +}
  
 -      ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
 -      if (ret)
 -              return ret;
 +static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
 +{
 +      struct ipu_client_platformdata *pdata = dev->platform_data;
 +      struct drm_device *drm = data;
 +      struct ipu_crtc *ipu_crtc;
 +      int ret;
  
 -      ipu_crtc = devm_kzalloc(&pdev->dev, sizeof(*ipu_crtc), GFP_KERNEL);
 +      ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
        if (!ipu_crtc)
                return -ENOMEM;
  
 -      ipu_crtc->dev = &pdev->dev;
 +      ipu_crtc->dev = dev;
  
 -      ret = ipu_crtc_init(ipu_crtc, pdata);
 +      ret = ipu_crtc_init(ipu_crtc, pdata, drm);
        if (ret)
                return ret;
  
 -      platform_set_drvdata(pdev, ipu_crtc);
 +      dev_set_drvdata(dev, ipu_crtc);
  
        return 0;
  }
  
 -static int ipu_drm_remove(struct platform_device *pdev)
 +static void ipu_drm_unbind(struct device *dev, struct device *master,
 +      void *data)
  {
 -      struct ipu_crtc *ipu_crtc = platform_get_drvdata(pdev);
 +      struct ipu_crtc *ipu_crtc = dev_get_drvdata(dev);
  
        imx_drm_remove_crtc(ipu_crtc->imx_crtc);
  
        ipu_plane_put_resources(ipu_crtc->plane[0]);
        ipu_put_resources(ipu_crtc);
 +}
 +
 +static const struct component_ops ipu_crtc_ops = {
 +      .bind = ipu_drm_bind,
 +      .unbind = ipu_drm_unbind,
 +};
  
 +static int ipu_drm_probe(struct platform_device *pdev)
 +{
 +      struct device *dev = &pdev->dev;
 +      struct ipu_client_platformdata *pdata = dev->platform_data;
 +      int ret;
 +
 +      if (!dev->platform_data)
 +              return -EINVAL;
 +
 +      if (!dev->of_node) {
 +              /* Associate crtc device with the corresponding DI port node */
 +              dev->of_node = ipu_drm_get_port_by_id(dev->parent->of_node,
 +                                                    pdata->di + 2);
 +              if (!dev->of_node) {
 +                      dev_err(dev, "missing port@%d node in %s\n",
 +                              pdata->di + 2, dev->parent->of_node->full_name);
 +                      return -ENODEV;
 +              }
 +      }
 +
 +      ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
 +      if (ret)
 +              return ret;
 +
 +      return component_add(dev, &ipu_crtc_ops);
 +}
 +
 +static int ipu_drm_remove(struct platform_device *pdev)
 +{
 +      component_del(&pdev->dev, &ipu_crtc_ops);
        return 0;
  }
  
index b0c9b6ce48540471760a824126c4e9e709e8af8e,5128dc399d361c62f39df5ad7cd685bcb497de28..27a8d735dae0273e81c226e00b8eee5d482244f3
@@@ -68,12 -68,12 +68,12 @@@ int ipu_plane_set_base(struct ipu_plan
  
        cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
        if (!cma_obj) {
-               DRM_LOG_KMS("entry is null.\n");
+               DRM_DEBUG_KMS("entry is null.\n");
                return -EFAULT;
        }
  
 -      dev_dbg(ipu_plane->base.dev->dev, "phys = 0x%x, x = %d, y = %d",
 -              cma_obj->paddr, x, y);
 +      dev_dbg(ipu_plane->base.dev->dev, "phys = %pad, x = %d, y = %d",
 +              &cma_obj->paddr, x, y);
  
        cpmem = ipu_get_cpmem(ipu_plane->ipu_ch);
        ipu_cpmem_set_stride(cpmem, fb->pitches[0]);
diff --combined fs/dcache.c
index 66cba5a8a3467768edeeec573d2a61e5bfea27cc,089f681ac95257e9594881dc18fbb5cde470d6d9..40707d88a9452aea7c995198c2d94bfb1e9775c5
@@@ -2483,14 -2483,12 +2483,14 @@@ static void switch_names(struct dentry 
                        dentry->d_name.name = dentry->d_iname;
                } else {
                        /*
 -                       * Both are internal.  Just copy target to dentry
 +                       * Both are internal.
                         */
 -                      memcpy(dentry->d_iname, target->d_name.name,
 -                                      target->d_name.len + 1);
 -                      dentry->d_name.len = target->d_name.len;
 -                      return;
 +                      unsigned int i;
 +                      BUILD_BUG_ON(!IS_ALIGNED(DNAME_INLINE_LEN, sizeof(long)));
 +                      for (i = 0; i < DNAME_INLINE_LEN / sizeof(long); i++) {
 +                              swap(((long *) &dentry->d_iname)[i],
 +                                   ((long *) &target->d_iname)[i]);
 +                      }
                }
        }
        swap(dentry->d_name.len, target->d_name.len);
@@@ -2547,15 -2545,13 +2547,15 @@@ static void dentry_unlock_parents_for_m
   * __d_move - move a dentry
   * @dentry: entry to move
   * @target: new dentry
 + * @exchange: exchange the two dentries
   *
   * Update the dcache to reflect the move of a file name. Negative
   * dcache entries should not be moved in this way. Caller must hold
   * rename_lock, the i_mutex of the source and target directories,
   * and the sb->s_vfs_rename_mutex if they differ. See lock_rename().
   */
 -static void __d_move(struct dentry * dentry, struct dentry * target)
 +static void __d_move(struct dentry *dentry, struct dentry *target,
 +                   bool exchange)
  {
        if (!dentry->d_inode)
                printk(KERN_WARNING "VFS: moving negative dcache entry\n");
        __d_drop(dentry);
        __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash));
  
 -      /* Unhash the target: dput() will then get rid of it */
 +      /*
 +       * Unhash the target (d_delete() is not usable here).  If exchanging
 +       * the two dentries, then rehash onto the other's hash queue.
 +       */
        __d_drop(target);
 +      if (exchange) {
 +              __d_rehash(target,
 +                         d_hash(dentry->d_parent, dentry->d_name.hash));
 +      }
  
        list_del(&dentry->d_u.d_child);
        list_del(&target->d_u.d_child);
        write_seqcount_end(&dentry->d_seq);
  
        dentry_unlock_parents_for_move(dentry, target);
 +      if (exchange)
 +              fsnotify_d_move(target);
        spin_unlock(&target->d_lock);
        fsnotify_d_move(dentry);
        spin_unlock(&dentry->d_lock);
  void d_move(struct dentry *dentry, struct dentry *target)
  {
        write_seqlock(&rename_lock);
 -      __d_move(dentry, target);
 +      __d_move(dentry, target, false);
        write_sequnlock(&rename_lock);
  }
  EXPORT_SYMBOL(d_move);
  
 +/*
 + * d_exchange - exchange two dentries
 + * @dentry1: first dentry
 + * @dentry2: second dentry
 + */
 +void d_exchange(struct dentry *dentry1, struct dentry *dentry2)
 +{
 +      write_seqlock(&rename_lock);
 +
 +      WARN_ON(!dentry1->d_inode);
 +      WARN_ON(!dentry2->d_inode);
 +      WARN_ON(IS_ROOT(dentry1));
 +      WARN_ON(IS_ROOT(dentry2));
 +
 +      __d_move(dentry1, dentry2, true);
 +
 +      write_sequnlock(&rename_lock);
 +}
 +
  /**
   * d_ancestor - search for an ancestor
   * @p1: ancestor dentry
@@@ -2702,7 -2670,7 +2702,7 @@@ static struct dentry *__d_unalias(struc
        m2 = &alias->d_parent->d_inode->i_mutex;
  out_unalias:
        if (likely(!d_mountpoint(alias))) {
 -              __d_move(alias, dentry);
 +              __d_move(alias, dentry, false);
                ret = alias;
        }
  out_err:
@@@ -3144,6 -3112,7 +3144,7 @@@ char *simple_dname(struct dentry *dentr
                end = ERR_PTR(-ENAMETOOLONG);
        return end;
  }
+ EXPORT_SYMBOL(simple_dname);
  
  /*
   * Write full pathname from the root of the filesystem into the buffer.
index 0145b948b147e3647bca2b1fbb87f89edfdd38c7,2d659dc39972f9a30dce9d9b1bfd6cdd8a9e9606..6e622f7d481d85b76219edab75815423b69ba47b
@@@ -55,7 -55,7 +55,7 @@@ struct drm_fb_helper_surface_size 
   *             save the current lut when force-restoring the fbdev for e.g.
   *             kdbg.
   * @fb_probe: Driver callback to allocate and initialize the fbdev info
 - *            structure. Futhermore it also needs to allocate the drm
 + *            structure. Furthermore it also needs to allocate the drm
   *            framebuffer used to back the fbdev.
   * @initial_config: Setup an initial fbdev display configuration
   *
@@@ -121,5 -121,11 +121,11 @@@ bool drm_fb_helper_initial_config(struc
  int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
  int drm_fb_helper_debug_enter(struct fb_info *info);
  int drm_fb_helper_debug_leave(struct fb_info *info);
+ struct drm_display_mode *
+ drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
+                       int width, int height);
+ struct drm_display_mode *
+ drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
+                     int width, int height);
  
  #endif