* [korg]help: How to submit a kernel driver on kernel.org.
@ 2012-03-01 6:28 Aaron.Chen 陈俊杰
2012-03-01 19:05 ` Jerome Glisse
0 siblings, 1 reply; 10+ messages in thread
From: Aaron.Chen 陈俊杰 @ 2012-03-01 6:28 UTC (permalink / raw)
To: airlied, dri-devel
[-- Attachment #1.1: Type: text/plain, Size: 628 bytes --]
Hi,
I’m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say “please submit it to the maintainer listed in MAINTAINERS in the kernel file.”So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
Regards
Aaron
[-- Attachment #1.2: Type: text/html, Size: 6099 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-01 6:28 [korg]help: How to submit a kernel driver on kernel.org Aaron.Chen 陈俊杰
@ 2012-03-01 19:05 ` Jerome Glisse
2012-03-01 21:50 ` Paul Menzel
0 siblings, 1 reply; 10+ messages in thread
From: Jerome Glisse @ 2012-03-01 19:05 UTC (permalink / raw)
To: Aaron.Chen 陈俊杰; +Cc: dri-devel
On Thu, 2012-03-01 at 14:28 +0800, Aaron.Chen 陈俊杰 wrote:
> Hi,
>
>
>
> I’m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say “please submit it to the maintainer listed in MAINTAINERS in the kernel file.”So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
>
> Regards
> Aaron
All you need to do is send the kernel patch to
dri-devel@lists.freedesktop.org
So they can get reviewed. Once they are reviewed, and if they comply
with the requirement, the DRM maintainer (aka Dave) will integrate
your patch in his tree and at some point ask Linus to pull them.
There is no ftp, or http web submission, everything is done through
public mailing list.
Cheers,
Jerome
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-01 19:05 ` Jerome Glisse
@ 2012-03-01 21:50 ` Paul Menzel
2012-03-06 4:13 ` Aaron.Chen 陈俊杰
2012-03-06 7:24 ` Aaron.Chen 陈俊杰
0 siblings, 2 replies; 10+ messages in thread
From: Paul Menzel @ 2012-03-01 21:50 UTC (permalink / raw)
To: Jerome Glisse; +Cc: dri-devel, Aaron.Chen 陈俊杰
[-- Attachment #1.1: Type: text/plain, Size: 1739 bytes --]
Dear Aaron,
thank you for contacting the list. We are looking forward to your
patches.
Am Donnerstag, den 01.03.2012, 14:05 -0500 schrieb Jerome Glisse:
> On Thu, 2012-03-01 at 14:28 +0800, Aaron.Chen 陈俊杰 wrote:
> > I’m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say “please submit it to the maintainer listed in MAINTAINERS in the kernel file.”So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
> All you need to do is send the kernel patch to
> dri-devel@lists.freedesktop.org
>
> So they can get reviewed. Once they are reviewed, and if they comply
> with the requirement, the DRM maintainer (aka Dave) will integrate
> your patch in his tree and at some point ask Linus to pull them.
>
> There is no ftp, or http web submission, everything is done through
> public mailing list.
if you are familiar with Git you should send a patch formatted using
`git format-patch -15`. Replace the 15 by the number of commits you need
patches for.
You can take a look in the archive. drm/exynos and drm/omap are good
examples – I think – on how to get new drivers submitted.
Thanks,
Paul
PS: Please also try to follow the netiquette when posting to lists [1].
Especially just send plain text messages (no HTML).
[1] http://en.opensuse.org/openSUSE:Mailing_list_netiquette
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-01 21:50 ` Paul Menzel
@ 2012-03-06 4:13 ` Aaron.Chen 陈俊杰
2012-03-06 13:47 ` Alex Deucher
2012-03-06 7:24 ` Aaron.Chen 陈俊杰
1 sibling, 1 reply; 10+ messages in thread
From: Aaron.Chen 陈俊杰 @ 2012-03-06 4:13 UTC (permalink / raw)
To: Paul Menzel, Jerome Glisse; +Cc: caesar.qiu 裘赛海, dri-devel
Hi Paul&Jerome,
Thank you very much for your guide. It's a great help for me.
But I still have a little problem with the patch thing. I'm not familiar with the git.
1.Shall I need to do the clone and get the source location and target directory first?
2.Where is the source location and target directory?
3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
4.or just email you the source code and tell you the changes?
I'm looking forward your re-guide. Thank you so much.
Regards
Aaron
-----邮件原件-----
发件人: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
发送时间: 2012年3月2日 5:50
收件人: Jerome Glisse
抄送: Aaron.Chen 陈俊杰; dri-devel@lists.freedesktop.org
主题: Re: [korg]help: How to submit a kernel driver on kernel.org.
Dear Aaron,
thank you for contacting the list. We are looking forward to your patches.
Am Donnerstag, den 01.03.2012, 14:05 -0500 schrieb Jerome Glisse:
> On Thu, 2012-03-01 at 14:28 +0800, Aaron.Chen 陈俊杰 wrote:
> > I’m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say “please submit it to the maintainer listed in MAINTAINERS in the kernel file.”So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
> All you need to do is send the kernel patch to
> dri-devel@lists.freedesktop.org
>
> So they can get reviewed. Once they are reviewed, and if they comply
> with the requirement, the DRM maintainer (aka Dave) will integrate
> your patch in his tree and at some point ask Linus to pull them.
>
> There is no ftp, or http web submission, everything is done through
> public mailing list.
if you are familiar with Git you should send a patch formatted using `git format-patch -15`. Replace the 15 by the number of commits you need patches for.
You can take a look in the archive. drm/exynos and drm/omap are good examples – I think – on how to get new drivers submitted.
Thanks,
Paul
PS: Please also try to follow the netiquette when posting to lists [1].
Especially just send plain text messages (no HTML).
[1] http://en.opensuse.org/openSUSE:Mailing_list_netiquette
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-01 21:50 ` Paul Menzel
2012-03-06 4:13 ` Aaron.Chen 陈俊杰
@ 2012-03-06 7:24 ` Aaron.Chen 陈俊杰
1 sibling, 0 replies; 10+ messages in thread
From: Aaron.Chen 陈俊杰 @ 2012-03-06 7:24 UTC (permalink / raw)
To: Paul Menzel, Jerome Glisse; +Cc: caesar.qiu 裘赛海, dri-devel
Hi Paul&Jerome,
Our driver is a frambuffer driver and there's no DRM functions.
Regards
Aaron
-----邮件原件-----
发件人: Aaron.Chen 陈俊杰
发送时间: 2012年3月6日 12:14
收件人: 'Paul Menzel'; Jerome Glisse
抄送: dri-devel@lists.freedesktop.org; caesar.qiu 裘赛海
主题: Re: [korg]help: How to submit a kernel driver on kernel.org.
Hi Paul&Jerome,
Thank you very much for your guide. It's a great help for me.
But I still have a little problem with the patch thing. I'm not familiar with the git.
1.Shall I need to do the clone and get the source location and target directory first?
2.Where is the source location and target directory?
3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
4.or just email you the source code and tell you the changes?
I'm looking forward your re-guide. Thank you so much.
Regards
Aaron
-----邮件原件-----
发件人: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
发送时间: 2012年3月2日 5:50
收件人: Jerome Glisse
抄送: Aaron.Chen 陈俊杰; dri-devel@lists.freedesktop.org
主题: Re: [korg]help: How to submit a kernel driver on kernel.org.
Dear Aaron,
thank you for contacting the list. We are looking forward to your patches.
Am Donnerstag, den 01.03.2012, 14:05 -0500 schrieb Jerome Glisse:
> On Thu, 2012-03-01 at 14:28 +0800, Aaron.Chen 陈俊杰 wrote:
> > I’m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say “please submit it to the maintainer listed in MAINTAINERS in the kernel file.”So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
> All you need to do is send the kernel patch to
> dri-devel@lists.freedesktop.org
>
> So they can get reviewed. Once they are reviewed, and if they comply
> with the requirement, the DRM maintainer (aka Dave) will integrate
> your patch in his tree and at some point ask Linus to pull them.
>
> There is no ftp, or http web submission, everything is done through
> public mailing list.
if you are familiar with Git you should send a patch formatted using `git format-patch -15`. Replace the 15 by the number of commits you need patches for.
You can take a look in the archive. drm/exynos and drm/omap are good examples – I think – on how to get new drivers submitted.
Thanks,
Paul
PS: Please also try to follow the netiquette when posting to lists [1].
Especially just send plain text messages (no HTML).
[1] http://en.opensuse.org/openSUSE:Mailing_list_netiquette
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-06 4:13 ` Aaron.Chen 陈俊杰
@ 2012-03-06 13:47 ` Alex Deucher
2012-03-06 14:37 ` Paul Menzel
0 siblings, 1 reply; 10+ messages in thread
From: Alex Deucher @ 2012-03-06 13:47 UTC (permalink / raw)
To: Aaron.Chen 陈俊杰
Cc: caesar.qiu 裘赛海, Paul Menzel, dri-devel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=GB2312, Size: 4246 bytes --]
On Mon, Mar 5, 2012 at 11:13 PM, Aaron.Chen ³Â¿¡½Ü
<aaron.chen@siliconmotion.com> wrote:
> Hi Paul&Jerome,
>
> Thank you very much for your guide. It's a great help for me.
>
> But I still have a little problem with the patch thing. I'm not familiar with the git.
> 1.Shall I need to do the clone and get the source location and target directory first?
> 2.Where is the source location and target directory?
> 3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
> 4.or just email you the source code and tell you the changes?
>
> I'm looking forward your re-guide. Thank you so much.
Your best bet it to clone Linus' git tree and then apply your patches:
1. clone Linus' git tree:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
2. a) apply your first patch
b) if you patch adds new files to the source tree, add them:
git add path/to/files/file.c
git add path/to/files/file.h
etc. if the patch only modifies patches that are already
in the tree, you do not need to add them.
c) when the patch is applied commit it:
git commit -a -s
d) when you run the commit command you will be prompted to
enter a commit message. The commit message has the following format:
subsystem: patch description
description of what the patch does.
Signed-off-by: Your name <your_email@domain.com>
E.g.,
fb: add initial code for video 5000 graphics
This adds the initial support for the video 5000
graphics adapter. It supports vga and lcd connectors.
Signed-off-by: Joe Developer <joe.developer@example.com>
e) repeat steps a-d for all of your patches
3. generate patches:
git format-patch -n
where n is the number of patches you committed. E.g., if your driver
consists of 5 patches:
git format-patch -5
4. Send the patches to the list.
Alex
>
> Regards
> Aaron
>
>
> -----ÓʼþÔ¼þ-----
> ·¢¼þÈË: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
> ·¢ËÍʱ¼ä: 2012Äê3ÔÂ2ÈÕ 5:50
> ÊÕ¼þÈË: Jerome Glisse
> ³ËÍ: Aaron.Chen ³Â¿¡½Ü; dri-devel@lists.freedesktop.org
> Ö÷Ìâ: Re: [korg]help: How to submit a kernel driver on kernel.org.
>
> Dear Aaron,
>
>
> thank you for contacting the list. We are looking forward to your patches.
>
> Am Donnerstag, den 01.03.2012, 14:05 -0500 schrieb Jerome Glisse:
>> On Thu, 2012-03-01 at 14:28 +0800, Aaron.Chen ³Â¿¡½Ü wrote:
>
>> > I¡¯m from Silicon Motion Technology Corporation (NasdaqGS:SIMO) Shanghai Office. We have developed a kernel driver for all our graphics chips. We really want to know the way to submit a kernel driver to kernel.org. I have received a document file which is on http://kernel.org/doc/Documentation/SubmittingDrivers, but I still cannot find out a place to where our drivers should be uploaded. The document say ¡°please submit it to the maintainer listed in MAINTAINERS in the kernel file.¡±So where can I find the maintainer and what to do next. Would you please help me. Thank you so much.
>
>> All you need to do is send the kernel patch to
>> dri-devel@lists.freedesktop.org
>>
>> So they can get reviewed. Once they are reviewed, and if they comply
>> with the requirement, the DRM maintainer (aka Dave) will integrate
>> your patch in his tree and at some point ask Linus to pull them.
>>
>> There is no ftp, or http web submission, everything is done through
>> public mailing list.
>
> if you are familiar with Git you should send a patch formatted using `git format-patch -15`. Replace the 15 by the number of commits you need patches for.
>
> You can take a look in the archive. drm/exynos and drm/omap are good examples ¨C I think ¨C on how to get new drivers submitted.
>
>
> Thanks,
>
> Paul
>
>
> PS: Please also try to follow the netiquette when posting to lists [1].
> Especially just send plain text messages (no HTML).
>
>
> [1] http://en.opensuse.org/openSUSE:Mailing_list_netiquette
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-06 13:47 ` Alex Deucher
@ 2012-03-06 14:37 ` Paul Menzel
2012-03-09 9:50 ` 答复: " Aaron.Chen 陈俊杰
0 siblings, 1 reply; 10+ messages in thread
From: Paul Menzel @ 2012-03-06 14:37 UTC (permalink / raw)
To: Alex Deucher
Cc: caesar.qiu, 裘赛海,
dri-devel, Aaron.Chen 陈俊杰
[-- Attachment #1.1: Type: text/plain, Size: 2980 bytes --]
Dear Aaron,
Am Dienstag, den 06.03.2012, 08:47 -0500 schrieb Alex Deucher:
> On Mon, Mar 5, 2012 at 11:13 PM, Aaron.Chen 陈俊杰 wrote:
> > Thank you very much for your guide. It's a great help for me.
> >
> > But I still have a little problem with the patch thing. I'm not familiar with the git.
> > 1.Shall I need to do the clone and get the source location and target directory first?
> > 2.Where is the source location and target directory?
> > 3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
you can only get new features included upstream in the latest Linux
kernel. So earliest version would be 3.4. You have to maintain you own
repository for earlier version. But backporting should be not so much
trouble if you have it included upstream.
> > 4.or just email you the source code and tell you the changes?
> >
> > I'm looking forward your re-guide. Thank you so much.
>
> Your best bet it to clone Linus' git tree and then apply your patches:
>
> 1. clone Linus' git tree:
> git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
you can do this in between.
cd linux
git config --global user.name "陈俊杰 (Aaron Chen)"
git config --global user.email aaron.chen@siliconmotion.com
> 2. a) apply your first patch
> b) if you patch adds new files to the source tree, add them:
> git add path/to/files/file.c
> git add path/to/files/file.h
> etc. if the patch only modifies patches that are already
> in the tree, you do not need to add them.
> c) when the patch is applied commit it:
> git commit -a -s
> d) when you run the commit command you will be prompted to
> enter a commit message. The commit message has the following format:
>
> subsystem: patch description
>
> description of what the patch does.
>
> Signed-off-by: Your name <your_email@domain.com>
>
> E.g.,
>
> fb: add initial code for video 5000 graphics
>
> This adds the initial support for the video 5000
> graphics adapter. It supports vga and lcd connectors.
>
> Signed-off-by: Joe Developer <joe.developer@example.com>
>
> e) repeat steps a-d for all of your patches
> 3. generate patches:
> git format-patch -n
>
> where n is the number of patches you committed. E.g., if your driver
> consists of 5 patches:
> git format-patch -5
>
> 4. Send the patches to the list.
Aaron, Git is nowadays documented pretty well. So just use
git help command
(like `git help commit`) to read the manual. Additionally you can just
search for it using your favorite search engine. Interesting reads
should be [1][2][3].
Thanks,
Paul
[1] http://schacon.github.com/git/user-manual.html#cleaning-up-history
[2] http://git-scm.com/documentation
[3] http://progit.org/book/
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* 答复: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-06 14:37 ` Paul Menzel
@ 2012-03-09 9:50 ` Aaron.Chen 陈俊杰
2012-03-09 16:30 ` Ilija Hadzic
0 siblings, 1 reply; 10+ messages in thread
From: Aaron.Chen 陈俊杰 @ 2012-03-09 9:50 UTC (permalink / raw)
To: Paul Menzel, Alex Deucher, dri-devel; +Cc: caesar.qiu 裘赛海
[-- Attachment #1: Type: text/plain, Size: 3398 bytes --]
Hi Paul&Alex,
Thank you very much for your great help.
Here is the first patch.
Regards
Aaron
-----邮件原件-----
发件人: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
发送时间: 2012年3月6日 22:38
收件人: Alex Deucher
抄送: Aaron.Chen 陈俊杰; caesar.qiu 裘赛海; dri-devel@lists.freedesktop.org
主题: Re: [korg]help: How to submit a kernel driver on kernel.org.
Dear Aaron,
Am Dienstag, den 06.03.2012, 08:47 -0500 schrieb Alex Deucher:
> On Mon, Mar 5, 2012 at 11:13 PM, Aaron.Chen 陈俊杰 wrote:
> > Thank you very much for your guide. It's a great help for me.
> >
> > But I still have a little problem with the patch thing. I'm not familiar with the git.
> > 1.Shall I need to do the clone and get the source location and target directory first?
> > 2.Where is the source location and target directory?
> > 3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
you can only get new features included upstream in the latest Linux kernel. So earliest version would be 3.4. You have to maintain you own repository for earlier version. But backporting should be not so much trouble if you have it included upstream.
> > 4.or just email you the source code and tell you the changes?
> >
> > I'm looking forward your re-guide. Thank you so much.
>
> Your best bet it to clone Linus' git tree and then apply your patches:
>
> 1. clone Linus' git tree:
> git clone
> git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
you can do this in between.
cd linux
git config --global user.name "陈俊杰 (Aaron Chen)"
git config --global user.email aaron.chen@siliconmotion.com
> 2. a) apply your first patch
> b) if you patch adds new files to the source tree, add them:
> git add path/to/files/file.c
> git add path/to/files/file.h
> etc. if the patch only modifies patches that are already
> in the tree, you do not need to add them.
> c) when the patch is applied commit it:
> git commit -a -s
> d) when you run the commit command you will be prompted to
> enter a commit message. The commit message has the following format:
>
> subsystem: patch description
>
> description of what the patch does.
>
> Signed-off-by: Your name <your_email@domain.com>
>
> E.g.,
>
> fb: add initial code for video 5000 graphics
>
> This adds the initial support for the video 5000 graphics adapter. It
> supports vga and lcd connectors.
>
> Signed-off-by: Joe Developer <joe.developer@example.com>
>
> e) repeat steps a-d for all of your patches 3. generate patches:
> git format-patch -n
>
> where n is the number of patches you committed. E.g., if your driver
> consists of 5 patches:
> git format-patch -5
>
> 4. Send the patches to the list.
Aaron, Git is nowadays documented pretty well. So just use
git help command
(like `git help commit`) to read the manual. Additionally you can just search for it using your favorite search engine. Interesting reads should be [1][2][3].
Thanks,
Paul
[1] http://schacon.github.com/git/user-manual.html#cleaning-up-history
[2] http://git-scm.com/documentation
[3] http://progit.org/book/
[-- Attachment #2: 0001-fb-add-initial-code-for-smi-graphics.patch --]
[-- Type: application/octet-stream, Size: 688721 bytes --]
From cb8ee9781dbcc68be1525f115e917fa8e47c9e48 Mon Sep 17 00:00:00 2001
From: "Chen Junjie (Aaron Chen)" <aaron.chen@siliconmotion.com>
Date: Fri, 9 Mar 2012 17:40:19 +0800
Subject: [PATCH] fb:add initial code for smi graphics
The driver is electra 4.1.3, which can support SM712,722,718,750,750LE,502
graphics chips.
Signed-off-by:Aaron chen <aaron.chen@siliconmotion.com>
---
drivers/video/Kconfig | 8 +
drivers/video/Makefile | 2 +
drivers/video/lynxfb/Makefile | 60 +
drivers/video/lynxfb/Release.txt | 157 ++
drivers/video/lynxfb/auto | 20 +
drivers/video/lynxfb/con2fb.c | 76 +
drivers/video/lynxfb/ddk712/ddk712.h | 20 +
drivers/video/lynxfb/ddk712/ddk712_chip.c | 146 ++
drivers/video/lynxfb/ddk712/ddk712_chip.h | 53 +
drivers/video/lynxfb/ddk712/ddk712_help.c | 29 +
drivers/video/lynxfb/ddk712/ddk712_help.h | 99 +
drivers/video/lynxfb/ddk712/ddk712_mode.c | 260 ++
drivers/video/lynxfb/ddk712/ddk712_mode.h | 22 +
drivers/video/lynxfb/ddk712/ddk712_reg.h | 14 +
drivers/video/lynxfb/ddk750/ddk750.h | 24 +
drivers/video/lynxfb/ddk750/ddk750_chip.c | 639 +++++
drivers/video/lynxfb/ddk750/ddk750_chip.h | 83 +
drivers/video/lynxfb/ddk750/ddk750_display.c | 318 +++
drivers/video/lynxfb/ddk750/ddk750_display.h | 160 ++
drivers/video/lynxfb/ddk750/ddk750_dvi.c | 98 +
drivers/video/lynxfb/ddk750/ddk750_dvi.h | 67 +
drivers/video/lynxfb/ddk750/ddk750_help.c | 19 +
drivers/video/lynxfb/ddk750/ddk750_help.h | 29 +
drivers/video/lynxfb/ddk750/ddk750_hwi2c.c | 270 ++
drivers/video/lynxfb/ddk750/ddk750_hwi2c.h | 10 +
drivers/video/lynxfb/ddk750/ddk750_mode.c | 205 ++
drivers/video/lynxfb/ddk750/ddk750_mode.h | 43 +
drivers/video/lynxfb/ddk750/ddk750_power.c | 239 ++
drivers/video/lynxfb/ddk750/ddk750_power.h | 71 +
drivers/video/lynxfb/ddk750/ddk750_reg.h | 2616 +++++++++++++++++++
drivers/video/lynxfb/ddk750/ddk750_sii164.c | 423 +++
drivers/video/lynxfb/ddk750/ddk750_sii164.h | 170 ++
drivers/video/lynxfb/ddk750/ddk750_swi2c.c | 535 ++++
drivers/video/lynxfb/ddk750/ddk750_swi2c.h | 92 +
drivers/video/lynxfb/lynx_accel.c | 527 ++++
drivers/video/lynxfb/lynx_accel.h | 281 ++
drivers/video/lynxfb/lynx_cursor.c | 382 +++
drivers/video/lynxfb/lynx_cursor.h | 28 +
drivers/video/lynxfb/lynx_drv.c | 2222 ++++++++++++++++
drivers/video/lynxfb/lynx_drv.h | 272 ++
drivers/video/lynxfb/lynx_help.h | 111 +
drivers/video/lynxfb/lynx_hw502.c | 1103 ++++++++
drivers/video/lynxfb/lynx_hw502.h | 127 +
drivers/video/lynxfb/lynx_hw712.c | 511 ++++
drivers/video/lynxfb/lynx_hw712.h | 35 +
drivers/video/lynxfb/lynx_hw750.c | 646 +++++
drivers/video/lynxfb/lynx_hw750.h | 104 +
drivers/video/lynxfb/modedb.c | 221 ++
drivers/video/lynxfb/readme | 97 +
drivers/video/lynxfb/ver.h | 20 +
drivers/video/lynxfb/voyager.h | 3625 ++++++++++++++++++++++++++
51 files changed, 17389 insertions(+), 0 deletions(-)
create mode 100644 drivers/video/lynxfb/Makefile
create mode 100644 drivers/video/lynxfb/Release.txt
create mode 100644 drivers/video/lynxfb/auto
create mode 100644 drivers/video/lynxfb/con2fb.c
create mode 100644 drivers/video/lynxfb/ddk712/ddk712.h
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_chip.c
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_chip.h
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_help.c
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_help.h
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_mode.c
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_mode.h
create mode 100644 drivers/video/lynxfb/ddk712/ddk712_reg.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_chip.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_chip.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_display.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_display.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_dvi.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_dvi.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_help.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_help.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_hwi2c.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_hwi2c.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_mode.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_mode.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_power.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_power.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_reg.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_sii164.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_sii164.h
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_swi2c.c
create mode 100644 drivers/video/lynxfb/ddk750/ddk750_swi2c.h
create mode 100644 drivers/video/lynxfb/lynx_accel.c
create mode 100644 drivers/video/lynxfb/lynx_accel.h
create mode 100644 drivers/video/lynxfb/lynx_cursor.c
create mode 100644 drivers/video/lynxfb/lynx_cursor.h
create mode 100644 drivers/video/lynxfb/lynx_drv.c
create mode 100644 drivers/video/lynxfb/lynx_drv.h
create mode 100644 drivers/video/lynxfb/lynx_help.h
create mode 100644 drivers/video/lynxfb/lynx_hw502.c
create mode 100644 drivers/video/lynxfb/lynx_hw502.h
create mode 100644 drivers/video/lynxfb/lynx_hw712.c
create mode 100644 drivers/video/lynxfb/lynx_hw712.h
create mode 100644 drivers/video/lynxfb/lynx_hw750.c
create mode 100644 drivers/video/lynxfb/lynx_hw750.h
create mode 100644 drivers/video/lynxfb/modedb.c
create mode 100644 drivers/video/lynxfb/readme
create mode 100644 drivers/video/lynxfb/ver.h
create mode 100644 drivers/video/lynxfb/voyager.h
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 6ca0c40..36d789d 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -2409,6 +2409,14 @@ config FB_PUV3_UNIGFX
Choose this option if you want to use the Unigfx device as a
framebuffer device. Without the support of PCI & AGP.
+config FB_LYNXFB
+ tristate "SMI lynx sm750/718/712/722/502 display support"
+ depends on FB && PCI
+ select FB_CFB_IMAGEBLIT
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+
+
source "drivers/video/omap/Kconfig"
source "drivers/video/omap2/Kconfig"
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 1426068..9315663 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -143,6 +143,8 @@ obj-$(CONFIG_FB_MSM) += msm/
obj-$(CONFIG_FB_NUC900) += nuc900fb.o
obj-$(CONFIG_FB_JZ4740) += jz4740_fb.o
obj-$(CONFIG_FB_PUV3_UNIGFX) += fb-puv3.o
+obj-$(CONFIG_FB_LYNXFB) += lynxfb/
+
# Platform or fallback drivers go here
obj-$(CONFIG_FB_UVESA) += uvesafb.o
diff --git a/drivers/video/lynxfb/Makefile b/drivers/video/lynxfb/Makefile
new file mode 100644
index 0000000..22b2bc8
--- /dev/null
+++ b/drivers/video/lynxfb/Makefile
@@ -0,0 +1,60 @@
+#
+# Makefile for lynx frame buffer
+# -by Monk.liu
+#
+ifeq ($(KERNELRELEASE),)
+
+ifeq ($(kernel),)
+# build the driver with kernel version currerntly using
+knv :=$(shell uname -r)
+else
+# user want to build the driver based on specific kernel version
+knv :=$(kernel)
+endif
+
+KERNELDIR :=/lib/modules/$(knv)/build
+PWD := $(shell pwd)
+
+default:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_FB_LYNXFB=m modules
+install:default
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_FB_LYNXFB=m modules_install
+clean:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
+else
+
+obj-$(CONFIG_FB_LYNXFB) += lynxfb.o
+
+lynxfb-y := lynx_drv.o lynx_hw750.o lynx_hw712.o lynx_hw502.o lynx_accel.o lynx_cursor.o
+lynxfb-y += ddk750/ddk750_chip.o ddk750/ddk750_power.o ddk750/ddk750_mode.o ddk750/ddk750_display.o ddk750/ddk750_help.o
+lynxfb-y += ddk712/ddk712_chip.o ddk712/ddk712_mode.o ddk712/ddk712_help.o ddk750/ddk750_swi2c.o
+
+ifneq ($(nodvi),1)
+lynxfb-y += ddk750/ddk750_sii164.o
+lynxfb-y += ddk750/ddk750_dvi.o
+EXTRA_CFLAGS += -DUSE_DVICHIP
+else
+endif
+
+# if user define swi2c=1,then for sm750/sm718,its dvi chip (sii164) will be initilized by swi2c
+# but for 750le, always swi2c used to setup its 7301 dvi chip
+ifneq ($(swi2c),1)
+lynxfb-y += ddk750/ddk750_hwi2c.o
+EXTRA_CFLAGS += -DUSE_HW_I2C
+endif
+
+lynxfb-objs := $(lynxfb-y)
+
+ifeq ($(debug),1)
+#CONFIG_FB_LYNXFB_DEBUG=y
+EXTRA_CFLAGS += -DDEBUG=1
+endif
+
+ifeq ($(debug),2)
+EXTRA_CFLAGS += -DDEBUG=2
+endif
+
+#ifdef CONFIG_FB_LYNXFB_DEBUG
+#endif
+
+endif
diff --git a/drivers/video/lynxfb/Release.txt b/drivers/video/lynxfb/Release.txt
new file mode 100644
index 0000000..5367439
--- /dev/null
+++ b/drivers/video/lynxfb/Release.txt
@@ -0,0 +1,157 @@
+-+===============================+-
+10/28/2011 Release version 4.1.3
+-+===============================+-
+changes:
+1+.use ":" to replace "," as the separator in string paramter
+ e.g. insmod ./lynxfb.ko g_option="noaccel:800x600:nomtrr"
+
+Features:
+1+.support dual view (on sm718/750 and sm502)
+ 1)insert module:
+ => insert driver on dual with default resolution
+ insmod ./lynxfb.ko g_option="dual"
+ => insert driver on dual with specific resolution
+ insmod ./lynxfb.ko g_option="dual,800x600-8@60,1280x1024-16@60"
+ Note: after driver installed,their will be two fbX inode created under /dev folder (like fb0,fb1)
+
+ 2)link ttyX with fbX:
+ use con2fb tool to link a tty with a fb node
+ type "con2fb 0 1" to link tty1 with fb0
+ type "con2fb 1 2" to link tty2 with fb1
+
+
+
+Bugs:
+1-.some memory size/offset given to kernel is buggy in previous version,
+ which will make some major error when kernel driver being apartner with
+ upper-layer application like QT and DirectFB
+
+2-.fix some mode error for sm750le
+3-.fix a string calculating error in setup routine
+4-.fix 712 hang phenomenon on x86_64 system (new issue,see below known issues #1)
+5-.fix 722 2d hang issue (repeat unload and load driver module frequently will make 722 hang if 2d accel enabled)
+
+known issues:
+1+.for sm712 on x86_64 system,pci burst read calls system die,disable it when x86_64 detected
+ but pci burst write (MTRR) cannot reproduce this phenomenon.
+
+
+-+===============================+-
+09/27/2011 Release version 4.0.3
+-+===============================+-
+feature add:
+1.support rhel 4.3 and sles 9 (x86_64 and i386)
+2.add modedb.c into source for preventing kernel panic (the panic happend in rhel4.x,which proved to be caused by null address reference from modedb)
+
+
+-+===============================+-
+09/27/2011 Release version 4.0.2
+-+===============================+-
+Support Chipset
+1.sm750LE
+
+Support OS/kernel/arch:
+1.support OS under x86 and x86_64: SLES 10/11
+
+Bug fixed:
+1.some common mode set failed,such as 1280x960,1152x864,fixed and cordinate the root cuase in abuse of fb_find_mode
+2.suspend/resume of sm750le failed,fixed by adding ch7301 setup in hwInit routine
+
+Feature add:
+1.add extra mode "1280x768@60"
+
+
+-+===============================+-
+08/11/2011 Release version 4.0.1
+-+===============================+-
+Support Chipset
+1.sm750LE
+
+Support OS/kernel/arch:
+1.support OS under x86 and x86_64: RHEL 5.5/6.0
+
+Bug fixed:
+1.some common mode set failed,such as 1280x960,1152x864,fixed and cordinate the root cuase in abuse of fb_find_mode
+2.suspend/resume of sm750le failed,fixed by adding ch7301 setup in hwInit routine
+
+Feature add:
+1.add extra mode "1280x768@60"
+
+-+===============================+-
+08/11/2011
+-+===============================+-
+Bug fixed:
+1.Fixed the bug that many standard or vesa mode can not be set,like 1280x960
+2.rewrite the mode finding section of driver,to make it more smart and reliable
+
+-+===============================+-
+08/11/2011
+-+===============================+-
+
+Bug fixed:
+1. Fixed the bug that Electra can not been compiled and worked in RHEL5.5 and SLES 10-sp3.
+
+-+===============================+-
+07/28/2011
+-+===============================+-
+Features added:
+1.support hardware cursor for sm712/722
+2.support kerne version below 2.6.30 and above 2.6.12
+3.support 64bit
+
+Bug fixed:
+1.parameter passed to g_option can't handle the case like "nohwc,1280x1024-16@60"
+ the mode request will get lost,driver will boot with default mode.the root cause is
+ located in the string process routine,it's always wrong when nohwc is ahead of mode
+ parameter.
+
+Known issues:
+1.8bpp mode will encounter bug when used by plymouth (ubuntu 10.04)
+ root cause if because tty7 use by plymouth to output log message
+ will alter the mode to 8bpp beneath the knowledge of plymouth
+ and plymouth still draw 16/32bpp data image to frame buffer
+2.cursor color of sm712/722 incorrect,won't fix due to the hardware limitation
+ (712 cursor can only present 3:3:2 color)
+3.disable cursor of sm712/722 by default. It can be enable by set option "usehwc".
+
+-+===============================+-
+07/21/2011 Release version 4.0.0
+-+===============================+-
+Features added:
+1.support sm502 alsa audio
+2.support 2.6.31 ~ 2.6.39 kernel
+3.support hardware cursor for sm502/718/750
+4.support 2d accel
+
+Bug fixed:
+1.fix bug #6132:cursor image messed up after resume
+2.fix bug #6133:no timing signal after resume of sm712/722
+Known issue:
+
+1.8bpp mode will encounter bug when used by plymouth (ubuntu 10.04)
+ root cause if because tty7 use by plymouth to output log message
+ will alter the mode to 8bpp beneath the knowledge of plymouth
+ and plymouth still draw 16/32bpp data image to frame buffer
+2.hardware cursor for sm712/722 not supported yet.
+
+-+===============================+-
+05/04/2011
+-+===============================+-
+Features:
+1.all vesa mode
+2.8/16/24/32 bpp (24 bpp only for sm750/718/502)
+3.2D acceleration supported
+4.hardware cursor supported for 502/718/750
+5.MTRR supported
+
+Support Chipset
+1.sm502
+2.sm712
+3.sm718
+4.sm722
+5.sm750
+
+Support OS/kernel/arch:
+1.support OS under x86 and x86_64: fedora 12,ubuntu 9.10/10.04
+2.support kernel version:see kernel version of above distro
+3.support arch: x86 and x86_64
diff --git a/drivers/video/lynxfb/auto b/drivers/video/lynxfb/auto
new file mode 100644
index 0000000..309d107
--- /dev/null
+++ b/drivers/video/lynxfb/auto
@@ -0,0 +1,20 @@
+#!/bin/sh
+dmesg -c > /dev/null
+if [ $# -lt 2 ];then
+echo "no g_option come in,use default value"
+parm=""
+echo "default g_option is $parm"
+else
+parm=$2
+echo "g_option is $parm"
+fi
+# start to test
+insmod ./lynxfb.ko g_option="$parm"
+for((a=1;a<=$1;a=a+1))
+do
+echo 0 > /sys/class/vtconsole/vtcon1/bind
+rmmod lynxfb
+insmod ./lynxfb.ko g_option="$parm"
+echo "loop $a done"
+done
+
diff --git a/drivers/video/lynxfb/con2fb.c b/drivers/video/lynxfb/con2fb.c
new file mode 100644
index 0000000..5c5e0e3
--- /dev/null
+++ b/drivers/video/lynxfb/con2fb.c
@@ -0,0 +1,76 @@
+#include <linux/fb.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int main(int argc, char* argv[]) {
+ struct fb_con2fbmap c2m;
+ char* fbPath;
+ u_int32_t con, fb;
+ char* e;
+ char* progname = strrchr(argv[0], '/');
+ int f;
+
+ if (progname)
+ progname++;
+ else
+ progname = argv[0];
+ if (argc < 3) {
+ fprintf(stderr, "usage: %s fbdev console\n", progname);
+ return 1;
+ }
+ fb = strtoul(argv[1], &e, 10);
+ if (*e) {
+ struct stat sbf;
+
+ if (stat(argv[1], &sbf)) {
+ fprintf(stderr, "%s: are you sure that %s can be used to describe fbdev?\n", progname, argv[1]);
+ return 1;
+ }
+ if (!S_ISCHR(sbf.st_mode)) {
+ fprintf(stderr, "%s: %s must be character device\n", progname, argv[1]);
+ return 1;
+ }
+ fb = sbf.st_rdev & 0xFF;
+ if (fb >= 32)
+ fb >>= 5;
+ fbPath = argv[1];
+ } else
+ fbPath = "/dev/fb0";
+ con = strtoul(argv[2], &e, 10);
+ if (*e) {
+ struct stat sbf;
+
+ if (stat(argv[2], &sbf)) {
+ fprintf(stderr, "%s: are you sure that %s can be used to describe vt?\n", progname, argv[2]);
+ return 1;
+ }
+ if (!S_ISCHR(sbf.st_mode)) {
+ fprintf(stderr, "%s: %s must be character device\n", progname, argv[2]);
+ return 1;
+ }
+ con = sbf.st_rdev & 0xFF;
+ }
+ c2m.console = con;
+ c2m.framebuffer = fb;
+ f = open(fbPath, O_RDWR);
+ if (f < 0) {
+ fprintf(stderr, "%s: Cannot open %s\n", progname, fbPath);
+ return 1;
+ }
+ if (ioctl(f, FBIOPUT_CON2FBMAP, &c2m)) {
+ fprintf(stderr, "%s: Cannot set console mapping\n", progname);
+ close(f);
+ return 1;
+ }
+ close(f);
+ return 0;
+}
+
+
+
diff --git a/drivers/video/lynxfb/ddk712/ddk712.h b/drivers/video/lynxfb/ddk712/ddk712.h
new file mode 100644
index 0000000..3fabd75
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712.h
@@ -0,0 +1,20 @@
+#ifndef DDK712_H__
+#define DDK712_H__
+/*******************************************************************
+*
+* Copyright (c) 2007 by Silicon Motion, Inc. (SMI)
+*
+* All rights are reserved. Reproduction or in part is prohibited
+* without the written consent of the copyright owner.
+*
+* RegSC.h --- SM718 SDK
+* This file contains the definitions for the System Configuration registers.
+*
+*******************************************************************/
+#include "ddk712_reg.h"
+#include "ddk712_mode.h"
+#include "ddk712_chip.h"
+//#include "ddk712_display.h"
+#include "ddk712_help.h"
+
+#endif
diff --git a/drivers/video/lynxfb/ddk712/ddk712_chip.c b/drivers/video/lynxfb/ddk712/ddk712_chip.c
new file mode 100644
index 0000000..69bc273
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_chip.c
@@ -0,0 +1,146 @@
+#include "ddk712_chip.h"
+#include "ddk712_help.h"
+
+/* MCLK X mdr = INPUT X mnr */
+unsigned int ddk712_calcPllValue(unsigned int clock,int* o_mnr,int* o_mdr)
+{
+ int mdr,mnr;
+ unsigned int mxm;
+ unsigned int request,input;
+ unsigned int quo,rem;
+ unsigned int miniDiff,diff0;
+
+ miniDiff = ~0;
+ /* clocl diveded b 1000 to prevent from overflow exception */
+ request = clock /1000;
+ input = DEFAULT_INPUT_CLOCK / 1000;
+
+ for(mdr=1;mdr<64;mdr++){
+ mxm = request * mdr;
+ quo = mxm / input;
+ rem = mxm % input;
+ if((rem * 100 / input) > 500)
+ quo++;
+ mnr = quo;
+
+ if(mnr < 256){
+ diff0 = absDiff(calcMCLK(mnr,mdr),clock);
+ if(diff0 < miniDiff)
+ {
+ *o_mnr = mnr;
+ *o_mdr = mdr;
+ }
+ }
+ }
+
+ return calcMCLK(*o_mnr,*o_mdr);
+}
+
+void ddk712_hw_init(init_parm_712 * param)
+{
+ int mnr,mdr;
+ mnr = mdr = 1;
+
+ /* for sm712 pci burst enabling
+ * either:
+ * open both burst write and read
+ * or
+ * open burst write and disable burst read
+ * nothing else
+ * */
+ if(param->pci_burst == 2){
+ /* burst write on and read off*/
+ poke_scr(0x17,peek_scr(0x17)|0x20);
+ poke_scr(0x15,peek_scr(0x15)&~0x80);
+ }else if(param->pci_burst == 3){
+ /* both burst read and write on*/
+ poke_scr(0x17, peek_scr(0x17)|0x20);
+ poke_scr(0x15, peek_scr(0x15)|0x80);
+ }else{
+ /* no pci burst */
+ poke_scr(0x17,peek_scr(0x17) & ~0x20);
+ }
+
+ /* use 3dx for crtc IO */
+ poke8_io(0x3c2,peek8_io(0x3cc)|1);
+
+ /* if memClock is 0,than use BIOS setting */
+ if(param->memClock > 0){
+ /* get approprite mnr,mdr for memory clock */
+ ddk712_calcPllValue(param->memClock,&mnr,&mdr);
+ poke_ccr(0x6a,mnr&0xff);
+ poke_ccr(0x6b,mdr&0xff);
+ }
+
+ if(param->devid == 0x720){
+ /* for sm722,always set pdr21 bit 5 to 0*/
+ poke_pdr(0x21,peek_pdr(0x21)&~0x20);
+ }
+
+ /* Disable LCD framebuffer r/w operation */
+ /* enable VPR power gate,VPR is used in frame buffer driver
+ * enable CPR power gate,and DPR power gate
+ * */
+ poke_pdr(0x21,(peek_pdr(0x21)|0x30)&0xf8);
+
+ /* Enable DAC defaultly */
+ poke_pdr(0x21,peek_pdr(0x21)&0x7f);
+
+ /* power down mode is standby mode, VCLK and MCLK divided by 4*/
+ poke_pdr(0x20,(peek_pdr(0x20) & ~0xb0)|0x10);
+
+ /* Disable horizontal expansion and auto centering */
+ poke_fpr(0x32,peek_fpr(0x32)&~3);
+
+ /* Disable verticle expansion/vertical centering/horizontal centering */
+ poke_crt(0x9e,peek_crt(0x9e) & ~7);
+ poke_crt(0x17, peek_crt(0x17) | 0x80);
+
+ /* use vclk1 */
+ poke_ccr(0x68,0x54);
+
+ /* Disable panel video */
+ poke_fpr(0xa0,0);
+ poke_ccr(0x33,0);
+ poke_ccr(0x3a,0);
+
+ /* memory control regsiter */
+ poke_mcr(0x60,1);
+
+ /* below mcr register should be set by BIOS/GPIO pin */
+#if 1
+ /* memory bank set */
+ poke_mcr(0x61,0);
+
+ /* mcr6 should be set by onboard GPIO pin,but for internal memory 720
+ * only ff is workable,while 0x3e for sm712
+ * */
+ if(param->devid == 0x720)
+ poke_mcr(0x62,0xff);
+ else
+ poke_mcr(0x62,0x3e);
+
+ /* MCR 63 is not claimed on datasheet,but experiment shows that sm712 need it be 0x1a
+ * for stable timing */
+ poke_mcr(0x63,0x1a);
+
+#endif
+
+ if(param->lcd != LCD712_USE_JUMP){
+ poke_fpr(0x30,(peek_fpr(0x30)&0xfe)|param->lcd);
+ /* set other related registers*/
+ }
+
+ if(param->lcd_color.tftColor != TFT_USE_JUMP){
+// printk("monk:param->lcd_color.tftColor = %d\n",param->lcd_color.tftColor);
+ poke_fpr(0x30,(peek_fpr(0x30)&0x8f)|(param->lcd_color.tftColor<<4));
+// printk("monk peek scr 0x30 = %02x\n",peek_fpr(0x30));
+ /* set other related registers*/
+ }
+
+ if(param->lcd_color.dstnColor != DSTN_USE_JUMP){
+ poke_fpr(0x30,(peek_fpr(0x30)&0x7f)|(param->lcd_color.dstnColor <<7));
+ /* set other related registers*/
+ }
+}
+
diff --git a/drivers/video/lynxfb/ddk712/ddk712_chip.h b/drivers/video/lynxfb/ddk712/ddk712_chip.h
new file mode 100644
index 0000000..4fe2e63
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_chip.h
@@ -0,0 +1,53 @@
+#ifndef DDK712_CHIP_H__
+#define DDK712_CHIP_H__
+#define DEFAULT_INPUT_CLOCK 14318181 /* Default reference clock */
+
+enum LCD_TYPE{
+ LCD712_USE_JUMP = -1,
+ LCD712_DSTN = 1,
+ LCD712_TFT = 0,
+};
+
+enum TFT_COLOR{
+ TFT_USE_JUMP = -1,
+ TFT_9BIT = 0,
+ TFT_12BIT = 1,
+ TFT_18BIT = 2,
+ TFT_24BIT = 3,
+ TFT_12P12 = 4,
+ TFT_ANALOG = 5,
+ TFT_18P18 = 6,
+};
+
+enum DSTN_COLOR{
+ DSTN_USE_JUMP = -1,
+ DSTN_16BIT = 0,
+ DSTN_24BIT = 1,
+};
+
+typedef struct _init_parm_712{
+ int devid;/* sm712 sm722*/
+ unsigned int memClock;
+ /* pci burst read,write enable bit*/
+ int pci_burst;/* bit 0 stand for read and 1 for write*/
+ /* lcd settings*/
+ enum LCD_TYPE lcd;
+ struct {
+ enum TFT_COLOR tftColor;
+ enum DSTN_COLOR dstnColor;
+ }lcd_color;
+}init_parm_712;
+
+static inline unsigned int calcMCLK(int mnr,int mdr)
+{
+ /* don't worry about overlflow
+ * 14.318181 mhz * 255 == 3.4 G */
+ return DEFAULT_INPUT_CLOCK * mnr / mdr;
+}
+
+
+unsigned int ddk712_calcPllValue(unsigned int,int*,int*);
+void ddk712_hw_init(init_parm_712*);
+void ddk712_set_mmio(int,volatile unsigned char *);
+
+#endif
diff --git a/drivers/video/lynxfb/ddk712/ddk712_help.c b/drivers/video/lynxfb/ddk712/ddk712_help.c
new file mode 100644
index 0000000..bdbdcca
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_help.c
@@ -0,0 +1,29 @@
+#include "ddk712_help.h"
+
+volatile unsigned char __iomem * mmio712 = NULL;
+/* below offset used for sm712/sm722 */
+int io_offset712;
+/* DPR and VPR memory mapped registers,treated as 32bit access */
+int dpr_offset712;
+int vpr_offset712;
+int dataPort_offset712;
+
+/* after driver mapped io registers, use this function first */
+void ddk712_set_mmio(int devid,volatile unsigned char __iomem * addr)
+{
+ mmio712 = addr;
+ if(devid == 0x712){
+ /* sm712 register offset stuffs */
+ io_offset712 = MB(3);
+ dpr_offset712 = KB(32);
+ vpr_offset712 = KB(48);
+ dataPort_offset712 = MB(1);
+ }else if(devid == 0x720){
+ /* sm722 register offset stuffs */
+ io_offset712 = KB(768);
+ dpr_offset712 = KB(0);
+ vpr_offset712 = KB(2);
+ dataPort_offset712 = MB(1);
+ }
+}
+
diff --git a/drivers/video/lynxfb/ddk712/ddk712_help.h b/drivers/video/lynxfb/ddk712/ddk712_help.h
new file mode 100644
index 0000000..307e795
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_help.h
@@ -0,0 +1,99 @@
+#ifndef DDK712_HELP_H__
+#define DDK712_HELP_H__
+#include "ddk712_chip.h"
+#ifndef USE_INTERNAL_REGISTER_ACCESS
+
+#include <linux/ioport.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include "../lynx_help.h"
+
+/* mmio712 start from framebuffer + 4mega bytes */
+extern volatile unsigned char __iomem * mmio712;
+extern int io_offset712;
+/* DPR and VPR memory mapped registers,treated as 32bit access */
+extern int dpr_offset712;
+extern int vpr_offset712;
+extern int dataPort_offset712;
+
+#define peek32(addr) readl((addr)+mmio712)
+#define poke32(addr,data) writel((data),(addr)+mmio712)
+
+#define peek8(addr) readb((addr)+mmio712)
+#define poke8(addr,data) writeb((data),(addr)+mmio712)
+
+#define peek8_io(addr) peek8(addr+io_offset712)
+#define poke8_io(addr,data) poke8(addr+io_offset712,data)
+
+static inline char peek_scr(int idx)
+{
+ poke8_io(0x3c4,idx);
+ return peek8_io(0x3c5);
+}
+
+static inline void poke_scr(int idx,char val)
+{
+ poke8_io(0x3c4,idx);
+ poke8_io(0x3c5,val);
+}
+
+static inline char peek_crt(int idx)
+{
+ poke8_io(0x3d4,idx);
+ return peek8_io(0x3d5);
+}
+
+static inline void poke_crt(int idx,char val)
+{
+ poke8_io(0x3d4,idx);
+ poke8_io(0x3d5,val);
+}
+
+/* below registers equal to sequence registers */
+#define peek_pdr(a) peek_scr(a)
+#define peek_fpr(a) peek_scr(a)
+#define peek_mcr(a) peek_scr(a)
+#define peek_ccr(a) peek_scr(a)
+#define peek_gpr(a) peek_scr(a)
+#define peek_phr(a) peek_scr(a)
+#define peek_pop(a) peek_scr(a)
+#define peek_hcr(a) peek_scr(a)
+
+#define poke_pdr(a,b) poke_scr(a,b)
+#define poke_fpr(a,b) poke_scr(a,b)
+#define poke_mcr(a,b) poke_scr(a,b)
+#define poke_ccr(a,b) poke_scr(a,b)
+#define poke_gpr(a,b) poke_scr(a,b)
+#define poke_phr(a,b) poke_scr(a,b)
+#define poke_pop(a,b) poke_scr(a,b)
+#define poke_hcr(a,b) poke_scr(a,b)
+
+/* below registers equal to crtc registers*/
+#define peek_svr(a) peek_crt(a)
+#define poke_svr(a,b) poke_crt(a,b)
+
+
+static inline unsigned int peek32_dpr(int index)
+{
+ return peek32(index + dpr_offset712);
+}
+
+static inline void poke32_dpr(int index,unsigned int val)
+{
+ poke32(index + dpr_offset712,val);
+}
+
+static inline unsigned int peek32_vpr(int index)
+{
+ return peek32(index + vpr_offset712);
+}
+
+static inline void poke32_vpr(int index,unsigned int val)
+{
+ poke32(index + vpr_offset712,val);
+}
+#else
+/* implement if you want use it*/
+#endif
+
+#endif
diff --git a/drivers/video/lynxfb/ddk712/ddk712_mode.c b/drivers/video/lynxfb/ddk712/ddk712_mode.c
new file mode 100644
index 0000000..c4878f8
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_mode.c
@@ -0,0 +1,260 @@
+#include "ddk712_mode.h"
+#include "ddk712_help.h"
+#include "ddk712_reg.h"
+
+const SM712CrtTiming sm712_crt_modedb[] = {
+/* 640x480 */
+{
+ 640,480,60,
+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, 0x07, 0x82,
+},
+{
+ 640,480,75,
+ 0x64, 0x4F, 0x00, 0x52, 0x1A, 0xF2, 0xDF, 0x00,
+ 0xE0, 0x03, 0x0F, 0xC0, 0x4F, 0xDF, 0x16, 0x85,
+},
+{
+ 640,480,85,
+ 0x63, 0x4F, 0x00, 0x57, 0x1E, 0xFB, 0xDF, 0x00,
+ 0xE0, 0x03, 0x0F, 0xC0, 0x4F, 0xDF, 0x88, 0x9B,
+},
+/* 800x480 */
+{
+ 800,480,60,
+ 0x6B, 0x63, 0x00, 0x69, 0x1B, 0xF2, 0xDF, 0x00,
+ 0xE2, 0xE4, 0x1F, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+{
+ 800,480,75,
+ 0x6B, 0x63, 0x00, 0x69, 0x1B, 0xF2, 0xDF, 0x00,
+ 0xE2, 0xE4, 0x1F, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+{
+ 800,480,85,
+ 0x6B, 0x63, 0x00, 0x69, 0x1B, 0xF2, 0xDF, 0x00,
+ 0xE2, 0xE4, 0x1F, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+/* 800x600 */
+{
+ 800,600,60,
+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, 0x1C, 0x85,
+},
+{
+ 800,600,75,
+ 0x7F, 0x63, 0x00, 0x66, 0x10, 0x6F, 0x57, 0x00,
+ 0x58, 0x0B, 0xE0, 0x20, 0x63, 0x57, 0x4C, 0x8B,
+},
+{
+ 800,600,85,
+ 0x7E, 0x63, 0x00, 0x68, 0x10, 0x75, 0x57, 0x00,
+ 0x58, 0x0B, 0xE0, 0x20, 0x63, 0x57, 0x37, 0x87,
+},
+#if 0
+/* 1024x600 */
+{
+ 1024,600,60,
+ 0xA3, 0x7F, 0x00, 0x82, 0x0B, 0x6F, 0x57, 0x00,
+ 0x5C, 0x0F, 0xE0, 0xE0, 0x7F, 0x57, 0x16, 0x07,
+},
+#endif
+/* 1024x768 */
+
+{
+ 1024,768,60,
+ 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
+ 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF, 0x52, 0x89,
+},
+{
+ 1024,768,75,
+ 0x9F, 0x7F, 0x00, 0x82, 0x0E, 0x1E, 0xFF, 0x00,
+ 0x00, 0x03, 0xE5, 0x20, 0x7F, 0xFF, 0x0B, 0x02,
+},
+{
+ 1024,768,85,
+ 0xA7, 0x7F, 0x00, 0x86, 0x12, 0x26, 0xFF, 0x00,
+ 0x00, 0x03, 0xE5, 0x20, 0x7F, 0xFF, 0x70, 0x11,
+},
+
+/* 1280x1024 */
+{
+ 1280,1024,60,
+ 0xCE, 0x9F, 0x00, 0xA7, 0x15, 0x28, 0xFF, 0x00,
+ 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x53, 0x0B,
+},
+{
+ 1280,1024,75,
+ 0xCE, 0x9F, 0x00, 0xA2, 0x14, 0x28, 0xFF, 0x00,
+// 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x13, 0x02,
+ 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x42, 0x07,
+},
+{
+ 1280,1024,85,
+ 0xD3, 0x9F, 0x00, 0xA8, 0x1C, 0x2E, 0xFF, 0x00,
+// 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x16, 0x42,
+ 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x0b, 0x01,
+},
+
+};
+
+const SM712PnlTiming sm712_pnl_modedb[] = {
+#if 0
+{
+
+ 640,480,60,
+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0C, 0xDF, 0xE9,
+ 0x00, 0x03, 0x59, 0x00, 0x4F, 0xDF, 0x03, 0x02,
+},
+
+{
+ 640,480,75,
+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0C, 0xDF, 0xE9,
+ 0x00, 0x03, 0x59, 0xC0, 0x4F, 0xDF, 0x16, 0x85,
+},
+{
+ 640,480,85,
+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0C, 0xDF, 0xE9,
+ 0x00, 0x03, 0x59, 0xC0, 0x4F, 0xDF, 0x88, 0x9B,
+},
+#endif
+{
+ 800,480,60,
+ 0x02, 0x24, 0x7B, 0x63, 0x67, 0xF3, 0xDF, 0xE2,
+ 0x00, 0x03, 0x41, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+#if 0
+{
+ 800,480,75,
+ 0x6B, 0x63, 0x00, 0x69, 0x1B, 0xF2, 0xDF, 0x00,
+ 0xE2, 0xE4, 0x1F, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+{
+ 800,480,85,
+ 0x6B, 0x63, 0x00, 0x69, 0x1B, 0xF2, 0xDF, 0x00,
+ 0xE2, 0xE4, 0x1F, 0xC0, 0x63, 0xDF, 0x2C, 0x17,
+},
+#endif
+{
+ 800,600,60,
+ 0x04, 0x48, 0x83, 0x63, 0x69, 0x73, 0x57, 0x58,
+ 0x00, 0x03, 0x7B, 0x20, 0x63, 0x57, 0x0E, 0x05,
+},
+#if 0
+{
+ 800,600,75,
+ 0x7F, 0x63, 0x00, 0x66, 0x10, 0x6F, 0x57, 0x00,
+ 0x58, 0x0B, 0xE0, 0x20, 0x63, 0x57, 0x4C, 0x8B,
+},
+{
+ 800,600,85,
+ 0x7E, 0x63, 0x00, 0x68, 0x10, 0x75, 0x57, 0x00,
+ 0x58, 0x0B, 0xE0, 0x20, 0x63, 0x57, 0x37, 0x87,
+},
+#endif
+#if 0
+{
+ 1024,600,60,
+ 0x04, 0x48, 0x95, 0x7F, 0x86, 0x70, 0x57, 0x5B,
+ 0x00, 0x60, 0x1c, 0x22, 0x7F, 0x57, 0x16, 0x07,
+},
+#endif
+{
+ 1024,768,60,
+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x25, 0xFF, 0x02,
+ 0x00, 0x62, 0x85, 0x20, 0x7F, 0xFF, 0x29, 0x09,
+},
+#if 0
+{
+ 1024,768,75,
+ 0x9F, 0x7F, 0x00, 0x82, 0x0E, 0x1E, 0xFF, 0x00,
+ 0x00, 0x03, 0xE5, 0x20, 0x7F, 0xFF, 0x0B, 0x02,
+},
+{
+ 1024,768,85,
+ 0xA7, 0x7F, 0x00, 0x86, 0x12, 0x26, 0xFF, 0x00,
+ 0x00, 0x03, 0xE5, 0x20, 0x7F, 0xFF, 0x70, 0x11,
+},
+#endif
+{
+ 1280,1024,60,
+ 0x08, 0x8C, 0xD5, 0x9F, 0xAB, 0x26, 0xFF, 0x00,
+ 0x00, 0x03, 0x7E, 0x20, 0x9F, 0xFF, 0x53, 0x0B,
+},
+#if 0
+{
+ 1280,1024,75,
+ 0xCE, 0x9F, 0x00, 0xA2, 0x14, 0x28, 0xFF, 0x00,
+ 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x42, 0x07,
+},
+{
+ 1280,1024,85,
+ 0xD3, 0x9F, 0x00, 0xA8, 0x1C, 0x2E, 0xFF, 0x00,
+ 0x00, 0x03, 0x4A, 0x20, 0x9F, 0xFF, 0x0b, 0x01,
+},
+#endif
+};
+
+#define CNT_CRT sizeof(sm712_crt_modedb)/sizeof(sm712_crt_modedb[0])
+#define CNT_PNL sizeof(sm712_pnl_modedb)/sizeof(sm712_pnl_modedb[0])
+
+void ddk712_setModeTiming(int channel,int x,int y,int hz)
+{
+ int i;
+ int index;
+ index = 0;
+ if(channel == 0){
+ while(index < CNT_CRT){
+ if(sm712_crt_modedb[index].h_res == x &&
+ sm712_crt_modedb[index].v_res == y &&
+ sm712_crt_modedb[index].vsync == hz)
+ break;
+ index++;
+ }
+ if(index == CNT_CRT){
+ /* no mode found in table */
+ return;
+ }
+
+ /* program svr */
+ for(i=0;i<14;i++){
+ poke_svr(0x40+i,sm712_crt_modedb[index].svr[i]);
+ }
+
+ /* work around crt */
+ if(y>=1024){
+ poke_crt(0x30,peek_crt(0x30)|9);
+ }else{
+ poke_crt(0x30,peek_crt(0x30)&~9);
+ }
+
+ /* programe ccr for pixel clock */
+ poke_ccr(0x6c,sm712_crt_modedb[index].ccr[0]);
+ poke_ccr(0x6d,sm712_crt_modedb[index].ccr[1]);
+
+ }else{
+ while(index < CNT_PNL){
+ if(sm712_pnl_modedb[index].h_res == x &&
+ sm712_pnl_modedb[index].v_res == y &&
+ sm712_pnl_modedb[index].vsync == hz)
+ break;
+ index++;
+ }
+ if(index == CNT_PNL){
+ return;
+ }
+
+ /* program FPR */
+ for(i=0;i<8;i++){
+ poke_fpr(0x50+i,sm712_pnl_modedb[index].fpr[i]);
+ }
+
+ /* program fpr5a*/
+ poke_fpr(0x5a,sm712_pnl_modedb[index].fpr[0xa]);
+
+ /* program ccr for pixel clock*/
+ poke_ccr(0x6e,sm712_pnl_modedb[index].ccr[0]);
+ poke_ccr(0x6f,sm712_pnl_modedb[index].ccr[1]);
+
+ }
+}
diff --git a/drivers/video/lynxfb/ddk712/ddk712_mode.h b/drivers/video/lynxfb/ddk712/ddk712_mode.h
new file mode 100644
index 0000000..b2db43e
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_mode.h
@@ -0,0 +1,22 @@
+#ifndef DDK712_MODE_H__
+#define DDK712_MODE_H__
+
+typedef struct{
+ unsigned short h_res;
+ unsigned short v_res;
+ char vsync;
+ char svr[14];/* shadow vga register :svr 40 => svr 4d*/
+ char ccr[2];/* pixel pll:ccr6c,6d */
+}SM712CrtTiming;
+
+typedef struct{
+ unsigned short h_res;
+ unsigned short v_res;
+ char vsync;
+ char fpr[14];/* fpr50 ==> fpr57,fpr5a*/
+ char ccr[2];/* ccr6e.ccr6f*/
+}SM712PnlTiming;
+
+
+void ddk712_setModeTiming(int channel,int x,int y,int hz);
+#endif
diff --git a/drivers/video/lynxfb/ddk712/ddk712_reg.h b/drivers/video/lynxfb/ddk712/ddk712_reg.h
new file mode 100644
index 0000000..2c513c2
--- /dev/null
+++ b/drivers/video/lynxfb/ddk712/ddk712_reg.h
@@ -0,0 +1,14 @@
+#ifndef DDK712_REG_H__
+#define DDK712_REG_H__
+
+#define MISC_GRAPH_VIDEO_CTRL 0
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT 18:16
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_8 0
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_15 1
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_16 2
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_32 3
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_24 4
+#define MISC_GRAPH_VIDEO_CTRL_DATA_FORMAT_8P 5
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750.h b/drivers/video/lynxfb/ddk750/ddk750.h
new file mode 100644
index 0000000..289e95a
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750.h
@@ -0,0 +1,24 @@
+#ifndef DDK750_H__
+#define DDK750_H__
+/*******************************************************************
+*
+* Copyright (c) 2007 by Silicon Motion, Inc. (SMI)
+*
+* All rights are reserved. Reproduction or in part is prohibited
+* without the written consent of the copyright owner.
+*
+* RegSC.h --- SM718 SDK
+* This file contains the definitions for the System Configuration registers.
+*
+*******************************************************************/
+#include "ddk750_reg.h"
+#include "ddk750_mode.h"
+#include "ddk750_chip.h"
+#include "ddk750_display.h"
+#include "ddk750_power.h"
+#include "ddk750_help.h"
+#ifdef USE_HW_I2C
+#include "ddk750_hwi2c.h"
+#endif
+#include "ddk750_swi2c.h"
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_chip.c b/drivers/video/lynxfb/ddk750/ddk750_chip.c
new file mode 100644
index 0000000..2959350
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_chip.c
@@ -0,0 +1,639 @@
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_chip.h"
+#include "ddk750_power.h"
+typedef struct _pllcalparam{
+ unsigned char power;/* d : 0~ 6*/
+ unsigned char pod;
+ unsigned char od;
+ unsigned char value;/* value of 2 power d (2^d) */
+}
+pllcalparam;
+
+
+logical_chip_type_t getChipType()
+{
+ unsigned short physicalID;
+ char physicalRev;
+ logical_chip_type_t chip;
+
+ physicalID = devId750;//either 0x718 or 0x750
+ physicalRev = revId750;
+
+ if (physicalID == 0x718)
+ {
+ chip = SM718;
+ }
+ else if (physicalID == 0x750)
+ {
+ chip = SM750;
+ /* SM750 and SM750LE are different in their revision ID only. */
+ if (physicalRev == SM750LE_REVISION_ID){
+ chip = SM750LE;
+ }
+ }
+ else
+ {
+ chip = SM_UNKNOWN;
+ }
+
+ return chip;
+}
+
+
+inline unsigned int twoToPowerOfx(unsigned long x)
+{
+ unsigned long i;
+ unsigned long result = 1;
+
+ for (i=1; i<=x; i++)
+ result *= 2;
+ return result;
+}
+
+inline unsigned int calcPLL(pll_value_t *pPLL)
+{
+ return (pPLL->inputFreq * pPLL->M / pPLL->N / twoToPowerOfx(pPLL->OD) / twoToPowerOfx(pPLL->POD));
+}
+
+unsigned int getPllValue(clock_type_t clockType, pll_value_t *pPLL)
+{
+ unsigned int ulPllReg = 0;
+
+ pPLL->inputFreq = DEFAULT_INPUT_CLOCK;
+ pPLL->clockType = clockType;
+
+ switch (clockType)
+ {
+ case MXCLK_PLL:
+ ulPllReg = PEEK32(MXCLK_PLL_CTRL);
+ break;
+ case PRIMARY_PLL:
+ ulPllReg = PEEK32(PANEL_PLL_CTRL);
+ break;
+ case SECONDARY_PLL:
+ ulPllReg = PEEK32(CRT_PLL_CTRL);
+ break;
+ case VGA0_PLL:
+ ulPllReg = PEEK32(VGA_PLL0_CTRL);
+ break;
+ case VGA1_PLL:
+ ulPllReg = PEEK32(VGA_PLL1_CTRL);
+ break;
+ }
+
+ pPLL->M = FIELD_GET(ulPllReg, PANEL_PLL_CTRL, M);
+ pPLL->N = FIELD_GET(ulPllReg, PANEL_PLL_CTRL, N);
+ pPLL->OD = FIELD_GET(ulPllReg, PANEL_PLL_CTRL, OD);
+ pPLL->POD = FIELD_GET(ulPllReg, PANEL_PLL_CTRL, POD);
+
+ return calcPLL(pPLL);
+}
+
+
+unsigned int getChipClock()
+{
+ pll_value_t pll;
+#if 1
+ if(getChipType() == SM750LE)
+ return MHz(130);
+#endif
+
+ return getPllValue(MXCLK_PLL, &pll);
+}
+
+
+/*
+ * This function set up the main chip clock.
+ *
+ * Input: Frequency to be set.
+ */
+void setChipClock(unsigned int frequency)
+{
+ pll_value_t pll;
+ unsigned int ulActualMxClk;
+#if 1
+ /* Cheok_0509: For SM750LE, the chip clock is fixed. Nothing to set. */
+ if (getChipType() == SM750LE)
+ return;
+#endif
+
+ if (frequency != 0)
+ {
+ /*
+ * Set up PLL, a structure to hold the value to be set in clocks.
+ */
+ pll.inputFreq = DEFAULT_INPUT_CLOCK; /* Defined in CLOCK.H */
+ pll.clockType = MXCLK_PLL;
+
+ /*
+ * Call calcPllValue() to fill up the other fields for PLL structure.
+ * Sometime, the chip cannot set up the exact clock required by User.
+ * Return value from calcPllValue() gives the actual possible clock.
+ */
+ ulActualMxClk = calcPllValue(frequency, &pll);
+
+ /* Master Clock Control: MXCLK_PLL */
+ POKE32(MXCLK_PLL_CTRL, formatPllReg(&pll));
+ }
+}
+
+
+
+void setMemoryClock(unsigned int frequency)
+{
+ unsigned int ulReg, divisor;
+ #if 1
+ /* Cheok_0509: For SM750LE, the memory clock is fixed. Nothing to set. */
+ if (getChipType() == SM750LE)
+ return;
+#endif
+ if (frequency != 0)
+ {
+ /* Set the frequency to the maximum frequency that the DDR Memory can take
+ which is 336MHz. */
+ if (frequency > MHz(336))
+ frequency = MHz(336);
+
+ /* Calculate the divisor */
+ divisor = (unsigned int) roundedDiv(getChipClock(), frequency);
+
+ /* Set the corresponding divisor in the register. */
+ ulReg = PEEK32(CURRENT_GATE);
+ switch(divisor)
+ {
+ default:
+ case 1:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, M2XCLK, DIV_1);
+ break;
+ case 2:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, M2XCLK, DIV_2);
+ break;
+ case 3:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, M2XCLK, DIV_3);
+ break;
+ case 4:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, M2XCLK, DIV_4);
+ break;
+ }
+
+ setCurrentGate(ulReg);
+ }
+}
+
+
+/*
+ * This function set up the master clock (MCLK).
+ *
+ * Input: Frequency to be set.
+ *
+ * NOTE:
+ * The maximum frequency the engine can run is 168MHz.
+ */
+void setMasterClock(unsigned int frequency)
+{
+ unsigned int ulReg, divisor;
+ #if 1
+ /* Cheok_0509: For SM750LE, the memory clock is fixed. Nothing to set. */
+ if (getChipType() == SM750LE)
+ return;
+#endif
+ if (frequency != 0)
+ {
+ /* Set the frequency to the maximum frequency that the SM750 engine can
+ run, which is about 190 MHz. */
+ if (frequency > MHz(190))
+ frequency = MHz(190);
+
+ /* Calculate the divisor */
+ divisor = (unsigned int) roundedDiv(getChipClock(), frequency);
+
+ /* Set the corresponding divisor in the register. */
+ ulReg = PEEK32(CURRENT_GATE);
+ switch(divisor)
+ {
+ default:
+ case 3:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, MCLK, DIV_3);
+ break;
+ case 4:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, MCLK, DIV_4);
+ break;
+ case 6:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, MCLK, DIV_6);
+ break;
+ case 8:
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, MCLK, DIV_8);
+ break;
+ }
+
+ setCurrentGate(ulReg);
+ }
+}
+
+
+unsigned int ddk750_getVMSize()
+{
+ unsigned int reg;
+ unsigned int data;
+
+ /* sm750le only use 64 mb memory*/
+ if(getChipType() == SM750LE)
+ return MB(64);
+
+ /* for 750,always use power mode0*/
+ reg = PEEK32(MODE0_GATE);
+ reg = FIELD_SET(reg,MODE0_GATE,GPIO,ON);
+ POKE32(MODE0_GATE,reg);
+
+ /* get frame buffer size from GPIO */
+ reg = FIELD_GET(PEEK32(MISC_CTRL),MISC_CTRL,LOCALMEM_SIZE);
+ switch(reg){
+ case MISC_CTRL_LOCALMEM_SIZE_8M: data = MB(8); break; /* 8 Mega byte */
+ case MISC_CTRL_LOCALMEM_SIZE_16M: data = MB(16); break; /* 16 Mega byte */
+ case MISC_CTRL_LOCALMEM_SIZE_32M: data = MB(32); break; /* 32 Mega byte */
+ case MISC_CTRL_LOCALMEM_SIZE_64M: data = MB(64); break; /* 64 Mega byte */
+ default: data = 0;break;
+ }
+ return data;
+
+}
+
+int ddk750_initHw(initchip_param_t * pInitParam)
+{
+
+ unsigned int ulReg;
+#if 0
+ //move the code to map regiter function.
+ if(getChipType() == SM718){
+ /* turn on big endian bit*/
+ ulReg = PEEK32(0x74);
+ /* now consider register definition in a big endian pattern*/
+ POKE32(0x74,ulReg|0x80000000);
+ }
+
+#endif
+
+
+ if (pInitParam->powerMode != 0 )
+ pInitParam->powerMode = 0;
+ setPowerMode(pInitParam->powerMode);
+
+ /* Enable display power gate & LOCALMEM power gate*/
+ ulReg = PEEK32(CURRENT_GATE);
+ ulReg = FIELD_SET(ulReg, CURRENT_GATE, DISPLAY, ON);
+ ulReg = FIELD_SET(ulReg,CURRENT_GATE,LOCALMEM,ON);
+ setCurrentGate(ulReg);
+
+ if(getChipType() != SM750LE){
+ /* set panel pll and graphic mode via mmio_88 */
+ ulReg = PEEK32(VGA_CONFIGURATION);
+ ulReg = FIELD_SET(ulReg,VGA_CONFIGURATION,PLL,PANEL);
+ ulReg = FIELD_SET(ulReg,VGA_CONFIGURATION,MODE,GRAPHIC);
+ POKE32(VGA_CONFIGURATION,ulReg);
+ }else{
+#if defined(__i386__) || defined( __x86_64__)
+ /* set graphic mode via IO method */
+ outb_p(0x88,0x3d4);
+ outb_p(0x06,0x3d5);
+#endif
+ }
+
+ /* Set the Main Chip Clock */
+ setChipClock(MHz((unsigned int)pInitParam->chipClock));
+
+ /* Set up memory clock. */
+ setMemoryClock(MHz(pInitParam->memClock));
+
+ /* Set up master clock */
+ setMasterClock(MHz(pInitParam->masterClock));
+
+
+ /* Reset the memory controller. If the memory controller is not reset in SM750,
+ the system might hang when sw accesses the memory.
+ The memory should be resetted after changing the MXCLK.
+ */
+ if (pInitParam->resetMemory == 1)
+ {
+ ulReg = PEEK32(MISC_CTRL);
+ ulReg = FIELD_SET(ulReg, MISC_CTRL, LOCALMEM_RESET, RESET);
+ POKE32(MISC_CTRL, ulReg);
+
+ ulReg = FIELD_SET(ulReg, MISC_CTRL, LOCALMEM_RESET, NORMAL);
+ POKE32(MISC_CTRL, ulReg);
+ }
+
+ if (pInitParam->setAllEngOff == 1)
+ {
+ enable2DEngine(0);
+
+ /* Disable Overlay, if a former application left it on */
+ ulReg = PEEK32(VIDEO_DISPLAY_CTRL);
+ ulReg = FIELD_SET(ulReg, VIDEO_DISPLAY_CTRL, PLANE, DISABLE);
+ POKE32(VIDEO_DISPLAY_CTRL, ulReg);
+
+ /* Disable video alpha, if a former application left it on */
+ ulReg = PEEK32(VIDEO_ALPHA_DISPLAY_CTRL);
+ ulReg = FIELD_SET(ulReg, VIDEO_ALPHA_DISPLAY_CTRL, PLANE, DISABLE);
+ POKE32(VIDEO_ALPHA_DISPLAY_CTRL, ulReg);
+
+ /* Disable alpha plane, if a former application left it on */
+ ulReg = PEEK32(ALPHA_DISPLAY_CTRL);
+ ulReg = FIELD_SET(ulReg, ALPHA_DISPLAY_CTRL, PLANE, DISABLE);
+ POKE32(ALPHA_DISPLAY_CTRL, ulReg);
+
+#if 0
+ /* Disable LCD hardware cursor, if a former application left it on */
+ ulReg = PEEK32(PANEL_HWC_ADDRESS);
+ ulReg = FIELD_SET(ulReg, PANEL_HWC_ADDRESS, ENABLE, DISABLE);
+ POKE32(PANEL_HWC_ADDRESS, ulReg);
+
+ /* Disable CRT hardware cursor, if a former application left it on */
+ ulReg = PEEK32(CRT_HWC_ADDRESS);
+ ulReg = FIELD_SET(ulReg, CRT_HWC_ADDRESS, ENABLE, DISABLE);
+ POKE32(CRT_HWC_ADDRESS, ulReg);
+
+ /* Disable ZV Port 0, if a former application left it on */
+ ulReg = PEEK32(ZV0_CAPTURE_CTRL);
+ ulReg = FIELD_SET(ulReg, ZV0_CAPTURE_CTRL, CAP, DISABLE);
+ POKE32(ZV0_CAPTURE_CTRL, ulReg);
+
+ /* Disable ZV Port 1, if a former application left it on */
+ ulReg = PEEK32(ZV1_CAPTURE_CTRL);
+ ulReg = FIELD_SET(ulReg, ZV1_CAPTURE_CTRL, CAP, DISABLE);
+ POKE32(ZV1_CAPTURE_CTRL, ulReg);
+
+ /* Disable ZV Port Power, if a former application left it on */
+ enableZVPort(0);
+ /* Disable DMA Channel, if a former application left it on */
+ ulReg = PEEK32(DMA_ABORT_INTERRUPT);
+ ulReg = FIELD_SET(ulReg, DMA_ABORT_INTERRUPT, ABORT_1, ABORT);
+ POKE32(DMA_ABORT_INTERRUPT, ulReg);
+
+ /* Disable i2c */
+ enableI2C(0);
+#endif
+ /* Disable DMA Channel, if a former application left it on */
+ ulReg = PEEK32(DMA_ABORT_INTERRUPT);
+ ulReg = FIELD_SET(ulReg, DMA_ABORT_INTERRUPT, ABORT_1, ABORT);
+ POKE32(DMA_ABORT_INTERRUPT, ulReg);
+
+ /* Disable DMA Power, if a former application left it on */
+ enableDMA(0);
+ }
+
+ /* We can add more initialization as needed. */
+
+ return 0;
+}
+
+#if 0
+
+unsigned int absDiff(unsigned int a, unsigned int b)
+{
+ if ( a > b )
+ return(a - b);
+ else
+ return(b - a);
+}
+
+#endif
+/*
+ monk liu @ 4/6/2011:
+ re-write the calculatePLL function of ddk750.
+ the original version function does not use some mathematics tricks and shortcut
+ when it doing the calculation of the best N,M,D combination
+ I think this version gives a little upgrade in speed
+
+ 750 pll clock formular:
+ Request Clock = (Input Clock * M )/(N * X)
+
+ Input Clock = 14318181 hz
+ X = 2 power D
+ D ={0,1,2,3,4,5,6}
+ M = {1,...,255}
+ N = {2,...,15}
+*/
+unsigned int calcPllValue(unsigned int request_orig,pll_value_t *pll)
+{
+ /* used for primary and secondary channel pixel clock pll */
+ static pllcalparam xparm_PIXEL[] = {
+ /* 2^0 = 1*/ {0,0,0,1},
+ /* 2^ 1 =2*/ {1,0,1,2},
+ /* 2^ 2 = 4*/ {2,0,2,4},
+ {3,0,3,8},
+ {4,1,3,16},
+ {5,2,3,32},
+ /* 2^6 = 64 */ {6,3,3,64},
+ };
+
+ /* used for MXCLK (chip clock) */
+ static pllcalparam xparm_MXCLK[] = {
+ /* 2^0 = 1*/ {0,0,0,1},
+ /* 2^ 1 =2*/ {1,0,1,2},
+ /* 2^ 2 = 4*/ {2,0,2,4},
+ {3,0,3,8},
+ };
+
+ /* as sm750 register definition, N located in 2,15 and M located in 1,255 */
+ int N,M,X,d;
+ int xcnt;
+ int miniDiff;
+ unsigned int RN,quo,rem,fl_quo;
+ unsigned int input,request;
+ unsigned int tmpClock,ret;
+ pllcalparam * xparm;
+
+#if 1
+ if (getChipType() == SM750LE)
+ {
+ /* SM750LE don't have prgrammable PLL and M/N values to work on.
+ Just return the requested clock. */
+ return request_orig;
+ }
+#endif
+
+ ret = 0;
+ miniDiff = ~0;
+ request = request_orig / 1000;
+ input = pll->inputFreq / 1000;
+
+ /* for MXCLK register , no POD provided, so need be treated differently */
+
+ if(pll->clockType != MXCLK_PLL){
+ xparm = &xparm_PIXEL[0];
+ xcnt = sizeof(xparm_PIXEL)/sizeof(xparm_PIXEL[0]);
+ }else{
+ xparm = &xparm_MXCLK[0];
+ xcnt = sizeof(xparm_MXCLK)/sizeof(xparm_MXCLK[0]);
+ }
+
+
+ for(N = 15;N>1;N--)
+ {
+ /* RN will not exceed maximum long if @request <= 285 MHZ (for 32bit cpu) */
+ RN = N * request;
+ quo = RN / input;
+ rem = RN % input;/* rem always small than 14318181 */
+ fl_quo = (rem * 10000 /input);
+
+ for(d = xcnt - 1;d >= 0;d--){
+ X = xparm[d].value;
+ M = quo*X;
+ M += fl_quo * X / 10000;
+ /* round step */
+ M += (fl_quo*X % 10000)>5000?1:0;
+ if(M < 256 && M > 0)
+ {
+ unsigned int diff;
+ tmpClock = pll->inputFreq *M / N / X;
+ diff = absDiff(tmpClock,request_orig);
+ if(diff < miniDiff)
+ {
+ pll->M = M;
+ pll->N = N;
+ pll->OD = xparm[d].od;
+ pll->POD = xparm[d].pod;
+ miniDiff = diff;
+ ret = tmpClock;
+ }
+ }
+ }
+ }
+
+ //printk("Finally: pll->n[%lu],m[%lu],od[%lu],pod[%lu]\n",pll->N,pll->M,pll->OD,pll->POD);
+ return ret;
+}
+
+unsigned int calcPllValue2(
+unsigned int ulRequestClk, /* Required pixel clock in Hz unit */
+pll_value_t *pPLL /* Structure to hold the value to be set in PLL */
+)
+{
+ unsigned int M, N, OD, POD = 0, diff, pllClk, odPower, podPower;
+ unsigned int bestDiff = 0xffffffff; /* biggest 32 bit unsigned number */
+ unsigned int ret;
+ /* Init PLL structure to know states */
+ pPLL->M = 0;
+ pPLL->N = 0;
+ pPLL->OD = 0;
+ pPLL->POD = 0;
+
+ /* Sanity check: None at the moment */
+
+ /* Convert everything in Khz range in order to avoid calculation overflow */
+ pPLL->inputFreq /= 1000;
+ ulRequestClk /= 1000;
+
+#ifndef VALIDATION_CHIP
+ /* The maximum of post divider is 8. */
+ for (POD=0; POD<=3; POD++)
+#endif
+ {
+
+#ifndef VALIDATION_CHIP
+ /* MXCLK_PLL does not have post divider. */
+ if ((POD > 0) && (pPLL->clockType == MXCLK_PLL))
+ break;
+#endif
+
+ /* Work out 2 to the power of POD */
+ podPower = twoToPowerOfx(POD);
+
+ /* OD has only 2 bits [15:14] and its value must between 0 to 3 */
+ for (OD=0; OD<=3; OD++)
+ {
+ /* Work out 2 to the power of OD */
+ odPower = twoToPowerOfx(OD);
+
+#ifdef VALIDATION_CHIP
+ if (odPower > 4)
+ podPower = 4;
+ else
+ podPower = odPower;
+#endif
+
+ /* N has 4 bits [11:8] and its value must between 2 and 15.
+ The N == 1 will behave differently --> Result is not correct. */
+ for (N=2; N<=15; N++)
+ {
+ /* The formula for PLL is ulRequestClk = inputFreq * M / N / (2^OD)
+ In the following steps, we try to work out a best M value given the others are known.
+ To avoid decimal calculation, we use 1000 as multiplier for up to 3 decimal places of accuracy.
+ */
+ M = ulRequestClk * N * odPower * 1000 / pPLL->inputFreq;
+ M = roundedDiv(M, 1000);
+
+ /* M field has only 8 bits, reject value bigger than 8 bits */
+ if (M < 256)
+ {
+ /* Calculate the actual clock for a given M & N */
+ pllClk = pPLL->inputFreq * M / N / odPower / podPower;
+
+ /* How much are we different from the requirement */
+ diff = absDiff(pllClk, ulRequestClk);
+
+ if (diff < bestDiff)
+ {
+ bestDiff = diff;
+
+ /* Store M and N values */
+ pPLL->M = M;
+ pPLL->N = N;
+ pPLL->OD = OD;
+
+#ifdef VALIDATION_CHIP
+ if (OD > 2)
+ POD = 2;
+ else
+ POD = OD;
+#endif
+
+ pPLL->POD = POD;
+ }
+ }
+ }
+ }
+ }
+
+ /* Restore input frequency from Khz to hz unit */
+// pPLL->inputFreq *= 1000;
+ ulRequestClk *= 1000;
+ pPLL->inputFreq = DEFAULT_INPUT_CLOCK; /* Default reference clock */
+
+ /* Output debug information */
+ //DDKDEBUGPRINT((DISPLAY_LEVEL, "calcPllValue: Requested Frequency = %d\n", ulRequestClk));
+ //DDKDEBUGPRINT((DISPLAY_LEVEL, "calcPllValue: Input CLK = %dHz, M=%d, N=%d, OD=%d, POD=%d\n", pPLL->inputFreq, pPLL->M, pPLL->N, pPLL->OD, pPLL->POD));
+
+ /* Return actual frequency that the PLL can set */
+ ret = calcPLL(pPLL);
+ return ret;
+}
+
+
+
+
+
+unsigned int formatPllReg(pll_value_t *pPLL)
+{
+ unsigned int ulPllReg = 0;
+
+ /* Note that all PLL's have the same format. Here, we just use Panel PLL parameter
+ to work out the bit fields in the register.
+ On returning a 32 bit number, the value can be applied to any PLL in the calling function.
+ */
+ ulPllReg =
+ FIELD_SET( 0, PANEL_PLL_CTRL, BYPASS, OFF)
+ | FIELD_SET( 0, PANEL_PLL_CTRL, POWER, ON)
+ | FIELD_SET( 0, PANEL_PLL_CTRL, INPUT, OSC)
+#ifndef VALIDATION_CHIP
+ | FIELD_VALUE(0, PANEL_PLL_CTRL, POD, pPLL->POD)
+#endif
+ | FIELD_VALUE(0, PANEL_PLL_CTRL, OD, pPLL->OD)
+ | FIELD_VALUE(0, PANEL_PLL_CTRL, N, pPLL->N)
+ | FIELD_VALUE(0, PANEL_PLL_CTRL, M, pPLL->M);
+
+ return(ulPllReg);
+}
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_chip.h b/drivers/video/lynxfb/ddk750/ddk750_chip.h
new file mode 100644
index 0000000..1762359
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_chip.h
@@ -0,0 +1,83 @@
+#ifndef DDK750_CHIP_H__
+#define DDK750_CHIP_H__
+#define DEFAULT_INPUT_CLOCK 14318181 /* Default reference clock */
+#define SM750LE_REVISION_ID (char)0xfe
+
+/* This is all the chips recognized by this library */
+typedef enum _logical_chip_type_t
+{
+ SM_UNKNOWN,
+ SM718,
+ SM750,
+ SM750LE,
+}
+logical_chip_type_t;
+
+
+typedef enum _clock_type_t
+{
+ MXCLK_PLL,
+ PRIMARY_PLL,
+ SECONDARY_PLL,
+ VGA0_PLL,
+ VGA1_PLL,
+}
+clock_type_t;
+
+typedef struct _pll_value_t
+{
+ clock_type_t clockType;
+ unsigned long inputFreq; /* Input clock frequency to the PLL */
+
+ /* Use this when clockType = PANEL_PLL */
+ unsigned long M;
+ unsigned long N;
+ unsigned long OD;
+ unsigned long POD;
+}
+pll_value_t;
+
+/* input struct to initChipParam() function */
+typedef struct _initchip_param_t
+{
+ unsigned short powerMode; /* Use power mode 0 or 1 */
+ unsigned short chipClock; /* Speed of main chip clock in MHz unit
+ 0 = keep the current clock setting
+ Others = the new main chip clock
+ */
+ unsigned short memClock; /* Speed of memory clock in MHz unit
+ 0 = keep the current clock setting
+ Others = the new memory clock
+ */
+ unsigned short masterClock; /* Speed of master clock in MHz unit
+ 0 = keep the current clock setting
+ Others = the new master clock
+ */
+ unsigned short setAllEngOff; /* 0 = leave all engine state untouched.
+ 1 = make sure they are off: 2D, Overlay,
+ video alpha, alpha, hardware cursors
+ */
+ unsigned char resetMemory; /* 0 = Do not reset the memory controller
+ 1 = Reset the memory controller
+ */
+
+ /* More initialization parameter can be added if needed */
+}
+initchip_param_t;
+
+
+logical_chip_type_t getChipType(void);
+unsigned int calcPllValue(unsigned int request,pll_value_t *pll);
+unsigned int calcPllValue2(unsigned int,pll_value_t *);
+unsigned int formatPllReg(pll_value_t *pPLL);
+void ddk750_set_mmio(volatile unsigned char *,unsigned short,char);
+unsigned int ddk750_getVMSize(void);
+int ddk750_initHw(initchip_param_t *);
+unsigned int getPllValue(clock_type_t clockType, pll_value_t *pPLL);
+unsigned int getChipClock(void);
+void setChipClock(unsigned int);
+void setMemoryClock(unsigned int frequency);
+void setMasterClock(unsigned int frequency);
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_display.c b/drivers/video/lynxfb/ddk750/ddk750_display.c
new file mode 100644
index 0000000..caf5bce
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_display.c
@@ -0,0 +1,318 @@
+#include "ddk750_reg.h"
+#include "ddk750_help.h"
+#include "ddk750_display.h"
+#include "ddk750_power.h"
+#include "ddk750_dvi.h"
+
+#define primaryWaitVerticalSync(delay) waitNextVerticalSync(0,delay)
+
+static void setDisplayControl(int ctrl,int dispState)
+{
+ /* state != 0 means turn on both timing & plane en_bit */
+ unsigned long ulDisplayCtrlReg, ulReservedBits;
+ int cnt;
+
+ cnt = 0;
+
+ /* Set the primary display control */
+ if (!ctrl)
+ {
+ ulDisplayCtrlReg = PEEK32(PANEL_DISPLAY_CTRL);
+ /* Turn on/off the Panel display control */
+ if (dispState)
+ {
+ /* Timing should be enabled first before enabling the plane
+ * because changing at the same time does not guarantee that
+ * the plane will also enabled or disabled.
+ */
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ PANEL_DISPLAY_CTRL, TIMING, ENABLE);
+ POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
+
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ PANEL_DISPLAY_CTRL, PLANE, ENABLE);
+
+ /* Added some masks to mask out the reserved bits.
+ * Sometimes, the reserved bits are set/reset randomly when
+ * writing to the PRIMARY_DISPLAY_CTRL, therefore, the register
+ * reserved bits are needed to be masked out.
+ */
+ ulReservedBits = FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_1_MASK, ENABLE) |
+ FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_2_MASK, ENABLE) |
+ FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_3_MASK, ENABLE);
+
+ /* Somehow the register value on the plane is not set
+ * until a few delay. Need to write
+ * and read it a couple times
+ */
+ do
+ {
+ cnt++;
+ POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
+ } while((PEEK32(PANEL_DISPLAY_CTRL) & ~ulReservedBits) !=
+ (ulDisplayCtrlReg & ~ulReservedBits));
+ printk("Set Panel Plane enbit:after tried %d times\n",cnt);
+ }
+ else
+ {
+ /* When turning off, there is no rule on the programming
+ * sequence since whenever the clock is off, then it does not
+ * matter whether the plane is enabled or disabled.
+ * Note: Modifying the plane bit will take effect on the
+ * next vertical sync. Need to find out if it is necessary to
+ * wait for 1 vsync before modifying the timing enable bit.
+ * */
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ PANEL_DISPLAY_CTRL, PLANE, DISABLE);
+ POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
+
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ PANEL_DISPLAY_CTRL, TIMING, DISABLE);
+ POKE32(PANEL_DISPLAY_CTRL, ulDisplayCtrlReg);
+ }
+
+ }
+ /* Set the secondary display control */
+ else
+ {
+ ulDisplayCtrlReg = PEEK32(CRT_DISPLAY_CTRL);
+
+ if (dispState)
+ {
+ /* Timing should be enabled first before enabling the plane because changing at the
+ same time does not guarantee that the plane will also enabled or disabled.
+ */
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ CRT_DISPLAY_CTRL, TIMING, ENABLE);
+ POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
+
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ CRT_DISPLAY_CTRL, PLANE, ENABLE);
+
+ /* Added some masks to mask out the reserved bits.
+ * Sometimes, the reserved bits are set/reset randomly when
+ * writing to the PRIMARY_DISPLAY_CTRL, therefore, the register
+ * reserved bits are needed to be masked out.
+ */
+
+ ulReservedBits = FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_1_MASK, ENABLE) |
+ FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_2_MASK, ENABLE) |
+ FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_3_MASK, ENABLE) |
+ FIELD_SET(0, CRT_DISPLAY_CTRL, RESERVED_4_MASK, ENABLE);
+
+ do
+ {
+ cnt++;
+ POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
+ } while((PEEK32(CRT_DISPLAY_CTRL) & ~ulReservedBits) !=
+ (ulDisplayCtrlReg & ~ulReservedBits));
+ printk("Set Crt Plane enbit:after tried %d times\n",cnt);
+ }
+ else
+ {
+ /* When turning off, there is no rule on the programming
+ * sequence since whenever the clock is off, then it does not
+ * matter whether the plane is enabled or disabled.
+ * Note: Modifying the plane bit will take effect on the next
+ * vertical sync. Need to find out if it is necessary to
+ * wait for 1 vsync before modifying the timing enable bit.
+ */
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ CRT_DISPLAY_CTRL, PLANE, DISABLE);
+ POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
+
+ ulDisplayCtrlReg = FIELD_SET(ulDisplayCtrlReg,
+ CRT_DISPLAY_CTRL, TIMING, DISABLE);
+ POKE32(CRT_DISPLAY_CTRL, ulDisplayCtrlReg);
+ }
+ }
+}
+
+
+static void waitNextVerticalSync(int ctrl,int delay)
+{
+ unsigned int status;
+ if(!ctrl){
+ /* primary controller */
+
+ /* Do not wait when the Primary PLL is off or display control is already off.
+ This will prevent the software to wait forever. */
+ if ((FIELD_GET(PEEK32(PANEL_PLL_CTRL), PANEL_PLL_CTRL, POWER) ==
+ PANEL_PLL_CTRL_POWER_OFF) ||
+ (FIELD_GET(PEEK32(PANEL_DISPLAY_CTRL), PANEL_DISPLAY_CTRL, TIMING) ==
+ PANEL_DISPLAY_CTRL_TIMING_DISABLE))
+ {
+ return;
+ }
+
+ while (delay-- > 0)
+ {
+ /* Wait for end of vsync. */
+ do
+ {
+ status = FIELD_GET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ PANEL_VSYNC);
+ }
+ while (status == SYSTEM_CTRL_PANEL_VSYNC_ACTIVE);
+
+ /* Wait for start of vsync. */
+ do
+ {
+ status = FIELD_GET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ PANEL_VSYNC);
+ }
+ while (status == SYSTEM_CTRL_PANEL_VSYNC_INACTIVE);
+ }
+
+ }else{
+
+ /* Do not wait when the Primary PLL is off or display control is already off.
+ This will prevent the software to wait forever. */
+ if ((FIELD_GET(PEEK32(CRT_PLL_CTRL), CRT_PLL_CTRL, POWER) ==
+ CRT_PLL_CTRL_POWER_OFF) ||
+ (FIELD_GET(PEEK32(CRT_DISPLAY_CTRL), CRT_DISPLAY_CTRL, TIMING) ==
+ CRT_DISPLAY_CTRL_TIMING_DISABLE))
+ {
+ return;
+ }
+
+ while (delay-- > 0)
+ {
+ /* Wait for end of vsync. */
+ do
+ {
+ status = FIELD_GET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ CRT_VSYNC);
+ }
+ while (status == SYSTEM_CTRL_CRT_VSYNC_ACTIVE);
+
+ /* Wait for start of vsync. */
+ do
+ {
+ status = FIELD_GET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ CRT_VSYNC);
+ }
+ while (status == SYSTEM_CTRL_CRT_VSYNC_INACTIVE);
+ }
+ }
+}
+
+static void swPanelPowerSequence_sm750le(int disp,int delay)
+{
+ unsigned int reg;
+ reg = PEEK32(DISPLAY_CONTROL_750LE);
+ if(disp)
+ reg |= 0xf;
+ else
+ reg &= ~0xf;
+ POKE32(DISPLAY_CONTROL_750LE,reg);
+}
+
+static void swPanelPowerSequence(int disp,int delay)
+{
+ unsigned int reg;
+
+ /* disp should be 1 to open sequence */
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,FPEN,disp);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ primaryWaitVerticalSync(delay);
+
+
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,DATA,disp);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ primaryWaitVerticalSync(delay);
+
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,VBIASEN,disp);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ primaryWaitVerticalSync(delay);
+
+
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,FPEN,disp);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ primaryWaitVerticalSync(delay);
+
+}
+
+void ddk750_setLogicalDispOut(disp_output_t output)
+{
+ unsigned int reg;
+ if(output & PNL_2_USAGE){
+ /* set panel path controller select */
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,SELECT,(output & PNL_2_MASK)>>PNL_2_OFFSET);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ }
+
+ if(output & CRT_2_USAGE){
+ /* set crt path controller select */
+ reg = PEEK32(CRT_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,CRT_DISPLAY_CTRL,SELECT,(output & CRT_2_MASK)>>CRT_2_OFFSET);
+ /*se blank off */
+ reg = FIELD_SET(reg,CRT_DISPLAY_CTRL,BLANK,OFF);
+ POKE32(CRT_DISPLAY_CTRL,reg);
+
+ }
+
+ if(output & PRI_TP_USAGE){
+ /* set primary timing and plane en_bit */
+ setDisplayControl(0,(output&PRI_TP_MASK)>>PRI_TP_OFFSET);
+ }
+
+ if(output & SEC_TP_USAGE){
+ /* set secondary timing and plane en_bit*/
+ setDisplayControl(1,(output&SEC_TP_MASK)>>SEC_TP_OFFSET);
+ }
+
+ if(output & PNL_SEQ_USAGE){
+ /* set panel sequence */
+ swPanelPowerSequence((output&PNL_SEQ_MASK)>>PNL_SEQ_OFFSET,4);
+ }
+
+ if(output & DAC_USAGE)
+ setDAC((output & DAC_MASK)>>DAC_OFFSET);
+
+ if(output & DPMS_USAGE)
+ ddk750_setDPMS((output & DPMS_MASK) >> DPMS_OFFSET);
+}
+
+
+int ddk750_initDVIDisp()
+{
+ /* Initialize DVI. If the dviInit fail and the VendorID or the DeviceID are
+ not zeroed, then set the failure flag. If it is zeroe, it might mean
+ that the system is in Dual CRT Monitor configuration. */
+
+ /* De-skew enabled with default 111b value.
+ This will fix some artifacts problem in some mode on board 2.2.
+ Somehow this fix does not affect board 2.1.
+ */
+ if ((dviInit(1, /* Select Rising Edge */
+ 1, /* Select 24-bit bus */
+ 0, /* Select Single Edge clock */
+ 1, /* Enable HSync as is */
+ 1, /* Enable VSync as is */
+ 1, /* Enable De-skew */
+ 7, /* Set the de-skew setting to maximum setup */
+ 1, /* Enable continuous Sync */
+ 1, /* Enable PLL Filter */
+ 4 /* Use the recommended value for PLL Filter value */
+ ) != 0) && (dviGetVendorID() != 0x0000) && (dviGetDeviceID() != 0x0000))
+ {
+ return (-1);
+ }
+
+ /* TODO: Initialize other display component */
+
+ /* Success */
+ return 0;
+
+}
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_display.h b/drivers/video/lynxfb/ddk750/ddk750_display.h
new file mode 100644
index 0000000..91a138d
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_display.h
@@ -0,0 +1,160 @@
+#ifndef DDK750_DISPLAY_H__
+#define DDK750_DISPLAY_H__
+
+/* panel path select
+ 80000[29:28]
+*/
+
+#define PNL_2_OFFSET 0
+#define PNL_2_MASK (3 << PNL_2_OFFSET)
+#define PNL_2_USAGE (PNL_2_MASK << 16)
+#define PNL_2_PRI ((0 << PNL_2_OFFSET)|PNL_2_USAGE)
+#define PNL_2_SEC ((2 << PNL_2_OFFSET)|PNL_2_USAGE)
+
+
+/* primary timing & plane enable bit
+ 1: 80000[8] & 80000[2] on
+ 0: both off
+*/
+#define PRI_TP_OFFSET 4
+#define PRI_TP_MASK (1 << PRI_TP_OFFSET)
+#define PRI_TP_USAGE (PRI_TP_MASK << 16)
+#define PRI_TP_ON ((0x1 << PRI_TP_OFFSET)|PRI_TP_USAGE)
+#define PRI_TP_OFF ((0x0 << PRI_TP_OFFSET)|PRI_TP_USAGE)
+
+
+/* panel sequency status
+ 80000[27:24]
+*/
+#define PNL_SEQ_OFFSET 6
+#define PNL_SEQ_MASK (1 << PNL_SEQ_OFFSET)
+#define PNL_SEQ_USAGE (PNL_SEQ_MASK << 16)
+#define PNL_SEQ_ON ((1 << PNL_SEQ_OFFSET)|PNL_SEQ_USAGE)
+#define PNL_SEQ_OFF ((0 << PNL_SEQ_OFFSET)|PNL_SEQ_USAGE)
+
+/* dual digital output
+ 80000[19]
+*/
+#define DUAL_TFT_OFFSET 8
+#define DUAL_TFT_MASK (1 << DUAL_TFT_OFFSET)
+#define DUAL_TFT_USAGE (DUAL_TFT_MASK << 16)
+#define DUAL_TFT_ON ((1 << DUAL_TFT_OFFSET)|DUAL_TFT_USAGE)
+#define DUAL_TFT_OFF ((0 << DUAL_TFT_OFFSET)|DUAL_TFT_USAGE)
+
+/* secondary timing & plane enable bit
+ 1:80200[8] & 80200[2] on
+ 0: both off
+*/
+#define SEC_TP_OFFSET 5
+#define SEC_TP_MASK (1<< SEC_TP_OFFSET)
+#define SEC_TP_USAGE (SEC_TP_MASK << 16)
+#define SEC_TP_ON ((0x1 << SEC_TP_OFFSET)|SEC_TP_USAGE)
+#define SEC_TP_OFF ((0x0 << SEC_TP_OFFSET)|SEC_TP_USAGE)
+
+/* crt path select
+ 80200[19:18]
+*/
+#define CRT_2_OFFSET 2
+#define CRT_2_MASK (3 << CRT_2_OFFSET)
+#define CRT_2_USAGE (CRT_2_MASK << 16)
+#define CRT_2_PRI ((0x0 << CRT_2_OFFSET)|CRT_2_USAGE)
+#define CRT_2_SEC ((0x2 << CRT_2_OFFSET)|CRT_2_USAGE)
+
+
+/* DAC affect both DVI and DSUB
+ 4[20]
+*/
+#define DAC_OFFSET 7
+#define DAC_MASK (1 << DAC_OFFSET)
+#define DAC_USAGE (DAC_MASK << 16)
+#define DAC_ON ((0x0<< DAC_OFFSET)|DAC_USAGE)
+#define DAC_OFF ((0x1 << DAC_OFFSET)|DAC_USAGE)
+
+/* DPMS only affect D-SUB head
+ 0[31:30]
+*/
+#define DPMS_OFFSET 9
+#define DPMS_MASK (3 << DPMS_OFFSET)
+#define DPMS_USAGE (DPMS_MASK << 16)
+#define DPMS_OFF ((3 << DPMS_OFFSET)|DPMS_USAGE)
+#define DPMS_ON ((0 << DPMS_OFFSET)|DPMS_USAGE)
+
+
+
+/*
+ LCD1 means panel path TFT1 & panel path DVI (so enable DAC)
+ CRT means crt path DSUB
+*/
+#if 0
+typedef enum _disp_output_t
+{
+ NO_DISPLAY = DPMS_OFF,
+
+ LCD1_PRI = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|DPMS_OFF|DAC_ON,
+ LCD1_SEC = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|DPMS_OFF|DAC_ON,
+
+ LCD2_PRI = CRT_2_PRI|PRI_TP_ON|DUAL_TFT_ON|DPMS_OFF,
+ LCD2_SEC = CRT_2_SEC|SEC_TP_ON|DUAL_TFT_ON|DPMS_OFF,
+
+ DSUB_PRI = CRT_2_PRI|PRI_TP_ON|DAC_ON,
+ DSUB_SEC = CRT_2_SEC|SEC_TP_ON|DAC_ON,
+
+ LCD1_DSUB_PRI = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|
+ CRT_2_PRI|SEC_TP_OFF|DAC_ON,
+
+ LCD1_DSUB_SEC = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|
+ CRT_2_SEC|PRI_TP_OFF|DAC_ON,
+
+ /* LCD1 show primary and DSUB show secondary */
+ LCD1_DSUB_DUAL = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|
+ CRT_2_SEC|SEC_TP_ON|DAC_ON,
+
+ /* LCD1 show secondary and DSUB show primary */
+ LCD1_DSUB_DUAL_SWAP = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|
+ CRT_2_PRI|PRI_TP_ON|DAC_ON,
+
+ LCD1_LCD2_PRI = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|
+ CRT_2_PRI|SEC_TP_OFF|DPMS_OFF|DUAL_TFT_ON,
+
+ LCD1_LCD2_SEC = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|
+ CRT_2_SEC|PRI_TP_OFF|DPMS_OFF|DUAL_TFT_ON,
+
+ LCD1_LCD2_DSUB_PRI = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|DAC_ON|
+ CRT_2_PRI|SEC_TP_OFF|DPMS_ON|DUAL_TFT_ON,
+
+ LCD1_LCD2_DSUB_SEC = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|DAC_ON|
+ CRT_2_SEC|PRI_TP_OFF|DPMS_ON|DUAL_TFT_ON,
+
+
+}
+disp_output_t;
+#else
+typedef enum _disp_output_t{
+ do_LCD1_PRI = PNL_2_PRI|PRI_TP_ON|PNL_SEQ_ON|DAC_ON,
+ do_LCD1_SEC = PNL_2_SEC|SEC_TP_ON|PNL_SEQ_ON|DAC_ON,
+#if 0
+ do_LCD2_PRI = CRT_2_PRI|PRI_TP_ON,
+ do_LCD2_SEC = CRT_2_SEC|SEC_TP_ON,
+#else
+ do_LCD2_PRI = CRT_2_PRI|PRI_TP_ON|DUAL_TFT_ON,
+ do_LCD2_SEC = CRT_2_SEC|SEC_TP_ON|DUAL_TFT_ON,
+#endif
+ /*
+ do_DSUB_PRI = CRT_2_PRI|PRI_TP_ON|DPMS_ON|DAC_ON,
+ do_DSUB_SEC = CRT_2_SEC|SEC_TP_ON|DPMS_ON|DAC_ON,
+ */
+#if 0
+ do_CRT_PRI = CRT_2_PRI|PRI_TP_ON,
+ do_CRT_SEC = CRT_2_SEC|SEC_TP_ON,
+#else
+ do_CRT_PRI = CRT_2_PRI|PRI_TP_ON|DPMS_ON|DAC_ON,
+ do_CRT_SEC = CRT_2_SEC|SEC_TP_ON|DPMS_ON|DAC_ON,
+#endif
+}
+disp_output_t;
+#endif
+
+void ddk750_setLogicalDispOut(disp_output_t);
+int ddk750_initDVIDisp(void);
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_dvi.c b/drivers/video/lynxfb/ddk750/ddk750_dvi.c
new file mode 100644
index 0000000..5f2b89a
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_dvi.c
@@ -0,0 +1,98 @@
+#ifdef USE_DVICHIP
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_dvi.h"
+#include "ddk750_sii164.h"
+
+
+/* This global variable contains all the supported driver and its corresponding
+ function API. Please set the function pointer to NULL whenever the function
+ is not supported. */
+static dvi_ctrl_device_t g_dcftSupportedDviController[] =
+{
+#ifdef DVI_CTRL_SII164
+ {
+ .pfnInit = sii164InitChip,
+ .pfnGetVendorId = sii164GetVendorID,
+ .pfnGetDeviceId = sii164GetDeviceID,
+#ifdef SII164_FULL_FUNCTIONS
+ .pfnResetChip = sii164ResetChip,
+ .pfnGetChipString = sii164GetChipString,
+ .pfnSetPower = sii164SetPower,
+ .pfnEnableHotPlugDetection = sii164EnableHotPlugDetection,
+ .pfnIsConnected = sii164IsConnected,
+ .pfnCheckInterrupt = sii164CheckInterrupt,
+ .pfnClearInterrupt = sii164ClearInterrupt,
+#endif
+ },
+#endif
+};
+
+
+int dviInit(
+ unsigned char edgeSelect,
+ unsigned char busSelect,
+ unsigned char dualEdgeClkSelect,
+ unsigned char hsyncEnable,
+ unsigned char vsyncEnable,
+ unsigned char deskewEnable,
+ unsigned char deskewSetting,
+ unsigned char continuousSyncEnable,
+ unsigned char pllFilterEnable,
+ unsigned char pllFilterValue
+ )
+{
+ dvi_ctrl_device_t *pCurrentDviCtrl;
+ pCurrentDviCtrl = g_dcftSupportedDviController;
+ if(pCurrentDviCtrl->pfnInit != NULL)
+ {
+ return pCurrentDviCtrl->pfnInit(edgeSelect, busSelect, dualEdgeClkSelect, hsyncEnable,
+ vsyncEnable, deskewEnable, deskewSetting, continuousSyncEnable,
+ pllFilterEnable, pllFilterValue);
+ }
+ return -1;//error
+}
+
+
+/*
+ * dviGetVendorID
+ * This function gets the vendor ID of the DVI controller chip.
+ *
+ * Output:
+ * Vendor ID
+ */
+unsigned short dviGetVendorID()
+{
+ dvi_ctrl_device_t *pCurrentDviCtrl;
+
+ //pCurrentDviCtrl = getDviCtrl();
+ pCurrentDviCtrl = g_dcftSupportedDviController;
+ if (pCurrentDviCtrl != (dvi_ctrl_device_t *)0)
+ return pCurrentDviCtrl->pfnGetVendorId();
+
+ return 0x0000;
+}
+
+
+/*
+ * dviGetDeviceID
+ * This function gets the device ID of the DVI controller chip.
+ *
+ * Output:
+ * Device ID
+ */
+unsigned short dviGetDeviceID()
+{
+ dvi_ctrl_device_t *pCurrentDviCtrl;
+
+// pCurrentDviCtrl = getDviCtrl();
+ pCurrentDviCtrl = g_dcftSupportedDviController;
+ if (pCurrentDviCtrl != (dvi_ctrl_device_t *)0)
+ return pCurrentDviCtrl->pfnGetDeviceId();
+
+ return 0x0000;
+}
+
+#endif
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_dvi.h b/drivers/video/lynxfb/ddk750/ddk750_dvi.h
new file mode 100644
index 0000000..50bcec2
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_dvi.h
@@ -0,0 +1,67 @@
+#ifndef DDK750_DVI_H__
+#define DDK750_DVI_H__
+
+/* dvi chip stuffs structros */
+
+typedef long (*PFN_DVICTRL_INIT)(
+ unsigned char edgeSelect,
+ unsigned char busSelect,
+ unsigned char dualEdgeClkSelect,
+ unsigned char hsyncEnable,
+ unsigned char vsyncEnable,
+ unsigned char deskewEnable,
+ unsigned char deskewSetting,
+ unsigned char continuousSyncEnable,
+ unsigned char pllFilterEnable,
+ unsigned char pllFilterValue);
+typedef void (*PFN_DVICTRL_RESETCHIP)(void);
+typedef char* (*PFN_DVICTRL_GETCHIPSTRING)(void);
+typedef unsigned short (*PFN_DVICTRL_GETVENDORID)(void);
+typedef unsigned short (*PFN_DVICTRL_GETDEVICEID)(void);
+typedef void (*PFN_DVICTRL_SETPOWER)(unsigned char powerUp);
+typedef void (*PFN_DVICTRL_HOTPLUGDETECTION)(unsigned char enableHotPlug);
+typedef unsigned char (*PFN_DVICTRL_ISCONNECTED)(void);
+typedef unsigned char (*PFN_DVICTRL_CHECKINTERRUPT)(void);
+typedef void (*PFN_DVICTRL_CLEARINTERRUPT)(void);
+
+
+
+/* Structure to hold all the function pointer to the DVI Controller. */
+typedef struct _dvi_ctrl_device_t
+{
+ PFN_DVICTRL_INIT pfnInit;
+ PFN_DVICTRL_RESETCHIP pfnResetChip;
+ PFN_DVICTRL_GETCHIPSTRING pfnGetChipString;
+ PFN_DVICTRL_GETVENDORID pfnGetVendorId;
+ PFN_DVICTRL_GETDEVICEID pfnGetDeviceId;
+ PFN_DVICTRL_SETPOWER pfnSetPower;
+ PFN_DVICTRL_HOTPLUGDETECTION pfnEnableHotPlugDetection;
+ PFN_DVICTRL_ISCONNECTED pfnIsConnected;
+ PFN_DVICTRL_CHECKINTERRUPT pfnCheckInterrupt;
+ PFN_DVICTRL_CLEARINTERRUPT pfnClearInterrupt;
+} dvi_ctrl_device_t;
+#define DVI_CTRL_SII164
+
+
+
+/* dvi functions prototype */
+int dviInit(
+ unsigned char edgeSelect,
+ unsigned char busSelect,
+ unsigned char dualEdgeClkSelect,
+ unsigned char hsyncEnable,
+ unsigned char vsyncEnable,
+ unsigned char deskewEnable,
+ unsigned char deskewSetting,
+ unsigned char continuousSyncEnable,
+ unsigned char pllFilterEnable,
+ unsigned char pllFilterValue
+);
+
+unsigned short dviGetVendorID(void);
+unsigned short dviGetDeviceID(void);
+
+
+
+#endif
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_help.c b/drivers/video/lynxfb/ddk750/ddk750_help.c
new file mode 100644
index 0000000..cc00d2b
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_help.c
@@ -0,0 +1,19 @@
+//#include "ddk750_reg.h"
+//#include "ddk750_chip.h"
+#include "ddk750_help.h"
+
+volatile unsigned char __iomem * mmio750 = NULL;
+char revId750 = 0;
+unsigned short devId750 = 0;
+
+/* after driver mapped io registers, use this function first */
+void ddk750_set_mmio(volatile unsigned char * addr,unsigned short devId,char revId)
+{
+ mmio750 = addr;
+ devId750 = devId;
+ revId750 = revId;
+ if(revId == 0xfe)
+ printk("found sm750le\n");
+}
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_help.h b/drivers/video/lynxfb/ddk750/ddk750_help.h
new file mode 100644
index 0000000..3aace5c
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_help.h
@@ -0,0 +1,29 @@
+#ifndef DDK750_HELP_H__
+#define DDK750_HELP_H__
+#include "ddk750_chip.h"
+#ifndef USE_INTERNAL_REGISTER_ACCESS
+
+#include <linux/ioport.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include "../lynx_help.h"
+
+
+#if 0
+/* if 718 big endian turned on,be aware that don't use this driver for general use,only for ppc big-endian */
+#warning "big endian on target cpu and enable nature big endian support of 718 capability !"
+#define PEEK32(addr) __raw_readl((void __iomem *)(mmio750)+(addr))
+#define POKE32(addr,data) __raw_writel((data),(void __iomem*)(mmio750)+(addr))
+#else /* software control endianess */
+#define PEEK32(addr) readl((addr)+mmio750)
+#define POKE32(addr,data) writel((data),(addr)+mmio750)
+#endif
+
+extern volatile unsigned char __iomem * mmio750;
+extern char revId750;
+extern unsigned short devId750;
+#else
+/* implement if you want use it*/
+#endif
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_hwi2c.c b/drivers/video/lynxfb/ddk750/ddk750_hwi2c.c
new file mode 100644
index 0000000..e10f9ea
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_hwi2c.c
@@ -0,0 +1,270 @@
+#ifdef USE_HW_I2C
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_hwi2c.h"
+#include "ddk750_power.h"
+
+#define MAX_HWI2C_FIFO 16
+#define HWI2C_WAIT_TIMEOUT 0xF0000
+
+
+int hwI2CInit(
+ unsigned char busSpeedMode
+)
+{
+ unsigned int value;
+
+ /* Enable GPIO 30 & 31 as IIC clock & data */
+ value = PEEK32(GPIO_MUX);
+
+ value = FIELD_SET(value, GPIO_MUX, 30, I2C) |
+ FIELD_SET(0, GPIO_MUX, 31, I2C);
+ POKE32(GPIO_MUX, value);
+
+ /* Enable Hardware I2C power.
+ TODO: Check if we need to enable GPIO power?
+ */
+ enableI2C(1);
+
+ /* Enable the I2C Controller and set the bus speed mode */
+ value = PEEK32(I2C_CTRL);
+ if (busSpeedMode == 0)
+ value = FIELD_SET(value, I2C_CTRL, MODE, STANDARD);
+ else
+ value = FIELD_SET(value, I2C_CTRL, MODE, FAST);
+ value = FIELD_SET(value, I2C_CTRL, EN, ENABLE);
+ POKE32(I2C_CTRL, value);
+
+ return 0;
+}
+
+
+void hwI2CClose(void)
+{
+ unsigned int value;
+
+ /* Disable I2C controller */
+ value = PEEK32(I2C_CTRL);
+ value = FIELD_SET(value, I2C_CTRL, EN, DISABLE);
+ POKE32(I2C_CTRL, value);
+
+ /* Disable I2C Power */
+ enableI2C(0);
+
+ /* Set GPIO 30 & 31 back as GPIO pins */
+ value = PEEK32(GPIO_MUX);
+ value = FIELD_SET(value, GPIO_MUX, 30, GPIO);
+ value = FIELD_SET(value, GPIO_MUX, 31, GPIO);
+ POKE32(GPIO_MUX, value);
+}
+
+
+long hwI2CWaitTXDone(void)
+{
+ unsigned int timeout;
+
+ /* Wait until the transfer is completed. */
+ timeout = HWI2C_WAIT_TIMEOUT;
+ while ((FIELD_GET(PEEK32(I2C_STATUS), I2C_STATUS, TX) != I2C_STATUS_TX_COMPLETED) &&
+ (timeout != 0))
+ timeout--;
+
+ if (timeout == 0)
+ return (-1);
+
+ return 0;
+}
+
+
+
+/*
+ * This function writes data to the i2c slave device registers.
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address
+ * length - Total number of bytes to be written to the device
+ * pBuffer - The buffer that contains the data to be written to the
+ * i2c device.
+ *
+ * Return Value:
+ * Total number of bytes those are actually written.
+ */
+unsigned int hwI2CWriteData(
+ unsigned char deviceAddress,
+ unsigned int length,
+ unsigned char *pBuffer
+)
+{
+ unsigned char count, i;
+ unsigned int totalBytes = 0;
+
+ /* Set the Device Address */
+ POKE32(I2C_SLAVE_ADDRESS, deviceAddress & ~0x01);
+
+ /* Write data.
+ * Note:
+ * Only 16 byte can be accessed per i2c start instruction.
+ */
+ do
+ {
+ /* Reset I2C by writing 0 to I2C_RESET register to clear the previous status. */
+ POKE32(I2C_RESET, 0);
+
+ /* Set the number of bytes to be written */
+ if (length < MAX_HWI2C_FIFO)
+ count = length - 1;
+ else
+ count = MAX_HWI2C_FIFO - 1;
+ POKE32(I2C_BYTE_COUNT, count);
+
+ /* Move the data to the I2C data register */
+ for (i = 0; i <= count; i++)
+ POKE32(I2C_DATA0 + i, *pBuffer++);
+
+ /* Start the I2C */
+ POKE32(I2C_CTRL, FIELD_SET(PEEK32(I2C_CTRL), I2C_CTRL, CTRL, START));
+
+ /* Wait until the transfer is completed. */
+ if (hwI2CWaitTXDone() != 0)
+ break;
+
+ /* Substract length */
+ length -= (count + 1);
+
+ /* Total byte written */
+ totalBytes += (count + 1);
+
+ } while (length > 0);
+
+ return totalBytes;
+}
+
+
+
+
+/*
+ * This function reads data from the slave device and stores them
+ * in the given buffer
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address
+ * length - Total number of bytes to be read
+ * pBuffer - Pointer to a buffer to be filled with the data read
+ * from the slave device. It has to be the same size as the
+ * length to make sure that it can keep all the data read.
+ *
+ * Return Value:
+ * Total number of actual bytes read from the slave device
+ */
+unsigned int hwI2CReadData(
+ unsigned char deviceAddress,
+ unsigned int length,
+ unsigned char *pBuffer
+)
+{
+ unsigned char count, i;
+ unsigned int totalBytes = 0;
+
+ /* Set the Device Address */
+ POKE32(I2C_SLAVE_ADDRESS, deviceAddress | 0x01);
+
+ /* Read data and save them to the buffer.
+ * Note:
+ * Only 16 byte can be accessed per i2c start instruction.
+ */
+ do
+ {
+ /* Reset I2C by writing 0 to I2C_RESET register to clear all the status. */
+ POKE32(I2C_RESET, 0);
+
+ /* Set the number of bytes to be read */
+ if (length <= MAX_HWI2C_FIFO)
+ count = length - 1;
+ else
+ count = MAX_HWI2C_FIFO - 1;
+ POKE32(I2C_BYTE_COUNT, count);
+
+ /* Start the I2C */
+ POKE32(I2C_CTRL, FIELD_SET(PEEK32(I2C_CTRL), I2C_CTRL, CTRL, START));
+
+ /* Wait until transaction done. */
+ if (hwI2CWaitTXDone() != 0)
+ break;
+
+ /* Save the data to the given buffer */
+ for (i = 0; i <= count; i++)
+ *pBuffer++ = PEEK32(I2C_DATA0 + i);
+
+ /* Substract length by 16 */
+ length -= (count + 1);
+
+ /* Number of bytes read. */
+ totalBytes += (count + 1);
+
+ } while (length > 0);
+
+ return totalBytes;
+}
+
+
+
+
+/*
+ * This function reads the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be read from
+ * registerIndex - Slave device's register to be read
+ *
+ * Return Value:
+ * Register value
+ */
+unsigned char hwI2CReadReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex
+)
+{
+ unsigned char value = (0xFF);
+
+ if (hwI2CWriteData(deviceAddress, 1, ®isterIndex) == 1)
+ hwI2CReadData(deviceAddress, 1, &value);
+
+ return value;
+}
+
+
+
+
+
+/*
+ * This function writes a value to the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be written
+ * registerIndex - Slave device's register to be written
+ * data - Data to be written to the register
+ *
+ * Result:
+ * 0 - Success
+ * -1 - Fail
+ */
+int hwI2CWriteReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex,
+ unsigned char data
+)
+{
+ unsigned char value[2];
+
+ value[0] = registerIndex;
+ value[1] = data;
+ if (hwI2CWriteData(deviceAddress, 2, value) == 2)
+ return 0;
+
+ return (-1);
+}
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_hwi2c.h b/drivers/video/lynxfb/ddk750/ddk750_hwi2c.h
new file mode 100644
index 0000000..ad31149
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_hwi2c.h
@@ -0,0 +1,10 @@
+#ifndef DDK750_HWI2C_H__
+#define DDK750_HWI2C_H__
+
+/* hwi2c functions */
+int hwI2CInit(unsigned char busSpeedMode);
+void hwI2CClose(void);
+
+unsigned char hwI2CReadReg(unsigned char deviceAddress,unsigned char registerIndex);
+int hwI2CWriteReg(unsigned char deviceAddress,unsigned char registerIndex,unsigned char data);
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_mode.c b/drivers/video/lynxfb/ddk750/ddk750_mode.c
new file mode 100644
index 0000000..1d7637d
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_mode.c
@@ -0,0 +1,205 @@
+
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_mode.h"
+#include "ddk750_chip.h"
+
+/*
+ SM750LE only:
+ This function takes care extra registers and bit fields required to set
+ up a mode in SM750LE
+
+ Explanation about Display Control register:
+ HW only supports 7 predefined pixel clocks, and clock select is
+ in bit 29:27 of Display Control register.
+*/
+static unsigned long displayControlAdjust_SM750LE(mode_parameter_t *pModeParam, unsigned long dispControl)
+{
+ unsigned long x, y;
+
+ x = pModeParam->horizontal_display_end;
+ y = pModeParam->vertical_display_end;
+
+ /* SM750LE has to set up the top-left and bottom-right
+ registers as well.
+ Note that normal SM750/SM718 only use those two register for
+ auto-centering mode.
+ */
+ POKE32(CRT_AUTO_CENTERING_TL,
+ FIELD_VALUE(0, CRT_AUTO_CENTERING_TL, TOP, 0)
+ | FIELD_VALUE(0, CRT_AUTO_CENTERING_TL, LEFT, 0));
+
+ POKE32(CRT_AUTO_CENTERING_BR,
+ FIELD_VALUE(0, CRT_AUTO_CENTERING_BR, BOTTOM, y-1)
+ | FIELD_VALUE(0, CRT_AUTO_CENTERING_BR, RIGHT, x-1));
+
+ /* Assume common fields in dispControl have been properly set before
+ calling this function.
+ This function only sets the extra fields in dispControl.
+ */
+
+ /* Clear bit 29:27 of display control register */
+ dispControl &= FIELD_CLEAR(CRT_DISPLAY_CTRL, CLK);
+
+ /* Set bit 29:27 of display control register for the right clock */
+ /* Note that SM750LE only need to supported 7 resoluitons. */
+ if ( x == 800 && y == 600 )
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL41);
+ else if (x == 1024 && y == 768)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL65);
+ else if (x == 1152 && y == 864)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL80);
+ else if (x == 1280 && y == 768)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL80);
+ else if (x == 1280 && y == 720)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL74);
+ else if (x == 1280 && y == 960)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL108);
+ else if (x == 1280 && y == 1024)
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL108);
+ else /* default to VGA clock */
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLK, PLL25);
+
+ /* Set bit 25:24 of display controller */
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CRTSELECT, CRT);
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, RGBBIT, 24BIT);
+
+ /* Set bit 14 of display controller */
+ dispControl = FIELD_SET(dispControl, CRT_DISPLAY_CTRL, CLOCK_PHASE, ACTIVE_LOW);
+
+ POKE32(CRT_DISPLAY_CTRL, dispControl);
+
+ return dispControl;
+}
+
+
+
+/* only timing related registers will be programed */
+static int programModeRegisters(mode_parameter_t * pModeParam,pll_value_t * pll)
+{
+ int ret = 0;
+ int cnt = 0;
+ unsigned int ulTmpValue,ulReg;
+ if(pll->clockType == SECONDARY_PLL)
+ {
+ /* programe secondary pixel clock */
+ POKE32(CRT_PLL_CTRL,formatPllReg(pll));
+ POKE32(CRT_HORIZONTAL_TOTAL,
+ FIELD_VALUE(0, CRT_HORIZONTAL_TOTAL, TOTAL, pModeParam->horizontal_total - 1)
+ | FIELD_VALUE(0, CRT_HORIZONTAL_TOTAL, DISPLAY_END, pModeParam->horizontal_display_end - 1));
+
+ POKE32(CRT_HORIZONTAL_SYNC,
+ FIELD_VALUE(0, CRT_HORIZONTAL_SYNC, WIDTH, pModeParam->horizontal_sync_width)
+ | FIELD_VALUE(0, CRT_HORIZONTAL_SYNC, START, pModeParam->horizontal_sync_start - 1));
+
+ POKE32(CRT_VERTICAL_TOTAL,
+ FIELD_VALUE(0, CRT_VERTICAL_TOTAL, TOTAL, pModeParam->vertical_total - 1)
+ | FIELD_VALUE(0, CRT_VERTICAL_TOTAL, DISPLAY_END, pModeParam->vertical_display_end - 1));
+
+ POKE32(CRT_VERTICAL_SYNC,
+ FIELD_VALUE(0, CRT_VERTICAL_SYNC, HEIGHT, pModeParam->vertical_sync_height)
+ | FIELD_VALUE(0, CRT_VERTICAL_SYNC, START, pModeParam->vertical_sync_start - 1));
+
+
+ ulTmpValue = FIELD_VALUE(0,CRT_DISPLAY_CTRL,VSYNC_PHASE,pModeParam->vertical_sync_polarity)|
+ FIELD_VALUE(0,CRT_DISPLAY_CTRL,HSYNC_PHASE,pModeParam->horizontal_sync_polarity)|
+ FIELD_SET(0,CRT_DISPLAY_CTRL,TIMING,ENABLE)|
+ FIELD_SET(0,CRT_DISPLAY_CTRL,PLANE,ENABLE);
+
+
+ if(getChipType() == SM750LE){
+ displayControlAdjust_SM750LE(pModeParam,ulTmpValue);
+ }else{
+ ulReg = PEEK32(CRT_DISPLAY_CTRL)
+ & FIELD_CLEAR(CRT_DISPLAY_CTRL,VSYNC_PHASE)
+ & FIELD_CLEAR(CRT_DISPLAY_CTRL,HSYNC_PHASE)
+ & FIELD_CLEAR(CRT_DISPLAY_CTRL,TIMING)
+ & FIELD_CLEAR(CRT_DISPLAY_CTRL,PLANE);
+
+ POKE32(CRT_DISPLAY_CTRL,ulTmpValue|ulReg);
+ }
+
+ }
+ else if(pll->clockType == PRIMARY_PLL)
+ {
+ unsigned int ulReservedBits;
+ POKE32(PANEL_PLL_CTRL,formatPllReg(pll));
+
+ POKE32(PANEL_HORIZONTAL_TOTAL,
+ FIELD_VALUE(0, PANEL_HORIZONTAL_TOTAL, TOTAL, pModeParam->horizontal_total - 1)
+ | FIELD_VALUE(0, PANEL_HORIZONTAL_TOTAL, DISPLAY_END, pModeParam->horizontal_display_end - 1));
+
+ POKE32(PANEL_HORIZONTAL_SYNC,
+ FIELD_VALUE(0, PANEL_HORIZONTAL_SYNC, WIDTH, pModeParam->horizontal_sync_width)
+ | FIELD_VALUE(0, PANEL_HORIZONTAL_SYNC, START, pModeParam->horizontal_sync_start - 1));
+
+ POKE32(PANEL_VERTICAL_TOTAL,
+ FIELD_VALUE(0, PANEL_VERTICAL_TOTAL, TOTAL, pModeParam->vertical_total - 1)
+ | FIELD_VALUE(0, PANEL_VERTICAL_TOTAL, DISPLAY_END, pModeParam->vertical_display_end - 1));
+
+ POKE32(PANEL_VERTICAL_SYNC,
+ FIELD_VALUE(0, PANEL_VERTICAL_SYNC, HEIGHT, pModeParam->vertical_sync_height)
+ | FIELD_VALUE(0, PANEL_VERTICAL_SYNC, START, pModeParam->vertical_sync_start - 1));
+
+ ulTmpValue = FIELD_VALUE(0,PANEL_DISPLAY_CTRL,VSYNC_PHASE,pModeParam->vertical_sync_polarity)|
+ FIELD_VALUE(0,PANEL_DISPLAY_CTRL,HSYNC_PHASE,pModeParam->horizontal_sync_polarity)|
+ FIELD_VALUE(0,PANEL_DISPLAY_CTRL,CLOCK_PHASE,pModeParam->clock_phase_polarity)|
+ FIELD_SET(0,PANEL_DISPLAY_CTRL,TIMING,ENABLE)|
+ FIELD_SET(0,PANEL_DISPLAY_CTRL,PLANE,ENABLE);
+
+ ulReservedBits = FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_1_MASK, ENABLE) |
+ FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_2_MASK, ENABLE) |
+ FIELD_SET(0, PANEL_DISPLAY_CTRL, RESERVED_3_MASK, ENABLE)|
+ FIELD_SET(0,PANEL_DISPLAY_CTRL,VSYNC,ACTIVE_LOW);
+
+ ulReg = (PEEK32(PANEL_DISPLAY_CTRL) & ~ulReservedBits)
+ & FIELD_CLEAR(PANEL_DISPLAY_CTRL, CLOCK_PHASE)
+ & FIELD_CLEAR(PANEL_DISPLAY_CTRL, VSYNC_PHASE)
+ & FIELD_CLEAR(PANEL_DISPLAY_CTRL, HSYNC_PHASE)
+ & FIELD_CLEAR(PANEL_DISPLAY_CTRL, TIMING)
+ & FIELD_CLEAR(PANEL_DISPLAY_CTRL, PLANE);
+
+
+ /* May a hardware bug or just my test chip (not confirmed).
+ * PANEL_DISPLAY_CTRL register seems requiring few writes
+ * before a value can be succesfully written in.
+ * Added some masks to mask out the reserved bits.
+ * Note: This problem happens by design. The hardware will wait for the
+ * next vertical sync to turn on/off the plane.
+ */
+
+ POKE32(PANEL_DISPLAY_CTRL,ulTmpValue|ulReg);
+#if 1
+ while((PEEK32(PANEL_DISPLAY_CTRL) & ~ulReservedBits) != (ulTmpValue|ulReg))
+ {
+ cnt++;
+ if(cnt > 1000)
+ break;
+ POKE32(PANEL_DISPLAY_CTRL,ulTmpValue|ulReg);
+ }
+#endif
+ }
+ else{
+ ret = -1;
+ }
+ return ret;
+}
+
+int ddk750_setModeTiming(mode_parameter_t * parm,clock_type_t clock)
+{
+ pll_value_t pll;
+ unsigned int uiActualPixelClk;
+ pll.inputFreq = DEFAULT_INPUT_CLOCK;
+ pll.clockType = clock;
+
+ uiActualPixelClk = calcPllValue(parm->pixel_clock,&pll);
+ if(getChipType() == SM750LE){
+ /* set graphic mode via IO method */
+ outb_p(0x88,0x3d4);
+ outb_p(0x06,0x3d5);
+ }
+ programModeRegisters(parm,&pll);
+ return 0;
+}
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_mode.h b/drivers/video/lynxfb/ddk750/ddk750_mode.h
new file mode 100644
index 0000000..38e008d
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_mode.h
@@ -0,0 +1,43 @@
+#ifndef DDK750_MODE_H__
+#define DDK750_MODE_H__
+
+#include "ddk750_chip.h"
+
+typedef enum _spolarity_t
+{
+ POS = 0, /* positive */
+ NEG, /* negative */
+}
+spolarity_t;
+
+
+typedef struct _mode_parameter_t
+{
+ /* Horizontal timing. */
+ unsigned long horizontal_total;
+ unsigned long horizontal_display_end;
+ unsigned long horizontal_sync_start;
+ unsigned long horizontal_sync_width;
+ spolarity_t horizontal_sync_polarity;
+
+ /* Vertical timing. */
+ unsigned long vertical_total;
+ unsigned long vertical_display_end;
+ unsigned long vertical_sync_start;
+ unsigned long vertical_sync_height;
+ spolarity_t vertical_sync_polarity;
+
+ /* Refresh timing. */
+ unsigned long pixel_clock;
+ unsigned long horizontal_frequency;
+ unsigned long vertical_frequency;
+
+ /* Clock Phase. This clock phase only applies to Panel. */
+ spolarity_t clock_phase_polarity;
+}
+mode_parameter_t;
+
+int ddk750_setModeTiming(mode_parameter_t *,clock_type_t);
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_power.c b/drivers/video/lynxfb/ddk750/ddk750_power.c
new file mode 100644
index 0000000..ebb0f2f
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_power.c
@@ -0,0 +1,239 @@
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_power.h"
+
+void ddk750_setDPMS(DPMS_t state)
+{
+ unsigned int value;
+ if(getChipType() == SM750LE){
+ value = PEEK32(CRT_DISPLAY_CTRL);
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(value,CRT_DISPLAY_CTRL,DPMS,state));
+ }else{
+ value = PEEK32(SYSTEM_CTRL);
+ value= FIELD_VALUE(value,SYSTEM_CTRL,DPMS,state);
+ POKE32(SYSTEM_CTRL, value);
+ }
+}
+
+unsigned int getPowerMode()
+{
+ if(getChipType() == SM750LE)
+ return 0;
+ return (FIELD_GET(PEEK32(POWER_MODE_CTRL), POWER_MODE_CTRL, MODE));
+}
+
+
+/*
+ * SM50x can operate in one of three modes: 0, 1 or Sleep.
+ * On hardware reset, power mode 0 is default.
+ */
+void setPowerMode(unsigned int powerMode)
+{
+ unsigned int control_value = 0;
+
+ control_value = PEEK32(POWER_MODE_CTRL);
+
+ if(getChipType() == SM750LE)
+ return;
+
+ switch (powerMode)
+ {
+ case POWER_MODE_CTRL_MODE_MODE0:
+ control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, MODE0);
+ break;
+
+ case POWER_MODE_CTRL_MODE_MODE1:
+ control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, MODE1);
+ break;
+
+ case POWER_MODE_CTRL_MODE_SLEEP:
+ control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, SLEEP);
+ break;
+
+ default:
+ break;
+ }
+
+ /* Set up other fields in Power Control Register */
+ if (powerMode == POWER_MODE_CTRL_MODE_SLEEP)
+ {
+ control_value =
+#ifdef VALIDATION_CHIP
+ FIELD_SET( control_value, POWER_MODE_CTRL, 336CLK, OFF) |
+#endif
+ FIELD_SET( control_value, POWER_MODE_CTRL, OSC_INPUT, OFF);
+ }
+ else
+ {
+ control_value =
+#ifdef VALIDATION_CHIP
+ FIELD_SET( control_value, POWER_MODE_CTRL, 336CLK, ON) |
+#endif
+ FIELD_SET( control_value, POWER_MODE_CTRL, OSC_INPUT, ON);
+ }
+
+ /* Program new power mode. */
+ POKE32(POWER_MODE_CTRL, control_value);
+}
+
+void setCurrentGate(unsigned int gate)
+{
+ unsigned int gate_reg;
+ unsigned int mode;
+
+ /* Get current power mode. */
+ mode = getPowerMode();
+
+ switch (mode)
+ {
+ case POWER_MODE_CTRL_MODE_MODE0:
+ gate_reg = MODE0_GATE;
+ break;
+
+ case POWER_MODE_CTRL_MODE_MODE1:
+ gate_reg = MODE1_GATE;
+ break;
+
+ default:
+ gate_reg = MODE0_GATE;
+ break;
+ }
+ POKE32(gate_reg, gate);
+}
+
+
+
+/*
+ * This function enable/disable the 2D engine.
+ */
+void enable2DEngine(unsigned int enable)
+{
+ uint32_t gate;
+
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ {
+ gate = FIELD_SET(gate, CURRENT_GATE, DE, ON);
+ gate = FIELD_SET(gate, CURRENT_GATE, CSC, ON);
+ }
+ else
+ {
+ gate = FIELD_SET(gate, CURRENT_GATE, DE, OFF);
+ gate = FIELD_SET(gate, CURRENT_GATE, CSC, OFF);
+ }
+
+ setCurrentGate(gate);
+}
+
+
+/*
+ * This function enable/disable the ZV Port.
+ */
+void enableZVPort(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable ZV Port Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ {
+ gate = FIELD_SET(gate, CURRENT_GATE, ZVPORT, ON);
+#if 1
+ /* Using Software I2C */
+ gate = FIELD_SET(gate, CURRENT_GATE, GPIO, ON);
+#else
+ /* Using Hardware I2C */
+ gate = FIELD_SET(gate, CURRENT_GATE, I2C, ON);
+#endif
+ }
+ else
+ {
+ /* Disable ZV Port Gate. There is no way to know whether the GPIO pins are being used
+ or not. Therefore, do not disable the GPIO gate. */
+ gate = FIELD_SET(gate, CURRENT_GATE, ZVPORT, OFF);
+ }
+
+ setCurrentGate(gate);
+}
+
+
+void enableSSP(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable SSP Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ gate = FIELD_SET(gate, CURRENT_GATE, SSP, ON);
+ else
+ gate = FIELD_SET(gate, CURRENT_GATE, SSP, OFF);
+
+ setCurrentGate(gate);
+}
+
+void enableDMA(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable DMA Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ gate = FIELD_SET(gate, CURRENT_GATE, DMA, ON);
+ else
+ gate = FIELD_SET(gate, CURRENT_GATE, DMA, OFF);
+
+ setCurrentGate(gate);
+}
+
+/*
+ * This function enable/disable the GPIO Engine
+ */
+void enableGPIO(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable GPIO Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ gate = FIELD_SET(gate, CURRENT_GATE, GPIO, ON);
+ else
+ gate = FIELD_SET(gate, CURRENT_GATE, GPIO, OFF);
+
+ setCurrentGate(gate);
+}
+
+/*
+ * This function enable/disable the PWM Engine
+ */
+void enablePWM(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable PWM Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ gate = FIELD_SET(gate, CURRENT_GATE, PWM, ON);
+ else
+ gate = FIELD_SET(gate, CURRENT_GATE, PWM, OFF);
+
+ setCurrentGate(gate);
+}
+
+/*
+ * This function enable/disable the I2C Engine
+ */
+void enableI2C(unsigned int enable)
+{
+ uint32_t gate;
+
+ /* Enable I2C Gate */
+ gate = PEEK32(CURRENT_GATE);
+ if (enable)
+ gate = FIELD_SET(gate, CURRENT_GATE, I2C, ON);
+ else
+ gate = FIELD_SET(gate, CURRENT_GATE, I2C, OFF);
+
+ setCurrentGate(gate);
+}
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_power.h b/drivers/video/lynxfb/ddk750/ddk750_power.h
new file mode 100644
index 0000000..64ce8e2
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_power.h
@@ -0,0 +1,71 @@
+#ifndef DDK750_POWER_H__
+#define DDK750_POWER_H__
+
+typedef enum _DPMS_t
+{
+ crtDPMS_ON = 0x0,
+ crtDPMS_STANDBY = 0x1,
+ crtDPMS_SUSPEND = 0x2,
+ crtDPMS_OFF = 0x3,
+}
+DPMS_t;
+
+#define setDAC(off) \
+ { \
+ POKE32(MISC_CTRL,FIELD_VALUE(PEEK32(MISC_CTRL), \
+ MISC_CTRL, \
+ DAC_POWER, \
+ off)); \
+ }
+
+void ddk750_setDPMS(DPMS_t);
+
+unsigned int getPowerMode(void);
+
+/*
+ * This function sets the current power mode
+ */
+void setPowerMode(unsigned int powerMode);
+
+/*
+ * This function sets current gate
+ */
+void setCurrentGate(unsigned int gate);
+
+/*
+ * This function enable/disable the 2D engine.
+ */
+void enable2DEngine(unsigned int enable);
+
+/*
+ * This function enable/disable the ZV Port
+ */
+void enableZVPort(unsigned int enable);
+
+/*
+ * This function enable/disable the DMA Engine
+ */
+void enableDMA(unsigned int enable);
+
+/*
+ * This function enable/disable the GPIO Engine
+ */
+void enableGPIO(unsigned int enable);
+
+/*
+ * This function enable/disable the PWM Engine
+ */
+void enablePWM(unsigned int enable);
+
+/*
+ * This function enable/disable the I2C Engine
+ */
+void enableI2C(unsigned int enable);
+
+/*
+ * This function enable/disable the SSP.
+ */
+void enableSSP(unsigned int enable);
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_reg.h b/drivers/video/lynxfb/ddk750/ddk750_reg.h
new file mode 100644
index 0000000..2148767
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_reg.h
@@ -0,0 +1,2616 @@
+#ifndef DDK750_REG_H__
+#define DDK750_REG_H__
+
+/* New register for SM750LE */
+#define DE_STATE1 0x100054
+#define DE_STATE1_DE_ABORT 0:0
+#define DE_STATE1_DE_ABORT_OFF 0
+#define DE_STATE1_DE_ABORT_ON 1
+
+#define DE_STATE2 0x100058
+#define DE_STATE2_DE_FIFO 3:3
+#define DE_STATE2_DE_FIFO_NOTEMPTY 0
+#define DE_STATE2_DE_FIFO_EMPTY 1
+#define DE_STATE2_DE_STATUS 2:2
+#define DE_STATE2_DE_STATUS_IDLE 0
+#define DE_STATE2_DE_STATUS_BUSY 1
+#define DE_STATE2_DE_MEM_FIFO 1:1
+#define DE_STATE2_DE_MEM_FIFO_NOTEMPTY 0
+#define DE_STATE2_DE_MEM_FIFO_EMPTY 1
+#define DE_STATE2_DE_RESERVED 0:0
+
+
+
+#define SYSTEM_CTRL 0x000000
+#define SYSTEM_CTRL_DPMS 31:30
+#define SYSTEM_CTRL_DPMS_VPHP 0
+#define SYSTEM_CTRL_DPMS_VPHN 1
+#define SYSTEM_CTRL_DPMS_VNHP 2
+#define SYSTEM_CTRL_DPMS_VNHN 3
+#define SYSTEM_CTRL_PCI_BURST 29:29
+#define SYSTEM_CTRL_PCI_BURST_OFF 0
+#define SYSTEM_CTRL_PCI_BURST_ON 1
+#define SYSTEM_CTRL_PCI_MASTER 25:25
+#define SYSTEM_CTRL_PCI_MASTER_OFF 0
+#define SYSTEM_CTRL_PCI_MASTER_ON 1
+#define SYSTEM_CTRL_LATENCY_TIMER 24:24
+#define SYSTEM_CTRL_LATENCY_TIMER_ON 0
+#define SYSTEM_CTRL_LATENCY_TIMER_OFF 1
+#define SYSTEM_CTRL_DE_FIFO 23:23
+#define SYSTEM_CTRL_DE_FIFO_NOTEMPTY 0
+#define SYSTEM_CTRL_DE_FIFO_EMPTY 1
+#define SYSTEM_CTRL_DE_STATUS 22:22
+#define SYSTEM_CTRL_DE_STATUS_IDLE 0
+#define SYSTEM_CTRL_DE_STATUS_BUSY 1
+#define SYSTEM_CTRL_DE_MEM_FIFO 21:21
+#define SYSTEM_CTRL_DE_MEM_FIFO_NOTEMPTY 0
+#define SYSTEM_CTRL_DE_MEM_FIFO_EMPTY 1
+#define SYSTEM_CTRL_CSC_STATUS 20:20
+#define SYSTEM_CTRL_CSC_STATUS_IDLE 0
+#define SYSTEM_CTRL_CSC_STATUS_BUSY 1
+#define SYSTEM_CTRL_CRT_VSYNC 19:19
+#define SYSTEM_CTRL_CRT_VSYNC_INACTIVE 0
+#define SYSTEM_CTRL_CRT_VSYNC_ACTIVE 1
+#define SYSTEM_CTRL_PANEL_VSYNC 18:18
+#define SYSTEM_CTRL_PANEL_VSYNC_INACTIVE 0
+#define SYSTEM_CTRL_PANEL_VSYNC_ACTIVE 1
+#define SYSTEM_CTRL_CURRENT_BUFFER 17:17
+#define SYSTEM_CTRL_CURRENT_BUFFER_NORMAL 0
+#define SYSTEM_CTRL_CURRENT_BUFFER_FLIP_PENDING 1
+#define SYSTEM_CTRL_DMA_STATUS 16:16
+#define SYSTEM_CTRL_DMA_STATUS_IDLE 0
+#define SYSTEM_CTRL_DMA_STATUS_BUSY 1
+#define SYSTEM_CTRL_PCI_BURST_READ 15:15
+#define SYSTEM_CTRL_PCI_BURST_READ_OFF 0
+#define SYSTEM_CTRL_PCI_BURST_READ_ON 1
+#define SYSTEM_CTRL_DE_ABORT 13:13
+#define SYSTEM_CTRL_DE_ABORT_OFF 0
+#define SYSTEM_CTRL_DE_ABORT_ON 1
+#define SYSTEM_CTRL_PCI_SUBSYS_ID_LOCK 11:11
+#define SYSTEM_CTRL_PCI_SUBSYS_ID_LOCK_OFF 0
+#define SYSTEM_CTRL_PCI_SUBSYS_ID_LOCK_ON 1
+#define SYSTEM_CTRL_PCI_RETRY 7:7
+#define SYSTEM_CTRL_PCI_RETRY_ON 0
+#define SYSTEM_CTRL_PCI_RETRY_OFF 1
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE 5:4
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_1 0
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_2 1
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_4 2
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_8 3
+#define SYSTEM_CTRL_CRT_TRISTATE 3:3
+#define SYSTEM_CTRL_CRT_TRISTATE_OFF 0
+#define SYSTEM_CTRL_CRT_TRISTATE_ON 1
+#define SYSTEM_CTRL_PCIMEM_TRISTATE 2:2
+#define SYSTEM_CTRL_PCIMEM_TRISTATE_OFF 0
+#define SYSTEM_CTRL_PCIMEM_TRISTATE_ON 1
+#define SYSTEM_CTRL_LOCALMEM_TRISTATE 1:1
+#define SYSTEM_CTRL_LOCALMEM_TRISTATE_OFF 0
+#define SYSTEM_CTRL_LOCALMEM_TRISTATE_ON 1
+#define SYSTEM_CTRL_PANEL_TRISTATE 0:0
+#define SYSTEM_CTRL_PANEL_TRISTATE_OFF 0
+#define SYSTEM_CTRL_PANEL_TRISTATE_ON 1
+
+#define MISC_CTRL 0x000004
+#define MISC_CTRL_DRAM_RERESH_COUNT 27:27
+#define MISC_CTRL_DRAM_RERESH_COUNT_1ROW 0
+#define MISC_CTRL_DRAM_RERESH_COUNT_3ROW 1
+#define MISC_CTRL_DRAM_REFRESH_TIME 26:25
+#define MISC_CTRL_DRAM_REFRESH_TIME_8 0
+#define MISC_CTRL_DRAM_REFRESH_TIME_16 1
+#define MISC_CTRL_DRAM_REFRESH_TIME_32 2
+#define MISC_CTRL_DRAM_REFRESH_TIME_64 3
+#define MISC_CTRL_INT_OUTPUT 24:24
+#define MISC_CTRL_INT_OUTPUT_NORMAL 0
+#define MISC_CTRL_INT_OUTPUT_INVERT 1
+#define MISC_CTRL_PLL_CLK_COUNT 23:23
+#define MISC_CTRL_PLL_CLK_COUNT_OFF 0
+#define MISC_CTRL_PLL_CLK_COUNT_ON 1
+#define MISC_CTRL_DAC_POWER 20:20
+#define MISC_CTRL_DAC_POWER_ON 0
+#define MISC_CTRL_DAC_POWER_OFF 1
+#define MISC_CTRL_CLK_SELECT 16:16
+#define MISC_CTRL_CLK_SELECT_OSC 0
+#define MISC_CTRL_CLK_SELECT_TESTCLK 1
+#define MISC_CTRL_DRAM_COLUMN_SIZE 15:14
+#define MISC_CTRL_DRAM_COLUMN_SIZE_256 0
+#define MISC_CTRL_DRAM_COLUMN_SIZE_512 1
+#define MISC_CTRL_DRAM_COLUMN_SIZE_1024 2
+#define MISC_CTRL_LOCALMEM_SIZE 13:12
+#define MISC_CTRL_LOCALMEM_SIZE_8M 3
+#define MISC_CTRL_LOCALMEM_SIZE_16M 0
+#define MISC_CTRL_LOCALMEM_SIZE_32M 1
+#define MISC_CTRL_LOCALMEM_SIZE_64M 2
+#define MISC_CTRL_DRAM_TWTR 11:11
+#define MISC_CTRL_DRAM_TWTR_2CLK 0
+#define MISC_CTRL_DRAM_TWTR_1CLK 1
+#define MISC_CTRL_DRAM_TWR 10:10
+#define MISC_CTRL_DRAM_TWR_3CLK 0
+#define MISC_CTRL_DRAM_TWR_2CLK 1
+#define MISC_CTRL_DRAM_TRP 9:9
+#define MISC_CTRL_DRAM_TRP_3CLK 0
+#define MISC_CTRL_DRAM_TRP_4CLK 1
+#define MISC_CTRL_DRAM_TRFC 8:8
+#define MISC_CTRL_DRAM_TRFC_12CLK 0
+#define MISC_CTRL_DRAM_TRFC_14CLK 1
+#define MISC_CTRL_DRAM_TRAS 7:7
+#define MISC_CTRL_DRAM_TRAS_7CLK 0
+#define MISC_CTRL_DRAM_TRAS_8CLK 1
+#define MISC_CTRL_LOCALMEM_RESET 6:6
+#define MISC_CTRL_LOCALMEM_RESET_RESET 0
+#define MISC_CTRL_LOCALMEM_RESET_NORMAL 1
+#define MISC_CTRL_LOCALMEM_STATE 5:5
+#define MISC_CTRL_LOCALMEM_STATE_ACTIVE 0
+#define MISC_CTRL_LOCALMEM_STATE_INACTIVE 1
+#define MISC_CTRL_CPU_CAS_LATENCY 4:4
+#define MISC_CTRL_CPU_CAS_LATENCY_2CLK 0
+#define MISC_CTRL_CPU_CAS_LATENCY_3CLK 1
+#define MISC_CTRL_DLL 3:3
+#define MISC_CTRL_DLL_ON 0
+#define MISC_CTRL_DLL_OFF 1
+#define MISC_CTRL_DRAM_OUTPUT 2:2
+#define MISC_CTRL_DRAM_OUTPUT_LOW 0
+#define MISC_CTRL_DRAM_OUTPUT_HIGH 1
+#define MISC_CTRL_LOCALMEM_BUS_SIZE 1:1
+#define MISC_CTRL_LOCALMEM_BUS_SIZE_32 0
+#define MISC_CTRL_LOCALMEM_BUS_SIZE_64 1
+#define MISC_CTRL_EMBEDDED_LOCALMEM 0:0
+#define MISC_CTRL_EMBEDDED_LOCALMEM_ON 0
+#define MISC_CTRL_EMBEDDED_LOCALMEM_OFF 1
+
+#define GPIO_MUX 0x000008
+#define GPIO_MUX_31 31:31
+#define GPIO_MUX_31_GPIO 0
+#define GPIO_MUX_31_I2C 1
+#define GPIO_MUX_30 30:30
+#define GPIO_MUX_30_GPIO 0
+#define GPIO_MUX_30_I2C 1
+#define GPIO_MUX_29 29:29
+#define GPIO_MUX_29_GPIO 0
+#define GPIO_MUX_29_SSP1 1
+#define GPIO_MUX_28 28:28
+#define GPIO_MUX_28_GPIO 0
+#define GPIO_MUX_28_SSP1 1
+#define GPIO_MUX_27 27:27
+#define GPIO_MUX_27_GPIO 0
+#define GPIO_MUX_27_SSP1 1
+#define GPIO_MUX_26 26:26
+#define GPIO_MUX_26_GPIO 0
+#define GPIO_MUX_26_SSP1 1
+#define GPIO_MUX_25 25:25
+#define GPIO_MUX_25_GPIO 0
+#define GPIO_MUX_25_SSP1 1
+#define GPIO_MUX_24 24:24
+#define GPIO_MUX_24_GPIO 0
+#define GPIO_MUX_24_SSP0 1
+#define GPIO_MUX_23 23:23
+#define GPIO_MUX_23_GPIO 0
+#define GPIO_MUX_23_SSP0 1
+#define GPIO_MUX_22 22:22
+#define GPIO_MUX_22_GPIO 0
+#define GPIO_MUX_22_SSP0 1
+#define GPIO_MUX_21 21:21
+#define GPIO_MUX_21_GPIO 0
+#define GPIO_MUX_21_SSP0 1
+#define GPIO_MUX_20 20:20
+#define GPIO_MUX_20_GPIO 0
+#define GPIO_MUX_20_SSP0 1
+#define GPIO_MUX_19 19:19
+#define GPIO_MUX_19_GPIO 0
+#define GPIO_MUX_19_PWM 1
+#define GPIO_MUX_18 18:18
+#define GPIO_MUX_18_GPIO 0
+#define GPIO_MUX_18_PWM 1
+#define GPIO_MUX_17 17:17
+#define GPIO_MUX_17_GPIO 0
+#define GPIO_MUX_17_PWM 1
+#define GPIO_MUX_16 16:16
+#define GPIO_MUX_16_GPIO_ZVPORT 0
+#define GPIO_MUX_16_TEST_DATA 1
+#define GPIO_MUX_15 15:15
+#define GPIO_MUX_15_GPIO_ZVPORT 0
+#define GPIO_MUX_15_TEST_DATA 1
+#define GPIO_MUX_14 14:14
+#define GPIO_MUX_14_GPIO_ZVPORT 0
+#define GPIO_MUX_14_TEST_DATA 1
+#define GPIO_MUX_13 13:13
+#define GPIO_MUX_13_GPIO_ZVPORT 0
+#define GPIO_MUX_13_TEST_DATA 1
+#define GPIO_MUX_12 12:12
+#define GPIO_MUX_12_GPIO_ZVPORT 0
+#define GPIO_MUX_12_TEST_DATA 1
+#define GPIO_MUX_11 11:11
+#define GPIO_MUX_11_GPIO_ZVPORT 0
+#define GPIO_MUX_11_TEST_DATA 1
+#define GPIO_MUX_10 10:10
+#define GPIO_MUX_10_GPIO_ZVPORT 0
+#define GPIO_MUX_10_TEST_DATA 1
+#define GPIO_MUX_9 9:9
+#define GPIO_MUX_9_GPIO_ZVPORT 0
+#define GPIO_MUX_9_TEST_DATA 1
+#define GPIO_MUX_8 8:8
+#define GPIO_MUX_8_GPIO_ZVPORT 0
+#define GPIO_MUX_8_TEST_DATA 1
+#define GPIO_MUX_7 7:7
+#define GPIO_MUX_7_GPIO_ZVPORT 0
+#define GPIO_MUX_7_TEST_DATA 1
+#define GPIO_MUX_6 6:6
+#define GPIO_MUX_6_GPIO_ZVPORT 0
+#define GPIO_MUX_6_TEST_DATA 1
+#define GPIO_MUX_5 5:5
+#define GPIO_MUX_5_GPIO_ZVPORT 0
+#define GPIO_MUX_5_TEST_DATA 1
+#define GPIO_MUX_4 4:4
+#define GPIO_MUX_4_GPIO_ZVPORT 0
+#define GPIO_MUX_4_TEST_DATA 1
+#define GPIO_MUX_3 3:3
+#define GPIO_MUX_3_GPIO_ZVPORT 0
+#define GPIO_MUX_3_TEST_DATA 1
+#define GPIO_MUX_2 2:2
+#define GPIO_MUX_2_GPIO_ZVPORT 0
+#define GPIO_MUX_2_TEST_DATA 1
+#define GPIO_MUX_1 1:1
+#define GPIO_MUX_1_GPIO_ZVPORT 0
+#define GPIO_MUX_1_TEST_DATA 1
+#define GPIO_MUX_0 0:0
+#define GPIO_MUX_0_GPIO_ZVPORT 0
+#define GPIO_MUX_0_TEST_DATA 1
+
+#define LOCALMEM_ARBITRATION 0x00000C
+#define LOCALMEM_ARBITRATION_ROTATE 28:28
+#define LOCALMEM_ARBITRATION_ROTATE_OFF 0
+#define LOCALMEM_ARBITRATION_ROTATE_ON 1
+#define LOCALMEM_ARBITRATION_VGA 26:24
+#define LOCALMEM_ARBITRATION_VGA_OFF 0
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_VGA_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_DMA 22:20
+#define LOCALMEM_ARBITRATION_DMA_OFF 0
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_DMA_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_ZVPORT1 18:16
+#define LOCALMEM_ARBITRATION_ZVPORT1_OFF 0
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_ZVPORT1_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_ZVPORT0 14:12
+#define LOCALMEM_ARBITRATION_ZVPORT0_OFF 0
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_ZVPORT0_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_VIDEO 10:8
+#define LOCALMEM_ARBITRATION_VIDEO_OFF 0
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_VIDEO_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_PANEL 6:4
+#define LOCALMEM_ARBITRATION_PANEL_OFF 0
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_PANEL_PRIORITY_7 7
+#define LOCALMEM_ARBITRATION_CRT 2:0
+#define LOCALMEM_ARBITRATION_CRT_OFF 0
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_1 1
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_2 2
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_3 3
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_4 4
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_5 5
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_6 6
+#define LOCALMEM_ARBITRATION_CRT_PRIORITY_7 7
+
+#define PCIMEM_ARBITRATION 0x000010
+#define PCIMEM_ARBITRATION_ROTATE 28:28
+#define PCIMEM_ARBITRATION_ROTATE_OFF 0
+#define PCIMEM_ARBITRATION_ROTATE_ON 1
+#define PCIMEM_ARBITRATION_VGA 26:24
+#define PCIMEM_ARBITRATION_VGA_OFF 0
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_VGA_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_DMA 22:20
+#define PCIMEM_ARBITRATION_DMA_OFF 0
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_DMA_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_ZVPORT1 18:16
+#define PCIMEM_ARBITRATION_ZVPORT1_OFF 0
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_ZVPORT1_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_ZVPORT0 14:12
+#define PCIMEM_ARBITRATION_ZVPORT0_OFF 0
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_ZVPORT0_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_VIDEO 10:8
+#define PCIMEM_ARBITRATION_VIDEO_OFF 0
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_VIDEO_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_PANEL 6:4
+#define PCIMEM_ARBITRATION_PANEL_OFF 0
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_PANEL_PRIORITY_7 7
+#define PCIMEM_ARBITRATION_CRT 2:0
+#define PCIMEM_ARBITRATION_CRT_OFF 0
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_1 1
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_2 2
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_3 3
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_4 4
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_5 5
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_6 6
+#define PCIMEM_ARBITRATION_CRT_PRIORITY_7 7
+
+#define RAW_INT 0x000020
+#define RAW_INT_ZVPORT1_VSYNC 4:4
+#define RAW_INT_ZVPORT1_VSYNC_INACTIVE 0
+#define RAW_INT_ZVPORT1_VSYNC_ACTIVE 1
+#define RAW_INT_ZVPORT1_VSYNC_CLEAR 1
+#define RAW_INT_ZVPORT0_VSYNC 3:3
+#define RAW_INT_ZVPORT0_VSYNC_INACTIVE 0
+#define RAW_INT_ZVPORT0_VSYNC_ACTIVE 1
+#define RAW_INT_ZVPORT0_VSYNC_CLEAR 1
+#define RAW_INT_CRT_VSYNC 2:2
+#define RAW_INT_CRT_VSYNC_INACTIVE 0
+#define RAW_INT_CRT_VSYNC_ACTIVE 1
+#define RAW_INT_CRT_VSYNC_CLEAR 1
+#define RAW_INT_PANEL_VSYNC 1:1
+#define RAW_INT_PANEL_VSYNC_INACTIVE 0
+#define RAW_INT_PANEL_VSYNC_ACTIVE 1
+#define RAW_INT_PANEL_VSYNC_CLEAR 1
+#define RAW_INT_VGA_VSYNC 0:0
+#define RAW_INT_VGA_VSYNC_INACTIVE 0
+#define RAW_INT_VGA_VSYNC_ACTIVE 1
+#define RAW_INT_VGA_VSYNC_CLEAR 1
+
+#define INT_STATUS 0x000024
+#define INT_STATUS_GPIO31 31:31
+#define INT_STATUS_GPIO31_INACTIVE 0
+#define INT_STATUS_GPIO31_ACTIVE 1
+#define INT_STATUS_GPIO30 30:30
+#define INT_STATUS_GPIO30_INACTIVE 0
+#define INT_STATUS_GPIO30_ACTIVE 1
+#define INT_STATUS_GPIO29 29:29
+#define INT_STATUS_GPIO29_INACTIVE 0
+#define INT_STATUS_GPIO29_ACTIVE 1
+#define INT_STATUS_GPIO28 28:28
+#define INT_STATUS_GPIO28_INACTIVE 0
+#define INT_STATUS_GPIO28_ACTIVE 1
+#define INT_STATUS_GPIO27 27:27
+#define INT_STATUS_GPIO27_INACTIVE 0
+#define INT_STATUS_GPIO27_ACTIVE 1
+#define INT_STATUS_GPIO26 26:26
+#define INT_STATUS_GPIO26_INACTIVE 0
+#define INT_STATUS_GPIO26_ACTIVE 1
+#define INT_STATUS_GPIO25 25:25
+#define INT_STATUS_GPIO25_INACTIVE 0
+#define INT_STATUS_GPIO25_ACTIVE 1
+#define INT_STATUS_I2C 12:12
+#define INT_STATUS_I2C_INACTIVE 0
+#define INT_STATUS_I2C_ACTIVE 1
+#define INT_STATUS_PWM 11:11
+#define INT_STATUS_PWM_INACTIVE 0
+#define INT_STATUS_PWM_ACTIVE 1
+#define INT_STATUS_DMA1 10:10
+#define INT_STATUS_DMA1_INACTIVE 0
+#define INT_STATUS_DMA1_ACTIVE 1
+#define INT_STATUS_DMA0 9:9
+#define INT_STATUS_DMA0_INACTIVE 0
+#define INT_STATUS_DMA0_ACTIVE 1
+#define INT_STATUS_PCI 8:8
+#define INT_STATUS_PCI_INACTIVE 0
+#define INT_STATUS_PCI_ACTIVE 1
+#define INT_STATUS_SSP1 7:7
+#define INT_STATUS_SSP1_INACTIVE 0
+#define INT_STATUS_SSP1_ACTIVE 1
+#define INT_STATUS_SSP0 6:6
+#define INT_STATUS_SSP0_INACTIVE 0
+#define INT_STATUS_SSP0_ACTIVE 1
+#define INT_STATUS_DE 5:5
+#define INT_STATUS_DE_INACTIVE 0
+#define INT_STATUS_DE_ACTIVE 1
+#define INT_STATUS_ZVPORT1_VSYNC 4:4
+#define INT_STATUS_ZVPORT1_VSYNC_INACTIVE 0
+#define INT_STATUS_ZVPORT1_VSYNC_ACTIVE 1
+#define INT_STATUS_ZVPORT0_VSYNC 3:3
+#define INT_STATUS_ZVPORT0_VSYNC_INACTIVE 0
+#define INT_STATUS_ZVPORT0_VSYNC_ACTIVE 1
+#define INT_STATUS_CRT_VSYNC 2:2
+#define INT_STATUS_CRT_VSYNC_INACTIVE 0
+#define INT_STATUS_CRT_VSYNC_ACTIVE 1
+#define INT_STATUS_PANEL_VSYNC 1:1
+#define INT_STATUS_PANEL_VSYNC_INACTIVE 0
+#define INT_STATUS_PANEL_VSYNC_ACTIVE 1
+#define INT_STATUS_VGA_VSYNC 0:0
+#define INT_STATUS_VGA_VSYNC_INACTIVE 0
+#define INT_STATUS_VGA_VSYNC_ACTIVE 1
+
+#define INT_MASK 0x000028
+#define INT_MASK_GPIO31 31:31
+#define INT_MASK_GPIO31_DISABLE 0
+#define INT_MASK_GPIO31_ENABLE 1
+#define INT_MASK_GPIO30 30:30
+#define INT_MASK_GPIO30_DISABLE 0
+#define INT_MASK_GPIO30_ENABLE 1
+#define INT_MASK_GPIO29 29:29
+#define INT_MASK_GPIO29_DISABLE 0
+#define INT_MASK_GPIO29_ENABLE 1
+#define INT_MASK_GPIO28 28:28
+#define INT_MASK_GPIO28_DISABLE 0
+#define INT_MASK_GPIO28_ENABLE 1
+#define INT_MASK_GPIO27 27:27
+#define INT_MASK_GPIO27_DISABLE 0
+#define INT_MASK_GPIO27_ENABLE 1
+#define INT_MASK_GPIO26 26:26
+#define INT_MASK_GPIO26_DISABLE 0
+#define INT_MASK_GPIO26_ENABLE 1
+#define INT_MASK_GPIO25 25:25
+#define INT_MASK_GPIO25_DISABLE 0
+#define INT_MASK_GPIO25_ENABLE 1
+#define INT_MASK_I2C 12:12
+#define INT_MASK_I2C_DISABLE 0
+#define INT_MASK_I2C_ENABLE 1
+#define INT_MASK_PWM 11:11
+#define INT_MASK_PWM_DISABLE 0
+#define INT_MASK_PWM_ENABLE 1
+#define INT_MASK_DMA1 10:10
+#define INT_MASK_DMA1_DISABLE 0
+#define INT_MASK_DMA1_ENABLE 1
+#define INT_MASK_DMA 9:9
+#define INT_MASK_DMA_DISABLE 0
+#define INT_MASK_DMA_ENABLE 1
+#define INT_MASK_PCI 8:8
+#define INT_MASK_PCI_DISABLE 0
+#define INT_MASK_PCI_ENABLE 1
+#define INT_MASK_SSP1 7:7
+#define INT_MASK_SSP1_DISABLE 0
+#define INT_MASK_SSP1_ENABLE 1
+#define INT_MASK_SSP0 6:6
+#define INT_MASK_SSP0_DISABLE 0
+#define INT_MASK_SSP0_ENABLE 1
+#define INT_MASK_DE 5:5
+#define INT_MASK_DE_DISABLE 0
+#define INT_MASK_DE_ENABLE 1
+#define INT_MASK_ZVPORT1_VSYNC 4:4
+#define INT_MASK_ZVPORT1_VSYNC_DISABLE 0
+#define INT_MASK_ZVPORT1_VSYNC_ENABLE 1
+#define INT_MASK_ZVPORT0_VSYNC 3:3
+#define INT_MASK_ZVPORT0_VSYNC_DISABLE 0
+#define INT_MASK_ZVPORT0_VSYNC_ENABLE 1
+#define INT_MASK_CRT_VSYNC 2:2
+#define INT_MASK_CRT_VSYNC_DISABLE 0
+#define INT_MASK_CRT_VSYNC_ENABLE 1
+#define INT_MASK_PANEL_VSYNC 1:1
+#define INT_MASK_PANEL_VSYNC_DISABLE 0
+#define INT_MASK_PANEL_VSYNC_ENABLE 1
+#define INT_MASK_VGA_VSYNC 0:0
+#define INT_MASK_VGA_VSYNC_DISABLE 0
+#define INT_MASK_VGA_VSYNC_ENABLE 1
+
+#define CURRENT_GATE 0x000040
+#define CURRENT_GATE_MCLK 15:14
+#ifdef VALIDATION_CHIP
+ #define CURRENT_GATE_MCLK_112MHZ 0
+ #define CURRENT_GATE_MCLK_84MHZ 1
+ #define CURRENT_GATE_MCLK_56MHZ 2
+ #define CURRENT_GATE_MCLK_42MHZ 3
+#else
+ #define CURRENT_GATE_MCLK_DIV_3 0
+ #define CURRENT_GATE_MCLK_DIV_4 1
+ #define CURRENT_GATE_MCLK_DIV_6 2
+ #define CURRENT_GATE_MCLK_DIV_8 3
+#endif
+#define CURRENT_GATE_M2XCLK 13:12
+#ifdef VALIDATION_CHIP
+ #define CURRENT_GATE_M2XCLK_336MHZ 0
+ #define CURRENT_GATE_M2XCLK_168MHZ 1
+ #define CURRENT_GATE_M2XCLK_112MHZ 2
+ #define CURRENT_GATE_M2XCLK_84MHZ 3
+#else
+ #define CURRENT_GATE_M2XCLK_DIV_1 0
+ #define CURRENT_GATE_M2XCLK_DIV_2 1
+ #define CURRENT_GATE_M2XCLK_DIV_3 2
+ #define CURRENT_GATE_M2XCLK_DIV_4 3
+#endif
+#define CURRENT_GATE_VGA 10:10
+#define CURRENT_GATE_VGA_OFF 0
+#define CURRENT_GATE_VGA_ON 1
+#define CURRENT_GATE_PWM 9:9
+#define CURRENT_GATE_PWM_OFF 0
+#define CURRENT_GATE_PWM_ON 1
+#define CURRENT_GATE_I2C 8:8
+#define CURRENT_GATE_I2C_OFF 0
+#define CURRENT_GATE_I2C_ON 1
+#define CURRENT_GATE_SSP 7:7
+#define CURRENT_GATE_SSP_OFF 0
+#define CURRENT_GATE_SSP_ON 1
+#define CURRENT_GATE_GPIO 6:6
+#define CURRENT_GATE_GPIO_OFF 0
+#define CURRENT_GATE_GPIO_ON 1
+#define CURRENT_GATE_ZVPORT 5:5
+#define CURRENT_GATE_ZVPORT_OFF 0
+#define CURRENT_GATE_ZVPORT_ON 1
+#define CURRENT_GATE_CSC 4:4
+#define CURRENT_GATE_CSC_OFF 0
+#define CURRENT_GATE_CSC_ON 1
+#define CURRENT_GATE_DE 3:3
+#define CURRENT_GATE_DE_OFF 0
+#define CURRENT_GATE_DE_ON 1
+#define CURRENT_GATE_DISPLAY 2:2
+#define CURRENT_GATE_DISPLAY_OFF 0
+#define CURRENT_GATE_DISPLAY_ON 1
+#define CURRENT_GATE_LOCALMEM 1:1
+#define CURRENT_GATE_LOCALMEM_OFF 0
+#define CURRENT_GATE_LOCALMEM_ON 1
+#define CURRENT_GATE_DMA 0:0
+#define CURRENT_GATE_DMA_OFF 0
+#define CURRENT_GATE_DMA_ON 1
+
+#define MODE0_GATE 0x000044
+#define MODE0_GATE_MCLK 15:14
+#define MODE0_GATE_MCLK_112MHZ 0
+#define MODE0_GATE_MCLK_84MHZ 1
+#define MODE0_GATE_MCLK_56MHZ 2
+#define MODE0_GATE_MCLK_42MHZ 3
+#define MODE0_GATE_M2XCLK 13:12
+#define MODE0_GATE_M2XCLK_336MHZ 0
+#define MODE0_GATE_M2XCLK_168MHZ 1
+#define MODE0_GATE_M2XCLK_112MHZ 2
+#define MODE0_GATE_M2XCLK_84MHZ 3
+#define MODE0_GATE_VGA 10:10
+#define MODE0_GATE_VGA_OFF 0
+#define MODE0_GATE_VGA_ON 1
+#define MODE0_GATE_PWM 9:9
+#define MODE0_GATE_PWM_OFF 0
+#define MODE0_GATE_PWM_ON 1
+#define MODE0_GATE_I2C 8:8
+#define MODE0_GATE_I2C_OFF 0
+#define MODE0_GATE_I2C_ON 1
+#define MODE0_GATE_SSP 7:7
+#define MODE0_GATE_SSP_OFF 0
+#define MODE0_GATE_SSP_ON 1
+#define MODE0_GATE_GPIO 6:6
+#define MODE0_GATE_GPIO_OFF 0
+#define MODE0_GATE_GPIO_ON 1
+#define MODE0_GATE_ZVPORT 5:5
+#define MODE0_GATE_ZVPORT_OFF 0
+#define MODE0_GATE_ZVPORT_ON 1
+#define MODE0_GATE_CSC 4:4
+#define MODE0_GATE_CSC_OFF 0
+#define MODE0_GATE_CSC_ON 1
+#define MODE0_GATE_DE 3:3
+#define MODE0_GATE_DE_OFF 0
+#define MODE0_GATE_DE_ON 1
+#define MODE0_GATE_DISPLAY 2:2
+#define MODE0_GATE_DISPLAY_OFF 0
+#define MODE0_GATE_DISPLAY_ON 1
+#define MODE0_GATE_LOCALMEM 1:1
+#define MODE0_GATE_LOCALMEM_OFF 0
+#define MODE0_GATE_LOCALMEM_ON 1
+#define MODE0_GATE_DMA 0:0
+#define MODE0_GATE_DMA_OFF 0
+#define MODE0_GATE_DMA_ON 1
+
+#define MODE1_GATE 0x000048
+#define MODE1_GATE_MCLK 15:14
+#define MODE1_GATE_MCLK_112MHZ 0
+#define MODE1_GATE_MCLK_84MHZ 1
+#define MODE1_GATE_MCLK_56MHZ 2
+#define MODE1_GATE_MCLK_42MHZ 3
+#define MODE1_GATE_M2XCLK 13:12
+#define MODE1_GATE_M2XCLK_336MHZ 0
+#define MODE1_GATE_M2XCLK_168MHZ 1
+#define MODE1_GATE_M2XCLK_112MHZ 2
+#define MODE1_GATE_M2XCLK_84MHZ 3
+#define MODE1_GATE_VGA 10:10
+#define MODE1_GATE_VGA_OFF 0
+#define MODE1_GATE_VGA_ON 1
+#define MODE1_GATE_PWM 9:9
+#define MODE1_GATE_PWM_OFF 0
+#define MODE1_GATE_PWM_ON 1
+#define MODE1_GATE_I2C 8:8
+#define MODE1_GATE_I2C_OFF 0
+#define MODE1_GATE_I2C_ON 1
+#define MODE1_GATE_SSP 7:7
+#define MODE1_GATE_SSP_OFF 0
+#define MODE1_GATE_SSP_ON 1
+#define MODE1_GATE_GPIO 6:6
+#define MODE1_GATE_GPIO_OFF 0
+#define MODE1_GATE_GPIO_ON 1
+#define MODE1_GATE_ZVPORT 5:5
+#define MODE1_GATE_ZVPORT_OFF 0
+#define MODE1_GATE_ZVPORT_ON 1
+#define MODE1_GATE_CSC 4:4
+#define MODE1_GATE_CSC_OFF 0
+#define MODE1_GATE_CSC_ON 1
+#define MODE1_GATE_DE 3:3
+#define MODE1_GATE_DE_OFF 0
+#define MODE1_GATE_DE_ON 1
+#define MODE1_GATE_DISPLAY 2:2
+#define MODE1_GATE_DISPLAY_OFF 0
+#define MODE1_GATE_DISPLAY_ON 1
+#define MODE1_GATE_LOCALMEM 1:1
+#define MODE1_GATE_LOCALMEM_OFF 0
+#define MODE1_GATE_LOCALMEM_ON 1
+#define MODE1_GATE_DMA 0:0
+#define MODE1_GATE_DMA_OFF 0
+#define MODE1_GATE_DMA_ON 1
+
+#define POWER_MODE_CTRL 0x00004C
+#ifdef VALIDATION_CHIP
+ #define POWER_MODE_CTRL_336CLK 4:4
+ #define POWER_MODE_CTRL_336CLK_OFF 0
+ #define POWER_MODE_CTRL_336CLK_ON 1
+#endif
+#define POWER_MODE_CTRL_OSC_INPUT 3:3
+#define POWER_MODE_CTRL_OSC_INPUT_OFF 0
+#define POWER_MODE_CTRL_OSC_INPUT_ON 1
+#define POWER_MODE_CTRL_ACPI 2:2
+#define POWER_MODE_CTRL_ACPI_OFF 0
+#define POWER_MODE_CTRL_ACPI_ON 1
+#define POWER_MODE_CTRL_MODE 1:0
+#define POWER_MODE_CTRL_MODE_MODE0 0
+#define POWER_MODE_CTRL_MODE_MODE1 1
+#define POWER_MODE_CTRL_MODE_SLEEP 2
+
+#define PCI_MASTER_BASE 0x000050
+#define PCI_MASTER_BASE_ADDRESS 7:0
+
+#define DEVICE_ID 0x000054
+#define DEVICE_ID_DEVICE_ID 31:16
+#define DEVICE_ID_REVISION_ID 7:0
+
+#define PLL_CLK_COUNT 0x000058
+#define PLL_CLK_COUNT_COUNTER 15:0
+
+#define PANEL_PLL_CTRL 0x00005C
+#define PANEL_PLL_CTRL_BYPASS 18:18
+#define PANEL_PLL_CTRL_BYPASS_OFF 0
+#define PANEL_PLL_CTRL_BYPASS_ON 1
+#define PANEL_PLL_CTRL_POWER 17:17
+#define PANEL_PLL_CTRL_POWER_OFF 0
+#define PANEL_PLL_CTRL_POWER_ON 1
+#define PANEL_PLL_CTRL_INPUT 16:16
+#define PANEL_PLL_CTRL_INPUT_OSC 0
+#define PANEL_PLL_CTRL_INPUT_TESTCLK 1
+#ifdef VALIDATION_CHIP
+ #define PANEL_PLL_CTRL_OD 15:14
+#else
+ #define PANEL_PLL_CTRL_POD 15:14
+ #define PANEL_PLL_CTRL_OD 13:12
+#endif
+#define PANEL_PLL_CTRL_N 11:8
+#define PANEL_PLL_CTRL_M 7:0
+
+#define CRT_PLL_CTRL 0x000060
+#define CRT_PLL_CTRL_BYPASS 18:18
+#define CRT_PLL_CTRL_BYPASS_OFF 0
+#define CRT_PLL_CTRL_BYPASS_ON 1
+#define CRT_PLL_CTRL_POWER 17:17
+#define CRT_PLL_CTRL_POWER_OFF 0
+#define CRT_PLL_CTRL_POWER_ON 1
+#define CRT_PLL_CTRL_INPUT 16:16
+#define CRT_PLL_CTRL_INPUT_OSC 0
+#define CRT_PLL_CTRL_INPUT_TESTCLK 1
+#ifdef VALIDATION_CHIP
+ #define CRT_PLL_CTRL_OD 15:14
+#else
+ #define CRT_PLL_CTRL_POD 15:14
+ #define CRT_PLL_CTRL_OD 13:12
+#endif
+#define CRT_PLL_CTRL_N 11:8
+#define CRT_PLL_CTRL_M 7:0
+
+#define VGA_PLL0_CTRL 0x000064
+#define VGA_PLL0_CTRL_BYPASS 18:18
+#define VGA_PLL0_CTRL_BYPASS_OFF 0
+#define VGA_PLL0_CTRL_BYPASS_ON 1
+#define VGA_PLL0_CTRL_POWER 17:17
+#define VGA_PLL0_CTRL_POWER_OFF 0
+#define VGA_PLL0_CTRL_POWER_ON 1
+#define VGA_PLL0_CTRL_INPUT 16:16
+#define VGA_PLL0_CTRL_INPUT_OSC 0
+#define VGA_PLL0_CTRL_INPUT_TESTCLK 1
+#ifdef VALIDATION_CHIP
+ #define VGA_PLL0_CTRL_OD 15:14
+#else
+ #define VGA_PLL0_CTRL_POD 15:14
+ #define VGA_PLL0_CTRL_OD 13:12
+#endif
+#define VGA_PLL0_CTRL_N 11:8
+#define VGA_PLL0_CTRL_M 7:0
+
+#define VGA_PLL1_CTRL 0x000068
+#define VGA_PLL1_CTRL_BYPASS 18:18
+#define VGA_PLL1_CTRL_BYPASS_OFF 0
+#define VGA_PLL1_CTRL_BYPASS_ON 1
+#define VGA_PLL1_CTRL_POWER 17:17
+#define VGA_PLL1_CTRL_POWER_OFF 0
+#define VGA_PLL1_CTRL_POWER_ON 1
+#define VGA_PLL1_CTRL_INPUT 16:16
+#define VGA_PLL1_CTRL_INPUT_OSC 0
+#define VGA_PLL1_CTRL_INPUT_TESTCLK 1
+#ifdef VALIDATION_CHIP
+ #define VGA_PLL1_CTRL_OD 15:14
+#else
+ #define VGA_PLL1_CTRL_POD 15:14
+ #define VGA_PLL1_CTRL_OD 13:12
+#endif
+#define VGA_PLL1_CTRL_N 11:8
+#define VGA_PLL1_CTRL_M 7:0
+
+#define SCRATCH_DATA 0x00006c
+
+#ifndef VALIDATION_CHIP
+
+#define MXCLK_PLL_CTRL 0x000070
+#define MXCLK_PLL_CTRL_BYPASS 18:18
+#define MXCLK_PLL_CTRL_BYPASS_OFF 0
+#define MXCLK_PLL_CTRL_BYPASS_ON 1
+#define MXCLK_PLL_CTRL_POWER 17:17
+#define MXCLK_PLL_CTRL_POWER_OFF 0
+#define MXCLK_PLL_CTRL_POWER_ON 1
+#define MXCLK_PLL_CTRL_INPUT 16:16
+#define MXCLK_PLL_CTRL_INPUT_OSC 0
+#define MXCLK_PLL_CTRL_INPUT_TESTCLK 1
+#define MXCLK_PLL_CTRL_POD 15:14
+#define MXCLK_PLL_CTRL_OD 13:12
+#define MXCLK_PLL_CTRL_N 11:8
+#define MXCLK_PLL_CTRL_M 7:0
+
+#define VGA_CONFIGURATION 0x000088
+#define VGA_CONFIGURATION_USER_DEFINE 5:4
+#define VGA_CONFIGURATION_PLL 2:2
+#define VGA_CONFIGURATION_PLL_VGA 0
+#define VGA_CONFIGURATION_PLL_PANEL 1
+#define VGA_CONFIGURATION_MODE 1:1
+#define VGA_CONFIGURATION_MODE_TEXT 0
+#define VGA_CONFIGURATION_MODE_GRAPHIC 1
+
+#endif
+
+#define GPIO_DATA 0x010000
+#define GPIO_DATA_31 31:31
+#define GPIO_DATA_30 30:30
+#define GPIO_DATA_29 29:29
+#define GPIO_DATA_28 28:28
+#define GPIO_DATA_27 27:27
+#define GPIO_DATA_26 26:26
+#define GPIO_DATA_25 25:25
+#define GPIO_DATA_24 24:24
+#define GPIO_DATA_23 23:23
+#define GPIO_DATA_22 22:22
+#define GPIO_DATA_21 21:21
+#define GPIO_DATA_20 20:20
+#define GPIO_DATA_19 19:19
+#define GPIO_DATA_18 18:18
+#define GPIO_DATA_17 17:17
+#define GPIO_DATA_16 16:16
+#define GPIO_DATA_15 15:15
+#define GPIO_DATA_14 14:14
+#define GPIO_DATA_13 13:13
+#define GPIO_DATA_12 12:12
+#define GPIO_DATA_11 11:11
+#define GPIO_DATA_10 10:10
+#define GPIO_DATA_9 9:9
+#define GPIO_DATA_8 8:8
+#define GPIO_DATA_7 7:7
+#define GPIO_DATA_6 6:6
+#define GPIO_DATA_5 5:5
+#define GPIO_DATA_4 4:4
+#define GPIO_DATA_3 3:3
+#define GPIO_DATA_2 2:2
+#define GPIO_DATA_1 1:1
+#define GPIO_DATA_0 0:0
+
+#define GPIO_DATA_DIRECTION 0x010004
+#define GPIO_DATA_DIRECTION_31 31:31
+#define GPIO_DATA_DIRECTION_31_INPUT 0
+#define GPIO_DATA_DIRECTION_31_OUTPUT 1
+#define GPIO_DATA_DIRECTION_30 30:30
+#define GPIO_DATA_DIRECTION_30_INPUT 0
+#define GPIO_DATA_DIRECTION_30_OUTPUT 1
+#define GPIO_DATA_DIRECTION_29 29:29
+#define GPIO_DATA_DIRECTION_29_INPUT 0
+#define GPIO_DATA_DIRECTION_29_OUTPUT 1
+#define GPIO_DATA_DIRECTION_28 28:28
+#define GPIO_DATA_DIRECTION_28_INPUT 0
+#define GPIO_DATA_DIRECTION_28_OUTPUT 1
+#define GPIO_DATA_DIRECTION_27 27:27
+#define GPIO_DATA_DIRECTION_27_INPUT 0
+#define GPIO_DATA_DIRECTION_27_OUTPUT 1
+#define GPIO_DATA_DIRECTION_26 26:26
+#define GPIO_DATA_DIRECTION_26_INPUT 0
+#define GPIO_DATA_DIRECTION_26_OUTPUT 1
+#define GPIO_DATA_DIRECTION_25 25:25
+#define GPIO_DATA_DIRECTION_25_INPUT 0
+#define GPIO_DATA_DIRECTION_25_OUTPUT 1
+#define GPIO_DATA_DIRECTION_24 24:24
+#define GPIO_DATA_DIRECTION_24_INPUT 0
+#define GPIO_DATA_DIRECTION_24_OUTPUT 1
+#define GPIO_DATA_DIRECTION_23 23:23
+#define GPIO_DATA_DIRECTION_23_INPUT 0
+#define GPIO_DATA_DIRECTION_23_OUTPUT 1
+#define GPIO_DATA_DIRECTION_22 22:22
+#define GPIO_DATA_DIRECTION_22_INPUT 0
+#define GPIO_DATA_DIRECTION_22_OUTPUT 1
+#define GPIO_DATA_DIRECTION_21 21:21
+#define GPIO_DATA_DIRECTION_21_INPUT 0
+#define GPIO_DATA_DIRECTION_21_OUTPUT 1
+#define GPIO_DATA_DIRECTION_20 20:20
+#define GPIO_DATA_DIRECTION_20_INPUT 0
+#define GPIO_DATA_DIRECTION_20_OUTPUT 1
+#define GPIO_DATA_DIRECTION_19 19:19
+#define GPIO_DATA_DIRECTION_19_INPUT 0
+#define GPIO_DATA_DIRECTION_19_OUTPUT 1
+#define GPIO_DATA_DIRECTION_18 18:18
+#define GPIO_DATA_DIRECTION_18_INPUT 0
+#define GPIO_DATA_DIRECTION_18_OUTPUT 1
+#define GPIO_DATA_DIRECTION_17 17:17
+#define GPIO_DATA_DIRECTION_17_INPUT 0
+#define GPIO_DATA_DIRECTION_17_OUTPUT 1
+#define GPIO_DATA_DIRECTION_16 16:16
+#define GPIO_DATA_DIRECTION_16_INPUT 0
+#define GPIO_DATA_DIRECTION_16_OUTPUT 1
+#define GPIO_DATA_DIRECTION_15 15:15
+#define GPIO_DATA_DIRECTION_15_INPUT 0
+#define GPIO_DATA_DIRECTION_15_OUTPUT 1
+#define GPIO_DATA_DIRECTION_14 14:14
+#define GPIO_DATA_DIRECTION_14_INPUT 0
+#define GPIO_DATA_DIRECTION_14_OUTPUT 1
+#define GPIO_DATA_DIRECTION_13 13:13
+#define GPIO_DATA_DIRECTION_13_INPUT 0
+#define GPIO_DATA_DIRECTION_13_OUTPUT 1
+#define GPIO_DATA_DIRECTION_12 12:12
+#define GPIO_DATA_DIRECTION_12_INPUT 0
+#define GPIO_DATA_DIRECTION_12_OUTPUT 1
+#define GPIO_DATA_DIRECTION_11 11:11
+#define GPIO_DATA_DIRECTION_11_INPUT 0
+#define GPIO_DATA_DIRECTION_11_OUTPUT 1
+#define GPIO_DATA_DIRECTION_10 10:10
+#define GPIO_DATA_DIRECTION_10_INPUT 0
+#define GPIO_DATA_DIRECTION_10_OUTPUT 1
+#define GPIO_DATA_DIRECTION_9 9:9
+#define GPIO_DATA_DIRECTION_9_INPUT 0
+#define GPIO_DATA_DIRECTION_9_OUTPUT 1
+#define GPIO_DATA_DIRECTION_8 8:8
+#define GPIO_DATA_DIRECTION_8_INPUT 0
+#define GPIO_DATA_DIRECTION_8_OUTPUT 1
+#define GPIO_DATA_DIRECTION_7 7:7
+#define GPIO_DATA_DIRECTION_7_INPUT 0
+#define GPIO_DATA_DIRECTION_7_OUTPUT 1
+#define GPIO_DATA_DIRECTION_6 6:6
+#define GPIO_DATA_DIRECTION_6_INPUT 0
+#define GPIO_DATA_DIRECTION_6_OUTPUT 1
+#define GPIO_DATA_DIRECTION_5 5:5
+#define GPIO_DATA_DIRECTION_5_INPUT 0
+#define GPIO_DATA_DIRECTION_5_OUTPUT 1
+#define GPIO_DATA_DIRECTION_4 4:4
+#define GPIO_DATA_DIRECTION_4_INPUT 0
+#define GPIO_DATA_DIRECTION_4_OUTPUT 1
+#define GPIO_DATA_DIRECTION_3 3:3
+#define GPIO_DATA_DIRECTION_3_INPUT 0
+#define GPIO_DATA_DIRECTION_3_OUTPUT 1
+#define GPIO_DATA_DIRECTION_2 2:2
+#define GPIO_DATA_DIRECTION_2_INPUT 0
+#define GPIO_DATA_DIRECTION_2_OUTPUT 1
+#define GPIO_DATA_DIRECTION_1 131
+#define GPIO_DATA_DIRECTION_1_INPUT 0
+#define GPIO_DATA_DIRECTION_1_OUTPUT 1
+#define GPIO_DATA_DIRECTION_0 0:0
+#define GPIO_DATA_DIRECTION_0_INPUT 0
+#define GPIO_DATA_DIRECTION_0_OUTPUT 1
+
+#define GPIO_INTERRUPT_SETUP 0x010008
+#define GPIO_INTERRUPT_SETUP_TRIGGER_31 22:22
+#define GPIO_INTERRUPT_SETUP_TRIGGER_31_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_31_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_30 21:21
+#define GPIO_INTERRUPT_SETUP_TRIGGER_30_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_30_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_29 20:20
+#define GPIO_INTERRUPT_SETUP_TRIGGER_29_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_29_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_28 19:19
+#define GPIO_INTERRUPT_SETUP_TRIGGER_28_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_28_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_27 18:18
+#define GPIO_INTERRUPT_SETUP_TRIGGER_27_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_27_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_26 17:17
+#define GPIO_INTERRUPT_SETUP_TRIGGER_26_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_26_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_25 16:16
+#define GPIO_INTERRUPT_SETUP_TRIGGER_25_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_25_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_31 14:14
+#define GPIO_INTERRUPT_SETUP_ACTIVE_31_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_31_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_30 13:13
+#define GPIO_INTERRUPT_SETUP_ACTIVE_30_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_30_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_29 12:12
+#define GPIO_INTERRUPT_SETUP_ACTIVE_29_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_29_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_28 11:11
+#define GPIO_INTERRUPT_SETUP_ACTIVE_28_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_28_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_27 10:10
+#define GPIO_INTERRUPT_SETUP_ACTIVE_27_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_27_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_26 9:9
+#define GPIO_INTERRUPT_SETUP_ACTIVE_26_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_26_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_25 8:8
+#define GPIO_INTERRUPT_SETUP_ACTIVE_25_LOW 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_25_HIGH 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_31 6:6
+#define GPIO_INTERRUPT_SETUP_ENABLE_31_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_31_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_30 5:5
+#define GPIO_INTERRUPT_SETUP_ENABLE_30_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_30_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_29 4:4
+#define GPIO_INTERRUPT_SETUP_ENABLE_29_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_29_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_28 3:3
+#define GPIO_INTERRUPT_SETUP_ENABLE_28_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_28_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_27 2:2
+#define GPIO_INTERRUPT_SETUP_ENABLE_27_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_27_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_26 1:1
+#define GPIO_INTERRUPT_SETUP_ENABLE_26_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_26_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_25 0:0
+#define GPIO_INTERRUPT_SETUP_ENABLE_25_GPIO 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_25_INTERRUPT 1
+
+#define GPIO_INTERRUPT_STATUS 0x01000C
+#define GPIO_INTERRUPT_STATUS_31 22:22
+#define GPIO_INTERRUPT_STATUS_31_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_31_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_31_RESET 1
+#define GPIO_INTERRUPT_STATUS_30 21:21
+#define GPIO_INTERRUPT_STATUS_30_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_30_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_30_RESET 1
+#define GPIO_INTERRUPT_STATUS_29 20:20
+#define GPIO_INTERRUPT_STATUS_29_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_29_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_29_RESET 1
+#define GPIO_INTERRUPT_STATUS_28 19:19
+#define GPIO_INTERRUPT_STATUS_28_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_28_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_28_RESET 1
+#define GPIO_INTERRUPT_STATUS_27 18:18
+#define GPIO_INTERRUPT_STATUS_27_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_27_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_27_RESET 1
+#define GPIO_INTERRUPT_STATUS_26 17:17
+#define GPIO_INTERRUPT_STATUS_26_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_26_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_26_RESET 1
+#define GPIO_INTERRUPT_STATUS_25 16:16
+#define GPIO_INTERRUPT_STATUS_25_INACTIVE 0
+#define GPIO_INTERRUPT_STATUS_25_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_25_RESET 1
+
+
+#define PANEL_DISPLAY_CTRL 0x080000
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK 31:30
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK_DISABLE 0
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK_ENABLE 3
+#define PANEL_DISPLAY_CTRL_SELECT 29:28
+#define PANEL_DISPLAY_CTRL_SELECT_PANEL 0
+#define PANEL_DISPLAY_CTRL_SELECT_VGA 1
+#define PANEL_DISPLAY_CTRL_SELECT_CRT 2
+#define PANEL_DISPLAY_CTRL_FPEN 27:27
+#define PANEL_DISPLAY_CTRL_FPEN_LOW 0
+#define PANEL_DISPLAY_CTRL_FPEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_VBIASEN 26:26
+#define PANEL_DISPLAY_CTRL_VBIASEN_LOW 0
+#define PANEL_DISPLAY_CTRL_VBIASEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_DATA 25:25
+#define PANEL_DISPLAY_CTRL_DATA_DISABLE 0
+#define PANEL_DISPLAY_CTRL_DATA_ENABLE 1
+#define PANEL_DISPLAY_CTRL_FPVDDEN 24:24
+#define PANEL_DISPLAY_CTRL_FPVDDEN_LOW 0
+#define PANEL_DISPLAY_CTRL_FPVDDEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK 23:20
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK_DISABLE 0
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK_ENABLE 15
+
+#define PANEL_DISPLAY_CTRL_TFT_DISP 19:18
+#define PANEL_DISPLAY_CTRL_TFT_DISP_24 0
+#define PANEL_DISPLAY_CTRL_TFT_DISP_36 1
+#define PANEL_DISPLAY_CTRL_TFT_DISP_18 2
+
+
+#define PANEL_DISPLAY_CTRL_DUAL_DISPLAY 19:19
+#define PANEL_DISPLAY_CTRL_DUAL_DISPLAY_DISABLE 0
+#define PANEL_DISPLAY_CTRL_DUAL_DISPLAY_ENABLE 1
+#define PANEL_DISPLAY_CTRL_DOUBLE_PIXEL 18:18
+#define PANEL_DISPLAY_CTRL_DOUBLE_PIXEL_DISABLE 0
+#define PANEL_DISPLAY_CTRL_DOUBLE_PIXEL_ENABLE 1
+#define PANEL_DISPLAY_CTRL_FIFO 17:16
+#define PANEL_DISPLAY_CTRL_FIFO_1 0
+#define PANEL_DISPLAY_CTRL_FIFO_3 1
+#define PANEL_DISPLAY_CTRL_FIFO_7 2
+#define PANEL_DISPLAY_CTRL_FIFO_11 3
+#define PANEL_DISPLAY_CTRL_RESERVED_3_MASK 15:15
+#define PANEL_DISPLAY_CTRL_RESERVED_3_MASK_DISABLE 0
+#define PANEL_DISPLAY_CTRL_RESERVED_3_MASK_ENABLE 1
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE 14:14
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE 13:13
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE 12:12
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_VSYNC 11:11
+#define PANEL_DISPLAY_CTRL_VSYNC_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_VSYNC_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING 10:10
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING_DISABLE 0
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING_ENABLE 1
+#define PANEL_DISPLAY_CTRL_COLOR_KEY 9:9
+#define PANEL_DISPLAY_CTRL_COLOR_KEY_DISABLE 0
+#define PANEL_DISPLAY_CTRL_COLOR_KEY_ENABLE 1
+#define PANEL_DISPLAY_CTRL_TIMING 8:8
+#define PANEL_DISPLAY_CTRL_TIMING_DISABLE 0
+#define PANEL_DISPLAY_CTRL_TIMING_ENABLE 1
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR 7:7
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR_DOWN 0
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR_UP 1
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN 6:6
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DISABLE 0
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_ENABLE 1
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR 5:5
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR_RIGHT 0
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR_LEFT 1
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN 4:4
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DISABLE 0
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_ENABLE 1
+#define PANEL_DISPLAY_CTRL_GAMMA 3:3
+#define PANEL_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define PANEL_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define PANEL_DISPLAY_CTRL_PLANE 2:2
+#define PANEL_DISPLAY_CTRL_PLANE_DISABLE 0
+#define PANEL_DISPLAY_CTRL_PLANE_ENABLE 1
+#define PANEL_DISPLAY_CTRL_FORMAT 1:0
+#define PANEL_DISPLAY_CTRL_FORMAT_8 0
+#define PANEL_DISPLAY_CTRL_FORMAT_16 1
+#define PANEL_DISPLAY_CTRL_FORMAT_32 2
+
+#define PANEL_PAN_CTRL 0x080004
+#define PANEL_PAN_CTRL_VERTICAL_PAN 31:24
+#define PANEL_PAN_CTRL_VERTICAL_VSYNC 21:16
+#define PANEL_PAN_CTRL_HORIZONTAL_PAN 15:8
+#define PANEL_PAN_CTRL_HORIZONTAL_VSYNC 5:0
+
+#define PANEL_COLOR_KEY 0x080008
+#define PANEL_COLOR_KEY_MASK 31:16
+#define PANEL_COLOR_KEY_VALUE 15:0
+
+#define PANEL_FB_ADDRESS 0x08000C
+#define PANEL_FB_ADDRESS_STATUS 31:31
+#define PANEL_FB_ADDRESS_STATUS_CURRENT 0
+#define PANEL_FB_ADDRESS_STATUS_PENDING 1
+#define PANEL_FB_ADDRESS_EXT 27:27
+#define PANEL_FB_ADDRESS_EXT_LOCAL 0
+#define PANEL_FB_ADDRESS_EXT_EXTERNAL 1
+#define PANEL_FB_ADDRESS_ADDRESS 25:0
+
+#define PANEL_FB_WIDTH 0x080010
+#define PANEL_FB_WIDTH_WIDTH 29:16
+#define PANEL_FB_WIDTH_OFFSET 13:0
+
+#define PANEL_WINDOW_WIDTH 0x080014
+#define PANEL_WINDOW_WIDTH_WIDTH 27:16
+#define PANEL_WINDOW_WIDTH_X 11:0
+
+#define PANEL_WINDOW_HEIGHT 0x080018
+#define PANEL_WINDOW_HEIGHT_HEIGHT 27:16
+#define PANEL_WINDOW_HEIGHT_Y 11:0
+
+#define PANEL_PLANE_TL 0x08001C
+#define PANEL_PLANE_TL_TOP 26:16
+#define PANEL_PLANE_TL_LEFT 10:0
+
+#define PANEL_PLANE_BR 0x080020
+#define PANEL_PLANE_BR_BOTTOM 26:16
+#define PANEL_PLANE_BR_RIGHT 10:0
+
+#define PANEL_HORIZONTAL_TOTAL 0x080024
+#define PANEL_HORIZONTAL_TOTAL_TOTAL 27:16
+#define PANEL_HORIZONTAL_TOTAL_DISPLAY_END 11:0
+
+#define PANEL_HORIZONTAL_SYNC 0x080028
+#define PANEL_HORIZONTAL_SYNC_WIDTH 23:16
+#define PANEL_HORIZONTAL_SYNC_START 11:0
+
+#define PANEL_VERTICAL_TOTAL 0x08002C
+#define PANEL_VERTICAL_TOTAL_TOTAL 26:16
+#define PANEL_VERTICAL_TOTAL_DISPLAY_END 10:0
+
+#define PANEL_VERTICAL_SYNC 0x080030
+#define PANEL_VERTICAL_SYNC_HEIGHT 21:16
+#define PANEL_VERTICAL_SYNC_START 10:0
+
+#define PANEL_CURRENT_LINE 0x080034
+#define PANEL_CURRENT_LINE_LINE 10:0
+
+/* Video Control */
+
+#define VIDEO_DISPLAY_CTRL 0x080040
+#define VIDEO_DISPLAY_CTRL_LINE_BUFFER 18:18
+#define VIDEO_DISPLAY_CTRL_LINE_BUFFER_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_LINE_BUFFER_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_FIFO 17:16
+#define VIDEO_DISPLAY_CTRL_FIFO_1 0
+#define VIDEO_DISPLAY_CTRL_FIFO_3 1
+#define VIDEO_DISPLAY_CTRL_FIFO_7 2
+#define VIDEO_DISPLAY_CTRL_FIFO_11 3
+#define VIDEO_DISPLAY_CTRL_BUFFER 15:15
+#define VIDEO_DISPLAY_CTRL_BUFFER_0 0
+#define VIDEO_DISPLAY_CTRL_BUFFER_1 1
+#define VIDEO_DISPLAY_CTRL_CAPTURE 14:14
+#define VIDEO_DISPLAY_CTRL_CAPTURE_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_CAPTURE_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER 13:13
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP 12:12
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE 11:11
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE_NORMAL 0
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE_HALF 1
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE 10:10
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE_NORMAL 0
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE_HALF 1
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE 9:9
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE_REPLICATE 0
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE_INTERPOLATE 1
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE 8:8
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE_REPLICATE 0
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE_INTERPOLATE 1
+#define VIDEO_DISPLAY_CTRL_PIXEL 7:4
+#define VIDEO_DISPLAY_CTRL_GAMMA 3:3
+#define VIDEO_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_PLANE 2:2
+#define VIDEO_DISPLAY_CTRL_PLANE_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_PLANE_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_FORMAT 1:0
+#define VIDEO_DISPLAY_CTRL_FORMAT_8 0
+#define VIDEO_DISPLAY_CTRL_FORMAT_16 1
+#define VIDEO_DISPLAY_CTRL_FORMAT_32 2
+#define VIDEO_DISPLAY_CTRL_FORMAT_YUV 3
+
+#define VIDEO_FB_0_ADDRESS 0x080044
+#define VIDEO_FB_0_ADDRESS_STATUS 31:31
+#define VIDEO_FB_0_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_FB_0_ADDRESS_STATUS_PENDING 1
+#define VIDEO_FB_0_ADDRESS_EXT 27:27
+#define VIDEO_FB_0_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_0_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_0_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_FB_WIDTH 0x080048
+#define VIDEO_FB_WIDTH_WIDTH 29:16
+#define VIDEO_FB_WIDTH_OFFSET 13:0
+
+#define VIDEO_FB_0_LAST_ADDRESS 0x08004C
+#define VIDEO_FB_0_LAST_ADDRESS_EXT 27:27
+#define VIDEO_FB_0_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_0_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_0_LAST_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_PLANE_TL 0x080050
+#define VIDEO_PLANE_TL_TOP 26:16
+#define VIDEO_PLANE_TL_LEFT 10:0
+
+#define VIDEO_PLANE_BR 0x080054
+#define VIDEO_PLANE_BR_BOTTOM 26:16
+#define VIDEO_PLANE_BR_RIGHT 10:0
+
+#define VIDEO_SCALE 0x080058
+#define VIDEO_SCALE_VERTICAL_MODE 31:31
+#define VIDEO_SCALE_VERTICAL_MODE_EXPAND 0
+#define VIDEO_SCALE_VERTICAL_MODE_SHRINK 1
+#define VIDEO_SCALE_VERTICAL_SCALE 27:16
+#define VIDEO_SCALE_HORIZONTAL_MODE 15:15
+#define VIDEO_SCALE_HORIZONTAL_MODE_EXPAND 0
+#define VIDEO_SCALE_HORIZONTAL_MODE_SHRINK 1
+#define VIDEO_SCALE_HORIZONTAL_SCALE 11:0
+
+#define VIDEO_INITIAL_SCALE 0x08005C
+#define VIDEO_INITIAL_SCALE_FB_1 27:16
+#define VIDEO_INITIAL_SCALE_FB_0 11:0
+
+#define VIDEO_YUV_CONSTANTS 0x080060
+#define VIDEO_YUV_CONSTANTS_Y 31:24
+#define VIDEO_YUV_CONSTANTS_R 23:16
+#define VIDEO_YUV_CONSTANTS_G 15:8
+#define VIDEO_YUV_CONSTANTS_B 7:0
+
+#define VIDEO_FB_1_ADDRESS 0x080064
+#define VIDEO_FB_1_ADDRESS_STATUS 31:31
+#define VIDEO_FB_1_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_FB_1_ADDRESS_STATUS_PENDING 1
+#define VIDEO_FB_1_ADDRESS_EXT 27:27
+#define VIDEO_FB_1_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_1_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_1_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_FB_1_LAST_ADDRESS 0x080068
+#define VIDEO_FB_1_LAST_ADDRESS_EXT 27:27
+#define VIDEO_FB_1_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_1_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_1_LAST_ADDRESS_ADDRESS 25:0
+
+/* Video Alpha Control */
+
+#define VIDEO_ALPHA_DISPLAY_CTRL 0x080080
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT 28:28
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT_PER_PIXEL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT_ALPHA 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_ALPHA 27:24
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO 17:16
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_1 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_3 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_7 2
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_11 3
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE 11:11
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE_NORMAL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE_HALF 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE 10:10
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE_NORMAL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE_HALF 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE 9:9
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE_REPLICATE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE_INTERPOLATE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE 8:8
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE_REPLICATE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE_INTERPOLATE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_PIXEL 7:4
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY 3:3
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY_DISABLE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY_ENABLE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE 2:2
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE_DISABLE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE_ENABLE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT 1:0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_8 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_16 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4 2
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4_4_4 3
+
+#define VIDEO_ALPHA_FB_ADDRESS 0x080084
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS 31:31
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS_PENDING 1
+#define VIDEO_ALPHA_FB_ADDRESS_EXT 27:27
+#define VIDEO_ALPHA_FB_ADDRESS_EXT_LOCAL 0
+#define VIDEO_ALPHA_FB_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_ALPHA_FB_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_ALPHA_FB_WIDTH 0x080088
+#define VIDEO_ALPHA_FB_WIDTH_WIDTH 29:16
+#define VIDEO_ALPHA_FB_WIDTH_OFFSET 13:0
+
+#define VIDEO_ALPHA_FB_LAST_ADDRESS 0x08008C
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT 27:27
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_ALPHA_PLANE_TL 0x080090
+#define VIDEO_ALPHA_PLANE_TL_TOP 26:16
+#define VIDEO_ALPHA_PLANE_TL_LEFT 10:0
+
+#define VIDEO_ALPHA_PLANE_BR 0x080094
+#define VIDEO_ALPHA_PLANE_BR_BOTTOM 26:16
+#define VIDEO_ALPHA_PLANE_BR_RIGHT 10:0
+
+#define VIDEO_ALPHA_SCALE 0x080098
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE 31:31
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE_EXPAND 0
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE_SHRINK 1
+#define VIDEO_ALPHA_SCALE_VERTICAL_SCALE 27:16
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE 15:15
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE_EXPAND 0
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE_SHRINK 1
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_SCALE 11:0
+
+#define VIDEO_ALPHA_INITIAL_SCALE 0x08009C
+#define VIDEO_ALPHA_INITIAL_SCALE_VERTICAL 27:16
+#define VIDEO_ALPHA_INITIAL_SCALE_HORIZONTAL 11:0
+
+#define VIDEO_ALPHA_CHROMA_KEY 0x0800A0
+#define VIDEO_ALPHA_CHROMA_KEY_MASK 31:16
+#define VIDEO_ALPHA_CHROMA_KEY_VALUE 15:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_01 0x0800A4
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_23 0x0800A8
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_45 0x0800AC
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_67 0x0800B0
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_89 0x0800B4
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB 0x0800B8
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD 0x0800BC
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF 0x0800C0
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F 31:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E 15:0
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_BLUE 4:0
+
+/* Panel Cursor Control */
+
+#define PANEL_HWC_ADDRESS 0x0800F0
+#define PANEL_HWC_ADDRESS_ENABLE 31:31
+#define PANEL_HWC_ADDRESS_ENABLE_DISABLE 0
+#define PANEL_HWC_ADDRESS_ENABLE_ENABLE 1
+#define PANEL_HWC_ADDRESS_EXT 27:27
+#define PANEL_HWC_ADDRESS_EXT_LOCAL 0
+#define PANEL_HWC_ADDRESS_EXT_EXTERNAL 1
+#define PANEL_HWC_ADDRESS_ADDRESS 25:0
+
+#define PANEL_HWC_LOCATION 0x0800F4
+#define PANEL_HWC_LOCATION_TOP 27:27
+#define PANEL_HWC_LOCATION_TOP_INSIDE 0
+#define PANEL_HWC_LOCATION_TOP_OUTSIDE 1
+#define PANEL_HWC_LOCATION_Y 26:16
+#define PANEL_HWC_LOCATION_LEFT 11:11
+#define PANEL_HWC_LOCATION_LEFT_INSIDE 0
+#define PANEL_HWC_LOCATION_LEFT_OUTSIDE 1
+#define PANEL_HWC_LOCATION_X 10:0
+
+#define PANEL_HWC_COLOR_12 0x0800F8
+#define PANEL_HWC_COLOR_12_2_RGB565 31:16
+#define PANEL_HWC_COLOR_12_1_RGB565 15:0
+
+#define PANEL_HWC_COLOR_3 0x0800FC
+#define PANEL_HWC_COLOR_3_RGB565 15:0
+
+/* Old Definitions +++ */
+#define PANEL_HWC_COLOR_01 0x0800F8
+#define PANEL_HWC_COLOR_01_1_RED 31:27
+#define PANEL_HWC_COLOR_01_1_GREEN 26:21
+#define PANEL_HWC_COLOR_01_1_BLUE 20:16
+#define PANEL_HWC_COLOR_01_0_RED 15:11
+#define PANEL_HWC_COLOR_01_0_GREEN 10:5
+#define PANEL_HWC_COLOR_01_0_BLUE 4:0
+
+#define PANEL_HWC_COLOR_2 0x0800FC
+#define PANEL_HWC_COLOR_2_RED 15:11
+#define PANEL_HWC_COLOR_2_GREEN 10:5
+#define PANEL_HWC_COLOR_2_BLUE 4:0
+/* Old Definitions --- */
+
+/* Alpha Control */
+
+#define ALPHA_DISPLAY_CTRL 0x080100
+#define ALPHA_DISPLAY_CTRL_SELECT 28:28
+#define ALPHA_DISPLAY_CTRL_SELECT_PER_PIXEL 0
+#define ALPHA_DISPLAY_CTRL_SELECT_ALPHA 1
+#define ALPHA_DISPLAY_CTRL_ALPHA 27:24
+#define ALPHA_DISPLAY_CTRL_FIFO 17:16
+#define ALPHA_DISPLAY_CTRL_FIFO_1 0
+#define ALPHA_DISPLAY_CTRL_FIFO_3 1
+#define ALPHA_DISPLAY_CTRL_FIFO_7 2
+#define ALPHA_DISPLAY_CTRL_FIFO_11 3
+#define ALPHA_DISPLAY_CTRL_PIXEL 7:4
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY 3:3
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY_DISABLE 0
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY_ENABLE 1
+#define ALPHA_DISPLAY_CTRL_PLANE 2:2
+#define ALPHA_DISPLAY_CTRL_PLANE_DISABLE 0
+#define ALPHA_DISPLAY_CTRL_PLANE_ENABLE 1
+#define ALPHA_DISPLAY_CTRL_FORMAT 1:0
+#define ALPHA_DISPLAY_CTRL_FORMAT_16 1
+#define ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4 2
+#define ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4_4_4 3
+
+#define ALPHA_FB_ADDRESS 0x080104
+#define ALPHA_FB_ADDRESS_STATUS 31:31
+#define ALPHA_FB_ADDRESS_STATUS_CURRENT 0
+#define ALPHA_FB_ADDRESS_STATUS_PENDING 1
+#define ALPHA_FB_ADDRESS_EXT 27:27
+#define ALPHA_FB_ADDRESS_EXT_LOCAL 0
+#define ALPHA_FB_ADDRESS_EXT_EXTERNAL 1
+#define ALPHA_FB_ADDRESS_ADDRESS 25:0
+
+#define ALPHA_FB_WIDTH 0x080108
+#define ALPHA_FB_WIDTH_WIDTH 29:16
+#define ALPHA_FB_WIDTH_OFFSET 13:0
+
+#define ALPHA_PLANE_TL 0x08010C
+#define ALPHA_PLANE_TL_TOP 26:16
+#define ALPHA_PLANE_TL_LEFT 10:0
+
+#define ALPHA_PLANE_BR 0x080110
+#define ALPHA_PLANE_BR_BOTTOM 26:16
+#define ALPHA_PLANE_BR_RIGHT 10:0
+
+#define ALPHA_CHROMA_KEY 0x080114
+#define ALPHA_CHROMA_KEY_MASK 31:16
+#define ALPHA_CHROMA_KEY_VALUE 15:0
+
+#define ALPHA_COLOR_LOOKUP_01 0x080118
+#define ALPHA_COLOR_LOOKUP_01_1 31:16
+#define ALPHA_COLOR_LOOKUP_01_1_RED 31:27
+#define ALPHA_COLOR_LOOKUP_01_1_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_01_1_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_01_0 15:0
+#define ALPHA_COLOR_LOOKUP_01_0_RED 15:11
+#define ALPHA_COLOR_LOOKUP_01_0_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_01_0_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_23 0x08011C
+#define ALPHA_COLOR_LOOKUP_23_3 31:16
+#define ALPHA_COLOR_LOOKUP_23_3_RED 31:27
+#define ALPHA_COLOR_LOOKUP_23_3_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_23_3_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_23_2 15:0
+#define ALPHA_COLOR_LOOKUP_23_2_RED 15:11
+#define ALPHA_COLOR_LOOKUP_23_2_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_23_2_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_45 0x080120
+#define ALPHA_COLOR_LOOKUP_45_5 31:16
+#define ALPHA_COLOR_LOOKUP_45_5_RED 31:27
+#define ALPHA_COLOR_LOOKUP_45_5_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_45_5_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_45_4 15:0
+#define ALPHA_COLOR_LOOKUP_45_4_RED 15:11
+#define ALPHA_COLOR_LOOKUP_45_4_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_45_4_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_67 0x080124
+#define ALPHA_COLOR_LOOKUP_67_7 31:16
+#define ALPHA_COLOR_LOOKUP_67_7_RED 31:27
+#define ALPHA_COLOR_LOOKUP_67_7_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_67_7_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_67_6 15:0
+#define ALPHA_COLOR_LOOKUP_67_6_RED 15:11
+#define ALPHA_COLOR_LOOKUP_67_6_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_67_6_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_89 0x080128
+#define ALPHA_COLOR_LOOKUP_89_9 31:16
+#define ALPHA_COLOR_LOOKUP_89_9_RED 31:27
+#define ALPHA_COLOR_LOOKUP_89_9_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_89_9_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_89_8 15:0
+#define ALPHA_COLOR_LOOKUP_89_8_RED 15:11
+#define ALPHA_COLOR_LOOKUP_89_8_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_89_8_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_AB 0x08012C
+#define ALPHA_COLOR_LOOKUP_AB_B 31:16
+#define ALPHA_COLOR_LOOKUP_AB_B_RED 31:27
+#define ALPHA_COLOR_LOOKUP_AB_B_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_AB_B_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_AB_A 15:0
+#define ALPHA_COLOR_LOOKUP_AB_A_RED 15:11
+#define ALPHA_COLOR_LOOKUP_AB_A_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_AB_A_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_CD 0x080130
+#define ALPHA_COLOR_LOOKUP_CD_D 31:16
+#define ALPHA_COLOR_LOOKUP_CD_D_RED 31:27
+#define ALPHA_COLOR_LOOKUP_CD_D_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_CD_D_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_CD_C 15:0
+#define ALPHA_COLOR_LOOKUP_CD_C_RED 15:11
+#define ALPHA_COLOR_LOOKUP_CD_C_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_CD_C_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_EF 0x080134
+#define ALPHA_COLOR_LOOKUP_EF_F 31:16
+#define ALPHA_COLOR_LOOKUP_EF_F_RED 31:27
+#define ALPHA_COLOR_LOOKUP_EF_F_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_EF_F_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_EF_E 15:0
+#define ALPHA_COLOR_LOOKUP_EF_E_RED 15:11
+#define ALPHA_COLOR_LOOKUP_EF_E_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_EF_E_BLUE 4:0
+
+/* CRT Graphics Control */
+
+#define CRT_DISPLAY_CTRL 0x080200
+#define CRT_DISPLAY_CTRL_RESERVED_1_MASK 31:27
+#define CRT_DISPLAY_CTRL_RESERVED_1_MASK_DISABLE 0
+#define CRT_DISPLAY_CTRL_RESERVED_1_MASK_ENABLE 0x1F
+
+/* SM750LE definition */
+#define CRT_DISPLAY_CTRL_DPMS 31:30
+#define CRT_DISPLAY_CTRL_DPMS_0 0
+#define CRT_DISPLAY_CTRL_DPMS_1 1
+#define CRT_DISPLAY_CTRL_DPMS_2 2
+#define CRT_DISPLAY_CTRL_DPMS_3 3
+#define CRT_DISPLAY_CTRL_CLK 29:27
+#define CRT_DISPLAY_CTRL_CLK_PLL25 0
+#define CRT_DISPLAY_CTRL_CLK_PLL41 1
+#define CRT_DISPLAY_CTRL_CLK_PLL62 2
+#define CRT_DISPLAY_CTRL_CLK_PLL65 3
+#define CRT_DISPLAY_CTRL_CLK_PLL74 4
+#define CRT_DISPLAY_CTRL_CLK_PLL80 5
+#define CRT_DISPLAY_CTRL_CLK_PLL108 6
+#define CRT_DISPLAY_CTRL_CLK_RESERVED 7
+#define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC 26:26
+#define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC_DISABLE 1
+#define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC_ENABLE 0
+
+
+#define CRT_DISPLAY_CTRL_RESERVED_2_MASK 25:24
+#define CRT_DISPLAY_CTRL_RESERVED_2_MASK_ENABLE 3
+#define CRT_DISPLAY_CTRL_RESERVED_2_MASK_DISABLE 0
+
+/* SM750LE definition */
+#define CRT_DISPLAY_CTRL_CRTSELECT 25:25
+#define CRT_DISPLAY_CTRL_CRTSELECT_VGA 0
+#define CRT_DISPLAY_CTRL_CRTSELECT_CRT 1
+#define CRT_DISPLAY_CTRL_RGBBIT 24:24
+#define CRT_DISPLAY_CTRL_RGBBIT_24BIT 0
+#define CRT_DISPLAY_CTRL_RGBBIT_12BIT 1
+
+
+#define CRT_DISPLAY_CTRL_RESERVED_3_MASK 15:15
+#define CRT_DISPLAY_CTRL_RESERVED_3_MASK_DISABLE 0
+#define CRT_DISPLAY_CTRL_RESERVED_3_MASK_ENABLE 1
+
+#define CRT_DISPLAY_CTRL_RESERVED_4_MASK 9:9
+#define CRT_DISPLAY_CTRL_RESERVED_4_MASK_DISABLE 0
+#define CRT_DISPLAY_CTRL_RESERVED_4_MASK_ENABLE 1
+
+#ifndef VALIDATION_CHIP
+ #define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC 26:26
+ #define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC_DISABLE 1
+ #define CRT_DISPLAY_CTRL_SHIFT_VGA_DAC_ENABLE 0
+ #define CRT_DISPLAY_CTRL_CENTERING 24:24
+ #define CRT_DISPLAY_CTRL_CENTERING_DISABLE 0
+ #define CRT_DISPLAY_CTRL_CENTERING_ENABLE 1
+#endif
+#define CRT_DISPLAY_CTRL_LOCK_TIMING 23:23
+#define CRT_DISPLAY_CTRL_LOCK_TIMING_DISABLE 0
+#define CRT_DISPLAY_CTRL_LOCK_TIMING_ENABLE 1
+#define CRT_DISPLAY_CTRL_EXPANSION 22:22
+#define CRT_DISPLAY_CTRL_EXPANSION_DISABLE 0
+#define CRT_DISPLAY_CTRL_EXPANSION_ENABLE 1
+#define CRT_DISPLAY_CTRL_VERTICAL_MODE 21:21
+#define CRT_DISPLAY_CTRL_VERTICAL_MODE_REPLICATE 0
+#define CRT_DISPLAY_CTRL_VERTICAL_MODE_INTERPOLATE 1
+#define CRT_DISPLAY_CTRL_HORIZONTAL_MODE 20:20
+#define CRT_DISPLAY_CTRL_HORIZONTAL_MODE_REPLICATE 0
+#define CRT_DISPLAY_CTRL_HORIZONTAL_MODE_INTERPOLATE 1
+#define CRT_DISPLAY_CTRL_SELECT 19:18
+#define CRT_DISPLAY_CTRL_SELECT_PANEL 0
+#define CRT_DISPLAY_CTRL_SELECT_VGA 1
+#define CRT_DISPLAY_CTRL_SELECT_CRT 2
+#define CRT_DISPLAY_CTRL_FIFO 17:16
+#define CRT_DISPLAY_CTRL_FIFO_1 0
+#define CRT_DISPLAY_CTRL_FIFO_3 1
+#define CRT_DISPLAY_CTRL_FIFO_7 2
+#define CRT_DISPLAY_CTRL_FIFO_11 3
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE 14:14
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE 13:13
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE 12:12
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_BLANK 10:10
+#define CRT_DISPLAY_CTRL_BLANK_OFF 0
+#define CRT_DISPLAY_CTRL_BLANK_ON 1
+#define CRT_DISPLAY_CTRL_TIMING 8:8
+#define CRT_DISPLAY_CTRL_TIMING_DISABLE 0
+#define CRT_DISPLAY_CTRL_TIMING_ENABLE 1
+#define CRT_DISPLAY_CTRL_PIXEL 7:4
+#define CRT_DISPLAY_CTRL_GAMMA 3:3
+#define CRT_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define CRT_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define CRT_DISPLAY_CTRL_PLANE 2:2
+#define CRT_DISPLAY_CTRL_PLANE_DISABLE 0
+#define CRT_DISPLAY_CTRL_PLANE_ENABLE 1
+#define CRT_DISPLAY_CTRL_FORMAT 1:0
+#define CRT_DISPLAY_CTRL_FORMAT_8 0
+#define CRT_DISPLAY_CTRL_FORMAT_16 1
+#define CRT_DISPLAY_CTRL_FORMAT_32 2
+#define CRT_DISPLAY_CTRL_RESERVED_BITS_MASK 0xFF000200
+
+#define CRT_FB_ADDRESS 0x080204
+#define CRT_FB_ADDRESS_STATUS 31:31
+#define CRT_FB_ADDRESS_STATUS_CURRENT 0
+#define CRT_FB_ADDRESS_STATUS_PENDING 1
+#define CRT_FB_ADDRESS_EXT 27:27
+#define CRT_FB_ADDRESS_EXT_LOCAL 0
+#define CRT_FB_ADDRESS_EXT_EXTERNAL 1
+#define CRT_FB_ADDRESS_ADDRESS 25:0
+
+#define CRT_FB_WIDTH 0x080208
+#define CRT_FB_WIDTH_WIDTH 29:16
+#define CRT_FB_WIDTH_OFFSET 13:0
+
+#define CRT_HORIZONTAL_TOTAL 0x08020C
+#define CRT_HORIZONTAL_TOTAL_TOTAL 27:16
+#define CRT_HORIZONTAL_TOTAL_DISPLAY_END 11:0
+
+#define CRT_HORIZONTAL_SYNC 0x080210
+#define CRT_HORIZONTAL_SYNC_WIDTH 23:16
+#define CRT_HORIZONTAL_SYNC_START 11:0
+
+#define CRT_VERTICAL_TOTAL 0x080214
+#define CRT_VERTICAL_TOTAL_TOTAL 26:16
+#define CRT_VERTICAL_TOTAL_DISPLAY_END 10:0
+
+#define CRT_VERTICAL_SYNC 0x080218
+#define CRT_VERTICAL_SYNC_HEIGHT 21:16
+#define CRT_VERTICAL_SYNC_START 10:0
+
+#define CRT_SIGNATURE_ANALYZER 0x08021C
+#define CRT_SIGNATURE_ANALYZER_STATUS 31:16
+#define CRT_SIGNATURE_ANALYZER_ENABLE 3:3
+#define CRT_SIGNATURE_ANALYZER_ENABLE_DISABLE 0
+#define CRT_SIGNATURE_ANALYZER_ENABLE_ENABLE 1
+#define CRT_SIGNATURE_ANALYZER_RESET 2:2
+#define CRT_SIGNATURE_ANALYZER_RESET_NORMAL 0
+#define CRT_SIGNATURE_ANALYZER_RESET_RESET 1
+#define CRT_SIGNATURE_ANALYZER_SOURCE 1:0
+#define CRT_SIGNATURE_ANALYZER_SOURCE_RED 0
+#define CRT_SIGNATURE_ANALYZER_SOURCE_GREEN 1
+#define CRT_SIGNATURE_ANALYZER_SOURCE_BLUE 2
+
+#define CRT_CURRENT_LINE 0x080220
+#define CRT_CURRENT_LINE_LINE 10:0
+
+#define CRT_MONITOR_DETECT 0x080224
+#define CRT_MONITOR_DETECT_VALUE 25:25
+#define CRT_MONITOR_DETECT_VALUE_DISABLE 0
+#define CRT_MONITOR_DETECT_VALUE_ENABLE 1
+#define CRT_MONITOR_DETECT_ENABLE 24:24
+#define CRT_MONITOR_DETECT_ENABLE_DISABLE 0
+#define CRT_MONITOR_DETECT_ENABLE_ENABLE 1
+#define CRT_MONITOR_DETECT_RED 23:16
+#define CRT_MONITOR_DETECT_GREEN 15:8
+#define CRT_MONITOR_DETECT_BLUE 7:0
+
+#define CRT_SCALE 0x080228
+#define CRT_SCALE_VERTICAL_MODE 31:31
+#define CRT_SCALE_VERTICAL_MODE_EXPAND 0
+#define CRT_SCALE_VERTICAL_MODE_SHRINK 1
+#define CRT_SCALE_VERTICAL_SCALE 27:16
+#define CRT_SCALE_HORIZONTAL_MODE 15:15
+#define CRT_SCALE_HORIZONTAL_MODE_EXPAND 0
+#define CRT_SCALE_HORIZONTAL_MODE_SHRINK 1
+#define CRT_SCALE_HORIZONTAL_SCALE 11:0
+
+/* CRT Cursor Control */
+
+#define CRT_HWC_ADDRESS 0x080230
+#define CRT_HWC_ADDRESS_ENABLE 31:31
+#define CRT_HWC_ADDRESS_ENABLE_DISABLE 0
+#define CRT_HWC_ADDRESS_ENABLE_ENABLE 1
+#define CRT_HWC_ADDRESS_EXT 27:27
+#define CRT_HWC_ADDRESS_EXT_LOCAL 0
+#define CRT_HWC_ADDRESS_EXT_EXTERNAL 1
+#define CRT_HWC_ADDRESS_ADDRESS 25:0
+
+#define CRT_HWC_LOCATION 0x080234
+#define CRT_HWC_LOCATION_TOP 27:27
+#define CRT_HWC_LOCATION_TOP_INSIDE 0
+#define CRT_HWC_LOCATION_TOP_OUTSIDE 1
+#define CRT_HWC_LOCATION_Y 26:16
+#define CRT_HWC_LOCATION_LEFT 11:11
+#define CRT_HWC_LOCATION_LEFT_INSIDE 0
+#define CRT_HWC_LOCATION_LEFT_OUTSIDE 1
+#define CRT_HWC_LOCATION_X 10:0
+
+#define CRT_HWC_COLOR_12 0x080238
+#define CRT_HWC_COLOR_12_2_RGB565 31:16
+#define CRT_HWC_COLOR_12_1_RGB565 15:0
+
+#define CRT_HWC_COLOR_3 0x08023C
+#define CRT_HWC_COLOR_3_RGB565 15:0
+
+/* Old Definitions +++. Need to be removed if no application use it. */
+#if 0
+ #define CRT_HWC_COLOR_01 0x080238
+ #define CRT_HWC_COLOR_01_1_RED 31:27
+ #define CRT_HWC_COLOR_01_1_GREEN 26:21
+ #define CRT_HWC_COLOR_01_1_BLUE 20:16
+ #define CRT_HWC_COLOR_01_0_RED 15:11
+ #define CRT_HWC_COLOR_01_0_GREEN 10:5
+ #define CRT_HWC_COLOR_01_0_BLUE 4:0
+
+ #define CRT_HWC_COLOR_2 0x08023C
+ #define CRT_HWC_COLOR_2_RED 15:11
+ #define CRT_HWC_COLOR_2_GREEN 10:5
+ #define CRT_HWC_COLOR_2_BLUE 4:0
+#endif
+/* Old Definitions --- */
+
+/* This vertical expansion below start at 0x080240 ~ 0x080264 */
+#define CRT_VERTICAL_EXPANSION 0x080240
+#ifndef VALIDATION_CHIP
+ #define CRT_VERTICAL_CENTERING_VALUE 31:24
+#endif
+#define CRT_VERTICAL_EXPANSION_COMPARE_VALUE 23:16
+#define CRT_VERTICAL_EXPANSION_LINE_BUFFER 15:12
+#define CRT_VERTICAL_EXPANSION_SCALE_FACTOR 11:0
+
+/* This horizontal expansion below start at 0x080268 ~ 0x08027C */
+#define CRT_HORIZONTAL_EXPANSION 0x080268
+#ifndef VALIDATION_CHIP
+ #define CRT_HORIZONTAL_CENTERING_VALUE 31:24
+#endif
+#define CRT_HORIZONTAL_EXPANSION_COMPARE_VALUE 23:16
+#define CRT_HORIZONTAL_EXPANSION_SCALE_FACTOR 11:0
+
+#ifndef VALIDATION_CHIP
+ /* Auto Centering */
+ #define CRT_AUTO_CENTERING_TL 0x080280
+ #define CRT_AUTO_CENTERING_TL_TOP 26:16
+ #define CRT_AUTO_CENTERING_TL_LEFT 10:0
+
+ #define CRT_AUTO_CENTERING_BR 0x080284
+ #define CRT_AUTO_CENTERING_BR_BOTTOM 26:16
+ #define CRT_AUTO_CENTERING_BR_RIGHT 10:0
+#endif
+
+/* sm750le new register to control panel output */
+#define DISPLAY_CONTROL_750LE 0x80288
+/* Palette RAM */
+
+/* Panel Pallete register starts at 0x080400 ~ 0x0807FC */
+#define PANEL_PALETTE_RAM 0x080400
+
+/* Panel Pallete register starts at 0x080C00 ~ 0x080FFC */
+#define CRT_PALETTE_RAM 0x080C00
+
+/* 2D registers
+ * move their defination into general lynx_accel.h file
+ * because all smi graphic chip share the same drawing engine
+ * register format */
+#if 0
+#define DE_SOURCE 0x100000
+#define DE_SOURCE_WRAP 31:31
+#define DE_SOURCE_WRAP_DISABLE 0
+#define DE_SOURCE_WRAP_ENABLE 1
+
+/*
+ * The following definitions are used in different setting
+ */
+
+/* Use these definitions in XY addressing mode or linear addressing mode. */
+#define DE_SOURCE_X_K1 27:16
+#define DE_SOURCE_Y_K2 11:0
+
+/* Use this definition in host write mode for mono. The Y_K2 is not used
+ in host write mode. */
+#define DE_SOURCE_X_K1_MONO 20:16
+
+/* Use these definitions in Bresenham line drawing mode. */
+#define DE_SOURCE_X_K1_LINE 29:16
+#define DE_SOURCE_Y_K2_LINE 13:0
+
+#define DE_DESTINATION 0x100004
+#define DE_DESTINATION_WRAP 31:31
+#define DE_DESTINATION_WRAP_DISABLE 0
+#define DE_DESTINATION_WRAP_ENABLE 1
+#if 1
+ #define DE_DESTINATION_X 27:16
+ #define DE_DESTINATION_Y 11:0
+#else
+ #define DE_DESTINATION_X 28:16
+ #define DE_DESTINATION_Y 15:0
+#endif
+
+#define DE_DIMENSION 0x100008
+#define DE_DIMENSION_X 28:16
+#define DE_DIMENSION_Y_ET 15:0
+
+#define DE_CONTROL 0x10000C
+#define DE_CONTROL_STATUS 31:31
+#define DE_CONTROL_STATUS_STOP 0
+#define DE_CONTROL_STATUS_START 1
+#define DE_CONTROL_PATTERN 30:30
+#define DE_CONTROL_PATTERN_MONO 0
+#define DE_CONTROL_PATTERN_COLOR 1
+#define DE_CONTROL_UPDATE_DESTINATION_X 29:29
+#define DE_CONTROL_UPDATE_DESTINATION_X_DISABLE 0
+#define DE_CONTROL_UPDATE_DESTINATION_X_ENABLE 1
+#define DE_CONTROL_QUICK_START 28:28
+#define DE_CONTROL_QUICK_START_DISABLE 0
+#define DE_CONTROL_QUICK_START_ENABLE 1
+#define DE_CONTROL_DIRECTION 27:27
+#define DE_CONTROL_DIRECTION_LEFT_TO_RIGHT 0
+#define DE_CONTROL_DIRECTION_RIGHT_TO_LEFT 1
+#define DE_CONTROL_MAJOR 26:26
+#define DE_CONTROL_MAJOR_X 0
+#define DE_CONTROL_MAJOR_Y 1
+#define DE_CONTROL_STEP_X 25:25
+#define DE_CONTROL_STEP_X_POSITIVE 0
+#define DE_CONTROL_STEP_X_NEGATIVE 1
+#define DE_CONTROL_STEP_Y 24:24
+#define DE_CONTROL_STEP_Y_POSITIVE 0
+#define DE_CONTROL_STEP_Y_NEGATIVE 1
+#define DE_CONTROL_STRETCH 23:23
+#define DE_CONTROL_STRETCH_DISABLE 0
+#define DE_CONTROL_STRETCH_ENABLE 1
+#define DE_CONTROL_HOST 22:22
+#define DE_CONTROL_HOST_COLOR 0
+#define DE_CONTROL_HOST_MONO 1
+#define DE_CONTROL_LAST_PIXEL 21:21
+#define DE_CONTROL_LAST_PIXEL_OFF 0
+#define DE_CONTROL_LAST_PIXEL_ON 1
+#define DE_CONTROL_COMMAND 20:16
+#define DE_CONTROL_COMMAND_BITBLT 0
+#define DE_CONTROL_COMMAND_RECTANGLE_FILL 1
+#define DE_CONTROL_COMMAND_DE_TILE 2
+#define DE_CONTROL_COMMAND_TRAPEZOID_FILL 3
+#define DE_CONTROL_COMMAND_ALPHA_BLEND 4
+#define DE_CONTROL_COMMAND_RLE_STRIP 5
+#define DE_CONTROL_COMMAND_SHORT_STROKE 6
+#define DE_CONTROL_COMMAND_LINE_DRAW 7
+#define DE_CONTROL_COMMAND_HOST_WRITE 8
+#define DE_CONTROL_COMMAND_HOST_READ 9
+#define DE_CONTROL_COMMAND_HOST_WRITE_BOTTOM_UP 10
+#define DE_CONTROL_COMMAND_ROTATE 11
+#define DE_CONTROL_COMMAND_FONT 12
+#define DE_CONTROL_COMMAND_TEXTURE_LOAD 15
+#define DE_CONTROL_ROP_SELECT 15:15
+#define DE_CONTROL_ROP_SELECT_ROP3 0
+#define DE_CONTROL_ROP_SELECT_ROP2 1
+#define DE_CONTROL_ROP2_SOURCE 14:14
+#define DE_CONTROL_ROP2_SOURCE_BITMAP 0
+#define DE_CONTROL_ROP2_SOURCE_PATTERN 1
+#define DE_CONTROL_MONO_DATA 13:12
+#define DE_CONTROL_MONO_DATA_NOT_PACKED 0
+#define DE_CONTROL_MONO_DATA_8_PACKED 1
+#define DE_CONTROL_MONO_DATA_16_PACKED 2
+#define DE_CONTROL_MONO_DATA_32_PACKED 3
+#define DE_CONTROL_REPEAT_ROTATE 11:11
+#define DE_CONTROL_REPEAT_ROTATE_DISABLE 0
+#define DE_CONTROL_REPEAT_ROTATE_ENABLE 1
+#define DE_CONTROL_TRANSPARENCY_MATCH 10:10
+#define DE_CONTROL_TRANSPARENCY_MATCH_OPAQUE 0
+#define DE_CONTROL_TRANSPARENCY_MATCH_TRANSPARENT 1
+#define DE_CONTROL_TRANSPARENCY_SELECT 9:9
+#define DE_CONTROL_TRANSPARENCY_SELECT_SOURCE 0
+#define DE_CONTROL_TRANSPARENCY_SELECT_DESTINATION 1
+#define DE_CONTROL_TRANSPARENCY 8:8
+#define DE_CONTROL_TRANSPARENCY_DISABLE 0
+#define DE_CONTROL_TRANSPARENCY_ENABLE 1
+#define DE_CONTROL_ROP 7:0
+
+/* Pseudo fields. */
+
+#define DE_CONTROL_SHORT_STROKE_DIR 27:24
+#define DE_CONTROL_SHORT_STROKE_DIR_225 0
+#define DE_CONTROL_SHORT_STROKE_DIR_135 1
+#define DE_CONTROL_SHORT_STROKE_DIR_315 2
+#define DE_CONTROL_SHORT_STROKE_DIR_45 3
+#define DE_CONTROL_SHORT_STROKE_DIR_270 4
+#define DE_CONTROL_SHORT_STROKE_DIR_90 5
+#define DE_CONTROL_SHORT_STROKE_DIR_180 8
+#define DE_CONTROL_SHORT_STROKE_DIR_0 10
+#define DE_CONTROL_ROTATION 25:24
+#define DE_CONTROL_ROTATION_0 0
+#define DE_CONTROL_ROTATION_270 1
+#define DE_CONTROL_ROTATION_90 2
+#define DE_CONTROL_ROTATION_180 3
+
+#define DE_PITCH 0x100010
+#define DE_PITCH_DESTINATION 28:16
+#define DE_PITCH_SOURCE 12:0
+
+#define DE_FOREGROUND 0x100014
+#define DE_FOREGROUND_COLOR 31:0
+
+#define DE_BACKGROUND 0x100018
+#define DE_BACKGROUND_COLOR 31:0
+
+#define DE_STRETCH_FORMAT 0x10001C
+#define DE_STRETCH_FORMAT_PATTERN_XY 30:30
+#define DE_STRETCH_FORMAT_PATTERN_XY_NORMAL 0
+#define DE_STRETCH_FORMAT_PATTERN_XY_OVERWRITE 1
+#define DE_STRETCH_FORMAT_PATTERN_Y 29:27
+#define DE_STRETCH_FORMAT_PATTERN_X 25:23
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT 21:20
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_8 0
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_16 1
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_32 2
+#define DE_STRETCH_FORMAT_ADDRESSING 19:16
+#define DE_STRETCH_FORMAT_ADDRESSING_XY 0
+#define DE_STRETCH_FORMAT_ADDRESSING_LINEAR 15
+#define DE_STRETCH_FORMAT_SOURCE_HEIGHT 11:0
+
+#define DE_COLOR_COMPARE 0x100020
+#define DE_COLOR_COMPARE_COLOR 23:0
+
+#define DE_COLOR_COMPARE_MASK 0x100024
+#define DE_COLOR_COMPARE_MASK_MASKS 23:0
+
+#define DE_MASKS 0x100028
+#define DE_MASKS_BYTE_MASK 31:16
+#define DE_MASKS_BIT_MASK 15:0
+
+#define DE_CLIP_TL 0x10002C
+#define DE_CLIP_TL_TOP 31:16
+#define DE_CLIP_TL_STATUS 13:13
+#define DE_CLIP_TL_STATUS_DISABLE 0
+#define DE_CLIP_TL_STATUS_ENABLE 1
+#define DE_CLIP_TL_INHIBIT 12:12
+#define DE_CLIP_TL_INHIBIT_OUTSIDE 0
+#define DE_CLIP_TL_INHIBIT_INSIDE 1
+#define DE_CLIP_TL_LEFT 11:0
+
+#define DE_CLIP_BR 0x100030
+#define DE_CLIP_BR_BOTTOM 31:16
+#define DE_CLIP_BR_RIGHT 12:0
+
+#define DE_MONO_PATTERN_LOW 0x100034
+#define DE_MONO_PATTERN_LOW_PATTERN 31:0
+
+#define DE_MONO_PATTERN_HIGH 0x100038
+#define DE_MONO_PATTERN_HIGH_PATTERN 31:0
+
+#define DE_WINDOW_WIDTH 0x10003C
+#define DE_WINDOW_WIDTH_DESTINATION 28:16
+#define DE_WINDOW_WIDTH_SOURCE 12:0
+
+#define DE_WINDOW_SOURCE_BASE 0x100040
+#define DE_WINDOW_SOURCE_BASE_EXT 27:27
+#define DE_WINDOW_SOURCE_BASE_EXT_LOCAL 0
+#define DE_WINDOW_SOURCE_BASE_EXT_EXTERNAL 1
+#define DE_WINDOW_SOURCE_BASE_CS 26:26
+#define DE_WINDOW_SOURCE_BASE_CS_0 0
+#define DE_WINDOW_SOURCE_BASE_CS_1 1
+#define DE_WINDOW_SOURCE_BASE_ADDRESS 25:0
+
+#define DE_WINDOW_DESTINATION_BASE 0x100044
+#define DE_WINDOW_DESTINATION_BASE_EXT 27:27
+#define DE_WINDOW_DESTINATION_BASE_EXT_LOCAL 0
+#define DE_WINDOW_DESTINATION_BASE_EXT_EXTERNAL 1
+#define DE_WINDOW_DESTINATION_BASE_CS 26:26
+#define DE_WINDOW_DESTINATION_BASE_CS_0 0
+#define DE_WINDOW_DESTINATION_BASE_CS_1 1
+#define DE_WINDOW_DESTINATION_BASE_ADDRESS 25:0
+
+#define DE_ALPHA 0x100048
+#define DE_ALPHA_VALUE 7:0
+
+#define DE_WRAP 0x10004C
+#define DE_WRAP_X 31:16
+#define DE_WRAP_Y 15:0
+
+#define DE_STATUS 0x100050
+#define DE_STATUS_CSC 1:1
+#define DE_STATUS_CSC_CLEAR 0
+#define DE_STATUS_CSC_NOT_ACTIVE 0
+#define DE_STATUS_CSC_ACTIVE 1
+#define DE_STATUS_2D 0:0
+#define DE_STATUS_2D_CLEAR 0
+#define DE_STATUS_2D_NOT_ACTIVE 0
+#define DE_STATUS_2D_ACTIVE 1
+#endif
+/* Color Space Conversion registers. */
+
+#define CSC_Y_SOURCE_BASE 0x1000C8
+#define CSC_Y_SOURCE_BASE_EXT 27:27
+#define CSC_Y_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_Y_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_Y_SOURCE_BASE_CS 26:26
+#define CSC_Y_SOURCE_BASE_CS_0 0
+#define CSC_Y_SOURCE_BASE_CS_1 1
+#define CSC_Y_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_CONSTANTS 0x1000CC
+#define CSC_CONSTANTS_Y 31:24
+#define CSC_CONSTANTS_R 23:16
+#define CSC_CONSTANTS_G 15:8
+#define CSC_CONSTANTS_B 7:0
+
+#define CSC_Y_SOURCE_X 0x1000D0
+#define CSC_Y_SOURCE_X_INTEGER 26:16
+#define CSC_Y_SOURCE_X_FRACTION 15:3
+
+#define CSC_Y_SOURCE_Y 0x1000D4
+#define CSC_Y_SOURCE_Y_INTEGER 27:16
+#define CSC_Y_SOURCE_Y_FRACTION 15:3
+
+#define CSC_U_SOURCE_BASE 0x1000D8
+#define CSC_U_SOURCE_BASE_EXT 27:27
+#define CSC_U_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_U_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_U_SOURCE_BASE_CS 26:26
+#define CSC_U_SOURCE_BASE_CS_0 0
+#define CSC_U_SOURCE_BASE_CS_1 1
+#define CSC_U_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_V_SOURCE_BASE 0x1000DC
+#define CSC_V_SOURCE_BASE_EXT 27:27
+#define CSC_V_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_V_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_V_SOURCE_BASE_CS 26:26
+#define CSC_V_SOURCE_BASE_CS_0 0
+#define CSC_V_SOURCE_BASE_CS_1 1
+#define CSC_V_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_SOURCE_DIMENSION 0x1000E0
+#define CSC_SOURCE_DIMENSION_X 31:16
+#define CSC_SOURCE_DIMENSION_Y 15:0
+
+#define CSC_SOURCE_PITCH 0x1000E4
+#define CSC_SOURCE_PITCH_Y 31:16
+#define CSC_SOURCE_PITCH_UV 15:0
+
+#define CSC_DESTINATION 0x1000E8
+#define CSC_DESTINATION_WRAP 31:31
+#define CSC_DESTINATION_WRAP_DISABLE 0
+#define CSC_DESTINATION_WRAP_ENABLE 1
+#define CSC_DESTINATION_X 27:16
+#define CSC_DESTINATION_Y 11:0
+
+#define CSC_DESTINATION_DIMENSION 0x1000EC
+#define CSC_DESTINATION_DIMENSION_X 31:16
+#define CSC_DESTINATION_DIMENSION_Y 15:0
+
+#define CSC_DESTINATION_PITCH 0x1000F0
+#define CSC_DESTINATION_PITCH_X 31:16
+#define CSC_DESTINATION_PITCH_Y 15:0
+
+#define CSC_SCALE_FACTOR 0x1000F4
+#define CSC_SCALE_FACTOR_HORIZONTAL 31:16
+#define CSC_SCALE_FACTOR_VERTICAL 15:0
+
+#define CSC_DESTINATION_BASE 0x1000F8
+#define CSC_DESTINATION_BASE_EXT 27:27
+#define CSC_DESTINATION_BASE_EXT_LOCAL 0
+#define CSC_DESTINATION_BASE_EXT_EXTERNAL 1
+#define CSC_DESTINATION_BASE_CS 26:26
+#define CSC_DESTINATION_BASE_CS_0 0
+#define CSC_DESTINATION_BASE_CS_1 1
+#define CSC_DESTINATION_BASE_ADDRESS 25:0
+
+#define CSC_CONTROL 0x1000FC
+#define CSC_CONTROL_STATUS 31:31
+#define CSC_CONTROL_STATUS_STOP 0
+#define CSC_CONTROL_STATUS_START 1
+#define CSC_CONTROL_SOURCE_FORMAT 30:28
+#define CSC_CONTROL_SOURCE_FORMAT_YUV422 0
+#define CSC_CONTROL_SOURCE_FORMAT_YUV420I 1
+#define CSC_CONTROL_SOURCE_FORMAT_YUV420 2
+#define CSC_CONTROL_SOURCE_FORMAT_YVU9 3
+#define CSC_CONTROL_SOURCE_FORMAT_IYU1 4
+#define CSC_CONTROL_SOURCE_FORMAT_IYU2 5
+#define CSC_CONTROL_SOURCE_FORMAT_RGB565 6
+#define CSC_CONTROL_SOURCE_FORMAT_RGB8888 7
+#define CSC_CONTROL_DESTINATION_FORMAT 27:26
+#define CSC_CONTROL_DESTINATION_FORMAT_RGB565 0
+#define CSC_CONTROL_DESTINATION_FORMAT_RGB8888 1
+#define CSC_CONTROL_HORIZONTAL_FILTER 25:25
+#define CSC_CONTROL_HORIZONTAL_FILTER_DISABLE 0
+#define CSC_CONTROL_HORIZONTAL_FILTER_ENABLE 1
+#define CSC_CONTROL_VERTICAL_FILTER 24:24
+#define CSC_CONTROL_VERTICAL_FILTER_DISABLE 0
+#define CSC_CONTROL_VERTICAL_FILTER_ENABLE 1
+#define CSC_CONTROL_BYTE_ORDER 23:23
+#define CSC_CONTROL_BYTE_ORDER_YUYV 0
+#define CSC_CONTROL_BYTE_ORDER_UYVY 1
+
+#define DE_DATA_PORT 0x110000
+
+#define I2C_BYTE_COUNT 0x010040
+#define I2C_BYTE_COUNT_COUNT 3:0
+
+#define I2C_CTRL 0x010041
+#define I2C_CTRL_INT 4:4
+#define I2C_CTRL_INT_DISABLE 0
+#define I2C_CTRL_INT_ENABLE 1
+#define I2C_CTRL_DIR 3:3
+#define I2C_CTRL_DIR_WR 0
+#define I2C_CTRL_DIR_RD 1
+#define I2C_CTRL_CTRL 2:2
+#define I2C_CTRL_CTRL_STOP 0
+#define I2C_CTRL_CTRL_START 1
+#define I2C_CTRL_MODE 1:1
+#define I2C_CTRL_MODE_STANDARD 0
+#define I2C_CTRL_MODE_FAST 1
+#define I2C_CTRL_EN 0:0
+#define I2C_CTRL_EN_DISABLE 0
+#define I2C_CTRL_EN_ENABLE 1
+
+#define I2C_STATUS 0x010042
+#define I2C_STATUS_TX 3:3
+#define I2C_STATUS_TX_PROGRESS 0
+#define I2C_STATUS_TX_COMPLETED 1
+#define I2C_TX_DONE 0x08
+#define I2C_STATUS_ERR 2:2
+#define I2C_STATUS_ERR_NORMAL 0
+#define I2C_STATUS_ERR_ERROR 1
+#define I2C_STATUS_ERR_CLEAR 0
+#define I2C_STATUS_ACK 1:1
+#define I2C_STATUS_ACK_RECEIVED 0
+#define I2C_STATUS_ACK_NOT 1
+#define I2C_STATUS_BSY 0:0
+#define I2C_STATUS_BSY_IDLE 0
+#define I2C_STATUS_BSY_BUSY 1
+
+#define I2C_RESET 0x010042
+#define I2C_RESET_BUS_ERROR 2:2
+#define I2C_RESET_BUS_ERROR_CLEAR 0
+
+#define I2C_SLAVE_ADDRESS 0x010043
+#define I2C_SLAVE_ADDRESS_ADDRESS 7:1
+#define I2C_SLAVE_ADDRESS_RW 0:0
+#define I2C_SLAVE_ADDRESS_RW_W 0
+#define I2C_SLAVE_ADDRESS_RW_R 1
+
+#define I2C_DATA0 0x010044
+#define I2C_DATA1 0x010045
+#define I2C_DATA2 0x010046
+#define I2C_DATA3 0x010047
+#define I2C_DATA4 0x010048
+#define I2C_DATA5 0x010049
+#define I2C_DATA6 0x01004A
+#define I2C_DATA7 0x01004B
+#define I2C_DATA8 0x01004C
+#define I2C_DATA9 0x01004D
+#define I2C_DATA10 0x01004E
+#define I2C_DATA11 0x01004F
+#define I2C_DATA12 0x010050
+#define I2C_DATA13 0x010051
+#define I2C_DATA14 0x010052
+#define I2C_DATA15 0x010053
+
+
+#define ZV0_CAPTURE_CTRL 0x090000
+#define ZV0_CAPTURE_CTRL_FIELD_INPUT 27:27
+#define ZV0_CAPTURE_CTRL_FIELD_INPUT_EVEN_FIELD 0
+#define ZV0_CAPTURE_CTRL_FIELD_INPUT_ODD_FIELD 1
+#define ZV0_CAPTURE_CTRL_SCAN 26:26
+#define ZV0_CAPTURE_CTRL_SCAN_PROGRESSIVE 0
+#define ZV0_CAPTURE_CTRL_SCAN_INTERLACE 1
+#define ZV0_CAPTURE_CTRL_CURRENT_BUFFER 25:25
+#define ZV0_CAPTURE_CTRL_CURRENT_BUFFER_0 0
+#define ZV0_CAPTURE_CTRL_CURRENT_BUFFER_1 1
+#define ZV0_CAPTURE_CTRL_VERTICAL_SYNC 24:24
+#define ZV0_CAPTURE_CTRL_VERTICAL_SYNC_INACTIVE 0
+#define ZV0_CAPTURE_CTRL_VERTICAL_SYNC_ACTIVE 1
+#define ZV0_CAPTURE_CTRL_ADJ 19:19
+#define ZV0_CAPTURE_CTRL_ADJ_NORMAL 0
+#define ZV0_CAPTURE_CTRL_ADJ_DELAY 1
+#define ZV0_CAPTURE_CTRL_HA 18:18
+#define ZV0_CAPTURE_CTRL_HA_DISABLE 0
+#define ZV0_CAPTURE_CTRL_HA_ENABLE 1
+#define ZV0_CAPTURE_CTRL_VSK 17:17
+#define ZV0_CAPTURE_CTRL_VSK_DISABLE 0
+#define ZV0_CAPTURE_CTRL_VSK_ENABLE 1
+#define ZV0_CAPTURE_CTRL_HSK 16:16
+#define ZV0_CAPTURE_CTRL_HSK_DISABLE 0
+#define ZV0_CAPTURE_CTRL_HSK_ENABLE 1
+#define ZV0_CAPTURE_CTRL_FD 15:15
+#define ZV0_CAPTURE_CTRL_FD_RISING 0
+#define ZV0_CAPTURE_CTRL_FD_FALLING 1
+#define ZV0_CAPTURE_CTRL_VP 14:14
+#define ZV0_CAPTURE_CTRL_VP_HIGH 0
+#define ZV0_CAPTURE_CTRL_VP_LOW 1
+#define ZV0_CAPTURE_CTRL_HP 13:13
+#define ZV0_CAPTURE_CTRL_HP_HIGH 0
+#define ZV0_CAPTURE_CTRL_HP_LOW 1
+#define ZV0_CAPTURE_CTRL_CP 12:12
+#define ZV0_CAPTURE_CTRL_CP_HIGH 0
+#define ZV0_CAPTURE_CTRL_CP_LOW 1
+#define ZV0_CAPTURE_CTRL_UVS 11:11
+#define ZV0_CAPTURE_CTRL_UVS_DISABLE 0
+#define ZV0_CAPTURE_CTRL_UVS_ENABLE 1
+#define ZV0_CAPTURE_CTRL_BS 10:10
+#define ZV0_CAPTURE_CTRL_BS_DISABLE 0
+#define ZV0_CAPTURE_CTRL_BS_ENABLE 1
+#define ZV0_CAPTURE_CTRL_CS 9:9
+#define ZV0_CAPTURE_CTRL_CS_16 0
+#define ZV0_CAPTURE_CTRL_CS_8 1
+#define ZV0_CAPTURE_CTRL_CF 8:8
+#define ZV0_CAPTURE_CTRL_CF_YUV 0
+#define ZV0_CAPTURE_CTRL_CF_RGB 1
+#define ZV0_CAPTURE_CTRL_FS 7:7
+#define ZV0_CAPTURE_CTRL_FS_DISABLE 0
+#define ZV0_CAPTURE_CTRL_FS_ENABLE 1
+#define ZV0_CAPTURE_CTRL_WEAVE 6:6
+#define ZV0_CAPTURE_CTRL_WEAVE_DISABLE 0
+#define ZV0_CAPTURE_CTRL_WEAVE_ENABLE 1
+#define ZV0_CAPTURE_CTRL_BOB 5:5
+#define ZV0_CAPTURE_CTRL_BOB_DISABLE 0
+#define ZV0_CAPTURE_CTRL_BOB_ENABLE 1
+#define ZV0_CAPTURE_CTRL_DB 4:4
+#define ZV0_CAPTURE_CTRL_DB_DISABLE 0
+#define ZV0_CAPTURE_CTRL_DB_ENABLE 1
+#define ZV0_CAPTURE_CTRL_CC 3:3
+#define ZV0_CAPTURE_CTRL_CC_CONTINUE 0
+#define ZV0_CAPTURE_CTRL_CC_CONDITION 1
+#define ZV0_CAPTURE_CTRL_RGB 2:2
+#define ZV0_CAPTURE_CTRL_RGB_DISABLE 0
+#define ZV0_CAPTURE_CTRL_RGB_ENABLE 1
+#define ZV0_CAPTURE_CTRL_656 1:1
+#define ZV0_CAPTURE_CTRL_656_DISABLE 0
+#define ZV0_CAPTURE_CTRL_656_ENABLE 1
+#define ZV0_CAPTURE_CTRL_CAP 0:0
+#define ZV0_CAPTURE_CTRL_CAP_DISABLE 0
+#define ZV0_CAPTURE_CTRL_CAP_ENABLE 1
+
+#define ZV0_CAPTURE_CLIP 0x090004
+#define ZV0_CAPTURE_CLIP_YCLIP_EVEN_FIELD 25:16
+#define ZV0_CAPTURE_CLIP_YCLIP 25:16
+#define ZV0_CAPTURE_CLIP_XCLIP 9:0
+
+#define ZV0_CAPTURE_SIZE 0x090008
+#define ZV0_CAPTURE_SIZE_HEIGHT 26:16
+#define ZV0_CAPTURE_SIZE_WIDTH 10:0
+
+#define ZV0_CAPTURE_BUF0_ADDRESS 0x09000C
+#define ZV0_CAPTURE_BUF0_ADDRESS_STATUS 31:31
+#define ZV0_CAPTURE_BUF0_ADDRESS_STATUS_CURRENT 0
+#define ZV0_CAPTURE_BUF0_ADDRESS_STATUS_PENDING 1
+#define ZV0_CAPTURE_BUF0_ADDRESS_EXT 27:27
+#define ZV0_CAPTURE_BUF0_ADDRESS_EXT_LOCAL 0
+#define ZV0_CAPTURE_BUF0_ADDRESS_EXT_EXTERNAL 1
+#define ZV0_CAPTURE_BUF0_ADDRESS_CS 26:26
+#define ZV0_CAPTURE_BUF0_ADDRESS_CS_0 0
+#define ZV0_CAPTURE_BUF0_ADDRESS_CS_1 1
+#define ZV0_CAPTURE_BUF0_ADDRESS_ADDRESS 25:0
+
+#define ZV0_CAPTURE_BUF1_ADDRESS 0x090010
+#define ZV0_CAPTURE_BUF1_ADDRESS_STATUS 31:31
+#define ZV0_CAPTURE_BUF1_ADDRESS_STATUS_CURRENT 0
+#define ZV0_CAPTURE_BUF1_ADDRESS_STATUS_PENDING 1
+#define ZV0_CAPTURE_BUF1_ADDRESS_EXT 27:27
+#define ZV0_CAPTURE_BUF1_ADDRESS_EXT_LOCAL 0
+#define ZV0_CAPTURE_BUF1_ADDRESS_EXT_EXTERNAL 1
+#define ZV0_CAPTURE_BUF1_ADDRESS_CS 26:26
+#define ZV0_CAPTURE_BUF1_ADDRESS_CS_0 0
+#define ZV0_CAPTURE_BUF1_ADDRESS_CS_1 1
+#define ZV0_CAPTURE_BUF1_ADDRESS_ADDRESS 25:0
+
+#define ZV0_CAPTURE_BUF_OFFSET 0x090014
+#ifndef VALIDATION_CHIP
+ #define ZV0_CAPTURE_BUF_OFFSET_YCLIP_ODD_FIELD 25:16
+#endif
+#define ZV0_CAPTURE_BUF_OFFSET_OFFSET 15:0
+
+#define ZV0_CAPTURE_FIFO_CTRL 0x090018
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO 2:0
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_0 0
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_1 1
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_2 2
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_3 3
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_4 4
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_5 5
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_6 6
+#define ZV0_CAPTURE_FIFO_CTRL_FIFO_7 7
+
+#define ZV0_CAPTURE_YRGB_CONST 0x09001C
+#define ZV0_CAPTURE_YRGB_CONST_Y 31:24
+#define ZV0_CAPTURE_YRGB_CONST_R 23:16
+#define ZV0_CAPTURE_YRGB_CONST_G 15:8
+#define ZV0_CAPTURE_YRGB_CONST_B 7:0
+
+#define ZV0_CAPTURE_LINE_COMP 0x090020
+#define ZV0_CAPTURE_LINE_COMP_LC 10:0
+
+/* ZV1 */
+
+#define ZV1_CAPTURE_CTRL 0x098000
+#define ZV1_CAPTURE_CTRL_FIELD_INPUT 27:27
+#define ZV1_CAPTURE_CTRL_FIELD_INPUT_EVEN_FIELD 0
+#define ZV1_CAPTURE_CTRL_FIELD_INPUT_ODD_FIELD 0
+#define ZV1_CAPTURE_CTRL_SCAN 26:26
+#define ZV1_CAPTURE_CTRL_SCAN_PROGRESSIVE 0
+#define ZV1_CAPTURE_CTRL_SCAN_INTERLACE 1
+#define ZV1_CAPTURE_CTRL_CURRENT_BUFFER 25:25
+#define ZV1_CAPTURE_CTRL_CURRENT_BUFFER_0 0
+#define ZV1_CAPTURE_CTRL_CURRENT_BUFFER_1 1
+#define ZV1_CAPTURE_CTRL_VERTICAL_SYNC 24:24
+#define ZV1_CAPTURE_CTRL_VERTICAL_SYNC_INACTIVE 0
+#define ZV1_CAPTURE_CTRL_VERTICAL_SYNC_ACTIVE 1
+#define ZV1_CAPTURE_CTRL_PANEL 20:20
+#define ZV1_CAPTURE_CTRL_PANEL_DISABLE 0
+#define ZV1_CAPTURE_CTRL_PANEL_ENABLE 1
+#define ZV1_CAPTURE_CTRL_ADJ 19:19
+#define ZV1_CAPTURE_CTRL_ADJ_NORMAL 0
+#define ZV1_CAPTURE_CTRL_ADJ_DELAY 1
+#define ZV1_CAPTURE_CTRL_HA 18:18
+#define ZV1_CAPTURE_CTRL_HA_DISABLE 0
+#define ZV1_CAPTURE_CTRL_HA_ENABLE 1
+#define ZV1_CAPTURE_CTRL_VSK 17:17
+#define ZV1_CAPTURE_CTRL_VSK_DISABLE 0
+#define ZV1_CAPTURE_CTRL_VSK_ENABLE 1
+#define ZV1_CAPTURE_CTRL_HSK 16:16
+#define ZV1_CAPTURE_CTRL_HSK_DISABLE 0
+#define ZV1_CAPTURE_CTRL_HSK_ENABLE 1
+#define ZV1_CAPTURE_CTRL_FD 15:15
+#define ZV1_CAPTURE_CTRL_FD_RISING 0
+#define ZV1_CAPTURE_CTRL_FD_FALLING 1
+#define ZV1_CAPTURE_CTRL_VP 14:14
+#define ZV1_CAPTURE_CTRL_VP_HIGH 0
+#define ZV1_CAPTURE_CTRL_VP_LOW 1
+#define ZV1_CAPTURE_CTRL_HP 13:13
+#define ZV1_CAPTURE_CTRL_HP_HIGH 0
+#define ZV1_CAPTURE_CTRL_HP_LOW 1
+#define ZV1_CAPTURE_CTRL_CP 12:12
+#define ZV1_CAPTURE_CTRL_CP_HIGH 0
+#define ZV1_CAPTURE_CTRL_CP_LOW 1
+#define ZV1_CAPTURE_CTRL_UVS 11:11
+#define ZV1_CAPTURE_CTRL_UVS_DISABLE 0
+#define ZV1_CAPTURE_CTRL_UVS_ENABLE 1
+#define ZV1_CAPTURE_CTRL_BS 10:10
+#define ZV1_CAPTURE_CTRL_BS_DISABLE 0
+#define ZV1_CAPTURE_CTRL_BS_ENABLE 1
+#define ZV1_CAPTURE_CTRL_CS 9:9
+#define ZV1_CAPTURE_CTRL_CS_16 0
+#define ZV1_CAPTURE_CTRL_CS_8 1
+#define ZV1_CAPTURE_CTRL_CF 8:8
+#define ZV1_CAPTURE_CTRL_CF_YUV 0
+#define ZV1_CAPTURE_CTRL_CF_RGB 1
+#define ZV1_CAPTURE_CTRL_FS 7:7
+#define ZV1_CAPTURE_CTRL_FS_DISABLE 0
+#define ZV1_CAPTURE_CTRL_FS_ENABLE 1
+#define ZV1_CAPTURE_CTRL_WEAVE 6:6
+#define ZV1_CAPTURE_CTRL_WEAVE_DISABLE 0
+#define ZV1_CAPTURE_CTRL_WEAVE_ENABLE 1
+#define ZV1_CAPTURE_CTRL_BOB 5:5
+#define ZV1_CAPTURE_CTRL_BOB_DISABLE 0
+#define ZV1_CAPTURE_CTRL_BOB_ENABLE 1
+#define ZV1_CAPTURE_CTRL_DB 4:4
+#define ZV1_CAPTURE_CTRL_DB_DISABLE 0
+#define ZV1_CAPTURE_CTRL_DB_ENABLE 1
+#define ZV1_CAPTURE_CTRL_CC 3:3
+#define ZV1_CAPTURE_CTRL_CC_CONTINUE 0
+#define ZV1_CAPTURE_CTRL_CC_CONDITION 1
+#define ZV1_CAPTURE_CTRL_RGB 2:2
+#define ZV1_CAPTURE_CTRL_RGB_DISABLE 0
+#define ZV1_CAPTURE_CTRL_RGB_ENABLE 1
+#define ZV1_CAPTURE_CTRL_656 1:1
+#define ZV1_CAPTURE_CTRL_656_DISABLE 0
+#define ZV1_CAPTURE_CTRL_656_ENABLE 1
+#define ZV1_CAPTURE_CTRL_CAP 0:0
+#define ZV1_CAPTURE_CTRL_CAP_DISABLE 0
+#define ZV1_CAPTURE_CTRL_CAP_ENABLE 1
+
+#define ZV1_CAPTURE_CLIP 0x098004
+#define ZV1_CAPTURE_CLIP_YCLIP 25:16
+#define ZV1_CAPTURE_CLIP_XCLIP 9:0
+
+#define ZV1_CAPTURE_SIZE 0x098008
+#define ZV1_CAPTURE_SIZE_HEIGHT 26:16
+#define ZV1_CAPTURE_SIZE_WIDTH 10:0
+
+#define ZV1_CAPTURE_BUF0_ADDRESS 0x09800C
+#define ZV1_CAPTURE_BUF0_ADDRESS_STATUS 31:31
+#define ZV1_CAPTURE_BUF0_ADDRESS_STATUS_CURRENT 0
+#define ZV1_CAPTURE_BUF0_ADDRESS_STATUS_PENDING 1
+#define ZV1_CAPTURE_BUF0_ADDRESS_EXT 27:27
+#define ZV1_CAPTURE_BUF0_ADDRESS_EXT_LOCAL 0
+#define ZV1_CAPTURE_BUF0_ADDRESS_EXT_EXTERNAL 1
+#define ZV1_CAPTURE_BUF0_ADDRESS_CS 26:26
+#define ZV1_CAPTURE_BUF0_ADDRESS_CS_0 0
+#define ZV1_CAPTURE_BUF0_ADDRESS_CS_1 1
+#define ZV1_CAPTURE_BUF0_ADDRESS_ADDRESS 25:0
+
+#define ZV1_CAPTURE_BUF1_ADDRESS 0x098010
+#define ZV1_CAPTURE_BUF1_ADDRESS_STATUS 31:31
+#define ZV1_CAPTURE_BUF1_ADDRESS_STATUS_CURRENT 0
+#define ZV1_CAPTURE_BUF1_ADDRESS_STATUS_PENDING 1
+#define ZV1_CAPTURE_BUF1_ADDRESS_EXT 27:27
+#define ZV1_CAPTURE_BUF1_ADDRESS_EXT_LOCAL 0
+#define ZV1_CAPTURE_BUF1_ADDRESS_EXT_EXTERNAL 1
+#define ZV1_CAPTURE_BUF1_ADDRESS_CS 26:26
+#define ZV1_CAPTURE_BUF1_ADDRESS_CS_0 0
+#define ZV1_CAPTURE_BUF1_ADDRESS_CS_1 1
+#define ZV1_CAPTURE_BUF1_ADDRESS_ADDRESS 25:0
+
+#define ZV1_CAPTURE_BUF_OFFSET 0x098014
+#define ZV1_CAPTURE_BUF_OFFSET_OFFSET 15:0
+
+#define ZV1_CAPTURE_FIFO_CTRL 0x098018
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO 2:0
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_0 0
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_1 1
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_2 2
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_3 3
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_4 4
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_5 5
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_6 6
+#define ZV1_CAPTURE_FIFO_CTRL_FIFO_7 7
+
+#define ZV1_CAPTURE_YRGB_CONST 0x09801C
+#define ZV1_CAPTURE_YRGB_CONST_Y 31:24
+#define ZV1_CAPTURE_YRGB_CONST_R 23:16
+#define ZV1_CAPTURE_YRGB_CONST_G 15:8
+#define ZV1_CAPTURE_YRGB_CONST_B 7:0
+
+#define DMA_1_SOURCE 0x0D0010
+#define DMA_1_SOURCE_ADDRESS_EXT 27:27
+#define DMA_1_SOURCE_ADDRESS_EXT_LOCAL 0
+#define DMA_1_SOURCE_ADDRESS_EXT_EXTERNAL 1
+#define DMA_1_SOURCE_ADDRESS_CS 26:26
+#define DMA_1_SOURCE_ADDRESS_CS_0 0
+#define DMA_1_SOURCE_ADDRESS_CS_1 1
+#define DMA_1_SOURCE_ADDRESS 25:0
+
+#define DMA_1_DESTINATION 0x0D0014
+#define DMA_1_DESTINATION_ADDRESS_EXT 27:27
+#define DMA_1_DESTINATION_ADDRESS_EXT_LOCAL 0
+#define DMA_1_DESTINATION_ADDRESS_EXT_EXTERNAL 1
+#define DMA_1_DESTINATION_ADDRESS_CS 26:26
+#define DMA_1_DESTINATION_ADDRESS_CS_0 0
+#define DMA_1_DESTINATION_ADDRESS_CS_1 1
+#define DMA_1_DESTINATION_ADDRESS 25:0
+
+#define DMA_1_SIZE_CONTROL 0x0D0018
+#define DMA_1_SIZE_CONTROL_STATUS 31:31
+#define DMA_1_SIZE_CONTROL_STATUS_IDLE 0
+#define DMA_1_SIZE_CONTROL_STATUS_ACTIVE 1
+#define DMA_1_SIZE_CONTROL_SIZE 23:0
+
+#define DMA_ABORT_INTERRUPT 0x0D0020
+#define DMA_ABORT_INTERRUPT_ABORT_1 5:5
+#define DMA_ABORT_INTERRUPT_ABORT_1_ENABLE 0
+#define DMA_ABORT_INTERRUPT_ABORT_1_ABORT 1
+#define DMA_ABORT_INTERRUPT_ABORT_0 4:4
+#define DMA_ABORT_INTERRUPT_ABORT_0_ENABLE 0
+#define DMA_ABORT_INTERRUPT_ABORT_0_ABORT 1
+#define DMA_ABORT_INTERRUPT_INT_1 1:1
+#define DMA_ABORT_INTERRUPT_INT_1_CLEAR 0
+#define DMA_ABORT_INTERRUPT_INT_1_FINISHED 1
+#define DMA_ABORT_INTERRUPT_INT_0 0:0
+#define DMA_ABORT_INTERRUPT_INT_0_CLEAR 0
+#define DMA_ABORT_INTERRUPT_INT_0_FINISHED 1
+
+
+
+
+
+/* Default i2c CLK and Data GPIO. These are the default i2c pins */
+#define DEFAULT_I2C_SCL 30
+#define DEFAULT_I2C_SDA 31
+
+
+#define GPIO_DATA_SM750LE 0x020018
+#define GPIO_DATA_SM750LE_1 1:1
+#define GPIO_DATA_SM750LE_0 0:0
+
+#define GPIO_DATA_DIRECTION_SM750LE 0x02001C
+#define GPIO_DATA_DIRECTION_SM750LE_1 1:1
+#define GPIO_DATA_DIRECTION_SM750LE_1_INPUT 0
+#define GPIO_DATA_DIRECTION_SM750LE_1_OUTPUT 1
+#define GPIO_DATA_DIRECTION_SM750LE_0 0:0
+#define GPIO_DATA_DIRECTION_SM750LE_0_INPUT 0
+#define GPIO_DATA_DIRECTION_SM750LE_0_OUTPUT 1
+
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_sii164.c b/drivers/video/lynxfb/ddk750/ddk750_sii164.c
new file mode 100644
index 0000000..67b6026
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_sii164.c
@@ -0,0 +1,423 @@
+#ifdef USE_DVICHIP
+
+#include "ddk750_sii164.h"
+#include "ddk750_hwi2c.h"
+
+/* I2C Address of each SII164 chip */
+#define SII164_I2C_ADDRESS 0x70
+
+/* Define this definition to use hardware i2c. */
+/*#define USE_HW_I2C*/
+#ifdef USE_HW_I2C
+ #define i2cWriteReg hwI2CWriteReg
+ #define i2cReadReg hwI2CReadReg
+#else
+ #define i2cWriteReg swI2CWriteReg
+ #define i2cReadReg swI2CReadReg
+#endif
+
+/* SII164 Vendor and Device ID */
+#define SII164_VENDOR_ID 0x0001
+#define SII164_DEVICE_ID 0x0006
+
+#ifdef SII164_FULL_FUNCTIONS
+/* Name of the DVI Controller chip */
+static char *gDviCtrlChipName = "Silicon Image SiI 164";
+#endif
+
+/*
+ * sii164GetVendorID
+ * This function gets the vendor ID of the DVI controller chip.
+ *
+ * Output:
+ * Vendor ID
+ */
+unsigned short sii164GetVendorID()
+{
+ unsigned short vendorID;
+
+ vendorID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_HIGH) << 8) |
+ (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_VENDOR_ID_LOW);
+
+ return vendorID;
+}
+
+/*
+ * sii164GetDeviceID
+ * This function gets the device ID of the DVI controller chip.
+ *
+ * Output:
+ * Device ID
+ */
+unsigned short sii164GetDeviceID()
+{
+ unsigned short deviceID;
+
+ deviceID = ((unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_HIGH) << 8) |
+ (unsigned short) i2cReadReg(SII164_I2C_ADDRESS, SII164_DEVICE_ID_LOW);
+
+ return deviceID;
+}
+
+
+
+/* DVI.C will handle all SiI164 chip stuffs and try it best to make code minimal and useful */
+
+/*
+ * sii164InitChip
+ * This function initialize and detect the DVI controller chip.
+ *
+ * Input:
+ * edgeSelect - Edge Select:
+ * 0 = Input data is falling edge latched (falling edge
+ * latched first in dual edge mode)
+ * 1 = Input data is rising edge latched (rising edge
+ * latched first in dual edge mode)
+ * busSelect - Input Bus Select:
+ * 0 = Input data bus is 12-bits wide
+ * 1 = Input data bus is 24-bits wide
+ * dualEdgeClkSelect - Dual Edge Clock Select
+ * 0 = Input data is single edge latched
+ * 1 = Input data is dual edge latched
+ * hsyncEnable - Horizontal Sync Enable:
+ * 0 = HSYNC input is transmitted as fixed LOW
+ * 1 = HSYNC input is transmitted as is
+ * vsyncEnable - Vertical Sync Enable:
+ * 0 = VSYNC input is transmitted as fixed LOW
+ * 1 = VSYNC input is transmitted as is
+ * deskewEnable - De-skewing Enable:
+ * 0 = De-skew disabled
+ * 1 = De-skew enabled
+ * deskewSetting - De-skewing Setting (increment of 260psec)
+ * 0 = 1 step --> minimum setup / maximum hold
+ * 1 = 2 step
+ * 2 = 3 step
+ * 3 = 4 step
+ * 4 = 5 step
+ * 5 = 6 step
+ * 6 = 7 step
+ * 7 = 8 step --> maximum setup / minimum hold
+ * continuousSyncEnable- SYNC Continuous:
+ * 0 = Disable
+ * 1 = Enable
+ * pllFilterEnable - PLL Filter Enable
+ * 0 = Disable PLL Filter
+ * 1 = Enable PLL Filter
+ * pllFilterValue - PLL Filter characteristics:
+ * 0~7 (recommended value is 4)
+ *
+ * Output:
+ * 0 - Success
+ * -1 - Fail.
+ */
+long sii164InitChip(
+ unsigned char edgeSelect,
+ unsigned char busSelect,
+ unsigned char dualEdgeClkSelect,
+ unsigned char hsyncEnable,
+ unsigned char vsyncEnable,
+ unsigned char deskewEnable,
+ unsigned char deskewSetting,
+ unsigned char continuousSyncEnable,
+ unsigned char pllFilterEnable,
+ unsigned char pllFilterValue
+)
+{
+ //unsigned char ucRegIndex, ucRegValue;
+ //unsigned char ucDeviceAddress,
+ unsigned char config;
+ //unsigned long delayCount;
+
+ /* Initialize the i2c bus */
+#ifdef USE_HW_I2C
+ /* Use fast mode. */
+ hwI2CInit(1);
+#else
+ swI2CInit(DEFAULT_I2C_SCL, DEFAULT_I2C_SDA);
+#endif
+
+ /* Check if SII164 Chip exists */
+ if ((sii164GetVendorID() == SII164_VENDOR_ID) && (sii164GetDeviceID() == SII164_DEVICE_ID))
+ {
+
+#ifdef DDKDEBUG
+ //sii164PrintRegisterValues();
+#endif
+ /*
+ * Initialize SII164 controller chip.
+ */
+
+ /* Select the edge */
+ if (edgeSelect == 0)
+ config = SII164_CONFIGURATION_LATCH_FALLING;
+ else
+ config = SII164_CONFIGURATION_LATCH_RISING;
+
+ /* Select bus wide */
+ if (busSelect == 0)
+ config |= SII164_CONFIGURATION_BUS_12BITS;
+ else
+ config |= SII164_CONFIGURATION_BUS_24BITS;
+
+ /* Select Dual/Single Edge Clock */
+ if (dualEdgeClkSelect == 0)
+ config |= SII164_CONFIGURATION_CLOCK_SINGLE;
+ else
+ config |= SII164_CONFIGURATION_CLOCK_DUAL;
+
+ /* Select HSync Enable */
+ if (hsyncEnable == 0)
+ config |= SII164_CONFIGURATION_HSYNC_FORCE_LOW;
+ else
+ config |= SII164_CONFIGURATION_HSYNC_AS_IS;
+
+ /* Select VSync Enable */
+ if (vsyncEnable == 0)
+ config |= SII164_CONFIGURATION_VSYNC_FORCE_LOW;
+ else
+ config |= SII164_CONFIGURATION_VSYNC_AS_IS;
+
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
+
+ /* De-skew enabled with default 111b value.
+ This will fix some artifacts problem in some mode on board 2.2.
+ Somehow this fix does not affect board 2.1.
+ */
+ if (deskewEnable == 0)
+ config = SII164_DESKEW_DISABLE;
+ else
+ config = SII164_DESKEW_ENABLE;
+
+ switch (deskewSetting)
+ {
+ case 0:
+ config |= SII164_DESKEW_1_STEP;
+ break;
+ case 1:
+ config |= SII164_DESKEW_2_STEP;
+ break;
+ case 2:
+ config |= SII164_DESKEW_3_STEP;
+ break;
+ case 3:
+ config |= SII164_DESKEW_4_STEP;
+ break;
+ case 4:
+ config |= SII164_DESKEW_5_STEP;
+ break;
+ case 5:
+ config |= SII164_DESKEW_6_STEP;
+ break;
+ case 6:
+ config |= SII164_DESKEW_7_STEP;
+ break;
+ case 7:
+ config |= SII164_DESKEW_8_STEP;
+ break;
+ }
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_DESKEW, config);
+
+ /* Enable/Disable Continuous Sync. */
+ if (continuousSyncEnable == 0)
+ config = SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE;
+ else
+ config = SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE;
+
+ /* Enable/Disable PLL Filter */
+ if (pllFilterEnable == 0)
+ config |= SII164_PLL_FILTER_DISABLE;
+ else
+ config |= SII164_PLL_FILTER_ENABLE;
+
+ /* Set the PLL Filter value */
+ config |= ((pllFilterValue & 0x07) << 1);
+
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_PLL, config);
+
+ /* Recover from Power Down and enable output. */
+ config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
+ config |= SII164_CONFIGURATION_POWER_NORMAL;
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
+
+#ifdef DDKDEBUG
+ //sii164PrintRegisterValues();
+#endif
+
+ return 0;
+ }
+
+ /* Return -1 if initialization fails. */
+ return (-1);
+}
+
+
+
+
+
+/* below sii164 function is not neccessary */
+
+#ifdef SII164_FULL_FUNCTIONS
+
+/*
+ * sii164ResetChip
+ * This function resets the DVI Controller Chip.
+ */
+void sii164ResetChip()
+{
+ /* Power down */
+ sii164SetPower(0);
+ sii164SetPower(1);
+}
+
+
+/*
+ * sii164GetChipString
+ * This function returns a char string name of the current DVI Controller chip.
+ * It's convenient for application need to display the chip name.
+ */
+char *sii164GetChipString()
+{
+ return gDviCtrlChipName;
+}
+
+
+/*
+ * sii164SetPower
+ * This function sets the power configuration of the DVI Controller Chip.
+ *
+ * Input:
+ * powerUp - Flag to set the power down or up
+ */
+void sii164SetPower(
+ unsigned char powerUp
+)
+{
+ unsigned char config;
+
+ config = i2cReadReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION);
+ if (powerUp == 1)
+ {
+ /* Power up the chip */
+ config &= ~SII164_CONFIGURATION_POWER_MASK;
+ config |= SII164_CONFIGURATION_POWER_NORMAL;
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
+ }
+ else
+ {
+ /* Power down the chip */
+ config &= ~SII164_CONFIGURATION_POWER_MASK;
+ config |= SII164_CONFIGURATION_POWER_DOWN;
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_CONFIGURATION, config);
+ }
+}
+
+
+/*
+ * sii164SelectHotPlugDetectionMode
+ * This function selects the mode of the hot plug detection.
+ */
+static void sii164SelectHotPlugDetectionMode(
+ sii164_hot_plug_mode_t hotPlugMode
+)
+{
+ unsigned char detectReg;
+
+ detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & ~SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG;
+ switch (hotPlugMode)
+ {
+ case SII164_HOTPLUG_DISABLE:
+ detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH;
+ break;
+ case SII164_HOTPLUG_USE_MDI:
+ detectReg &= ~SII164_DETECT_INTERRUPT_MASK;
+ detectReg |= SII164_DETECT_INTERRUPT_BY_HTPLG_PIN;
+ detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI;
+ break;
+ case SII164_HOTPLUG_USE_RSEN:
+ detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN;
+ break;
+ case SII164_HOTPLUG_USE_HTPLG:
+ detectReg |= SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG;
+ break;
+ }
+
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg);
+}
+
+/*
+ * sii164EnableHotPlugDetection
+ * This function enables the Hot Plug detection.
+ *
+ * enableHotPlug - Enable (=1) / disable (=0) Hot Plug detection
+ */
+void sii164EnableHotPlugDetection(
+ unsigned char enableHotPlug
+)
+{
+ unsigned char detectReg;
+ detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
+
+ /* Depending on each DVI controller, need to enable the hot plug based on each
+ individual chip design. */
+ if (enableHotPlug != 0)
+ sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_USE_MDI);
+ else
+ sii164SelectHotPlugDetectionMode(SII164_HOTPLUG_DISABLE);
+}
+
+/*
+ * sii164IsConnected
+ * Check if the DVI Monitor is connected.
+ *
+ * Output:
+ * 0 - Not Connected
+ * 1 - Connected
+ */
+unsigned char sii164IsConnected()
+{
+ unsigned char hotPlugValue;
+
+ hotPlugValue = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & SII164_DETECT_HOT_PLUG_STATUS_MASK;
+ if (hotPlugValue == SII164_DETECT_HOT_PLUG_STATUS_ON)
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * sii164CheckInterrupt
+ * Checks if interrupt has occured.
+ *
+ * Output:
+ * 0 - No interrupt
+ * 1 - Interrupt occurs
+ */
+unsigned char sii164CheckInterrupt()
+{
+ unsigned char detectReg;
+
+ detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT) & SII164_DETECT_MONITOR_STATE_MASK;
+ if (detectReg == SII164_DETECT_MONITOR_STATE_CHANGE)
+ return 1;
+ else
+ return 0;
+}
+
+/*
+ * sii164ClearInterrupt
+ * Clear the hot plug interrupt.
+ */
+void sii164ClearInterrupt()
+{
+ unsigned char detectReg;
+
+ /* Clear the MDI interrupt */
+ detectReg = i2cReadReg(SII164_I2C_ADDRESS, SII164_DETECT);
+ i2cWriteReg(SII164_I2C_ADDRESS, SII164_DETECT, detectReg | SII164_DETECT_MONITOR_STATE_CLEAR);
+}
+
+#endif
+
+#endif
+
+
diff --git a/drivers/video/lynxfb/ddk750/ddk750_sii164.h b/drivers/video/lynxfb/ddk750/ddk750_sii164.h
new file mode 100644
index 0000000..d854b53
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_sii164.h
@@ -0,0 +1,170 @@
+#ifndef DDK750_SII164_H__
+#define DDK750_SII164_H__
+
+/* Hot Plug detection mode structure */
+typedef enum _sii164_hot_plug_mode_t
+{
+ SII164_HOTPLUG_DISABLE = 0, /* Disable Hot Plug output bit (always high). */
+ SII164_HOTPLUG_USE_MDI, /* Use Monitor Detect Interrupt bit. */
+ SII164_HOTPLUG_USE_RSEN, /* Use Receiver Sense detect bit. */
+ SII164_HOTPLUG_USE_HTPLG /* Use Hot Plug detect bit. */
+} sii164_hot_plug_mode_t;
+
+
+/* Silicon Image SiI164 chip prototype */
+long sii164InitChip(
+ unsigned char edgeSelect,
+ unsigned char busSelect,
+ unsigned char dualEdgeClkSelect,
+ unsigned char hsyncEnable,
+ unsigned char vsyncEnable,
+ unsigned char deskewEnable,
+ unsigned char deskewSetting,
+ unsigned char continuousSyncEnable,
+ unsigned char pllFilterEnable,
+ unsigned char pllFilterValue
+);
+
+unsigned short sii164GetVendorID(void);
+unsigned short sii164GetDeviceID(void);
+
+
+#ifdef SII164_FULL_FUNCTIONS
+void sii164ResetChip(void);
+char *sii164GetChipString(void);
+void sii164SetPower(unsigned char powerUp);
+void sii164EnableHotPlugDetection(unsigned char enableHotPlug);
+unsigned char sii164IsConnected(void);
+unsigned char sii164CheckInterrupt(void);
+void sii164ClearInterrupt(void);
+#endif
+/* below register definination is used for Silicon Image SiI164 DVI controller chip */
+/*
+ * Vendor ID registers
+ */
+#define SII164_VENDOR_ID_LOW 0x00
+#define SII164_VENDOR_ID_HIGH 0x01
+
+/*
+ * Device ID registers
+ */
+#define SII164_DEVICE_ID_LOW 0x02
+#define SII164_DEVICE_ID_HIGH 0x03
+
+/*
+ * Device Revision
+ */
+#define SII164_DEVICE_REVISION 0x04
+
+/*
+ * Frequency Limitation registers
+ */
+#define SII164_FREQUENCY_LIMIT_LOW 0x06
+#define SII164_FREQUENCY_LIMIT_HIGH 0x07
+
+/*
+ * Power Down and Input Signal Configuration registers
+ */
+#define SII164_CONFIGURATION 0x08
+
+/* Power down (PD) */
+#define SII164_CONFIGURATION_POWER_DOWN 0x00
+#define SII164_CONFIGURATION_POWER_NORMAL 0x01
+#define SII164_CONFIGURATION_POWER_MASK 0x01
+
+/* Input Edge Latch Select (EDGE) */
+#define SII164_CONFIGURATION_LATCH_FALLING 0x00
+#define SII164_CONFIGURATION_LATCH_RISING 0x02
+
+/* Bus Select (BSEL) */
+#define SII164_CONFIGURATION_BUS_12BITS 0x00
+#define SII164_CONFIGURATION_BUS_24BITS 0x04
+
+/* Dual Edge Clock Select (DSEL) */
+#define SII164_CONFIGURATION_CLOCK_SINGLE 0x00
+#define SII164_CONFIGURATION_CLOCK_DUAL 0x08
+
+/* Horizontal Sync Enable (HEN) */
+#define SII164_CONFIGURATION_HSYNC_FORCE_LOW 0x00
+#define SII164_CONFIGURATION_HSYNC_AS_IS 0x10
+
+/* Vertical Sync Enable (VEN) */
+#define SII164_CONFIGURATION_VSYNC_FORCE_LOW 0x00
+#define SII164_CONFIGURATION_VSYNC_AS_IS 0x20
+
+/*
+ * Detection registers
+ */
+#define SII164_DETECT 0x09
+
+/* Monitor Detect Interrupt (MDI) */
+#define SII164_DETECT_MONITOR_STATE_CHANGE 0x00
+#define SII164_DETECT_MONITOR_STATE_NO_CHANGE 0x01
+#define SII164_DETECT_MONITOR_STATE_CLEAR 0x01
+#define SII164_DETECT_MONITOR_STATE_MASK 0x01
+
+/* Hot Plug detect Input (HTPLG) */
+#define SII164_DETECT_HOT_PLUG_STATUS_OFF 0x00
+#define SII164_DETECT_HOT_PLUG_STATUS_ON 0x02
+#define SII164_DETECT_HOT_PLUG_STATUS_MASK 0x02
+
+/* Receiver Sense (RSEN) */
+#define SII164_DETECT_RECEIVER_SENSE_NOT_DETECTED 0x00
+#define SII164_DETECT_RECEIVER_SENSE_DETECTED 0x04
+
+/* Interrupt Generation Method (TSEL) */
+#define SII164_DETECT_INTERRUPT_BY_RSEN_PIN 0x00
+#define SII164_DETECT_INTERRUPT_BY_HTPLG_PIN 0x08
+#define SII164_DETECT_INTERRUPT_MASK 0x08
+
+/* Monitor Sense Output (MSEN) */
+#define SII164_DETECT_MONITOR_SENSE_OUTPUT_HIGH 0x00
+#define SII164_DETECT_MONITOR_SENSE_OUTPUT_MDI 0x10
+#define SII164_DETECT_MONITOR_SENSE_OUTPUT_RSEN 0x20
+#define SII164_DETECT_MONITOR_SENSE_OUTPUT_HTPLG 0x30
+#define SII164_DETECT_MONITOR_SENSE_OUTPUT_FLAG 0x30
+
+/*
+ * Skewing registers
+ */
+#define SII164_DESKEW 0x0A
+
+/* General Purpose Input (CTL[3:1]) */
+#define SII164_DESKEW_GENERAL_PURPOSE_INPUT_MASK 0x0E
+
+/* De-skewing Enable bit (DKEN) */
+#define SII164_DESKEW_DISABLE 0x00
+#define SII164_DESKEW_ENABLE 0x10
+
+/* De-skewing Setting (DK[3:1])*/
+#define SII164_DESKEW_1_STEP 0x00
+#define SII164_DESKEW_2_STEP 0x20
+#define SII164_DESKEW_3_STEP 0x40
+#define SII164_DESKEW_4_STEP 0x60
+#define SII164_DESKEW_5_STEP 0x80
+#define SII164_DESKEW_6_STEP 0xA0
+#define SII164_DESKEW_7_STEP 0xC0
+#define SII164_DESKEW_8_STEP 0xE0
+
+/*
+ * User Configuration Data registers (CFG 7:0)
+ */
+#define SII164_USER_CONFIGURATION 0x0B
+
+/*
+ * PLL registers
+ */
+#define SII164_PLL 0x0C
+
+/* PLL Filter Value (PLLF) */
+#define SII164_PLL_FILTER_VALUE_MASK 0x0E
+
+/* PLL Filter Enable (PFEN) */
+#define SII164_PLL_FILTER_DISABLE 0x00
+#define SII164_PLL_FILTER_ENABLE 0x01
+
+/* Sync Continuous (SCNT) */
+#define SII164_PLL_FILTER_SYNC_CONTINUOUS_DISABLE 0x00
+#define SII164_PLL_FILTER_SYNC_CONTINUOUS_ENABLE 0x80
+
+#endif
diff --git a/drivers/video/lynxfb/ddk750/ddk750_swi2c.c b/drivers/video/lynxfb/ddk750/ddk750_swi2c.c
new file mode 100644
index 0000000..99f5ecb
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_swi2c.c
@@ -0,0 +1,535 @@
+/*******************************************************************
+*
+* Copyright (c) 2007 by Silicon Motion, Inc. (SMI)
+*
+* All rights are reserved. Reproduction or in part is prohibited
+* without the written consent of the copyright owner.
+*
+* swi2c.c --- SM750/SM718 DDK
+* This file contains the source code for I2C using software
+* implementation.
+*
+*******************************************************************/
+#include "ddk750_help.h"
+#include "ddk750_reg.h"
+#include "ddk750_swi2c.h"
+#include "ddk750_power.h"
+
+
+/*******************************************************************
+ * I2C Software Master Driver:
+ * ===========================
+ * Each i2c cycle is split into 4 sections. Each of these section marks
+ * a point in time where the SCL or SDA may be changed.
+ *
+ * 1 Cycle == | Section I. | Section 2. | Section 3. | Section 4. |
+ * +-------------+-------------+-------------+-------------+
+ * | SCL set LOW |SCL no change| SCL set HIGH|SCL no change|
+ *
+ * ____________ _____________
+ * SCL == XXXX _____________ ____________ /
+ *
+ * I.e. the SCL may only be changed in section 1. and section 3. while
+ * the SDA may only be changed in section 2. and section 4. The table
+ * below gives the changes for these 2 lines in the varios sections.
+ *
+ * Section changes Table:
+ * ======================
+ * blank = no change, L = set bit LOW, H = set bit HIGH
+ *
+ * | 1.| 2.| 3.| 4.|
+ * ---------------+---+---+---+---+
+ * Tx Start SDA | | H | | L |
+ * SCL | L | | H | |
+ * ---------------+---+---+---+---+
+ * Tx Stop SDA | | L | | H |
+ * SCL | L | | H | |
+ * ---------------+---+---+---+---+
+ * Tx bit H SDA | | H | | |
+ * SCL | L | | H | |
+ * ---------------+---+---+---+---+
+ * Tx bit L SDA | | L | | |
+ * SCL | L | | H | |
+ * ---------------+---+---+---+---+
+ *
+ ******************************************************************/
+
+/* GPIO pins used for this I2C. It ranges from 0 to 63. */
+static unsigned char g_i2cClockGPIO = DEFAULT_I2C_SCL;
+static unsigned char g_i2cDataGPIO = DEFAULT_I2C_SDA;
+
+/*
+ * Below is the variable declaration for the GPIO pin register usage
+ * for the i2c Clock and i2c Data.
+ *
+ * Note:
+ * Notice that the GPIO usage for the i2c clock and i2c Data are
+ * separated. This is to make this code flexible enough when
+ * two separate GPIO pins for the clock and data are located
+ * in two different GPIO register set (worst case).
+ */
+
+/* i2c Clock GPIO Register usage */
+static unsigned long g_i2cClkGPIOMuxReg = GPIO_MUX;
+static unsigned long g_i2cClkGPIODataReg = GPIO_DATA;
+static unsigned long g_i2cClkGPIODataDirReg = GPIO_DATA_DIRECTION;
+
+/* i2c Data GPIO Register usage */
+static unsigned long g_i2cDataGPIOMuxReg = GPIO_MUX;
+static unsigned long g_i2cDataGPIODataReg = GPIO_DATA;
+static unsigned long g_i2cDataGPIODataDirReg = GPIO_DATA_DIRECTION;
+
+static unsigned char peekIO(unsigned short port,unsigned short index)
+{
+#if defined(__i386__) || defined( __x86_64__)
+ outb_p(index,port);
+ return inb_p(port+1);
+#endif
+}
+
+/*
+ * This function puts a delay between command
+ */
+static void swI2CWait(void)
+{
+ /* find a bug:
+ * peekIO method works well before suspend/resume
+ * but after suspend, peekIO(0x3ce,0x61) & 0x10
+ * always be non-zero,which makes the while loop
+ * never finish.
+ * use non-ultimate for loop below is safe
+ * */
+#if 0
+ /* Change wait algorithm to use PCI bus clock,
+ it's more reliable than counter loop ..
+ write 0x61 to 0x3ce and read from 0x3cf
+ */
+ while(peekIO(0x3ce,0x61) & 0x10);
+#else
+ int i, Temp;
+
+ for(i=0; i<600; i++)
+ {
+ Temp = i;
+ Temp += i;
+ }
+#endif
+}
+
+/*
+ * This function set/reset the SCL GPIO pin
+ *
+ * Parameters:
+ * value - Bit value to set to the SCL or SDA (0 = low, 1 = high)
+ *
+ * Notes:
+ * When setting SCL to high, just set the GPIO as input where the pull up
+ * resistor will pull the signal up. Do not use software to pull up the
+ * signal because the i2c will fail when other device try to drive the
+ * signal due to SM50x will drive the signal to always high.
+ */
+void swI2CSCL(unsigned char value)
+{
+ unsigned long ulGPIOData;
+ unsigned long ulGPIODirection;
+
+ ulGPIODirection = PEEK32(g_i2cClkGPIODataDirReg);
+ if (value) /* High */
+ {
+ /* Set direction as input. This will automatically pull the signal up. */
+ ulGPIODirection &= ~(1 << g_i2cClockGPIO);
+ POKE32(g_i2cClkGPIODataDirReg, ulGPIODirection);
+ }
+ else /* Low */
+ {
+ /* Set the signal down */
+ ulGPIOData = PEEK32(g_i2cClkGPIODataReg);
+ ulGPIOData &= ~(1 << g_i2cClockGPIO);
+ POKE32(g_i2cClkGPIODataReg, ulGPIOData);
+
+ /* Set direction as output */
+ ulGPIODirection |= (1 << g_i2cClockGPIO);
+ POKE32(g_i2cClkGPIODataDirReg, ulGPIODirection);
+ }
+}
+
+/*
+ * This function set/reset the SDA GPIO pin
+ *
+ * Parameters:
+ * value - Bit value to set to the SCL or SDA (0 = low, 1 = high)
+ *
+ * Notes:
+ * When setting SCL to high, just set the GPIO as input where the pull up
+ * resistor will pull the signal up. Do not use software to pull up the
+ * signal because the i2c will fail when other device try to drive the
+ * signal due to SM50x will drive the signal to always high.
+ */
+void swI2CSDA(unsigned char value)
+{
+ unsigned long ulGPIOData;
+ unsigned long ulGPIODirection;
+
+ ulGPIODirection = PEEK32(g_i2cDataGPIODataDirReg);
+ if (value) /* High */
+ {
+ /* Set direction as input. This will automatically pull the signal up. */
+ ulGPIODirection &= ~(1 << g_i2cDataGPIO);
+ POKE32(g_i2cDataGPIODataDirReg, ulGPIODirection);
+ }
+ else /* Low */
+ {
+ /* Set the signal down */
+ ulGPIOData = PEEK32(g_i2cDataGPIODataReg);
+ ulGPIOData &= ~(1 << g_i2cDataGPIO);
+ POKE32(g_i2cDataGPIODataReg, ulGPIOData);
+
+ /* Set direction as output */
+ ulGPIODirection |= (1 << g_i2cDataGPIO);
+ POKE32(g_i2cDataGPIODataDirReg, ulGPIODirection);
+ }
+}
+
+/*
+ * This function read the data from the SDA GPIO pin
+ *
+ * Return Value:
+ * The SDA data bit sent by the Slave
+ */
+static unsigned char swI2CReadSDA()
+{
+ unsigned long ulGPIODirection;
+ unsigned long ulGPIOData;
+
+ /* Make sure that the direction is input (High) */
+ ulGPIODirection = PEEK32(g_i2cDataGPIODataDirReg);
+ if ((ulGPIODirection & (1 << g_i2cDataGPIO)) != (~(1 << g_i2cDataGPIO)))
+ {
+ ulGPIODirection &= ~(1 << g_i2cDataGPIO);
+ POKE32(g_i2cDataGPIODataDirReg, ulGPIODirection);
+ }
+
+ /* Now read the SDA line */
+ ulGPIOData = PEEK32(g_i2cDataGPIODataReg);
+ if (ulGPIOData & (1 << g_i2cDataGPIO))
+ return 1;
+ else
+ return 0;
+}
+
+#pragma optimize( "", off )
+
+/*
+ * This function sends ACK signal
+ */
+static void swI2CAck(void)
+{
+ return; /* Single byte read is ok without it. */
+}
+
+/*
+ * This function sends the start command to the slave device
+ */
+void swI2CStart(void)
+{
+ /* Start I2C */
+ swI2CSDA(1);
+ swI2CSCL(1);
+ swI2CSDA(0);
+}
+
+/*
+ * This function sends the stop command to the slave device
+ */
+void swI2CStop()
+{
+ /* Stop the I2C */
+ swI2CSCL(1);
+ swI2CSDA(0);
+ swI2CSDA(1);
+}
+
+/*
+ * This function writes one byte to the slave device
+ *
+ * Parameters:
+ * data - Data to be write to the slave device
+ *
+ * Return Value:
+ * 0 - Success
+ * -1 - Fail to write byte
+ */
+long swI2CWriteByte(unsigned char data)
+{
+ unsigned char value = data;
+ int i;
+
+ /* Sending the data bit by bit */
+ for (i=0; i<8; i++)
+ {
+ /* Set SCL to low */
+ swI2CSCL(0);
+
+ /* Send data bit */
+ if ((value & 0x80) != 0)
+ swI2CSDA(1);
+ else
+ swI2CSDA(0);
+
+ swI2CWait();
+
+ /* Toggle clk line to one */
+ swI2CSCL(1);
+ swI2CWait();
+
+ /* Shift byte to be sent */
+ value = value << 1;
+ }
+
+ /* Set the SCL Low and SDA High (prepare to get input) */
+ swI2CSCL(0);
+ swI2CSDA(1);
+
+ /* Set the SCL High for ack */
+ swI2CWait();
+ swI2CSCL(1);
+ swI2CWait();
+
+ /* Read SDA, until SDA==0 */
+ for(i=0; i<0xff; i++)
+ {
+ if (!swI2CReadSDA())
+ break;
+
+ swI2CSCL(0);
+ swI2CWait();
+ swI2CSCL(1);
+ swI2CWait();
+ }
+
+ /* Set the SCL Low and SDA High */
+ swI2CSCL(0);
+ swI2CSDA(1);
+
+ if (i<0xff)
+ return 0;
+ else
+ return (-1);
+}
+
+/*
+ * This function reads one byte from the slave device
+ *
+ * Parameters:
+ * ack - Flag to indicate either to send the acknowledge
+ * message to the slave device or not
+ *
+ * Return Value:
+ * One byte data read from the Slave device
+ */
+unsigned char swI2CReadByte(unsigned char ack)
+{
+ int i;
+ unsigned char data = 0;
+
+ for(i=7; i>=0; i--)
+ {
+ /* Set the SCL to Low and SDA to High (Input) */
+ swI2CSCL(0);
+ swI2CSDA(1);
+ swI2CWait();
+
+ /* Set the SCL High */
+ swI2CSCL(1);
+ swI2CWait();
+
+ /* Read data bits from SDA */
+ data |= (swI2CReadSDA() << i);
+ }
+
+ if (ack)
+ swI2CAck();
+
+ /* Set the SCL Low and SDA High */
+ swI2CSCL(0);
+ swI2CSDA(1);
+
+ return data;
+}
+#pragma optimize( "", on )
+
+/*
+ * This function initializes GPIO port for SW I2C communication.
+ *
+ * Parameters:
+ * i2cClkGPIO - The GPIO pin to be used as i2c SCL
+ * i2cDataGPIO - The GPIO pin to be used as i2c SDA
+ *
+ * Return Value:
+ * -1 - Fail to initialize the i2c
+ * 0 - Success
+ */
+long swI2CInit_SM750LE(
+ unsigned char i2cClkGPIO,
+ unsigned char i2cDataGPIO
+)
+{
+ int i;
+
+ /* Initialize the GPIO pin for the i2c Clock Register */
+ g_i2cClkGPIODataReg = GPIO_DATA_SM750LE;
+ g_i2cClkGPIODataDirReg = GPIO_DATA_DIRECTION_SM750LE;
+
+ /* Initialize the Clock GPIO Offset */
+ g_i2cClockGPIO = i2cClkGPIO;
+
+ /* Initialize the GPIO pin for the i2c Data Register */
+ g_i2cDataGPIODataReg = GPIO_DATA_SM750LE;
+ g_i2cDataGPIODataDirReg = GPIO_DATA_DIRECTION_SM750LE;
+
+ /* Initialize the Data GPIO Offset */
+ g_i2cDataGPIO = i2cDataGPIO;
+
+ /* Note that SM750LE don't have GPIO MUX and power is always on */
+
+ /* Clear the i2c lines. */
+ for(i=0; i<9; i++)
+ swI2CStop();
+
+ return 0;
+}
+
+/*
+ * This function initializes the i2c attributes and bus
+ *
+ * Parameters:
+ * i2cClkGPIO - The GPIO pin to be used as i2c SCL
+ * i2cDataGPIO - The GPIO pin to be used as i2c SDA
+ *
+ * Return Value:
+ * -1 - Fail to initialize the i2c
+ * 0 - Success
+ */
+long swI2CInit(
+ unsigned char i2cClkGPIO,
+ unsigned char i2cDataGPIO
+)
+{
+ int i;
+
+ /* Return 0 if the GPIO pins to be used is out of range. The range is only from [0..63] */
+ if ((i2cClkGPIO > 31) || (i2cDataGPIO > 31))
+ return (-1);
+
+ if (getChipType() == SM750LE)
+ return( swI2CInit_SM750LE(i2cClkGPIO, i2cDataGPIO) );
+
+ /* Initialize the GPIO pin for the i2c Clock Register */
+ g_i2cClkGPIOMuxReg = GPIO_MUX;
+ g_i2cClkGPIODataReg = GPIO_DATA;
+ g_i2cClkGPIODataDirReg = GPIO_DATA_DIRECTION;
+
+ /* Initialize the Clock GPIO Offset */
+ g_i2cClockGPIO = i2cClkGPIO;
+
+ /* Initialize the GPIO pin for the i2c Data Register */
+ g_i2cDataGPIOMuxReg = GPIO_MUX;
+ g_i2cDataGPIODataReg = GPIO_DATA;
+ g_i2cDataGPIODataDirReg = GPIO_DATA_DIRECTION;
+
+ /* Initialize the Data GPIO Offset */
+ g_i2cDataGPIO = i2cDataGPIO;
+
+ /* Enable the GPIO pins for the i2c Clock and Data (GPIO MUX) */
+ POKE32(g_i2cClkGPIOMuxReg,
+ PEEK32(g_i2cClkGPIOMuxReg) & ~(1 << g_i2cClockGPIO));
+ POKE32(g_i2cDataGPIOMuxReg,
+ PEEK32(g_i2cDataGPIOMuxReg) & ~(1 << g_i2cDataGPIO));
+
+ /* Enable GPIO power */
+ enableGPIO(1);
+
+ /* Clear the i2c lines. */
+ for(i=0; i<9; i++)
+ swI2CStop();
+
+ return 0;
+}
+
+/*
+ * This function reads the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be read from
+ * registerIndex - Slave device's register to be read
+ *
+ * Return Value:
+ * Register value
+ */
+unsigned char swI2CReadReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex
+)
+{
+ unsigned char data;
+
+ /* Send the Start signal */
+ swI2CStart();
+
+ /* Send the device address */
+ swI2CWriteByte(deviceAddress);
+
+ /* Send the register index */
+ swI2CWriteByte(registerIndex);
+
+ /* Get the bus again and get the data from the device read address */
+ swI2CStart();
+ swI2CWriteByte(deviceAddress + 1);
+ data = swI2CReadByte(1);
+
+ /* Stop swI2C and release the bus */
+ swI2CStop();
+
+ return data;
+}
+
+/*
+ * This function writes a value to the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be written
+ * registerIndex - Slave device's register to be written
+ * data - Data to be written to the register
+ *
+ * Result:
+ * 0 - Success
+ * -1 - Fail
+ */
+long swI2CWriteReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex,
+ unsigned char data
+)
+{
+ long returnValue = 0;
+
+ /* Send the Start signal */
+ swI2CStart();
+
+ /* Send the device address and read the data. All should return success
+ in order for the writing processed to be successful
+ */
+ if ((swI2CWriteByte(deviceAddress) != 0) ||
+ (swI2CWriteByte(registerIndex) != 0) ||
+ (swI2CWriteByte(data) != 0))
+ {
+ returnValue = -1;
+ }
+
+ /* Stop i2c and release the bus */
+ swI2CStop();
+
+ return returnValue;
+}
diff --git a/drivers/video/lynxfb/ddk750/ddk750_swi2c.h b/drivers/video/lynxfb/ddk750/ddk750_swi2c.h
new file mode 100644
index 0000000..3451f04
--- /dev/null
+++ b/drivers/video/lynxfb/ddk750/ddk750_swi2c.h
@@ -0,0 +1,92 @@
+/*******************************************************************
+*
+* Copyright (c) 2007 by Silicon Motion, Inc. (SMI)
+*
+* All rights are reserved. Reproduction or in part is prohibited
+* without the written consent of the copyright owner.
+*
+* swi2c.h --- SM750/SM718 DDK
+* This file contains the definitions for i2c using software
+* implementation.
+*
+*******************************************************************/
+#ifndef _SWI2C_H_
+#define _SWI2C_H_
+
+/* Default i2c CLK and Data GPIO. These are the default i2c pins */
+#define DEFAULT_I2C_SCL 30
+#define DEFAULT_I2C_SDA 31
+
+/*
+ * This function initializes the i2c attributes and bus
+ *
+ * Parameters:
+ * i2cClkGPIO - The GPIO pin to be used as i2c SCL
+ * i2cDataGPIO - The GPIO pin to be used as i2c SDA
+ *
+ * Return Value:
+ * -1 - Fail to initialize the i2c
+ * 0 - Success
+ */
+long swI2CInit(
+ unsigned char i2cClkGPIO,
+ unsigned char i2cDataGPIO
+);
+
+/*
+ * This function reads the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be read from
+ * registerIndex - Slave device's register to be read
+ *
+ * Return Value:
+ * Register value
+ */
+unsigned char swI2CReadReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex
+);
+
+/*
+ * This function writes a value to the slave device's register
+ *
+ * Parameters:
+ * deviceAddress - i2c Slave device address which register
+ * to be written
+ * registerIndex - Slave device's register to be written
+ * data - Data to be written to the register
+ *
+ * Result:
+ * 0 - Success
+ * -1 - Fail
+ */
+long swI2CWriteReg(
+ unsigned char deviceAddress,
+ unsigned char registerIndex,
+ unsigned char data
+);
+
+/*
+ * These two functions are used to toggle the data on the SCL and SDA I2C lines.
+ * The used of these two functions are not recommended unless it is necessary.
+ */
+
+/*
+ * This function set/reset the SCL GPIO pin
+ *
+ * Parameters:
+ * value - Bit value to set to the SCL or SDA (0 = low, 1 = high)
+ */
+void swI2CSCL(unsigned char value);
+
+/*
+ * This function set/reset the SDA GPIO pin
+ *
+ * Parameters:
+ * value - Bit value to set to the SCL or SDA (0 = low, 1 = high)
+ */
+void swI2CSDA(unsigned char value);
+
+#endif /* _SWI2C_H_ */
diff --git a/drivers/video/lynxfb/lynx_accel.c b/drivers/video/lynxfb/lynx_accel.c
new file mode 100644
index 0000000..7fbc161
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_accel.c
@@ -0,0 +1,527 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include<linux/module.h>
+#include<linux/kernel.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+#include <linux/console.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+
+#include "lynx_drv.h"
+#include "lynx_accel.h"
+#include "lynx_help.h"
+static inline void write_dpr(struct lynx_accel * accel,int offset,u32 regValue)
+{
+ writel(regValue,accel->dprBase + offset);
+}
+
+static inline u32 read_dpr(struct lynx_accel * accel,int offset)
+{
+ return readl(accel->dprBase + offset);
+}
+
+static inline void write_dpPort(struct lynx_accel * accel,u32 data)
+{
+ writel(data,accel->dpPortBase);
+}
+
+void hw_de_init(struct lynx_accel * accel)
+{
+ /* setup 2d engine registers */
+ u32 reg,clr;
+ ENTER();
+ write_dpr(accel,DE_MASKS,0xFFFFFFFF);
+
+ /* dpr1c */
+ reg = FIELD_SET(0,DE_STRETCH_FORMAT,PATTERN_XY,NORMAL)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,PATTERN_Y,0)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,PATTERN_X,0)|
+ FIELD_SET(0,DE_STRETCH_FORMAT,ADDRESSING,XY)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,SOURCE_HEIGHT,3);
+
+ clr = FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_XY)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_Y)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_X)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,ADDRESSING)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,SOURCE_HEIGHT);
+
+ /* DE_STRETCH bpp format need be initilized in setMode routine */
+ write_dpr(accel,DE_STRETCH_FORMAT,(read_dpr(accel,DE_STRETCH_FORMAT) & clr) | reg);
+
+ /* disable clipping and transparent */
+ write_dpr(accel,DE_CLIP_TL,0);//dpr2c
+ write_dpr(accel,DE_CLIP_BR,0);//dpr30
+
+ write_dpr(accel,DE_COLOR_COMPARE_MASK,0);//dpr24
+ write_dpr(accel,DE_COLOR_COMPARE,0);
+
+ reg = FIELD_SET(0,DE_CONTROL,TRANSPARENCY,DISABLE)|
+ FIELD_SET(0,DE_CONTROL,TRANSPARENCY_MATCH,OPAQUE)|
+ FIELD_SET(0,DE_CONTROL,TRANSPARENCY_SELECT,SOURCE);
+
+ clr = FIELD_CLEAR(DE_CONTROL,TRANSPARENCY)&
+ FIELD_CLEAR(DE_CONTROL,TRANSPARENCY_MATCH)&
+ FIELD_CLEAR(DE_CONTROL,TRANSPARENCY_SELECT);
+
+ /* dpr0c */
+ write_dpr(accel,DE_CONTROL,(read_dpr(accel,DE_CONTROL)&clr)|reg);
+ LEAVE();
+}
+
+/* set2dformat only be called from setmode functions
+ * but if you need dual framebuffer driver,need call set2dformat
+ * every time you use 2d function */
+
+void hw_set2dformat(struct lynx_accel * accel,int fmt)
+{
+ u32 reg;
+ ENTER();
+ /* fmt=0,1,2 for 8,16,32,bpp on sm718/750/502 */
+ reg = read_dpr(accel,DE_STRETCH_FORMAT);
+ reg = FIELD_VALUE(reg,DE_STRETCH_FORMAT,PIXEL_FORMAT,fmt);
+ write_dpr(accel,DE_STRETCH_FORMAT,reg);
+ LEAVE();
+}
+
+/* seems sm712 RectFill command is broken,so need use BitBlt to
+ * replace it. */
+
+int hw712_fillrect(struct lynx_accel * accel,
+ u32 base,u32 pitch,u32 Bpp,
+ u32 x,u32 y,u32 width,u32 height,
+ u32 color,u32 rop)
+{
+ u32 deCtrl;
+ if(accel->de_wait() != 0)
+ {
+ /* int time wait and always busy,seems hardware
+ * got something error */
+ dbg_msg("%s:De engine always bussy\n",__func__);
+ return -1;
+ }
+ /* 24bpp 2d acceleration still not work,we already support 2d on
+ * both 8/16/32 bpp now, so there is no harm if we disable 2d on
+ * 24bpp for current stage. */
+#if 0
+ if(Bpp == 3){
+ width *= 3;
+ x *= 3;
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0,DE_PITCH,DESTINATION,pitch)|
+ FIELD_VALUE(0,DE_PITCH,SOURCE,pitch));//dpr10
+ }
+ else
+#endif
+ {
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0,DE_PITCH,DESTINATION,pitch/Bpp)|
+ FIELD_VALUE(0,DE_PITCH,SOURCE,pitch/Bpp));//dpr10
+
+ }
+
+ write_dpr(accel,DE_FOREGROUND,color);//DPR14
+ write_dpr(accel,DE_MONO_PATTERN_HIGH,~0);//DPR34
+ write_dpr(accel,DE_MONO_PATTERN_LOW,~0);//DPR38
+
+ write_dpr(accel,DE_WINDOW_SOURCE_BASE,base);//dpr44
+ write_dpr(accel,DE_WINDOW_DESTINATION_BASE,base);//dpr40
+
+
+ write_dpr(accel,DE_WINDOW_WIDTH,
+ FIELD_VALUE(0,DE_WINDOW_WIDTH,DESTINATION,pitch/Bpp)|
+ FIELD_VALUE(0,DE_WINDOW_WIDTH,SOURCE,pitch/Bpp));//dpr3c
+
+
+ write_dpr(accel,DE_DESTINATION,
+ FIELD_SET(0,DE_DESTINATION,WRAP,DISABLE)|
+ FIELD_VALUE(0,DE_DESTINATION,X,x)|
+ FIELD_VALUE(0,DE_DESTINATION,Y,y));//dpr4
+
+ write_dpr(accel,DE_DIMENSION,
+ FIELD_VALUE(0,DE_DIMENSION,X,width)|
+ FIELD_VALUE(0,DE_DIMENSION,Y_ET,height));//dpr8
+
+ deCtrl =
+ FIELD_SET(0,DE_CONTROL,STATUS,START)|
+ FIELD_SET(0,DE_CONTROL,COMMAND,BITBLT)|
+ FIELD_SET(0,DE_CONTROL,ROP2_SOURCE,PATTERN)|
+ FIELD_SET(0,DE_CONTROL,ROP_SELECT,ROP2)|
+ FIELD_VALUE(0,DE_CONTROL,ROP,rop);//dpr0xc
+#if 0
+ /* dump registers */
+ int i;
+ inf_msg("x,y,w,h = %d,%d,%d,%d\n",x,y,width,height);
+ for(i=0x04;i<=0x44;i+=4){
+ inf_msg("dpr%02x = %08x\n",i,read_dpr(accel,i));
+ }
+ inf_msg("deCtrl = %08x\n",deCtrl);
+#endif
+
+ write_dpr(accel,DE_CONTROL,deCtrl);
+ return 0;
+}
+
+int hw_fillrect(struct lynx_accel * accel,
+ u32 base,u32 pitch,u32 Bpp,
+ u32 x,u32 y,u32 width,u32 height,
+ u32 color,u32 rop)
+{
+ u32 deCtrl;
+
+ if(accel->de_wait() != 0)
+ {
+ /* int time wait and always busy,seems hardware
+ * got something error */
+ dbg_msg("%s:De engine always bussy\n",__func__);
+ return -1;
+ }
+
+ write_dpr(accel,DE_WINDOW_DESTINATION_BASE,base);//dpr40
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0,DE_PITCH,DESTINATION,pitch/Bpp)|
+ FIELD_VALUE(0,DE_PITCH,SOURCE,pitch/Bpp));//dpr10
+
+ write_dpr(accel,DE_WINDOW_WIDTH,
+ FIELD_VALUE(0,DE_WINDOW_WIDTH,DESTINATION,pitch/Bpp)|
+ FIELD_VALUE(0,DE_WINDOW_WIDTH,SOURCE,pitch/Bpp));//dpr44
+
+ write_dpr(accel,DE_FOREGROUND,color);//DPR14
+
+ write_dpr(accel,DE_DESTINATION,
+ FIELD_SET(0,DE_DESTINATION,WRAP,DISABLE)|
+ FIELD_VALUE(0,DE_DESTINATION,X,x)|
+ FIELD_VALUE(0,DE_DESTINATION,Y,y));//dpr4
+
+ write_dpr(accel,DE_DIMENSION,
+ FIELD_VALUE(0,DE_DIMENSION,X,width)|
+ FIELD_VALUE(0,DE_DIMENSION,Y_ET,height));//dpr8
+
+ deCtrl =
+ FIELD_SET(0,DE_CONTROL,STATUS,START)|
+ FIELD_SET(0,DE_CONTROL,DIRECTION,LEFT_TO_RIGHT)|
+ FIELD_SET(0,DE_CONTROL,LAST_PIXEL,ON)|
+ FIELD_SET(0,DE_CONTROL,COMMAND,RECTANGLE_FILL)|
+ FIELD_SET(0,DE_CONTROL,ROP_SELECT,ROP2)|
+ FIELD_VALUE(0,DE_CONTROL,ROP,rop);//dpr0xc
+
+ write_dpr(accel,DE_CONTROL,deCtrl);
+ return 0;
+}
+
+int hw_copyarea(
+struct lynx_accel * accel,
+unsigned int sBase, /* Address of source: offset in frame buffer */
+unsigned int sPitch, /* Pitch value of source surface in BYTE */
+unsigned int sx,
+unsigned int sy, /* Starting coordinate of source surface */
+unsigned int dBase, /* Address of destination: offset in frame buffer */
+unsigned int dPitch, /* Pitch value of destination surface in BYTE */
+unsigned int Bpp, /* Color depth of destination surface */
+unsigned int dx,
+unsigned int dy, /* Starting coordinate of destination surface */
+unsigned int width,
+unsigned int height, /* width and height of rectangle in pixel value */
+unsigned int rop2) /* ROP value */
+{
+ unsigned int nDirection, de_ctrl;
+ int opSign;
+ nDirection = LEFT_TO_RIGHT;
+ /* Direction of ROP2 operation: 1 = Left to Right, (-1) = Right to Left */
+ opSign = 1;
+ de_ctrl = 0;
+
+ /* If source and destination are the same surface, need to check for overlay cases */
+ if (sBase == dBase && sPitch == dPitch)
+ {
+ /* Determine direction of operation */
+ if (sy < dy)
+ {
+ /* +----------+
+ |S |
+ | +----------+
+ | | | |
+ | | | |
+ +---|------+ |
+ | D|
+ +----------+ */
+
+ nDirection = BOTTOM_TO_TOP;
+ }
+ else if (sy > dy)
+ {
+ /* +----------+
+ |D |
+ | +----------+
+ | | | |
+ | | | |
+ +---|------+ |
+ | S|
+ +----------+ */
+
+ nDirection = TOP_TO_BOTTOM;
+ }
+ else
+ {
+ /* sy == dy */
+
+ if (sx <= dx)
+ {
+ /* +------+---+------+
+ |S | | D|
+ | | | |
+ | | | |
+ | | | |
+ +------+---+------+ */
+
+ nDirection = RIGHT_TO_LEFT;
+ }
+ else
+ {
+ /* sx > dx */
+
+ /* +------+---+------+
+ |D | | S|
+ | | | |
+ | | | |
+ | | | |
+ +------+---+------+ */
+
+ nDirection = LEFT_TO_RIGHT;
+ }
+ }
+ }
+
+ if ((nDirection == BOTTOM_TO_TOP) || (nDirection == RIGHT_TO_LEFT))
+ {
+ sx += width - 1;
+ sy += height - 1;
+ dx += width - 1;
+ dy += height - 1;
+ opSign = (-1);
+ }
+
+ /* Note:
+ DE_FOREGROUND are DE_BACKGROUND are don't care.
+ DE_COLOR_COMPARE and DE_COLOR_COMPARE_MAKS are set by set deSetTransparency().
+ */
+
+ /* 2D Source Base.
+ It is an address offset (128 bit aligned) from the beginning of frame buffer.
+ */
+ write_dpr(accel,DE_WINDOW_SOURCE_BASE, sBase);//dpr40
+
+ /* 2D Destination Base.
+ It is an address offset (128 bit aligned) from the beginning of frame buffer.
+ */
+ write_dpr(accel,DE_WINDOW_DESTINATION_BASE, dBase);//dpr44
+
+#if 0
+ /* Program pitch (distance between the 1st points of two adjacent lines).
+ Note that input pitch is BYTE value, but the 2D Pitch register uses
+ pixel values. Need Byte to pixel convertion.
+ */
+ if(Bpp == 3){
+ sx *= 3;
+ dx *= 3;
+ width *= 3;
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0, DE_PITCH, DESTINATION, dPitch) |
+ FIELD_VALUE(0, DE_PITCH, SOURCE, sPitch));//dpr10
+ }
+ else
+#endif
+ {
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0, DE_PITCH, DESTINATION, (dPitch/Bpp)) |
+ FIELD_VALUE(0, DE_PITCH, SOURCE, (sPitch/Bpp)));//dpr10
+ }
+
+ /* Screen Window width in Pixels.
+ 2D engine uses this value to calculate the linear address in frame buffer for a given point.
+ */
+ write_dpr(accel,DE_WINDOW_WIDTH,
+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION, (dPitch/Bpp)) |
+ FIELD_VALUE(0, DE_WINDOW_WIDTH, SOURCE, (sPitch/Bpp)));//dpr3c
+
+ if (accel->de_wait() != 0){
+ return -1;
+ }
+
+ {
+
+ write_dpr(accel,DE_SOURCE,
+ FIELD_SET (0, DE_SOURCE, WRAP, DISABLE) |
+ FIELD_VALUE(0, DE_SOURCE, X_K1, sx) |
+ FIELD_VALUE(0, DE_SOURCE, Y_K2, sy));//dpr0
+ write_dpr(accel,DE_DESTINATION,
+ FIELD_SET (0, DE_DESTINATION, WRAP, DISABLE) |
+ FIELD_VALUE(0, DE_DESTINATION, X, dx) |
+ FIELD_VALUE(0, DE_DESTINATION, Y, dy));//dpr04
+ write_dpr(accel,DE_DIMENSION,
+ FIELD_VALUE(0, DE_DIMENSION, X, width) |
+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, height));//dpr08
+
+ de_ctrl =
+ FIELD_VALUE(0, DE_CONTROL, ROP, rop2) |
+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
+ FIELD_SET(0, DE_CONTROL, COMMAND, BITBLT) |
+ ((nDirection == RIGHT_TO_LEFT) ?
+ FIELD_SET(0, DE_CONTROL, DIRECTION, RIGHT_TO_LEFT)
+ : FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT)) |
+ FIELD_SET(0, DE_CONTROL, STATUS, START);
+ write_dpr(accel,DE_CONTROL,de_ctrl);//dpr0c
+ }
+
+ return 0;
+}
+
+static unsigned int deGetTransparency(struct lynx_accel * accel)
+{
+ unsigned int de_ctrl;
+
+ de_ctrl = read_dpr(accel,DE_CONTROL);
+
+ de_ctrl &=
+ FIELD_MASK(DE_CONTROL_TRANSPARENCY_MATCH) |
+ FIELD_MASK(DE_CONTROL_TRANSPARENCY_SELECT)|
+ FIELD_MASK(DE_CONTROL_TRANSPARENCY);
+
+ return de_ctrl;
+}
+
+int hw_imageblit(
+struct lynx_accel * accel,
+unsigned char *pSrcbuf, /* pointer to start of source buffer in system memory */
+int srcDelta, /* Pitch value (in bytes) of the source buffer, +ive means top down and -ive mean button up */
+unsigned int startBit, /* Mono data can start at any bit in a byte, this value should be 0 to 7 */
+unsigned int dBase, /* Address of destination: offset in frame buffer */
+unsigned int dPitch, /* Pitch value of destination surface in BYTE */
+unsigned int bytePerPixel, /* Color depth of destination surface */
+unsigned int dx,
+unsigned int dy, /* Starting coordinate of destination surface */
+unsigned int width,
+unsigned int height, /* width and height of rectange in pixel value */
+unsigned int fColor, /* Foreground color (corresponding to a 1 in the monochrome data */
+unsigned int bColor, /* Background color (corresponding to a 0 in the monochrome data */
+unsigned int rop2) /* ROP value */
+{
+ unsigned int ulBytesPerScan;
+ unsigned int ul4BytesPerScan;
+ unsigned int ulBytesRemain;
+ unsigned int de_ctrl = 0;
+ unsigned char ajRemain[4];
+ int i, j;
+
+ startBit &= 7; /* Just make sure the start bit is within legal range */
+ ulBytesPerScan = (width + startBit + 7) / 8;
+ ul4BytesPerScan = ulBytesPerScan & ~3;
+ ulBytesRemain = ulBytesPerScan & 3;
+
+ if(accel->de_wait() != 0)
+ {
+// inf_msg("*** ImageBlit return -1 ***\n");
+ return -1;
+ }
+
+ /* 2D Source Base.
+ Use 0 for HOST Blt.
+ */
+ write_dpr(accel,DE_WINDOW_SOURCE_BASE, 0);
+
+ /* 2D Destination Base.
+ It is an address offset (128 bit aligned) from the beginning of frame buffer.
+ */
+ write_dpr(accel,DE_WINDOW_DESTINATION_BASE, dBase);
+#if 0
+ /* Program pitch (distance between the 1st points of two adjacent lines).
+ Note that input pitch is BYTE value, but the 2D Pitch register uses
+ pixel values. Need Byte to pixel convertion.
+ */
+ if(bytePerPixel == 3 ){
+ dx *= 3;
+ width *= 3;
+ startBit *= 3;
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0, DE_PITCH, DESTINATION, dPitch) |
+ FIELD_VALUE(0, DE_PITCH, SOURCE, dPitch));//dpr10
+
+ }
+ else
+#endif
+ {
+ write_dpr(accel,DE_PITCH,
+ FIELD_VALUE(0, DE_PITCH, DESTINATION, dPitch/bytePerPixel) |
+ FIELD_VALUE(0, DE_PITCH, SOURCE, dPitch/bytePerPixel));//dpr10
+ }
+
+ /* Screen Window width in Pixels.
+ 2D engine uses this value to calculate the linear address in frame buffer for a given point.
+ */
+ write_dpr(accel,DE_WINDOW_WIDTH,
+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION, (dPitch/bytePerPixel)) |
+ FIELD_VALUE(0, DE_WINDOW_WIDTH, SOURCE, (dPitch/bytePerPixel)));
+
+ /* Note: For 2D Source in Host Write, only X_K1_MONO field is needed, and Y_K2 field is not used.
+ For mono bitmap, use startBit for X_K1. */
+ write_dpr(accel,DE_SOURCE,
+ FIELD_SET (0, DE_SOURCE, WRAP, DISABLE) |
+ FIELD_VALUE(0, DE_SOURCE, X_K1_MONO, startBit));//dpr00
+
+ write_dpr(accel,DE_DESTINATION,
+ FIELD_SET (0, DE_DESTINATION, WRAP, DISABLE) |
+ FIELD_VALUE(0, DE_DESTINATION, X, dx) |
+ FIELD_VALUE(0, DE_DESTINATION, Y, dy));//dpr04
+
+ write_dpr(accel,DE_DIMENSION,
+ FIELD_VALUE(0, DE_DIMENSION, X, width) |
+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, height));//dpr08
+
+ write_dpr(accel,DE_FOREGROUND, fColor);
+ write_dpr(accel,DE_BACKGROUND, bColor);
+
+ de_ctrl = FIELD_VALUE(0, DE_CONTROL, ROP, rop2) |
+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
+ FIELD_SET(0, DE_CONTROL, COMMAND, HOST_WRITE) |
+ FIELD_SET(0, DE_CONTROL, HOST, MONO) |
+ FIELD_SET(0, DE_CONTROL, STATUS, START);
+
+ write_dpr(accel,DE_CONTROL, de_ctrl | deGetTransparency(accel));
+
+ /* Write MONO data (line by line) to 2D Engine data port */
+ for (i=0; i<height; i++)
+ {
+ /* For each line, send the data in chunks of 4 bytes */
+ for (j=0; j<(ul4BytesPerScan/4); j++)
+ {
+ write_dpPort(accel, *(unsigned int *)(pSrcbuf + (j * 4)));
+ }
+
+ if (ulBytesRemain)
+ {
+ memcpy(ajRemain, pSrcbuf+ul4BytesPerScan, ulBytesRemain);
+ write_dpPort(accel, *(unsigned int *)ajRemain);
+ }
+
+ pSrcbuf += srcDelta;
+ }
+
+ return 0;
+}
+
diff --git a/drivers/video/lynxfb/lynx_accel.h b/drivers/video/lynxfb/lynx_accel.h
new file mode 100644
index 0000000..8c5fc13
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_accel.h
@@ -0,0 +1,281 @@
+#ifndef ACCEL_H__
+#define ACCEL_H__
+
+#define HW_ROP2_COPY 0xc
+#define HW_ROP2_XOR 0x6
+
+/* notes: below address are the offset value from de_base_address (0x100000)*/
+
+/* for sm718/750/502 de_base is at mmreg_1mb*/
+#define DE_BASE_ADDR_TYPE1 0x100000
+/* for sm712,de_base is at mmreg_32kb */
+#define DE_BASE_ADDR_TYPE2 0x8000
+/* for sm722,de_base is at mmreg_0 */
+#define DE_BASE_ADDR_TYPE3 0
+
+/* type1 data port address is at mmreg_0x110000*/
+#define DE_PORT_ADDR_TYPE1 0x110000
+/* for sm712,data port address is at mmreg_0 */
+#define DE_PORT_ADDR_TYPE2 0x100000
+/* for sm722,data port address is at mmreg_1mb */
+#define DE_PORT_ADDR_TYPE3 0x100000
+
+#define DE_SOURCE 0x0
+#define DE_SOURCE_WRAP 31:31
+#define DE_SOURCE_WRAP_DISABLE 0
+#define DE_SOURCE_WRAP_ENABLE 1
+#define DE_SOURCE_X_K1 29:16
+#define DE_SOURCE_Y_K2 15:0
+#define DE_SOURCE_X_K1_MONO 20:16
+
+#define DE_DESTINATION 0x4
+#define DE_DESTINATION_WRAP 31:31
+#define DE_DESTINATION_WRAP_DISABLE 0
+#define DE_DESTINATION_WRAP_ENABLE 1
+#define DE_DESTINATION_X 28:16
+#define DE_DESTINATION_Y 15:0
+
+#define DE_DIMENSION 0x8
+#define DE_DIMENSION_X 28:16
+#define DE_DIMENSION_Y_ET 15:0
+
+#define DE_CONTROL 0xC
+#define DE_CONTROL_STATUS 31:31
+#define DE_CONTROL_STATUS_STOP 0
+#define DE_CONTROL_STATUS_START 1
+#define DE_CONTROL_PATTERN 30:30
+#define DE_CONTROL_PATTERN_MONO 0
+#define DE_CONTROL_PATTERN_COLOR 1
+#define DE_CONTROL_UPDATE_DESTINATION_X 29:29
+#define DE_CONTROL_UPDATE_DESTINATION_X_DISABLE 0
+#define DE_CONTROL_UPDATE_DESTINATION_X_ENABLE 1
+#define DE_CONTROL_QUICK_START 28:28
+#define DE_CONTROL_QUICK_START_DISABLE 0
+#define DE_CONTROL_QUICK_START_ENABLE 1
+#define DE_CONTROL_DIRECTION 27:27
+#define DE_CONTROL_DIRECTION_LEFT_TO_RIGHT 0
+#define DE_CONTROL_DIRECTION_RIGHT_TO_LEFT 1
+#define DE_CONTROL_MAJOR 26:26
+#define DE_CONTROL_MAJOR_X 0
+#define DE_CONTROL_MAJOR_Y 1
+#define DE_CONTROL_STEP_X 25:25
+#define DE_CONTROL_STEP_X_POSITIVE 1
+#define DE_CONTROL_STEP_X_NEGATIVE 0
+#define DE_CONTROL_STEP_Y 24:24
+#define DE_CONTROL_STEP_Y_POSITIVE 1
+#define DE_CONTROL_STEP_Y_NEGATIVE 0
+#define DE_CONTROL_STRETCH 23:23
+#define DE_CONTROL_STRETCH_DISABLE 0
+#define DE_CONTROL_STRETCH_ENABLE 1
+#define DE_CONTROL_HOST 22:22
+#define DE_CONTROL_HOST_COLOR 0
+#define DE_CONTROL_HOST_MONO 1
+#define DE_CONTROL_LAST_PIXEL 21:21
+#define DE_CONTROL_LAST_PIXEL_OFF 0
+#define DE_CONTROL_LAST_PIXEL_ON 1
+#define DE_CONTROL_COMMAND 20:16
+#define DE_CONTROL_COMMAND_BITBLT 0
+#define DE_CONTROL_COMMAND_RECTANGLE_FILL 1
+#define DE_CONTROL_COMMAND_DE_TILE 2
+#define DE_CONTROL_COMMAND_TRAPEZOID_FILL 3
+#define DE_CONTROL_COMMAND_ALPHA_BLEND 4
+#define DE_CONTROL_COMMAND_RLE_STRIP 5
+#define DE_CONTROL_COMMAND_SHORT_STROKE 6
+#define DE_CONTROL_COMMAND_LINE_DRAW 7
+#define DE_CONTROL_COMMAND_HOST_WRITE 8
+#define DE_CONTROL_COMMAND_HOST_READ 9
+#define DE_CONTROL_COMMAND_HOST_WRITE_BOTTOM_UP 10
+#define DE_CONTROL_COMMAND_ROTATE 11
+#define DE_CONTROL_COMMAND_FONT 12
+#define DE_CONTROL_COMMAND_TEXTURE_LOAD 15
+#define DE_CONTROL_ROP_SELECT 15:15
+#define DE_CONTROL_ROP_SELECT_ROP3 0
+#define DE_CONTROL_ROP_SELECT_ROP2 1
+#define DE_CONTROL_ROP2_SOURCE 14:14
+#define DE_CONTROL_ROP2_SOURCE_BITMAP 0
+#define DE_CONTROL_ROP2_SOURCE_PATTERN 1
+#define DE_CONTROL_MONO_DATA 13:12
+#define DE_CONTROL_MONO_DATA_NOT_PACKED 0
+#define DE_CONTROL_MONO_DATA_8_PACKED 1
+#define DE_CONTROL_MONO_DATA_16_PACKED 2
+#define DE_CONTROL_MONO_DATA_32_PACKED 3
+#define DE_CONTROL_REPEAT_ROTATE 11:11
+#define DE_CONTROL_REPEAT_ROTATE_DISABLE 0
+#define DE_CONTROL_REPEAT_ROTATE_ENABLE 1
+#define DE_CONTROL_TRANSPARENCY_MATCH 10:10
+#define DE_CONTROL_TRANSPARENCY_MATCH_OPAQUE 0
+#define DE_CONTROL_TRANSPARENCY_MATCH_TRANSPARENT 1
+#define DE_CONTROL_TRANSPARENCY_SELECT 9:9
+#define DE_CONTROL_TRANSPARENCY_SELECT_SOURCE 0
+#define DE_CONTROL_TRANSPARENCY_SELECT_DESTINATION 1
+#define DE_CONTROL_TRANSPARENCY 8:8
+#define DE_CONTROL_TRANSPARENCY_DISABLE 0
+#define DE_CONTROL_TRANSPARENCY_ENABLE 1
+#define DE_CONTROL_ROP 7:0
+
+// Pseudo fields.
+
+#define DE_CONTROL_SHORT_STROKE_DIR 27:24
+#define DE_CONTROL_SHORT_STROKE_DIR_225 0
+#define DE_CONTROL_SHORT_STROKE_DIR_135 1
+#define DE_CONTROL_SHORT_STROKE_DIR_315 2
+#define DE_CONTROL_SHORT_STROKE_DIR_45 3
+#define DE_CONTROL_SHORT_STROKE_DIR_270 4
+#define DE_CONTROL_SHORT_STROKE_DIR_90 5
+#define DE_CONTROL_SHORT_STROKE_DIR_180 8
+#define DE_CONTROL_SHORT_STROKE_DIR_0 10
+#define DE_CONTROL_ROTATION 25:24
+#define DE_CONTROL_ROTATION_0 0
+#define DE_CONTROL_ROTATION_270 1
+#define DE_CONTROL_ROTATION_90 2
+#define DE_CONTROL_ROTATION_180 3
+
+#define DE_PITCH 0x000010
+#define DE_PITCH_DESTINATION 28:16
+#define DE_PITCH_SOURCE 12:0
+
+#define DE_FOREGROUND 0x000014
+#define DE_FOREGROUND_COLOR 31:0
+
+#define DE_BACKGROUND 0x000018
+#define DE_BACKGROUND_COLOR 31:0
+
+#define DE_STRETCH_FORMAT 0x00001C
+#define DE_STRETCH_FORMAT_PATTERN_XY 30:30
+#define DE_STRETCH_FORMAT_PATTERN_XY_NORMAL 0
+#define DE_STRETCH_FORMAT_PATTERN_XY_OVERWRITE 1
+#define DE_STRETCH_FORMAT_PATTERN_Y 29:27
+#define DE_STRETCH_FORMAT_PATTERN_X 25:23
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT 21:20
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_8 0
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_16 1
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_32 2
+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_24 3
+
+#define DE_STRETCH_FORMAT_ADDRESSING 19:16
+#define DE_STRETCH_FORMAT_ADDRESSING_XY 0
+#define DE_STRETCH_FORMAT_ADDRESSING_LINEAR 15
+#define DE_STRETCH_FORMAT_SOURCE_HEIGHT 11:0
+
+#define DE_COLOR_COMPARE 0x000020
+#define DE_COLOR_COMPARE_COLOR 23:0
+
+#define DE_COLOR_COMPARE_MASK 0x000024
+#define DE_COLOR_COMPARE_MASK_MASKS 23:0
+
+#define DE_MASKS 0x000028
+#define DE_MASKS_BYTE_MASK 31:16
+#define DE_MASKS_BIT_MASK 15:0
+
+#define DE_CLIP_TL 0x00002C
+#define DE_CLIP_TL_TOP 31:16
+#define DE_CLIP_TL_STATUS 13:13
+#define DE_CLIP_TL_STATUS_DISABLE 0
+#define DE_CLIP_TL_STATUS_ENABLE 1
+#define DE_CLIP_TL_INHIBIT 12:12
+#define DE_CLIP_TL_INHIBIT_OUTSIDE 0
+#define DE_CLIP_TL_INHIBIT_INSIDE 1
+#define DE_CLIP_TL_LEFT 11:0
+
+#define DE_CLIP_BR 0x000030
+#define DE_CLIP_BR_BOTTOM 31:16
+#define DE_CLIP_BR_RIGHT 12:0
+
+#define DE_MONO_PATTERN_LOW 0x000034
+#define DE_MONO_PATTERN_LOW_PATTERN 31:0
+
+#define DE_MONO_PATTERN_HIGH 0x000038
+#define DE_MONO_PATTERN_HIGH_PATTERN 31:0
+
+#define DE_WINDOW_WIDTH 0x00003C
+#define DE_WINDOW_WIDTH_DESTINATION 28:16
+#define DE_WINDOW_WIDTH_SOURCE 12:0
+
+#define DE_WINDOW_SOURCE_BASE 0x000040
+#define DE_WINDOW_SOURCE_BASE_EXT 27:27
+#define DE_WINDOW_SOURCE_BASE_EXT_LOCAL 0
+#define DE_WINDOW_SOURCE_BASE_EXT_EXTERNAL 1
+#define DE_WINDOW_SOURCE_BASE_CS 26:26
+#define DE_WINDOW_SOURCE_BASE_CS_0 0
+#define DE_WINDOW_SOURCE_BASE_CS_1 1
+#define DE_WINDOW_SOURCE_BASE_ADDRESS 25:0
+
+#define DE_WINDOW_DESTINATION_BASE 0x000044
+#define DE_WINDOW_DESTINATION_BASE_EXT 27:27
+#define DE_WINDOW_DESTINATION_BASE_EXT_LOCAL 0
+#define DE_WINDOW_DESTINATION_BASE_EXT_EXTERNAL 1
+#define DE_WINDOW_DESTINATION_BASE_CS 26:26
+#define DE_WINDOW_DESTINATION_BASE_CS_0 0
+#define DE_WINDOW_DESTINATION_BASE_CS_1 1
+#define DE_WINDOW_DESTINATION_BASE_ADDRESS 25:0
+
+#define DE_ALPHA 0x000048
+#define DE_ALPHA_VALUE 7:0
+
+#define DE_WRAP 0x00004C
+#define DE_WRAP_X 31:16
+#define DE_WRAP_Y 15:0
+
+#define DE_STATUS 0x000050
+#define DE_STATUS_CSC 1:1
+#define DE_STATUS_CSC_CLEAR 0
+#define DE_STATUS_CSC_NOT_ACTIVE 0
+#define DE_STATUS_CSC_ACTIVE 1
+#define DE_STATUS_2D 0:0
+#define DE_STATUS_2D_CLEAR 0
+#define DE_STATUS_2D_NOT_ACTIVE 0
+#define DE_STATUS_2D_ACTIVE 1
+
+
+
+/* blt direction */
+#define TOP_TO_BOTTOM 0
+#define LEFT_TO_RIGHT 0
+#define BOTTOM_TO_TOP 1
+#define RIGHT_TO_LEFT 1
+
+void hw_set2dformat(struct lynx_accel * accel,int fmt);
+
+void hw_de_init(struct lynx_accel * accel);
+
+int hw_fillrect(struct lynx_accel * accel,
+ u32 base,u32 pitch,u32 Bpp,
+ u32 x,u32 y,u32 width,u32 height,
+ u32 color,u32 rop);
+
+int hw712_fillrect(struct lynx_accel * accel,
+ u32 base,u32 pitch,u32 Bpp,
+ u32 x,u32 y,u32 width,u32 height,
+ u32 color,u32 rop);
+
+int hw_copyarea(
+struct lynx_accel * accel,
+unsigned int sBase, /* Address of source: offset in frame buffer */
+unsigned int sPitch, /* Pitch value of source surface in BYTE */
+unsigned int sx,
+unsigned int sy, /* Starting coordinate of source surface */
+unsigned int dBase, /* Address of destination: offset in frame buffer */
+unsigned int dPitch, /* Pitch value of destination surface in BYTE */
+unsigned int bpp, /* Color depth of destination surface */
+unsigned int dx,
+unsigned int dy, /* Starting coordinate of destination surface */
+unsigned int width,
+unsigned int height, /* width and height of rectangle in pixel value */
+unsigned int rop2);
+
+int hw_imageblit(
+struct lynx_accel * accel,
+unsigned char *pSrcbuf, /* pointer to start of source buffer in system memory */
+int srcDelta, /* Pitch value (in bytes) of the source buffer, +ive means top down and -ive mean button up */
+unsigned int startBit, /* Mono data can start at any bit in a byte, this value should be 0 to 7 */
+unsigned int dBase, /* Address of destination: offset in frame buffer */
+unsigned int dPitch, /* Pitch value of destination surface in BYTE */
+unsigned int bytePerPixel, /* Color depth of destination surface */
+unsigned int dx,
+unsigned int dy, /* Starting coordinate of destination surface */
+unsigned int width,
+unsigned int height, /* width and height of rectange in pixel value */
+unsigned int fColor, /* Foreground color (corresponding to a 1 in the monochrome data */
+unsigned int bColor, /* Background color (corresponding to a 0 in the monochrome data */
+unsigned int rop2);
+#endif
diff --git a/drivers/video/lynxfb/lynx_cursor.c b/drivers/video/lynxfb/lynx_cursor.c
new file mode 100644
index 0000000..6612a11
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_cursor.c
@@ -0,0 +1,382 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include<linux/module.h>
+#include<linux/kernel.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+#include <linux/console.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+
+#include "lynx_drv.h"
+#include "lynx_help.h"
+#include "lynx_cursor.h"
+#include "ddk712/ddk712_help.h"
+
+#define PEEK32(addr) \
+readl(cursor->mmio + (addr))
+
+#define POKE32(addr,data) \
+writel((data),cursor->mmio + (addr))
+
+/* cursor control for voyager and 718/750*/
+#define HWC_ADDRESS 0x0
+#define HWC_ADDRESS_ENABLE 31:31
+#define HWC_ADDRESS_ENABLE_DISABLE 0
+#define HWC_ADDRESS_ENABLE_ENABLE 1
+#define HWC_ADDRESS_EXT 27:27
+#define HWC_ADDRESS_EXT_LOCAL 0
+#define HWC_ADDRESS_EXT_EXTERNAL 1
+#define HWC_ADDRESS_CS 26:26
+#define HWC_ADDRESS_CS_0 0
+#define HWC_ADDRESS_CS_1 1
+#define HWC_ADDRESS_ADDRESS 25:0
+
+#define HWC_LOCATION 0x4
+#define HWC_LOCATION_TOP 27:27
+#define HWC_LOCATION_TOP_INSIDE 0
+#define HWC_LOCATION_TOP_OUTSIDE 1
+#define HWC_LOCATION_Y 26:16
+#define HWC_LOCATION_LEFT 11:11
+#define HWC_LOCATION_LEFT_INSIDE 0
+#define HWC_LOCATION_LEFT_OUTSIDE 1
+#define HWC_LOCATION_X 10:0
+
+#define HWC_COLOR_12 0x8
+#define HWC_COLOR_12_2_RGB565 31:16
+#define HWC_COLOR_12_1_RGB565 15:0
+
+#define HWC_COLOR_3 0xC
+#define HWC_COLOR_3_RGB565 15:0
+
+void hw712_cursor_enable(struct lynx_cursor * cursor)
+{
+ /* 712/722 offset is not in unit of byte,but in unit of 2kByte */
+ poke_phr(0x80,cursor->offset & 0xff);
+ poke_phr(0x81,~0x80 & (cursor->offset >> 8));
+ poke_pop(0x82,0x80);
+}
+
+void hw712_cursor_disable(struct lynx_cursor * cursor)
+{
+ poke_hcr(0x82, 0);
+}
+
+void hw712_cursor_setSize(struct lynx_cursor * cursor,
+ int w,int h)
+{
+ ENTER();
+ cursor->w = w;
+ cursor->h = h;
+}
+
+void hw712_cursor_setPos(struct lynx_cursor * cursor,
+ int x,int y)
+{
+ poke_pop(0x90,(x & 0xff));
+ poke_pop(0x91,(x >> 8)&0x7);
+ poke_hcr(0x92, (y & 0xff));
+ poke_hcr(0x93, (y >> 8)&0x7);
+}
+
+void hw712_cursor_setColor(struct lynx_cursor * cursor,
+ u32 fg,u32 bg)
+{
+ char fg8 = 0;
+ char bg8 = 0;
+ ENTER();
+#if 0
+ fg8 = ((fg&0xc000)>>8)|((fg & 0x600)>>6) |((fg & 0x18)>>3);
+ bg8 = ((bg&0xc000)>>8)|((bg & 0x600)>>6) |((bg & 0x18)>>3);
+#else
+ int r,g,b;
+ r = (fg >> 11)&0x1f;
+ g = (fg >> 5)&0x3f;
+ b = fg & 0x1f;
+ r = (r-2)*8/32;
+ g = (g-4)*8/64;
+ b = (b)*4/32;
+ fg8 = (r<<5)|(g<<2)|b;
+
+ r = (bg >> 11)&0x1f;
+ g = (bg >> 5)&0x3f;
+ b = bg & 0x1f;
+ r = (r-2)*8/32;
+ g = (g-4)*8/64;
+ b = (b)*4/32;
+ bg8 = (r<<5)|(g<<2)|b;
+#endif
+
+ poke_pop(0x84,fg8);
+ poke_pop(0x86,bg8);
+ LEAVE();
+}
+
+
+void hw712_cursor_setData(struct lynx_cursor * cursor,
+ u16 rop,const u8* pcol,const u8* pmsk)
+{
+ int i,j,count,pitch,offset;
+ u8 color,mask,opr;
+ u16 data;
+ u16 * pbuffer,*pstart;
+
+ /* in byte*/
+ pitch = cursor->w >> 3;
+
+ /* in byte */
+ count = pitch * cursor->h;
+
+ /* in ushort */
+ offset = cursor->maxW * 2 / 8 / 2;
+ data = 0;
+ pstart = (u16 *)cursor->vstart;
+ pbuffer = pstart;
+
+ for(i=0;i<count;i++)
+ {
+ color = *pcol++;
+ mask = *pmsk++;
+ data = 0;
+
+ /* either method below works well,
+ * but method 2 shows no lag
+ * and method 1 seems a bit wrong*/
+ for(j=0;j<8;j++)
+ {
+ if(rop == ROP_XOR)
+ opr = mask ^ color;
+ else
+ opr = mask & color;
+
+ /* 2 stands for forecolor and 1 for backcolor */
+ data |= ((opr & (0x80>>j))?0x4000:0xc000)>>(j*2);
+ }
+
+ data = ((data&0x00ff)<<8)|((data&0xff00)>>8);
+ *pbuffer = data;
+
+ /* assume pitch is 1,2,4,8,...*/
+ if((i+1) % pitch == 0)/* below line equal to is line */
+ {
+ /* need a return */
+ pstart += offset;
+ pbuffer = pstart;
+ }else{
+ pbuffer++;
+ }
+ }
+ return 0;
+}
+
+/* hw_cursor_xxx works for voyager,718 and 750 */
+void hw_cursor_enable(struct lynx_cursor * cursor)
+{
+ u32 reg;
+ reg = FIELD_VALUE(0,HWC_ADDRESS,ADDRESS,cursor->offset)|
+ FIELD_SET(0,HWC_ADDRESS,EXT,LOCAL)|
+ FIELD_SET(0,HWC_ADDRESS,ENABLE,ENABLE);
+ POKE32(HWC_ADDRESS,reg);
+}
+void hw_cursor_disable(struct lynx_cursor * cursor)
+{
+ POKE32(HWC_ADDRESS,0);
+}
+
+void hw_cursor_setSize(struct lynx_cursor * cursor,
+ int w,int h)
+{
+ cursor->w = w;
+ cursor->h = h;
+}
+void hw_cursor_setPos(struct lynx_cursor * cursor,
+ int x,int y)
+{
+ u32 reg;
+ reg = FIELD_VALUE(0,HWC_LOCATION,Y,y)|
+ FIELD_VALUE(0,HWC_LOCATION,X,x);
+ POKE32(HWC_LOCATION,reg);
+}
+void hw_cursor_setColor(struct lynx_cursor * cursor,
+ u32 fg,u32 bg)
+{
+ POKE32(HWC_COLOR_12,(fg<<16)|(bg&0xffff));
+ POKE32(HWC_COLOR_3,0xffe0);
+}
+
+void hw_cursor_setData(struct lynx_cursor * cursor,
+ u16 rop,const u8* pcol,const u8* pmsk)
+{
+ int i,j,count,pitch,offset;
+ u8 color,mask,opr;
+ u16 data;
+ u16 * pbuffer,*pstart;
+ static ulong odd = 0;
+
+ /* in byte*/
+ pitch = cursor->w >> 3;
+
+ /* in byte */
+ count = pitch * cursor->h;
+
+ /* in ushort */
+ offset = cursor->maxW * 2 / 8 / 2;
+
+ data = 0;
+ pstart = (u16 *)cursor->vstart;
+ pbuffer = pstart;
+
+/*
+ if(odd &1){
+ hw_cursor_setData2(cursor,rop,pcol,pmsk);
+ }
+ odd++;
+ if(odd > 0xfffffff0)
+ odd=0;
+*/
+
+ for(i=0;i<count;i++)
+ {
+ color = *pcol++;
+ mask = *pmsk++;
+ data = 0;
+
+ /* either method below works well,
+ * but method 2 shows no lag
+ * and method 1 seems a bit wrong*/
+#if 0
+ if(rop == ROP_XOR)
+ opr = mask ^ color;
+ else
+ opr = mask & color;
+
+ for(j=0;j<8;j++)
+ {
+
+ if(opr & (0x80 >> j))
+ { //use fg color,id = 2
+ data |= 2 << (j*2);
+ }else{
+ //use bg color,id = 1
+ data |= 1 << (j*2);
+ }
+ }
+#else
+ for(j=0;j<8;j++){
+ if(mask & (0x80>>j)){
+ if(rop == ROP_XOR)
+ opr = mask ^ color;
+ else
+ opr = mask & color;
+
+ /* 2 stands for forecolor and 1 for backcolor */
+ data |= ((opr & (0x80>>j))?2:1)<<(j*2);
+ }
+ }
+#endif
+ *pbuffer = data;
+
+ /* assume pitch is 1,2,4,8,...*/
+#if 0
+ if(!((i+1)&(pitch-1))) /* below line equal to is line */
+#else
+ if((i+1) % pitch == 0)
+#endif
+ {
+ /* need a return */
+ pstart += offset;
+ pbuffer = pstart;
+ }else{
+ pbuffer++;
+ }
+
+ }
+
+
+}
+
+
+void hw_cursor_setData2(struct lynx_cursor * cursor,
+ u16 rop,const u8* pcol,const u8* pmsk)
+{
+ int i,j,count,pitch,offset;
+ u8 color,mask,opr;
+ u16 data;
+ u16 * pbuffer,*pstart;
+
+ /* in byte*/
+ pitch = cursor->w >> 3;
+
+ /* in byte */
+ count = pitch * cursor->h;
+
+ /* in ushort */
+ offset = cursor->maxW * 2 / 8 / 2;
+
+ data = 0;
+ pstart = (u16 *)cursor->vstart;
+ pbuffer = pstart;
+
+ for(i=0;i<count;i++)
+ {
+ color = *pcol++;
+ mask = *pmsk++;
+ data = 0;
+
+ /* either method below works well, but method 2 shows no lag */
+#if 0
+ if(rop == ROP_XOR)
+ opr = mask ^ color;
+ else
+ opr = mask & color;
+
+ for(j=0;j<8;j++)
+ {
+
+ if(opr & (0x80 >> j))
+ { //use fg color,id = 2
+ data |= 2 << (j*2);
+ }else{
+ //use bg color,id = 1
+ data |= 1 << (j*2);
+ }
+ }
+#else
+ for(j=0;j<8;j++){
+ if(mask & (1<<j))
+ data |= ((color & (1<<j))?1:2)<<(j*2);
+ }
+#endif
+ *pbuffer = data;
+
+ /* assume pitch is 1,2,4,8,...*/
+ if(!(i&(pitch-1)))
+ //if((i+1) % pitch == 0)
+ {
+ /* need a return */
+ pstart += offset;
+ pbuffer = pstart;
+ }else{
+ pbuffer++;
+ }
+
+ }
+ return 0;
+
+}
diff --git a/drivers/video/lynxfb/lynx_cursor.h b/drivers/video/lynxfb/lynx_cursor.h
new file mode 100644
index 0000000..5c71d9b
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_cursor.h
@@ -0,0 +1,28 @@
+#ifndef LYNX_CURSOR_H__
+#define LYNX_CURSOR_H__
+
+/* hw_cursor_xxx works for voyager,718 and 750 */
+void hw_cursor_enable(struct lynx_cursor * cursor);
+void hw_cursor_disable(struct lynx_cursor * cursor);
+void hw_cursor_setSize(struct lynx_cursor * cursor,
+ int w,int h);
+void hw_cursor_setPos(struct lynx_cursor * cursor,
+ int x,int y);
+void hw_cursor_setColor(struct lynx_cursor * cursor,
+ u32 fg,u32 bg);
+void hw_cursor_setData(struct lynx_cursor * cursor,
+ u16 rop,const u8* data,const u8* mask);
+void hw_cursor_setData2(struct lynx_cursor * cursor,
+ u16 rop,const u8* data,const u8* mask);
+void hw712_cursor_enable(struct lynx_cursor * cursor);
+
+void hw712_cursor_disable(struct lynx_cursor * cursor);
+
+void hw712_cursor_setSize(struct lynx_cursor * cursor,int w,int h);
+void hw712_cursor_setPos(struct lynx_cursor * cursor,int x,int y);
+void hw712_cursor_setColor(struct lynx_cursor * cursor,u32 fg,u32 bg);
+
+
+void hw712_cursor_setData(struct lynx_cursor * cursor,u16 rop,
+ const u8* pcol,const u8* pmsk);
+#endif
diff --git a/drivers/video/lynxfb/lynx_drv.c b/drivers/video/lynxfb/lynx_drv.c
new file mode 100644
index 0000000..aec5eb3
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_drv.c
@@ -0,0 +1,2222 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include<linux/kernel.h>
+#include<linux/module.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+#include<linux/vmalloc.h> #include<linux/pagemap.h>
+#include <linux/console.h>
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
+#include "lynx_drv.h"
+#include "ver.h"
+#include "lynx_hw750.h"
+#include "lynx_hw712.h"
+#include "lynx_hw502.h"
+#include "lynx_accel.h"
+#include "lynx_cursor.h"
+
+#include "modedb.c"
+
+int smi_indent = 0;
+#ifdef MODULE
+static void __exit lynxfb_exit(void);
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+static int lynxfb_setup(char *);
+static int __init lynxfb_init(void);
+#else
+int __init lynxfb_setup(char *);
+int __init lynxfb_init(void);
+#endif
+
+/* chip specific setup routine */
+static void sm750fb_setup(struct lynx_share*,char*);
+static void sm712fb_setup(struct lynx_share*,char*);
+static void sm502fb_setup(struct lynx_share*,char*);
+static int __devinit lynxfb_pci_probe(struct pci_dev*,const struct pci_device_id *);
+static void __devexit lynxfb_pci_remove(struct pci_dev *);
+
+#ifdef CONFIG_PM
+static int lynxfb_suspend(struct pci_dev *,pm_message_t);
+static int lynxfb_resume(struct pci_dev*);
+#endif
+
+static int __devinit lynxfb_set_fbinfo(struct fb_info*,int);
+static int lynxfb_ops_check_var(struct fb_var_screeninfo*,struct fb_info*);
+static int lynxfb_ops_set_par(struct fb_info*);
+static int lynxfb_ops_setcolreg(unsigned,unsigned,unsigned,unsigned,unsigned,struct fb_info*);
+static int lynxfb_ops_blank(int,struct fb_info*);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+static int lynxfb_ops_cursor(struct fb_info*,struct fb_cursor*);
+static struct platform_device * sm502_create_subdev(struct lynx_share *,const char *,int);
+static void sm502_create_irq(struct lynx_share *,struct resource *);
+static void sm502_create_mem(struct lynx_share *,struct resource *,
+ resource_size_t,resource_size_t,int);
+static void sm502_device_release(struct device *);
+#endif
+/*
+#ifdef __BIG_ENDIAN
+ssize_t lynxfb_ops_write(struct fb_info *info, const char __user *buf,
+ size_t count, loff_t *ppos);
+ssize_t lynxfb_ops_read(struct fb_info *info, char __user *buf,
+ size_t count, loff_t *ppos);
+#endif
+ */
+
+typedef void (*PROC_SPEC_SETUP)(struct lynx_share*,char *);
+typedef int (*PROC_SPEC_MAP)(struct lynx_share*,struct pci_dev*);
+typedef int (*PROC_SPEC_INITHW)(struct lynx_share*,struct pci_dev*);
+
+/* some dedicated var for sm502 */
+static struct platform_device * g_plf_502aud = NULL;
+static struct platform_device * g_plf_502usb = NULL;
+
+static int g_no502disp = 0;
+static int g_no502aud = 0;
+static int g_no502usb = 0;
+
+/* common var for all device */
+static int g_hwcursor = 1;
+static int g_noaccel = 0;
+#ifdef CONFIG_MTRR
+static int g_nomtrr = 0;
+#endif
+static const char * g_fbmode[] = {NULL,NULL};
+static const char * g_def_fbmode = "800x600-16@60";
+static char * g_settings = NULL;
+static int g_dualview = 0;
+#ifdef MODULE
+static char * g_option = NULL;
+#endif
+
+/* if not use spin_lock,system will die if user load driver
+ * and immediatly unload driver frequently (dual)*/
+#if 1
+static inline void myspin_lock(spinlock_t * sl){
+ struct lynx_share * share;
+ share = container_of(sl,struct lynx_share,slock);
+ if(share->dual){
+ spin_lock(sl);
+ }
+}
+
+static inline void myspin_unlock(spinlock_t * sl){
+ struct lynx_share * share;
+ share = container_of(sl,struct lynx_share,slock);
+ if(share->dual){
+ spin_unlock(sl);
+ }
+}
+#else
+#define myspin_lock(a) spin_lock(a)
+#define myspin_unlock(a) spin_unlock(a)
+#endif
+static const struct fb_videomode lynx750_ext[] = {
+ /* 1024x600-60 VESA [1.71:1] */
+ {NULL, 60, 1024, 600, 20423, 144, 40, 18, 1, 104, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1024x600-70 VESA */
+ {NULL, 70, 1024, 600, 17211, 152, 48, 21, 1, 104, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1024x600-75 VESA */
+ {NULL, 75, 1024, 600, 15822, 160, 56, 23, 1, 104, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1024x600-85 VESA */
+ {NULL, 85, 1024, 600, 13730, 168, 56, 26, 1, 112, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 720x480 */
+ {NULL, 60, 720, 480, 37427, 88, 16, 13, 1, 72, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1280x720 [1.78:1] */
+ {NULL, 60, 1280, 720, 13426, 162, 86, 22, 1, 136, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED},
+
+ /* 1280x768@60 */
+ {NULL,60,1280,768,12579,192,64,20,3,128,7,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED},
+
+ {NULL,60,1360,768,11804,208,64,23,1,144,3,
+ FB_SYNC_HOR_HIGH_ACT|FB_VMODE_NONINTERLACED},
+
+ /* 1360 x 768 [1.77083:1] */
+ {NULL, 60, 1360, 768, 11804, 208, 64, 23, 1, 144, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1368 x 768 [1.78:1] */
+ {NULL, 60, 1368, 768, 11647, 216, 72, 23, 1, 144, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1440 x 900 [16:10] */
+ {NULL, 60, 1440, 900, 9392, 232, 80, 28, 1, 152, 3,
+ FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED},
+
+ /* 1440x960 [15:10] */
+ {NULL, 60, 1440, 960, 8733, 240, 88, 30, 1, 152, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED},
+
+ /* 1920x1080 [16:9] */
+ {NULL, 60, 1920, 1080, 6734, 148, 88, 41, 1, 44, 3,
+ FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED},
+};
+
+
+static struct pci_device_id smi_pci_table[] = {
+ {PCI_VENDOR_ID_SMI,PCI_DEVID_LYNX_EXP,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
+ {PCI_VENDOR_ID_SMI,PCI_DEVID_LYNX_SE,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
+ {PCI_VENDOR_ID_SMI,PCI_DEVID_LYNX_EM,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
+ {PCI_VENDOR_ID_SMI,PCI_DEVID_LYNX_3DM,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
+ {PCI_VENDOR_ID_SMI,PCI_DEVID_VOYAGER,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
+ {0,}
+};
+
+static struct pci_driver lynxfb_driver = {
+ .name = _moduleName_,
+ .id_table = smi_pci_table,
+ .probe = lynxfb_pci_probe,
+ .remove = __devexit_p(lynxfb_pci_remove),
+#ifdef CONFIG_PM
+ .suspend = lynxfb_suspend,
+ .resume = lynxfb_resume,
+#endif
+};
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no hardware cursor supported under version 2.6.10, kernel bug */
+static int lynxfb_ops_cursor(struct fb_info* info,struct fb_cursor* fbcursor)
+{
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ struct lynx_cursor * cursor;
+
+ par = info->par;
+ crtc = &par->crtc;
+ cursor = &crtc->cursor;
+
+ if(fbcursor->image.width > cursor->maxW ||
+ fbcursor->image.height > cursor->maxH ||
+ fbcursor->image.depth > 1){
+ return -ENXIO;
+ }
+
+ cursor->disable(cursor);
+ if(fbcursor->set & FB_CUR_SETSIZE){
+ cursor->setSize(cursor,fbcursor->image.width,fbcursor->image.height);
+ }
+
+ if(fbcursor->set & FB_CUR_SETPOS){
+ cursor->setPos(cursor,fbcursor->image.dx - info->var.xoffset,
+ fbcursor->image.dy - info->var.yoffset);
+ }
+
+ if(fbcursor->set & FB_CUR_SETCMAP){
+ /* get the 16bit color of kernel means */
+ u16 fg,bg;
+ fg = ((info->cmap.red[fbcursor->image.fg_color] & 0xf800))|
+ ((info->cmap.green[fbcursor->image.fg_color] & 0xfc00) >> 5)|
+ ((info->cmap.blue[fbcursor->image.fg_color] & 0xf800) >> 11);
+
+ bg = ((info->cmap.red[fbcursor->image.bg_color] & 0xf800))|
+ ((info->cmap.green[fbcursor->image.bg_color] & 0xfc00) >> 5)|
+ ((info->cmap.blue[fbcursor->image.bg_color] & 0xf800) >> 11);
+
+ cursor->setColor(cursor,fg,bg);
+ }
+
+
+ if(fbcursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETIMAGE))
+ {
+ cursor->setData(cursor,
+ fbcursor->rop,
+ fbcursor->image.data,
+ fbcursor->mask);
+ }
+
+ if(fbcursor->enable){
+ cursor->enable(cursor);
+ }
+
+ return 0;
+}
+
+#endif
+
+static void lynxfb_ops_fillrect(struct fb_info* info,const struct fb_fillrect* region)
+{
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+ unsigned int base,pitch,Bpp,rop;
+ u32 color;
+
+ if(info->state != FBINFO_STATE_RUNNING){
+ return;
+ }
+
+ par = info->par;
+ share = par->share;
+
+ /* each time 2d function begin to work,below three variable always need
+ * be set, seems we can put them together in some place */
+ base = par->crtc.oScreen;
+ pitch = info->fix.line_length;
+ Bpp = info->var.bits_per_pixel >> 3;
+
+ color = (Bpp == 1)?region->color:((u32*)info->pseudo_palette)[region->color];
+ rop = ( region->rop != ROP_COPY ) ? HW_ROP2_XOR:HW_ROP2_COPY;
+
+ myspin_lock(&share->slock);
+ share->accel.de_fillrect(&share->accel,
+ base,pitch,Bpp,
+ region->dx,region->dy,
+ region->width,region->height,
+ color,rop);
+ myspin_unlock(&share->slock);
+}
+
+static void lynxfb_ops_copyarea(struct fb_info * info,const struct fb_copyarea * region)
+{
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+ unsigned int base,pitch,Bpp;
+
+ par = info->par;
+ share = par->share;
+
+#if 0
+ share->accel.de_wait();
+ cfb_copyarea(info,region);
+ return;
+#endif
+ /* each time 2d function begin to work,below three variable always need
+ * be set, seems we can put them together in some place */
+ base = par->crtc.oScreen;
+ pitch = info->fix.line_length;
+ Bpp = info->var.bits_per_pixel >> 3;
+
+ myspin_lock(&share->slock);
+ share->accel.de_copyarea(&share->accel,
+ base,pitch,region->sx,region->sy,
+ base,pitch,Bpp,region->dx,region->dy,
+ region->width,region->height,HW_ROP2_COPY);
+ myspin_unlock(&share->slock);
+}
+
+static void lynxfb_ops_imageblit(struct fb_info*info,const struct fb_image* image)
+{
+ unsigned int base,pitch,Bpp;
+ unsigned int fgcol,bgcol;
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+
+ par = info->par;
+ share = par->share;
+ /* each time 2d function begin to work,below three variable always need
+ * be set, seems we can put them together in some place */
+ base = par->crtc.oScreen;
+ pitch = info->fix.line_length;
+ Bpp = info->var.bits_per_pixel >> 3;
+
+ if(image->depth == 1){
+ if(info->fix.visual == FB_VISUAL_TRUECOLOR ||
+ info->fix.visual == FB_VISUAL_DIRECTCOLOR)
+ {
+ fgcol = ((u32*)info->pseudo_palette)[image->fg_color];
+ bgcol = ((u32*)info->pseudo_palette)[image->bg_color];
+ }
+ else
+ {
+ fgcol = image->fg_color;
+ bgcol = image->bg_color;
+ }
+ goto _do_work;
+ }
+ return;
+_do_work:
+ myspin_lock(&share->slock);
+ share->accel.de_imageblit(&share->accel,
+ image->data,image->width>>3,0,
+ base,pitch,Bpp,
+ image->dx,image->dy,
+ image->width,image->height,
+ fgcol,bgcol,HW_ROP2_COPY);
+ myspin_unlock(&share->slock);
+}
+
+static int lynxfb_ops_pan_display(struct fb_var_screeninfo *var,
+ struct fb_info *info)
+{
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ int ret;
+ ENTER();
+
+ if(!info)
+ LEAVE(-EINVAL);
+
+ ret = 0;
+ par = info->par;
+ crtc = &par->crtc;
+ ret = crtc->proc_panDisplay(crtc, var, info);
+
+ LEAVE(ret);
+}
+
+static struct fb_ops lynxfb_ops={
+ .owner = THIS_MODULE,
+ .fb_check_var = lynxfb_ops_check_var,
+ .fb_set_par = lynxfb_ops_set_par,
+ .fb_setcolreg = lynxfb_ops_setcolreg,
+ .fb_blank = lynxfb_ops_blank,
+ /* will be hooked by hardware */
+ .fb_fillrect = cfb_fillrect,
+ .fb_imageblit = cfb_imageblit,
+ .fb_copyarea = cfb_copyarea,
+ /* cursor */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ .fb_cursor = lynxfb_ops_cursor,
+#else
+ .fb_cursor = soft_cursor,
+#endif
+};
+#if 0
+static size_t spec_size[]={ sizeof(struct sm750_share),/* for sm718/750*/
+ sizeof(struct sm712_share),/* for sm712/722/710/720 */
+ sizeof(struct sm502_share),/* for sm502/sm107 */
+ };
+
+static PROC_SPEC_SETUP setup_rout[] = {
+ sm750fb_setup,
+ sm712fb_setup,
+ sm502fb_setup,
+ };
+
+static PROC_SPEC_MAP map_rout[] = {
+ hw_sm750_map,
+ hw_sm712_map,
+ hw_sm502_map,
+ };
+
+static PROC_SPEC_INITHW inithw_rout[] = {
+ hw_sm750_inithw,
+ hw_sm712_inithw,
+ hw_sm502_inithw,
+ };
+#else
+static size_t spec_size[] = {
+ [SPC_SM750] = sizeof(struct sm750_share),
+ [SPC_SM712] = sizeof(struct sm712_share),
+ [SPC_SM502] = sizeof(struct sm502_share)
+};
+
+static PROC_SPEC_SETUP setup_rout[] = {
+ [SPC_SM750] = sm750fb_setup,
+ [SPC_SM712] = sm712fb_setup,
+ [SPC_SM502] = sm502fb_setup
+};
+
+static PROC_SPEC_MAP map_rout[]= {
+ [SPC_SM750] = hw_sm750_map,
+ [SPC_SM712] = hw_sm712_map,
+ [SPC_SM502] = hw_sm502_map
+};
+
+static PROC_SPEC_INITHW inithw_rout[] = {
+ [SPC_SM750] = hw_sm750_inithw,
+ [SPC_SM712] = hw_sm712_inithw,
+ [SPC_SM502] = hw_sm502_inithw,
+};
+#endif
+static int g_specId;
+
+#ifdef CONFIG_PM
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+static u32 pci_state[16];
+
+static int lynxfb_suspend(struct pci_dev *pdev,pm_message_t mesg){
+ int ret;
+ struct fb_info * info;
+ struct lynx_share * share;
+
+ ENTER();
+ ret = 0;
+ share = pci_get_drvdata(pdev);
+
+ if(mesg != 2 || mesg == pdev->dev.power_state)
+ return ret;
+
+ /* suspend */
+ acquire_console_sem();
+
+ info = share->fbinfo[0];
+ if(info){
+ fb_set_suspend(info,1);
+ }
+
+ info = share->fbinfo[1];
+
+ if(info){
+ fb_set_suspend(info,1);
+ }
+
+ /* hardware suspend stuffs */
+ if(mesg == 2 && share->suspend)
+ share->suspend(share);
+
+ pci_save_state(pdev,&pci_state);
+ pci_disable_device(pdev);
+ ret = pci_set_power_state(pdev,mesg);
+
+ release_console_sem();
+ pdev->dev.power_state = mesg;
+ LEAVE(ret);
+}
+
+static int lynxfb_resume(struct pci_dev *pdev){
+ int ret;
+ struct fb_info * info;
+ struct lynx_share * share;
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ struct lynx_cursor * cursor;
+
+ ENTER();
+ share = pci_get_drvdata(pdev);
+ ret = 0;
+
+ acquire_console_sem();
+
+ pci_set_power_state(pdev, 0);
+ pci_restore_state(pdev,&pci_state);
+ pci_enable_device(pdev);
+
+ if(pdev->dev.power_state == 2 && share->resume)
+ share->resume(share);
+
+ (*inithw_rout[g_specId])(share,pdev);
+
+ info = share->fbinfo[0];
+ if(info){
+ par = info->par;
+ crtc = &par->crtc;
+ cursor = &crtc->cursor;
+ memset(cursor->vstart, 0x0, cursor->size);
+ memset(crtc->vScreen,0x0,crtc->vidmem_size);
+ lynxfb_ops_set_par(info);
+ fb_set_suspend(info,0);
+ }
+
+ info = share->fbinfo[1];
+
+ if(info){
+ par = info->par;
+ crtc = &par->crtc;
+ cursor = &crtc->cursor;
+ memset(cursor->vstart, 0x0, cursor->size);
+ memset(crtc->vScreen,0x0,crtc->vidmem_size);
+ lynxfb_ops_set_par(info);
+ fb_set_suspend(info,0);
+ }
+
+ release_console_sem();
+ pdev->dev.power_state = 0;
+ LEAVE(ret);
+}
+
+
+#else
+static int lynxfb_suspend(struct pci_dev * pdev,pm_message_t mesg)
+{
+ struct fb_info * info;
+ struct lynx_share * share;
+ int ret;
+ ENTER();
+
+ if(mesg.event == pdev->dev.power.power_state.event)
+ LEAVE(0);
+
+ ret = 0;
+ share = pci_get_drvdata(pdev);
+ switch (mesg.event) {
+ case PM_EVENT_FREEZE:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+ case PM_EVENT_PRETHAW:
+#endif
+ pdev->dev.power.power_state = mesg;
+ LEAVE(0);
+ }
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ acquire_console_sem();
+#else
+ console_lock();
+#endif
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)
+ if (mesg.event & PM_EVENT_SUSPEND) {
+#else
+ if (mesg.event & PM_EVENT_SLEEP) {
+#endif
+ info = share->fbinfo[0];
+ if(info)
+ fb_set_suspend(info, 1);/* 1 means do suspend*/
+
+ info = share->fbinfo[1];
+ if(info)
+ fb_set_suspend(info, 1);/* 1 means do suspend*/
+
+ ret = pci_save_state(pdev);
+ if(ret){
+ err_msg("error:%d occured in pci_save_state\n",ret);
+ LEAVE(ret);
+ }
+
+ /* set chip to sleep mode */
+ if(share->suspend)
+ (*share->suspend)(share);
+
+ pci_disable_device(pdev);
+ ret = pci_set_power_state(pdev,pci_choose_state(pdev,mesg));
+ if(ret){
+ err_msg("error:%d occured in pci_set_power_state\n",ret);
+ LEAVE(ret);
+ }
+ }
+
+ pdev->dev.power.power_state = mesg;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ release_console_sem();
+#else
+ console_unlock();
+#endif
+ LEAVE(ret);
+}
+
+static int lynxfb_resume(struct pci_dev* pdev)
+{
+ struct fb_info * info;
+ struct lynx_share * share;
+
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ struct lynx_cursor * cursor;
+
+ int ret;
+ ENTER();
+
+ ret = 0;
+ share = pci_get_drvdata(pdev);
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ acquire_console_sem();
+#else
+ console_lock();
+#endif
+
+ if((ret = pci_set_power_state(pdev, PCI_D0)) != 0){
+ err_msg("error:%d occured in pci_set_power_state\n",ret);
+ LEAVE(ret);
+ }
+
+
+ if(pdev->dev.power.power_state.event != PM_EVENT_FREEZE){
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ /* for linux 2.6.35 and lower */
+ if((ret = pci_restore_state(pdev)) != 0){
+ err_msg("error:%d occured in pci_restore_state\n",ret);
+ LEAVE(ret);
+ }
+#else
+ pci_restore_state(pdev);
+#endif
+ if ((ret = pci_enable_device(pdev)) != 0){
+ err_msg("error:%d occured in pci_enable_device\n",ret);
+ LEAVE(ret);
+ }
+ pci_set_master(pdev);
+ }
+ if(share->resume)
+ (*share->resume)(share);
+
+ (*inithw_rout[g_specId])(share,pdev);
+
+
+ info = share->fbinfo[0];
+
+ if(info){
+ par = info->par;
+ crtc = &par->crtc;
+ cursor = &crtc->cursor;
+ memset(cursor->vstart, 0x0, cursor->size);
+ memset(crtc->vScreen,0x0,crtc->vidmem_size);
+ lynxfb_ops_set_par(info);
+ fb_set_suspend(info, 0);
+ }
+
+ info = share->fbinfo[1];
+
+ if(info){
+ par = info->par;
+ crtc = &par->crtc;
+ cursor = &crtc->cursor;
+ memset(cursor->vstart, 0x0, cursor->size);
+ memset(crtc->vScreen,0x0,crtc->vidmem_size);
+ lynxfb_ops_set_par(info);
+ fb_set_suspend(info, 0);
+ }
+
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,35)
+ release_console_sem();
+#else
+ console_unlock();
+#endif
+ LEAVE(ret);
+}
+#endif
+#endif
+
+static int lynxfb_ops_check_var(struct fb_var_screeninfo* var,struct fb_info* info)
+{
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ struct lynxfb_output * output;
+ struct lynx_share * share;
+ int ret;
+ resource_size_t request;
+
+ ENTER();
+ par = info->par;
+ crtc = &par->crtc;
+ output = &par->output;
+ share = par->share;
+ ret = 0;
+
+ dbg_msg("check var:%dx%d-%d\n",
+ var->xres,
+ var->yres,
+ var->bits_per_pixel);
+
+
+ switch(var->bits_per_pixel){
+ case 8:
+ case 16:
+ case 24: /* support 24 bpp for only lynx712/722/720 */
+ case 32:
+ break;
+ default:
+ err_msg("bpp %d not supported\n",var->bits_per_pixel);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ switch(var->bits_per_pixel){
+ case 8:
+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
+ var->red.offset = 0;
+ var->red.length = 8;
+ var->green.offset = 0;
+ var->green.length = 8;
+ var->blue.offset = 0;
+ var->blue.length = 8;
+ var->transp.length = 0;
+ var->transp.offset = 0;
+ break;
+ case 16:
+ var->red.offset = 11;
+ var->red.length = 5;
+ var->green.offset = 5;
+ var->green.length = 6;
+ var->blue.offset = 0;
+ var->blue.length = 5;
+ var->transp.length = 0;
+ var->transp.offset = 0;
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
+ break;
+ case 24:
+ case 32:
+ var->red.offset = 16;
+ var->red.length = 8;
+ var->green.offset = 8;
+ var->green.length = 8;
+ var->blue.offset = 0 ;
+ var->blue.length = 8;
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+ var->height = var->width = -1;
+ var->accel_flags = FB_ACCELF_TEXT;
+
+ /* check if current fb's video memory big enought to hold the onscreen */
+ request = var->xres_virtual * (var->bits_per_pixel >> 3);
+ /* defaulty crtc->channel go with par->index */
+
+ request = PADDING(crtc->line_pad,request);
+ request = request * var->yres_virtual;
+ if(crtc->vidmem_size < request){
+ err_msg("not enough video memory for mode\n");
+ LEAVE(-ENOMEM);
+ }
+
+ ret = output->proc_checkMode(output,var);
+ if(!ret)
+ ret = crtc->proc_checkMode(crtc,var);
+exit:
+ LEAVE(ret);
+}
+
+static int lynxfb_ops_set_par(struct fb_info * info)
+{
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+ struct lynxfb_crtc * crtc;
+ struct lynxfb_output * output;
+ struct fb_var_screeninfo * var;
+ struct fb_fix_screeninfo * fix;
+ int ret;
+ unsigned int line_length;
+ ENTER();
+
+ if(!info)
+ LEAVE(-EINVAL);
+
+ ret = 0;
+ par = info->par;
+ share = par->share;
+ crtc = &par->crtc;
+ output = &par->output;
+ var = &info->var;
+ fix = &info->fix;
+
+ /* fix structur is not so FIX ... */
+ line_length = var->xres_virtual * var->bits_per_pixel / 8;
+ line_length = PADDING(crtc->line_pad,line_length);
+ fix->line_length = line_length;
+ err_msg("fix->line_length = %d\n",fix->line_length);
+
+ /* var->red,green,blue,transp are need to be set by driver
+ * and these data should be set before setcolreg routine
+ * */
+
+ switch(var->bits_per_pixel){
+ case 8:
+ fix->visual = FB_VISUAL_PSEUDOCOLOR;
+ var->red.offset = 0;
+ var->red.length = 8;
+ var->green.offset = 0;
+ var->green.length = 8;
+ var->blue.offset = 0;
+ var->blue.length = 8;
+ var->transp.length = 0;
+ var->transp.offset = 0;
+ break;
+ case 16:
+ var->red.offset = 11;
+ var->red.length = 5;
+ var->green.offset = 5;
+ var->green.length = 6;
+ var->blue.offset = 0;
+ var->blue.length = 5;
+ var->transp.length = 0;
+ var->transp.offset = 0;
+ fix->visual = FB_VISUAL_TRUECOLOR;
+ break;
+ case 24:
+ case 32:
+ var->red.offset = 16;
+ var->red.length = 8;
+ var->green.offset = 8;
+ var->green.length = 8;
+ var->blue.offset = 0 ;
+ var->blue.length = 8;
+ fix->visual = FB_VISUAL_TRUECOLOR;
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+ var->height = var->width = -1;
+ var->accel_flags = FB_ACCELF_TEXT;
+
+ if(ret){
+ err_msg("pixel bpp format not satisfied\n.");
+ LEAVE(ret);
+ }
+ ret = crtc->proc_setMode(crtc,var,fix);
+ if(!ret)
+ ret = output->proc_setMode(output,var,fix);
+ LEAVE(ret);
+}
+static inline unsigned int chan_to_field(unsigned int chan,struct fb_bitfield * bf)
+{
+ chan &= 0xffff;
+ chan >>= 16 - bf->length;
+ return chan << bf->offset;
+}
+
+static int lynxfb_ops_setcolreg(unsigned regno,unsigned red,
+ unsigned green,unsigned blue,
+ unsigned transp,struct fb_info * info)
+{
+ struct lynxfb_par * par;
+ struct lynxfb_crtc * crtc;
+ struct fb_var_screeninfo * var;
+ int ret;
+
+ par = info->par;
+ crtc = &par->crtc;
+ var = &info->var;
+ ret = 0;
+
+ //dbg_msg("regno=%d,red=%d,green=%d,blue=%d\n",regno,red,green,blue);
+ if(regno > 256){
+ err_msg("regno = %d\n",regno);
+ LEAVE(-EINVAL);
+ }
+
+ if(info->var.grayscale)
+ red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
+
+ if(var->bits_per_pixel == 8 && info->fix.visual == FB_VISUAL_PSEUDOCOLOR)
+ {
+ red >>= 8;
+ green >>= 8;
+ blue >>= 8;
+ ret = crtc->proc_setColReg(crtc,regno,red,green,blue);
+ goto exit;
+ }
+
+
+ if(info->fix.visual == FB_VISUAL_TRUECOLOR && regno < 256 )
+ {
+ u32 val;
+ if(var->bits_per_pixel == 16 ||
+ var->bits_per_pixel == 32 ||
+ var->bits_per_pixel == 24)
+ {
+ val = chan_to_field(red,&var->red);
+ val |= chan_to_field(green,&var->green);
+ val |= chan_to_field(blue,&var->blue);
+ par->pseudo_palette[regno] = val;
+ goto exit;
+ }
+ }
+
+ ret = -EINVAL;
+
+exit:
+ return ret;
+ LEAVE(ret);
+
+}
+
+static int lynxfb_ops_blank(int blank,struct fb_info* info)
+{
+ struct lynxfb_par * par;
+ struct lynxfb_output * output;
+ ENTER();
+ dbg_msg("blank = %d.\n",blank);
+ par = info->par;
+ output = &par->output;
+ LEAVE(output->proc_setBLANK(output,blank));
+}
+
+static int sm502fb_set_drv(struct lynxfb_par * par)
+{
+ int ret;
+ struct lynx_share * share;
+ struct sm502_share * spec_share;
+ struct lynxfb_output * output;
+ struct lynxfb_crtc * crtc;
+
+ ENTER();
+ ret = 0;
+ share = par->share;
+ spec_share = container_of(share,struct sm502_share,share);
+ output = &par->output;
+ crtc = &par->crtc;
+
+ spec_share->hwCursor = g_hwcursor;
+ spec_share->usb_off = g_no502usb;
+ spec_share->aud_off = g_no502aud;
+
+ crtc->proc_setMode = hw_sm502_crtc_setMode;
+ crtc->proc_checkMode = hw_sm502_crtc_checkMode;
+ crtc->proc_setColReg = hw_sm502_setColReg;
+ crtc->clear = hw_sm502_crtc_clear;
+ crtc->line_pad = 16;
+ crtc->xpanstep = crtc->ypanstep = crtc->ywrapstep = 0;
+
+ output->proc_setMode = hw_sm502_output_setMode;
+ output->proc_checkMode = hw_sm502_output_checkMode;
+ output->proc_setBLANK = hw_sm502_setBLANK;
+ output->clear = hw_sm502_output_clear;
+
+ /* chip specific phase */
+ share->accel.de_wait = hw_sm502_deWait;
+
+ crtc->vidmem_size = (share->dual)?share->vidmem_size>>1:share->vidmem_size;
+ if(!spec_share->usb_off && par->index == 1){
+ /* usb function on,and this is the second view */
+ crtc->vidmem_size -= 0x80000;
+ }
+
+
+ output->channel = &crtc->channel;
+ switch (spec_share->state.dataflow)
+ {
+ case sm502_simul_pri:
+ output->paths = sm502_pnc;
+ crtc->channel = sm502_primary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ inf_msg("use simul primary mode\n");
+ break;
+ case sm502_dual_normal:
+ if(par->index == 0){
+ output->paths = sm502_panel;
+ crtc->channel = sm502_primary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ }else{
+ output->paths = sm502_crt;
+ crtc->channel = sm502_secondary;
+ crtc->oScreen = (share->vidmem_size >> 1);
+ crtc->vScreen = share->pvMem + crtc->oScreen;
+ }
+ inf_msg("use dual mode\n");
+ break;
+ case sm502_single_sec:
+ output->paths = sm502_crt;
+ crtc->channel = sm502_secondary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ inf_msg("use secondary channel single mode\n");
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ LEAVE(ret);
+}
+
+static int sm712fb_set_drv(struct lynxfb_par * par)
+{
+ int ret;
+ struct lynx_share * share;
+ struct sm712_share * spec_share;
+ struct lynxfb_output * output;
+ struct lynxfb_crtc * crtc;
+
+ ENTER();
+ ret = 0;
+ share = par->share;
+ spec_share = container_of(share,struct sm712_share,share);
+ output = &par->output;
+ crtc = &par->crtc;
+
+ /* moved from lynxfb_set_fbinfo to here */
+ crtc->proc_setMode = hw_sm712_crtc_setMode;
+ crtc->proc_checkMode = hw_sm712_crtc_checkMode;
+ crtc->proc_setColReg = hw_sm712_setColReg;
+ crtc->clear = hw_sm712_crtc_clear;
+
+ /* for sm712/722,crt channel and lcd channel both
+ * share the same padding value of their offset register,
+ * which is 8 bytes. so no need of the check of crtc
+ * */
+ crtc->line_pad = 8;
+ crtc->xpanstep = crtc->ypanstep = crtc->ywrapstep = 0;
+
+ output->proc_setMode = hw_sm712_output_setMode;
+ output->proc_checkMode = hw_sm712_output_checkMode;
+ output->proc_setBLANK = hw_sm712_setBLANK;
+ output->clear = hw_sm712_output_clear;
+ /* chip specific phase */
+ share->accel.de_wait = hw_sm712_deWait;
+
+ /* sm712/722 can't use RectFill feature
+ * so use bitblt to replace it
+ * */
+ share->accel.de_fillrect = hw712_fillrect;
+ crtc->vidmem_size = share->vidmem_size;
+ crtc->vScreen = share->pvMem;
+ crtc->oScreen = 0;
+ /*defaultly use SIMUL mode */
+ output->paths = 3;
+
+ if(share->dual){
+ crtc->vidmem_size >>= 1;
+ if(par->index){
+ crtc->oScreen += share->vidmem_size - crtc->vidmem_size;
+ crtc->vScreen += crtc->oScreen;
+ output->paths = 2;
+ }else{
+ output->paths = 1;
+ }
+ }
+
+ LEAVE(0);
+}
+
+static int sm750fb_set_drv(struct lynxfb_par * par)
+{
+ int ret;
+ struct lynx_share * share;
+ struct sm750_share * spec_share;
+ struct lynxfb_output * output;
+ struct lynxfb_crtc * crtc;
+ ENTER();
+ ret = 0;
+
+ share = par->share;
+ spec_share = container_of(share,struct sm750_share,share);
+ output = &par->output;
+ crtc = &par->crtc;
+
+ crtc->vidmem_size = (share->dual)?share->vidmem_size>>1:share->vidmem_size;
+ /* setup crtc and output member */
+ spec_share->hwCursor = g_hwcursor;
+
+ crtc->proc_setMode = hw_sm750_crtc_setMode;
+ crtc->proc_checkMode = hw_sm750_crtc_checkMode;
+ crtc->proc_setColReg = hw_sm750_setColReg;
+ crtc->proc_panDisplay = hw_sm750_pan_display;
+ crtc->clear = hw_sm750_crtc_clear;
+ crtc->line_pad = 16;
+ //crtc->xpanstep = crtc->ypanstep = crtc->ywrapstep = 0;
+ crtc->xpanstep = 8;
+ crtc->ypanstep = 1;
+ crtc->ywrapstep = 0;
+
+ output->proc_setMode = hw_sm750_output_setMode;
+ output->proc_checkMode = hw_sm750_output_checkMode;
+
+ output->proc_setBLANK = (share->revid == SM750LE_REVISION_ID)?hw_sm750le_setBLANK:hw_sm750_setBLANK;
+ output->clear = hw_sm750_output_clear;
+ /* chip specific phase */
+ share->accel.de_wait = (share->revid == SM750LE_REVISION_ID)?hw_sm750le_deWait: hw_sm750_deWait;
+ switch (spec_share->state.dataflow)
+ {
+ case sm750_simul_pri:
+ output->paths = sm750_pnc;
+ crtc->channel = sm750_primary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ inf_msg("use simul primary mode\n");
+ break;
+ case sm750_simul_sec:
+ output->paths = sm750_pnc;
+ crtc->channel = sm750_secondary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ break;
+ case sm750_dual_normal:
+ if(par->index == 0){
+ output->paths = sm750_panel;
+ crtc->channel = sm750_primary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ }else{
+ output->paths = sm750_crt;
+ crtc->channel = sm750_secondary;
+ /* not consider of padding stuffs for oScreen,need fix*/
+ crtc->oScreen = (share->vidmem_size >> 1);
+ crtc->vScreen = share->pvMem + crtc->oScreen;
+ }
+ break;
+ case sm750_dual_swap:
+ if(par->index == 0){
+ output->paths = sm750_panel;
+ crtc->channel = sm750_secondary;
+ crtc->oScreen = 0;
+ crtc->vScreen = share->pvMem;
+ }else{
+ output->paths = sm750_crt;
+ crtc->channel = sm750_primary;
+ /* not consider of padding stuffs for oScreen,need fix*/
+ crtc->oScreen = (share->vidmem_size >> 1);
+ crtc->vScreen = share->pvMem + crtc->oScreen;
+ }
+ break;
+ default:
+ ret = -EINVAL;
+ }
+
+ LEAVE(ret);
+}
+
+static int __devinit lynxfb_set_fbinfo(struct fb_info* info,int index)
+{
+ int i;
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+ struct lynxfb_crtc * crtc;
+ struct lynxfb_output * output;
+ struct fb_var_screeninfo * var;
+ struct fb_fix_screeninfo * fix;
+
+ const struct fb_videomode * pdb[] = {
+ NULL,NULL,vesa_modes,
+ };
+ int cdb[] = {0,0,VESA_MODEDB_SIZE};
+ static const char * mdb_desc[] ={
+ "driver prepared modes",
+ "kernel prepared default modedb",
+ "kernel HELPERS prepared vesa_modes",
+ };
+
+#define sm502_ext lynx750_ext
+ static const struct fb_videomode * ext_table[] = {lynx750_ext,NULL,sm502_ext};
+ static size_t ext_size[]={ARRAY_SIZE(lynx750_ext),0,ARRAY_SIZE(sm502_ext)};
+
+ static const char * fixId[][2]=
+ {
+ {"sm750_fb1","sm750_fb2"},
+ {"sm712_fb1","sm712_fb2"},
+ {"sm502_fb1","sm502_fb2"},
+ };
+
+ int ret,line_length;
+ ENTER();
+ ret = 0;
+ par = (struct lynxfb_par *)info->par;
+ share = par->share;
+ crtc = &par->crtc;
+ output = &par->output;
+ var = &info->var;
+ fix = &info->fix;
+
+ /* set index */
+ par->index = index;
+ output->channel = &crtc->channel;
+ switch (g_specId){
+ case SPC_SM750:
+ sm750fb_set_drv(par);
+ lynxfb_ops.fb_pan_display = lynxfb_ops_pan_display;
+ break;
+ case SPC_SM712:
+ sm712fb_set_drv(par);
+ break;
+ case SPC_SM502:
+ sm502fb_set_drv(par);
+ break;
+ }
+
+ /* set current cursor variable and proc pointer,
+ * must be set after crtc member initialized */
+ if(g_specId != SPC_SM712){
+ crtc->cursor.offset = crtc->oScreen + crtc->vidmem_size - 1024;
+ crtc->cursor.mmio = share->pvReg + 0x800f0 + (int)crtc->channel * 0x140;
+
+ inf_msg("crtc->cursor.mmio = %p\n",crtc->cursor.mmio);
+ crtc->cursor.maxH = crtc->cursor.maxW = 64;
+ crtc->cursor.size = crtc->cursor.maxH*crtc->cursor.maxW*2/8;
+ crtc->cursor.disable = hw_cursor_disable;
+ crtc->cursor.enable = hw_cursor_enable;
+ crtc->cursor.setColor = hw_cursor_setColor;
+ crtc->cursor.setPos = hw_cursor_setPos;
+ crtc->cursor.setSize = hw_cursor_setSize;
+ crtc->cursor.setData = hw_cursor_setData;
+ crtc->cursor.vstart = share->pvMem + crtc->cursor.offset;
+ }else{
+ /* sm712/722 hardware cursor */
+ /* sm712/722 requir 2kb the chunk size
+ * high 1kb for cursor and low 1kb for pop up icon
+ * */
+ crtc->cursor.offset = (crtc->oScreen + crtc->vidmem_size)/2048 - 1;
+ crtc->cursor.mmio = NULL;
+ crtc->cursor.maxH = crtc->cursor.maxW = 64;//popup icon
+ crtc->cursor.size = crtc->cursor.maxH * crtc->cursor.maxW*2/8;
+ crtc->cursor.disable = hw712_cursor_disable;
+ crtc->cursor.enable = hw712_cursor_enable;
+ crtc->cursor.setColor = hw712_cursor_setColor;
+ crtc->cursor.setPos = hw712_cursor_setPos;
+ crtc->cursor.setSize = hw712_cursor_setSize;
+ crtc->cursor.setData = hw712_cursor_setData;
+ crtc->cursor.vstart = crtc->vScreen +
+ (crtc->cursor.offset * 2048);
+ }
+
+
+ crtc->cursor.share = share;
+ memset(crtc->cursor.vstart, 0, crtc->cursor.size);
+ if(!g_hwcursor){
+ lynxfb_ops.fb_cursor = NULL;
+ crtc->cursor.disable(&crtc->cursor);
+ }
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+ /* hardware cursor broken under low version kernel*/
+ lynxfb_ops.fb_cursor = soft_cursor;
+#endif
+
+ /* set info->fbops, must be set before fb_find_mode */
+ if(!share->accel_off){
+ /* use 2d acceleration */
+ lynxfb_ops.fb_fillrect = lynxfb_ops_fillrect;
+ lynxfb_ops.fb_copyarea = lynxfb_ops_copyarea;
+ lynxfb_ops.fb_imageblit = lynxfb_ops_imageblit;
+ }
+ info->fbops = &lynxfb_ops;
+
+ if(!g_fbmode[index]){
+ g_fbmode[index] = g_def_fbmode;
+ if(index)
+ g_fbmode[index] = g_fbmode[0];
+ }
+
+ pdb[0] = ext_table[g_specId];
+ cdb[0] = ext_size[g_specId];
+
+ for(i=0;i<3;i++){
+ /* no NULL pointer passed to fb_find_mode @4 */
+ if(pdb[i] == NULL){
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+ pdb[i] = &modedb2[0];
+ cdb[i] = nmodedb2;
+#endif
+ }
+
+ ret = fb_find_mode(var,info,g_fbmode[index],
+ pdb[i],cdb[i],NULL,8);
+
+ if(ret == 1){
+ inf_msg("success! use specified mode:%s in %s\n",
+ g_fbmode[index],
+ mdb_desc[i]);
+ break;
+ }else if(ret == 2){
+ war_msg("use specified mode:%s in %s,with an ignored refresh rate\n",
+ g_fbmode[index],
+ mdb_desc[i]);
+ break;
+ }else if(ret == 3){
+ war_msg("wanna use default mode\n");
+// break;
+ }else if(ret == 4){
+ war_msg("fall back to any valid mode\n");
+ }else{
+ war_msg("ret = %d,fb_find_mode failed,with %s\n",ret,mdb_desc[i]);
+ }
+ }
+
+ /* some member of info->var had been set by fb_find_mode */
+
+ inf_msg("Member of info->var is :\n\
+ xres=%d\n\
+ yres=%d\n\
+ xres_virtual=%d\n\
+ yres_virtual=%d\n\
+ xoffset=%d\n\
+ yoffset=%d\n\
+ bits_per_pixel=%d\n \
+ ...\n",var->xres,var->yres,var->xres_virtual,var->yres_virtual,
+ var->xoffset,var->yoffset,var->bits_per_pixel);
+
+ /* set par */
+ par->info = info;
+
+ /* set info */
+ line_length = PADDING(crtc->line_pad,
+ (var->xres_virtual * var->bits_per_pixel/8));
+
+ info->pseudo_palette = &par->pseudo_palette[0];
+ info->screen_base = crtc->vScreen;
+ dbg_msg("screen_base vaddr = %p\n",info->screen_base);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)
+ info->screen_size = line_length * var->yres_virtual;
+#endif
+ info->flags = FBINFO_FLAG_DEFAULT|0;
+
+ /* set info->fix */
+ fix->type = FB_TYPE_PACKED_PIXELS;
+ fix->type_aux = 0;
+ fix->xpanstep = crtc->xpanstep;
+ fix->ypanstep = crtc->ypanstep;
+ fix->ywrapstep = crtc->ywrapstep;
+ fix->accel = FB_ACCEL_NONE;
+
+ strlcpy(fix->id,fixId[g_specId][index],sizeof(fix->id));
+
+
+ fix->smem_start = crtc->oScreen + share->vidmem_start;
+ inf_msg("fix->smem_start = %lx\n",fix->smem_start);
+#if 0
+ /* how many frame buffer this fb_info get, currently we set onscreen size to it
+ we may set it to video memory size
+ */
+ fix->smem_len = info->screen_size;
+#else
+ /* according to mmap experiment from user space application,
+ * fix->mmio_len should not larger than virtual size
+ * (xres_virtual x yres_virtual x ByPP)
+ * Below line maybe buggy when user mmap fb dev node and write
+ * data into the bound over virtual size
+ * */
+ fix->smem_len = crtc->vidmem_size;
+ inf_msg("fix->smem_len = %x\n",fix->smem_len);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)
+ info->screen_size = fix->smem_len;
+#endif
+#endif
+
+ fix->line_length = line_length;
+ fix->mmio_start = share->vidreg_start;
+ inf_msg("fix->mmio_start = %lx\n",fix->mmio_start);
+ fix->mmio_len = share->vidreg_size;
+ inf_msg("fix->mmio_len = %x\n",fix->mmio_len);
+ switch(var->bits_per_pixel)
+ {
+ case 8:
+ fix->visual = FB_VISUAL_PSEUDOCOLOR;
+ break;
+ case 16:
+ case 32:
+ fix->visual = FB_VISUAL_TRUECOLOR;
+ break;
+ }
+
+ /* set var */
+ var->activate = FB_ACTIVATE_NOW;
+ var->accel_flags = 0;
+ var->vmode = FB_VMODE_NONINTERLACED;
+
+ dbg_msg("#1 show info->cmap : \nstart=%d,len=%d,red=%p,green=%p,blue=%p,transp=%p\n",
+ info->cmap.start,info->cmap.len,
+ info->cmap.red,info->cmap.green,info->cmap.blue,
+ info->cmap.transp);
+
+ if((ret = fb_alloc_cmap(&info->cmap,256,0)) < 0){
+ err_msg("Could not allcate memory for cmap.\n");
+ goto exit;
+ }
+
+ dbg_msg("#2 show info->cmap : \nstart=%d,len=%d,red=%p,green=%p,blue=%p,transp=%p\n",
+ info->cmap.start,info->cmap.len,
+ info->cmap.red,info->cmap.green,info->cmap.blue,
+ info->cmap.transp);
+
+exit:
+ lynxfb_ops_check_var(var,info);
+// lynxfb_ops_set_par(info);
+ LEAVE(ret);
+}
+
+static int __devinit lynxfb_pci_probe(struct pci_dev * pdev,
+ const struct pci_device_id * ent)
+{
+ struct fb_info * info[] = {NULL,NULL};
+ struct lynx_share * share = NULL;
+
+ void * spec_share = NULL;
+ size_t spec_offset = 0;
+ int fbidx;
+ ENTER();
+
+ /* enable device */
+ if(pci_enable_device(pdev)){
+ err_msg("can not enable device.\n");
+ goto err_enable;
+ }
+
+ switch (ent->device){
+ case PCI_DEVID_LYNX_EXP:
+ case PCI_DEVID_LYNX_SE:
+ g_specId = SPC_SM750;
+ /* though offset of share in sm750_share is 0,
+ * we use this marcro as the same */
+ spec_offset = offsetof(struct sm750_share,share);
+ break;
+ case PCI_DEVID_LYNX_EM:
+ case PCI_DEVID_LYNX_3DM:
+ g_specId = SPC_SM712;
+ spec_offset = offsetof(struct sm712_share,share);
+ break;
+ case PCI_DEVID_VOYAGER:
+ g_specId = SPC_SM502;
+ spec_offset = offsetof(struct sm502_share,share);
+ default:
+ break;
+ }
+
+ dbg_msg("spec_offset = %d\n",spec_offset);
+ spec_share = kzalloc(spec_size[g_specId],GFP_KERNEL);
+ if(!spec_share){
+ err_msg("Could not allocate memory for share.\n");
+ goto err_share;
+ }
+
+ /* setting share structure */
+ share = (struct lynx_share * )(spec_share + spec_offset);
+ share->fbinfo[0] = share->fbinfo[1] = NULL;
+ share->devid = pdev->device;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22)
+ u32 temp;
+ pci_read_config_dword(pdev, PCI_CLASS_REVISION, &temp);
+ share->revid = temp&0xFF;
+#else
+ share->revid = pdev->revision;
+#endif
+
+ inf_msg("share->revid = %02x\n",share->revid);
+ share->pdev = pdev;
+#ifdef CONFIG_MTRR
+ share->mtrr_off = g_nomtrr;
+ share->mtrr.vram = 0;
+ share->mtrr.vram_added = 0;
+#endif
+ share->accel_off = g_noaccel;
+ share->dual = g_dualview;
+ spin_lock_init(&share->slock);
+
+ if(!share->accel_off){
+ /* hook deInit and 2d routines, notes that below hw_xxx
+ * routine can work on most of lynx chips
+ * if some chip need specific function,please hook it in smXXX_set_drv
+ * routine */
+ share->accel.de_init = hw_de_init;
+ share->accel.de_fillrect = hw_fillrect;
+ share->accel.de_copyarea = hw_copyarea;
+ share->accel.de_imageblit = hw_imageblit;
+ inf_msg("enable 2d acceleration\n");
+ }else{
+ inf_msg("disable 2d acceleration\n");
+ }
+
+ /* call chip specific setup routine */
+ (*setup_rout[g_specId])(share,g_settings);
+
+ /* call chip specific mmap routine */
+ if((*map_rout[g_specId])(share,pdev)){
+ err_msg("Memory map failed\n");
+ goto err_map;
+ }
+
+#ifdef CONFIG_MTRR
+ if(!share->mtrr_off){
+ inf_msg("enable mtrr\n");
+ share->mtrr.vram = mtrr_add(share->vidmem_start,
+ share->vidmem_size,
+ MTRR_TYPE_WRCOMB,1);
+
+ if(share->mtrr.vram < 0){
+ /* don't block driver with the failure of MTRR */
+ err_msg("Unable to setup MTRR.\n");
+ }else{
+ share->mtrr.vram_added = 1;
+ inf_msg("MTRR added succesfully\n");
+ }
+ }
+#endif
+
+ memset(share->pvMem,0,share->vidmem_size);
+
+ inf_msg("sm%3x mmio address = %p\n",share->devid,share->pvReg);
+
+ pci_set_drvdata(pdev,share);
+
+ /* call chipInit routine */
+ (*inithw_rout[g_specId])(share,pdev);
+
+ /* detect 502 need no disp driver
+ * beware that other chips except 502 should not touch g_502nodisp
+ * (remain g_502nodisp always 0)
+ * so regularily,below if line will not affect other chips' behaviour
+ * */
+ if(!g_no502disp)
+ {
+ /* allocate frame buffer info structor according to g_dualview */
+ fbidx = 0;
+ALLOC_FB:
+ info[fbidx] = framebuffer_alloc(sizeof(struct lynxfb_par),&pdev->dev);
+ if(!info[fbidx])
+ {
+ err_msg("Could not allocate framebuffer #%d.\n",fbidx);
+ if(fbidx == 0)
+ goto err_info0_alloc;
+ else
+ goto err_info1_alloc;
+ }
+ else
+ {
+ struct lynxfb_par * par;
+ inf_msg("framebuffer #%d alloc okay\n",fbidx);
+ share->fbinfo[fbidx] = info[fbidx];
+ par = info[fbidx]->par;
+ par->share = share;
+
+ /* set fb_info structure */
+ if(lynxfb_set_fbinfo(info[fbidx],fbidx)){
+ err_msg("Failed to initial fb_info #%d.\n",fbidx);
+ if(fbidx == 0)
+ goto err_info0_set;
+ else
+ goto err_info1_set;
+ }
+
+ /* register frame buffer*/
+ inf_msg("Ready to register framebuffer #%d.\n",fbidx);
+ int errno = register_framebuffer(info[fbidx]);
+ if (errno < 0) {
+ err_msg("Failed to register fb_info #%d. err %d\n",fbidx, errno);
+ if(fbidx == 0)
+ goto err_register0;
+ else
+ goto err_register1;
+ }
+ inf_msg("Accomplished register framebuffer #%d.\n",fbidx);
+ }
+
+ /* no dual view by far */
+ fbidx++;
+ if(share->dual && fbidx < 2)
+ goto ALLOC_FB;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ /* no platform.h in 2.6.9 */
+ if(g_specId == SPC_SM502){
+ struct platform_device * plf_dev = NULL;
+ /* do not use sm502_share->aud_off flag
+ * if nodisp is passed to driver,fb_set_info will not evoked
+ * which means aud_off never get a chance to be set value
+ * */
+
+ if(!g_no502aud){
+ inf_msg("audio feature enabled\n");
+ /* register 502 audio device */
+ /* use name sm501-audio because original audio driver
+ * also use it, maybe later we'll shift all name to
+ * sm502-xxx */
+ plf_dev = sm502_create_subdev(share,"sm501-audio",1);
+
+ if(!plf_dev){
+ /* no need to roll back all,basically we successed */
+ err_msg("Create \"sm501-audio\" failed\n");
+ }else{
+ sm502_create_irq(share,&plf_dev->resource[0]);
+ if(platform_device_register(plf_dev) < 0)
+ err_msg("Register \"%s\" failed\n",plf_dev->name);
+ g_plf_502aud = plf_dev;
+ }
+ }
+ }
+#endif
+ LEAVE(0);
+
+err_register1:
+err_info1_set:
+ framebuffer_release(info[1]);
+err_info1_alloc:
+ unregister_framebuffer(info[0]);
+err_register0:
+err_info0_set:
+ framebuffer_release(info[0]);
+err_info0_alloc:
+err_map:
+ kfree(spec_share);
+err_share:
+err_enable:
+ LEAVE(-ENODEV);
+}
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+static void sm502_device_release(struct device * dev)
+{
+ /* totally we used below memory size when created the sub dev
+ * sizeof(struct platform_device) + sizeof(struct resource) * resource_count
+ * they are allocated toghether,so we need only kfree the start address */
+ ENTER();
+ kfree(to_platform_device(dev));
+ LEAVE();
+}
+
+static struct platform_device * sm502_create_subdev(struct lynx_share *share,const char * name,int rescnt)
+{
+ struct platform_device * plf_dev;
+ ENTER();
+ plf_dev = kzalloc(sizeof(struct platform_device) + sizeof(struct resource) * rescnt,GFP_KERNEL);
+ if(plf_dev){
+ plf_dev->dev.release = sm502_device_release;
+ plf_dev->name = name;
+ /* a unique id for sub device of voyager */
+ plf_dev->id = share->pdev->devfn + 32;//need consideration later,what if 502 itself is a platform device? that makes share->pdev non-sense
+ plf_dev->resource = (struct resource*)(plf_dev+1);
+ plf_dev->num_resources = rescnt;
+ plf_dev->dev.parent = &share->pdev->dev;//need consideration later
+ }
+ LEAVE(plf_dev);
+}
+
+static void sm502_create_irq(struct lynx_share * share,struct resource * res)
+{
+ ENTER();
+ if(res){
+ res->flags = IORESOURCE_IRQ;
+ res->parent = NULL;
+ res->start = res->end = share->pdev->irq;
+ }
+ LEAVE();
+}
+
+
+static void sm502_create_mem(struct lynx_share * share,struct resource * res,
+ resource_size_t offset,resource_size_t size,
+ int type)
+{
+ ENTER();
+ res->flags = IORESOURCE_MEM;
+ switch(type){
+ case VGX_MMIO:
+ res->parent = &share->pdev->resource[1];
+ /* actually the physic address of vgx mmio*/
+ break;
+ case VGX_MEM:
+ res->parent = &share->pdev->resource[0];
+ break;
+ default:
+ err_msg("infalid resource type\n");
+ LEAVE (-EINVAL);
+ }
+ res->start = res->parent->start + offset;
+ res->end = res->start + size - 1;
+ LEAVE();
+}
+#endif
+
+static void __devexit lynxfb_pci_remove(struct pci_dev * pdev)
+{
+ struct fb_info * info;
+ struct lynx_share * share;
+ void * spec_share;
+ struct lynxfb_par * par;
+ int cnt;
+ ENTER();
+
+ cnt = 2;
+ share = pci_get_drvdata(pdev);
+
+ while(cnt-- > 0){
+ info = share->fbinfo[cnt];
+ if(!info)
+ continue;
+ par = info->par;
+
+ unregister_framebuffer(info);
+#if 1
+ /* clean crtc & output allocations*/
+ par->crtc.clear(&par->crtc);
+ par->output.clear(&par->output);
+#endif
+ /* release frame buffer*/
+ framebuffer_release(info);
+ }
+#ifdef CONFIG_MTRR
+ if(share->mtrr.vram_added)
+ mtrr_del(share->mtrr.vram,share->vidmem_start,share->vidmem_size);
+#endif
+ // pci_release_regions(pdev);
+
+ /* release sm502 sub device*/
+ if(g_plf_502aud){
+ platform_device_unregister(g_plf_502aud);
+ }
+ iounmap(share->pvReg);
+ iounmap(share->pvMem);
+
+ switch(share->devid){
+ case PCI_DEVID_LYNX_EXP:
+ case PCI_DEVID_LYNX_SE:
+ spec_share = container_of(share,struct sm750_share,share);
+ break;
+ case PCI_DEVID_LYNX_EM:
+ case PCI_DEVID_LYNX_3DM:
+ spec_share = container_of(share,struct sm712_share,share);
+ break;
+ case PCI_DEVID_VOYAGER:
+ spec_share = container_of(share,struct sm502_share,share);
+ break;
+ default:
+ spec_share = share;
+ }
+ kfree(g_settings);
+ kfree(spec_share);
+ pci_set_drvdata(pdev,NULL);
+ LEAVE();
+}
+
+
+#if 0
+static void strcat_pri(char * dest,const char * src)
+{
+ while(*dest)
+ dest++;
+ while((*dest = *src) != '\0')
+ {dest++;src++;}
+}
+static char * strcat_add_token(char *dest,const char *src,const char * token,int cnt)
+{
+ while(*dest)
+ {dest++;}
+ while((*dest = *src) != 0)
+ {dest++;src++;}
+
+ strcat_pri(dest,token);
+ dest += cnt;
+ return dest;
+}
+
+static void strcat2(char * dst,const char * src,char term)
+{
+ while((*dst = *src) != term){
+ dst++;
+ src++;
+ }
+}
+
+static unsigned int my_atoul(const char * name)
+{
+ unsigned int val;
+ val = 0;
+ switch(*name){
+ case '0' ... '9':
+ val = 10*val+(*name - '0');
+ break;
+ default:
+ break;
+ }
+ return val;
+}
+
+static int getExpRes(char * expstring,unsigned int * x,unsigned int * y)
+{
+ char * pcx,*pcy;
+ pcy = expstring;
+ pcx = strsep(&pcy,"x");
+ if(pcx!=NULL && pcy!=NULL)
+ {
+ *x = my_atoul(pcx);
+ *y = my_atoul(pcy);
+ return 0;
+ }
+ return -1;
+}
+#endif
+
+static void sm712fb_setup(struct lynx_share * share,char * src)
+{
+ struct sm712_share * spec_share;
+ char * opt;
+ ENTER();
+
+ spec_share = container_of(share,struct sm712_share,share);
+ spec_share->mclk = 130*1000000;//130 mhz is the maximum for sm712 BA version
+
+ /* defaultly use onboard jump setting */
+ spec_share->lcd = LCD712_USE_JUMP;
+
+ /* defaultlly use 24-bit color for TFT,it
+ * will both affect 2nd CRT and Panel TFT */
+ spec_share->lcd_color.tftColor = TFT_24BIT;
+
+ spec_share->lcd_color.dstnColor = DSTN_USE_JUMP;
+
+ if(!src || !*src){
+ war_msg("no specific g_option.\n");
+ goto FLAG1;
+ }
+
+ /* walk through the options */
+ while((opt = strsep(&src,":")) != NULL && *opt != NULL){
+ if(!strncmp(opt,"tft",strlen("tft")))
+ spec_share->lcd = LCD712_TFT;
+ else if(!strncmp(opt,"dstn",strlen("dstn")))
+ spec_share->lcd = LCD712_DSTN;
+
+ else if(!strncmp(opt,"9bit",strlen("9bit")))
+ spec_share->lcd_color.tftColor = TFT_9BIT;
+ else if(!strncmp(opt,"18bit",strlen("18bit")))
+ spec_share->lcd_color.tftColor = TFT_18BIT;
+ else if(!strncmp(opt,"24bit",strlen("24bit")))
+ spec_share->lcd_color.tftColor = TFT_24BIT;
+ else if(!strncmp(opt,"12p12",strlen("12p12")))
+ spec_share->lcd_color.tftColor = TFT_12P12;
+ else if(!strncmp(opt,"analog",strlen("analog")))
+ spec_share->lcd_color.tftColor = TFT_ANALOG;
+ else if(!strncmp(opt,"18p18",strlen("18p18")))
+ spec_share->lcd_color.tftColor = TFT_18P18;
+ else if(!strncmp(opt,"dstn16b",strlen("dstn16")))
+ spec_share->lcd_color.dstnColor = DSTN_16BIT;
+ else if(!strncmp(opt,"dstn24",strlen("dstn24")))
+ spec_share->lcd_color.dstnColor = DSTN_24BIT;
+
+ else if(!strncmp(opt,"nohwc",strlen("nohwc")))
+ g_hwcursor = 0;
+ else{
+ if(!g_fbmode[0]){
+ g_fbmode[0] = opt;
+ inf_msg("find fbmode0 : %s.\n",g_fbmode[0]);
+ }else if(!g_fbmode[1]){
+ g_fbmode[1] = opt;
+ inf_msg("find fbmode1 : %s.\n",g_fbmode[1]);
+ }else{
+ war_msg("How many view you wann set?\n");
+ }
+ }
+ }
+FLAG1:
+
+ LEAVE();
+}
+
+static void sm502fb_setup(struct lynx_share * share,char * src)
+{
+ struct sm502_share * spec_share;
+ char * opt,*exp_res;
+ int use_sec_ctrl;
+ ENTER();
+
+ spec_share = container_of(share,struct sm502_share,share);
+ exp_res = NULL;
+ use_sec_ctrl = 0;
+
+ spec_share->state.initParm.mem_clk = 144;
+ spec_share->state.initParm.master_clk = 72;
+ spec_share->state.initParm.powerMode = 0;
+ spec_share->state.initParm.setAllEngOff = 0;
+ spec_share->state.initParm.resetMemory = 1;
+
+ /*defaultly turn g_hwcursor on for both view */
+ g_hwcursor = 3;
+
+ if(!src || !*src){
+ war_msg("no specific g_option.\n");
+ goto FLAG1;
+ }
+
+ while((opt = strsep(&src,":")) != NULL && *opt != NULL){
+ if(!strncmp(opt,"sec_ctrl",strlen("sec_ctrl")))
+ use_sec_ctrl = 1;
+ else if(!strncmp(opt,"nocrt",strlen("nocrt")))
+ spec_share->state.nocrt = 1;
+ else if(!strncmp(opt,"9bit",strlen("9bit")))
+ spec_share->state.pnltype = sm502_9TFT;
+ else if(!strncmp(opt,"12bit",strlen("12bit")))
+ spec_share->state.pnltype = sm502_12TFT;
+ else if(!strncmp(opt,"24bit",strlen("24bit")))
+ spec_share->state.pnltype = sm502_24TFT;
+ else if(!strncmp(opt,"nohwc0",strlen("nohwc0")))
+ g_hwcursor &= ~0x1;
+ else if(!strncmp(opt,"nohwc1",strlen("nohwc1")))
+ g_hwcursor &= ~0x2;
+ else if(!strncmp(opt,"nohwc",strlen("nohwc")))
+ g_hwcursor = 0;
+ else if(!strncmp(opt,"nodisp",strlen("nodisp")))
+ g_no502disp = 1;//disable sm502 frame buffer
+ else if(!strncmp(opt,"noaud",strlen("noaud")))
+ g_no502aud = 1;//disable sm502 audio dev register
+ else if(!strncmp(opt,"nousb",strlen("nousb")))
+ g_no502usb = 1;//disable sm502 usb dev register
+ else{
+ if(!g_fbmode[0]){
+ g_fbmode[0] = opt;
+ inf_msg("find fbmode0 : %s.\n",g_fbmode[0]);
+ }else if(!g_fbmode[1]){
+ g_fbmode[1] = opt;
+ inf_msg("find fbmode1 : %s.\n",g_fbmode[1]);
+ }else{
+ war_msg("How many view you wann set?\n");
+ }
+ }
+ }
+
+FLAG1:
+ if(share->dual){
+ spec_share->state.dataflow = sm502_dual_normal;
+ }else{
+ if(use_sec_ctrl)
+ spec_share->state.dataflow = sm502_single_sec;
+ else
+ spec_share->state.dataflow = sm502_simul_pri;
+ }
+ LEAVE();
+}
+
+/* chip specific g_option configuration routine */
+static void sm750fb_setup(struct lynx_share * share,char * src)
+{
+ struct sm750_share * spec_share;
+ char * opt;
+#ifdef CAP_EXPENSION
+ char * exp_res;
+#endif
+ int swap;
+ ENTER();
+
+ spec_share = container_of(share,struct sm750_share,share);
+#ifdef CAP_EXPENSIION
+ exp_res = NULL;
+#endif
+ swap = 0;
+
+ spec_share->state.initParm.chip_clk = 0;
+ spec_share->state.initParm.mem_clk = 0;
+ spec_share->state.initParm.master_clk = 0;
+ spec_share->state.initParm.powerMode = 0;
+ spec_share->state.initParm.setAllEngOff = 0;
+ spec_share->state.initParm.resetMemory = 1;
+
+ /*defaultly turn g_hwcursor on for both view */
+ g_hwcursor = 3;
+
+ if(!src || !*src){
+ war_msg("no specific g_option.\n");
+ goto NO_PARAM;
+ }
+
+ while((opt = strsep(&src,":")) != NULL && *opt != NULL){
+ err_msg("opt=%s\n",opt);
+ err_msg("src=%s\n",src);
+
+ if(!strncmp(opt,"swap",strlen("swap")))
+ swap = 1;
+ else if(!strncmp(opt,"nocrt",strlen("nocrt")))
+ spec_share->state.nocrt = 1;
+ else if(!strncmp(opt,"36bit",strlen("36bit")))
+ spec_share->state.pnltype = sm750_doubleTFT;
+ else if(!strncmp(opt,"18bit",strlen("18bit")))
+ spec_share->state.pnltype = sm750_dualTFT;
+ else if(!strncmp(opt,"24bit",strlen("24bit")))
+ spec_share->state.pnltype = sm750_24TFT;
+#ifdef CAP_EXPANSION
+ else if(!strncmp(opt,"exp:",strlen("exp:")))
+ exp_res = opt + strlen("exp:");
+#endif
+ else if(!strncmp(opt,"nohwc0",strlen("nohwc0")))
+ g_hwcursor &= ~0x1;
+ else if(!strncmp(opt,"nohwc1",strlen("nohwc1")))
+ g_hwcursor &= ~0x2;
+ else if(!strncmp(opt,"nohwc",strlen("nohwc")))
+ g_hwcursor = 0;
+ else
+ {
+ if(!g_fbmode[0]){
+ g_fbmode[0] = opt;
+ inf_msg("find fbmode0 : %s\n",g_fbmode[0]);
+ }else if(!g_fbmode[1]){
+ g_fbmode[1] = opt;
+ inf_msg("find fbmode1 : %s\n",g_fbmode[1]);
+ }else{
+ war_msg("How many view you wann set?\n");
+ }
+ }
+ }
+#ifdef CAP_EXPANSION
+ if(getExpRes(exp_res,&spec_share->state.xLCD,&spec_share->state.yLCD))
+ {
+ /* seems exp_res is not valid*/
+ spec_share->state.xLCD = spec_share->state.yLCD = 0;
+ }
+#endif
+
+NO_PARAM:
+ if(share->revid != SM750LE_REVISION_ID){
+ if(share->dual)
+ {
+ if(swap)
+ spec_share->state.dataflow = sm750_dual_swap;
+ else
+ spec_share->state.dataflow = sm750_dual_normal;
+ }else{
+ if(swap)
+ spec_share->state.dataflow = sm750_simul_sec;
+ else
+ spec_share->state.dataflow = sm750_simul_pri;
+ }
+ }else{
+ /* SM750LE only have one crt channel */
+ spec_share->state.dataflow = sm750_simul_sec;
+ /* sm750le do not have complex attributes*/
+ spec_share->state.nocrt = 0;
+ }
+
+ LEAVE();
+ }
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+static int __init lynxfb_setup(char * options)
+#else
+int __init lynxfb_setup(char * options)
+#endif
+{
+ int len;
+ char * opt,*tmp;
+ ENTER();
+
+ if(!options || !*options){
+ war_msg("no options.\n");
+ LEAVE(0);
+ }
+
+ inf_msg("options:%s\n",options);
+
+ len = strlen(options) + 1;
+ g_settings = kmalloc(len,GFP_KERNEL);
+ if(!g_settings)
+ LEAVE(-ENOMEM);
+
+ memset(g_settings,0,len);
+ tmp = g_settings;
+
+ /* Notes:
+ char * strsep(char **s,const char * ct);
+ @s: the string to be searched
+ @ct :the characters to search for
+
+ strsep() updates @options to pointer after the first found token
+ it also returns the pointer ahead the token.
+ */
+ while((opt = strsep(&options,":"))!=NULL)
+ {
+ /* options that mean for any lynx chips are configured here */
+ if(!strncmp(opt,"noaccel",strlen("noaccel")))
+ g_noaccel = 1;
+#ifdef CONFIG_MTRR
+ else if(!strncmp(opt,"nomtrr",strlen("nomtrr")))
+ g_nomtrr = 1;
+#endif
+ else if(!strncmp(opt,"dual",strlen("dual")))
+ g_dualview = 1;
+ else
+ {
+ strcat(tmp,opt);
+ tmp += strlen(opt);
+ if(options != NULL)
+ *tmp++ = ':';
+ else
+ *tmp++ = 0;
+ }
+ }
+
+ /* misc g_settings are transport to chip specific routines */
+ inf_msg("parameter left for chip specific analysis:%s\n",g_settings);
+ LEAVE(0);
+}
+
+
+static void claim(void){
+ inf_msg("+-------------SMI Driver Information------------+");
+ inf_msg("Release type : " RELEASE_TYPE "\n");
+ inf_msg("Driver version: v" _version_ "\n");
+ inf_msg("Support products:\n"
+ SUPPORT_CHIP);
+ inf_msg("Support OS:\n"
+ SUPPORT_OS);
+ inf_msg("Support ARCH: " SUPPORT_ARCH "\n");
+ inf_msg("+-----------------------------------------------+");
+}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+static int __init lynxfb_init()
+{
+ char *option ;
+ int ret;
+
+ ENTER();
+
+ claim();
+#ifdef MODULE
+ option = g_option;
+#else
+ if(fb_get_options("lynxfb",&option))
+ LEAVE(-ENODEV);
+#endif
+
+ lynxfb_setup(option);
+ ret = pci_register_driver(&lynxfb_driver);
+ LEAVE(ret);
+}
+#else /* kernel version >= 2.6.10*/
+int __init lynxfb_init(void){
+ char * option;
+ int ret;
+ ENTER();
+ claim();
+#ifdef MODULE
+ option = g_option;
+ lynxfb_setup(option);
+#else
+ /* do nothing */
+#endif
+ ret = pci_register_driver(&lynxfb_driver);
+ LEAVE(ret);
+}
+#endif
+module_init(lynxfb_init);
+
+#ifdef MODULE
+static void __exit lynxfb_exit()
+{
+ ENTER();
+ inf_msg(_moduleName_ " exit\n");
+ pci_unregister_driver(&lynxfb_driver);
+ LEAVE();
+}
+module_exit(lynxfb_exit);
+#endif
+
+#ifdef MODULE
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)
+module_param(g_option,charp,S_IRUGO);
+#else
+/* be ware that PARM and param */
+MODULE_PARM(g_option,"s");
+#endif
+
+MODULE_PARM_DESC(g_option,
+ "\n\t\tCommon options:\n"
+ "\t\tnoaccel:disable 2d capabilities\n"
+ "\t\tnomtrr:disable MTRR attribute for video memory\n"
+ "\t\tdualview:dual frame buffer feature enabled\n"
+ "\t\tnohwc:disable hardware cursor\n"
+ "\t\tUsual example:\n"
+ "\t\tinsmod ./lynxfb.ko g_option=\"noaccel,nohwc,1280x1024-8@60\"\n"
+ "\t\tFor more detail chip specific options,please refer to \"Lynxfb User Mnual\" or readme\n"
+ );
+#endif
+
+MODULE_AUTHOR("monk liu<monk.liu@siliconmotion.com>");
+MODULE_DESCRIPTION("Frame buffer driver for SMI(R) " SUPPORT_CHIP " chipsets");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DEVICE_TABLE(pci,smi_pci_table);
diff --git a/drivers/video/lynxfb/lynx_drv.h b/drivers/video/lynxfb/lynx_drv.h
new file mode 100644
index 0000000..facd47b
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_drv.h
@@ -0,0 +1,272 @@
+#ifndef LYNXDRV_H_
+#define LYNXDRV_H_
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
+#else
+typedef unsigned long resource_size_t;
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+#else
+#define SEPARATOR 1
+typedef int pm_message_t;
+#endif
+
+/* please use revision id to distinguish sm750le and sm750*/
+#define SPC_SM750 0
+#define SPC_SM712 1
+#define SPC_SM502 2
+//#define SPC_SM750LE 8
+
+#define PCI_VENDOR_ID_SMI 0x126f
+#define PCI_DEVID_LYNX_EXP 0x0750
+#define PCI_DEVID_LYNX_SE 0x0718
+#define PCI_DEVID_LYNX_EM 0x0712
+#define PCI_DEVID_LYNX_3DM 0x0720
+#define PCI_DEVID_VOYAGER 0x0501
+
+//#define SUPPORT_ARCH "x86,x86_64"
+//#define SUPPORT_CHIP "lynx Express(750)/lynx 750LE/Lynx SE(718)/Lynx EM(712)/lynx 3DM(720/722) voyager(502/107)"
+
+//#define _version_ "4.0.1"
+#define _moduleName_ "lynxfb"
+#define PFX _moduleName_ ": "
+#define err_msg(fmt,args...) printk(KERN_ERR PFX fmt, ## args)
+#define war_msg(fmt,args...) printk(KERN_WARNING PFX fmt, ## args)
+#define inf_msg(fmt,args...) printk(KERN_INFO PFX fmt, ## args)
+/* below code also works ok,but there must be no KERN_INFO prefix */
+//#define inf_msg(...) printk(__VA_ARGS__)
+
+#if (DEBUG == 1)
+/* debug level == 1 */
+#define dbg_msg(fmt,args...) printk(KERN_DEBUG PFX fmt, ## args)
+#define ENTER() printk(KERN_DEBUG PFX "%*c %s\n",smi_indent++,'>',__func__)
+#define LEAVE(...) \
+ do{ \
+ printk(KERN_DEBUG PFX "%*c %s\n",--smi_indent,'<',__func__); \
+ return __VA_ARGS__; \
+ }while(0)
+
+#elif (DEBUG == 2)
+/* debug level == 2*/
+#define dbg_msg(fmt,args...) printk(KERN_ERR PFX fmt, ## args)
+#define ENTER() printk(KERN_ERR PFX "%*c %s\n",smi_indent++,'>',__func__)
+
+#define LEAVE(...) \
+ do{ \
+ printk(KERN_ERR PFX "%*c %s\n",--smi_indent,'<',__func__); \
+ return __VA_ARGS__; \
+ }while(0)
+
+#ifdef inf_msg
+#undef inf_msg
+#endif
+
+#define inf_msg(fmt,args...) printk(KERN_ERR PFX fmt, ## args)
+#else
+/* no debug */
+#define dbg_msg(...)
+#define ENTER()
+#define LEAVE(...) return __VA_ARGS__
+
+#endif
+
+#define MB(x) ((x)<<20)
+#define MHZ(x) ((x) * 1000000)
+/* align should be 2,4,8,16 */
+#define PADDING(align,data) (((data)+(align)-1)&(~((align) -1)))
+extern int smi_indent;
+
+
+struct lynx_accel{
+ /* base virtual address of DPR registers */
+ volatile unsigned char __iomem * dprBase;
+ /* base virtual address of de data port */
+ volatile unsigned char __iomem * dpPortBase;
+
+ /* function fointers */
+ int (*de_init)(struct lynx_accel *);
+
+ int (*de_wait)(void);/* see if hardware ready to work */
+
+ int (*de_fillrect)(struct lynx_accel *,u32,u32,u32,
+ u32,u32,u32,u32,u32,u32);
+
+ int (*de_copyarea)(struct lynx_accel *,u32,u32,u32,u32,
+ u32,u32,u32,u32,
+ u32,u32,u32,u32);
+
+ int (*de_imageblit)(struct lynx_accel *,const char *,u32,u32,u32,
+ u32,u32,u32,u32,u32,u32,u32,u32,u32);
+
+};
+
+/* lynx_share stands for a presentation of two frame buffer
+ that use one smi adaptor , it is similar to a basic class of C++
+*/
+struct lynx_share{
+ /* common members */
+ u16 devid;
+ u8 revid;
+ struct pci_dev * pdev;
+ struct fb_info * fbinfo[2];
+ struct lynx_accel accel;
+ int accel_off;
+ int dual;
+#ifdef CONFIG_MTRR
+ int mtrr_off;
+ struct{
+ int vram;
+ int vram_added;
+ }mtrr;
+#endif
+ /* all smi graphic adaptor got below attributes */
+ resource_size_t vidmem_start;
+ resource_size_t vidreg_start;
+ resource_size_t vidmem_size;
+ resource_size_t vidreg_size;
+ volatile unsigned char __iomem * pvReg;
+ unsigned char __iomem * pvMem;
+ /* locks*/
+ spinlock_t slock;
+ /* function pointers */
+ void (*suspend)(struct lynx_share*);
+ void (*resume)(struct lynx_share*);
+};
+
+struct lynx_cursor{
+ /* cursor width ,height and size */
+ int w;
+ int h;
+ int size;
+ /* hardware limitation */
+ int maxW;
+ int maxH;
+ /* base virtual address and offset of cursor image */
+ char __iomem * vstart;
+ int offset;
+ /* mmio addr of hw cursor */
+ volatile char __iomem * mmio;
+ /* the lynx_share of this adaptor */
+ struct lynx_share * share;
+ /* proc_routines */
+ void (*enable)(struct lynx_cursor *);
+ void (*disable)(struct lynx_cursor *);
+ void (*setSize)(struct lynx_cursor *,int,int);
+ void (*setPos)(struct lynx_cursor *,int,int);
+ void (*setColor)(struct lynx_cursor *,u32,u32);
+ void (*setData)(struct lynx_cursor *,u16,const u8*,const u8*);
+};
+
+struct lynxfb_crtc{
+ unsigned char __iomem * vCursor;//virtual address of cursor
+ unsigned char __iomem * vScreen;//virtual address of on_screen
+ int oCursor;//cursor address offset in vidmem
+ int oScreen;//onscreen address offset in vidmem
+ int channel;/* which channel this crtc stands for*/
+ resource_size_t vidmem_size;/* this view's video memory max size */
+
+ /* below attributes belong to info->fix, their value depends on specific adaptor*/
+ u16 line_pad;/* padding information:0,1,2,4,8,16,... */
+ u16 xpanstep;
+ u16 ypanstep;
+ u16 ywrapstep;
+
+ void * priv;
+
+ int(*proc_setMode)(struct lynxfb_crtc*,
+ struct fb_var_screeninfo*,
+ struct fb_fix_screeninfo*);
+
+ int(*proc_checkMode)(struct lynxfb_crtc*,struct fb_var_screeninfo*);
+ int(*proc_setColReg)(struct lynxfb_crtc*,ushort,ushort,ushort,ushort);
+ void (*clear)(struct lynxfb_crtc*);
+ /* pan display */
+ int(*proc_panDisplay)(struct lynxfb_crtc*, struct fb_var_screeninfo*,
+ struct fb_info*);
+ /* cursor information */
+ struct lynx_cursor cursor;
+};
+
+struct lynxfb_output{
+ int dpms;
+ int paths;
+ /* which paths(s) this output stands for,for sm750:
+ paths=1:means output for panel paths
+ paths=2:means output for crt paths
+ paths=3:means output for both panel and crt paths
+ */
+
+ int * channel;
+ /* which channel these outputs linked with,for sm750:
+ *channel=0 means primary channel
+ *channel=1 means secondary channel
+ output->channel ==> &crtc->channel
+ */
+ void * priv;
+
+ int(*proc_setMode)(struct lynxfb_output*,
+ struct fb_var_screeninfo*,
+ struct fb_fix_screeninfo*);
+
+ int(*proc_checkMode)(struct lynxfb_output*,struct fb_var_screeninfo*);
+ int(*proc_setBLANK)(struct lynxfb_output*,int);
+ void (*clear)(struct lynxfb_output*);
+};
+
+struct lynxfb_par{
+ /* either 0 or 1 for dual head adaptor,0 is the older one registered */
+ int index;
+ unsigned int pseudo_palette[256];
+ struct lynxfb_crtc crtc;
+ struct lynxfb_output output;
+ struct fb_info * info;
+ struct lynx_share * share;
+};
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+
+#if 0
+#define OUTPUT_2_SHARE(pOutput) \
+ (struct lynx_share *) \
+ ((char*)container_of(pOutput,struct lynxfb_par,output) + \
+ offsetof(struct lynxfb_par,share))
+
+#define OUTPUT_2_INFO(pOutput) \
+ (struct fb_info *) \
+ ((char *)container_of(pOutput,struct lynxfb_par,output) + \
+ offsetof(struct lynxfb_par,info))
+
+
+#define CRTC_2_SHARE(pCrtc) \
+ (struct lynx_share*) \
+ ((char*)container_of(pCrtc,struct lynxfb_par,crtc) + \
+ offsetof(struct lynxfb_par,share))
+
+#define CRTC_2_INFO(pCrtc) \
+ (struct fb_info *) \
+ ((char *)container_of(pCrtc,struct lynxfb_par,crtc) + \
+ offsetof(struct lynxfb_par,info))
+#endif
+
+#define PS_TO_HZ(ps) \
+ ({ \
+ unsigned long long hz = 1000*1000*1000*1000ULL; \
+ do_div(hz,ps); \
+ (unsigned long)hz;})
+
+#if 1
+static inline unsigned long ps_to_hz(unsigned int psvalue)
+{
+ unsigned long long numerator=1000*1000*1000*1000ULL;
+ /* 10^12 / picosecond period gives frequency in Hz */
+ do_div(numerator, psvalue);
+ return (unsigned long)numerator;
+}
+#endif
+
+
+#endif
diff --git a/drivers/video/lynxfb/lynx_help.h b/drivers/video/lynxfb/lynx_help.h
new file mode 100644
index 0000000..e0128d2
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_help.h
@@ -0,0 +1,111 @@
+#ifndef LYNX_HELP_H__
+#define LYNX_HELP_H__
+/*****************************************************************************\
+ * FIELD MACROS *
+\*****************************************************************************/
+
+#define _LSB(f) (0 ? f)
+#define _MSB(f) (1 ? f)
+#define _COUNT(f) (_MSB(f) - _LSB(f) + 1)
+
+#define RAW_MASK(f) (0xFFFFFFFF >> (32 - _COUNT(f)))
+#define GET_MASK(f) (RAW_MASK(f) << _LSB(f))
+#define GET_FIELD(d,f) (((d) >> _LSB(f)) & RAW_MASK(f))
+#define TEST_FIELD(d,f,v) (GET_FIELD(d,f) == f ## _ ## v)
+#define SET_FIELD(d,f,v) (((d) & ~GET_MASK(f)) | \
+ (((f ## _ ## v) & RAW_MASK(f)) << _LSB(f)))
+#define SET_FIELDV(d,f,v) (((d) & ~GET_MASK(f)) | \
+ (((v) & RAW_MASK(f)) << _LSB(f)))
+
+
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Internal macros //
+// //
+////////////////////////////////////////////////////////////////////////////////
+
+#define _F_START(f) (0 ? f)
+#define _F_END(f) (1 ? f)
+#define _F_SIZE(f) (1 + _F_END(f) - _F_START(f))
+#define _F_MASK(f) (((1 << _F_SIZE(f)) - 1) << _F_START(f))
+#define _F_NORMALIZE(v, f) (((v) & _F_MASK(f)) >> _F_START(f))
+#define _F_DENORMALIZE(v, f) (((v) << _F_START(f)) & _F_MASK(f))
+
+
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Global macros //
+// //
+////////////////////////////////////////////////////////////////////////////////
+
+#define FIELD_GET(x, reg, field) \
+( \
+ _F_NORMALIZE((x), reg ## _ ## field) \
+)
+
+#define FIELD_SET(x, reg, field, value) \
+( \
+ (x & ~_F_MASK(reg ## _ ## field)) \
+ | _F_DENORMALIZE(reg ## _ ## field ## _ ## value, reg ## _ ## field) \
+)
+
+#define FIELD_VALUE(x, reg, field, value) \
+( \
+ (x & ~_F_MASK(reg ## _ ## field)) \
+ | _F_DENORMALIZE(value, reg ## _ ## field) \
+)
+
+#define FIELD_CLEAR(reg, field) \
+( \
+ ~ _F_MASK(reg ## _ ## field) \
+)
+
+
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Field Macros //
+// //
+////////////////////////////////////////////////////////////////////////////////
+
+#define FIELD_START(field) (0 ? field)
+#define FIELD_END(field) (1 ? field)
+#define FIELD_SIZE(field) (1 + FIELD_END(field) - FIELD_START(field))
+#define FIELD_MASK(field) (((1 << (FIELD_SIZE(field)-1)) | ((1 << (FIELD_SIZE(field)-1)) - 1)) << FIELD_START(field))
+#define FIELD_NORMALIZE(reg, field) (((reg) & FIELD_MASK(field)) >> FIELD_START(field))
+#define FIELD_DENORMALIZE(field, value) (((value) << FIELD_START(field)) & FIELD_MASK(field))
+
+#define FIELD_INIT(reg, field, value) FIELD_DENORMALIZE(reg ## _ ## field, \
+ reg ## _ ## field ## _ ## value)
+#define FIELD_INIT_VAL(reg, field, value) \
+ (FIELD_DENORMALIZE(reg ## _ ## field, value))
+#define FIELD_VAL_SET(x, r, f, v) x = x & ~FIELD_MASK(r ## _ ## f) \
+ | FIELD_DENORMALIZE(r ## _ ## f, r ## _ ## f ## _ ## v)
+
+#define RGB(r, g, b) \
+( \
+ (unsigned long) (((r) << 16) | ((g) << 8) | (b)) \
+)
+
+#define RGB16(r, g, b) \
+( \
+ (unsigned short) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | (((b) & 0xF8) >> 3)) \
+)
+
+static inline unsigned int absDiff(unsigned int a,unsigned int b)
+{
+ if(a<b)
+ return b-a;
+ else
+ return a-b;
+}
+
+/* n / d + 1 / 2 = (2n + d) / 2d */
+#define roundedDiv(num,denom) ((2 * (num) + (denom)) / (2 * (denom)))
+#define MB(x) ((x)<<20)
+#define KB(x) ((x)<<10)
+#define MHz(x) ((x) * 1000000)
+
+
+
+
+#endif
diff --git a/drivers/video/lynxfb/lynx_hw502.c b/drivers/video/lynxfb/lynx_hw502.c
new file mode 100644
index 0000000..55f23fb
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw502.c
@@ -0,0 +1,1103 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include<linux/module.h>
+#include<linux/kernel.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+
+#include <linux/console.h>
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+
+#include "lynx_drv.h"
+#include "lynx_hw502.h"
+#include "lynx_accel.h"
+
+static volatile unsigned char __iomem * mmio502;
+#define PEEK32(addr) readl((addr)+mmio502)
+#define POKE32(addr,data) writel((data),(addr)+mmio502)
+
+/* IMPORTANT:
+ * you must use below two line macro to access 2d registers
+ * do not use POKE32 and PEEK32 to access 2d registers
+ * because all 2d register address is just an offset from its
+ * chip's 2d base address
+ * */
+#if 0
+#define dePOKE32(a,b) POKE32(a+DE_BASE_ADDR_TYPE1,b)
+#define dePEEK32(a) PEEK32(a+DE_BASE_ADDR_TYPE1)
+#endif
+
+static inline int h_total(struct fb_var_screeninfo * var)
+{
+ return (var->xres + var->left_margin + var->right_margin + var->hsync_len);
+}
+
+static inline int v_total(struct fb_var_screeninfo * var)
+{
+ return (var->yres + var->upper_margin + var->lower_margin + var->vsync_len);
+}
+
+static void set_mmio(volatile unsigned char __iomem * addr)
+{
+ mmio502 = addr;
+}
+
+unsigned long SmRead8(unsigned long nOffset){
+ return readb(mmio502 + nOffset);
+}
+
+unsigned long SmRead16(unsigned long nOffset){
+ return readw(mmio502 + nOffset);
+}
+
+unsigned long SmRead32(unsigned long nOffset){
+ return readl(mmio502 + nOffset);
+}
+
+void SmWrite8(unsigned long nOffset,unsigned long nData){
+ writeb(nData,mmio502+nOffset);
+}
+
+void SmWrite16(unsigned long nOffset,unsigned long nData){
+ writew(nData,mmio502 + nOffset);
+}
+
+void SmWrite32(unsigned long nOffset,unsigned long nData){
+ writel(nData,mmio502 + nOffset);
+}
+
+volatile unsigned char __iomem * SmIoAddress(void)
+{
+ return mmio502;
+}
+
+void SmMemset(unsigned long nOffset,unsigned char val,int cnt){
+ memset((void __force *)(mmio502 + nOffset),val,cnt);
+}
+
+void sm501_set_gate(unsigned long gate){
+ unsigned long mode = SmRead32(POWER_MODE_CTRL);
+ switch (mode){
+ case 0:
+ SmWrite32(POWER_MODE0_GATE,gate);
+ break;
+ case 1:
+ SmWrite32(POWER_MODE1_GATE,gate);
+ break;
+ default:
+ return;
+ }
+ msleep(16);
+}
+extern int sm501_unit_power(struct device * dev,unsigned int bit,unsigned int on)
+{
+ /*
+ struct lynx_share * share;
+ share = dev_get_drvdata(dev);
+ */
+ ENTER();
+
+ u32 reg;
+ reg = PEEK32(CURRENT_POWER_GATE);
+ reg &= ~(1 << bit);
+ reg |= (1 << on);
+ POKE32(POWER_MODE0_GATE,reg);
+ LEAVE(0);
+}
+
+extern int sm501_modify_reg(struct device* dev,unsigned long regoff,unsigned long set,
+ unsigned long clear)
+{
+ u32 reg;
+ reg = PEEK32(regoff);
+ reg |= set;
+ reg &= ~clear;
+
+ POKE32(regoff,reg);
+ return reg;
+}
+
+EXPORT_SYMBOL_GPL(SmRead8);
+EXPORT_SYMBOL_GPL(SmRead16);
+EXPORT_SYMBOL_GPL(SmRead32);
+EXPORT_SYMBOL_GPL(SmWrite8);
+EXPORT_SYMBOL_GPL(SmWrite16);
+EXPORT_SYMBOL_GPL(SmWrite32);
+EXPORT_SYMBOL_GPL(SmIoAddress);
+EXPORT_SYMBOL_GPL(SmMemset);
+EXPORT_SYMBOL_GPL(sm501_set_gate);
+
+int hw_sm502_map(struct lynx_share* share,struct pci_dev* pdev)
+{
+ ENTER();
+ share->vidreg_start = pci_resource_start(pdev,1);
+ dbg_msg("share->vidreg_start = %08x\n",share->vidreg_start);
+ share->vidreg_size = MB(2);
+
+ share->pvReg = ioremap(share->vidreg_start,share->vidreg_size);
+ if(!share->pvReg){
+ err_msg("mmio failed\n");
+ LEAVE(-EFAULT);
+ }
+ share->accel.dprBase = share->pvReg + DE_BASE_ADDR_TYPE1;
+ share->accel.dpPortBase = share->pvReg + DE_PORT_ADDR_TYPE1;
+
+ set_mmio(share->pvReg);
+
+ dbg_msg("share->pvReg = %p, mmio 60 = %08x \n",share->pvReg,PEEK32(0x60));
+
+ share->vidmem_start = pci_resource_start(pdev,0);
+ dbg_msg("share->vidmem_start = %08x\n",share->vidmem_start);
+
+ share->vidmem_size = hw_sm502_getVMSize(share);
+
+ inf_msg("memory size = %d\n",(int)share->vidmem_size);
+
+ share->pvMem = ioremap(share->vidmem_start,share->vidmem_size);
+ if(!share->pvMem){
+ err_msg("Map video memory failed\n");
+ LEAVE(-EFAULT);
+ }
+
+ LEAVE(0);
+}
+
+static unsigned int voyager_calcProgPllCtrl(unsigned int ulRequestClk,
+ struct sm502_pll_value * pPLL)
+{
+ unsigned int M, N, diff, pllClk, i;
+ unsigned int bestDiff = ~0; /* biggest 32 bit unsigned number */
+
+ /* Sanity check */
+ if (pPLL->inputFreq < MHz(5) || pPLL->inputFreq > MHz(100))
+ {
+ return 0;
+ }
+
+ /* Convert everything in Khz range in order to avoid calculation overflow */
+ pPLL->inputFreq /= 1000;
+ ulRequestClk /= 1000;
+
+ /* Try both ulRequestClk and (ulRequestClk x 2) to work out the best M & N values. */
+ for (i=0; i<2; i++)
+ {
+ /* N must between 2 and 24, according to design */
+ for (N=2; N<25; N++)
+ {
+ M = ulRequestClk * N * 1000 / pPLL->inputFreq;
+ M = roundedDiv(M, 1000);
+
+ pllClk = pPLL->inputFreq * M / N;
+ diff = absDiff(pllClk, ulRequestClk);
+ //printk("Need=%u,M=%u,N=%u,div2=%u,clk=%d,diff=%u\n",ulRequestClk,M,N,i,pllClk,diff);
+ if (diff < bestDiff)
+ {
+ bestDiff = diff;
+ pPLL->M = M;
+ pPLL->N = N;
+ pPLL->divBy2 = i;
+ }
+ }
+ ulRequestClk *= 2;
+ }
+
+ pPLL->inputFreq *= 1000;
+
+// printk("pPLL->inputFreq = %u,M = %u,N = %u,div2 = %u\n",pPLL->inputFreq,pPLL->M,pPLL->N,pPLL->divBy2);
+
+
+ return (pPLL->divBy2 == 0)?
+ (pPLL->inputFreq * pPLL->M / pPLL->N) :
+ (pPLL->inputFreq * pPLL->M / pPLL->N / 2);
+
+}
+
+static unsigned int voyager_calcDividerClock(unsigned int ulRequestClk,
+ struct sm502_pll_value *pPLL)
+{
+ unsigned int pll1, pll2, pllDiff, dividerClk, diff;
+ unsigned short divider, divider_limit, shift;
+ unsigned int best_diff = ~0; /* biggest 32 bit unsigned number */
+
+ /* Sanity check */
+ if (pPLL->inputFreq < MHz(5) || pPLL->inputFreq > MHz(100))
+ {
+ return 0;
+ }
+
+ /* Convert everything in Khz range in order to avoid overflow */
+ pPLL->inputFreq /= 1000;
+ ulRequestClk /= 1000;
+
+ pll1 = pPLL->inputFreq * 12;
+ pll2 = pPLL->inputFreq * 14;
+ pllDiff = pll2 - pll1;
+
+ /* For panel clock, try divider 1, 3 and 5, while all others only have 1 and 3 */
+ if ( pPLL->clockType == SM502_P1XCLK || pPLL->clockType == SM502_P2XCLK )
+ divider_limit = 5;
+ else
+ divider_limit = 3;
+
+ for(dividerClk = pll1; dividerClk <= pll2; dividerClk += pllDiff)
+ {
+ for(divider = 1; divider <= divider_limit; divider += 2)
+ {
+ /* Try all 8 shift values. */
+ for(shift = 0; shift < 8; shift++)
+ {
+ /* Calculate difference with requested clock. */
+ diff = absDiff((roundedDiv(dividerClk, divider << shift)), ulRequestClk);
+
+ /* If the difference is less than the current, use it. */
+ if(diff < best_diff)
+ {
+ /* Store best difference. */
+ best_diff = diff;
+
+ /* Store clock values. */
+ pPLL->dividerClk = dividerClk;
+ pPLL->divider = divider;
+ pPLL->shift = shift;
+ }
+ }
+ }
+ }
+
+ /* Restore frequency from Khz to hz unit */
+ pPLL->dividerClk *= 1000;
+ pPLL->inputFreq *= 1000;
+
+ /* Return actual frequency that the PLL can set */
+ return pPLL->dividerClk / (pPLL->divider << pPLL->shift);
+}
+
+
+static unsigned int voyager_fmtClkReg(struct sm502_pll_value *pPLL)
+{
+ unsigned int ulModeClockReg;
+ unsigned int ulModeClockField;
+
+ ulModeClockReg = PEEK32(CURRENT_POWER_CLOCK);
+
+ if (pPLL->clockType==SM502_PANEL_PLL)
+ {
+ /* If use programmable PLL, disable divider clock and
+ disable 2X clock.
+ */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIS)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, SEL)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SHIFT);
+
+ ulModeClockField =
+ FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIS, 1X)
+ | FIELD_SET(0, CURRENT_POWER_CLOCK, SEL, PLL);
+ }
+ else if (pPLL->clockType==SM502_PANEL_PLL_2X)
+ {
+ /* If use programmable PLL x 2, disable divider clock.
+ */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIS)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, SEL)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SHIFT);
+
+ ulModeClockField =
+ FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIS, NORMAL)
+ | FIELD_SET(0, CURRENT_POWER_CLOCK, SEL, PLL);
+ }
+ else if (pPLL->clockType==SM502_P2XCLK || pPLL->clockType==SM502_P1XCLK)
+ {
+ /* Use either 1X or 2X panel divider clock */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIS)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, SEL)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, P2XCLK_SHIFT);
+
+ ulModeClockField =
+ FIELD_SET(0, CURRENT_POWER_CLOCK, SEL, PXCLK)
+ | (pPLL->clockType == SM502_P2XCLK
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIS, NORMAL)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIS, 1X))
+ | (pPLL->dividerClk == (pPLL->inputFreq * 12)
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_SELECT, 12X)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_SELECT, 14X))
+ | (pPLL->divider == 1
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIVIDER, 1)
+ : (pPLL->divider == 3
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIVIDER, 3)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, P2XCLK_DIVIDER, 5)))
+ | FIELD_VALUE(0, CURRENT_POWER_CLOCK, P2XCLK_SHIFT, pPLL->shift);
+
+ }
+ else if (pPLL->clockType==SM502_V2XCLK || pPLL->clockType==SM502_V1XCLK)
+ {
+ /* Use either 1x or 2x CRT divider clock */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, V2XCLK_DIS)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, V2XCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, V2XCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, V2XCLK_SHIFT);
+
+ ulModeClockField =
+ (pPLL->clockType == SM502_V2XCLK
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_DIS, NORMAL)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_DIS, 1X))
+ | (pPLL->dividerClk == (pPLL->inputFreq * 12)
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_SELECT, 12X)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_SELECT, 14X))
+ | (pPLL->divider == 1
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_DIVIDER, 1)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, V2XCLK_DIVIDER, 3))
+ | FIELD_VALUE(0, CURRENT_POWER_CLOCK, V2XCLK_SHIFT, pPLL->shift);
+ }
+ else if (pPLL->clockType==SM502_MXCLK)
+ {
+ /* 1X Master Clock */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, MCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, MCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, MCLK_SHIFT);
+
+ ulModeClockField =
+ (pPLL->dividerClk == (pPLL->inputFreq * 12)
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, MCLK_SELECT, 12X)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, MCLK_SELECT, 14X))
+ | (pPLL->divider == 1
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, MCLK_DIVIDER, 1)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, MCLK_DIVIDER, 3))
+ | FIELD_VALUE(0, CURRENT_POWER_CLOCK, MCLK_SHIFT, pPLL->shift);
+ }
+ else
+ {
+ /* 1X Memroy Clock */
+ ulModeClockReg &= FIELD_CLEAR(CURRENT_POWER_CLOCK, M2XCLK_SELECT)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, M2XCLK_DIVIDER)
+ & FIELD_CLEAR(CURRENT_POWER_CLOCK, M2XCLK_SHIFT);
+
+ ulModeClockField =
+ (pPLL->dividerClk == (pPLL->inputFreq * 12)
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, M2XCLK_SELECT, 12X)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, M2XCLK_SELECT, 14X))
+ | (pPLL->divider == 1
+ ? FIELD_SET(0, CURRENT_POWER_CLOCK, M2XCLK_DIVIDER, 1)
+ : FIELD_SET(0, CURRENT_POWER_CLOCK, M2XCLK_DIVIDER, 3))
+ | FIELD_VALUE(0, CURRENT_POWER_CLOCK, M2XCLK_SHIFT, pPLL->shift);
+ }
+
+ return(ulModeClockReg | ulModeClockField);
+}
+
+static inline void voyager_setCurrentGate(unsigned int gate)
+{
+ unsigned int gate_reg;
+#if 0
+ unsigned int select;
+ select = FIELD_GET(PEEK32(POWER_MODE_CTRL),
+ POWER_MODE_CTRL,
+ MODE);
+ switch (select)
+ {
+ case POWER_MODE_CTRL_MODE_MODE0:
+ gate_reg = POWER_MODE0_GATE;
+ break;
+
+ case POWER_MODE_CTRL_MODE_MODE1:
+ gate_reg = POWER_MODE1_GATE;
+ break;
+
+ case POWER_MODE_CTRL_MODE_SLEEP:
+ default:
+ return; /* Nothing to set in sleep mode */
+ }
+#else
+ gate_reg = POWER_MODE0_GATE;
+#endif
+ POKE32(gate_reg,gate);
+}
+
+static inline void voyager_setCurrentClock(unsigned int clock)
+{
+ unsigned int clock_reg;
+#if 0
+ unsigned int control_value = 0;
+ /* Get current power mode. */
+ control_value = FIELD_GET(PEEK32(POWER_MODE_CTRL),
+ POWER_MODE_CTRL,
+ MODE);
+
+ switch (control_value)
+ {
+ case POWER_MODE_CTRL_MODE_MODE0:
+ clock_reg = POWER_MODE0_CLOCK;
+ break;
+
+ case POWER_MODE_CTRL_MODE_MODE1:
+ clock_reg = POWER_MODE1_CLOCK;
+ break;
+
+ case POWER_MODE_CTRL_MODE_SLEEP:
+ default:
+ return; /* Nothing to set in sleep mode */
+ }
+#else
+ /* kernel driver always use power mode 0,so cut above crap*/
+ clock_reg = POWER_MODE0_CLOCK;
+#endif
+ POKE32(clock_reg, clock);
+}
+
+
+
+static void voyager_set_clock(enum sm502_clocktype clksrc,unsigned int req_freq)
+{
+ unsigned int actualClk;
+#if (DEBUG >= 1)
+ static const char * clkNames[] = {
+ [SM502_P2XCLK] = "PANEL CONTROLLER CLOCK",
+ [SM502_V2XCLK] = "CRT CONTROLLER CLOCK",
+ [SM502_MXCLK] = "MAIN ENGINE CLOCK",
+ [SM502_M1XCLK] = "SDRAM CONTROLLER CLOCK",
+ [SM502_P1XCLK] = "x1 panel divider clock",
+ [SM502_V1XCLK] = "x1 CRT divider clock",
+ [SM502_PANEL_PLL] = "Programmable panel pixel clock",
+ [SM502_PANEL_PLL_2X] = "For TV, 2X clock is needed",
+ };
+#endif
+ struct sm502_pll_value pll;
+ ENTER();
+ dbg_msg("Request %s clock to %u hz.\n",clkNames[clksrc],req_freq);
+
+ if(req_freq){
+ u32 tmp;
+ memset(&pll,0,sizeof(struct sm502_pll_value));
+ pll.clockType = clksrc;
+ pll.inputFreq = DEFAULT_INPUT_CLOCK;
+
+ switch (clksrc) {
+ case SM502_PANEL_PLL:
+ actualClk = voyager_calcProgPllCtrl(req_freq,&pll);
+ voyager_setCurrentClock(voyager_fmtClkReg(&pll));
+#if 1
+ /* for programable pll,need ox74 be set */
+ tmp =
+ FIELD_SET(0,PROGRAMMABLE_PLL_CONTROL,TSTOE,DISABLE)|
+ FIELD_SET(0,PROGRAMMABLE_PLL_CONTROL,PON,ON)|
+ FIELD_SET(0,PROGRAMMABLE_PLL_CONTROL,SEL,CRYSTAL)|
+ FIELD_VALUE(0,PROGRAMMABLE_PLL_CONTROL,M,pll.M)|
+ FIELD_VALUE(0,PROGRAMMABLE_PLL_CONTROL,N,pll.N)|
+ FIELD_VALUE(0,PROGRAMMABLE_PLL_CONTROL,K,pll.divBy2);
+ POKE32(PROGRAMMABLE_PLL_CONTROL,tmp);
+#endif
+ break;
+ case SM502_V1XCLK:
+ case SM502_MXCLK:
+ case SM502_M1XCLK:
+ actualClk = voyager_calcDividerClock(req_freq,&pll);
+ /* set current clock */
+ voyager_setCurrentClock(voyager_fmtClkReg(&pll));
+ break;
+ default:
+ LEAVE();
+ }
+
+ dbg_msg("actual %s clock ==> %u hz.\n",clkNames[clksrc],actualClk);
+ }
+ LEAVE();
+}
+
+int hw_sm502_inithw(struct lynx_share* share,struct pci_dev * pdev)
+{
+ int ret;
+ ushort mclk,m1xclk;
+ unsigned int reg;
+ struct sm502_share * spec_share;
+ struct init_status502 * parm;
+
+ ENTER();
+
+ ret = 0;
+ reg = PEEK32(DRAM_CTRL);
+ spec_share = container_of(share,struct sm502_share,share);
+ parm = &spec_share->state.initParm;
+
+ /* for easy hardware setting,always use mode0*/
+ POKE32(0x54,0);
+
+ if(share->vidmem_size == MB(4)){
+ /* for sm107,use banks 2*/
+ reg = FIELD_SET(reg,DRAM_CTRL,CPU_BANKS,2);
+ }else{
+ reg = FIELD_SET(reg,DRAM_CTRL,CPU_BANKS,4);
+ }
+
+#ifdef CONFIG_SYS_HAS_CPU_LOONGSON2
+ reg = FIELD_SET(reg,DRAM_CTRL,LOCAL,RESET);
+#endif
+ POKE32(DRAM_CTRL,reg);
+
+#ifdef CONFIG_SYS_HAS_CPU_LOONGSON2
+ reg = FIELD_SET(reg,DRAM_CTRL,LOCAL,NORMAL);
+ POKE32(DRAM_CTRL,reg);
+#endif
+
+ /* set TFT Panel Type */
+ switch(spec_share->state.pnltype){
+ /* the enum value are designed to equal to the register value */
+ case sm502_9TFT:
+ case sm502_12TFT:
+ case sm502_24TFT:
+ POKE32(PANEL_DISPLAY_CTRL,
+ FIELD_VALUE(PEEK32(PANEL_DISPLAY_CTRL),
+ PANEL_DISPLAY_CTRL,TFT,spec_share->state.pnltype));
+ break;
+ }
+
+ /* does user need CRT ?*/
+ if(spec_share->state.nocrt){
+ POKE32(MISC_CTRL,FIELD_SET(PEEK32(MISC_CTRL),MISC_CTRL,DAC_POWER,DISABLE));
+ /* shut off dpms */
+ POKE32(SYSTEM_CTRL,
+ FIELD_SET(PEEK32(SYSTEM_CTRL),SYSTEM_CTRL,DPMS,VNHN));
+ dbg_msg("read SYSTEM ctrl (nocrt) == %08x\n",PEEK32(SYSTEM_CTRL));
+ }else{
+ POKE32(MISC_CTRL,FIELD_SET(PEEK32(MISC_CTRL),MISC_CTRL,DAC_POWER,ENABLE));
+ /* turn on dpms */
+ POKE32(SYSTEM_CTRL,
+ FIELD_SET(PEEK32(SYSTEM_CTRL),SYSTEM_CTRL,DPMS,VPHP));
+ dbg_msg("read SYSTEM ctrl (crt) == %08x\n",PEEK32(SYSTEM_CTRL));
+ }
+
+
+ /* defaulty enable pci burst read and write */
+ reg = PEEK32(SYSTEM_CTRL);
+ POKE32(SYSTEM_CTRL,FIELD_SET(reg,SYSTEM_CTRL,PCI_BURST,ENABLE)|
+#if 0
+ FIELD_SET(reg,SYSTEM_CTRL,PCI_BURST_READ,ENABLE)|
+ FIELD_SET(reg,SYSTEM_CTRL,PCI_RETRY,ENABLE)|
+ FIELD_SET(reg,SYSTEM_CTRL,PCI_CLOCK_RUN,ENABLE)|
+ FIELD_SET(reg,SYSTEM_CTRL,PCI_RETRY,ENABLE)
+#endif
+ 0);
+
+ /* defaulty open dac power */
+ reg = PEEK32(MISC_CTRL);
+ POKE32(MISC_CTRL,FIELD_SET(reg,MISC_CTRL,DAC_POWER,ENABLE));
+
+#if 0
+ /* find below line make system die deadly*/
+ /* shut up all none-graphic-related power gate*/
+ voyager_setCurrentGate(6);
+#endif
+ mclk = parm->master_clk;
+ m1xclk = parm->mem_clk;
+
+ if(mclk < 80){
+ //inf_msg("set voyager engine clock to %d mhz\n",mclk);
+ voyager_set_clock(SM502_MXCLK,MHZ(mclk));
+ }
+
+ if(m1xclk < 150){
+ //inf_msg("set voyager sdram clock to %d mhz\n",m1xclk);
+ voyager_set_clock(SM502_M1XCLK,MHZ(m1xclk));
+ }
+
+ if(!share->accel_off){
+ hw_sm502_initAccel(&share->accel);
+ }
+
+ LEAVE(ret);
+}
+
+resource_size_t hw_sm502_getVMSize(struct lynx_share * share)
+{
+ int idx;
+ static resource_size_t sm501_mem_local[] = {
+ [0] = MB(4),
+ [1] = MB(8),
+ [2] = MB(16),
+ [3] = MB(32),
+ [4] = MB(64),
+ [5] = MB(2),
+ };
+ ENTER();
+ idx = FIELD_GET(PEEK32(DRAM_CTRL),DRAM_CTRL,SIZE);
+ LEAVE(sm501_mem_local[idx]);
+}
+
+int hw_sm502_output_checkMode(struct lynxfb_output* output,struct fb_var_screeninfo* var)
+{
+#if 0
+ ENTER();
+ LEAVE(0);
+#else
+ return 0;
+#endif
+
+}
+
+
+static void voyager_wait_panelvsync(int times)
+{
+#if 0
+ while(times--)
+ {;}
+ return;
+#else
+ unsigned int status;
+ while(times -- > 0){
+ /* wait for end of vsync */
+ do{
+ status = FIELD_GET(PEEK32(CMD_INTPR_STATUS),
+ CMD_INTPR_STATUS,
+ PANEL_SYNC);
+ }while(status == CMD_INTPR_STATUS_PANEL_SYNC_ACTIVE);
+
+ /* wait for start of vsync */
+ do{
+ status = FIELD_GET(PEEK32(CMD_INTPR_STATUS),
+ CMD_INTPR_STATUS,
+ PANEL_SYNC);
+ }while(status == CMD_INTPR_STATUS_PANEL_SYNC_INACTIVE);
+ }
+#endif
+}
+
+static void voyager_panel_power(int open,int times)
+{
+ unsigned int reg = PEEK32(PANEL_DISPLAY_CTRL);
+
+ voyager_wait_panelvsync(4);
+ if(open != 0){
+ /* turn on fpvdden */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,FPVDDEN,HIGH);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn on fpdata */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,DATA,ENABLE);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn on fpvbias */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,VBIASEN,HIGH);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn on fpen */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,FPEN,HIGH);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ }else{
+ /* turn off fpvdden */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,FPVDDEN,LOW);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn off fpdata */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,DATA,DISABLE);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn off fpvbias */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,VBIASEN,LOW);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+
+ /* turn off fpen */
+ reg = FIELD_SET(reg,
+ PANEL_DISPLAY_CTRL,FPEN,LOW);
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ voyager_wait_panelvsync(times);
+ }
+}
+
+int hw_sm502_output_setMode(struct lynxfb_output* output,
+ struct fb_var_screeninfo* var,
+ struct fb_fix_screeninfo* fix)
+{
+ unsigned int reg;
+ ENTER();
+ //if(output->paths & sm502_panel)
+ {
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ reg = FIELD_SET(reg,PANEL_DISPLAY_CTRL,TIMING,ENABLE);
+ reg = FIELD_SET(reg,PANEL_DISPLAY_CTRL,PLANE,ENABLE);
+ reg |= 0x0f000000;
+ POKE32(PANEL_DISPLAY_CTRL,reg);
+ //voyager_panel_power(1,4);/* open panel sequence */
+ }
+
+ //if(output->paths & sm502_crt)
+ {
+ reg = PEEK32(CRT_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,CRT_DISPLAY_CTRL,SELECT,*output->channel);
+ reg = FIELD_SET(reg,CRT_DISPLAY_CTRL,TIMING,ENABLE);
+ reg = FIELD_SET(reg,CRT_DISPLAY_CTRL,PLANE,ENABLE);
+ POKE32(CRT_DISPLAY_CTRL,reg);
+ }
+ LEAVE(0);
+}
+
+int hw_sm502_crtc_checkMode(struct lynxfb_crtc* crtc,struct fb_var_screeninfo* var)
+{
+ ENTER();
+ /* video memory check move to upper routine */
+ if(var->bits_per_pixel ==8 ||
+ var->bits_per_pixel == 16 ||
+ var->bits_per_pixel == 32)
+ {}
+ else
+ LEAVE(-EINVAL);
+
+ LEAVE(0);
+}
+
+static void set_bpp(enum sm502_channel ctrl,int bpp)
+{
+ unsigned int reg;
+ if(ctrl == sm502_primary ){
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ switch(bpp){
+ case 8:
+ case 16:
+ case 32:
+ POKE32(PANEL_DISPLAY_CTRL,
+ FIELD_VALUE(reg,PANEL_DISPLAY_CTRL,FORMAT,bpp>>4));
+ break;
+ }
+
+ }else{
+ reg = PEEK32(CRT_DISPLAY_CTRL);
+ switch(bpp){
+ case 8:
+ case 16:
+ case 32:
+ POKE32(CRT_DISPLAY_CTRL,
+ FIELD_VALUE(reg,CRT_DISPLAY_CTRL,FORMAT,bpp>>4));
+ break;
+ }
+ }
+
+}
+
+static void set_timing(enum sm502_channel ctrl,struct fb_var_screeninfo * var)
+{
+ unsigned int reg,base;
+
+ if(ctrl == sm502_primary){
+ /* for panel channel,set its paning and rectangle value */
+ POKE32(PANEL_PAN_CTRL,0);
+ POKE32(PANEL_PLANE_TL,0);
+ POKE32(PANEL_PLANE_BR,(var->xres -1)|(var->yres -1)<<16);
+ base = PANEL_HORIZONTAL_TOTAL;
+ }else{
+ base = CRT_HORIZONTAL_TOTAL;
+ }
+
+ /* program horizontal total and disp_end */
+ reg = FIELD_VALUE(0,PANEL_HORIZONTAL_TOTAL,TOTAL,h_total(var) - 1)|
+ FIELD_VALUE(0,PANEL_HORIZONTAL_TOTAL,DISPLAY_END,var->xres - 1);
+
+ POKE32(base + VOYAGER_OFF_DC_H_TOT,reg);
+
+ /* program horizontal sync START and WIDTH */
+ reg = FIELD_VALUE(0,PANEL_HORIZONTAL_SYNC,WIDTH,var->hsync_len)|
+ FIELD_VALUE(0,PANEL_HORIZONTAL_SYNC,START,var->xres + var->right_margin - 1);
+ POKE32(base + VOYAGER_OFF_DC_H_SYNC,reg);
+
+ /* program vertical total and disp_end */
+ reg = FIELD_VALUE(0,PANEL_VERTICAL_TOTAL,TOTAL,v_total(var) -1)|
+ FIELD_VALUE(0,PANEL_VERTICAL_TOTAL,DISPLAY_END,var->yres - 1);
+
+ POKE32(base + VOYAGER_OFF_DC_V_TOT,reg);
+
+ /* program vertical sync START and WIDTH */
+ reg = FIELD_VALUE(0,PANEL_VERTICAL_SYNC,HEIGHT,var->vsync_len)|
+ FIELD_VALUE(0,PANEL_VERTICAL_SYNC,START,var->yres + var->lower_margin -1);
+
+ POKE32(base + VOYAGER_OFF_DC_V_SYNC,reg);
+
+}
+
+
+int hw_sm502_crtc_setMode(struct lynxfb_crtc* crtc,
+ struct fb_var_screeninfo* var,
+ struct fb_fix_screeninfo* fix)
+{
+ unsigned int reg,tmp,pixclk;
+ int fmt;
+ struct lynx_share * share;
+ struct lynxfb_par * par;
+ ENTER();
+
+ pixclk = ps_to_hz(var->pixclock);
+ /* set timing first and color format */
+ set_timing(crtc->channel,var);
+ set_bpp(crtc->channel,var->bits_per_pixel);
+
+ par = container_of(crtc,struct lynxfb_par,crtc);
+ share = par->share;
+
+#if 1
+ if(!share->accel_off){
+ /* set 2d engine pixel format according to mode bpp */
+ switch(var->bits_per_pixel){
+ case 8:
+ fmt = 0;
+ break;
+ case 16:
+ fmt = 1;
+ break;
+ case 32:
+ default:
+ fmt = 2;
+ break;
+ }
+ hw_set2dformat(&share->accel,fmt);
+ }
+#endif
+
+#if 1
+ /* set start addr,width,offset,etc... */
+ if(crtc->channel == sm502_primary){
+ /* set pixel clock */
+ voyager_set_clock(SM502_PANEL_PLL,pixclk);
+
+
+ /* set fb address */
+ POKE32(PANEL_FB_ADDRESS,crtc->oScreen);
+
+ /* set windows position and globle width in unit of pixel/line */
+ reg = FIELD_VALUE(0,PANEL_WINDOW_WIDTH,X,var->xoffset)|
+ FIELD_VALUE(0,PANEL_WINDOW_WIDTH,WIDTH,var->xres_virtual);
+
+ POKE32(PANEL_WINDOW_WIDTH,reg);
+
+ reg = FIELD_VALUE(0,PANEL_WINDOW_HEIGHT,Y,var->yoffset)|
+ FIELD_VALUE(0,PANEL_WINDOW_HEIGHT,HEIGHT,var->yres_virtual);
+ POKE32(PANEL_WINDOW_HEIGHT,reg);
+
+ /* set fb width and offset */
+ tmp = PADDING(crtc->line_pad,
+ var->xres * (var->bits_per_pixel>>3));
+ reg = FIELD_VALUE(0,PANEL_FB_WIDTH,WIDTH,tmp)|
+ FIELD_VALUE(0,PANEL_FB_WIDTH,OFFSET,fix->line_length);
+
+ POKE32(PANEL_FB_WIDTH,reg);
+ }else{
+ /* set pixel clock */
+ voyager_set_clock(SM502_V1XCLK,pixclk);
+
+ /* set fb address */
+ POKE32(CRT_FB_ADDRESS,crtc->oScreen);
+
+ /* set fb width and offset */
+ tmp = PADDING(crtc->line_pad,
+ var->xres * (var->bits_per_pixel>>3));
+ reg = FIELD_VALUE(0,CRT_FB_WIDTH,WIDTH,tmp)|
+ FIELD_VALUE(0,CRT_FB_WIDTH,OFFSET,fix->line_length);
+
+ POKE32(CRT_FB_WIDTH,reg);
+ }
+#endif
+ LEAVE(0);
+}
+
+
+int hw_sm502_setColReg(struct lynxfb_crtc* crtc,ushort index,
+ ushort red,ushort green,ushort blue)
+{
+ static unsigned int add[]={PANEL_PALETTE_RAM,CRT_PALETTE_RAM};
+ POKE32(add[crtc->channel] + index*4 ,(red<<16)|(green<<8)|blue);
+ return 0;
+}
+
+
+int hw_sm502_setBLANK(struct lynxfb_output* output,int blank)
+{
+ unsigned int dpms,pps,crtdb;
+ ENTER();
+ dpms = pps = crtdb =0;
+ switch(blank)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_UNBLANK:
+#else
+ case VESA_NO_BLANKING:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VPHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_ENABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_OFF;
+ break;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_NORMAL:
+ dpms = SYSTEM_CTRL_DPMS_VPHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_VSYNC_SUSPEND:
+#else
+ case VESA_VSYNC_SUSPEND:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VNHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_HSYNC_SUSPEND:
+#else
+ case VESA_HSYNC_SUSPEND:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VPHN;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_POWERDOWN:
+#else
+ case VESA_POWERDOWN:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VNHN;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+ }
+
+ POKE32(SYSTEM_CTRL,FIELD_VALUE(PEEK32(SYSTEM_CTRL),SYSTEM_CTRL,DPMS,dpms));
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(PEEK32(CRT_DISPLAY_CTRL),CRT_DISPLAY_CTRL,BLANK,pps));
+ POKE32(PANEL_DISPLAY_CTRL,FIELD_VALUE(PEEK32(PANEL_DISPLAY_CTRL),PANEL_DISPLAY_CTRL,DATA,pps));
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(PEEK32(CRT_DISPLAY_CTRL),
+ CRT_DISPLAY_CTRL,BLANK,crtdb));
+ LEAVE(0);
+}
+
+void hw_sm502_crtc_clear(struct lynxfb_crtc* crtc)
+{
+
+}
+
+void hw_sm502_output_clear(struct lynxfb_output* output)
+{
+
+}
+
+void hw_sm502_initAccel(struct lynx_accel * accel)
+{
+ u32 reg;
+ /* enable DE engine */
+ reg = FIELD_SET(PEEK32(CURRENT_POWER_GATE),CURRENT_POWER_GATE,2D,ENABLE);
+ POKE32(POWER_MODE0_GATE,reg);
+
+ /* engine reset */
+ reg = PEEK32(SYSTEM_CTRL);
+ reg = FIELD_SET(reg,SYSTEM_CTRL,DE_ABORT,2D_ABORT);
+ POKE32(SYSTEM_CTRL,reg);
+
+ reg = PEEK32(SYSTEM_CTRL);
+ reg = FIELD_SET(reg,SYSTEM_CTRL,DE_ABORT,NORMAL);
+ POKE32(SYSTEM_CTRL,reg);
+
+ /* move 2d engine register setting into accel functions */
+ accel->de_init(accel);
+#if 0
+ /* setup 2d engine registers */
+
+ dePOKE32(DE_MASKS,0xFFFFFFFF);
+
+ reg = FIELD_SET(0,DE_STRETCH_FORMAT,PATTERN_XY,NORMAL)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,PATTERN_Y,0)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,PATTERN_X,0)|
+ FIELD_SET(0,DE_STRETCH_FORMAT,ADDRESSING,XY)|
+ FIELD_VALUE(0,DE_STRETCH_FORMAT,SOURCE_HEIGHT,3);
+
+ clr = FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_XY)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_Y)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,PATTERN_X)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,ADDRESSING)&
+ FIELD_CLEAR(DE_STRETCH_FORMAT,SOURCE_HEIGHT);
+
+ /* DE_STRETCH bpp format need be initilized in setMode routine */
+ dePOKE32(DE_STRETCH_FORMAT,(dePEEK32(DE_STRETCH_FORMAT) & clr) | reg);
+
+ /* disable clipping and transparent */
+ dePOKE32(DE_CLIP_TL,0);
+ dePOKE32(DE_CLIP_BR,0);
+ dePOKE32(DE_COLOR_COMPARE_MASK,0);
+ dePOKE32(DE_COLOR_COMPARE,0);
+
+ reg = FIELD_SET(0,DE_CONTROL,TRANSPARENCY,DISABLE)|
+ FIELD_SET(0,DE_CONTROL,TRANSPARENCY_MATCH,OPAQUE)|
+ FIELD_SET(0,DE_CONTROL,TRANSPARENCY_SELECT,SOURCE);
+
+ clr = FIELD_CLEAR(DE_CONTROL,TRANSPARENCY)&
+ FIELD_CLEAR(DE_CONTROL,TRANSPARENCY_MATCH)&
+ FIELD_CLEAR(DE_CONTROL,TRANSPARENCY_SELECT);
+
+ dePOKE32(DE_CONTROL,(dePEEK32(DE_CONTROL)&clr)|reg);
+#endif
+}
+
+
+/*
+ * return 0:engine is idle
+ * return none-zero: engine always not in idle status
+ * */
+int hw_sm502_deWait()
+{
+ int i=0x100000;
+ while(i--){
+ /*
+ * use CMD_INTPR to check will loop forever
+ unsigned int dwVal = PEEK32(SYSTEM_CTRL);
+ if((FIELD_GET(dwVal,CMD_INTPR_STATUS,2D_ENGINE) == CMD_INTPR_STATUS_2D_ENGINE_IDLE) &&
+ (FIELD_GET(dwVal,CMD_INTPR_STATUS,2D_FIFO) == CMD_INTPR_STATUS_2D_FIFO_EMPTY) &&
+ (FIELD_GET(dwVal,CMD_INTPR_STATUS,2D_SETUP) == CMD_INTPR_STATUS_2D_SETUP_IDLE) &&
+ (FIELD_GET(dwVal,CMD_INTPR_STATUS,2D_MEMORY_FIFO) == CMD_INTPR_STATUS_2D_MEMORY_FIFO_EMPTY))
+ */
+ unsigned int dwVal = PEEK32(SYSTEM_CTRL);
+ if((FIELD_GET(dwVal,SYSTEM_CTRL,DE_STATUS) == SYSTEM_CTRL_DE_STATUS_IDLE) &&
+ (FIELD_GET(dwVal,SYSTEM_CTRL,DE_FIFO) == SYSTEM_CTRL_DE_FIFO_EMPTY))
+ {
+ return 0;
+ }
+ }
+ /* timeout error */
+ return -1;
+}
+
diff --git a/drivers/video/lynxfb/lynx_hw502.h b/drivers/video/lynxfb/lynx_hw502.h
new file mode 100644
index 0000000..77c8e87
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw502.h
@@ -0,0 +1,127 @@
+#ifndef LYNX_HW502_H__
+#define LYNX_HW502_H__
+#include "lynx_help.h"
+#include "voyager.h"
+
+#define DEFAULT_INPUT_CLOCK 24000000
+#define VGX_MMIO 1
+#define VGX_MEM 2
+
+enum sm502_clocktype{
+ /* Divider clocks */
+ SM502_P2XCLK = 0,/* PANEL CONTROLLER CLOCK */
+ SM502_V2XCLK = 1,/* CRT CONTROLLER CLOCK */
+ SM502_MXCLK = 2,/* MAIN ENGINE CLOCK */
+ SM502_M1XCLK = 3,/* SDRAM CONTROLLER CLOCK */
+
+ /* the following are for sm502 and later */
+ SM502_P1XCLK, /* x1 panel divider clock */
+ SM502_V1XCLK, /* x1 CRT divider clock , used for secondary channel */
+ SM502_PANEL_PLL, /* Programmable panel pixel clock, used for primary channel */
+ SM502_PANEL_PLL_2X, /* For TV, 2X clock is needed */
+};
+
+
+enum sm502_pnltype{
+ sm502_24TFT = 0,/* 24 bit tft */
+ sm502_9TFT = 1,/* 9 bit tft */
+ sm502_12TFT = 2,/* 12 bit tft */
+};
+
+/* vga channel is not concerned */
+enum sm502_dataflow{
+ sm502_simul_pri,/* primary => all head */
+ sm502_dual_normal,/* primary => panel head and secondary => crt */
+ sm502_single_sec,
+};
+
+
+enum sm502_channel{
+ sm502_primary = 0,
+ /* enum value equal to the register filed data */
+ sm502_secondary = 1,
+};
+
+enum sm502_path{
+ sm502_panel = 1,
+ sm502_crt = 2,
+ sm502_pnc = 3,/* panel and crt */
+};
+
+struct init_status502{
+ ushort powerMode;/* defaultly 0 */
+ /* below clocks are in unit of MHZ*/
+ ushort mem_clk;
+ ushort master_clk;/* 2d engine clock */
+ ushort setAllEngOff;
+ ushort resetMemory;
+};
+
+struct sm502_state{
+ struct init_status502 initParm;
+ enum sm502_pnltype pnltype;
+ enum sm502_dataflow dataflow;
+ int nocrt;/* when in simul mode,nocrt == 1 means only panel output show content */
+};
+
+/* sm502_share stands for a presentation of two frame buffer
+ that use one sm502 adaptor */
+
+struct sm502_share{
+ /* it's better to put lynx_share struct to the first place of sm502_share */
+ struct lynx_share share;
+ struct sm502_state state;
+ /* 0: no hardware cursor
+ 1: primary crtc hw cursor enabled,
+ 2: secondary crtc hw cursor enabled
+ 3: both ctrc hw cursor enabled
+ */
+ int hwCursor;
+ /* usb always use bottom memory: totalsize - 512kb */
+ int usb_off;
+ int aud_off;
+
+};
+
+struct sm502_pll_value{
+ enum sm502_clocktype clockType;
+ unsigned int inputFreq;
+
+ /* Use this for all clockType != PANEL_PLL */
+ unsigned int dividerClk; /* either x12 or x14 of the input reference crystal */
+ unsigned int divider;
+ unsigned int shift;
+
+ /* Use this when clockType = PANEL_PLL */
+ unsigned int M;
+ unsigned int N;
+ unsigned int divBy2;
+};
+
+int hw_sm502_map(struct lynx_share* share,struct pci_dev* pdev);
+int hw_sm502_inithw(struct lynx_share*,struct pci_dev *);
+int hw_sm502_deWait(void);
+void hw_sm502_initAccel(struct lynx_accel*);
+resource_size_t hw_sm502_getVMSize(struct lynx_share *);
+int hw_sm502_output_checkMode(struct lynxfb_output*,struct fb_var_screeninfo*);
+int hw_sm502_output_setMode(struct lynxfb_output*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm502_crtc_checkMode(struct lynxfb_crtc*,struct fb_var_screeninfo*);
+int hw_sm502_crtc_setMode(struct lynxfb_crtc*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm502_setColReg(struct lynxfb_crtc*,ushort,ushort,ushort,ushort);
+int hw_sm502_setBLANK(struct lynxfb_output*,int);
+void hw_sm502_crtc_clear(struct lynxfb_crtc*);
+void hw_sm502_output_clear(struct lynxfb_output*);
+//static void sm502fb_wait_panelvsnc(int vsync_count);
+extern unsigned long SmRead8(unsigned long nOffset);
+extern unsigned long SmRead16(unsigned long nOffset);
+extern unsigned long SmRead32(unsigned long nOffset);
+extern volatile unsigned char __iomem * SmIoAddress(void);
+extern void SmWrite8(unsigned long nOffset, unsigned long nData);
+extern void SmWrite16(unsigned long nOffset, unsigned long nData);
+extern void SmWrite32(unsigned long nOffset, unsigned long nData);
+extern void SmMemset(unsigned long nOffset, unsigned char val, int count);
+extern void sm501_set_gate( unsigned long gate);
+extern int sm501_unit_power(struct device *,unsigned int,unsigned int);
+extern int sm501_modify_reg(struct device*,unsigned long,unsigned long,unsigned long);
+
+#endif
diff --git a/drivers/video/lynxfb/lynx_hw712.c b/drivers/video/lynxfb/lynx_hw712.c
new file mode 100644
index 0000000..d5800ef
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw712.c
@@ -0,0 +1,511 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include<linux/module.h>
+#include<linux/kernel.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+#include <linux/console.h>
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+
+#include "lynx_drv.h"
+#include "lynx_hw712.h"
+#include "ddk712/ddk712.h"
+#include "lynx_accel.h"
+
+int hw_sm712_map(struct lynx_share* share,struct pci_dev* pdev)
+{
+ int ret;
+ ENTER();
+
+ ret = 0;
+ if(share->devid == 0x712){
+ share->vidreg_start = pci_resource_start(pdev,0)+MB(4);
+ share->vidreg_size = MB(4);
+ share->vidmem_start = pci_resource_start(pdev,0);
+ }else if(share->devid == 0x720){
+ share->vidreg_start = pci_resource_start(pdev,0);
+ share->vidreg_size = MB(2);
+ share->vidmem_start = pci_resource_start(pdev,0) + MB(2);
+ }else{
+ /* do not support other chip currently */
+ return -ENODEV;
+ }
+
+ /* now map mmio*/
+ share->pvReg = ioremap(share->vidreg_start,share->vidreg_size);
+ if(!share->pvReg){
+ err_msg("mmio failed\n");
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ if(share->devid == 0x720){
+ share->accel.dprBase = share->pvReg + DE_BASE_ADDR_TYPE3;
+ share->accel.dpPortBase = share->pvReg + DE_PORT_ADDR_TYPE3;
+ }else{
+ share->accel.dprBase = share->pvReg + DE_BASE_ADDR_TYPE2;
+ share->accel.dpPortBase = share->pvReg + DE_PORT_ADDR_TYPE2;
+ }
+
+ ddk712_set_mmio(share->devid,share->pvReg);
+ share->vidmem_size = hw_sm712_getVMSize(share);
+ /* map frame buffer*/
+ share->pvMem = ioremap(share->vidmem_start, share->vidmem_size);
+ if(!share->pvMem){
+ err_msg("Map video memory failed\n");
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ inf_msg("mapped video memory = %p\n",share->pvMem);
+
+ memset(share->pvMem,0,share->vidmem_size);
+exit:
+ LEAVE(ret);
+}
+
+
+int hw_sm712_inithw(struct lynx_share* share,struct pci_dev * pdev)
+{
+ init_parm_712 parm;
+ struct sm712_share * spec_share;
+ ENTER();
+ spec_share = container_of(share,struct sm712_share,share);
+ parm.devid = share->devid;
+ parm.memClock = spec_share->mclk;
+ /* a cruel limitation of sm712,burst read make 712 die in x86_64 bit system */
+#if defined(__x86_64__)
+ parm.pci_burst = 2;/* no burst read,only burst write*/
+#else
+ /* enable both read and write */
+ parm.pci_burst = 3;
+#endif
+ parm.lcd = spec_share->lcd;
+ parm.lcd_color.tftColor = spec_share->lcd_color.tftColor;
+ parm.lcd_color.dstnColor = spec_share->lcd_color.dstnColor;
+
+#if defined(__i386__) || defined( __x86_64__)
+ /* enable linear mode and packed pixel format first*/
+ outb_p(0x18, 0x3c4);
+ outb_p(0x11, 0x3c5);
+#else
+ /*
+ * don't know how to write IO port in other arch/platform
+ * just use default method as a try
+ * */
+ outb_p(0x18, 0x3c4);
+ outb_p(0x11, 0x3c5);
+#endif
+
+ ddk712_hw_init(&parm);
+ if(!share->accel_off){
+ hw_sm712_initAccel(&share->accel, parm.devid);
+ }
+ LEAVE(0);
+}
+
+resource_size_t hw_sm712_getVMSize(struct lynx_share * share)
+{
+ resource_size_t ret;
+ ret = 0;
+ ENTER();
+ if(share->devid == 0x712){
+ /* sm712 only support 4mb internal video memory */
+ ret = MB(4);
+ }else if(share->devid == 0x720){
+ /* SM722 only support 8mb internal video memory */
+ ret = MB(8);
+ }
+ LEAVE(ret);
+}
+
+int hw_sm712_output_checkMode(struct lynxfb_output* output,
+ struct fb_var_screeninfo* var)
+{
+ ENTER();
+
+ LEAVE(0);
+}
+
+int hw_sm712_output_setMode(struct lynxfb_output* output,
+ struct fb_var_screeninfo* var,
+ struct fb_fix_screeninfo* fix)
+{
+ struct lynxfb_par * par;
+ struct lynx_share * share;
+ struct sm712_share * spec_share;
+ ENTER();
+
+ par = container_of(output,struct lynxfb_par,output);
+ share = par->share;
+ spec_share = container_of(share,struct sm712_share,share);
+
+ if(output->paths == 1){
+ /* this is 1st CRT head,and it only connected to CRT channel
+ * nothing need to set,leave them be what they are
+ * */
+ inf_msg("1st CRT path <== CRT channel\n");
+ }else if(output->paths == 2){
+ /* this is Panel head,and it can connected to either CRT or Panel channel*/
+ if(*output->channel == 0){
+ /* Virtual Refresh Clk should be disabled */
+ inf_msg("2nd CRT/Panel Path <== CRT channel\n");
+ poke_fpr(0x31,peek_fpr(0x31)&0x7f);
+ }else{
+ /* Virtual Clock should be enabled*/
+ poke_fpr(0x31,peek_fpr(0x31)|0x80);
+ inf_msg("2nd CRT/Panel Path <== Panel channel\n");
+ }
+ }else if(output->paths == 3){
+ /* these are Panel and Crt heads,
+ * can only connected to CRT channel simutanounsly
+ * need disable Virtual Clock
+ * */
+ poke_fpr(0x31,peek_fpr(0x31)&0x7f);
+ inf_msg("1st CRT Path/2nd CRT/Panel Path <== CRT channel\n");
+
+ }else{
+ err_msg("output->path == %d,not valid.\n",output->paths);
+ LEAVE(-EINVAL);
+ }
+
+ LEAVE(0);
+}
+
+int hw_sm712_crtc_checkMode(struct lynxfb_crtc* crtc,
+ struct fb_var_screeninfo* var)
+{
+ int ret;
+ ENTER();
+ switch(var->bits_per_pixel){
+ /* for crt channel,all pixel format are supported */
+ case 8:
+ case 16:
+ ret = 0;
+ break;
+ case 24:
+ case 32:
+ /* only 8/16 bpp format are supported by virtual clock */
+ if(crtc->channel != 0)
+ ret = - EINVAL;
+ else
+ ret = 0;
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+
+ }
+ LEAVE(ret);
+}
+
+int hw_sm712_crtc_setMode(struct lynxfb_crtc* crtc,
+ struct fb_var_screeninfo* var,
+ struct fb_fix_screeninfo* fix)
+{
+ char tmp;
+ int fmt;
+ unsigned int base,pitch,width;
+ struct lynxfb_par *par;
+ struct lynx_share * share;
+ ENTER();
+
+ par = container_of(crtc,struct lynxfb_par,crtc);
+ share = par->share;
+ /* set timing,use mode table to set mode
+ * as @var couldn't tell what v-refresh rate it is
+ * so we assume all modes use 60 hz
+ * we may need to create a new setmode function for sm712
+ * like sm750 style,which can use @var parameter directly
+ * */
+ ddk712_setModeTiming(crtc->channel,var->xres,var->yres,60);
+
+ if(crtc->channel == 0){
+ /* sm712 CRT channel */
+ switch(var->bits_per_pixel){
+ case 8:
+ tmp = 0;
+ break;
+ case 16:
+ tmp = 2;
+ break;
+ case 24:
+ tmp = 4;
+ break;
+ case 32:
+ tmp = 3;
+ break;
+ default:
+ LEAVE(-EINVAL);
+ }
+
+ poke32_vpr(0,
+ FIELD_VALUE(peek32_vpr(0x0),
+ MISC_GRAPH_VIDEO_CTRL,
+ DATA_FORMAT,
+ tmp));
+ }else{
+ /* sm712 panel channel */
+ switch(var->bits_per_pixel){
+ case 8:
+ tmp = 0x40;
+ case 16:
+ tmp = 0x0;
+ break;
+ default:
+ LEAVE(-EINVAL);
+ }
+
+ poke_fpr(0x31,(peek_fpr(0x31)&~0x40)|tmp);
+ }
+
+ /* set pitch,width,address stuffs*/
+ base = crtc->oScreen;
+ pitch = fix->line_length;
+ width = var->xres * var->bits_per_pixel / 8;
+
+ base >>= 3;
+ pitch >>= 3;
+ width >>= 3;
+
+ if(crtc->channel == 0){
+ poke32_vpr(0x0c,base);
+ poke32_vpr(0x10,(width<<16)|(pitch & 0xffff));
+ }else{
+ /* fpr40~43: read fifo base address*/
+ poke_fpr(0x40,base & 0xff);
+ poke_fpr(0x41,(base & 0xff00)>>8);
+ poke_fpr(0x42,base & 0xff);
+ poke_fpr(0x43,(base & 0xff00)>>8);
+
+ /* fpr44,45:read fifo1 offset */
+ poke_fpr(0x44,pitch & 0xff);
+
+ if(share->devid == PCI_DEVID_LYNX_3DM){
+ /* not implemented */
+ }else{
+ tmp = (pitch & 0x300) >> 2;
+ tmp |= ((base & 0x70000)>>16)|((base & 0x70000)>>13);
+ /* fpr45: fifo1 offset and fifo1 base address*/
+ poke_fpr(0x45,tmp);
+ }
+ /* found nothing changed of lcd video after fpr46~49 modified */
+
+#if 0
+ /* lcd write start address low of lcd frame buffer*/
+ poke_fpr(0x46,base & 0xff);
+ /* lcd write start address high of lcd frame buffer*/
+ poke_fpr(0x47,(base>>8)&0xff);
+
+ /* write offset of lcd frame buffer*/
+ poke_fpr(0x48,width & 0xff);
+ poke_fpr(0x49,(peek_fpr(0x49)&0xfc)|((width&0x300)>>8));
+#endif
+ }
+#if 1
+ if(!share->accel_off){
+ /* set 2d engine pixel format according to mode bpp */
+ switch(var->bits_per_pixel){
+ case 8:
+ fmt = 0;
+ break;
+ case 16:
+ fmt = 1;
+ break;
+ case 32:
+ fmt = 2;
+ break;
+ case 24:
+ fmt = 3;
+ break;
+ default:
+ fmt = 1;
+ break;
+ }
+ hw_set2dformat(&share->accel,fmt);
+ }
+#endif
+ LEAVE(0);
+}
+
+int hw_sm712_setColReg(struct lynxfb_crtc* crtc,ushort index,
+ ushort red,ushort green,ushort blue)
+{
+ int ret;
+ ENTER();
+ ret = 0;
+ if(crtc->channel == 0){
+ /* write CRT channel RAM only
+ * use 8bits RAM
+ * */
+ poke_ccr(0x66,0xa8);
+ }else{
+ /* write LCD channel RAM only
+ * use 8bits RAM
+ * */
+ poke_ccr(0x66,0x58);
+ }
+
+ /* DAC mask set to x0ff*/
+ poke8_io(0x3c6,0xff);
+
+ /* write color code */
+ poke8_io(0x3c8,index);
+
+ /*write color value order by r,g,b*/
+ poke8_io(0x3c9,red);
+ poke8_io(0x3c9,green);
+ poke8_io(0x3c9,blue);
+ LEAVE(ret);
+}
+
+int hw_sm712_setBLANK(struct lynxfb_output* output,int blank)
+{
+ ENTER();
+
+ switch (blank)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_UNBLANK:
+#else
+ case VESA_NO_BLANKING:
+#endif
+ if(output->paths & 1){
+ /* HPVP */
+ poke_fpr(0x22,peek_fpr(0x22) & 0xcf);
+ /* experiment found fpr31 bit 2 did not affect
+ * CRT display
+ * */
+ poke_fpr(0x31,peek_fpr(0x31)|2);
+ }
+
+ if(output->paths & 2){
+ /* unblank for LCD head */
+ poke_fpr(0x31,peek_fpr(0x31)|1);
+ }
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_NORMAL:
+ if(output->paths & 1){
+ poke_fpr(0x22,peek_fpr(0x22) & 0xcf);
+ poke_fpr(0x31,peek_fpr(0x31) & ~2);
+ }
+
+ if(output->paths & 2){
+ /* blank for LCD head */
+ poke_fpr(0x31,peek_fpr(0x31)&~1);
+ }
+ break;
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_VSYNC_SUSPEND:
+#else
+ case VESA_VSYNC_SUSPEND:
+#endif
+ if(output->paths & 1){
+ poke_fpr(0x22,(peek_fpr(0x22)&0xcf)|0x20);
+ poke_fpr(0x31,peek_fpr(0x31) & ~2);
+ }
+ if(output->paths & 2){
+ poke_fpr(0x31,peek_fpr(0x31)&~1);
+ }
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_HSYNC_SUSPEND:
+#else
+ case VESA_HSYNC_SUSPEND:
+#endif
+ if(output->paths & 1){
+ poke_fpr(0x22,(peek_fpr(0x22)&0xcf)|0x10);
+ poke_fpr(0x31,peek_fpr(0x31) & ~2);
+ }
+ if(output->paths & 2){
+ poke_fpr(0x31,peek_fpr(0x31)&~1);
+ }
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_POWERDOWN:
+#else
+ case VESA_POWERDOWN:
+#endif
+ if(output->paths & 1){
+ poke_fpr(0x22,(peek_fpr(0x22)&0xcf)|0x30);
+ poke_fpr(0x31,peek_fpr(0x31) & ~2);
+ }
+ if(output->paths & 2){
+ poke_fpr(0x31,peek_fpr(0x31)&~1);
+ }
+ break;
+ }
+ LEAVE(0);
+}
+
+int hw_sm712_deWait()
+{
+ unsigned int loop = 0x100000;
+ /* wait queue ,assume PCIRetry is not enabled */
+ while(loop--){
+ /* see if fifo empty and engine idle */
+ if((peek_scr(0x16) & 0x08) == 0 &&
+ (peek_scr(0x16) & 0x10) != 0)
+ break;
+ }
+ return (!loop);
+}
+
+void hw_sm712_initAccel(struct lynx_accel * accel, int devid)
+{
+ u8 reg;
+ ENTER();
+ /* enable drawing engine */
+ poke_scr(0x21,peek_scr(0x21)&0xf8);
+
+ if(devid == 0x712)
+ {
+ /*by ilena, for bug: system hang
+ after repeatly unload and load driver on sm722*/
+ /* reset drawing engine */
+ reg = peek_scr(0x15);
+ poke_scr(0x15,reg|0x30);
+ poke_scr(0x15,reg);
+ }
+
+ /* init de register */
+ accel->de_init(accel);
+ LEAVE();
+}
+
+void hw_sm712_crtc_clear(struct lynxfb_crtc* crtc)
+{
+ ENTER();
+ LEAVE();
+}
+
+void hw_sm712_output_clear(struct lynxfb_output* output)
+{
+
+ ENTER();
+ LEAVE();
+}
diff --git a/drivers/video/lynxfb/lynx_hw712.h b/drivers/video/lynxfb/lynx_hw712.h
new file mode 100644
index 0000000..5730882
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw712.h
@@ -0,0 +1,35 @@
+#ifndef LYNX_HW712_H__
+#define LYNX_HW712_H__
+#include "ddk712/ddk712_chip.h"
+
+struct sm712_share{
+ struct lynx_share share;
+ /*
+ * 0: no hw cursor for crt channel
+ * not 0: enable hw cursor for crt channel
+ * */
+ int hwc;
+ unsigned int mclk;//memory clock
+ /* below lcd color stuffs need display.h of 712 ddk*/
+ enum LCD_TYPE lcd;
+ struct {
+ enum TFT_COLOR tftColor;
+ enum DSTN_COLOR dstnColor;
+ }lcd_color;
+};
+
+resource_size_t hw_sm712_getVMSize(struct lynx_share * share);
+int hw_sm712_map(struct lynx_share* share,struct pci_dev* pdev);
+int hw_sm712_inithw(struct lynx_share*,struct pci_dev *);
+int hw_sm712_output_checkMode(struct lynxfb_output*,struct fb_var_screeninfo*);
+int hw_sm712_output_setMode(struct lynxfb_output*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm712_crtc_checkMode(struct lynxfb_crtc*,struct fb_var_screeninfo*);
+int hw_sm712_crtc_setMode(struct lynxfb_crtc*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm712_setColReg(struct lynxfb_crtc*,ushort,ushort,ushort,ushort);
+int hw_sm712_setBLANK(struct lynxfb_output*,int);
+void hw_sm712_initAccel(struct lynx_accel*, int devid);
+void hw_sm712_crtc_clear(struct lynxfb_crtc*);
+void hw_sm712_output_clear(struct lynxfb_output*);
+int hw_sm712_deWait(void);
+
+#endif
diff --git a/drivers/video/lynxfb/lynx_hw750.c b/drivers/video/lynxfb/lynx_hw750.c
new file mode 100644
index 0000000..7059f81
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw750.c
@@ -0,0 +1,646 @@
+#include<linux/version.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include<linux/config.h>
+#endif
+#include <linux/version.h>
+#include<linux/module.h>
+#include<linux/kernel.h>
+#include<linux/errno.h>
+#include<linux/string.h>
+#include<linux/mm.h>
+#include<linux/slab.h>
+#include<linux/delay.h>
+#include<linux/fb.h>
+#include<linux/ioport.h>
+#include<linux/init.h>
+#include<linux/pci.h>
+#include<linux/vmalloc.h>
+#include<linux/pagemap.h>
+#include <linux/console.h>
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+/* no below two header files in 2.6.9 */
+#include<linux/platform_device.h>
+#include<linux/screen_info.h>
+#else
+/* nothing by far */
+#endif
+
+#include "lynx_drv.h"
+#include "lynx_hw750.h"
+#include "ddk750/ddk750.h"
+#include "lynx_accel.h"
+
+int hw_sm750_map(struct lynx_share* share,struct pci_dev* pdev)
+{
+ int ret;
+ struct sm750_share * spec_share;
+ ENTER();
+
+ spec_share = container_of(share,struct sm750_share,share);
+ ret = 0;
+
+ share->vidreg_start = pci_resource_start(pdev,1);
+ share->vidreg_size = MB(2);
+
+ /* reserve the vidreg space of smi adaptor
+ * if you do this, u need to add release region code
+ * in lynxfb_remove, or memory will not be mapped again
+ * successfully
+ * */
+
+#if 0
+ if((ret = pci_request_region(pdev,1,_moduleName_)))
+ {
+ err_msg("Can not request PCI regions.\n");
+ goto exit;
+ }
+#endif
+
+ /* now map mmio and vidmem*/
+ share->pvReg = ioremap_nocache(share->vidreg_start,share->vidreg_size);
+ if(!share->pvReg){
+ err_msg("mmio failed\n");
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ share->accel.dprBase = share->pvReg + DE_BASE_ADDR_TYPE1;
+ share->accel.dpPortBase = share->pvReg + DE_PORT_ADDR_TYPE1;
+
+ ddk750_set_mmio(share->pvReg,share->devid,share->revid);
+
+ share->vidmem_start = pci_resource_start(pdev,0);
+ /* don't use pdev_resource[x].end - resource[x].start to
+ * calculate the resource size,its only the maximum available
+ * size but not the actual size,use
+ * @hw_sm750_getVMSize function can be safe.
+ * */
+ share->vidmem_size = hw_sm750_getVMSize(share);
+ inf_msg("video memory size = %d mb\n",share->vidmem_size >> 20);
+
+ /* reserve the vidmem space of smi adaptor */
+#if 0
+ if((ret = pci_request_region(pdev,0,_moduleName_)))
+ {
+ err_msg("Can not request PCI regions.\n");
+ goto exit;
+ }
+#endif
+
+ share->pvMem = ioremap(share->vidmem_start,
+ share->vidmem_size);
+
+ if(!share->pvMem){
+ err_msg("Map video memory failed\n");
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ inf_msg("video memory vaddr = %p\n",share->pvMem);
+exit:
+ LEAVE(ret);
+}
+
+
+
+int hw_sm750_inithw(struct lynx_share* share,struct pci_dev * pdev)
+{
+ struct sm750_share * spec_share;
+ struct init_status * parm;
+ ENTER();
+ spec_share = container_of(share,struct sm750_share,share);
+ parm = &spec_share->state.initParm;
+ if(parm->chip_clk == 0)
+ parm->chip_clk = (getChipType() == SM750LE)?
+ DEFAULT_SM750LE_CHIP_CLOCK :
+ DEFAULT_SM750_CHIP_CLOCK;
+
+ if(parm->mem_clk == 0)
+ parm->mem_clk = parm->chip_clk;
+ if(parm->master_clk == 0)
+ parm->master_clk = parm->chip_clk/3;
+
+ ddk750_initHw((initchip_param_t *)&spec_share->state.initParm);
+ /* for sm718,open pci burst */
+ if(share->devid == 0x718){
+ POKE32(SYSTEM_CTRL,
+ FIELD_SET(PEEK32(SYSTEM_CTRL),SYSTEM_CTRL,PCI_BURST,ON));
+ }
+
+ /* sm750 use sii164, it can be setup with default value
+ * by on power, so initDVIDisp can be skipped */
+#if 0
+ ddk750_initDVIDisp();
+#endif
+
+ if(getChipType() != SM750LE)
+ {
+ /* does user need CRT ?*/
+ if(spec_share->state.nocrt){
+ POKE32(MISC_CTRL,
+ FIELD_SET(PEEK32(MISC_CTRL),
+ MISC_CTRL,
+ DAC_POWER,OFF));
+ /* shut off dpms */
+ POKE32(SYSTEM_CTRL,
+ FIELD_SET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ DPMS,VNHN));
+ }else{
+ POKE32(MISC_CTRL,
+ FIELD_SET(PEEK32(MISC_CTRL),
+ MISC_CTRL,
+ DAC_POWER,ON));
+ /* turn on dpms */
+ POKE32(SYSTEM_CTRL,
+ FIELD_SET(PEEK32(SYSTEM_CTRL),
+ SYSTEM_CTRL,
+ DPMS,VPHP));
+ }
+
+ switch (spec_share->state.pnltype){
+ case sm750_doubleTFT:
+ case sm750_24TFT:
+ case sm750_dualTFT:
+ POKE32(PANEL_DISPLAY_CTRL,
+ FIELD_VALUE(PEEK32(PANEL_DISPLAY_CTRL),
+ PANEL_DISPLAY_CTRL,
+ TFT_DISP,
+ spec_share->state.pnltype));
+ break;
+ }
+ }else{
+ /* for 750LE ,no DVI chip initilization makes Monitor no signal */
+ /* Set up GPIO for software I2C to program DVI chip in the
+ Xilinx SP605 board, in order to have video signal.
+ */
+ swI2CInit(0,1);
+
+
+ /* Customer may NOT use CH7301 DVI chip, which has to be
+ initialized differently.
+ */
+ if (swI2CReadReg(0xec, 0x4a) == 0x95)
+ {
+ /* The following register values for CH7301 are from
+ Chrontel app note and our experiment.
+ */
+ inf_msg("yes,CH7301 DVI chip found\n");
+ swI2CWriteReg(0xec, 0x1d, 0x16);
+ swI2CWriteReg(0xec, 0x21, 0x9);
+ swI2CWriteReg(0xec, 0x49, 0xC0);
+ inf_msg("okay,CH7301 DVI chip setup done\n");
+ }
+ }
+
+ /* init 2d engine */
+ if(!share->accel_off){
+ hw_sm750_initAccel(share);
+// share->accel.de_wait = hw_sm750_deWait;
+ }
+
+ LEAVE(0);
+}
+
+
+resource_size_t hw_sm750_getVMSize(struct lynx_share * share)
+{
+ resource_size_t ret;
+ ENTER();
+ ret = ddk750_getVMSize();
+ LEAVE(ret);
+}
+
+
+
+int hw_sm750_output_checkMode(struct lynxfb_output* output,struct fb_var_screeninfo* var)
+{
+ ENTER();
+ LEAVE(0);
+}
+
+
+int hw_sm750_output_setMode(struct lynxfb_output* output,
+ struct fb_var_screeninfo* var,struct fb_fix_screeninfo* fix)
+{
+ int ret;
+ disp_output_t dispSet;
+ int channel;
+ ENTER();
+ ret = 0;
+ dispSet = 0;
+ channel = *output->channel;
+
+
+ if(getChipType() != SM750LE){
+ if(channel == sm750_primary){
+ inf_msg("primary channel\n");
+ if(output->paths & sm750_panel)
+ dispSet |= do_LCD1_PRI;
+ if(output->paths & sm750_crt)
+ dispSet |= do_CRT_PRI;
+
+ }else{
+ inf_msg("secondary channel\n");
+ if(output->paths & sm750_panel)
+ dispSet |= do_LCD1_SEC;
+ if(output->paths & sm750_crt)
+ dispSet |= do_CRT_SEC;
+
+ }
+ ddk750_setLogicalDispOut(dispSet);
+ }else{
+ /* just open DISPLAY_CONTROL_750LE register bit 3:0*/
+ u32 reg;
+ reg = PEEK32(DISPLAY_CONTROL_750LE);
+ reg |= 0xf;
+ POKE32(DISPLAY_CONTROL_750LE,reg);
+ }
+
+ inf_msg("ddk setlogicdispout done \n");
+ LEAVE(ret);
+}
+
+void hw_sm750_output_clear(struct lynxfb_output* output)
+{
+ ENTER();
+ LEAVE();
+}
+
+int hw_sm750_crtc_checkMode(struct lynxfb_crtc* crtc,struct fb_var_screeninfo* var)
+{
+ struct lynx_share * share;
+ ENTER();
+
+ share = container_of(crtc,struct lynxfb_par,crtc)->share;
+
+ switch (var->bits_per_pixel){
+ case 8:
+ case 16:
+ break;
+ case 32:
+ if(share->revid == (unsigned char)SM750LE_REVISION_ID){
+ dbg_msg("750le do not support 32bpp\n");
+ LEAVE (-EINVAL);
+ }
+ break;
+ default:
+ LEAVE(-EINVAL);
+
+ }
+
+ LEAVE(0);
+}
+
+
+/*
+ set the controller's mode for @crtc charged with @var and @fix parameters
+*/
+int hw_sm750_crtc_setMode(struct lynxfb_crtc* crtc,
+ struct fb_var_screeninfo* var,
+ struct fb_fix_screeninfo* fix)
+{
+ int ret,fmt;
+ u32 reg;
+ mode_parameter_t modparm;
+ clock_type_t clock;
+ struct lynx_share * share;
+ struct lynxfb_par * par;
+
+ ENTER();
+ ret = 0;
+ par = container_of(crtc,struct lynxfb_par,crtc);
+ share = par->share;
+#if 1
+ if(!share->accel_off){
+ /* set 2d engine pixel format according to mode bpp */
+ switch(var->bits_per_pixel){
+ case 8:
+ fmt = 0;
+ break;
+ case 16:
+ fmt = 1;
+ break;
+ case 32:
+ default:
+ fmt = 2;
+ break;
+ }
+ hw_set2dformat(&share->accel,fmt);
+ }
+#endif
+
+ /* set timing */
+// modparm.pixel_clock = PS_TO_HZ(var->pixclock);
+ modparm.pixel_clock = ps_to_hz(var->pixclock);
+ modparm.vertical_sync_polarity = (var->sync & FB_SYNC_HOR_HIGH_ACT) ? POS:NEG;
+ modparm.horizontal_sync_polarity = (var->sync & FB_SYNC_VERT_HIGH_ACT) ? POS:NEG;
+ modparm.clock_phase_polarity = (var->sync& FB_SYNC_COMP_HIGH_ACT) ? POS:NEG;
+ modparm.horizontal_display_end = var->xres;
+ modparm.horizontal_sync_width = var->hsync_len;
+ modparm.horizontal_sync_start = var->xres + var->right_margin;
+ modparm.horizontal_total = var->xres + var->left_margin + var->right_margin + var->hsync_len;
+ modparm.vertical_display_end = var->yres;
+ modparm.vertical_sync_height = var->vsync_len;
+ modparm.vertical_sync_start = var->yres + var->lower_margin;
+ modparm.vertical_total = var->yres + var->upper_margin + var->lower_margin + var->vsync_len;
+
+ /* choose pll */
+ if(crtc->channel != sm750_secondary)
+ clock = PRIMARY_PLL;
+ else
+ clock = SECONDARY_PLL;
+
+ dbg_msg("Request pixel clock = %lu\n",modparm.pixel_clock);
+ ret = ddk750_setModeTiming(&modparm,clock);
+ if(ret){
+ err_msg("Set mode timing failed\n");
+ goto exit;
+ }
+
+ if(crtc->channel != sm750_secondary){
+ /* set pitch, offset ,width,start address ,etc... */
+ POKE32(PANEL_FB_ADDRESS,
+ FIELD_SET(0,PANEL_FB_ADDRESS,STATUS,CURRENT)|
+ FIELD_SET(0,PANEL_FB_ADDRESS,EXT,LOCAL)|
+ FIELD_VALUE(0,PANEL_FB_ADDRESS,ADDRESS,crtc->oScreen));
+
+ reg = var->xres * (var->bits_per_pixel >> 3);
+ /* crtc->channel is not equal to par->index on numeric,be aware of that */
+ reg = PADDING(crtc->line_pad,reg);
+
+ POKE32(PANEL_FB_WIDTH,
+ FIELD_VALUE(0,PANEL_FB_WIDTH,WIDTH,reg)|
+ FIELD_VALUE(0,PANEL_FB_WIDTH,OFFSET,fix->line_length));
+
+ POKE32(PANEL_WINDOW_WIDTH,
+ FIELD_VALUE(0,PANEL_WINDOW_WIDTH,WIDTH,var->xres -1)|
+ FIELD_VALUE(0,PANEL_WINDOW_WIDTH,X,var->xoffset));
+
+ POKE32(PANEL_WINDOW_HEIGHT,
+ FIELD_VALUE(0,PANEL_WINDOW_HEIGHT,HEIGHT,var->yres_virtual - 1)|
+ FIELD_VALUE(0,PANEL_WINDOW_HEIGHT,Y,var->yoffset));
+
+ POKE32(PANEL_PLANE_TL,0);
+
+ POKE32(PANEL_PLANE_BR,
+ FIELD_VALUE(0,PANEL_PLANE_BR,BOTTOM,var->yres - 1)|
+ FIELD_VALUE(0,PANEL_PLANE_BR,RIGHT,var->xres - 1));
+
+ /* set pixel format */
+ reg = PEEK32(PANEL_DISPLAY_CTRL);
+ POKE32(PANEL_DISPLAY_CTRL,
+ FIELD_VALUE(reg,
+ PANEL_DISPLAY_CTRL,FORMAT,
+ (var->bits_per_pixel >> 4)
+ ));
+ }else{
+ /* not implemented now */
+ POKE32(CRT_FB_ADDRESS,crtc->oScreen);
+ reg = var->xres * (var->bits_per_pixel >> 3);
+ /* crtc->channel is not equal to par->index on numeric,be aware of that */
+ reg = PADDING(crtc->line_pad,reg);
+
+ POKE32(CRT_FB_WIDTH,
+ FIELD_VALUE(0,CRT_FB_WIDTH,WIDTH,reg)|
+ FIELD_VALUE(0,CRT_FB_WIDTH,OFFSET,fix->line_length));
+
+ /* SET PIXEL FORMAT */
+ reg = PEEK32(CRT_DISPLAY_CTRL);
+ reg = FIELD_VALUE(reg,CRT_DISPLAY_CTRL,FORMAT,var->bits_per_pixel >> 4);
+ POKE32(CRT_DISPLAY_CTRL,reg);
+
+ }
+
+
+exit:
+ LEAVE(ret);
+}
+
+void hw_sm750_crtc_clear(struct lynxfb_crtc* crtc)
+{
+ ENTER();
+ LEAVE();
+}
+
+int hw_sm750_setColReg(struct lynxfb_crtc* crtc,ushort index,
+ ushort red,ushort green,ushort blue)
+{
+ static unsigned int add[]={PANEL_PALETTE_RAM,CRT_PALETTE_RAM};
+ POKE32(add[crtc->channel] + index*4 ,(red<<16)|(green<<8)|blue);
+ return 0;
+}
+
+int hw_sm750le_setBLANK(struct lynxfb_output * output,int blank){
+ int dpms,crtdb;
+ ENTER();
+ switch(blank)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_UNBLANK:
+#else
+ case VESA_NO_BLANKING:
+#endif
+ dpms = CRT_DISPLAY_CTRL_DPMS_0;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_OFF;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_NORMAL:
+ dpms = CRT_DISPLAY_CTRL_DPMS_0;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_VSYNC_SUSPEND:
+#else
+ case VESA_VSYNC_SUSPEND:
+#endif
+ dpms = CRT_DISPLAY_CTRL_DPMS_2;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_HSYNC_SUSPEND:
+#else
+ case VESA_HSYNC_SUSPEND:
+#endif
+ dpms = CRT_DISPLAY_CTRL_DPMS_1;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_POWERDOWN:
+#else
+ case VESA_POWERDOWN:
+#endif
+ dpms = CRT_DISPLAY_CTRL_DPMS_3;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+ }
+
+ if(output->paths & sm750_crt){
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(PEEK32(CRT_DISPLAY_CTRL),CRT_DISPLAY_CTRL,DPMS,dpms));
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(PEEK32(CRT_DISPLAY_CTRL),CRT_DISPLAY_CTRL,BLANK,crtdb));
+ }
+ LEAVE(0);
+}
+
+int hw_sm750_setBLANK(struct lynxfb_output* output,int blank)
+{
+ unsigned int dpms,pps,crtdb;
+ ENTER();
+ dpms = pps = crtdb = 0;
+
+ switch (blank)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_UNBLANK:
+#else
+ case VESA_NO_BLANKING:
+#endif
+ inf_msg("flag = FB_BLANK_UNBLANK \n");
+ dpms = SYSTEM_CTRL_DPMS_VPHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_ENABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_OFF;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_NORMAL:
+ inf_msg("flag = FB_BLANK_NORMAL \n");
+ dpms = SYSTEM_CTRL_DPMS_VPHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_VSYNC_SUSPEND:
+#else
+ case VESA_VSYNC_SUSPEND:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VNHP;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_HSYNC_SUSPEND:
+#else
+ case VESA_HSYNC_SUSPEND:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VPHN;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
+ case FB_BLANK_POWERDOWN:
+#else
+ case VESA_POWERDOWN:
+#endif
+ dpms = SYSTEM_CTRL_DPMS_VNHN;
+ pps = PANEL_DISPLAY_CTRL_DATA_DISABLE;
+ crtdb = CRT_DISPLAY_CTRL_BLANK_ON;
+ break;
+ }
+
+ if(output->paths & sm750_crt){
+
+ POKE32(SYSTEM_CTRL,FIELD_VALUE(PEEK32(SYSTEM_CTRL),SYSTEM_CTRL,DPMS,dpms));
+ POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(PEEK32(CRT_DISPLAY_CTRL),CRT_DISPLAY_CTRL,BLANK,crtdb));
+ }
+
+ if(output->paths & sm750_panel){
+ POKE32(PANEL_DISPLAY_CTRL,FIELD_VALUE(PEEK32(PANEL_DISPLAY_CTRL),PANEL_DISPLAY_CTRL,DATA,pps));
+ }
+
+ LEAVE(0);
+}
+
+
+void hw_sm750_initAccel(struct lynx_share * share)
+{
+ u32 reg;
+ enable2DEngine(1);
+
+ if(getChipType() == SM750LE){
+ reg = PEEK32(DE_STATE1);
+ reg = FIELD_SET(reg,DE_STATE1,DE_ABORT,ON);
+ POKE32(DE_STATE1,reg);
+
+ reg = PEEK32(DE_STATE1);
+ reg = FIELD_SET(reg,DE_STATE1,DE_ABORT,OFF);
+ POKE32(DE_STATE1,reg);
+
+ }else{
+ /* engine reset */
+ reg = PEEK32(SYSTEM_CTRL);
+ reg = FIELD_SET(reg,SYSTEM_CTRL,DE_ABORT,ON);
+ POKE32(SYSTEM_CTRL,reg);
+
+ reg = PEEK32(SYSTEM_CTRL);
+ reg = FIELD_SET(reg,SYSTEM_CTRL,DE_ABORT,OFF);
+ POKE32(SYSTEM_CTRL,reg);
+ }
+
+ /* call 2d init */
+ share->accel.de_init(&share->accel);
+}
+
+int hw_sm750le_deWait()
+{
+ int i=0x10000000;
+ while(i--){
+ unsigned int dwVal = PEEK32(DE_STATE2);
+ if((FIELD_GET(dwVal,DE_STATE2,DE_STATUS) == DE_STATE2_DE_STATUS_IDLE) &&
+ (FIELD_GET(dwVal,DE_STATE2,DE_FIFO) == DE_STATE2_DE_FIFO_EMPTY) &&
+ (FIELD_GET(dwVal,DE_STATE2,DE_MEM_FIFO) == DE_STATE2_DE_MEM_FIFO_EMPTY))
+ {
+ return 0;
+ }
+ }
+ /* timeout error */
+ return -1;
+}
+
+
+int hw_sm750_deWait()
+{
+ int i=0x10000000;
+ while(i--){
+ unsigned int dwVal = PEEK32(SYSTEM_CTRL);
+ if((FIELD_GET(dwVal,SYSTEM_CTRL,DE_STATUS) == SYSTEM_CTRL_DE_STATUS_IDLE) &&
+ (FIELD_GET(dwVal,SYSTEM_CTRL,DE_FIFO) == SYSTEM_CTRL_DE_FIFO_EMPTY) &&
+ (FIELD_GET(dwVal,SYSTEM_CTRL,DE_MEM_FIFO) == SYSTEM_CTRL_DE_MEM_FIFO_EMPTY))
+ {
+ return 0;
+ }
+ }
+ /* timeout error */
+ return -1;
+}
+
+int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
+ const struct fb_var_screeninfo *var,
+ const struct fb_info *info)
+{
+ uint32_t total;
+ //check params
+ if ((var->xoffset + var->xres > var->xres_virtual) ||
+ (var->yoffset + var->yres > var->yres_virtual)) {
+ return -EINVAL;
+ }
+
+ total = var->yoffset * info->fix.line_length +
+ ((var->xoffset * var->bits_per_pixel) >> 3);
+ total += crtc->oScreen;
+ if (crtc->channel == sm750_primary) {
+ POKE32(PANEL_FB_ADDRESS,
+ FIELD_VALUE(PEEK32(PANEL_FB_ADDRESS),
+ PANEL_FB_ADDRESS, ADDRESS, total));
+ } else {
+ POKE32(CRT_FB_ADDRESS,
+ FIELD_VALUE(PEEK32(CRT_FB_ADDRESS),
+ CRT_FB_ADDRESS, ADDRESS, total));
+ }
+ return 0;
+}
+
diff --git a/drivers/video/lynxfb/lynx_hw750.h b/drivers/video/lynxfb/lynx_hw750.h
new file mode 100644
index 0000000..f415545
--- /dev/null
+++ b/drivers/video/lynxfb/lynx_hw750.h
@@ -0,0 +1,104 @@
+#ifndef LYNX_HW750_H__
+#define LYNX_HW750_H__
+
+
+#define DEFAULT_SM750_CHIP_CLOCK 290
+#define DEFAULT_SM750LE_CHIP_CLOCK 333
+#ifndef SM750LE_REVISION_ID
+#define SM750LE_REVISION_ID (unsigned char)0xfe
+#endif
+
+//#define DEFAULT_MEM_CLOCK (DEFAULT_SM750_CHIP_CLOCK/1)
+//#define DEFAULT_MASTER_CLOCK (DEFAULT_SM750_CHIP_CLOCK/3)
+
+
+enum sm750_pnltype{
+
+ sm750_24TFT = 0,/* 24bit tft */
+
+ sm750_dualTFT = 2,/* dual 18 bit tft */
+
+ sm750_doubleTFT = 1,/* 36 bit double pixel tft */
+};
+
+/* vga channel is not concerned */
+enum sm750_dataflow{
+ sm750_simul_pri,/* primary => all head */
+
+ sm750_simul_sec,/* secondary => all head */
+
+ sm750_dual_normal,/* primary => panel head and secondary => crt */
+
+ sm750_dual_swap,/* primary => crt head and secondary => panel */
+};
+
+
+enum sm750_channel{
+ sm750_primary = 0,
+ /* enum value equal to the register filed data */
+ sm750_secondary = 1,
+};
+
+enum sm750_path{
+ sm750_panel = 1,
+ sm750_crt = 2,
+ sm750_pnc = 3,/* panel and crt */
+};
+
+struct init_status{
+ ushort powerMode;
+ /* below three clocks are in unit of MHZ*/
+ ushort chip_clk;
+ ushort mem_clk;
+ ushort master_clk;
+ ushort setAllEngOff;
+ ushort resetMemory;
+};
+
+struct sm750_state{
+ struct init_status initParm;
+ enum sm750_pnltype pnltype;
+ enum sm750_dataflow dataflow;
+ int nocrt;
+ int xLCD;
+ int yLCD;
+};
+
+/* sm750_share stands for a presentation of two frame buffer
+ that use one sm750 adaptor, it is similiar to the super class of lynx_share
+ in C++
+*/
+
+struct sm750_share{
+ /* it's better to put lynx_share struct to the first place of sm750_share */
+ struct lynx_share share;
+ struct sm750_state state;
+ int hwCursor;
+ /* 0: no hardware cursor
+ 1: primary crtc hw cursor enabled,
+ 2: secondary crtc hw cursor enabled
+ 3: both ctrc hw cursor enabled
+ */
+};
+
+int hw_sm750_map(struct lynx_share* share,struct pci_dev* pdev);
+int hw_sm750_inithw(struct lynx_share*,struct pci_dev *);
+void hw_sm750_initAccel(struct lynx_share *);
+int hw_sm750_deWait(void);
+int hw_sm750le_deWait(void);
+
+resource_size_t hw_sm750_getVMSize(struct lynx_share *);
+int hw_sm750_output_checkMode(struct lynxfb_output*,struct fb_var_screeninfo*);
+int hw_sm750_output_setMode(struct lynxfb_output*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm750_crtc_checkMode(struct lynxfb_crtc*,struct fb_var_screeninfo*);
+int hw_sm750_crtc_setMode(struct lynxfb_crtc*,struct fb_var_screeninfo*,struct fb_fix_screeninfo*);
+int hw_sm750_setColReg(struct lynxfb_crtc*,ushort,ushort,ushort,ushort);
+int hw_sm750_setBLANK(struct lynxfb_output*,int);
+int hw_sm750le_setBLANK(struct lynxfb_output*,int);
+void hw_sm750_crtc_clear(struct lynxfb_crtc*);
+void hw_sm750_output_clear(struct lynxfb_output*);
+int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
+ const struct fb_var_screeninfo *var,
+ const struct fb_info *info);
+
+#endif
diff --git a/drivers/video/lynxfb/modedb.c b/drivers/video/lynxfb/modedb.c
new file mode 100644
index 0000000..ee697aa
--- /dev/null
+++ b/drivers/video/lynxfb/modedb.c
@@ -0,0 +1,221 @@
+
+static const struct fb_videomode modedb2[] = {
+ {
+ /* 640x400 @ 70 Hz, 31.5 kHz hsync */
+ NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 640x480 @ 60 Hz, 31.5 kHz hsync */
+ NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 800x600 @ 56 Hz, 35.15 kHz hsync */
+ NULL, 56, 800, 600, 27777, 128, 24, 22, 1, 72, 2,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync */
+ NULL, 87, 1024, 768, 22271, 56, 24, 33, 8, 160, 8,
+ 0, FB_VMODE_INTERLACED
+ }, {
+ /* 640x400 @ 85 Hz, 37.86 kHz hsync */
+ NULL, 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3,
+ FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 640x480 @ 72 Hz, 36.5 kHz hsync */
+ NULL, 72, 640, 480, 31746, 144, 40, 30, 8, 40, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 640x480 @ 75 Hz, 37.50 kHz hsync */
+ NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 800x600 @ 60 Hz, 37.8 kHz hsync */
+ NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 640x480 @ 85 Hz, 43.27 kHz hsync */
+ NULL, 85, 640, 480, 27777, 80, 56, 25, 1, 56, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 89 Hz interlaced, 44 kHz hsync */
+ NULL, 69, 1152, 864, 15384, 96, 16, 110, 1, 216, 10,
+ 0, FB_VMODE_INTERLACED
+ }, {
+ /* 800x600 @ 72 Hz, 48.0 kHz hsync */
+ NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 60 Hz, 48.4 kHz hsync */
+ NULL, 60, 1024, 768, 15384, 168, 8, 29, 3, 144, 6,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 640x480 @ 100 Hz, 53.01 kHz hsync */
+ NULL, 100, 640, 480, 21834, 96, 32, 36, 8, 96, 6,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 60 Hz, 53.5 kHz hsync */
+ NULL, 60, 1152, 864, 11123, 208, 64, 16, 4, 256, 8,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 800x600 @ 85 Hz, 55.84 kHz hsync */
+ NULL, 85, 800, 600, 16460, 160, 64, 36, 16, 64, 5,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 70 Hz, 56.5 kHz hsync */
+ NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x960-60 VESA */
+ NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA
+ }, {
+ /* 1280x1024-60 VESA */
+ NULL, 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3,
+ FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA
+ }, {
+ /* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
+ NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12,
+ 0, FB_VMODE_INTERLACED
+ }, {
+ /* 800x600 @ 100 Hz, 64.02 kHz hsync */
+ NULL, 100, 800, 600, 14357, 160, 64, 30, 4, 64, 6,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 76 Hz, 62.5 kHz hsync */
+ NULL, 76, 1024, 768, 11764, 208, 8, 36, 16, 120, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 70 Hz, 62.4 kHz hsync */
+ NULL, 70, 1152, 864, 10869, 106, 56, 20, 1, 160, 10,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 61 Hz, 64.2 kHz hsync */
+ NULL, 61, 1280, 1024, 9090, 200, 48, 26, 1, 184, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1400x1050 @ 60Hz, 63.9 kHz hsync */
+ NULL, 68, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1400x1050 @ 75,107 Hz, 82,392 kHz +hsync +vsync*/
+ NULL, 75, 1400, 1050, 9271, 120, 56, 13, 0, 112, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1400x1050 @ 60 Hz, ? kHz +hsync +vsync*/
+ NULL, 60, 1400, 1050, 9259, 128, 40, 12, 0, 112, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 85 Hz, 70.24 kHz hsync */
+ NULL, 85, 1024, 768, 10111, 192, 32, 34, 14, 160, 6,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 78 Hz, 70.8 kHz hsync */
+ NULL, 78, 1152, 864, 9090, 228, 88, 32, 0, 84, 12,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 70 Hz, 74.59 kHz hsync */
+ NULL, 70, 1280, 1024, 7905, 224, 32, 28, 8, 160, 8,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1600x1200 @ 60Hz, 75.00 kHz hsync */
+ NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 84 Hz, 76.0 kHz hsync */
+ NULL, 84, 1152, 864, 7407, 184, 312, 32, 0, 128, 12,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 74 Hz, 78.85 kHz hsync */
+ NULL, 74, 1280, 1024, 7407, 256, 32, 34, 3, 144, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1024x768 @ 100Hz, 80.21 kHz hsync */
+ NULL, 100, 1024, 768, 8658, 192, 32, 21, 3, 192, 10,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 76 Hz, 81.13 kHz hsync */
+ NULL, 76, 1280, 1024, 7407, 248, 32, 34, 3, 104, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1600x1200 @ 70 Hz, 87.50 kHz hsync */
+ NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1152x864 @ 100 Hz, 89.62 kHz hsync */
+ NULL, 100, 1152, 864, 7264, 224, 32, 17, 2, 128, 19,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 85 Hz, 91.15 kHz hsync */
+ NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1600x1200 @ 75 Hz, 93.75 kHz hsync */
+ NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1600x1200 @ 85 Hz, 105.77 kHz hsync */
+ NULL, 85, 1600, 1200, 4545, 272, 16, 37, 4, 192, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1280x1024 @ 100 Hz, 107.16 kHz hsync */
+ NULL, 100, 1280, 1024, 5502, 256, 32, 26, 7, 128, 15,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1800x1440 @ 64Hz, 96.15 kHz hsync */
+ NULL, 64, 1800, 1440, 4347, 304, 96, 46, 1, 192, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 1800x1440 @ 70Hz, 104.52 kHz hsync */
+ NULL, 70, 1800, 1440, 4000, 304, 96, 46, 1, 192, 3,
+ FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+ }, {
+ /* 512x384 @ 78 Hz, 31.50 kHz hsync */
+ NULL, 78, 512, 384, 49603, 48, 16, 16, 1, 64, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 512x384 @ 85 Hz, 34.38 kHz hsync */
+ NULL, 85, 512, 384, 45454, 48, 16, 16, 1, 64, 3,
+ 0, FB_VMODE_NONINTERLACED
+ }, {
+ /* 320x200 @ 70 Hz, 31.5 kHz hsync, 8:5 aspect ratio */
+ NULL, 70, 320, 200, 79440, 16, 16, 20, 4, 48, 1,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio */
+ NULL, 60, 320, 240, 79440, 16, 16, 16, 5, 48, 1,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 320x240 @ 72 Hz, 36.5 kHz hsync */
+ NULL, 72, 320, 240, 63492, 16, 16, 16, 4, 48, 2,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 400x300 @ 56 Hz, 35.2 kHz hsync, 4:3 aspect ratio */
+ NULL, 56, 400, 300, 55555, 64, 16, 10, 1, 32, 1,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 400x300 @ 60 Hz, 37.8 kHz hsync */
+ NULL, 60, 400, 300, 50000, 48, 16, 11, 1, 64, 2,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 400x300 @ 72 Hz, 48.0 kHz hsync */
+ NULL, 72, 400, 300, 40000, 32, 24, 11, 19, 64, 3,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 480x300 @ 56 Hz, 35.2 kHz hsync, 8:5 aspect ratio */
+ NULL, 56, 480, 300, 46176, 80, 16, 10, 1, 40, 1,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 480x300 @ 60 Hz, 37.8 kHz hsync */
+ NULL, 60, 480, 300, 41858, 56, 16, 11, 1, 80, 2,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 480x300 @ 63 Hz, 39.6 kHz hsync */
+ NULL, 63, 480, 300, 40000, 56, 16, 11, 1, 80, 2,
+ 0, FB_VMODE_DOUBLE
+ }, {
+ /* 480x300 @ 72 Hz, 48.0 kHz hsync */
+ NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3,
+ 0, FB_VMODE_DOUBLE
+ },
+};
+static const int nmodedb2 = sizeof(modedb2);
diff --git a/drivers/video/lynxfb/readme b/drivers/video/lynxfb/readme
new file mode 100644
index 0000000..206fa70
--- /dev/null
+++ b/drivers/video/lynxfb/readme
@@ -0,0 +1,97 @@
+--+=================================================================+--
+ Kernel Driver Manul Spec
+ updated at 10/28/2011 by monk.liu
+--+=================================================================+--
+1,How to build the kernel with driver source code
+ assume you have a kernel source folder named "linux-2.6.30"
+ and the driver folder named "electra". below are the steps:
+
+ 1.type "cp ./electra linux-2.6.30/driver/video/lynxfb -r" to
+ copy driver souce code beneath kernel folder.
+
+ Notes: for not picking up the wrong driver folder, be aware that
+ the files under folder electra should contains
+ "lynx_drv.c","lynx_hw750.c","ddk750","ddk712",etc...
+
+ 2.add below section into linux-2.6.30/driver/video/Kconfig
+ ( recommend to add to tail of "FB_INTEL_I2C" section):
+
+#**********************************************************************
+config FB_LYNXFB
+ tristate "SMI lynx sm750/718/712/722/502 display support"
+ depends on FB && PCI
+ select FB_CFB_IMAGEBLIT
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+ ---help---
+ This driver supports graphic board with the siliconmotion
+ sm750/sm718/sm712/sm722/sm502. Say Y if you have such a
+ graphic board.
+ To compile this driver as a module, choose M here: the
+ module will be called lynxfb.
+
+#***********************************************************************
+
+
+ 3.add below line into linux-2.6.30/driver/video/Makefile :
+ obj-$(CONFIG_FB_LYNXFB) += lynxfb/
+
+2,How to build the driver without kernel source code (we prefer this
+ method)
+
+ assume you have the electra source folder,just goto that folder
+ and type "make" will get you the kernel module named "lynxfb.ko"
+ driver will be built according to the kernel version you are cu-
+ rrently running. use modinfo ./lynxfb.ko to check it.
+
+ *NOTE*:
+ If you are running a v2.6.32 linux and you also got v2.6.38 header
+ files under "/lib/modules/2.6.38/build" folder.
+ You can type "make kernel=2.6.38" to build the driver based on
+ the specific "2.6.38" version kernel (instead of previous method,
+ which will always build the driver based on the kernel version
+ you are running).
+
+3,About the parameter of make:
+ "make debug=2" will output all debug information to tty
+ "make debug=1" wil output all debug information to dmesg
+ "make" outputs any debug information to neither tty nor dmesg
+
+4,About the kernel module paramter of driver
+ For lynxfb kernel modulem, the paramters are all wrapped with
+ a string passed to the lynxfb.ko, for example:
+
+ 4.1)Use 1280,8bpp index color and 60 hz mode:
+ insmod ./lynxfb.ko g_option="1280x1024-8@60"
+
+ 4.2)Disable MTRR,Disable 2d acceleration,Disable hardware cursor,
+ and use a 800x600 mode :
+ insmod ./lynxfb.ko g_option="noaccel:nomtrr:nohwc:800x600"
+
+ 4.3)dual frame buffer for driver with "dual" parameter
+ insmod ./lynxfb.ko g_option="dual,800x600:1024x768"
+ it will create fb0 and fb1 (or fb1,fb2 if fb0 already exist) under /dev
+ and user can use con2fb to link fbX and ttyX
+
+
+ Notes:
+ 1)If you build the driver with built-in method, the paramter
+ you edited in the grub config file will be also the
+ same format as above modular method,but additionaly add
+ "video=lynxfb:"
+ ahead of parameters,so,it looks like:
+ video=lynxfb:noaccel,1280x1024@60,otherparam,etc...
+ it equal to modular method with below command:
+ insmod ./lynxfb.ko g_option="noaccel:1280x1024@60:otherparm:etc..."
+e.g.:
+linux /vmlinuz-2.6.30 root=uuid=xxx video=lynxfb:noaccel:1024x768-32@60
+
+
+ Notes#2:if you put 800x600 into the paramter without bpp and
+ refresh rate, kernel driver will defaulty use 16bpp and 60hz
+
+ Notes#3:hardware cursor has been closed by default for SM712/SM722.
+ User can enable it by use option "usehwc".
+5,The specific driver parameter depends on chip will be explained in furture.
+
+
diff --git a/drivers/video/lynxfb/ver.h b/drivers/video/lynxfb/ver.h
new file mode 100644
index 0000000..dddb16a
--- /dev/null
+++ b/drivers/video/lynxfb/ver.h
@@ -0,0 +1,20 @@
+#ifndef __VER_H_
+#define __VER_H_
+
+#define RELEASE_TYPE "Electra(formal release)"
+#define SUPPORT_ARCH "x86,x86_64"
+#define SUPPORT_CHIP "lynx Express(750)/lynx 750LE/Lynx SE(718)/Lynx EM(712)/lynx 3DM(720/722) voyager(502/107)"
+//#define SUPPORT_CHIP " \
+\tlynx 750LE\n"
+
+#define SUPPORT_OS " \
+\tRHEL 4.3 i386 and x86_64\n \
+\tRHEL 5.3 i386 and x86_64\n \
+\tRHEL 6.0 i386 and x86_64\n \
+\tSLES 9 i386 and x86_64\n \
+\tSLES 10 i386 and x86_64\n \
+\tSLES 11 i386 and x86_64\n"
+#define _version_ "4.1.3"
+
+#endif
+
diff --git a/drivers/video/lynxfb/voyager.h b/drivers/video/lynxfb/voyager.h
new file mode 100644
index 0000000..75da447
--- /dev/null
+++ b/drivers/video/lynxfb/voyager.h
@@ -0,0 +1,3625 @@
+/* sm50x_reg.h
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 or later as
+ * published by the Free Software Foundation.
+ * Silicon Motion SM50x/SM107 register definitions
+*/
+
+#ifndef VOYAGER_H__
+#define VOYAGER_H__
+
+/* common registers for panel and the crt */
+#define VOYAGER_OFF_DC_H_TOT (0x000)
+#define VOYAGER_OFF_DC_V_TOT (0x008)
+#define VOYAGER_OFF_DC_H_SYNC (0x004)
+#define VOYAGER_OFF_DC_V_SYNC (0x00C)
+
+
+#define VOYAGER_HWC_EN (1<<31)
+
+#define VOYAGER_OFF_HWC_ADDR (0x00)
+#define VOYAGER_OFF_HWC_LOC (0x04)
+#define VOYAGER_OFF_HWC_COLOR_1_2 (0x08)
+#define VOYAGER_OFF_HWC_COLOR_3 (0x0C)
+
+
+/*****************************************************************************\
+ * SYSTEM CONFIGURATION *
+\*****************************************************************************/
+#define SYSTEM_CTRL 0x000000
+#define SYSTEM_CTRL_DPMS 31:30
+#define SYSTEM_CTRL_DPMS_VPHP 0
+#define SYSTEM_CTRL_DPMS_VPHN 1
+#define SYSTEM_CTRL_DPMS_VNHP 2
+#define SYSTEM_CTRL_DPMS_VNHN 3
+#define SYSTEM_CTRL_PCI_BURST 29:29
+#define SYSTEM_CTRL_PCI_BURST_DISABLE 0
+#define SYSTEM_CTRL_PCI_BURST_ENABLE 1
+#define SYSTEM_CTRL_CSC_STATUS 28:28
+#define SYSTEM_CTRL_CSC_STATUS_IDLE 0
+#define SYSTEM_CTRL_CSC_STATUS_BUSY 1
+#define SYSTEM_CTRL_PCI_MASTER 25:25
+#define SYSTEM_CTRL_PCI_MASTER_STOP 0
+#define SYSTEM_CTRL_PCI_MASTER_START 1
+#define SYSTEM_CTRL_LATENCY_TIMER 24:24
+#define SYSTEM_CTRL_LATENCY_TIMER_ENABLE 0
+#define SYSTEM_CTRL_LATENCY_TIMER_DISABLE 1
+#define SYSTEM_CTRL_PANEL_STATUS 23:23
+#define SYSTEM_CTRL_PANEL_STATUS_CURRENT 0
+#define SYSTEM_CTRL_PANEL_STATUS_PENDING 1
+#define SYSTEM_CTRL_VIDEO_STATUS 22:22
+#define SYSTEM_CTRL_VIDEO_STATUS_CURRENT 0
+#define SYSTEM_CTRL_VIDEO_STATUS_PENDING 1
+#define SYSTEM_CTRL_DE_FIFO 20:20
+#define SYSTEM_CTRL_DE_FIFO_NOT_EMPTY 0
+#define SYSTEM_CTRL_DE_FIFO_EMPTY 1
+#define SYSTEM_CTRL_DE_STATUS 19:19
+#define SYSTEM_CTRL_DE_STATUS_IDLE 0
+#define SYSTEM_CTRL_DE_STATUS_BUSY 1
+#define SYSTEM_CTRL_CRT_STATUS 17:17
+#define SYSTEM_CTRL_CRT_STATUS_CURRENT 0
+#define SYSTEM_CTRL_CRT_STATUS_PENDING 1
+#define SYSTEM_CTRL_ZVPORT 16:16
+#define SYSTEM_CTRL_ZVPORT_0 0
+#define SYSTEM_CTRL_ZVPORT_1 1
+#define SYSTEM_CTRL_PCI_BURST_READ 15:15
+#define SYSTEM_CTRL_PCI_BURST_READ_DISABLE 0
+#define SYSTEM_CTRL_PCI_BURST_READ_ENABLE 1
+#define SYSTEM_CTRL_DE_ABORT 13:12
+#define SYSTEM_CTRL_DE_ABORT_NORMAL 0
+#define SYSTEM_CTRL_DE_ABORT_2D_ABORT 3
+#define SYSTEM_CTRL_PCI_SUBSYS_LOCK 11:11
+#define SYSTEM_CTRL_PCI_SUBSYS_LOCK_DISABLE 0
+#define SYSTEM_CTRL_PCI_SUBSYS_LOCK_ENABLE 1
+#define SYSTEM_CTRL_PCI_RETRY 7:7
+#define SYSTEM_CTRL_PCI_RETRY_ENABLE 0
+#define SYSTEM_CTRL_PCI_RETRY_DISABLE 1
+#define SYSTEM_CTRL_PCI_CLOCK_RUN 6:6
+#define SYSTEM_CTRL_PCI_CLOCK_RUN_DISABLE 0
+#define SYSTEM_CTRL_PCI_CLOCK_RUN_ENABLE 1
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE 5:4
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_1 0
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_2 1
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_4 2
+#define SYSTEM_CTRL_PCI_SLAVE_BURST_READ_SIZE_8 3
+#define SYSTEM_CTRL_CRT_TRISTATE 2:2
+#define SYSTEM_CTRL_CRT_TRISTATE_DISABLE 0
+#define SYSTEM_CTRL_CRT_TRISTATE_ENABLE 1
+#define SYSTEM_CTRL_INTMEM_TRISTATE 1:1
+#define SYSTEM_CTRL_INTMEM_TRISTATE_DISABLE 0
+#define SYSTEM_CTRL_INTMEM_TRISTATE_ENABLE 1
+#define SYSTEM_CTRL_PANEL_TRISTATE 0:0
+#define SYSTEM_CTRL_PANEL_TRISTATE_DISABLE 0
+#define SYSTEM_CTRL_PANEL_TRISTATE_ENABLE 1
+
+#define MISC_CTRL 0x000004
+#define MISC_CTRL_PCI_PAD 31:30
+#define MISC_CTRL_PCI_PAD_24MA 0
+#define MISC_CTRL_PCI_PAD_12MA 1
+#define MISC_CTRL_PCI_PAD_8MA 2
+#define MISC_CTRL_48_SELECT 29:28
+#define MISC_CTRL_48_SELECT_CRYSTAL 0
+#define MISC_CTRL_48_SELECT_CPU_96 2
+#define MISC_CTRL_48_SELECT_CPU_48 3
+#define MISC_CTRL_UART1_SELECT 27:27
+#define MISC_CTRL_UART1_SELECT_UART 0
+#define MISC_CTRL_UART1_SELECT_SSP 1
+#define MISC_CTRL_8051_LATCH 26:26
+#define MISC_CTRL_8051_LATCH_DISABLE 0
+#define MISC_CTRL_8051_LATCH_ENABLE 1
+#define MISC_CTRL_FPDATA 25:25
+#define MISC_CTRL_FPDATA_18 0
+#define MISC_CTRL_FPDATA_24 1
+#define MISC_CTRL_CRYSTAL 24:24
+#define MISC_CTRL_CRYSTAL_24 0
+#define MISC_CTRL_CRYSTAL_12 1
+#define MISC_CTRL_DRAM_REFRESH 22:21
+#define MISC_CTRL_DRAM_REFRESH_8 0
+#define MISC_CTRL_DRAM_REFRESH_16 1
+#define MISC_CTRL_DRAM_REFRESH_32 2
+#define MISC_CTRL_DRAM_REFRESH_64 3
+#define MISC_CTRL_BUS_HOLD 20:18
+#define MISC_CTRL_BUS_HOLD_FIFO_EMPTY 0
+#define MISC_CTRL_BUS_HOLD_8 1
+#define MISC_CTRL_BUS_HOLD_16 2
+#define MISC_CTRL_BUS_HOLD_24 3
+#define MISC_CTRL_BUS_HOLD_32 4
+#define MISC_CTRL_HITACHI_READY 17:17
+#define MISC_CTRL_HITACHI_READY_NEGATIVE 0
+#define MISC_CTRL_HITACHI_READY_POSITIVE 1
+#define MISC_CTRL_INTERRUPT 16:16
+#define MISC_CTRL_INTERRUPT_NORMAL 0
+#define MISC_CTRL_INTERRUPT_INVERT 1
+#define MISC_CTRL_PLL_CLOCK_COUNT 15:15
+#define MISC_CTRL_PLL_CLOCK_COUNT_DISABLE 0
+#define MISC_CTRL_PLL_CLOCK_COUNT_ENABLE 1
+#define MISC_CTRL_DAC_BAND_GAP 14:13
+#define MISC_CTRL_DAC_POWER 12:12
+#define MISC_CTRL_DAC_POWER_ENABLE 0
+#define MISC_CTRL_DAC_POWER_DISABLE 1
+#define MISC_CTRL_USB_SLAVE_CONTROLLER 11:11
+#define MISC_CTRL_USB_SLAVE_CONTROLLER_CPU 0
+#define MISC_CTRL_USB_SLAVE_CONTROLLER_8051 1
+#define MISC_CTRL_BURST_LENGTH 10:10
+#define MISC_CTRL_BURST_LENGTH_8 0
+#define MISC_CTRL_BURST_LENGTH_1 1
+#define MISC_CTRL_USB_SELECT 9:9
+#define MISC_CTRL_USB_SELECT_MASTER 0
+#define MISC_CTRL_USB_SELECT_SLAVE 1
+#define MISC_CTRL_LOOPBACK 8:8
+#define MISC_CTRL_LOOPBACK_NORMAL 0
+#define MISC_CTRL_LOOPBACK_USB_HOST 1
+#define MISC_CTRL_CLOCK_DIVIDER_RESET 7:7
+#define MISC_CTRL_CLOCK_DIVIDER_RESET_ENABLE 0
+#define MISC_CTRL_CLOCK_DIVIDER_RESET_DISABLE 1
+#define MISC_CTRL_TEST_MODE 6:5
+#define MISC_CTRL_TEST_MODE_NORMAL 0
+#define MISC_CTRL_TEST_MODE_DEBUGGING 1
+#define MISC_CTRL_TEST_MODE_NAND 2
+#define MISC_CTRL_TEST_MODE_MEMORY 3
+#define MISC_CTRL_NEC_MMIO 4:4
+#define MISC_CTRL_NEC_MMIO_30 0
+#define MISC_CTRL_NEC_MMIO_62 1
+#define MISC_CTRL_CLOCK 3:3
+#define MISC_CTRL_CLOCK_PLL 0
+#define MISC_CTRL_CLOCK_TEST 1
+#define MISC_CTRL_HOST_BUS 2:0
+#define MISC_CTRL_HOST_BUS_HITACHI 0
+#define MISC_CTRL_HOST_BUS_PCI 1
+#define MISC_CTRL_HOST_BUS_XSCALE 2
+#define MISC_CTRL_HOST_BUS_STRONGARM 4
+#define MISC_CTRL_HOST_BUS_NEC 6
+
+#define GPIO_MUX_LOW 0x000008
+#define GPIO_MUX_LOW_31 31:31
+#define GPIO_MUX_LOW_31_GPIO 0
+#define GPIO_MUX_LOW_31_PWM 1
+#define GPIO_MUX_LOW_30 30:30
+#define GPIO_MUX_LOW_30_GPIO 0
+#define GPIO_MUX_LOW_30_PWM 1
+#define GPIO_MUX_LOW_29 29:29
+#define GPIO_MUX_LOW_29_GPIO 0
+#define GPIO_MUX_LOW_29_PWM 1
+#define GPIO_MUX_LOW_28 28:28
+#define GPIO_MUX_LOW_28_GPIO 0
+#define GPIO_MUX_LOW_28_AC97_I2S 1
+#define GPIO_MUX_LOW_27 27:27
+#define GPIO_MUX_LOW_27_GPIO 0
+#define GPIO_MUX_LOW_27_AC97_I2S 1
+#define GPIO_MUX_LOW_26 26:26
+#define GPIO_MUX_LOW_26_GPIO 0
+#define GPIO_MUX_LOW_26_AC97_I2S 1
+#define GPIO_MUX_LOW_25 25:25
+#define GPIO_MUX_LOW_25_GPIO 0
+#define GPIO_MUX_LOW_25_AC97_I2S 1
+#define GPIO_MUX_LOW_24 24:24
+#define GPIO_MUX_LOW_24_GPIO 0
+#define GPIO_MUX_LOW_24_AC97 1
+#define GPIO_MUX_LOW_23 23:23
+#define GPIO_MUX_LOW_23_GPIO 0
+#define GPIO_MUX_LOW_23_ZVPORT 1
+#define GPIO_MUX_LOW_22 22:22
+#define GPIO_MUX_LOW_22_GPIO 0
+#define GPIO_MUX_LOW_22_ZVPORT 1
+#define GPIO_MUX_LOW_21 21:21
+#define GPIO_MUX_LOW_21_GPIO 0
+#define GPIO_MUX_LOW_21_ZVPORT 1
+#define GPIO_MUX_LOW_20 20:20
+#define GPIO_MUX_LOW_20_GPIO 0
+#define GPIO_MUX_LOW_20_ZVPORT 1
+#define GPIO_MUX_LOW_19 19:19
+#define GPIO_MUX_LOW_19_GPIO 0
+#define GPIO_MUX_LOW_19_ZVPORT 1
+#define GPIO_MUX_LOW_18 18:18
+#define GPIO_MUX_LOW_18_GPIO 0
+#define GPIO_MUX_LOW_18_ZVPORT 1
+#define GPIO_MUX_LOW_17 17:17
+#define GPIO_MUX_LOW_17_GPIO 0
+#define GPIO_MUX_LOW_17_ZVPORT 1
+#define GPIO_MUX_LOW_16 16:16
+#define GPIO_MUX_LOW_16_GPIO 0
+#define GPIO_MUX_LOW_16_ZVPORT 1
+#define GPIO_MUX_LOW_15 15:15
+#define GPIO_MUX_LOW_15_GPIO 0
+#define GPIO_MUX_LOW_15_8051 1
+#define GPIO_MUX_LOW_14 14:14
+#define GPIO_MUX_LOW_14_GPIO 0
+#define GPIO_MUX_LOW_14_8051 1
+#define GPIO_MUX_LOW_13 13:13
+#define GPIO_MUX_LOW_13_GPIO 0
+#define GPIO_MUX_LOW_13_8051 1
+#define GPIO_MUX_LOW_12 12:12
+#define GPIO_MUX_LOW_12_GPIO 0
+#define GPIO_MUX_LOW_12_8051 1
+#define GPIO_MUX_LOW_11 11:11
+#define GPIO_MUX_LOW_11_GPIO 0
+#define GPIO_MUX_LOW_11_8051 1
+#define GPIO_MUX_LOW_10 10:10
+#define GPIO_MUX_LOW_10_GPIO 0
+#define GPIO_MUX_LOW_10_8051 1
+#define GPIO_MUX_LOW_9 9:9
+#define GPIO_MUX_LOW_9_GPIO 0
+#define GPIO_MUX_LOW_9_8051 1
+#define GPIO_MUX_LOW_8 8:8
+#define GPIO_MUX_LOW_8_GPIO 0
+#define GPIO_MUX_LOW_8_8051 1
+#define GPIO_MUX_LOW_7 7:7
+#define GPIO_MUX_LOW_7_GPIO 0
+#define GPIO_MUX_LOW_7_8051 1
+#define GPIO_MUX_LOW_6 6:6
+#define GPIO_MUX_LOW_6_GPIO 0
+#define GPIO_MUX_LOW_6_8051 1
+#define GPIO_MUX_LOW_5 5:5
+#define GPIO_MUX_LOW_5_GPIO 0
+#define GPIO_MUX_LOW_5_8051 1
+#define GPIO_MUX_LOW_4 4:4
+#define GPIO_MUX_LOW_4_GPIO 0
+#define GPIO_MUX_LOW_4_8051 1
+#define GPIO_MUX_LOW_3 3:3
+#define GPIO_MUX_LOW_3_GPIO 0
+#define GPIO_MUX_LOW_3_8051 1
+#define GPIO_MUX_LOW_2 2:2
+#define GPIO_MUX_LOW_2_GPIO 0
+#define GPIO_MUX_LOW_2_8051 1
+#define GPIO_MUX_LOW_1 1:1
+#define GPIO_MUX_LOW_1_GPIO 0
+#define GPIO_MUX_LOW_1_8051 1
+#define GPIO_MUX_LOW_0 0:0
+#define GPIO_MUX_LOW_0_GPIO 0
+#define GPIO_MUX_LOW_0_8051 1
+
+#define GPIO_MUX_HIGH 0x00000C
+#define GPIO_MUX_HIGH_63 31:31
+#define GPIO_MUX_HIGH_63_GPIO 0
+#define GPIO_MUX_HIGH_63_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_62 30:30
+#define GPIO_MUX_HIGH_62_GPIO 0
+#define GPIO_MUX_HIGH_62_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_61 29:29
+#define GPIO_MUX_HIGH_61_GPIO 0
+#define GPIO_MUX_HIGH_61_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_60 28:28
+#define GPIO_MUX_HIGH_60_GPIO 0
+#define GPIO_MUX_HIGH_60_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_59 27:27
+#define GPIO_MUX_HIGH_59_GPIO 0
+#define GPIO_MUX_HIGH_59_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_58 26:26
+#define GPIO_MUX_HIGH_58_GPIO 0
+#define GPIO_MUX_HIGH_58_CRT_ZVPORT_FPDATA 1
+#define GPIO_MUX_HIGH_57 25:25
+#define GPIO_MUX_HIGH_57_GPIO 0
+#define GPIO_MUX_HIGH_57_CRT_ZVPORT 1
+#define GPIO_MUX_HIGH_56 24:24
+#define GPIO_MUX_HIGH_56_GPIO 0
+#define GPIO_MUX_HIGH_56_CRT_ZVPORT 1
+#define GPIO_MUX_HIGH_55 23:23
+#define GPIO_MUX_HIGH_55_GPIO 0
+#define GPIO_MUX_HIGH_55_CRT 1
+#define GPIO_MUX_HIGH_47 15:15
+#define GPIO_MUX_HIGH_47_GPIO 0
+#define GPIO_MUX_HIGH_47_I2C 1
+#define GPIO_MUX_HIGH_46 14:14
+#define GPIO_MUX_HIGH_46_GPIO 0
+#define GPIO_MUX_HIGH_46_I2C 1
+#define GPIO_MUX_HIGH_45 13:13
+#define GPIO_MUX_HIGH_45_GPIO 0
+#define GPIO_MUX_HIGH_45_SSP1 1
+#define GPIO_MUX_HIGH_44 12:12
+#define GPIO_MUX_HIGH_44_GPIO 0
+#define GPIO_MUX_HIGH_44_UART1_SSP1 1
+#define GPIO_MUX_HIGH_43 11:11
+#define GPIO_MUX_HIGH_43_GPIO 0
+#define GPIO_MUX_HIGH_43_UART1_SSP1 1
+#define GPIO_MUX_HIGH_42 10:10
+#define GPIO_MUX_HIGH_42_GPIO 0
+#define GPIO_MUX_HIGH_42_UART1_SSP1 1
+#define GPIO_MUX_HIGH_41 9:9
+#define GPIO_MUX_HIGH_41_GPIO 0
+#define GPIO_MUX_HIGH_41_UART1_SSP1 1
+#define GPIO_MUX_HIGH_40 8:8
+#define GPIO_MUX_HIGH_40_GPIO 0
+#define GPIO_MUX_HIGH_40_UART0 1
+#define GPIO_MUX_HIGH_39 7:7
+#define GPIO_MUX_HIGH_39_GPIO 0
+#define GPIO_MUX_HIGH_39_UART0 1
+#define GPIO_MUX_HIGH_38 6:6
+#define GPIO_MUX_HIGH_38_GPIO 0
+#define GPIO_MUX_HIGH_38_UART0 1
+#define GPIO_MUX_HIGH_37 5:5
+#define GPIO_MUX_HIGH_37_GPIO 0
+#define GPIO_MUX_HIGH_37_UART0 1
+#define GPIO_MUX_HIGH_36 4:4
+#define GPIO_MUX_HIGH_36_GPIO 0
+#define GPIO_MUX_HIGH_36_SSP0 1
+#define GPIO_MUX_HIGH_35 3:3
+#define GPIO_MUX_HIGH_35_GPIO 0
+#define GPIO_MUX_HIGH_35_SSP0 1
+#define GPIO_MUX_HIGH_34 2:2
+#define GPIO_MUX_HIGH_34_GPIO 0
+#define GPIO_MUX_HIGH_34_SSP0 1
+#define GPIO_MUX_HIGH_33 1:1
+#define GPIO_MUX_HIGH_33_GPIO 0
+#define GPIO_MUX_HIGH_33_SSP0 1
+#define GPIO_MUX_HIGH_32 0:0
+#define GPIO_MUX_HIGH_32_GPIO 0
+#define GPIO_MUX_HIGH_32_SSP0 1
+
+#define DRAM_CTRL 0x000010
+#define DRAM_CTRL_EMBEDDED 31:31
+#define DRAM_CTRL_EMBEDDED_ENABLE 0
+#define DRAM_CTRL_EMBEDDED_DISABLE 1
+#define DRAM_CTRL_CPU_BURST 30:28
+#define DRAM_CTRL_CPU_BURST_1 0
+#define DRAM_CTRL_CPU_BURST_2 1
+#define DRAM_CTRL_CPU_BURST_4 2
+#define DRAM_CTRL_CPU_BURST_8 3
+#define DRAM_CTRL_CPU_CAS_LATENCY 27:27
+#define DRAM_CTRL_CPU_CAS_LATENCY_2 0
+#define DRAM_CTRL_CPU_CAS_LATENCY_3 1
+#define DRAM_CTRL_CPU_SIZE 26:24
+#define DRAM_CTRL_CPU_SIZE_2 0
+#define DRAM_CTRL_CPU_SIZE_4 1
+#define DRAM_CTRL_CPU_SIZE_64 4
+#define DRAM_CTRL_CPU_SIZE_32 5
+#define DRAM_CTRL_CPU_SIZE_16 6
+#define DRAM_CTRL_CPU_SIZE_8 7
+#define DRAM_CTRL_CPU_COLUMN_SIZE 23:22
+#define DRAM_CTRL_CPU_COLUMN_SIZE_1024 0
+#define DRAM_CTRL_CPU_COLUMN_SIZE_512 2
+#define DRAM_CTRL_CPU_COLUMN_SIZE_256 3
+#define DRAM_CTRL_CPU_ACTIVE_PRECHARGE 21:21
+#define DRAM_CTRL_CPU_ACTIVE_PRECHARGE_6 0
+#define DRAM_CTRL_CPU_ACTIVE_PRECHARGE_7 1
+#define DRAM_CTRL_CPU_RESET 20:20
+#define DRAM_CTRL_CPU_RESET_ENABLE 0
+#define DRAM_CTRL_CPU_RESET_DISABLE 1
+#define DRAM_CTRL_CPU_BANKS 19:19
+#define DRAM_CTRL_CPU_BANKS_2 1
+#define DRAM_CTRL_CPU_BANKS_4 0
+#define DRAM_CTRL_CPU_WRITE_PRECHARGE 18:18
+#define DRAM_CTRL_CPU_WRITE_PRECHARGE_2 0
+#define DRAM_CTRL_CPU_WRITE_PRECHARGE_1 1
+#define DRAM_CTRL_BLOCK_WRITE 17:17
+#define DRAM_CTRL_BLOCK_WRITE_DISABLE 0
+#define DRAM_CTRL_BLOCK_WRITE_ENABLE 1
+#define DRAM_CTRL_REFRESH_COMMAND 16:16
+#define DRAM_CTRL_REFRESH_COMMAND_10 0
+#define DRAM_CTRL_REFRESH_COMMAND_12 1
+#define DRAM_CTRL_SIZE 15:13
+#define DRAM_CTRL_SIZE_4 0
+#define DRAM_CTRL_SIZE_8 1
+#define DRAM_CTRL_SIZE_16 2
+#define DRAM_CTRL_SIZE_32 3
+#define DRAM_CTRL_SIZE_64 4
+#define DRAM_CTRL_SIZE_2 5
+#define DRAM_CTRL_COLUMN_SIZE 12:11
+#define DRAM_CTRL_COLUMN_SIZE_256 0
+#define DRAM_CTRL_COLUMN_SIZE_512 2
+#define DRAM_CTRL_COLUMN_SIZE_1024 3
+#define DRAM_CTRL_BLOCK_WRITE_TIME 10:10
+#define DRAM_CTRL_BLOCK_WRITE_TIME_1 0
+#define DRAM_CTRL_BLOCK_WRITE_TIME_2 1
+#define DRAM_CTRL_BLOCK_WRITE_PRECHARGE 9:9
+#define DRAM_CTRL_BLOCK_WRITE_PRECHARGE_4 0
+#define DRAM_CTRL_BLOCK_WRITE_PRECHARGE_1 1
+#define DRAM_CTRL_ACTIVE_PRECHARGE 8:8
+#define DRAM_CTRL_ACTIVE_PRECHARGE_6 0
+#define DRAM_CTRL_ACTIVE_PRECHARGE_7 1
+#define DRAM_CTRL_RESET 7:7
+#define DRAM_CTRL_RESET_ENABLE 0
+#define DRAM_CTRL_RESET_DISABLE 1
+#define DRAM_CTRL_REMAIN_ACTIVE 6:6
+#define DRAM_CTRL_REMAIN_ACTIVE_ENABLE 0
+#define DRAM_CTRL_REMAIN_ACTIVE_DISABLE 1
+#define DRAM_CTRL_BANKS 1:1
+#define DRAM_CTRL_BANKS_2 1
+#define DRAM_CTRL_BANKS_4 0
+#define DRAM_CTRL_WRITE_PRECHARGE 0:0
+#define DRAM_CTRL_WRITE_PRECHARGE_2 0
+#define DRAM_CTRL_WRITE_PRECHARGE_1 1
+
+#define ARBITRATION_CTRL 0x000014
+#define ARBITRATION_CTRL_CPUMEM 29:29
+#define ARBITRATION_CTRL_CPUMEM_FIXED 0
+#define ARBITRATION_CTRL_CPUMEM_ROTATE 1
+#define ARBITRATION_CTRL_INTMEM 28:28
+#define ARBITRATION_CTRL_INTMEM_FIXED 0
+#define ARBITRATION_CTRL_INTMEM_ROTATE 1
+#define ARBITRATION_CTRL_USB 27:24
+#define ARBITRATION_CTRL_USB_OFF 0
+#define ARBITRATION_CTRL_USB_PRIORITY_1 1
+#define ARBITRATION_CTRL_USB_PRIORITY_2 2
+#define ARBITRATION_CTRL_USB_PRIORITY_3 3
+#define ARBITRATION_CTRL_USB_PRIORITY_4 4
+#define ARBITRATION_CTRL_USB_PRIORITY_5 5
+#define ARBITRATION_CTRL_USB_PRIORITY_6 6
+#define ARBITRATION_CTRL_USB_PRIORITY_7 7
+#define ARBITRATION_CTRL_PANEL 23:20
+#define ARBITRATION_CTRL_PANEL_OFF 0
+#define ARBITRATION_CTRL_PANEL_PRIORITY_1 1
+#define ARBITRATION_CTRL_PANEL_PRIORITY_2 2
+#define ARBITRATION_CTRL_PANEL_PRIORITY_3 3
+#define ARBITRATION_CTRL_PANEL_PRIORITY_4 4
+#define ARBITRATION_CTRL_PANEL_PRIORITY_5 5
+#define ARBITRATION_CTRL_PANEL_PRIORITY_6 6
+#define ARBITRATION_CTRL_PANEL_PRIORITY_7 7
+#define ARBITRATION_CTRL_ZVPORT 19:16
+#define ARBITRATION_CTRL_ZVPORT_OFF 0
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_1 1
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_2 2
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_3 3
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_4 4
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_5 5
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_6 6
+#define ARBITRATION_CTRL_ZVPORT_PRIORITY_7 7
+#define ARBITRATION_CTRL_CMD_INTPR 15:12
+#define ARBITRATION_CTRL_CMD_INTPR_OFF 0
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_1 1
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_2 2
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_3 3
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_4 4
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_5 5
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_6 6
+#define ARBITRATION_CTRL_CMD_INTPR_PRIORITY_7 7
+#define ARBITRATION_CTRL_DMA 11:8
+#define ARBITRATION_CTRL_DMA_OFF 0
+#define ARBITRATION_CTRL_DMA_PRIORITY_1 1
+#define ARBITRATION_CTRL_DMA_PRIORITY_2 2
+#define ARBITRATION_CTRL_DMA_PRIORITY_3 3
+#define ARBITRATION_CTRL_DMA_PRIORITY_4 4
+#define ARBITRATION_CTRL_DMA_PRIORITY_5 5
+#define ARBITRATION_CTRL_DMA_PRIORITY_6 6
+#define ARBITRATION_CTRL_DMA_PRIORITY_7 7
+#define ARBITRATION_CTRL_VIDEO 7:4
+#define ARBITRATION_CTRL_VIDEO_OFF 0
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_1 1
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_2 2
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_3 3
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_4 4
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_5 5
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_6 6
+#define ARBITRATION_CTRL_VIDEO_PRIORITY_7 7
+#define ARBITRATION_CTRL_CRT 3:0
+#define ARBITRATION_CTRL_CRT_OFF 0
+#define ARBITRATION_CTRL_CRT_PRIORITY_1 1
+#define ARBITRATION_CTRL_CRT_PRIORITY_2 2
+#define ARBITRATION_CTRL_CRT_PRIORITY_3 3
+#define ARBITRATION_CTRL_CRT_PRIORITY_4 4
+#define ARBITRATION_CTRL_CRT_PRIORITY_5 5
+#define ARBITRATION_CTRL_CRT_PRIORITY_6 6
+#define ARBITRATION_CTRL_CRT_PRIORITY_7 7
+
+#define CMD_INTPR_CTRL 0x000018
+#define CMD_INTPR_CTRL_STATUS 31:31
+#define CMD_INTPR_CTRL_STATUS_STOPPED 0
+#define CMD_INTPR_CTRL_STATUS_RUNNING 1
+#define CMD_INTPR_CTRL_EXT 27:27
+#define CMD_INTPR_CTRL_EXT_LOCAL 0
+#define CMD_INTPR_CTRL_EXT_EXTERNAL 1
+#define CMD_INTPR_CTRL_CS 26:26
+#define CMD_INTPR_CTRL_CS_0 0
+#define CMD_INTPR_CTRL_CS_1 1
+#define CMD_INTPR_CTRL_ADDRESS 25:0
+
+#define CMD_INTPR_CONDITIONS 0x00001C
+
+#define CMD_INTPR_RETURN 0x000020
+#define CMD_INTPR_RETURN_EXT 27:27
+#define CMD_INTPR_RETURN_EXT_LOCAL 0
+#define CMD_INTPR_RETURN_EXT_EXTERNAL 1
+#define CMD_INTPR_RETURN_CS 26:26
+#define CMD_INTPR_RETURN_CS_0 0
+#define CMD_INTPR_RETURN_CS_1 1
+#define CMD_INTPR_RETURN_ADDRESS 25:0
+
+#define CMD_INTPR_STATUS 0x000024
+#define CMD_INTPR_STATUS_2D_MEMORY_FIFO 20:20
+#define CMD_INTPR_STATUS_2D_MEMORY_FIFO_NOT_EMPTY 0
+#define CMD_INTPR_STATUS_2D_MEMORY_FIFO_EMPTY 1
+#define CMD_INTPR_STATUS_COMMAND_FIFO 19:19
+#define CMD_INTPR_STATUS_COMMAND_FIFO_NOT_EMPTY 0
+#define CMD_INTPR_STATUS_COMMAND_FIFO_EMPTY 1
+#define CMD_INTPR_STATUS_CSC_STATUS 18:18
+#define CMD_INTPR_STATUS_CSC_STATUS_IDLE 0
+#define CMD_INTPR_STATUS_CSC_STATUS_BUSY 1
+#define CMD_INTPR_STATUS_MEMORY_DMA 17:17
+#define CMD_INTPR_STATUS_MEMORY_DMA_IDLE 0
+#define CMD_INTPR_STATUS_MEMORY_DMA_BUSY 1
+#define CMD_INTPR_STATUS_CRT_STATUS 16:16
+#define CMD_INTPR_STATUS_CRT_STATUS_CURRENT 0
+#define CMD_INTPR_STATUS_CRT_STATUS_PENDING 1
+#define CMD_INTPR_STATUS_CURRENT_FIELD 15:15
+#define CMD_INTPR_STATUS_CURRENT_FIELD_ODD 0
+#define CMD_INTPR_STATUS_CURRENT_FIELD_EVEN 1
+#define CMD_INTPR_STATUS_VIDEO_STATUS 14:14
+#define CMD_INTPR_STATUS_VIDEO_STATUS_CURRENT 0
+#define CMD_INTPR_STATUS_VIDEO_STATUS_PENDING 1
+#define CMD_INTPR_STATUS_PANEL_STATUS 13:13
+#define CMD_INTPR_STATUS_PANEL_STATUS_CURRENT 0
+#define CMD_INTPR_STATUS_PANEL_STATUS_PENDING 1
+#define CMD_INTPR_STATUS_CRT_SYNC 12:12
+#define CMD_INTPR_STATUS_CRT_SYNC_INACTIVE 0
+#define CMD_INTPR_STATUS_CRT_SYNC_ACTIVE 1
+#define CMD_INTPR_STATUS_PANEL_SYNC 11:11
+#define CMD_INTPR_STATUS_PANEL_SYNC_INACTIVE 0
+#define CMD_INTPR_STATUS_PANEL_SYNC_ACTIVE 1
+#define CMD_INTPR_STATUS_2D_SETUP 2:2
+#define CMD_INTPR_STATUS_2D_SETUP_IDLE 0
+#define CMD_INTPR_STATUS_2D_SETUP_BUSY 1
+#define CMD_INTPR_STATUS_2D_FIFO 1:1
+#define CMD_INTPR_STATUS_2D_FIFO_NOT_EMPTY 0
+#define CMD_INTPR_STATUS_2D_FIFO_EMPTY 1
+#define CMD_INTPR_STATUS_2D_ENGINE 0:0
+#define CMD_INTPR_STATUS_2D_ENGINE_IDLE 0
+#define CMD_INTPR_STATUS_2D_ENGINE_BUSY 1
+
+#define RAW_INT_STATUS 0x000028
+#define RAW_INT_STATUS_ZVPORT1 6:6
+#define RAW_INT_STATUS_ZVPORT1_INACTIVE 0
+#define RAW_INT_STATUS_ZVPORT1_ACTIVE 1
+#define RAW_INT_STATUS_ZVPORT1_CLEAR 1
+#define RAW_INT_STATUS_USB_SLAVE_PLUG_IN 5:5
+#define RAW_INT_STATUS_USB_SLAVE_PLUG_IN_INACTIVE 0
+#define RAW_INT_STATUS_USB_SLAVE_PLUG_IN_ACTIVE 1
+#define RAW_INT_STATUS_USB_SLAVE_PLUG_IN_CLEAR 1
+#define RAW_INT_STATUS_ZVPORT 4:4
+#define RAW_INT_STATUS_ZVPORT_INACTIVE 0
+#define RAW_INT_STATUS_ZVPORT_ACTIVE 1
+#define RAW_INT_STATUS_ZVPORT_CLEAR 1
+#define RAW_INT_STATUS_CRT_VSYNC 3:3
+#define RAW_INT_STATUS_CRT_VSYNC_INACTIVE 0
+#define RAW_INT_STATUS_CRT_VSYNC_ACTIVE 1
+#define RAW_INT_STATUS_CRT_VSYNC_CLEAR 1
+#define RAW_INT_STATUS_USB_SLAVE 2:2
+#define RAW_INT_STATUS_USB_SLAVE_INACTIVE 0
+#define RAW_INT_STATUS_USB_SLAVE_ACTIVE 1
+#define RAW_INT_STATUS_USB_SLAVE_CLEAR 1
+#define RAW_INT_STATUS_PANEL_VSYNC 1:1
+#define RAW_INT_STATUS_PANEL_VSYNC_INACTIVE 0
+#define RAW_INT_STATUS_PANEL_VSYNC_ACTIVE 1
+#define RAW_INT_STATUS_PANEL_VSYNC_CLEAR 1
+#define RAW_INT_STATUS_CMD_INTPR 0:0
+#define RAW_INT_STATUS_CMD_INTPR_INACTIVE 0
+#define RAW_INT_STATUS_CMD_INTPR_ACTIVE 1
+#define RAW_INT_STATUS_CMD_INTPR_CLEAR 1
+
+#define INT_STATUS 0x00002C
+#define INT_STATUS_USB_SLAVE_PLUG_IN 31:31
+#define INT_STATUS_USB_SLAVE_PLUG_IN_INACTIVE 0
+#define INT_STATUS_USB_SLAVE_PLUG_IN_ACTIVE 1
+#define INT_STATUS_GPIO54 30:30
+#define INT_STATUS_GPIO54_INACTIVE 0
+#define INT_STATUS_GPIO54_ACTIVE 1
+#define INT_STATUS_GPIO53 29:29
+#define INT_STATUS_GPIO53_INACTIVE 0
+#define INT_STATUS_GPIO53_ACTIVE 1
+#define INT_STATUS_GPIO52 28:28
+#define INT_STATUS_GPIO52_INACTIVE 0
+#define INT_STATUS_GPIO52_ACTIVE 1
+#define INT_STATUS_GPIO51 27:27
+#define INT_STATUS_GPIO51_INACTIVE 0
+#define INT_STATUS_GPIO51_ACTIVE 1
+#define INT_STATUS_GPIO50 26:26
+#define INT_STATUS_GPIO50_INACTIVE 0
+#define INT_STATUS_GPIO50_ACTIVE 1
+#define INT_STATUS_GPIO49 25:25
+#define INT_STATUS_GPIO49_INACTIVE 0
+#define INT_STATUS_GPIO49_ACTIVE 1
+#define INT_STATUS_GPIO48 24:24
+#define INT_STATUS_GPIO48_INACTIVE 0
+#define INT_STATUS_GPIO48_ACTIVE 1
+#define INT_STATUS_I2C 23:23
+#define INT_STATUS_I2C_INACTIVE 0
+#define INT_STATUS_I2C_ACTIVE 1
+#define INT_STATUS_PWM 22:22
+#define INT_STATUS_PWM_INACTIVE 0
+#define INT_STATUS_PWM_ACTIVE 1
+#define INT_STATUS_DMA 20:20
+#define INT_STATUS_DMA_INACTIVE 0
+#define INT_STATUS_DMA_ACTIVE 1
+#define INT_STATUS_PCI 19:19
+#define INT_STATUS_PCI_INACTIVE 0
+#define INT_STATUS_PCI_ACTIVE 1
+#define INT_STATUS_I2S 18:18
+#define INT_STATUS_I2S_INACTIVE 0
+#define INT_STATUS_I2S_ACTIVE 1
+#define INT_STATUS_AC97 17:17
+#define INT_STATUS_AC97_INACTIVE 0
+#define INT_STATUS_AC97_ACTIVE 1
+#define INT_STATUS_USB_SLAVE 16:16
+#define INT_STATUS_USB_SLAVE_INACTIVE 0
+#define INT_STATUS_USB_SLAVE_ACTIVE 1
+#define INT_STATUS_UART1 13:13
+#define INT_STATUS_UART1_INACTIVE 0
+#define INT_STATUS_UART1_ACTIVE 1
+#define INT_STATUS_UART0 12:12
+#define INT_STATUS_UART0_INACTIVE 0
+#define INT_STATUS_UART0_ACTIVE 1
+#define INT_STATUS_CRT_VSYNC 11:11
+#define INT_STATUS_CRT_VSYNC_INACTIVE 0
+#define INT_STATUS_CRT_VSYNC_ACTIVE 1
+#define INT_STATUS_8051 10:10
+#define INT_STATUS_8051_INACTIVE 0
+#define INT_STATUS_8051_ACTIVE 1
+#define INT_STATUS_SSP1 9:9
+#define INT_STATUS_SSP1_INACTIVE 0
+#define INT_STATUS_SSP1_ACTIVE 1
+#define INT_STATUS_SSP0 8:8
+#define INT_STATUS_SSP0_INACTIVE 0
+#define INT_STATUS_SSP0_ACTIVE 1
+#define INT_STATUS_USB_HOST 6:6
+#define INT_STATUS_USB_HOST_INACTIVE 0
+#define INT_STATUS_USB_HOST_ACTIVE 1
+#define INT_STATUS_ZVPORT1 4:4
+#define INT_STATUS_ZVPORT1_INACTIVE 0
+#define INT_STATUS_ZVPORT1_ACTIVE 1
+#define INT_STATUS_2D 3:3
+#define INT_STATUS_2D_INACTIVE 0
+#define INT_STATUS_2D_ACTIVE 1
+#define INT_STATUS_ZVPORT 2:2
+#define INT_STATUS_ZVPORT_INACTIVE 0
+#define INT_STATUS_ZVPORT_ACTIVE 1
+#define INT_STATUS_PANEL_VSYNC 1:1
+#define INT_STATUS_PANEL_VSYNC_INACTIVE 0
+#define INT_STATUS_PANEL_VSYNC_ACTIVE 1
+#define INT_STATUS_CMD_INTPR 0:0
+#define INT_STATUS_CMD_INTPR_INACTIVE 0
+#define INT_STATUS_CMD_INTPR_ACTIVE 1
+
+#define INT_MASK 0x000030
+#define INT_MASK_USB_SLAVE_PLUG_IN 31:31
+#define INT_MASK_USB_SLAVE_PLUG_IN_DISABLE 0
+#define INT_MASK_USB_SLAVE_PLUG_IN_ENABLE 1
+#define INT_MASK_GPIO54 30:30
+#define INT_MASK_GPIO54_DISABLE 0
+#define INT_MASK_GPIO54_ENABLE 1
+#define INT_MASK_GPIO53 29:29
+#define INT_MASK_GPIO53_DISABLE 0
+#define INT_MASK_GPIO53_ENABLE 1
+#define INT_MASK_GPIO52 28:28
+#define INT_MASK_GPIO52_DISABLE 0
+#define INT_MASK_GPIO52_ENABLE 1
+#define INT_MASK_GPIO51 27:27
+#define INT_MASK_GPIO51_DISABLE 0
+#define INT_MASK_GPIO51_ENABLE 1
+#define INT_MASK_GPIO50 26:26
+#define INT_MASK_GPIO50_DISABLE 0
+#define INT_MASK_GPIO50_ENABLE 1
+#define INT_MASK_GPIO49 25:25
+#define INT_MASK_GPIO49_DISABLE 0
+#define INT_MASK_GPIO49_ENABLE 1
+#define INT_MASK_GPIO48 24:24
+#define INT_MASK_GPIO48_DISABLE 0
+#define INT_MASK_GPIO48_ENABLE 1
+#define INT_MASK_I2C 23:23
+#define INT_MASK_I2C_DISABLE 0
+#define INT_MASK_I2C_ENABLE 1
+#define INT_MASK_PWM 22:22
+#define INT_MASK_PWM_DISABLE 0
+#define INT_MASK_PWM_ENABLE 1
+#define INT_MASK_DMA 20:20
+#define INT_MASK_DMA_DISABLE 0
+#define INT_MASK_DMA_ENABLE 1
+#define INT_MASK_PCI 19:19
+#define INT_MASK_PCI_DISABLE 0
+#define INT_MASK_PCI_ENABLE 1
+#define INT_MASK_I2S 18:18
+#define INT_MASK_I2S_DISABLE 0
+#define INT_MASK_I2S_ENABLE 1
+#define INT_MASK_AC97 17:17
+#define INT_MASK_AC97_DISABLE 0
+#define INT_MASK_AC97_ENABLE 1
+#define INT_MASK_USB_SLAVE 16:16
+#define INT_MASK_USB_SLAVE_DISABLE 0
+#define INT_MASK_USB_SLAVE_ENABLE 1
+#define INT_MASK_UART1 13:13
+#define INT_MASK_UART1_DISABLE 0
+#define INT_MASK_UART1_ENABLE 1
+#define INT_MASK_UART0 12:12
+#define INT_MASK_UART0_DISABLE 0
+#define INT_MASK_UART0_ENABLE 1
+#define INT_MASK_CRT_VSYNC 11:11
+#define INT_MASK_CRT_VSYNC_DISABLE 0
+#define INT_MASK_CRT_VSYNC_ENABLE 1
+#define INT_MASK_8051 10:10
+#define INT_MASK_8051_DISABLE 0
+#define INT_MASK_8051_ENABLE 1
+#define INT_MASK_SSP1 9:9
+#define INT_MASK_SSP1_DISABLE 0
+#define INT_MASK_SSP1_ENABLE 1
+#define INT_MASK_SSP0 8:8
+#define INT_MASK_SSP0_DISABLE 0
+#define INT_MASK_SSP0_ENABLE 1
+#define INT_MASK_USB_HOST 6:6
+#define INT_MASK_USB_HOST_DISABLE 0
+#define INT_MASK_USB_HOST_ENABLE 1
+#define INT_MASK_ZV1 4:4
+#define INT_MASK_ZV1_DISABLE 0
+#define INT_MASK_ZV1_ENABLE 1
+#define INT_MASK_2D 3:3
+#define INT_MASK_2D_DISABLE 0
+#define INT_MASK_2D_ENABLE 1
+#define INT_MASK_ZVPORT 2:2
+#define INT_MASK_ZVPORT_DISABLE 0
+#define INT_MASK_ZVPORT_ENABLE 1
+#define INT_MASK_PANEL_VSYNC 1:1
+#define INT_MASK_PANEL_VSYNC_DISABLE 0
+#define INT_MASK_PANEL_VSYNC_ENABLE 1
+#define INT_MASK_CMD_INTPR 0:0
+#define INT_MASK_CMD_INTPR_DISABLE 0
+#define INT_MASK_CMD_INTPR_ENABLE 1
+
+#define DEBUG_CTRL 0x000034
+#define DEBUG_CTRL_MODULE 7:5
+#define DEBUG_CTRL_PARTITION 4:0
+#define DEBUG_CTRL_PARTITION_HIF 0
+#define DEBUG_CTRL_PARTITION_CPUMEM 1
+#define DEBUG_CTRL_PARTITION_PCI 2
+#define DEBUG_CTRL_PARTITION_CMD_INTPR 3
+#define DEBUG_CTRL_PARTITION_DISPLAY 4
+#define DEBUG_CTRL_PARTITION_ZVPORT 5
+#define DEBUG_CTRL_PARTITION_2D 6
+#define DEBUG_CTRL_PARTITION_MIF 8
+#define DEBUG_CTRL_PARTITION_USB_HOST 10
+#define DEBUG_CTRL_PARTITION_SSP0 12
+#define DEBUG_CTRL_PARTITION_SSP1 13
+#define DEBUG_CTRL_PARTITION_UART0 19
+#define DEBUG_CTRL_PARTITION_UART1 20
+#define DEBUG_CTRL_PARTITION_I2C 21
+#define DEBUG_CTRL_PARTITION_8051 23
+#define DEBUG_CTRL_PARTITION_AC97 24
+#define DEBUG_CTRL_PARTITION_I2S 25
+#define DEBUG_CTRL_PARTITION_INTMEM 26
+#define DEBUG_CTRL_PARTITION_DMA 27
+#define DEBUG_CTRL_PARTITION_SIMULATION 28
+
+#define CURRENT_POWER_GATE 0x000038
+#define CURRENT_POWER_GATE_AC97_I2S 18:18
+#define CURRENT_POWER_GATE_AC97_I2S_DISABLE 0
+#define CURRENT_POWER_GATE_AC97_I2S_ENABLE 1
+#define CURRENT_POWER_GATE_8051 17:17
+#define CURRENT_POWER_GATE_8051_DISABLE 0
+#define CURRENT_POWER_GATE_8051_ENABLE 1
+#define CURRENT_POWER_GATE_PLL 16:16
+#define CURRENT_POWER_GATE_PLL_DISABLE 0
+#define CURRENT_POWER_GATE_PLL_ENABLE 1
+#define CURRENT_POWER_GATE_OSCILLATOR 15:15
+#define CURRENT_POWER_GATE_OSCILLATOR_DISABLE 0
+#define CURRENT_POWER_GATE_OSCILLATOR_ENABLE 1
+#define CURRENT_POWER_GATE_PLL_RECOVERY 14:13
+#define CURRENT_POWER_GATE_PLL_RECOVERY_32 0
+#define CURRENT_POWER_GATE_PLL_RECOVERY_64 1
+#define CURRENT_POWER_GATE_PLL_RECOVERY_96 2
+#define CURRENT_POWER_GATE_PLL_RECOVERY_128 3
+#define CURRENT_POWER_GATE_USB_SLAVE 12:12
+#define CURRENT_POWER_GATE_USB_SLAVE_DISABLE 0
+#define CURRENT_POWER_GATE_USB_SLAVE_ENABLE 1
+#define CURRENT_POWER_GATE_USB_HOST 11:11
+#define CURRENT_POWER_GATE_USB_HOST_DISABLE 0
+#define CURRENT_POWER_GATE_USB_HOST_ENABLE 1
+#define CURRENT_POWER_GATE_SSP0_SSP1 10:10
+#define CURRENT_POWER_GATE_SSP0_SSP1_DISABLE 0
+#define CURRENT_POWER_GATE_SSP0_SSP1_ENABLE 1
+#define CURRENT_POWER_GATE_UART1 8:8
+#define CURRENT_POWER_GATE_UART1_DISABLE 0
+#define CURRENT_POWER_GATE_UART1_ENABLE 1
+#define CURRENT_POWER_GATE_UART0 7:7
+#define CURRENT_POWER_GATE_UART0_DISABLE 0
+#define CURRENT_POWER_GATE_UART0_ENABLE 1
+#define CURRENT_POWER_GATE_GPIO_PWM_I2C 6:6
+#define CURRENT_POWER_GATE_GPIO_PWM_I2C_DISABLE 0
+#define CURRENT_POWER_GATE_GPIO_PWM_I2C_ENABLE 1
+#define CURRENT_POWER_GATE_ZVPORT 5:5
+#define CURRENT_POWER_GATE_ZVPORT_DISABLE 0
+#define CURRENT_POWER_GATE_ZVPORT_ENABLE 1
+#define CURRENT_POWER_GATE_CSC 4:4
+#define CURRENT_POWER_GATE_CSC_DISABLE 0
+#define CURRENT_POWER_GATE_CSC_ENABLE 1
+#define CURRENT_POWER_GATE_2D 3:3
+#define CURRENT_POWER_GATE_2D_DISABLE 0
+#define CURRENT_POWER_GATE_2D_ENABLE 1
+#define CURRENT_POWER_GATE_DISPLAY 2:2
+#define CURRENT_POWER_GATE_DISPLAY_DISABLE 0
+#define CURRENT_POWER_GATE_DISPLAY_ENABLE 1
+#define CURRENT_POWER_GATE_INTMEM 1:1
+#define CURRENT_POWER_GATE_INTMEM_DISABLE 0
+#define CURRENT_POWER_GATE_INTMEM_ENABLE 1
+#define CURRENT_POWER_GATE_HOST 0:0
+#define CURRENT_POWER_GATE_HOST_DISABLE 0
+#define CURRENT_POWER_GATE_HOST_ENABLE 1
+
+#define CURRENT_POWER_CLOCK 0x00003C
+
+#define CURRENT_POWER_CLOCK_DIS2XP 31:31
+#define CURRENT_POWER_CLOCK_DIS2XP_0 0
+#define CURRENT_POWER_CLOCK_DIS2XP_1 1
+
+#define CURRENT_POWER_CLOCK_P2XCLK_DIS 31:31
+#define CURRENT_POWER_CLOCK_P2XCLK_DIS_NORMAL 0
+#define CURRENT_POWER_CLOCK_P2XCLK_DIS_1X 1
+
+#define CURRENT_POWER_CLOCK_P2s 30:30
+#define CURRENT_POWER_CLOCK_P2s_HW 0
+#define CURRENT_POWER_CLOCK_P2s_SW 1
+
+#define CURRENT_POWER_CLOCK_SEL 30:30
+#define CURRENT_POWER_CLOCK_SEL_PXCLK 0
+#define CURRENT_POWER_CLOCK_SEL_PLL 1
+
+#define CURRENT_POWER_CLOCK_P2XCLK_SELECT 29:29
+#define CURRENT_POWER_CLOCK_P2XCLK_SELECT_288 0
+#define CURRENT_POWER_CLOCK_P2XCLK_SELECT_336 1
+
+#define CURRENT_POWER_CLOCK_P2XCLK_SELECT_12X 0
+#define CURRENT_POWER_CLOCK_P2XCLK_SELECT_14X 1
+
+#define CURRENT_POWER_CLOCK_P2XCLK_DIVIDER 28:27
+#define CURRENT_POWER_CLOCK_P2XCLK_DIVIDER_1 0
+#define CURRENT_POWER_CLOCK_P2XCLK_DIVIDER_3 1
+#define CURRENT_POWER_CLOCK_P2XCLK_DIVIDER_5 2
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT 26:24
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_0 0
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_1 1
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_2 2
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_3 3
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_4 4
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_5 5
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_6 6
+#define CURRENT_POWER_CLOCK_P2XCLK_SHIFT_7 7
+
+#define CURRENT_POWER_CLOCK_V2XCLK_2X 21:21
+
+#define CURRENT_POWER_CLOCK_V2XCLK_DIS 21:21
+#define CURRENT_POWER_CLOCK_V2XCLK_DIS_NORMAL 0
+#define CURRENT_POWER_CLOCK_V2XCLK_DIS_1X 1
+
+#define CURRENT_POWER_CLOCK_V2XCLK_SELECT 20:20
+#define CURRENT_POWER_CLOCK_V2XCLK_SELECT_288 0
+#define CURRENT_POWER_CLOCK_V2XCLK_SELECT_336 1
+#define CURRENT_POWER_CLOCK_V2XCLK_SELECT_12X 0
+#define CURRENT_POWER_CLOCK_V2XCLK_SELECT_14X 1
+#define CURRENT_POWER_CLOCK_V2XCLK_DIVIDER 19:19
+#define CURRENT_POWER_CLOCK_V2XCLK_DIVIDER_1 0
+#define CURRENT_POWER_CLOCK_V2XCLK_DIVIDER_3 1
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT 18:16
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_0 0
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_1 1
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_2 2
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_3 3
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_4 4
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_5 5
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_6 6
+#define CURRENT_POWER_CLOCK_V2XCLK_SHIFT_7 7
+#define CURRENT_POWER_CLOCK_MCLK_SELECT 12:12
+#define CURRENT_POWER_CLOCK_MCLK_SELECT_288 0
+#define CURRENT_POWER_CLOCK_MCLK_SELECT_336 1
+#define CURRENT_POWER_CLOCK_MCLK_SELECT_12X 0
+#define CURRENT_POWER_CLOCK_MCLK_SELECT_14X 1
+#define CURRENT_POWER_CLOCK_MCLK_DIVIDER 11:11
+#define CURRENT_POWER_CLOCK_MCLK_DIVIDER_1 0
+#define CURRENT_POWER_CLOCK_MCLK_DIVIDER_3 1
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT 10:8
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_0 0
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_1 1
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_2 2
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_3 3
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_4 4
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_5 5
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_6 6
+#define CURRENT_POWER_CLOCK_MCLK_SHIFT_7 7
+#define CURRENT_POWER_CLOCK_M2XCLK_SELECT 4:4
+#define CURRENT_POWER_CLOCK_M2XCLK_SELECT_288 0
+#define CURRENT_POWER_CLOCK_M2XCLK_SELECT_336 1
+#define CURRENT_POWER_CLOCK_M2XCLK_SELECT_12X 0
+#define CURRENT_POWER_CLOCK_M2XCLK_SELECT_14X 1
+#define CURRENT_POWER_CLOCK_M2XCLK_DIVIDER 3:3
+#define CURRENT_POWER_CLOCK_M2XCLK_DIVIDER_1 0
+#define CURRENT_POWER_CLOCK_M2XCLK_DIVIDER_3 1
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT 2:0
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_0 0
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_1 1
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_2 2
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_3 3
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_4 4
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_5 5
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_6 6
+#define CURRENT_POWER_CLOCK_M2XCLK_SHIFT_7 7
+
+#define POWER_MODE0_GATE 0x000040
+#define POWER_MODE0_GATE_AC97_I2S 18:18
+#define POWER_MODE0_GATE_AC97_I2S_DISABLE 0
+#define POWER_MODE0_GATE_AC97_I2S_ENABLE 1
+#define POWER_MODE0_GATE_8051 17:17
+#define POWER_MODE0_GATE_8051_DISABLE 0
+#define POWER_MODE0_GATE_8051_ENABLE 1
+#define POWER_MODE0_GATE_USB_SLAVE 12:12
+#define POWER_MODE0_GATE_USB_SLAVE_DISABLE 0
+#define POWER_MODE0_GATE_USB_SLAVE_ENABLE 1
+#define POWER_MODE0_GATE_USB_HOST 11:11
+#define POWER_MODE0_GATE_USB_HOST_DISABLE 0
+#define POWER_MODE0_GATE_USB_HOST_ENABLE 1
+#define POWER_MODE0_GATE_SSP0_SSP1 10:10
+#define POWER_MODE0_GATE_SSP0_SSP1_DISABLE 0
+#define POWER_MODE0_GATE_SSP0_SSP1_ENABLE 1
+#define POWER_MODE0_GATE_UART1 8:8
+#define POWER_MODE0_GATE_UART1_DISABLE 0
+#define POWER_MODE0_GATE_UART1_ENABLE 1
+#define POWER_MODE0_GATE_UART0 7:7
+#define POWER_MODE0_GATE_UART0_DISABLE 0
+#define POWER_MODE0_GATE_UART0_ENABLE 1
+#define POWER_MODE0_GATE_GPIO_PWM_I2C 6:6
+#define POWER_MODE0_GATE_GPIO_PWM_I2C_DISABLE 0
+#define POWER_MODE0_GATE_GPIO_PWM_I2C_ENABLE 1
+#define POWER_MODE0_GATE_ZVPORT 5:5
+#define POWER_MODE0_GATE_ZVPORT_DISABLE 0
+#define POWER_MODE0_GATE_ZVPORT_ENABLE 1
+#define POWER_MODE0_GATE_CSC 4:4
+#define POWER_MODE0_GATE_CSC_DISABLE 0
+#define POWER_MODE0_GATE_CSC_ENABLE 1
+#define POWER_MODE0_GATE_2D 3:3
+#define POWER_MODE0_GATE_2D_DISABLE 0
+#define POWER_MODE0_GATE_2D_ENABLE 1
+#define POWER_MODE0_GATE_DISPLAY 2:2
+#define POWER_MODE0_GATE_DISPLAY_DISABLE 0
+#define POWER_MODE0_GATE_DISPLAY_ENABLE 1
+#define POWER_MODE0_GATE_INTMEM 1:1
+#define POWER_MODE0_GATE_INTMEM_DISABLE 0
+#define POWER_MODE0_GATE_INTMEM_ENABLE 1
+#define POWER_MODE0_GATE_HOST 0:0
+#define POWER_MODE0_GATE_HOST_DISABLE 0
+#define POWER_MODE0_GATE_HOST_ENABLE 1
+
+#define POWER_MODE0_CLOCK 0x000044
+#define POWER_MODE0_CLOCK_P2XCLK_DIS 31:31
+#define POWER_MODE0_CLOCK_P2XCLK_DIS_NORMAL 0
+#define POWER_MODE0_CLOCK_P2XCLK_DIS_1X 1
+#define POWER_MODE0_CLOCK_SEL 30:30
+#define POWER_MODE0_CLOCK_SEL_PXCLK 0
+#define POWER_MODE0_CLOCK_SEL_PLL 1
+#define POWER_MODE0_CLOCK_P2XCLK_SELECT 29:29
+#define POWER_MODE0_CLOCK_P2XCLK_SELECT_288 0
+#define POWER_MODE0_CLOCK_P2XCLK_SELECT_336 1
+#define POWER_MODE0_CLOCK_P2XCLK_SELECT_12X 0
+#define POWER_MODE0_CLOCK_P2XCLK_SELECT_14X 1
+#define POWER_MODE0_CLOCK_P2XCLK_DIVIDER 28:27
+#define POWER_MODE0_CLOCK_P2XCLK_DIVIDER_1 0
+#define POWER_MODE0_CLOCK_P2XCLK_DIVIDER_3 1
+#define POWER_MODE0_CLOCK_P2XCLK_DIVIDER_5 2
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT 26:24
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_0 0
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_1 1
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_2 2
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_3 3
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_4 4
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_5 5
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_6 6
+#define POWER_MODE0_CLOCK_P2XCLK_SHIFT_7 7
+#define POWER_MODE0_CLOCK_V2XCLK_DIS 21:21
+#define POWER_MODE0_CLOCK_V2XCLK_DIS_NORMAL 0
+#define POWER_MODE0_CLOCK_V2XCLK_DIS_1X 1
+#define POWER_MODE0_CLOCK_V2XCLK_SELECT 20:20
+#define POWER_MODE0_CLOCK_V2XCLK_SELECT_288 0
+#define POWER_MODE0_CLOCK_V2XCLK_SELECT_336 1
+#define POWER_MODE0_CLOCK_V2XCLK_SELECT_12X 0
+#define POWER_MODE0_CLOCK_V2XCLK_SELECT_14X 1
+#define POWER_MODE0_CLOCK_V2XCLK_DIVIDER 19:19
+#define POWER_MODE0_CLOCK_V2XCLK_DIVIDER_1 0
+#define POWER_MODE0_CLOCK_V2XCLK_DIVIDER_3 1
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT 18:16
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_0 0
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_1 1
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_2 2
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_3 3
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_4 4
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_5 5
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_6 6
+#define POWER_MODE0_CLOCK_V2XCLK_SHIFT_7 7
+#define POWER_MODE0_CLOCK_MCLK_SELECT 12:12
+#define POWER_MODE0_CLOCK_MCLK_SELECT_288 0
+#define POWER_MODE0_CLOCK_MCLK_SELECT_336 1
+#define POWER_MODE0_CLOCK_MCLK_SELECT_12X 0
+#define POWER_MODE0_CLOCK_MCLK_SELECT_14X 1
+#define POWER_MODE0_CLOCK_MCLK_DIVIDER 11:11
+#define POWER_MODE0_CLOCK_MCLK_DIVIDER_1 0
+#define POWER_MODE0_CLOCK_MCLK_DIVIDER_3 1
+#define POWER_MODE0_CLOCK_MCLK_SHIFT 10:8
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_0 0
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_1 1
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_2 2
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_3 3
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_4 4
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_5 5
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_6 6
+#define POWER_MODE0_CLOCK_MCLK_SHIFT_7 7
+#define POWER_MODE0_CLOCK_M2XCLK_SELECT 4:4
+#define POWER_MODE0_CLOCK_M2XCLK_SELECT_288 0
+#define POWER_MODE0_CLOCK_M2XCLK_SELECT_336 1
+#define POWER_MODE0_CLOCK_M2XCLK_SELECT_12X 0
+#define POWER_MODE0_CLOCK_M2XCLK_SELECT_14X 1
+#define POWER_MODE0_CLOCK_M2XCLK_DIVIDER 3:3
+#define POWER_MODE0_CLOCK_M2XCLK_DIVIDER_1 0
+#define POWER_MODE0_CLOCK_M2XCLK_DIVIDER_3 1
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT 2:0
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_0 0
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_1 1
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_2 2
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_3 3
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_4 4
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_5 5
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_6 6
+#define POWER_MODE0_CLOCK_M2XCLK_SHIFT_7 7
+
+#define POWER_MODE1_GATE 0x000048
+#define POWER_MODE1_GATE_AC97_I2S 18:18
+#define POWER_MODE1_GATE_AC97_I2S_DISABLE 0
+#define POWER_MODE1_GATE_AC97_I2S_ENABLE 1
+#define POWER_MODE1_GATE_8051 17:17
+#define POWER_MODE1_GATE_8051_DISABLE 0
+#define POWER_MODE1_GATE_8051_ENABLE 1
+#define POWER_MODE1_GATE_USB_SLAVE 12:12
+#define POWER_MODE1_GATE_USB_SLAVE_DISABLE 0
+#define POWER_MODE1_GATE_USB_SLAVE_ENABLE 1
+#define POWER_MODE1_GATE_USB_HOST 11:11
+#define POWER_MODE1_GATE_USB_HOST_DISABLE 0
+#define POWER_MODE1_GATE_USB_HOST_ENABLE 1
+#define POWER_MODE1_GATE_SSP0_SSP1 10:10
+#define POWER_MODE1_GATE_SSP0_SSP1_DISABLE 0
+#define POWER_MODE1_GATE_SSP0_SSP1_ENABLE 1
+#define POWER_MODE1_GATE_UART1 8:8
+#define POWER_MODE1_GATE_UART1_DISABLE 0
+#define POWER_MODE1_GATE_UART1_ENABLE 1
+#define POWER_MODE1_GATE_UART0 7:7
+#define POWER_MODE1_GATE_UART0_DISABLE 0
+#define POWER_MODE1_GATE_UART0_ENABLE 1
+#define POWER_MODE1_GATE_GPIO_PWM_I2C 6:6
+#define POWER_MODE1_GATE_GPIO_PWM_I2C_DISABLE 0
+#define POWER_MODE1_GATE_GPIO_PWM_I2C_ENABLE 1
+#define POWER_MODE1_GATE_ZVPORT 5:5
+#define POWER_MODE1_GATE_ZVPORT_DISABLE 0
+#define POWER_MODE1_GATE_ZVPORT_ENABLE 1
+#define POWER_MODE1_GATE_CSC 4:4
+#define POWER_MODE1_GATE_CSC_DISABLE 0
+#define POWER_MODE1_GATE_CSC_ENABLE 1
+#define POWER_MODE1_GATE_2D 3:3
+#define POWER_MODE1_GATE_2D_DISABLE 0
+#define POWER_MODE1_GATE_2D_ENABLE 1
+#define POWER_MODE1_GATE_DISPLAY 2:2
+#define POWER_MODE1_GATE_DISPLAY_DISABLE 0
+#define POWER_MODE1_GATE_DISPLAY_ENABLE 1
+#define POWER_MODE1_GATE_INTMEM 1:1
+#define POWER_MODE1_GATE_INTMEM_DISABLE 0
+#define POWER_MODE1_GATE_INTMEM_ENABLE 1
+#define POWER_MODE1_GATE_HOST 0:0
+#define POWER_MODE1_GATE_HOST_DISABLE 0
+#define POWER_MODE1_GATE_HOST_ENABLE 1
+
+#define POWER_MODE1_CLOCK 0x00004C
+#define POWER_MODE1_CLOCK_P2XCLK_DIS 31:31
+#define POWER_MODE1_CLOCK_P2XCLK_DIS_NORMAL 0
+#define POWER_MODE1_CLOCK_P2XCLK_DIS_1X 1
+#define POWER_MODE1_CLOCK_SEL 30:30
+#define POWER_MODE1_CLOCK_SEL_PXCLK 0
+#define POWER_MODE1_CLOCK_SEL_PLL 1
+#define POWER_MODE1_CLOCK_P2XCLK_SELECT 29:29
+#define POWER_MODE1_CLOCK_P2XCLK_SELECT_288 0
+#define POWER_MODE1_CLOCK_P2XCLK_SELECT_336 1
+#define POWER_MODE1_CLOCK_P2XCLK_SELECT_12X 0
+#define POWER_MODE1_CLOCK_P2XCLK_SELECT_14X 1
+#define POWER_MODE1_CLOCK_P2XCLK_DIVIDER 28:27
+#define POWER_MODE1_CLOCK_P2XCLK_DIVIDER_1 0
+#define POWER_MODE1_CLOCK_P2XCLK_DIVIDER_3 1
+#define POWER_MODE1_CLOCK_P2XCLK_DIVIDER_5 2
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT 26:24
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_0 0
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_1 1
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_2 2
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_3 3
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_4 4
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_5 5
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_6 6
+#define POWER_MODE1_CLOCK_P2XCLK_SHIFT_7 7
+#define POWER_MODE1_CLOCK_V2XCLK_DIS 21:21
+#define POWER_MODE1_CLOCK_V2XCLK_DIS_NORMAL 0
+#define POWER_MODE1_CLOCK_V2XCLK_DIS_1X 1
+#define POWER_MODE1_CLOCK_V2XCLK_SELECT 20:20
+#define POWER_MODE1_CLOCK_V2XCLK_SELECT_288 0
+#define POWER_MODE1_CLOCK_V2XCLK_SELECT_336 1
+#define POWER_MODE1_CLOCK_V2XCLK_SELECT_12X 0
+#define POWER_MODE1_CLOCK_V2XCLK_SELECT_14X 1
+#define POWER_MODE1_CLOCK_V2XCLK_DIVIDER 19:19
+#define POWER_MODE1_CLOCK_V2XCLK_DIVIDER_1 0
+#define POWER_MODE1_CLOCK_V2XCLK_DIVIDER_3 1
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT 18:16
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_0 0
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_1 1
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_2 2
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_3 3
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_4 4
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_5 5
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_6 6
+#define POWER_MODE1_CLOCK_V2XCLK_SHIFT_7 7
+#define POWER_MODE1_CLOCK_MCLK_SELECT 12:12
+#define POWER_MODE1_CLOCK_MCLK_SELECT_288 0
+#define POWER_MODE1_CLOCK_MCLK_SELECT_336 1
+#define POWER_MODE1_CLOCK_MCLK_SELECT_12X 0
+#define POWER_MODE1_CLOCK_MCLK_SELECT_14X 1
+#define POWER_MODE1_CLOCK_MCLK_DIVIDER 11:11
+#define POWER_MODE1_CLOCK_MCLK_DIVIDER_1 0
+#define POWER_MODE1_CLOCK_MCLK_DIVIDER_3 1
+#define POWER_MODE1_CLOCK_MCLK_SHIFT 10:8
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_0 0
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_1 1
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_2 2
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_3 3
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_4 4
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_5 5
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_6 6
+#define POWER_MODE1_CLOCK_MCLK_SHIFT_7 7
+#define POWER_MODE1_CLOCK_M2XCLK_SELECT 4:4
+#define POWER_MODE1_CLOCK_M2XCLK_SELECT_288 0
+#define POWER_MODE1_CLOCK_M2XCLK_SELECT_336 1
+#define POWER_MODE1_CLOCK_M2XCLK_SELECT_12X 0
+#define POWER_MODE1_CLOCK_M2XCLK_SELECT_14X 1
+#define POWER_MODE1_CLOCK_M2XCLK_DIVIDER 3:3
+#define POWER_MODE1_CLOCK_M2XCLK_DIVIDER_1 0
+#define POWER_MODE1_CLOCK_M2XCLK_DIVIDER_3 1
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT 2:0
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_0 0
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_1 1
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_2 2
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_3 3
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_4 4
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_5 5
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_6 6
+#define POWER_MODE1_CLOCK_M2XCLK_SHIFT_7 7
+
+#define POWER_SLEEP_GATE 0x000050
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK 22:19
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_4096 0
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_2048 1
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_1024 2
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_512 3
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_256 4
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_128 5
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_64 6
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_32 7
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_16 8
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_8 9
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_4 10
+#define POWER_SLEEP_GATE_PLL_RECOVERY_CLOCK_2 11
+#define POWER_SLEEP_GATE_PLL_RECOVERY 14:13
+#define POWER_SLEEP_GATE_PLL_RECOVERY_32 0
+#define POWER_SLEEP_GATE_PLL_RECOVERY_64 1
+#define POWER_SLEEP_GATE_PLL_RECOVERY_96 2
+#define POWER_SLEEP_GATE_PLL_RECOVERY_128 3
+
+#define POWER_MODE_CTRL 0x000054
+#define POWER_MODE_CTRL_SLEEP_STATUS 2:2
+#define POWER_MODE_CTRL_SLEEP_STATUS_INACTIVE 0
+#define POWER_MODE_CTRL_SLEEP_STATUS_ACTIVE 1
+#define POWER_MODE_CTRL_MODE 1:0
+#define POWER_MODE_CTRL_MODE_MODE0 0
+#define POWER_MODE_CTRL_MODE_MODE1 1
+#define POWER_MODE_CTRL_MODE_SLEEP 2
+
+#define PCI_MASTER_BASE 0x000058
+#define PCI_MASTER_BASE_ADDRESS 31:20
+
+#define ENDIAN_CTRL 0x00005C
+#define ENDIAN_CTRL_ENDIAN 0:0
+#define ENDIAN_CTRL_ENDIAN_LITTLE 0
+#define ENDIAN_CTRL_ENDIAN_BIG 1
+
+#define DEVICE_ID 0x000060
+#define DEVICE_ID_DEVICE_ID 31:16
+#define DEVICE_ID_REVISION_ID 7:0
+
+#define PLL_CLOCK_COUNT 0x000064
+#define PLL_CLOCK_COUNT_COUNTER 15:0
+
+#define SYSTEM_DRAM_CTRL 0x000068
+#define SYSTEM_DRAM_CTRL_READ_DELAY 2:0
+#define SYSTEM_DRAM_CTRL_READ_DELAY_OFF 0
+#define SYSTEM_DRAM_CTRL_READ_DELAY_0_5NS 1
+#define SYSTEM_DRAM_CTRL_READ_DELAY_1NS 2
+#define SYSTEM_DRAM_CTRL_READ_DELAY_1_5NS 3
+#define SYSTEM_DRAM_CTRL_READ_DELAY_2NS 4
+#define SYSTEM_DRAM_CTRL_READ_DELAY_2_5NS 5
+
+#define PROGRAMMABLE_PLL_CONTROL 0x000074
+#define PROGRAMMABLE_PLL_CONTROL_TSTOE 20:20
+#define PROGRAMMABLE_PLL_CONTROL_TSTOE_DISABLE 0
+#define PROGRAMMABLE_PLL_CONTROL_TSTOE_ENABLE 1
+#define PROGRAMMABLE_PLL_CONTROL_TST 19:18
+#define PROGRAMMABLE_PLL_CONTROL_TST_0 0
+#define PROGRAMMABLE_PLL_CONTROL_TST_1 1
+#define PROGRAMMABLE_PLL_CONTROL_TST_2 2
+#define PROGRAMMABLE_PLL_CONTROL_TST_3 3
+#define PROGRAMMABLE_PLL_CONTROL_PON 17:17
+#define PROGRAMMABLE_PLL_CONTROL_PON_OFF 0
+#define PROGRAMMABLE_PLL_CONTROL_PON_ON 1
+#define PROGRAMMABLE_PLL_CONTROL_SEL 16:16
+#define PROGRAMMABLE_PLL_CONTROL_SEL_CRYSTAL 0
+#define PROGRAMMABLE_PLL_CONTROL_SEL_TCLK 1
+#define PROGRAMMABLE_PLL_CONTROL_K 15:15
+#define PROGRAMMABLE_PLL_CONTROL_K_DISABLE 0
+#define PROGRAMMABLE_PLL_CONTROL_K_ENABLE 1
+#define PROGRAMMABLE_PLL_CONTROL_N 14:8
+#define PROGRAMMABLE_PLL_CONTROL_M 7:0
+
+/*****************************************************************************\
+ * GPIO / PWM / I2C *
+\*****************************************************************************/
+
+/* GPIO[31:0] Data */
+#define GPIO_DATA_LOW 0x010000
+#define GPIO_DATA_LOW_LOW 0
+#define GPIO_DATA_LOW_HIGH 1
+#define GPIO_DATA_LOW_0 0:0
+#define GPIO_DATA_LOW_0_LOW 0
+#define GPIO_DATA_LOW_0_HIGH 1
+#define GPIO_DATA_LOW_1 1:1
+#define GPIO_DATA_LOW_1_LOW 0
+#define GPIO_DATA_LOW_1_HIGH 1
+#define GPIO_DATA_LOW_2 2:2
+#define GPIO_DATA_LOW_2_LOW 0
+#define GPIO_DATA_LOW_2_HIGH 1
+#define GPIO_DATA_LOW_3 3:3
+#define GPIO_DATA_LOW_3_LOW 0
+#define GPIO_DATA_LOW_3_HIGH 1
+#define GPIO_DATA_LOW_4 4:4
+#define GPIO_DATA_LOW_4_LOW 0
+#define GPIO_DATA_LOW_4_HIGH 1
+#define GPIO_DATA_LOW_5 5:5
+#define GPIO_DATA_LOW_5_LOW 0
+#define GPIO_DATA_LOW_5_HIGH 1
+#define GPIO_DATA_LOW_6 6:6
+#define GPIO_DATA_LOW_6_LOW 0
+#define GPIO_DATA_LOW_6_HIGH 1
+#define GPIO_DATA_LOW_7 7:7
+#define GPIO_DATA_LOW_7_LOW 0
+#define GPIO_DATA_LOW_7_HIGH 1
+#define GPIO_DATA_LOW_8 8:8
+#define GPIO_DATA_LOW_8_LOW 0
+#define GPIO_DATA_LOW_8_HIGH 1
+#define GPIO_DATA_LOW_9 9:9
+#define GPIO_DATA_LOW_9_LOW 0
+#define GPIO_DATA_LOW_9_HIGH 1
+#define GPIO_DATA_LOW_10 10:10
+#define GPIO_DATA_LOW_10_LOW 0
+#define GPIO_DATA_LOW_10_HIGH 1
+#define GPIO_DATA_LOW_11 11:11
+#define GPIO_DATA_LOW_11_LOW 0
+#define GPIO_DATA_LOW_11_HIGH 1
+#define GPIO_DATA_LOW_12 12:12
+#define GPIO_DATA_LOW_12_LOW 0
+#define GPIO_DATA_LOW_12_HIGH 1
+#define GPIO_DATA_LOW_13 13:13
+#define GPIO_DATA_LOW_13_LOW 0
+#define GPIO_DATA_LOW_13_HIGH 1
+#define GPIO_DATA_LOW_14 14:14
+#define GPIO_DATA_LOW_14_LOW 0
+#define GPIO_DATA_LOW_14_HIGH 1
+#define GPIO_DATA_LOW_15 15:15
+#define GPIO_DATA_LOW_15_LOW 0
+#define GPIO_DATA_LOW_15_HIGH 1
+#define GPIO_DATA_LOW_16 16:16
+#define GPIO_DATA_LOW_16_LOW 0
+#define GPIO_DATA_LOW_16_HIGH 1
+#define GPIO_DATA_LOW_17 17:17
+#define GPIO_DATA_LOW_17_LOW 0
+#define GPIO_DATA_LOW_17_HIGH 1
+#define GPIO_DATA_LOW_18 18:18
+#define GPIO_DATA_LOW_18_LOW 0
+#define GPIO_DATA_LOW_18_HIGH 1
+#define GPIO_DATA_LOW_19 19:19
+#define GPIO_DATA_LOW_19_LOW 0
+#define GPIO_DATA_LOW_19_HIGH 1
+#define GPIO_DATA_LOW_20 20:20
+#define GPIO_DATA_LOW_20_LOW 0
+#define GPIO_DATA_LOW_20_HIGH 1
+#define GPIO_DATA_LOW_21 21:21
+#define GPIO_DATA_LOW_21_LOW 0
+#define GPIO_DATA_LOW_21_HIGH 1
+#define GPIO_DATA_LOW_22 22:22
+#define GPIO_DATA_LOW_22_LOW 0
+#define GPIO_DATA_LOW_22_HIGH 1
+#define GPIO_DATA_LOW_23 23:23
+#define GPIO_DATA_LOW_23_LOW 0
+#define GPIO_DATA_LOW_23_HIGH 1
+#define GPIO_DATA_LOW_24 24:24
+#define GPIO_DATA_LOW_24_LOW 0
+#define GPIO_DATA_LOW_24_HIGH 1
+#define GPIO_DATA_LOW_25 25:25
+#define GPIO_DATA_LOW_25_LOW 0
+#define GPIO_DATA_LOW_25_HIGH 1
+#define GPIO_DATA_LOW_26 26:26
+#define GPIO_DATA_LOW_26_LOW 0
+#define GPIO_DATA_LOW_26_HIGH 1
+#define GPIO_DATA_LOW_27 27:27
+#define GPIO_DATA_LOW_27_LOW 0
+#define GPIO_DATA_LOW_27_HIGH 1
+#define GPIO_DATA_LOW_28 28:28
+#define GPIO_DATA_LOW_28_LOW 0
+#define GPIO_DATA_LOW_28_HIGH 1
+#define GPIO_DATA_LOW_29 29:29
+#define GPIO_DATA_LOW_29_LOW 0
+#define GPIO_DATA_LOW_29_HIGH 1
+#define GPIO_DATA_LOW_30 30:30
+#define GPIO_DATA_LOW_30_LOW 0
+#define GPIO_DATA_LOW_30_HIGH 1
+#define GPIO_DATA_LOW_31 31:31
+#define GPIO_DATA_LOW_31_LOW 0
+#define GPIO_DATA_LOW_31_HIGH 1
+
+/* GPIO[63:32] Data */
+#define GPIO_DATA_HIGH 0x010004
+#define GPIO_DATA_HIGH_LOW 0
+#define GPIO_DATA_HIGH_HIGH 1
+#define GPIO_DATA_HIGH_32 0:0
+#define GPIO_DATA_HIGH_32_LOW 0
+#define GPIO_DATA_HIGH_32_HIGH 1
+#define GPIO_DATA_HIGH_33 1:1
+#define GPIO_DATA_HIGH_33_LOW 0
+#define GPIO_DATA_HIGH_33_HIGH 1
+#define GPIO_DATA_HIGH_34 2:2
+#define GPIO_DATA_HIGH_34_LOW 0
+#define GPIO_DATA_HIGH_34_HIGH 1
+#define GPIO_DATA_HIGH_35 3:3
+#define GPIO_DATA_HIGH_35_LOW 0
+#define GPIO_DATA_HIGH_35_HIGH 1
+#define GPIO_DATA_HIGH_36 4:4
+#define GPIO_DATA_HIGH_36_LOW 0
+#define GPIO_DATA_HIGH_36_HIGH 1
+#define GPIO_DATA_HIGH_37 5:5
+#define GPIO_DATA_HIGH_37_LOW 0
+#define GPIO_DATA_HIGH_37_HIGH 1
+#define GPIO_DATA_HIGH_38 6:6
+#define GPIO_DATA_HIGH_38_LOW 0
+#define GPIO_DATA_HIGH_38_HIGH 1
+#define GPIO_DATA_HIGH_39 7:7
+#define GPIO_DATA_HIGH_39_LOW 0
+#define GPIO_DATA_HIGH_39_HIGH 1
+#define GPIO_DATA_HIGH_40 8:8
+#define GPIO_DATA_HIGH_40_LOW 0
+#define GPIO_DATA_HIGH_40_HIGH 1
+#define GPIO_DATA_HIGH_41 9:9
+#define GPIO_DATA_HIGH_41_LOW 0
+#define GPIO_DATA_HIGH_41_HIGH 1
+#define GPIO_DATA_HIGH_42 10:10
+#define GPIO_DATA_HIGH_42_LOW 0
+#define GPIO_DATA_HIGH_42_HIGH 1
+#define GPIO_DATA_HIGH_43 11:11
+#define GPIO_DATA_HIGH_43_LOW 0
+#define GPIO_DATA_HIGH_43_HIGH 1
+#define GPIO_DATA_HIGH_44 12:12
+#define GPIO_DATA_HIGH_44_LOW 0
+#define GPIO_DATA_HIGH_44_HIGH 1
+#define GPIO_DATA_HIGH_45 13:13
+#define GPIO_DATA_HIGH_45_LOW 0
+#define GPIO_DATA_HIGH_45_HIGH 1
+#define GPIO_DATA_HIGH_46 14:14
+#define GPIO_DATA_HIGH_46_LOW 0
+#define GPIO_DATA_HIGH_46_HIGH 1
+#define GPIO_DATA_HIGH_47 15:15
+#define GPIO_DATA_HIGH_47_LOW 0
+#define GPIO_DATA_HIGH_47_HIGH 1
+#define GPIO_DATA_HIGH_48 16:16
+#define GPIO_DATA_HIGH_48_LOW 0
+#define GPIO_DATA_HIGH_48_HIGH 1
+#define GPIO_DATA_HIGH_49 17:17
+#define GPIO_DATA_HIGH_49_LOW 0
+#define GPIO_DATA_HIGH_49_HIGH 1
+#define GPIO_DATA_HIGH_50 18:18
+#define GPIO_DATA_HIGH_50_LOW 0
+#define GPIO_DATA_HIGH_50_HIGH 1
+#define GPIO_DATA_HIGH_51 19:19
+#define GPIO_DATA_HIGH_51_LOW 0
+#define GPIO_DATA_HIGH_51_HIGH 1
+#define GPIO_DATA_HIGH_52 20:20
+#define GPIO_DATA_HIGH_52_LOW 0
+#define GPIO_DATA_HIGH_52_HIGH 1
+#define GPIO_DATA_HIGH_53 21:21
+#define GPIO_DATA_HIGH_53_LOW 0
+#define GPIO_DATA_HIGH_53_HIGH 1
+#define GPIO_DATA_HIGH_54 22:22
+#define GPIO_DATA_HIGH_54_LOW 0
+#define GPIO_DATA_HIGH_54_HIGH 1
+#define GPIO_DATA_HIGH_55 23:23
+#define GPIO_DATA_HIGH_55_LOW 0
+#define GPIO_DATA_HIGH_55_HIGH 1
+#define GPIO_DATA_HIGH_56 24:24
+#define GPIO_DATA_HIGH_56_LOW 0
+#define GPIO_DATA_HIGH_56_HIGH 1
+#define GPIO_DATA_HIGH_57 25:25
+#define GPIO_DATA_HIGH_57_LOW 0
+#define GPIO_DATA_HIGH_57_HIGH 1
+#define GPIO_DATA_HIGH_58 26:26
+#define GPIO_DATA_HIGH_58_LOW 0
+#define GPIO_DATA_HIGH_58_HIGH 1
+#define GPIO_DATA_HIGH_59 27:27
+#define GPIO_DATA_HIGH_59_LOW 0
+#define GPIO_DATA_HIGH_59_HIGH 1
+#define GPIO_DATA_HIGH_60 28:28
+#define GPIO_DATA_HIGH_60_LOW 0
+#define GPIO_DATA_HIGH_60_HIGH 1
+#define GPIO_DATA_HIGH_61 29:29
+#define GPIO_DATA_HIGH_61_LOW 0
+#define GPIO_DATA_HIGH_61_HIGH 1
+#define GPIO_DATA_HIGH_62 30:30
+#define GPIO_DATA_HIGH_62_LOW 0
+#define GPIO_DATA_HIGH_62_HIGH 1
+#define GPIO_DATA_HIGH_63 31:31
+#define GPIO_DATA_HIGH_63_LOW 0
+#define GPIO_DATA_HIGH_63_HIGH 1
+
+/* GPIO[31:0] Data Direction */
+#define GPIO_DATA_DIRECTION_LOW 0x010008
+#define GPIO_DATA_DIRECTION_LOW_31 31:31
+#define GPIO_DATA_DIRECTION_LOW_31_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_31_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_30 30:30
+#define GPIO_DATA_DIRECTION_LOW_30_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_30_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_29 29:29
+#define GPIO_DATA_DIRECTION_LOW_29_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_29_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_28 28:28
+#define GPIO_DATA_DIRECTION_LOW_28_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_28_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_27 27:27
+#define GPIO_DATA_DIRECTION_LOW_27_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_27_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_26 26:26
+#define GPIO_DATA_DIRECTION_LOW_26_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_26_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_25 25:25
+#define GPIO_DATA_DIRECTION_LOW_25_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_25_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_24 24:24
+#define GPIO_DATA_DIRECTION_LOW_24_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_24_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_23 23:23
+#define GPIO_DATA_DIRECTION_LOW_23_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_23_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_22 22:22
+#define GPIO_DATA_DIRECTION_LOW_22_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_22_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_21 21:21
+#define GPIO_DATA_DIRECTION_LOW_21_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_21_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_20 20:20
+#define GPIO_DATA_DIRECTION_LOW_20_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_20_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_19 19:19
+#define GPIO_DATA_DIRECTION_LOW_19_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_19_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_18 18:18
+#define GPIO_DATA_DIRECTION_LOW_18_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_18_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_17 17:17
+#define GPIO_DATA_DIRECTION_LOW_17_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_17_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_16 16:16
+#define GPIO_DATA_DIRECTION_LOW_16_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_16_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_15 15:15
+#define GPIO_DATA_DIRECTION_LOW_15_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_15_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_14 14:14
+#define GPIO_DATA_DIRECTION_LOW_14_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_14_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_13 13:13
+#define GPIO_DATA_DIRECTION_LOW_13_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_13_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_12 12:12
+#define GPIO_DATA_DIRECTION_LOW_12_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_12_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_11 11:11
+#define GPIO_DATA_DIRECTION_LOW_11_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_11_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_10 10:10
+#define GPIO_DATA_DIRECTION_LOW_10_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_10_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_9 9:9
+#define GPIO_DATA_DIRECTION_LOW_9_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_9_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_8 8:8
+#define GPIO_DATA_DIRECTION_LOW_8_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_8_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_7 7:7
+#define GPIO_DATA_DIRECTION_LOW_7_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_7_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_6 6:6
+#define GPIO_DATA_DIRECTION_LOW_6_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_6_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_5 5:5
+#define GPIO_DATA_DIRECTION_LOW_5_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_5_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_4 4:4
+#define GPIO_DATA_DIRECTION_LOW_4_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_4_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_3 3:3
+#define GPIO_DATA_DIRECTION_LOW_3_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_3_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_2 2:2
+#define GPIO_DATA_DIRECTION_LOW_2_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_2_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_1 131
+#define GPIO_DATA_DIRECTION_LOW_1_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_1_OUTPUT 1
+#define GPIO_DATA_DIRECTION_LOW_0 0:0
+#define GPIO_DATA_DIRECTION_LOW_0_INPUT 0
+#define GPIO_DATA_DIRECTION_LOW_0_OUTPUT 1
+
+/* GPIO[63:32] Data Direction */
+#define GPIO_DATA_DIRECTION_HIGH 0x01000C
+#define GPIO_DATA_DIRECTION_HIGH_63 31:31
+#define GPIO_DATA_DIRECTION_HIGH_63_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_63_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_62 30:30
+#define GPIO_DATA_DIRECTION_HIGH_62_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_62_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_61 29:29
+#define GPIO_DATA_DIRECTION_HIGH_61_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_61_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_60 28:28
+#define GPIO_DATA_DIRECTION_HIGH_60_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_60_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_59 27:27
+#define GPIO_DATA_DIRECTION_HIGH_59_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_59_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_58 26:26
+#define GPIO_DATA_DIRECTION_HIGH_58_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_58_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_57 25:25
+#define GPIO_DATA_DIRECTION_HIGH_57_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_57_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_56 24:24
+#define GPIO_DATA_DIRECTION_HIGH_56_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_56_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_55 23:23
+#define GPIO_DATA_DIRECTION_HIGH_55_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_55_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_54 22:22
+#define GPIO_DATA_DIRECTION_HIGH_54_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_54_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_53 21:21
+#define GPIO_DATA_DIRECTION_HIGH_53_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_53_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_52 20:20
+#define GPIO_DATA_DIRECTION_HIGH_52_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_52_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_51 19:19
+#define GPIO_DATA_DIRECTION_HIGH_51_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_51_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_50 18:18
+#define GPIO_DATA_DIRECTION_HIGH_50_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_50_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_49 17:17
+#define GPIO_DATA_DIRECTION_HIGH_49_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_49_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_48 16:16
+#define GPIO_DATA_DIRECTION_HIGH_48_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_48_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_47 15:15
+#define GPIO_DATA_DIRECTION_HIGH_47_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_47_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_46 14:14
+#define GPIO_DATA_DIRECTION_HIGH_46_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_46_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_45 13:13
+#define GPIO_DATA_DIRECTION_HIGH_45_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_45_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_44 12:12
+#define GPIO_DATA_DIRECTION_HIGH_44_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_44_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_43 11:11
+#define GPIO_DATA_DIRECTION_HIGH_43_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_43_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_42 10:10
+#define GPIO_DATA_DIRECTION_HIGH_42_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_42_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_41 9:9
+#define GPIO_DATA_DIRECTION_HIGH_41_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_41_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_40 8:8
+#define GPIO_DATA_DIRECTION_HIGH_40_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_40_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_39 7:7
+#define GPIO_DATA_DIRECTION_HIGH_39_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_39_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_38 6:6
+#define GPIO_DATA_DIRECTION_HIGH_38_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_38_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_37 5:5
+#define GPIO_DATA_DIRECTION_HIGH_37_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_37_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_36 4:4
+#define GPIO_DATA_DIRECTION_HIGH_36_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_36_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_35 3:3
+#define GPIO_DATA_DIRECTION_HIGH_35_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_35_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_34 2:2
+#define GPIO_DATA_DIRECTION_HIGH_34_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_34_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_33 1:1
+#define GPIO_DATA_DIRECTION_HIGH_33_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_33_OUTPUT 1
+#define GPIO_DATA_DIRECTION_HIGH_32 0:0
+#define GPIO_DATA_DIRECTION_HIGH_32_INPUT 0
+#define GPIO_DATA_DIRECTION_HIGH_32_OUTPUT 1
+
+/* GPIO Interrupt Setup */
+#define GPIO_INTERRUPT_SETUP 0x010010
+#define GPIO_INTERRUPT_SETUP_TRIGGER_54 22:22
+#define GPIO_INTERRUPT_SETUP_TRIGGER_54_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_54_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_53 21:21
+#define GPIO_INTERRUPT_SETUP_TRIGGER_53_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_53_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_52 20:20
+#define GPIO_INTERRUPT_SETUP_TRIGGER_52_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_52_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_51 19:19
+#define GPIO_INTERRUPT_SETUP_TRIGGER_51_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_51_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_50 18:18
+#define GPIO_INTERRUPT_SETUP_TRIGGER_50_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_50_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_49 17:17
+#define GPIO_INTERRUPT_SETUP_TRIGGER_49_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_49_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_TRIGGER_48 16:16
+#define GPIO_INTERRUPT_SETUP_TRIGGER_48_EDGE 0
+#define GPIO_INTERRUPT_SETUP_TRIGGER_48_LEVEL 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_54 14:14
+#define GPIO_INTERRUPT_SETUP_ACTIVE_54_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_54_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_53 13:13
+#define GPIO_INTERRUPT_SETUP_ACTIVE_53_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_53_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_52 12:12
+#define GPIO_INTERRUPT_SETUP_ACTIVE_52_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_52_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_51 11:11
+#define GPIO_INTERRUPT_SETUP_ACTIVE_51_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_51_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_50 10:10
+#define GPIO_INTERRUPT_SETUP_ACTIVE_50_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_50_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_49 9:9
+#define GPIO_INTERRUPT_SETUP_ACTIVE_49_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_49_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ACTIVE_48 8:8
+#define GPIO_INTERRUPT_SETUP_ACTIVE_48_LOW_FALLING_EDGE 0
+#define GPIO_INTERRUPT_SETUP_ACTIVE_48_HIGH_RISING_EDGE 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_54 6:6
+#define GPIO_INTERRUPT_SETUP_ENABLE_54_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_54_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_53 5:5
+#define GPIO_INTERRUPT_SETUP_ENABLE_53_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_53_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_52 4:4
+#define GPIO_INTERRUPT_SETUP_ENABLE_52_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_52_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_51 3:3
+#define GPIO_INTERRUPT_SETUP_ENABLE_51_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_51_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_50 2:2
+#define GPIO_INTERRUPT_SETUP_ENABLE_50_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_50_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_49 1:1
+#define GPIO_INTERRUPT_SETUP_ENABLE_49_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_49_INTERRUPT 1
+#define GPIO_INTERRUPT_SETUP_ENABLE_48 0:0
+#define GPIO_INTERRUPT_SETUP_ENABLE_48_INPUT_OUTPUT 0
+#define GPIO_INTERRUPT_SETUP_ENABLE_48_INTERRUPT 1
+
+/* GPIO Interrupt Status & Reset */
+#define GPIO_INTERRUPT_STATUS 0x010014
+#define GPIO_INTERRUPT_STATUS_54 22:22
+#define GPIO_INTERRUPT_STATUS_54_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_54_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_54_RESET 1
+#define GPIO_INTERRUPT_STATUS_53 21:21
+#define GPIO_INTERRUPT_STATUS_53_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_53_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_53_RESET 1
+#define GPIO_INTERRUPT_STATUS_52 20:20
+#define GPIO_INTERRUPT_STATUS_52_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_52_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_52_RESET 1
+#define GPIO_INTERRUPT_STATUS_51 19:19
+#define GPIO_INTERRUPT_STATUS_51_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_51_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_51_RESET 1
+#define GPIO_INTERRUPT_STATUS_50 18:18
+#define GPIO_INTERRUPT_STATUS_50_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_50_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_50_RESET 1
+#define GPIO_INTERRUPT_STATUS_49 17:17
+#define GPIO_INTERRUPT_STATUS_49_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_49_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_49_RESET 1
+#define GPIO_INTERRUPT_STATUS_48 16:16
+#define GPIO_INTERRUPT_STATUS_48_NOT_ACTIVE 0
+#define GPIO_INTERRUPT_STATUS_48_ACTIVE 1
+#define GPIO_INTERRUPT_STATUS_48_RESET 1
+
+/* PWM 0 */
+#define PWM0 0x010020
+#define PWM0_HIGH_COUNTER 31:20
+#define PWM0_LOW_COUNTER 19:8
+#define PWM0_CLOCK_DIVIDE 7:4
+#define PWM0_CLOCK_DIVIDE_1 0
+#define PWM0_CLOCK_DIVIDE_2 1
+#define PWM0_CLOCK_DIVIDE_4 2
+#define PWM0_CLOCK_DIVIDE_8 3
+#define PWM0_CLOCK_DIVIDE_16 4
+#define PWM0_CLOCK_DIVIDE_32 5
+#define PWM0_CLOCK_DIVIDE_64 6
+#define PWM0_CLOCK_DIVIDE_128 7
+#define PWM0_CLOCK_DIVIDE_256 8
+#define PWM0_CLOCK_DIVIDE_512 9
+#define PWM0_CLOCK_DIVIDE_1024 10
+#define PWM0_CLOCK_DIVIDE_2048 11
+#define PWM0_CLOCK_DIVIDE_4096 12
+#define PWM0_CLOCK_DIVIDE_8192 13
+#define PWM0_CLOCK_DIVIDE_16384 14
+#define PWM0_CLOCK_DIVIDE_32768 15
+#define PWM0_INTERRUPT_STATUS 3:3
+#define PWM0_INTERRUPT_STATUS_NOT_ACTIVE 0
+#define PWM0_INTERRUPT_STATUS_ACTIVE 1
+#define PWM0_INTERRUPT_CONTROL 2:2
+#define PWM0_INTERRUPT_CONTROL_DISABLE 0
+#define PWM0_INTERRUPT_CONTROL_ENABLE 1
+#define PWM0_CONTROL 0:0
+#define PWM0_CONTROL_DISABLE 0
+#define PWM0_CONTROL_ENABLE 1
+
+/* PWM 1 */
+#define PWM1 0x010024
+#define PWM1_HIGH_COUNTER 31:20
+#define PWM1_LOW_COUNTER 19:8
+#define PWM1_CLOCK_DIVIDE 7:4
+#define PWM1_CLOCK_DIVIDE_1 0
+#define PWM1_CLOCK_DIVIDE_2 1
+#define PWM1_CLOCK_DIVIDE_4 2
+#define PWM1_CLOCK_DIVIDE_8 3
+#define PWM1_CLOCK_DIVIDE_16 4
+#define PWM1_CLOCK_DIVIDE_32 5
+#define PWM1_CLOCK_DIVIDE_64 6
+#define PWM1_CLOCK_DIVIDE_128 7
+#define PWM1_CLOCK_DIVIDE_256 8
+#define PWM1_CLOCK_DIVIDE_512 9
+#define PWM1_CLOCK_DIVIDE_1024 10
+#define PWM1_CLOCK_DIVIDE_2048 11
+#define PWM1_CLOCK_DIVIDE_4096 12
+#define PWM1_CLOCK_DIVIDE_8192 13
+#define PWM1_CLOCK_DIVIDE_16384 14
+#define PWM1_CLOCK_DIVIDE_32768 15
+#define PWM1_INTERRUPT_STATUS 3:3
+#define PWM1_INTERRUPT_STATUS_NOT_ACTIVE 0
+#define PWM1_INTERRUPT_STATUS_ACTIVE 1
+#define PWM1_INTERRUPT_CONTROL 2:2
+#define PWM1_INTERRUPT_CONTROL_DISABLE 0
+#define PWM1_INTERRUPT_CONTROL_ENABLE 1
+#define PWM1_CONTROL 0:0
+#define PWM1_CONTROL_DISABLE 0
+#define PWM1_CONTROL_ENABLE 1
+
+/* PWM 2 */
+#define PWM2 0x010028
+#define PWM2_HIGH_COUNTER 31:20
+#define PWM2_LOW_COUNTER 19:8
+#define PWM2_CLOCK_DIVIDE 7:4
+#define PWM2_CLOCK_DIVIDE_1 0
+#define PWM2_CLOCK_DIVIDE_2 1
+#define PWM2_CLOCK_DIVIDE_4 2
+#define PWM2_CLOCK_DIVIDE_8 3
+#define PWM2_CLOCK_DIVIDE_16 4
+#define PWM2_CLOCK_DIVIDE_32 5
+#define PWM2_CLOCK_DIVIDE_64 6
+#define PWM2_CLOCK_DIVIDE_128 7
+#define PWM2_CLOCK_DIVIDE_256 8
+#define PWM2_CLOCK_DIVIDE_512 9
+#define PWM2_CLOCK_DIVIDE_1024 10
+#define PWM2_CLOCK_DIVIDE_2048 11
+#define PWM2_CLOCK_DIVIDE_4096 12
+#define PWM2_CLOCK_DIVIDE_8192 13
+#define PWM2_CLOCK_DIVIDE_16384 14
+#define PWM2_CLOCK_DIVIDE_32768 15
+#define PWM2_INTERRUPT_STATUS 3:3
+#define PWM2_INTERRUPT_STATUS_NOT_ACTIVE 0
+#define PWM2_INTERRUPT_STATUS_ACTIVE 1
+#define PWM2_INTERRUPT_CONTROL 2:2
+#define PWM2_INTERRUPT_CONTROL_DISABLE 0
+#define PWM2_INTERRUPT_CONTROL_ENABLE 1
+#define PWM2_CONTROL 0:0
+#define PWM2_CONTROL_DISABLE 0
+#define PWM2_CONTROL_ENABLE 1
+
+/* I2C Byte Count */
+#define I2C_BYTE_COUNT 0x010040
+#define I2C_BYTE_COUNT_COUNT 3:0
+
+/* I2C Control */
+#define I2C_CONTROL 0x010041
+#define I2C_CONTROL_REPEAT 6:6
+#define I2C_CONTROL_REPEAT_DISABLE 0
+#define I2C_CONTROL_REPEAT_ENABLE 1
+#define I2C_CONTROL_INTERRUPT 5:5
+#define I2C_CONTROL_INTERRUPT_NOT_ACKNOWLEDGE 0
+#define I2C_CONTROL_INTERRUPT_ACKNOWLEDGE 1
+#define I2C_CONTROL_INTERRUPT_CONTROL 4:4
+#define I2C_CONTROL_INTERRUPT_CONTROL_ENABLE 1
+#define I2C_CONTROL_INTERRUPT_CONTROL_DISABLE 0
+#define I2C_CONTROL_STATUS 2:2
+#define I2C_CONTROL_STATUS_STOP 0
+#define I2C_CONTROL_STATUS_START 1
+#define I2C_CONTROL_MODE 1:1
+#define I2C_CONTROL_MODE_STANDARD 0
+#define I2C_CONTROL_MODE_FAST 1
+#define I2C_CONTROL_CONTROL 0:0
+#define I2C_CONTROL_CONTROL_DISABLE 0
+#define I2C_CONTROL_CONTROL_ENABLE 1
+
+/* I2C Status & Reset */
+#define I2C_STATUS 0x010042
+#define I2C_STATUS_TRANSFER 3:3
+#define I2C_STATUS_TRANSFER_IN_PROGRESS 0
+#define I2C_STATUS_TRANSFER_COMPLETED 1
+#define I2C_STATUS_ERROR 2:2
+#define I2C_STATUS_ERROR_NORMAL 0
+#define I2C_STATUS_ERROR_BUS_ERROR 1
+#define I2C_STATUS_ERROR_CLEAR 0
+#define I2C_STATUS_ACKNOWLEDGE 1:1
+#define I2C_STATUS_ACKNOWLEDGE_NOT_RECEIVED 0
+#define I2C_STATUS_ACKNOWLEDGE_RECEIVED 1
+#define I2C_STATUS_BUSY 0:0
+#define I2C_STATUS_BUSY_IDLE 0
+#define I2C_STATUS_BUSY_BUSY 1
+
+/* I2C Slave Address */
+#define I2C_SLAVE_ADDRESS 0x010043
+#define I2C_SLAVE_ADDRESS_ADDRESS 7:1
+#define I2C_SLAVE_ADDRESS_ACCESS 0:0
+#define I2C_SLAVE_ADDRESS_ACCESS_WRITE 0
+#define I2C_SLAVE_ADDRESS_ACCESS_READ 1
+
+/* I2C Data */
+#define I2C_DATA_0 0x010044
+#define I2C_DATA_1 0x010045
+#define I2C_DATA_2 0x010046
+#define I2C_DATA_3 0x010047
+#define I2C_DATA_4 0x010048
+#define I2C_DATA_5 0x010049
+#define I2C_DATA_6 0x01004A
+#define I2C_DATA_7 0x01004B
+#define I2C_DATA_8 0x01004C
+#define I2C_DATA_9 0x01004D
+#define I2C_DATA_10 0x01004E
+#define I2C_DATA_11 0x01004F
+#define I2C_DATA_12 0x010050
+#define I2C_DATA_13 0x010051
+#define I2C_DATA_14 0x010052
+#define I2C_DATA_15 0x010053
+
+
+/*****************************************************************************\
+ * SSP *
+\*****************************************************************************/
+
+/* TBD */
+
+
+/*****************************************************************************\
+ * UART / IRDA *
+\*****************************************************************************/
+/*****************************************************************************\
+ * *
+ * REGISTER DESCRIPTION *
+ * |========|======|================================|==============| *
+ * | Offset | DLAB | Register Name | Comment | *
+ * |========|======|================================|==============| *
+ * | 0x00 | 0 | RX Buffer Register | RO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x00 | 0 | TX Holding Register | WO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x04 | 0 | Interrupt Enable Register | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x08 | X | Interrupt Identification Reg. | RO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x08 | X | FIFO Control Register | WO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x0C | X | Line Control Register | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x10 | X | Modem Control Register | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x14 | X | Line Status Register | RO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x18 | X | Modem Status Register | Partially RO | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x1C | X | Scratch Register | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x00 | 1 | Divisor Latch (LSB) | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x04 | 1 | Divisor Latch (MSB) | R/W | *
+ * |--------|------|--------------------------------|--------------| *
+ * | 0x08 | 1 | Enhanced Feature Register | | *
+ * |--------|------|--------------------------------| | *
+ * | 0x0C | 1 | XON1 Register | R/W | *
+ * |--------|------|--------------------------------| Only | *
+ * | 0x10 | 1 | XON2 Register | present | *
+ * |--------|------|--------------------------------| when | *
+ * | 0x14 | 1 | XOFF1 Register | LCR = 0xBF | *
+ * |--------|------|--------------------------------| | *
+ * | 0x18 | 1 | XOFF2 Register | | *
+ * |========|======|================================|==============| *
+ * *
+ * NOTES: *
+ * X = Don't Care *
+ * RO = Read Only *
+ * WO = Write Only *
+ * R/W = Read/Write *
+ * *
+\*****************************************************************************/
+
+
+/*****************************************************************************\
+ * UART 0 *
+\*****************************************************************************/
+
+/* UART 0 when DLAB = 0 (normal mode), LCR != 0xBF */
+
+#define UART_0_RECEIVE_BUFFER 0x030000
+#define UART_0_RECEIVE_BUFFER_DATA 7:0
+
+#define UART_0_TRANSMIT 0x030000
+#define UART_0_TRANSMIT_DATA 7:0
+
+#define UART_0_INTERRUPT 0x030004
+#define UART_0_INTERRUPT_CTS 7:7
+#define UART_0_INTERRUPT_CTS_DISABLE 0
+#define UART_0_INTERRUPT_CTS_ENABLE 1
+#define UART_0_INTERRUPT_RTS 6:6
+#define UART_0_INTERRUPT_RTS_DISABLE 0
+#define UART_0_INTERRUPT_RTS_ENABLE 1
+#define UART_0_INTERRUPT_XOFF 5:5
+#define UART_0_INTERRUPT_XOFF_DISABLE 0
+#define UART_0_INTERRUPT_XOFF_ENABLE 1
+#define UART_0_INTERRUPT_MODEM_STATUS 3:3
+#define UART_0_INTERRUPT_MODEM_STATUS_DISABLE 0
+#define UART_0_INTERRUPT_MODEM_STATUS_ENABLE 1
+#define UART_0_INTERRUPT_LINE_STATUS 2:2
+#define UART_0_INTERRUPT_LINE_STATUS_DISABLE 0
+#define UART_0_INTERRUPT_LINE_STATUS_ENABLE 1
+#define UART_0_INTERRUPT_TX_EMPTY 1:1
+#define UART_0_INTERRUPT_TX_EMPTY_DISABLE 0
+#define UART_0_INTERRUPT_TX_EMPTY_ENABLE 1
+#define UART_0_INTERRUPT_RX_BUFFER 0:0
+#define UART_0_INTERRUPT_RX_BUFFER_DISABLE 0
+#define UART_0_INTERRUPT_RX_BUFFER_ENABLE 1
+
+
+/* UART 0 when DLAB = 1 (configuration mode), LCR != 0xBF */
+
+#define UART_0_DIVISOR_LATCH_LSB 0x030000
+#define UART_0_DIVISOR_LATCH_LSB_VALUE 7:0
+
+#define UART_0_DIVISOR_LATCH_MSB 0x030004
+#define UART_0_DIVISOR_LATCH_MSB_VALUE 7:0
+
+
+/* UART 0 when DLAB = X (don't care), LCR != 0xBF */
+
+#define UART_0_STATUS 0x030008
+#define UART_0_STATUS_FIFO 7:6
+#define UART_0_STATUS_FIFO_DISABLE 0
+#define UART_0_STATUS_FIFO_ENABLE 3
+#define UART_0_STATUS_INTERRUPT 5:1
+#define UART_0_STATUS_INTERRUPT_MODEM_STATUS_CHANGE 0
+#define UART_0_STATUS_INTERRUPT_TX_EMPTY 1
+#define UART_0_STATUS_INTERRUPT_RX_DATA_RECEIVED 2
+#define UART_0_STATUS_INTERRUPT_LINE_STATUS 3
+#define UART_0_STATUS_INTERRUPT_RX_CHAR_TIMEOUT 6
+#define UART_0_STATUS_INTERRUPT_XOFF_RECEIVED 8
+#define UART_0_STATUS_INTERRUPT_CTS_RTS 16
+#define UART_0_STATUS_INTERRUPT_PENDING 1:1
+#define UART_0_STATUS_INTERRUPT_PENDING_YES 0
+#define UART_0_STATUS_INTERRUPT_PENDING_NO 1
+
+#define UART_0_FIFO 0x030008
+#define UART_0_FIFO_RX_TRIGGER 7:6
+#define UART_0_FIFO_RX_TRIGGER_DEFAULT 0
+#define UART_0_FIFO_RX_TRIGGER_QUARTER 1
+#define UART_0_FIFO_RX_TRIGGER_HALF 2
+#define UART_0_FIFO_RX_TRIGGER_MINUS_2 3
+#define UART_0_FIFO_TX_TRIGGER 5:4
+#define UART_0_FIFO_TX_TRIGGER_DEFAULT 0
+#define UART_0_FIFO_TX_TRIGGER_QUARTER 1
+#define UART_0_FIFO_TX_TRIGGER_HALF 2
+#define UART_0_FIFO_TX_TRIGGER_MINUS_2 3
+#define UART_0_FIFO_DMA_MODE 3:3
+#define UART_0_FIFO_DMA_MODE_ZERO 0
+#define UART_0_FIFO_DMA_MODE_ONE 1
+#define UART_0_FIFO_TX_CLEAR 2:2
+#define UART_0_FIFO_TX_CLEAR_NO 0
+#define UART_0_FIFO_TX_CLEAR_CLEAR 1
+#define UART_0_FIFO_RX_CLEAR 1:1
+#define UART_0_FIFO_RX_CLEAR_NO 0
+#define UART_0_FIFO_RX_CLEAR_CLEAR 1
+#define UART_0_FIFO_ENABLE 0:0
+#define UART_0_FIFO_ENABLE_DISABLE 0
+#define UART_0_FIFO_ENABLE_ENABLE 1
+
+#define UART_0_LINE_CTRL 0x03000C
+#define UART_0_LINE_CTRL_ENHANCED 7:0
+#define UART_0_LINE_CTRL_ENHANCED_ENABLE 0xBF
+#define UART_0_LINE_CTRL_DLAB 7:7
+#define UART_0_LINE_CTRL_DLAB_RESET 0
+#define UART_0_LINE_CTRL_DLAB_SET 1
+#define UART_0_LINE_CTRL_LINE_BREAK 6:6
+#define UART_0_LINE_CTRL_LINE_BREAK_RESET 0
+#define UART_0_LINE_CTRL_LINE_BREAK_SET 1
+#define UART_0_LINE_CTRL_PARITY 5:3
+#define UART_0_LINE_CTRL_PARITY_DISABLE 0
+#define UART_0_LINE_CTRL_PARITY_ODD 1
+#define UART_0_LINE_CTRL_PARITY_EVEN 3
+#define UART_0_LINE_CTRL_PARITY_MARK 5
+#define UART_0_LINE_CTRL_PARITY_SPACE 7
+#define UART_0_LINE_CTRL_STOPBITS 2:2
+#define UART_0_LINE_CTRL_STOPBITS_ONE 0
+#define UART_0_LINE_CTRL_STOPBITS_TWO 1
+#define UART_0_LINE_CTRL_CHARSIZE 1:0
+#define UART_0_LINE_CTRL_CHARSIZE_5 0
+#define UART_0_LINE_CTRL_CHARSIZE_6 1
+#define UART_0_LINE_CTRL_CHARSIZE_7 2
+#define UART_0_LINE_CTRL_CHARSIZE_8 3
+
+#define UART_0_MODEM_CTRL 0x030010
+#define UART_0_MODEM_CTRL_XOFF_STATUS 7:7
+#define UART_0_MODEM_CTRL_XOFF_STATUS_XON 0
+#define UART_0_MODEM_CTRL_XOFF_STATUS_XOFF 1
+#define UART_0_MODEM_CTRL_INFRARED 6:6
+#define UART_0_MODEM_CTRL_INFRARED_DISABLE 0
+#define UART_0_MODEM_CTRL_INFRARED_ENABLE 1
+#define UART_0_MODEM_CTRL_LOOPBACK 4:4
+#define UART_0_MODEM_CTRL_LOOPBACK_DISABLE 0
+#define UART_0_MODEM_CTRL_LOOPBACK_ENABLE 1
+#define UART_0_MODEM_CTRL_OUT2 3:3
+#define UART_0_MODEM_CTRL_OUT2_RESET 0
+#define UART_0_MODEM_CTRL_OUT2_SET 1
+#define UART_0_MODEM_CTRL_OUT1 2:2
+#define UART_0_MODEM_CTRL_OUT1_RESET 0
+#define UART_0_MODEM_CTRL_OUT1_SET 1
+#define UART_0_MODEM_CTRL_RTS 1:1
+#define UART_0_MODEM_CTRL_RTS_RESET 0
+#define UART_0_MODEM_CTRL_RTS_SET 1
+#define UART_0_MODEM_CTRL_DTR 0:0
+#define UART_0_MODEM_CTRL_DTR_RESET 0
+#define UART_0_MODEM_CTRL_DTR_SET 1
+
+#define UART_0_LINE_STATUS 0x030014
+#define UART_0_LINE_STATUS_RX_FIFO 7:7
+#define UART_0_LINE_STATUS_RX_FIFO_NO_ERROR 0
+#define UART_0_LINE_STATUS_RX_FIFO_ERROR 1
+#define UART_0_LINE_STATUS_TRANSMITTER 6:6
+#define UART_0_LINE_STATUS_TRANSMITTER_NOT_EMPTY 0
+#define UART_0_LINE_STATUS_TRANSMITTER_EMPTY 1
+#define UART_0_LINE_STATUS_TX_HOLDING 5:5
+#define UART_0_LINE_STATUS_TX_HOLDING_NOT_EMPTY 0
+#define UART_0_LINE_STATUS_TX_HOLDING_EMPTY 1
+#define UART_0_LINE_STATUS_BREAK 4:4
+#define UART_0_LINE_STATUS_BREAK_NO_BREAK 0
+#define UART_0_LINE_STATUS_BREAK_BREAK 1
+#define UART_0_LINE_STATUS_FRAME 3:3
+#define UART_0_LINE_STATUS_FRAME_NO_ERROR 0
+#define UART_0_LINE_STATUS_FRAME_ERROR 1
+#define UART_0_LINE_STATUS_PARITY 2:2
+#define UART_0_LINE_STATUS_PARITY_NO_ERROR 0
+#define UART_0_LINE_STATUS_PARITY_ERROR 1
+#define UART_0_LINE_STATUS_OVERRUN 1:1
+#define UART_0_LINE_STATUS_OVERRUN_NO_ERROR 0
+#define UART_0_LINE_STATUS_OVERRUN_ERROR 1
+#define UART_0_LINE_STATUS_DATA 0:0
+#define UART_0_LINE_STATUS_DATA_NOT_READY 0
+#define UART_0_LINE_STATUS_DATA_READY 1
+
+#define UART_0_MODEM_STATUS 0x030018
+#define UART_0_MODEM_STATUS_DCD 7:7
+#define UART_0_MODEM_STATUS_DCD_NOT_DETECTED 0
+#define UART_0_MODEM_STATUS_DCD_DETECTED 1
+#define UART_0_MODEM_STATUS_RI 6:6
+#define UART_0_MODEM_STATUS_RI_NOT_DETECTED 0
+#define UART_0_MODEM_STATUS_RI_DETECTED 1
+#define UART_0_MODEM_STATUS_DSR 5:5
+#define UART_0_MODEM_STATUS_DSR_NOT_DETECTED 0
+#define UART_0_MODEM_STATUS_DSR_DETECTED 1
+#define UART_0_MODEM_STATUS_CTS 4:4
+#define UART_0_MODEM_STATUS_CTS_NOT_DETECTED 0
+#define UART_0_MODEM_STATUS_CTS_DETECTED 1
+#define UART_0_MODEM_STATUS_DELTA_DCD 3:3
+#define UART_0_MODEM_STATUS_DELTA_DCD_NO_CHANGE 0
+#define UART_0_MODEM_STATUS_DELTA_DCD_CHANGE 1
+#define UART_0_MODEM_STATUS_TRAILING_RI 2:2
+#define UART_0_MODEM_STATUS_TRAILING_RI_NO_CHANGE 0
+#define UART_0_MODEM_STATUS_TRAILING_RI_CHANGE 1
+#define UART_0_MODEM_STATUS_DELTA_DSR 1:1
+#define UART_0_MODEM_STATUS_DELTA_DSR_NO_CHANGE 0
+#define UART_0_MODEM_STATUS_DELTA_DSR_CHANGE 1
+#define UART_0_MODEM_STATUS_DELTA_CTS 0:0
+#define UART_0_MODEM_STATUS_DELTA_CTS_NO_CHANGE 0
+#define UART_0_MODEM_STATUS_DELTA_CTS_CHANGE 1
+
+#define UART_0_SCRATCH 0x03001C
+#define UART_0_SCRATCH_DATA 7:0
+
+
+/* UART 0 when LCR = 0xBF (DLAB = 1) (configuration mode) */
+
+#define UART_0_FEATURE 0x030008
+#define UART_0_FEATURE_AUTO_CTS 7:7
+#define UART_0_FEATURE_AUTO_CTS_DISABLE 0
+#define UART_0_FEATURE_AUTO_CTS_ENABLE 1
+#define UART_0_FEATURE_AUTO_RTS 6:6
+#define UART_0_FEATURE_AUTO_RTS_DISABLE 0
+#define UART_0_FEATURE_AUTO_RTS_ENABLE 1
+#define UART_0_FEATURE_ENHANCED 4:4
+#define UART_0_FEATURE_ENHANCED_DISABLE 0
+#define UART_0_FEATURE_ENHANCED_ENABLE 1
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON1 3:3
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON1_DISABLE 0
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON1_ENABLE 1
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON2 2:2
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON2_DISABLE 0
+#define UART_0_FEATURE_SW_TX_FLOW_CTRL_XON2_ENABLE 1
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON1 1:1
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON1_DISABLE 0
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON1_ENABLE 1
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON2 0:0
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON2_DISABLE 0
+#define UART_0_FEATURE_SW_RX_FLOW_CTRL_XON2_ENABLE 1
+
+#define UART_0_XON1_CHAR 0x030010
+#define UART_0_XON1_CHAR_DATA 7:0
+
+#define UART_0_XON2_CHAR 0x030014
+#define UART_0_XON2_CHAR_DATA 7:0
+
+#define UART_0_XOFF1_CHAR 0x030018
+#define UART_0_XOFF1_CHAR_DATA 7:0
+
+#define UART_0_XOFF2_CHAR 0x03001C
+#define UART_0_XOFF2_CHAR_DATA 7:0
+
+
+/*****************************************************************************\
+ * UART 1 *
+\*****************************************************************************/
+
+/* UART 1 when DLAB = 0 (normal mode), LCR != 0xBF */
+
+#define UART_1_RECEIVE_BUFFER 0x030020
+#define UART_1_RECEIVE_BUFFER_DATA 7:0
+
+#define UART_1_TRANSMIT 0x030020
+#define UART_1_TRANSMIT_DATA 7:0
+
+#define UART_1_INTERRUPT 0x030024
+#define UART_1_INTERRUPT_CTS 7:7
+#define UART_1_INTERRUPT_CTS_DISABLE 0
+#define UART_1_INTERRUPT_CTS_ENABLE 1
+#define UART_1_INTERRUPT_RTS 6:6
+#define UART_1_INTERRUPT_RTS_DISABLE 0
+#define UART_1_INTERRUPT_RTS_ENABLE 1
+#define UART_1_INTERRUPT_XOFF 5:5
+#define UART_1_INTERRUPT_XOFF_DISABLE 0
+#define UART_1_INTERRUPT_XOFF_ENABLE 1
+#define UART_1_INTERRUPT_MODEM_STATUS 3:3
+#define UART_1_INTERRUPT_MODEM_STATUS_DISABLE 0
+#define UART_1_INTERRUPT_MODEM_STATUS_ENABLE 1
+#define UART_1_INTERRUPT_LINE_STATUS 2:2
+#define UART_1_INTERRUPT_LINE_STATUS_DISABLE 0
+#define UART_1_INTERRUPT_LINE_STATUS_ENABLE 1
+#define UART_1_INTERRUPT_TX_EMPTY 1:1
+#define UART_1_INTERRUPT_TX_EMPTY_DISABLE 0
+#define UART_1_INTERRUPT_TX_EMPTY_ENABLE 1
+#define UART_1_INTERRUPT_RX_BUFFER 0:0
+#define UART_1_INTERRUPT_RX_BUFFER_DISABLE 0
+#define UART_1_INTERRUPT_RX_BUFFER_ENABLE 1
+
+
+/* UART 0 when DLAB = 1 (configuration mode), LCR != 0xBF */
+
+#define UART_1_DIVISOR_LATCH_LSB 0x030020
+#define UART_1_DIVISOR_LATCH_LSB_VALUE 7:0
+
+#define UART_1_DIVISOR_LATCH_MSB 0x030024
+#define UART_1_DIVISOR_LATCH_MSB_VALUE 7:0
+
+
+/* UART 1 when DLAB = X (don't care), LCR != 0xBF */
+
+#define UART_1_STATUS 0x030028
+#define UART_1_STATUS_FIFO 7:6
+#define UART_1_STATUS_FIFO_DISABLE 0
+#define UART_1_STATUS_FIFO_ENABLE 3
+#define UART_1_STATUS_INTERRUPT 5:1
+#define UART_1_STATUS_INTERRUPT_MODEM_STATUS_CHANGE 0
+#define UART_1_STATUS_INTERRUPT_TX_EMPTY 1
+#define UART_1_STATUS_INTERRUPT_RX_DATA_RECEIVED 2
+#define UART_1_STATUS_INTERRUPT_LINE_STATUS 3
+#define UART_1_STATUS_INTERRUPT_RX_CHAR_TIMEOUT 6
+#define UART_1_STATUS_INTERRUPT_XOFF_RECEIVED 8
+#define UART_1_STATUS_INTERRUPT_CTS_RTS 16
+#define UART_1_STATUS_INTERRUPT_PENDING 1:1
+#define UART_1_STATUS_INTERRUPT_PENDING_YES 0
+#define UART_1_STATUS_INTERRUPT_PENDING_NO 1
+
+#define UART_1_FIFO 0x030028
+#define UART_1_FIFO_RX_TRIGGER 7:6
+#define UART_1_FIFO_RX_TRIGGER_DEFAULT 0
+#define UART_1_FIFO_RX_TRIGGER_QUARTER 1
+#define UART_1_FIFO_RX_TRIGGER_HALF 2
+#define UART_1_FIFO_RX_TRIGGER_MINUS_2 3
+#define UART_1_FIFO_TX_TRIGGER 5:4
+#define UART_1_FIFO_TX_TRIGGER_DEFAULT 0
+#define UART_1_FIFO_TX_TRIGGER_QUARTER 1
+#define UART_1_FIFO_TX_TRIGGER_HALF 2
+#define UART_1_FIFO_TX_TRIGGER_MINUS_2 3
+#define UART_1_FIFO_DMA_MODE 3:3
+#define UART_1_FIFO_DMA_MODE_ZERO 0
+#define UART_1_FIFO_DMA_MODE_ONE 1
+#define UART_1_FIFO_TX_CLEAR 2:2
+#define UART_1_FIFO_TX_CLEAR_NO 0
+#define UART_1_FIFO_TX_CLEAR_CLEAR 1
+#define UART_1_FIFO_RX_CLEAR 1:1
+#define UART_1_FIFO_RX_CLEAR_NO 0
+#define UART_1_FIFO_RX_CLEAR_CLEAR 1
+#define UART_1_FIFO_ENABLE 0:0
+#define UART_1_FIFO_ENABLE_DISABLE 0
+#define UART_1_FIFO_ENABLE_ENABLE 1
+
+#define UART_1_LINE_CTRL 0x03002C
+#define UART_1_LINE_CTRL_ENHANCED 7:0
+#define UART_1_LINE_CTRL_ENHANCED_ENABLE 0xBF
+#define UART_1_LINE_CTRL_DLAB 7:7
+#define UART_1_LINE_CTRL_DLAB_RESET 0
+#define UART_1_LINE_CTRL_DLAB_SET 1
+#define UART_1_LINE_CTRL_LINE_BREAK 6:6
+#define UART_1_LINE_CTRL_LINE_BREAK_RESET 0
+#define UART_1_LINE_CTRL_LINE_BREAK_SET 1
+#define UART_1_LINE_CTRL_PARITY 5:3
+#define UART_1_LINE_CTRL_PARITY_DISABLE 0
+#define UART_1_LINE_CTRL_PARITY_ODD 1
+#define UART_1_LINE_CTRL_PARITY_EVEN 3
+#define UART_1_LINE_CTRL_PARITY_MARK 5
+#define UART_1_LINE_CTRL_PARITY_SPACE 7
+#define UART_1_LINE_CTRL_STOPBITS 2:2
+#define UART_1_LINE_CTRL_STOPBITS_ONE 0
+#define UART_1_LINE_CTRL_STOPBITS_TWO 1
+#define UART_1_LINE_CTRL_CHARSIZE 1:0
+#define UART_1_LINE_CTRL_CHARSIZE_5 0
+#define UART_1_LINE_CTRL_CHARSIZE_6 1
+#define UART_1_LINE_CTRL_CHARSIZE_7 2
+#define UART_1_LINE_CTRL_CHARSIZE_8 3
+
+#define UART_1_MODEM_CTRL 0x030030
+#define UART_1_MODEM_CTRL_XOFF_STATUS 7:7
+#define UART_1_MODEM_CTRL_XOFF_STATUS_XON 0
+#define UART_1_MODEM_CTRL_XOFF_STATUS_XOFF 1
+#define UART_1_MODEM_CTRL_INFRARED 6:6
+#define UART_1_MODEM_CTRL_INFRARED_DISABLE 0
+#define UART_1_MODEM_CTRL_INFRARED_ENABLE 1
+#define UART_1_MODEM_CTRL_LOOPBACK 4:4
+#define UART_1_MODEM_CTRL_LOOPBACK_DISABLE 0
+#define UART_1_MODEM_CTRL_LOOPBACK_ENABLE 1
+#define UART_1_MODEM_CTRL_OUT2 3:3
+#define UART_1_MODEM_CTRL_OUT2_RESET 0
+#define UART_1_MODEM_CTRL_OUT2_SET 1
+#define UART_1_MODEM_CTRL_OUT1 2:2
+#define UART_1_MODEM_CTRL_OUT1_RESET 0
+#define UART_1_MODEM_CTRL_OUT1_SET 1
+#define UART_1_MODEM_CTRL_RTS 1:1
+#define UART_1_MODEM_CTRL_RTS_RESET 0
+#define UART_1_MODEM_CTRL_RTS_SET 1
+#define UART_1_MODEM_CTRL_DTR 0:0
+#define UART_1_MODEM_CTRL_DTR_RESET 0
+#define UART_1_MODEM_CTRL_DTR_SET 1
+
+#define UART_1_LINE_STATUS 0x030034
+#define UART_1_LINE_STATUS_RX_FIFO 7:7
+#define UART_1_LINE_STATUS_RX_FIFO_NO_ERROR 0
+#define UART_1_LINE_STATUS_RX_FIFO_ERROR 1
+#define UART_1_LINE_STATUS_TRANSMITTER 6:6
+#define UART_1_LINE_STATUS_TRANSMITTER_NOT_EMPTY 0
+#define UART_1_LINE_STATUS_TRANSMITTER_EMPTY 1
+#define UART_1_LINE_STATUS_TX_HOLDING 5:5
+#define UART_1_LINE_STATUS_TX_HOLDING_NOT_EMPTY 0
+#define UART_1_LINE_STATUS_TX_HOLDING_EMPTY 1
+#define UART_1_LINE_STATUS_BREAK 4:4
+#define UART_1_LINE_STATUS_BREAK_NO_BREAK 0
+#define UART_1_LINE_STATUS_BREAK_BREAK 1
+#define UART_1_LINE_STATUS_FRAME 3:3
+#define UART_1_LINE_STATUS_FRAME_NO_ERROR 0
+#define UART_1_LINE_STATUS_FRAME_ERROR 1
+#define UART_1_LINE_STATUS_PARITY 2:2
+#define UART_1_LINE_STATUS_PARITY_NO_ERROR 0
+#define UART_1_LINE_STATUS_PARITY_ERROR 1
+#define UART_1_LINE_STATUS_OVERRUN 1:1
+#define UART_1_LINE_STATUS_OVERRUN_NO_ERROR 0
+#define UART_1_LINE_STATUS_OVERRUN_ERROR 1
+#define UART_1_LINE_STATUS_DATA 0:0
+#define UART_1_LINE_STATUS_DATA_NOT_READY 0
+#define UART_1_LINE_STATUS_DATA_READY 1
+
+#define UART_1_MODEM_STATUS 0x030038
+#define UART_1_MODEM_STATUS_DCD 7:7
+#define UART_1_MODEM_STATUS_DCD_NOT_DETECTED 0
+#define UART_1_MODEM_STATUS_DCD_DETECTED 1
+#define UART_1_MODEM_STATUS_RI 6:6
+#define UART_1_MODEM_STATUS_RI_NOT_DETECTED 0
+#define UART_1_MODEM_STATUS_RI_DETECTED 1
+#define UART_1_MODEM_STATUS_DSR 5:5
+#define UART_1_MODEM_STATUS_DSR_NOT_DETECTED 0
+#define UART_1_MODEM_STATUS_DSR_DETECTED 1
+#define UART_1_MODEM_STATUS_CTS 4:4
+#define UART_1_MODEM_STATUS_CTS_NOT_DETECTED 0
+#define UART_1_MODEM_STATUS_CTS_DETECTED 1
+#define UART_1_MODEM_STATUS_DELTA_DCD 3:3
+#define UART_1_MODEM_STATUS_DELTA_DCD_NO_CHANGE 0
+#define UART_1_MODEM_STATUS_DELTA_DCD_CHANGE 1
+#define UART_1_MODEM_STATUS_TRAILING_RI 2:2
+#define UART_1_MODEM_STATUS_TRAILING_RI_NO_CHANGE 0
+#define UART_1_MODEM_STATUS_TRAILING_RI_CHANGE 1
+#define UART_1_MODEM_STATUS_DELTA_DSR 1:1
+#define UART_1_MODEM_STATUS_DELTA_DSR_NO_CHANGE 0
+#define UART_1_MODEM_STATUS_DELTA_DSR_CHANGE 1
+#define UART_1_MODEM_STATUS_DELTA_CTS 0:0
+#define UART_1_MODEM_STATUS_DELTA_CTS_NO_CHANGE 0
+#define UART_1_MODEM_STATUS_DELTA_CTS_CHANGE 1
+
+#define UART_1_SCRATCH 0x03003C
+#define UART_1_SCRATCH_DATA 7:0
+
+
+/* UART 1 when LCR = 0xBF (DLAB = 1) (configuration mode) */
+
+#define UART_1_FEATURE 0x030028
+#define UART_1_FEATURE_AUTO_CTS 7:7
+#define UART_1_FEATURE_AUTO_CTS_DISABLE 0
+#define UART_1_FEATURE_AUTO_CTS_ENABLE 1
+#define UART_1_FEATURE_AUTO_RTS 6:6
+#define UART_1_FEATURE_AUTO_RTS_DISABLE 0
+#define UART_1_FEATURE_AUTO_RTS_ENABLE 1
+#define UART_1_FEATURE_ENHANCED 4:4
+#define UART_1_FEATURE_ENHANCED_DISABLE 0
+#define UART_1_FEATURE_ENHANCED_ENABLE 1
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON1 3:3
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON1_DISABLE 0
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON1_ENABLE 1
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON2 2:2
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON2_DISABLE 0
+#define UART_1_FEATURE_SW_TX_FLOW_CTRL_XON2_ENABLE 1
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON1 1:1
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON1_DISABLE 0
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON1_ENABLE 1
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON2 0:0
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON2_DISABLE 0
+#define UART_1_FEATURE_SW_RX_FLOW_CTRL_XON2_ENABLE 1
+
+#define UART_1_XON1_CHAR 0x030030
+#define UART_1_XON1_CHAR_DATA 7:0
+
+#define UART_1_XON2_CHAR 0x030034
+#define UART_1_XON2_CHAR_DATA 7:0
+
+#define UART_1_XOFF1_CHAR 0x030038
+#define UART_1_XOFF1_CHAR_DATA 7:0
+
+#define UART_1_XOFF2_CHAR 0x03003C
+#define UART_1_XOFF2_CHAR_DATA 7:0
+
+
+/*****************************************************************************\
+ * USB HOST *
+\*****************************************************************************/
+
+#define USB_HOST_HC_REVISION 0X040000
+#define USB_HOST_HC_CONTROL 0X040004
+#define USB_HOST_HC_COMMANDSTATUS 0X040008
+#define USB_HOST_HC_INTERRUPTSTATUS 0X04000C
+#define USB_HOST_HC_INTERRUPTENABLE 0X040010
+#define USB_HOST_HC_INTERRUPTDISABLE 0X040014
+#define USB_HOST_HC_HCCA 0X040018
+#define USB_HOST_HC_PERIODCURRENTED 0X04001C
+#define USB_HOST_HC_CONTROLHEADED 0X040020
+#define USB_HOST_HC_CONTROLCURRENTED 0X040024
+#define USB_HOST_HC_BULKHEADED 0X040028
+#define USB_HOST_HC_BULKCURRENTED 0X04002C
+#define USB_HOST_HC_DONEHEAD 0X040030
+#define USB_HOST_HC_FMINTERVAL 0X040034
+#define USB_HOST_HC_FMREMAINING 0X040038
+#define USB_HOST_HC_FMNUMBER 0X04003C
+#define USB_HOST_HC_PERIODSTART 0X040040
+#define USB_HOST_HC_LSTHRESHOLD 0X040044
+#define USB_HOST_HC_RHDESCRIPTORA 0X040048
+#define USB_HOST_HC_RHDESCRIPTORB 0X04004C
+#define USB_HOST_HC_RHSTATUS 0X040050
+#define USB_HOST_HC_RHPORT1 0X040054
+
+
+/*****************************************************************************\
+ * USB SLAVE *
+\*****************************************************************************/
+
+/* TBD */
+
+
+/*****************************************************************************\
+ * DISPLAY CONTROLLER *
+\*****************************************************************************/
+
+// Panel Graphics Control
+
+#define PANEL_DISPLAY_CTRL 0x080000
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK 31:28
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK_DISABLE 0
+#define PANEL_DISPLAY_CTRL_RESERVED_1_MASK_ENABLE 0xF
+#define PANEL_DISPLAY_CTRL_FPEN 27:27
+#define PANEL_DISPLAY_CTRL_FPEN_LOW 0
+#define PANEL_DISPLAY_CTRL_FPEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_VBIASEN 26:26
+#define PANEL_DISPLAY_CTRL_VBIASEN_LOW 0
+#define PANEL_DISPLAY_CTRL_VBIASEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_DATA 25:25
+#define PANEL_DISPLAY_CTRL_DATA_DISABLE 0
+#define PANEL_DISPLAY_CTRL_DATA_ENABLE 1
+#define PANEL_DISPLAY_CTRL_FPVDDEN 24:24
+#define PANEL_DISPLAY_CTRL_FPVDDEN_LOW 0
+#define PANEL_DISPLAY_CTRL_FPVDDEN_HIGH 1
+#define PANEL_DISPLAY_CTRL_PATTERN 23:23
+#define PANEL_DISPLAY_CTRL_PATTERN_4 0
+#define PANEL_DISPLAY_CTRL_PATTERN_8 1
+#define PANEL_DISPLAY_CTRL_TFT 22:21
+#define PANEL_DISPLAY_CTRL_TFT_24 0
+#define PANEL_DISPLAY_CTRL_TFT_9 1
+#define PANEL_DISPLAY_CTRL_TFT_12 2
+#define PANEL_DISPLAY_CTRL_DITHER 20:20
+#define PANEL_DISPLAY_CTRL_DITHER_DISABLE 0
+#define PANEL_DISPLAY_CTRL_DITHER_ENABLE 1
+#define PANEL_DISPLAY_CTRL_LCD 19:18
+#define PANEL_DISPLAY_CTRL_LCD_TFT 0
+#define PANEL_DISPLAY_CTRL_LCD_STN_8 2
+#define PANEL_DISPLAY_CTRL_LCD_STN_12 3
+#define PANEL_DISPLAY_CTRL_FIFO 17:16
+#define PANEL_DISPLAY_CTRL_FIFO_1 0
+#define PANEL_DISPLAY_CTRL_FIFO_3 1
+#define PANEL_DISPLAY_CTRL_FIFO_7 2
+#define PANEL_DISPLAY_CTRL_FIFO_11 3
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE 14:14
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE 13:13
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE 12:12
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_HIGH 0
+#define PANEL_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_LOW 1
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK 11:11
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK_DISABLE 0
+#define PANEL_DISPLAY_CTRL_RESERVED_2_MASK_ENABLE 1
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING 10:10
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING_DISABLE 0
+#define PANEL_DISPLAY_CTRL_CAPTURE_TIMING_ENABLE 1
+#define PANEL_DISPLAY_CTRL_COLOR_KEY 9:9
+#define PANEL_DISPLAY_CTRL_COLOR_KEY_DISABLE 0
+#define PANEL_DISPLAY_CTRL_COLOR_KEY_ENABLE 1
+#define PANEL_DISPLAY_CTRL_TIMING 8:8
+#define PANEL_DISPLAY_CTRL_TIMING_DISABLE 0
+#define PANEL_DISPLAY_CTRL_TIMING_ENABLE 1
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR 7:7
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR_DOWN 0
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DIR_UP 1
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN 6:6
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_DISABLE 0
+#define PANEL_DISPLAY_CTRL_VERTICAL_PAN_ENABLE 1
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR 5:5
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR_RIGHT 0
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DIR_LEFT 1
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN 4:4
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_DISABLE 0
+#define PANEL_DISPLAY_CTRL_HORIZONTAL_PAN_ENABLE 1
+#define PANEL_DISPLAY_CTRL_GAMMA 3:3
+#define PANEL_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define PANEL_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define PANEL_DISPLAY_CTRL_PLANE 2:2
+#define PANEL_DISPLAY_CTRL_PLANE_DISABLE 0
+#define PANEL_DISPLAY_CTRL_PLANE_ENABLE 1
+#define PANEL_DISPLAY_CTRL_FORMAT 1:0
+#define PANEL_DISPLAY_CTRL_FORMAT_8 0
+#define PANEL_DISPLAY_CTRL_FORMAT_16 1
+#define PANEL_DISPLAY_CTRL_FORMAT_32 2
+
+#define PANEL_PAN_CTRL 0x080004
+#define PANEL_PAN_CTRL_VERTICAL_PAN 31:24
+#define PANEL_PAN_CTRL_VERTICAL_VSYNC 21:16
+#define PANEL_PAN_CTRL_HORIZONTAL_PAN 15:8
+#define PANEL_PAN_CTRL_HORIZONTAL_VSYNC 5:0
+
+#define PANEL_COLOR_KEY 0x080008
+#define PANEL_COLOR_KEY_MASK 31:16
+#define PANEL_COLOR_KEY_VALUE 15:0
+
+#define PANEL_FB_ADDRESS 0x08000C
+#define PANEL_FB_ADDRESS_STATUS 31:31
+#define PANEL_FB_ADDRESS_STATUS_CURRENT 0
+#define PANEL_FB_ADDRESS_STATUS_FLIP 1
+#define PANEL_FB_ADDRESS_EXT 27:27
+#define PANEL_FB_ADDRESS_EXT_LOCAL 0
+#define PANEL_FB_ADDRESS_EXT_EXTERNAL 1
+#define PANEL_FB_ADDRESS_CS 26:26
+#define PANEL_FB_ADDRESS_CS_0 0
+#define PANEL_FB_ADDRESS_CS_1 1
+#define PANEL_FB_ADDRESS_ADDRESS 25:0
+
+#define PANEL_FB_WIDTH 0x080010
+#define PANEL_FB_WIDTH_WIDTH 29:16
+#define PANEL_FB_WIDTH_OFFSET 13:0
+
+#define PANEL_WINDOW_WIDTH 0x080014
+#define PANEL_WINDOW_WIDTH_WIDTH 27:16
+#define PANEL_WINDOW_WIDTH_X 11:0
+
+#define PANEL_WINDOW_HEIGHT 0x080018
+#define PANEL_WINDOW_HEIGHT_HEIGHT 27:16
+#define PANEL_WINDOW_HEIGHT_Y 11:0
+
+#define PANEL_PLANE_TL 0x08001C
+#define PANEL_PLANE_TL_TOP 26:16
+#define PANEL_PLANE_TL_LEFT 10:0
+
+#define PANEL_PLANE_BR 0x080020
+#define PANEL_PLANE_BR_BOTTOM 26:16
+#define PANEL_PLANE_BR_RIGHT 10:0
+
+#define PANEL_HORIZONTAL_TOTAL 0x080024
+#define PANEL_HORIZONTAL_TOTAL_TOTAL 27:16
+#define PANEL_HORIZONTAL_TOTAL_DISPLAY_END 11:0
+
+#define PANEL_HORIZONTAL_SYNC 0x080028
+#define PANEL_HORIZONTAL_SYNC_WIDTH 23:16
+#define PANEL_HORIZONTAL_SYNC_START 11:0
+
+#define PANEL_VERTICAL_TOTAL 0x08002C
+#define PANEL_VERTICAL_TOTAL_TOTAL 26:16
+#define PANEL_VERTICAL_TOTAL_DISPLAY_END 10:0
+
+#define PANEL_VERTICAL_SYNC 0x080030
+#define PANEL_VERTICAL_SYNC_HEIGHT 21:16
+#define PANEL_VERTICAL_SYNC_START 10:0
+
+#define PANEL_CURRENT_LINE 0x080034
+#define PANEL_CURRENT_LINE_LINE 10:0
+
+// Video Control
+
+#define VIDEO_DISPLAY_CTRL 0x080040
+#define VIDEO_DISPLAY_CTRL_FIFO 17:16
+#define VIDEO_DISPLAY_CTRL_FIFO_1 0
+#define VIDEO_DISPLAY_CTRL_FIFO_3 1
+#define VIDEO_DISPLAY_CTRL_FIFO_7 2
+#define VIDEO_DISPLAY_CTRL_FIFO_11 3
+#define VIDEO_DISPLAY_CTRL_BUFFER 15:15
+#define VIDEO_DISPLAY_CTRL_BUFFER_0 0
+#define VIDEO_DISPLAY_CTRL_BUFFER_1 1
+#define VIDEO_DISPLAY_CTRL_CAPTURE 14:14
+#define VIDEO_DISPLAY_CTRL_CAPTURE_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_CAPTURE_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER 13:13
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_DOUBLE_BUFFER_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP 12:12
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_BYTE_SWAP_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE 11:11
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE_NORMAL 0
+#define VIDEO_DISPLAY_CTRL_VERTICAL_SCALE_HALF 1
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE 10:10
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE_NORMAL 0
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_SCALE_HALF 1
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE 9:9
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE_REPLICATE 0
+#define VIDEO_DISPLAY_CTRL_VERTICAL_MODE_INTERPOLATE 1
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE 8:8
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE_REPLICATE 0
+#define VIDEO_DISPLAY_CTRL_HORIZONTAL_MODE_INTERPOLATE 1
+#define VIDEO_DISPLAY_CTRL_PIXEL 7:4
+#define VIDEO_DISPLAY_CTRL_GAMMA 3:3
+#define VIDEO_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_PLANE 2:2
+#define VIDEO_DISPLAY_CTRL_PLANE_DISABLE 0
+#define VIDEO_DISPLAY_CTRL_PLANE_ENABLE 1
+#define VIDEO_DISPLAY_CTRL_FORMAT 1:0
+#define VIDEO_DISPLAY_CTRL_FORMAT_8 0
+#define VIDEO_DISPLAY_CTRL_FORMAT_16 1
+#define VIDEO_DISPLAY_CTRL_FORMAT_32 2
+#define VIDEO_DISPLAY_CTRL_FORMAT_YUV 3
+
+#define VIDEO_FB_0_ADDRESS 0x080044
+#define VIDEO_FB_0_ADDRESS_STATUS 31:31
+#define VIDEO_FB_0_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_FB_0_ADDRESS_STATUS_PENDING 1
+#define VIDEO_FB_0_ADDRESS_EXT 27:27
+#define VIDEO_FB_0_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_0_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_0_ADDRESS_CS 26:26
+#define VIDEO_FB_0_ADDRESS_CS_0 0
+#define VIDEO_FB_0_ADDRESS_CS_1 1
+#define VIDEO_FB_0_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_FB_WIDTH 0x080048
+#define VIDEO_FB_WIDTH_WIDTH 29:16
+#define VIDEO_FB_WIDTH_OFFSET 13:0
+
+#define VIDEO_FB_0_LAST_ADDRESS 0x08004C
+#define VIDEO_FB_0_LAST_ADDRESS_EXT 27:27
+#define VIDEO_FB_0_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_0_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_0_LAST_ADDRESS_CS 26:26
+#define VIDEO_FB_0_LAST_ADDRESS_CS_0 0
+#define VIDEO_FB_0_LAST_ADDRESS_CS_1 1
+#define VIDEO_FB_0_LAST_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_PLANE_TL 0x080050
+#define VIDEO_PLANE_TL_TOP 26:16
+#define VIDEO_PLANE_TL_LEFT 13:0
+
+#define VIDEO_PLANE_BR 0x080054
+#define VIDEO_PLANE_BR_BOTTOM 26:16
+#define VIDEO_PLANE_BR_RIGHT 13:0
+
+#define VIDEO_SCALE 0x080058
+#define VIDEO_SCALE_VERTICAL_MODE 31:31
+#define VIDEO_SCALE_VERTICAL_MODE_EXPAND 0
+#define VIDEO_SCALE_VERTICAL_MODE_SHRINK 1
+#define VIDEO_SCALE_VERTICAL_SCALE 27:16
+#define VIDEO_SCALE_HORIZONTAL_MODE 15:15
+#define VIDEO_SCALE_HORIZONTAL_MODE_EXPAND 0
+#define VIDEO_SCALE_HORIZONTAL_MODE_SHRINK 1
+#define VIDEO_SCALE_HORIZONTAL_SCALE 11:0
+
+#define VIDEO_INITIAL_SCALE 0x08005C
+#define VIDEO_INITIAL_SCALE_FB_1 27:16
+#define VIDEO_INITIAL_SCALE_FB_0 11:0
+
+#define VIDEO_YUV_CONSTANTS 0x080060
+#define VIDEO_YUV_CONSTANTS_Y 31:24
+#define VIDEO_YUV_CONSTANTS_R 23:16
+#define VIDEO_YUV_CONSTANTS_G 15:8
+#define VIDEO_YUV_CONSTANTS_B 7:0
+
+#define VIDEO_FB_1_ADDRESS 0x080064
+#define VIDEO_FB_1_ADDRESS_STATUS 31:31
+#define VIDEO_FB_1_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_FB_1_ADDRESS_STATUS_PENDING 1
+#define VIDEO_FB_1_ADDRESS_EXT 27:27
+#define VIDEO_FB_1_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_1_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_1_ADDRESS_CS 26:26
+#define VIDEO_FB_1_ADDRESS_CS_0 0
+#define VIDEO_FB_1_ADDRESS_CS_1 1
+#define VIDEO_FB_1_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_FB_1_LAST_ADDRESS 0x080068
+#define VIDEO_FB_1_LAST_ADDRESS_EXT 27:27
+#define VIDEO_FB_1_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_FB_1_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_FB_1_LAST_ADDRESS_CS 26:26
+#define VIDEO_FB_1_LAST_ADDRESS_CS_0 0
+#define VIDEO_FB_1_LAST_ADDRESS_CS_1 1
+#define VIDEO_FB_1_LAST_ADDRESS_ADDRESS 25:0
+
+// Video Alpha Control
+
+#define VIDEO_ALPHA_DISPLAY_CTRL 0x080080
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT 28:28
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT_PER_PIXEL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_SELECT_ALPHA 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_ALPHA 27:24
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO 17:16
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_1 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_3 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_7 2
+#define VIDEO_ALPHA_DISPLAY_CTRL_FIFO_11 3
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE 11:11
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE_NORMAL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_SCALE_HALF 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE 10:10
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE_NORMAL 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_SCALE_HALF 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE 9:9
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE_REPLICATE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_VERT_MODE_INTERPOLATE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE 8:8
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE_REPLICATE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_HORZ_MODE_INTERPOLATE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_PIXEL 7:4
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY 3:3
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY_DISABLE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_CHROMA_KEY_ENABLE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE 2:2
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE_DISABLE 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_PLANE_ENABLE 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT 1:0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_8 0
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_16 1
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4 2
+#define VIDEO_ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4_4_4 3
+
+#define VIDEO_ALPHA_FB_ADDRESS 0x080084
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS 31:31
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS_CURRENT 0
+#define VIDEO_ALPHA_FB_ADDRESS_STATUS_PENDING 1
+#define VIDEO_ALPHA_FB_ADDRESS_EXT 27:27
+#define VIDEO_ALPHA_FB_ADDRESS_EXT_LOCAL 0
+#define VIDEO_ALPHA_FB_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_ALPHA_FB_ADDRESS_CS 26:26
+#define VIDEO_ALPHA_FB_ADDRESS_CS_0 0
+#define VIDEO_ALPHA_FB_ADDRESS_CS_1 1
+#define VIDEO_ALPHA_FB_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_ALPHA_FB_WIDTH 0x080088
+#define VIDEO_ALPHA_FB_WIDTH_WIDTH 29:16
+#define VIDEO_ALPHA_FB_WIDTH_OFFSET 13:0
+
+#define VIDEO_ALPHA_FB_LAST_ADDRESS 0x08008C
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT 27:27
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT_LOCAL 0
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_EXT_EXTERNAL 1
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_CS 26:26
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_CS_0 0
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_CS_1 1
+#define VIDEO_ALPHA_FB_LAST_ADDRESS_ADDRESS 25:0
+
+#define VIDEO_ALPHA_PLANE_TL 0x080090
+#define VIDEO_ALPHA_PLANE_TL_TOP 26:16
+#define VIDEO_ALPHA_PLANE_TL_LEFT 10:0
+
+#define VIDEO_ALPHA_PLANE_BR 0x080094
+#define VIDEO_ALPHA_PLANE_BR_BOTTOM 26:16
+#define VIDEO_ALPHA_PLANE_BR_RIGHT 10:0
+
+#define VIDEO_ALPHA_SCALE 0x080098
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE 31:31
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE_EXPAND 0
+#define VIDEO_ALPHA_SCALE_VERTICAL_MODE_SHRINK 1
+#define VIDEO_ALPHA_SCALE_VERTICAL_SCALE 27:16
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE 15:15
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE_EXPAND 0
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_MODE_SHRINK 1
+#define VIDEO_ALPHA_SCALE_HORIZONTAL_SCALE 11:0
+
+#define VIDEO_ALPHA_INITIAL_SCALE 0x08009C
+#define VIDEO_ALPHA_INITIAL_SCALE_FB 11:0
+
+#define VIDEO_ALPHA_CHROMA_KEY 0x0800A0
+#define VIDEO_ALPHA_CHROMA_KEY_MASK 31:16
+#define VIDEO_ALPHA_CHROMA_KEY_VALUE 15:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_01 0x0800A4
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_1_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_01_0_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_23 0x0800A8
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_3_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_23_2_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_45 0x0800AC
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_5_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_45_4_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_67 0x0800B0
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_7_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_67_6_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_89 0x0800B4
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_9_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_89_8_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB 0x0800B8
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_B_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_AB_A_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD 0x0800BC
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_D_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_CD_C_BLUE 4:0
+
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF 0x0800C0
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_RED 31:27
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_GREEN 26:21
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_F_BLUE 20:16
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_RED 15:11
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_GREEN 10:5
+#define VIDEO_ALPHA_COLOR_LOOKUP_EF_E_BLUE 4:0
+
+
+// Alpha Control
+#define ALPHA_DISPLAY_CTRL 0x080100
+#define ALPHA_DISPLAY_CTRL_SELECT 28:28
+#define ALPHA_DISPLAY_CTRL_SELECT_PER_PIXEL 0
+#define ALPHA_DISPLAY_CTRL_SELECT_ALPHA 1
+#define ALPHA_DISPLAY_CTRL_ALPHA 27:24
+#define ALPHA_DISPLAY_CTRL_FIFO 17:16
+#define ALPHA_DISPLAY_CTRL_FIFO_1 0
+#define ALPHA_DISPLAY_CTRL_FIFO_3 1
+#define ALPHA_DISPLAY_CTRL_FIFO_7 2
+#define ALPHA_DISPLAY_CTRL_FIFO_11 3
+#define ALPHA_DISPLAY_CTRL_PIXEL 7:4
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY 3:3
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY_DISABLE 0
+#define ALPHA_DISPLAY_CTRL_CHROMA_KEY_ENABLE 1
+#define ALPHA_DISPLAY_CTRL_PLANE 2:2
+#define ALPHA_DISPLAY_CTRL_PLANE_DISABLE 0
+#define ALPHA_DISPLAY_CTRL_PLANE_ENABLE 1
+#define ALPHA_DISPLAY_CTRL_FORMAT 1:0
+#define ALPHA_DISPLAY_CTRL_FORMAT_16 1
+#define ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4 2
+#define ALPHA_DISPLAY_CTRL_FORMAT_ALPHA_4_4_4_4 3
+
+#define ALPHA_FB_ADDRESS 0x080104
+#define ALPHA_FB_ADDRESS_STATUS 31:31
+#define ALPHA_FB_ADDRESS_STATUS_CURRENT 0
+#define ALPHA_FB_ADDRESS_STATUS_PENDING 1
+#define ALPHA_FB_ADDRESS_EXT 27:27
+#define ALPHA_FB_ADDRESS_EXT_LOCAL 0
+#define ALPHA_FB_ADDRESS_EXT_EXTERNAL 1
+#define ALPHA_FB_ADDRESS_CS 26:26
+#define ALPHA_FB_ADDRESS_CS_0 0
+#define ALPHA_FB_ADDRESS_CS_1 1
+#define ALPHA_FB_ADDRESS_ADDRESS 25:0
+
+#define ALPHA_FB_WIDTH 0x080108
+#define ALPHA_FB_WIDTH_WIDTH 29:16
+#define ALPHA_FB_WIDTH_OFFSET 13:0
+
+#define ALPHA_PLANE_TL 0x08010C
+#define ALPHA_PLANE_TL_TOP 26:16
+#define ALPHA_PLANE_TL_LEFT 10:0
+
+#define ALPHA_PLANE_BR 0x080110
+#define ALPHA_PLANE_BR_BOTTOM 26:16
+#define ALPHA_PLANE_BR_RIGHT 10:0
+
+#define ALPHA_CHROMA_KEY 0x080114
+#define ALPHA_CHROMA_KEY_MASK 31:16
+#define ALPHA_CHROMA_KEY_VALUE 15:0
+
+#define ALPHA_COLOR_LOOKUP_01 0x080118
+#define ALPHA_COLOR_LOOKUP_01_1_RED 31:27
+#define ALPHA_COLOR_LOOKUP_01_1_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_01_1_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_01_0_RED 15:11
+#define ALPHA_COLOR_LOOKUP_01_0_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_01_0_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_23 0x08011C
+#define ALPHA_COLOR_LOOKUP_23_3_RED 31:27
+#define ALPHA_COLOR_LOOKUP_23_3_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_23_3_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_23_2_RED 15:11
+#define ALPHA_COLOR_LOOKUP_23_2_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_23_2_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_45 0x080120
+#define ALPHA_COLOR_LOOKUP_45_5_RED 31:27
+#define ALPHA_COLOR_LOOKUP_45_5_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_45_5_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_45_4_RED 15:11
+#define ALPHA_COLOR_LOOKUP_45_4_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_45_4_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_67 0x080124
+#define ALPHA_COLOR_LOOKUP_67_7_RED 31:27
+#define ALPHA_COLOR_LOOKUP_67_7_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_67_7_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_67_6_RED 15:11
+#define ALPHA_COLOR_LOOKUP_67_6_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_67_6_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_89 0x080128
+#define ALPHA_COLOR_LOOKUP_89_9_RED 31:27
+#define ALPHA_COLOR_LOOKUP_89_9_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_89_9_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_89_8_RED 15:11
+#define ALPHA_COLOR_LOOKUP_89_8_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_89_8_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_AB 0x08012C
+#define ALPHA_COLOR_LOOKUP_AB_B_RED 31:27
+#define ALPHA_COLOR_LOOKUP_AB_B_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_AB_B_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_AB_A_RED 15:11
+#define ALPHA_COLOR_LOOKUP_AB_A_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_AB_A_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_CD 0x080130
+#define ALPHA_COLOR_LOOKUP_CD_D_RED 31:27
+#define ALPHA_COLOR_LOOKUP_CD_D_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_CD_D_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_CD_C_RED 15:11
+#define ALPHA_COLOR_LOOKUP_CD_C_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_CD_C_BLUE 4:0
+
+#define ALPHA_COLOR_LOOKUP_EF 0x080134
+#define ALPHA_COLOR_LOOKUP_EF_F_RED 31:27
+#define ALPHA_COLOR_LOOKUP_EF_F_GREEN 26:21
+#define ALPHA_COLOR_LOOKUP_EF_F_BLUE 20:16
+#define ALPHA_COLOR_LOOKUP_EF_E_RED 15:11
+#define ALPHA_COLOR_LOOKUP_EF_E_GREEN 10:5
+#define ALPHA_COLOR_LOOKUP_EF_E_BLUE 4:0
+
+// CRT Graphics Control
+
+#define CRT_DISPLAY_CTRL 0x080200
+#define CRT_DISPLAY_CTRL_FIFO 17:16
+#define CRT_DISPLAY_CTRL_FIFO_1 0
+#define CRT_DISPLAY_CTRL_FIFO_3 1
+#define CRT_DISPLAY_CTRL_FIFO_7 2
+#define CRT_DISPLAY_CTRL_FIFO_11 3
+#define CRT_DISPLAY_CTRL_TV_PHASE 15:15
+#define CRT_DISPLAY_CTRL_TV_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_TV_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE 14:14
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_CLOCK_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE 13:13
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_VSYNC_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE 12:12
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_HIGH 0
+#define CRT_DISPLAY_CTRL_HSYNC_PHASE_ACTIVE_LOW 1
+#define CRT_DISPLAY_CTRL_BLANK 10:10
+#define CRT_DISPLAY_CTRL_BLANK_OFF 0
+#define CRT_DISPLAY_CTRL_BLANK_ON 1
+#define CRT_DISPLAY_CTRL_SELECT 9:9
+#define CRT_DISPLAY_CTRL_SELECT_PANEL 0
+#define CRT_DISPLAY_CTRL_SELECT_CRT 1
+#define CRT_DISPLAY_CTRL_TIMING 8:8
+#define CRT_DISPLAY_CTRL_TIMING_DISABLE 0
+#define CRT_DISPLAY_CTRL_TIMING_ENABLE 1
+#define CRT_DISPLAY_CTRL_PIXEL 7:4
+#define CRT_DISPLAY_CTRL_GAMMA 3:3
+#define CRT_DISPLAY_CTRL_GAMMA_DISABLE 0
+#define CRT_DISPLAY_CTRL_GAMMA_ENABLE 1
+#define CRT_DISPLAY_CTRL_PLANE 2:2
+#define CRT_DISPLAY_CTRL_PLANE_DISABLE 0
+#define CRT_DISPLAY_CTRL_PLANE_ENABLE 1
+#define CRT_DISPLAY_CTRL_FORMAT 1:0
+#define CRT_DISPLAY_CTRL_FORMAT_8 0
+#define CRT_DISPLAY_CTRL_FORMAT_16 1
+#define CRT_DISPLAY_CTRL_FORMAT_32 2
+
+#define CRT_FB_ADDRESS 0x080204
+#define CRT_FB_ADDRESS_STATUS 31:31
+#define CRT_FB_ADDRESS_STATUS_CURRENT 0
+#define CRT_FB_ADDRESS_STATUS_PENDING 1
+#define CRT_FB_ADDRESS_EXT 27:27
+#define CRT_FB_ADDRESS_EXT_LOCAL 0
+#define CRT_FB_ADDRESS_EXT_EXTERNAL 1
+#define CRT_FB_ADDRESS_CS 26:26
+#define CRT_FB_ADDRESS_CS_0 0
+#define CRT_FB_ADDRESS_CS_1 1
+#define CRT_FB_ADDRESS_ADDRESS 25:0
+
+#define CRT_FB_WIDTH 0x080208
+#define CRT_FB_WIDTH_WIDTH 29:16
+#define CRT_FB_WIDTH_OFFSET 13:0
+
+#define CRT_HORIZONTAL_TOTAL 0x08020C
+#define CRT_HORIZONTAL_TOTAL_TOTAL 27:16
+#define CRT_HORIZONTAL_TOTAL_DISPLAY_END 11:0
+
+#define CRT_HORIZONTAL_SYNC 0x080210
+#define CRT_HORIZONTAL_SYNC_WIDTH 23:16
+#define CRT_HORIZONTAL_SYNC_START 11:0
+
+#define CRT_VERTICAL_TOTAL 0x080214
+#define CRT_VERTICAL_TOTAL_TOTAL 26:16
+#define CRT_VERTICAL_TOTAL_DISPLAY_END 10:0
+
+#define CRT_VERTICAL_SYNC 0x080218
+#define CRT_VERTICAL_SYNC_HEIGHT 21:16
+#define CRT_VERTICAL_SYNC_START 10:0
+
+#define CRT_SIGNATURE_ANALYZER 0x08021C
+#define CRT_SIGNATURE_ANALYZER_STATUS 31:16
+#define CRT_SIGNATURE_ANALYZER_ENABLE 3:3
+#define CRT_SIGNATURE_ANALYZER_ENABLE_DISABLE 0
+#define CRT_SIGNATURE_ANALYZER_ENABLE_ENABLE 1
+#define CRT_SIGNATURE_ANALYZER_RESET 2:2
+#define CRT_SIGNATURE_ANALYZER_RESET_NORMAL 0
+#define CRT_SIGNATURE_ANALYZER_RESET_RESET 1
+#define CRT_SIGNATURE_ANALYZER_SOURCE 1:0
+#define CRT_SIGNATURE_ANALYZER_SOURCE_RED 0
+#define CRT_SIGNATURE_ANALYZER_SOURCE_GREEN 1
+#define CRT_SIGNATURE_ANALYZER_SOURCE_BLUE 2
+
+#define CRT_CURRENT_LINE 0x080220
+#define CRT_CURRENT_LINE_LINE 10:0
+
+#define CRT_MONITOR_DETECT 0x080224
+#define CRT_MONITOR_DETECT_ENABLE 24:24
+#define CRT_MONITOR_DETECT_ENABLE_DISABLE 0
+#define CRT_MONITOR_DETECT_ENABLE_ENABLE 1
+#define CRT_MONITOR_DETECT_RED 23:16
+#define CRT_MONITOR_DETECT_GREEN 15:8
+#define CRT_MONITOR_DETECT_BLUE 7:0
+
+
+// Palette RAM
+
+#define PANEL_PALETTE_RAM 0x080400
+#define VIDEO_PALETTE_RAM 0x080800
+#define CRT_PALETTE_RAM 0x080C00
+
+
+
+/*****************************************************************************\
+ * ZV PORT *
+\*****************************************************************************/
+
+#define CAPTURE_CONTROL 0x090000
+#define CAPTURE_CONTROL_FIELD 27:27
+#define CAPTURE_CONTROL_FIELD_EVEN 0
+#define CAPTURE_CONTROL_FIELD_ODD 1
+#define CAPTURE_CONTROL_INTERLACE 26:26
+#define CAPTURE_CONTROL_INTERLACE_NON_INTERLACED 0
+#define CAPTURE_CONTROL_INTERLACE_INTERLACED 1
+#define CAPTURE_CONTROL_CAPTURE_BUFFER 25:25
+#define CAPTURE_CONTROL_CAPTURE_BUFFER_0 0
+#define CAPTURE_CONTROL_CAPTURE_BUFFER_1 1
+#define CAPTURE_CONTROL_VSYNC 24:24
+#define CAPTURE_CONTROL_VSYNC_INACTIVE 0
+#define CAPTURE_CONTROL_VSYNC_ACTIVE 1
+#define CAPTURE_CONTROL_ADJ 19:19
+#define CAPTURE_CONTROL_ADJ_NORMAL 0
+#define CAPTURE_CONTROL_ADJ_DELAY 1
+#define CAPTURE_CONTROL_HORIZONTAL_AVE 18:18
+#define CAPTURE_CONTROL_HORIZONTAL_AVE_DISABLE 0
+#define CAPTURE_CONTROL_HORIZONTAL_AVE_ENABLE 1
+#define CAPTURE_CONTROL_2TO1_VERTICAL_SHRINK 17:17
+#define CAPTURE_CONTROL_2TO1_VERTICAL_SHRINK_DISABLE 0
+#define CAPTURE_CONTROL_2TO1_VERTICAL_SHRINK_ENABLE 1
+#define CAPTURE_CONTROL_2TO1_HORIZONTAL_SHRINK 16:16
+#define CAPTURE_CONTROL_2TO1_HORIZONTAL_SHRINK_DISABLE 0
+#define CAPTURE_CONTROL_2TO1_HORIZONTAL_SHRINK_ENABLE 1
+#define CAPTURE_CONTROL_FIELD_DETECT 15:15
+#define CAPTURE_CONTROL_FIELD_DETECT_RISING 0
+#define CAPTURE_CONTROL_FIELD_DETECT_FALLING 1
+#define CAPTURE_CONTROL_VSYNC_PHASE 14:14
+#define CAPTURE_CONTROL_VSYNC_PHASE_ACTIVE_HIGH 0
+#define CAPTURE_CONTROL_VSYNC_PHASE_ACTIVE_LOW 1
+#define CAPTURE_CONTROL_HREF_PHASE 13:13
+#define CAPTURE_CONTROL_HREF_PHASE_ACTIVE_HIGH 0
+#define CAPTURE_CONTROL_HREF_PHASE_ACTIVE_LOW 1
+#define CAPTURE_CONTROL_CLOCK_POLARITY 12:12
+#define CAPTURE_CONTROL_CLOCK_POLARITY_ACTIVE_HIGH 0
+#define CAPTURE_CONTROL_CLOCK_POLARITY_ACTIVE_LOW 1
+#define CAPTURE_CONTROL_UV_SWAP 11:11
+#define CAPTURE_CONTROL_UV_SWAP_DISABLE 0
+#define CAPTURE_CONTROL_UV_SWAP_ENABLE 1
+#define CAPTURE_CONTROL_BYTE_SWAP 10:10
+#define CAPTURE_CONTROL_BYTE_SWAP_DISABLE 0
+#define CAPTURE_CONTROL_BYTE_SWAP_ENABLE 1
+#define CAPTURE_CONTROL_CAPTURE_SIZE 9:9
+#define CAPTURE_CONTROL_CAPTURE_SIZE_16 0
+#define CAPTURE_CONTROL_CAPTURE_SIZE_8 1
+#define CAPTURE_CONTROL_CAPTURE_FORMAT 8:8
+#define CAPTURE_CONTROL_CAPTURE_FORMAT_YUV 0
+#define CAPTURE_CONTROL_CAPTURE_FORMAT_RGB 1
+#define CAPTURE_CONTROL_FIELD_SWAP 7:7
+#define CAPTURE_CONTROL_FIELD_SWAP_DISABLE 0
+#define CAPTURE_CONTROL_FIELD_SWAP_ENABLE 1
+#define CAPTURE_CONTROL_INTERLACE_WEAVE 6:6
+#define CAPTURE_CONTROL_INTERLACE_WEAVE_DISABLE 0
+#define CAPTURE_CONTROL_INTERLACE_WEAVE_ENABLE 1
+#define CAPTURE_CONTROL_INTERLACE_BOB 5:5
+#define CAPTURE_CONTROL_INTERLACE_BOB_DISABLE 0
+#define CAPTURE_CONTROL_INTERLACE_BOB_ENABLE 1
+#define CAPTURE_CONTROL_DOUBLE_BUFFERING 4:4
+#define CAPTURE_CONTROL_DOUBLE_BUFFERING_DISABLE 0
+#define CAPTURE_CONTROL_DOUBLE_BUFFERING_ENABLE 1
+#define CAPTURE_CONTROL_CAPTURE_CONTROL 3:3
+#define CAPTURE_CONTROL_CAPTURE_CONTROL_CONTINUOUS 0
+#define CAPTURE_CONTROL_CAPTURE_CONTROL_CONDITIONAL 1
+#define CAPTURE_CONTROL_RGB 2:2
+#define CAPTURE_CONTROL_RGB_DISABLE 0
+#define CAPTURE_CONTROL_RGB_ENABLE 1
+#define CAPTURE_CONTROL_656 1:1
+#define CAPTURE_CONTROL_656_DISABLE 0
+#define CAPTURE_CONTROL_656_ENABLE 1
+#define CAPTURE_CONTROL_CAPTURE 0:0
+#define CAPTURE_CONTROL_CAPTURE_DISABLE 0
+#define CAPTURE_CONTROL_CAPTURE_ENABLE 1
+
+#define CAPTURE_CLIPPING 0x090004
+#define CAPTURE_CLIPPING_YCLIP 25:16
+#define CAPTURE_CLIPPING_XCLIP 9:0
+
+#define CAPTURE_SIZE 0x90008
+#define CAPTURE_SIZE_HEIGHT 26:16
+#define CAPTURE_SIZE_WIDTH 10:0
+
+#define CAPTURE_BUFFER_0_ADDRESS 0x9000C
+#define CAPTURE_BUFFER_0_ADDRESS_STATUS 31:31
+#define CAPTURE_BUFFER_0_ADDRESS_STATUS_CURRENT 0
+#define CAPTURE_BUFFER_0_ADDRESS_STATUS_PENDING 1
+#define CAPTURE_BUFFER_0_ADDRESS_EXT 27:27
+#define CAPTURE_BUFFER_0_ADDRESS_EXT_LOCAL 0
+#define CAPTURE_BUFFER_0_ADDRESS_EXT_EXTERNAL 1
+#define CAPTURE_BUFFER_0_ADDRESS_CS 26:26
+#define CAPTURE_BUFFER_0_ADDRESS_CS_0 0
+#define CAPTURE_BUFFER_0_ADDRESS_CS_1 1
+#define CAPTURE_BUFFER_0_ADDRESS_ADDRESS 25:0
+
+#define CAPTURE_BUFFER_1_ADDRESS 0x90010
+#define CAPTURE_BUFFER_1_ADDRESS_STATUS 31:31
+#define CAPTURE_BUFFER_1_ADDRESS_STATUS_CURRENT 0
+#define CAPTURE_BUFFER_1_ADDRESS_STATUS_PENDING 1
+#define CAPTURE_BUFFER_1_ADDRESS_EXT 27:27
+#define CAPTURE_BUFFER_1_ADDRESS_EXT_LOCAL 0
+#define CAPTURE_BUFFER_1_ADDRESS_EXT_EXTERNAL 1
+#define CAPTURE_BUFFER_1_ADDRESS_CS 26:26
+#define CAPTURE_BUFFER_1_ADDRESS_CS_0 0
+#define CAPTURE_BUFFER_1_ADDRESS_CS_1 1
+#define CAPTURE_BUFFER_1_ADDRESS_ADDRESS 25:0
+
+#define CAPTURE_BUFFER_OFFSET 0x90014
+#define CAPTURE_BUFFER_OFFSET_OFFSET 15:0
+
+#define CAPTURE_FIFO 0x90018
+#define CAPTURE_FIFO_CONTROL 2:0
+#define CAPTURE_FIFO_CONTROL_2 0
+#define CAPTURE_FIFO_CONTROL_3 1
+#define CAPTURE_FIFO_CONTROL_4 2
+#define CAPTURE_FIFO_CONTROL_5 3
+#define CAPTURE_FIFO_CONTROL_6 4
+#define CAPTURE_FIFO_CONTROL_8 5
+#define CAPTURE_FIFO_CONTROL_10 6
+#define CAPTURE_FIFO_CONTROL_12 7
+
+#define CAPTURE_YRGB_CONST 0x09001C
+#define CAPTURE_YRGB_CONST_Y 31:24
+#define CAPTURE_YRGB_CONST_R 23:16
+#define CAPTURE_YRGB_CONST_G 15:8
+#define CAPTURE_YRGB_CONST_B 7:0
+
+
+/*****************************************************************************\
+ * AC97 / I2S *
+\*****************************************************************************/
+
+/* AC97 TX Slot 0: TAG */
+#define AC97_TX_SLOT0 0x0A0100
+#define AC97_TX_SLOT0_VALID_FRAME_TAG 15:15
+#define AC97_TX_SLOT0_VALID_FRAME_TAG_IGNORE 0
+#define AC97_TX_SLOT0_VALID_FRAME_TAG_INTERPRET 1
+#define AC97_TX_SLOT0_VALID_S1 14:14
+#define AC97_TX_SLOT0_VALID_S1_NO_DATA 0
+#define AC97_TX_SLOT0_VALID_S1_DATA 1
+#define AC97_TX_SLOT0_VALID_S2 13:13
+#define AC97_TX_SLOT0_VALID_S2_NO_DATA 0
+#define AC97_TX_SLOT0_VALID_S2_DATA 1
+#define AC97_TX_SLOT0_VALID_S3 12:12
+#define AC97_TX_SLOT0_VALID_S3_NO_DATA 0
+#define AC97_TX_SLOT0_VALID_S3_DATA 1
+#define AC97_TX_SLOT0_VALID_S4 11:11
+#define AC97_TX_SLOT0_VALID_S4_NO_DATA 0
+#define AC97_TX_SLOT0_VALID_S4_DATA 1
+
+/* AC97 TX Slot 1: Command Address Port */
+#define AC97_TX_SLOT1 0x0A0104
+#define AC97_TX_SLOT1_READ_WRITE 19:19
+#define AC97_TX_SLOT1_READ_WRITE_WRITE 0
+#define AC97_TX_SLOT1_READ_WRITE_READ 1
+#define AC97_TX_SLOT1_CONTROL_REGISTER_INDEX 18:12
+
+/* AC97 TX Slot 2: Command Address Port */
+#define AC97_TX_SLOT2 0x0A0108
+#define AC97_TX_SLOT2_DATA 19:4
+
+/* AC97 TX Slot 3: PCM Playback Left Channel */
+#define AC97_TX_SLOT3 0x0A010C
+#define AC97_TX_SLOT3_DATA 19:0
+
+/* AC97 TX Slot 4: PCM Playback Right Channel */
+#define AC97_TX_SLOT4 0x0A0110
+#define AC97_TX_SLOT4_DATA 19:0
+
+/* AC97 RX Slot 0: TAG */
+#define AC97_RX_SLOT0 0x0A0140
+#define AC97_RX_SLOT0_CODEC_READY_FLAG 15:15
+#define AC97_RX_SLOT0_CODEC_READY_FLAG_IGNORE 0
+#define AC97_RX_SLOT0_CODEC_READY_FLAG_READY 1
+#define AC97_RX_SLOT0_VALID_S1 14:14
+#define AC97_RX_SLOT0_VALID_S1_NO_DATA 0
+#define AC97_RX_SLOT0_VALID_S1_DATA 1
+#define AC97_RX_SLOT0_VALID_S2 13:13
+#define AC97_RX_SLOT0_VALID_S2_NO_DATA 0
+#define AC97_RX_SLOT0_VALID_S2_DATA 1
+#define AC97_RX_SLOT0_VALID_S3 12:12
+#define AC97_RX_SLOT0_VALID_S3_NO_DATA 0
+#define AC97_RX_SLOT0_VALID_S3_DATA 1
+#define AC97_RX_SLOT0_VALID_S4 11:11
+#define AC97_RX_SLOT0_VALID_S4_NO_DATA 0
+#define AC97_RX_SLOT0_VALID_S4_DATA 1
+
+/* AC97 RX Slot 1: Status Address Port */
+#define AC97_RX_SLOT1 0x0A0144
+#define AC97_RX_SLOT1_CONTROL_REGISTER_INDEX 18:12
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S3 11:11
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S3_SEND 0
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S3_DO_NOT_SEND 1
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S4 10:10
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S4_SEND 0
+#define AC97_RX_SLOT1_ON_DEMAND_DATA_S4_DO_NOT_SEND 1
+
+/* AC97 RX Slot 2: Status Address Port */
+#define AC97_RX_SLOT2 0x0A0148
+#define AC97_RX_SLOT2_DATA 19:4
+
+/* AC97 RX Slot 3: PCM Record Left Channel */
+#define AC97_RX_SLOT3 0x0A014C
+#define AC97_RX_SLOT3_DATA 19:0
+
+/* AC97 RX Slot 4: PCM Record Right Channel */
+#define AC97_RX_SLOT4 0x0A0150
+#define AC97_RX_SLOT4_DATA 19:0
+
+/* AC97 Control & Status */
+#define AC97_CONTROL_STATUS 0x0A0180
+#define AC97_CONTROL_STATUS_DATA_DROPPED_COUNT 15:10
+#define AC97_CONTROL_STATUS_SYNC_CONTROL 9:9
+#define AC97_CONTROL_STATUS_SYNC_CONTROL_ENABLE 0
+#define AC97_CONTROL_STATUS_SYNC_CONTROL_STOP 1
+#define AC97_CONTROL_STATUS_CLOCK_CONTROL 8:8
+#define AC97_CONTROL_STATUS_CLOCK_CONTROL_NOT_RUNNING 0
+#define AC97_CONTROL_STATUS_CLOCK_CONTROL_RUNNING 1
+#define AC97_CONTROL_STATUS_WAKEUP_REQUEST 7:7
+#define AC97_CONTROL_STATUS_WAKEUP_REQUEST_DISABLE 0
+#define AC97_CONTROL_STATUS_WAKEUP_REQUEST_ENABLE 1
+#define AC97_CONTROL_STATUS_STATUS 5:4
+#define AC97_CONTROL_STATUS_STATUS_OFF 0
+#define AC97_CONTROL_STATUS_STATUS_RESET 1
+#define AC97_CONTROL_STATUS_STATUS_WAITING 2
+#define AC97_CONTROL_STATUS_STATUS_ACTIVE 3
+#define AC97_CONTROL_STATUS_WAKEUP_INTERRUPT 3:3
+#define AC97_CONTROL_STATUS_WAKEUP_INTERRUPT_DISABLED 0
+#define AC97_CONTROL_STATUS_WAKEUP_INTERRUPT_ENABLED 1
+#define AC97_CONTROL_STATUS_WARM_RESET 2:2
+#define AC97_CONTROL_STATUS_WARM_RESET_NORMAL 0
+#define AC97_CONTROL_STATUS_WARM_RESET_RESET 1
+#define AC97_CONTROL_STATUS_COLD_RESET 1:1
+#define AC97_CONTROL_STATUS_COLD_RESET_NORMAL 0
+#define AC97_CONTROL_STATUS_COLD_RESET_RESET 1
+#define AC97_CONTROL_STATUS_CONTROL 0:0
+#define AC97_CONTROL_STATUS_CONTROL_DISABLED 0
+#define AC97_CONTROL_STATUS_CONTROL_ENABLED 1
+
+/* I2S TX Data Left */
+#define I2S_TX_DATA_LEFT 0x0A0200
+#define I2S_TX_DATA_LEFT_DATA 15:0
+
+/* I2S TX Data Right */
+#define I2S_TX_DATA_RIGHT 0x0A0204
+#define I2S_TX_DATA_RIGHT_DATA 15:0
+
+/* I2S RX Data Left */
+#define I2S_RX_DATA_LEFT 0x0A0208
+#define I2S_RX_DATA_LEFT_DATA 15:0
+
+/* I2S RX Data Right */
+#define I2S_RX_DATA_RIGHT 0x0A020C
+#define I2S_RX_DATA_RIGHT_DATA 15:0
+
+/* I2S Control & Status */
+#define I2S_CONTROL_STATUS 0x0A0210
+#define I2S_CONTROL_STATUS_RECEIVE_STATUS 11:11
+#define I2S_CONTROL_STATUS_RECEIVE_STATUS_NO_ERROR 0
+#define I2S_CONTROL_STATUS_RECEIVE_STATUS_OVERFLOW 1
+#define I2S_CONTROL_STATUS_TRANSMIT_STATUS 10:10
+#define I2S_CONTROL_STATUS_TRANSMIT_STATUS_NO_ERROR 0
+#define I2S_CONTROL_STATUS_TRANSMIT_STATUS_UNDERFLOW 1
+#define I2S_CONTROL_STATUS_CONTROL 2:2
+#define I2S_CONTROL_STATUS_CONTROL_DISABLED 0
+#define I2S_CONTROL_STATUS_CONTROL_ENABLED 1
+
+/* I2S Clock Control */
+#define I2S_CLOCK_CONTROL 0x0A0214
+#define I2S_CLOCK_CONTROL_MODE_SELECT 7:7
+#define I2S_CLOCK_CONTROL_MODE_SELECT_SLAVE 0
+#define I2S_CLOCK_CONTROL_MODE_SELECT_MASTER 1
+#define I2S_CLOCK_CONTROL_WORD_SELECT 6:5
+#define I2S_CLOCK_CONTROL_WORD_SELECT_16BIT 0
+#define I2S_CLOCK_CONTROL_WORD_SELECT_24BIT 1
+#define I2S_CLOCK_CONTROL_WORD_SELECT_32BIT 2
+#define I2S_CLOCK_CONTROL_CLOCK_DIVIDER 4:0
+
+/*****************************************************************************\
+ * 8051 *
+\*****************************************************************************/
+
+/* Reset */
+#define U8051_RESET 0x0B0000
+#define U8051_RESET_CONTROL 0:0
+#define U8051_RESET_CONTROL_RESET 0
+#define U8051_RESET_CONTROL_ENABLE 1
+
+/* Mode Select */
+#define U8051_MODE_SELECT 0x0B0004
+#define U8051_MODE_SELECT_USB_SLAVE_WAIT_STATE 7:6
+#define U8051_MODE_SELECT_USB_SLAVE_WAIT_STATE_NONE 0
+#define U8051_MODE_SELECT_USB_SLAVE_WAIT_STATE_1WS 1
+#define U8051_MODE_SELECT_USB_SLAVE_WAIT_STATE_2WS 2
+#define U8051_MODE_SELECT_USB_SLAVE_WAIT_STATE_3WS 3
+#define U8051_MODE_SELECT_SRAM 5:5
+#define U8051_MODE_SELECT_SRAM_ENABLED 0
+#define U8051_MODE_SELECT_SRAM_DISABLED 1
+#define U8051_MODE_SELECT_EXTERNAL_INTERFACE 4:4
+#define U8051_MODE_SELECT_EXTERNAL_INTERFACE_12BIT 0
+#define U8051_MODE_SELECT_EXTERNAL_INTERFACE_8BIT 1
+#define U8051_MODE_SELECT_TEST_MODE 3:3
+#define U8051_MODE_SELECT_TEST_MODE_NORMAL 0
+#define U8051_MODE_SELECT_TEST_MODE_ENABLED 1
+#define U8051_MODE_SELECT_CODEC_SELECT 2:2
+#define U8051_MODE_SELECT_CODEC_SELECT_AC97 0
+#define U8051_MODE_SELECT_CODEC_SELECT_I2S 1
+#define U8051_MODE_SELECT_DIVIDER 1:0
+#define U8051_MODE_SELECT_DIVIDER_2 0
+#define U8051_MODE_SELECT_DIVIDER_3 1
+#define U8051_MODE_SELECT_DIVIDER_4 2
+#define U8051_MODE_SELECT_DIVIDER_5 3
+
+/* 8051 Protocol Interrupt */
+#define U8051_8051_PROTOCOL_INTERRUPT 0x0B0008
+#define U8051_8051_PROTOCOL_INTERRUPT_TOKEN 31:0
+
+/* 8051 Protocol Interrupt */
+#define IRQ_8051_TO_HIF 0x000B0008
+#define IRQ_8051_TO_HIF_CODE 7:0
+#define IRQ_8051_TO_HIF_PARAMETER1 15:8
+#define IRQ_8051_TO_HIF_PARAMETER2 23:16
+#define IRQ_8051_TO_HIF_PARAMETER3 31:24
+
+/* CPU Protocol Interrupt */
+#define U8051_CPU_PROTOCOL_INTERRUPT 0x0B000C
+#define U8051_CPU_PROTOCOL_INTERRUPT_TOKEN 31:0
+
+/* CPU Protocol Interrupt */
+#define IRQ_HIF_TO_8051 0x000B000C
+#define IRQ_HIF_TO_8051_CODE 31:0
+#define IRQ_HIF_TO_8051_CODE1 7:0
+#define IRQ_HIF_TO_8051_CODE2 15:8
+#define IRQ_HIF_TO_8051_CODE3 23:16
+#define IRQ_HIF_TO_8051_CODE4 31:24
+
+/* SRAM Address Space */
+#define U8051_SRAM 0x000C0000 // 8051: 0000-0FFF
+#define U8051_SRAM1 0x000C1000 // 8051: 1000-1FFF
+#define U8051_SRAM2 0x000C2000 // 8051: 2000-2FFF
+#define U8051_SRAM3 0x000C3000 // 8051: 3000-3FFF (dual port SRAM)
+
+#define U8051_SRAM_SIZE 0x004000
+
+/*****************************************************************************\
+ * DMA *
+\*****************************************************************************/
+
+/* DMA 0 SDRAM Address */
+#define DMA0_SDRAM 0x0D0000
+#define DMA0_SDRAM_MEMORY 27:26
+#define DMA0_SDRAM_MEMORY_LOCAL 0
+#define DMA0_SDRAM_MEMORY_EXTERNAL_CS0 2
+#define DMA0_SDRAM_MEMORY_EXTERNAL_CS1 3
+#define DMA0_SDRAM_ADDRESS 25:0
+
+/* DMA 0 SRAM Address */
+#define DMA0_SRAM 0x0D0004
+#define DMA0_SRAM_ADDRESS 15:0
+
+/* DMA 0 Size & Control */
+#define DMA0_SIZE_CONTROL 0x0D0008
+#define DMA0_SIZE_CONTROL_ACTIVE 31:31
+#define DMA0_SIZE_CONTROL_ACTIVE_IDLE 0
+#define DMA0_SIZE_CONTROL_ACTIVE_START 1
+#define DMA0_SIZE_CONTROL_DIRECTION 30:30
+#define DMA0_SIZE_CONTROL_DIRECTION_WRITE_SRAM 0
+#define DMA0_SIZE_CONTROL_DIRECTION_READ_SRAM 1
+#define DMA0_SIZE_CONTROL_SIZE 15:0
+
+/* DMA 1 Source Address */
+#define DMA1_SOURCE 0x0D0010
+#define DMA1_SOURCE_MEMORY 27:26
+#define DMA1_SOURCE_MEMORY_LOCAL 0
+#define DMA1_SOURCE_MEMORY_EXTERNAL_CS0 2
+#define DMA1_SOURCE_MEMORY_EXTERNAL_CS1 3
+#define DMA1_SOURCE_ADDRESS 25:0
+
+/* DMA 1 Destination Address */
+#define DMA1_DESTINATION 0x0D0014
+#define DMA1_DESTINATION_MEMORY 27:26
+#define DMA1_DESTINATION_MEMORY_LOCAL 0
+#define DMA1_DESTINATION_MEMORY_EXTERNAL_CS0 2
+#define DMA1_DESTINATION_MEMORY_EXTERNAL_CS1 3
+#define DMA1_DESTINATION_ADDRESS 25:0
+
+/* DMA 1 Size & Control */
+#define DMA1_SIZE_CONTROL 0x0D0018
+#define DMA1_SIZE_CONTROL_ACTIVE 31:31
+#define DMA1_SIZE_CONTROL_ACTIVE_IDLE 0
+#define DMA1_SIZE_CONTROL_ACTIVE_START 1
+#define DMA1_SIZE_CONTROL_SIZE 23:0
+
+/* DMA Abort & Interrupt */
+#define DMA_ABORT_INTERRUPT 0x0D0020
+#define DMA_ABORT_INTERRUPT_ABORT_1 5:5
+#define DMA_ABORT_INTERRUPT_ABORT_1_ENABLE 0
+#define DMA_ABORT_INTERRUPT_ABORT_1_ABORT 1
+#define DMA_ABORT_INTERRUPT_ABORT_0 4:4
+#define DMA_ABORT_INTERRUPT_ABORT_0_ENABLE 0
+#define DMA_ABORT_INTERRUPT_ABORT_0_ABORT 1
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_1 1:1
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_1_NOT_ACTIVE 0
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_1_ACTIVE 1
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_0 0:0
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_0_NOT_ACTIVE 0
+#define DMA_ABORT_INTERRUPT_INTERRUPT_STATUS_0_ACTIVE 1
+
+/* CSC engine */
+#define CSC_Y_SOURCE_BASE 0x0000C8
+#define CSC_Y_SOURCE_BASE_EXT 27:27
+#define CSC_Y_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_Y_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_Y_SOURCE_BASE_CS 26:26
+#define CSC_Y_SOURCE_BASE_CS_0 0
+#define CSC_Y_SOURCE_BASE_CS_1 1
+#define CSC_Y_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_CONSTANTS 0x0000CC
+#define CSC_CONSTANTS_Y 31:24
+#define CSC_CONSTANTS_R 23:16
+#define CSC_CONSTANTS_G 15:8
+#define CSC_CONSTANTS_B 7:0
+
+#define CSC_Y_SOURCE_X 0x0000D0
+#define CSC_Y_SOURCE_X_INTEGER 26:16
+#define CSC_Y_SOURCE_X_FRACTION 15:3
+
+#define CSC_Y_SOURCE_Y 0x0000D4
+#define CSC_Y_SOURCE_Y_INTEGER 27:16
+#define CSC_Y_SOURCE_Y_FRACTION 15:3
+
+#define CSC_U_SOURCE_BASE 0x0000D8
+#define CSC_U_SOURCE_BASE_EXT 27:27
+#define CSC_U_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_U_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_U_SOURCE_BASE_CS 26:26
+#define CSC_U_SOURCE_BASE_CS_0 0
+#define CSC_U_SOURCE_BASE_CS_1 1
+#define CSC_U_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_V_SOURCE_BASE 0x0000DC
+#define CSC_V_SOURCE_BASE_EXT 27:27
+#define CSC_V_SOURCE_BASE_EXT_LOCAL 0
+#define CSC_V_SOURCE_BASE_EXT_EXTERNAL 1
+#define CSC_V_SOURCE_BASE_CS 26:26
+#define CSC_V_SOURCE_BASE_CS_0 0
+#define CSC_V_SOURCE_BASE_CS_1 1
+#define CSC_V_SOURCE_BASE_ADDRESS 25:0
+
+#define CSC_SOURCE_DIMENSION 0x0000E0
+#define CSC_SOURCE_DIMENSION_X 31:16
+#define CSC_SOURCE_DIMENSION_Y 15:0
+
+#define CSC_SOURCE_PITCH 0x0000E4
+#define CSC_SOURCE_PITCH_Y 31:16
+#define CSC_SOURCE_PITCH_UV 15:0
+
+#define CSC_DESTINATION 0x0000E8
+#define CSC_DESTINATION_WRAP 31:31
+#define CSC_DESTINATION_WRAP_DISABLE 0
+#define CSC_DESTINATION_WRAP_ENABLE 1
+#define CSC_DESTINATION_X 27:16
+#define CSC_DESTINATION_Y 11:0
+
+#define CSC_DESTINATION_DIMENSION 0x0000EC
+#define CSC_DESTINATION_DIMENSION_X 31:16
+#define CSC_DESTINATION_DIMENSION_Y 15:0
+
+#define CSC_DESTINATION_PITCH 0x0000F0
+#define CSC_DESTINATION_PITCH_X 31:16
+#define CSC_DESTINATION_PITCH_Y 15:0
+
+#define CSC_SCALE_FACTOR 0x0000F4
+#define CSC_SCALE_FACTOR_HORIZONTAL 31:16
+#define CSC_SCALE_FACTOR_VERTICAL 15:0
+
+#define CSC_DESTINATION_BASE 0x0000F8
+#define CSC_DESTINATION_BASE_EXT 27:27
+#define CSC_DESTINATION_BASE_EXT_LOCAL 0
+#define CSC_DESTINATION_BASE_EXT_EXTERNAL 1
+#define CSC_DESTINATION_BASE_CS 26:26
+#define CSC_DESTINATION_BASE_CS_0 0
+#define CSC_DESTINATION_BASE_CS_1 1
+#define CSC_DESTINATION_BASE_ADDRESS 25:0
+
+#define CSC_CONTROL 0x0000FC
+#define CSC_CONTROL_STATUS 31:31
+#define CSC_CONTROL_STATUS_STOP 0
+#define CSC_CONTROL_STATUS_START 1
+#define CSC_CONTROL_SOURCE_FORMAT 30:28
+#define CSC_CONTROL_SOURCE_FORMAT_YUV422 0
+#define CSC_CONTROL_SOURCE_FORMAT_YUV420I 1
+#define CSC_CONTROL_SOURCE_FORMAT_YUV420 2
+#define CSC_CONTROL_SOURCE_FORMAT_YVU9 3
+#define CSC_CONTROL_SOURCE_FORMAT_IYU1 4
+#define CSC_CONTROL_SOURCE_FORMAT_IYU2 5
+#define CSC_CONTROL_SOURCE_FORMAT_RGB565 6
+#define CSC_CONTROL_SOURCE_FORMAT_RGB8888 7
+#define CSC_CONTROL_DESTINATION_FORMAT 27:26
+#define CSC_CONTROL_DESTINATION_FORMAT_RGB565 0
+#define CSC_CONTROL_DESTINATION_FORMAT_RGB8888 1
+#define CSC_CONTROL_HORIZONTAL_FILTER 25:25
+#define CSC_CONTROL_HORIZONTAL_FILTER_DISABLE 0
+#define CSC_CONTROL_HORIZONTAL_FILTER_ENABLE 1
+#define CSC_CONTROL_VERTICAL_FILTER 24:24
+#define CSC_CONTROL_VERTICAL_FILTER_DISABLE 0
+#define CSC_CONTROL_VERTICAL_FILTER_ENABLE 1
+#define CSC_CONTROL_BYTE_ORDER 23:23
+#define CSC_CONTROL_BYTE_ORDER_YUYV 0
+#define CSC_CONTROL_BYTE_ORDER_UYVY 1
+
+/*****************************************************************************\
+ * 2D ENGINE DATA PORT *
+\*****************************************************************************/
+
+#define DE_BASE_ADDRESS 0x100000
+#define DE_DATA_PORT 0x110000
+#define DE_DATA_PORT_SIZE 0x040000
+
+#endif /* _SM50x_H_ */
+
--
1.7.9.msysgit.0
[-- Attachment #3: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: 答复: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-09 9:50 ` 答复: " Aaron.Chen 陈俊杰
@ 2012-03-09 16:30 ` Ilija Hadzic
2012-03-13 9:33 ` Aaron.Chen 陈俊杰
0 siblings, 1 reply; 10+ messages in thread
From: Ilija Hadzic @ 2012-03-09 16:30 UTC (permalink / raw)
To: Aaron.Chen 陈俊杰
Cc: caesar.qiu 裘赛海, Paul Menzel, dri-devel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: TEXT/PLAIN; charset=X-UNKNOWN; format=flowed, Size: 4553 bytes --]
A couple of non-technical things. First, I think you are sending the patch
to the wrong list. dri-devel is for drivers that go under drivers/gpu/drm.
Your driver is apparently fbdev driver and thus belongs to
linux-fbdev@vger.kernel.org list (see the Maintainers file)
Second, your patch generates about 9000 coding style errors when you run
through ./scripts/checkpatch.pl script available in the Linux kernel tree.
You need to clean up. See also Documentation/CodingStyle. Also, you must
break up the patch into smaller self-contained units that logically make
sense. Nobody can review 17000 lines of code in one shot.
Last, but probably the most important. All your files have the proprietary
license in the comment overhead. You (actually your company lawyers) have
to decide which license you are releasing this dirver under and make sure
it is compatible with Linux kernel (i.e. GPL) and you have to state that
in each file that is being added.
-- Ilija
On Fri, 9 Mar 2012, [utf-8] Aaron.Chen é~Y~Hä¿~Jæ~]° wrote:
> Hi Paul&Alex,
>
> Thank you very much for your great help.
>
> Here is the first patch.
>
> Regards
> Aaron
>
> -----é®ä»¶å件-----
> å件人: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
> åéæ¶é´: 2012å¹´3æ6æ¥ 22:38
> æ¶ä»¶äºº: Alex Deucher
> æé: Aaron.Chen éä¿æ°; caesar.qiu è£èµæµ·; dri-devel@lists.freedesktop.org
> 主é¢: Re: [korg]help: How to submit a kernel driver on kernel.org.
>
> Dear Aaron,
>
>
> Am Dienstag, den 06.03.2012, 08:47 -0500 schrieb Alex Deucher:
>> On Mon, Mar 5, 2012 at 11:13 PM, Aaron.Chen éä¿æ° wrote:
>
>>> Thank you very much for your guide. It's a great help for me.
>>>
>>> But I still have a little problem with the patch thing. I'm not familiar with the git.
>>> 1.Shall I need to do the clone and get the source location and target directory first?
>>> 2.Where is the source location and target directory?
>>> 3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
>
> you can only get new features included upstream in the latest Linux kernel. So earliest version would be 3.4. You have to maintain you own repository for earlier version. But backporting should be not so much trouble if you have it included upstream.
>
>>> 4.or just email you the source code and tell you the changes?
>>>
>>> I'm looking forward your re-guide. Thank you so much.
>>
>> Your best bet it to clone Linus' git tree and then apply your patches:
>>
>> 1. clone Linus' git tree:
>> git clone
>> git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
>
> you can do this in between.
>
> cd linux
> git config --global user.name "éä¿æ° (Aaron Chen)"
> git config --global user.email aaron.chen@siliconmotion.com
>
>> 2. a) apply your first patch
>> b) if you patch adds new files to the source tree, add them:
>> git add path/to/files/file.c
>> git add path/to/files/file.h
>> etc. if the patch only modifies patches that are already
>> in the tree, you do not need to add them.
>> c) when the patch is applied commit it:
>> git commit -a -s
>> d) when you run the commit command you will be prompted to
>> enter a commit message. The commit message has the following format:
>>
>> subsystem: patch description
>>
>> description of what the patch does.
>>
>> Signed-off-by: Your name <your_email@domain.com>
>>
>> E.g.,
>>
>> fb: add initial code for video 5000 graphics
>>
>> This adds the initial support for the video 5000 graphics adapter. It
>> supports vga and lcd connectors.
>>
>> Signed-off-by: Joe Developer <joe.developer@example.com>
>>
>> e) repeat steps a-d for all of your patches 3. generate patches:
>> git format-patch -n
>>
>> where n is the number of patches you committed. E.g., if your driver
>> consists of 5 patches:
>> git format-patch -5
>>
>> 4. Send the patches to the list.
>
> Aaron, Git is nowadays documented pretty well. So just use
>
> git help command
>
> (like `git help commit`) to read the manual. Additionally you can just search for it using your favorite search engine. Interesting reads should be [1][2][3].
>
>
> Thanks,
>
> Paul
>
>
> [1] http://schacon.github.com/git/user-manual.html#cleaning-up-history
> [2] http://git-scm.com/documentation
> [3] http://progit.org/book/
>
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Re: [korg]help: How to submit a kernel driver on kernel.org.
2012-03-09 16:30 ` Ilija Hadzic
@ 2012-03-13 9:33 ` Aaron.Chen 陈俊杰
0 siblings, 0 replies; 10+ messages in thread
From: Aaron.Chen 陈俊杰 @ 2012-03-13 9:33 UTC (permalink / raw)
To: Ilija Hadzic; +Cc: caesar.qiu 裘赛海, Paul Menzel, dri-devel
Hi Ilija,
Thank you for your reply. We will check the coding style next time.
I don't know about the license thing. Is there any different license for choosing?
Regards
Aaron
-----邮件原件-----
发件人: Ilija Hadzic [mailto:ihadzic@research.bell-labs.com]
发送时间: 2012年3月10日 0:30
收件人: Aaron.Chen 陈俊杰
抄送: Paul Menzel; Alex Deucher; dri-devel@lists.freedesktop.org; caesar.qiu 裘赛海
主题: Re: 答复: [korg]help: How to submit a kernel driver on kernel.org.
A couple of non-technical things. First, I think you are sending the patch
to the wrong list. dri-devel is for drivers that go under drivers/gpu/drm.
Your driver is apparently fbdev driver and thus belongs to
linux-fbdev@vger.kernel.org list (see the Maintainers file)
Second, your patch generates about 9000 coding style errors when you run
through ./scripts/checkpatch.pl script available in the Linux kernel tree.
You need to clean up. See also Documentation/CodingStyle. Also, you must
break up the patch into smaller self-contained units that logically make
sense. Nobody can review 17000 lines of code in one shot.
Last, but probably the most important. All your files have the proprietary
license in the comment overhead. You (actually your company lawyers) have
to decide which license you are releasing this dirver under and make sure
it is compatible with Linux kernel (i.e. GPL) and you have to state that
in each file that is being added.
-- Ilija
On Fri, 9 Mar 2012, [utf-8] Aaron.Chen ~Y~H~J~] wrote:
> Hi Paul&Alex,
>
> Thank you very much for your great help.
>
> Here is the first patch.
>
> Regards
> Aaron
>
> -----邮件原件-----
> 发件人: Paul Menzel [mailto:paulepanter@users.sourceforge.net]
> 发送时间: 2012年3月6日 22:38
> 收件人: Alex Deucher
> 抄送: Aaron.Chen 陈俊杰; caesar.qiu 裘赛海; dri-devel@lists.freedesktop.org
> 主题: Re: [korg]help: How to submit a kernel driver on kernel.org.
>
> Dear Aaron,
>
>
> Am Dienstag, den 06.03.2012, 08:47 -0500 schrieb Alex Deucher:
>> On Mon, Mar 5, 2012 at 11:13 PM, Aaron.Chen 陈俊杰 wrote:
>
>>> Thank you very much for your guide. It's a great help for me.
>>>
>>> But I still have a little problem with the patch thing. I'm not familiar with the git.
>>> 1.Shall I need to do the clone and get the source location and target directory first?
>>> 2.Where is the source location and target directory?
>>> 3.Our driver has pass the customer's test from kernel version 2.6.5 to 3.0.0, So what shall I do to submit a driver cover all these kernel version.
>
> you can only get new features included upstream in the latest Linux kernel. So earliest version would be 3.4. You have to maintain you own repository for earlier version. But backporting should be not so much trouble if you have it included upstream.
>
>>> 4.or just email you the source code and tell you the changes?
>>>
>>> I'm looking forward your re-guide. Thank you so much.
>>
>> Your best bet it to clone Linus' git tree and then apply your patches:
>>
>> 1. clone Linus' git tree:
>> git clone
>> git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
>
> you can do this in between.
>
> cd linux
> git config --global user.name "陈俊杰 (Aaron Chen)"
> git config --global user.email aaron.chen@siliconmotion.com
>
>> 2. a) apply your first patch
>> b) if you patch adds new files to the source tree, add them:
>> git add path/to/files/file.c
>> git add path/to/files/file.h
>> etc. if the patch only modifies patches that are already
>> in the tree, you do not need to add them.
>> c) when the patch is applied commit it:
>> git commit -a -s
>> d) when you run the commit command you will be prompted to
>> enter a commit message. The commit message has the following format:
>>
>> subsystem: patch description
>>
>> description of what the patch does.
>>
>> Signed-off-by: Your name <your_email@domain.com>
>>
>> E.g.,
>>
>> fb: add initial code for video 5000 graphics
>>
>> This adds the initial support for the video 5000 graphics adapter. It
>> supports vga and lcd connectors.
>>
>> Signed-off-by: Joe Developer <joe.developer@example.com>
>>
>> e) repeat steps a-d for all of your patches 3. generate patches:
>> git format-patch -n
>>
>> where n is the number of patches you committed. E.g., if your driver
>> consists of 5 patches:
>> git format-patch -5
>>
>> 4. Send the patches to the list.
>
> Aaron, Git is nowadays documented pretty well. So just use
>
> git help command
>
> (like `git help commit`) to read the manual. Additionally you can just search for it using your favorite search engine. Interesting reads should be [1][2][3].
>
>
> Thanks,
>
> Paul
>
>
> [1] http://schacon.github.com/git/user-manual.html#cleaning-up-history
> [2] http://git-scm.com/documentation
> [3] http://progit.org/book/
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-03-13 9:33 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-01 6:28 [korg]help: How to submit a kernel driver on kernel.org Aaron.Chen 陈俊杰
2012-03-01 19:05 ` Jerome Glisse
2012-03-01 21:50 ` Paul Menzel
2012-03-06 4:13 ` Aaron.Chen 陈俊杰
2012-03-06 13:47 ` Alex Deucher
2012-03-06 14:37 ` Paul Menzel
2012-03-09 9:50 ` 答复: " Aaron.Chen 陈俊杰
2012-03-09 16:30 ` Ilija Hadzic
2012-03-13 9:33 ` Aaron.Chen 陈俊杰
2012-03-06 7:24 ` Aaron.Chen 陈俊杰
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.