2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-11-20 08:38:24 +08:00

Merge branch 'linus' into x86/urgent

This commit is contained in:
Ingo Molnar 2008-08-25 14:39:12 +02:00
commit f58899bb02
422 changed files with 4496 additions and 4680 deletions

View File

@ -26,6 +26,12 @@ Mailing list: linux-ext4@vger.kernel.org
git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
- Note that it is highly important to install the mke2fs.conf file
that comes with the e2fsprogs 1.41.x sources in /etc/mke2fs.conf. If
you have edited the /etc/mke2fs.conf file installed on your system,
you will need to merge your changes with the version from e2fsprogs
1.41.x.
- Create a new filesystem using the ext4dev filesystem type: - Create a new filesystem using the ext4dev filesystem type:
# mke2fs -t ext4dev /dev/hda1 # mke2fs -t ext4dev /dev/hda1

View File

@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
fork. So if you have any comments or updates for this file, please try fork. So if you have any comments or updates for this file, please try
to update the original English file first. to update the original English file first.
Last Updated: 2007/11/16 Last Updated: 2008/08/21
================================== ==================================
これは、 これは、
linux-2.6.24/Documentation/HOWTO linux-2.6.27/Documentation/HOWTO
の和訳です。 の和訳です。
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日: 2007/11/10 翻訳日: 2008/8/5
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
校正者: 松倉さん <nbh--mats at nifty dot com> 校正者: 松倉さん <nbh--mats at nifty dot com>
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> 小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
@ -287,13 +287,15 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
に安定した状態にあると判断したときにリリースされます。目標は毎週新 に安定した状態にあると判断したときにリリースされます。目標は毎週新
しい -rc カーネルをリリースすることです。 しい -rc カーネルをリリースすることです。
- 以下の URL で各 -rc リリースに存在する既知の後戻り問題のリスト
が追跡されます-
http://kernelnewbies.org/known_regressions
- このプロセスはカーネルが 「準備ができた」と考えられるまで継続しま - このプロセスはカーネルが 「準備ができた」と考えられるまで継続しま
す。このプロセスはだいたい 6週間継続します。 す。このプロセスはだいたい 6週間継続します。
- 各リリースでの既知の後戻り問題(regression: このリリースの中で新規
に作り込まれた問題を指す) はその都度 Linux-kernel メーリングリスト
に投稿されます。ゴールとしては、カーネルが 「準備ができた」と宣言
する前にこのリストの長さをゼロに減らすことですが、現実には、数個の
後戻り問題がリリース時にたびたび残ってしまいます。
Andrew Morton が Linux-kernel メーリングリストにカーネルリリースについ Andrew Morton が Linux-kernel メーリングリストにカーネルリリースについ
て書いたことをここで言っておくことは価値があります- て書いたことをここで言っておくことは価値があります-
「カーネルがいつリリースされるかは誰も知りません。なぜなら、これは現 「カーネルがいつリリースされるかは誰も知りません。なぜなら、これは現
@ -303,18 +305,20 @@ Andrew Morton が Linux-kernel メーリングリストにカーネルリリー
2.6.x.y -stable カーネルツリー 2.6.x.y -stable カーネルツリー
--------------------------- ---------------------------
バージョンに4つ目の数字がついたカーネルは -stable カーネルです。これに バージョン番号が4つの数字に分かれているカーネルは -stable カーネルです。
は、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対する比 これには、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対
較的小さい重要な修正が含まれます。 する比較的小さい重要な修正が含まれます。
これは、開発/実験的バージョンのテストに協力することに興味が無く、 これは、開発/実験的バージョンのテストに協力することに興味が無く、
最新の安定したカーネルを使いたいユーザに推奨するブランチです。 最新の安定したカーネルを使いたいユーザに推奨するブランチです。
もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x
最新の安定版カーネルです。 最新の安定版カーネルです。
2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、だ 2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、必
いたい隔週でリリースされています。 要に応じてリリースされます。通常のリリース期間は 2週間毎ですが、差し迫っ
た問題がなければもう少し長くなることもあります。セキュリティ関連の問題
の場合はこれに対してだいたいの場合、すぐにリリースがされます。
カーネルツリーに入っている、Documentation/stable_kernel_rules.txt ファ カーネルツリーに入っている、Documentation/stable_kernel_rules.txt ファ
イルにはどのような種類の変更が -stable ツリーに受け入れ可能か、またリ イルにはどのような種類の変更が -stable ツリーに受け入れ可能か、またリ
@ -341,7 +345,9 @@ linux-kernel メーリングリストで収集された多数のパッチと同
メインラインへ入れるように Linus にプッシュします。 メインラインへ入れるように Linus にプッシュします。
メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ
チが -mm ツリーでテストされることが強く推奨されます。 チが -mm ツリーでテストされることが強く推奨されています。マージウィン
ドウが開く前に -mm ツリーに現れなかったパッチはメインラインにマージさ
れることは困難になります。
これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ
りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。 りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。
@ -395,13 +401,15 @@ linux-kernel メーリングリストで収集された多数のパッチと同
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
- SCSI, James Bottomley <James.Bottomley@SteelEye.com> - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
- x86, Ingo Molnar <mingo@elte.hu>
git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
quilt ツリー- quilt ツリー-
- USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de> - USB, ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
- x86-64 と i386 の仲間 Andi Kleen <ak@suse.de>
その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ
イルに一覧表があります。 イルに一覧表があります。
@ -412,13 +420,32 @@ linux-kernel メーリングリストで収集された多数のパッチと同
bugzilla.kernel.org は Linux カーネル開発者がカーネルのバグを追跡する bugzilla.kernel.org は Linux カーネル開発者がカーネルのバグを追跡する
場所です。ユーザは見つけたバグの全てをこのツールで報告すべきです。 場所です。ユーザは見つけたバグの全てをこのツールで報告すべきです。
どう kernel bugzilla を使うかの詳細は、以下を参照してください- どう kernel bugzilla を使うかの詳細は、以下を参照してください-
http://test.kernel.org/bugzilla/faq.html http://bugzilla.kernel.org/page.cgi?id=faq.html
メインカーネルソースディレクトリにあるファイル REPORTING-BUGS はカーネ メインカーネルソースディレクトリにあるファイル REPORTING-BUGS はカーネ
ルバグらしいものについてどうレポートするかの良いテンプレートであり、問 ルバグらしいものについてどうレポートするかの良いテンプレートであり、問
題の追跡を助けるためにカーネル開発者にとってどんな情報が必要なのかの詳 題の追跡を助けるためにカーネル開発者にとってどんな情報が必要なのかの詳
細が書かれています。 細が書かれています。
バグレポートの管理
-------------------
あなたのハッキングのスキルを訓練する最高の方法のひとつに、他人がレポー
トしたバグを修正することがあります。あなたがカーネルをより安定化させる
こに寄与するということだけでなく、あなたは 現実の問題を修正することを
学び、自分のスキルも強化でき、また他の開発者があなたの存在に気がつき
ます。バグを修正することは、多くの開発者の中から自分が功績をあげる最善
の道です、なぜなら多くの人は他人のバグの修正に時間を浪費することを好ま
ないからです。
すでにレポートされたバグのために仕事をするためには、
http://bugzilla.kernel.org に行ってください。もし今後のバグレポートに
ついてアドバイスを受けたいのであれば、bugme-new メーリングリスト(新し
いバグレポートだけがここにメールされる) または bugme-janitor メーリン
グリスト(bugzilla の変更毎にここにメールされる)を購読できます。
http://lists.linux-foundation.org/mailman/listinfo/bugme-new
http://lists.linux-foundation.org/mailman/listinfo/bugme-janitors
メーリングリスト メーリングリスト
------------- -------------

View File

@ -0,0 +1,111 @@
NOTE:
This is a version of Documentation/SubmitChecklist into Japanese.
This document is maintained by Takenori Nagano <t-nagano@ah.jp.nec.com>
and the JF Project team <http://www.linux.or.jp/JF/>.
If you find any difference between this document and the original file
or a problem with the translation,
please contact the maintainer of this file or JF project.
Please also note that the purpose of this file is to be easier to read
for non English (read: Japanese) speakers and is not intended as a
fork. So if you have any comments or updates of this file, please try
to update the original English file first.
Last Updated: 2008/07/14
==================================
これは、
linux-2.6.26/Documentation/SubmitChecklist の和訳です。
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日: 2008/07/14
翻訳者: Takenori Nagano <t-nagano at ah dot jp dot nec dot com>
校正者: Masanori Kobayashi さん <zap03216 at nifty dot ne dot jp>
==================================
Linux カーネルパッチ投稿者向けチェックリスト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
本書では、パッチをより素早く取り込んでもらいたい開発者が実践すべき基本的な事柄
をいくつか紹介します。ここにある全ての事柄は、Documentation/SubmittingPatches
などのLinuxカーネルパッチ投稿に際しての心得を補足するものです。
1: 妥当なCONFIGオプションや変更されたCONFIGオプション、つまり =y, =m, =n
全てで正しくビルドできることを確認してください。その際、gcc及びリンカが
warningやerrorを出していないことも確認してください。
2: allnoconfig, allmodconfig オプションを用いて正しくビルドできることを
確認してください。
3: 手許のクロスコンパイルツールやOSDLのPLMのようなものを用いて、複数の
アーキテクチャにおいても正しくビルドできることを確認してください。
4: 64bit長の'unsigned long'を使用しているppc64は、クロスコンパイルでの
チェックに適当なアーキテクチャです。
5: カーネルコーディングスタイルに準拠しているかどうか確認してください(!)
6: CONFIGオプションの追加・変更をした場合には、CONFIGメニューが壊れていない
ことを確認してください。
7: 新しくKconfigのオプションを追加する際には、必ずそのhelpも記述してください。
8: 適切なKconfigの依存関係を考えながら慎重にチェックしてください。
ただし、この作業はマシンを使ったテストできちんと行うのがとても困難です。
うまくやるには、自分の頭で考えることです。
9: sparseを利用してちゃんとしたコードチェックをしてください。
10: 'make checkstack' と 'make namespacecheck' を利用し、問題が発見されたら
修正してください。'make checkstack' は明示的に問題を示しませんが、どれか
つの関数が512バイトより大きいスタックを使っていれば、修正すべき候補と
なります。
11: グローバルなkernel API を説明する kernel-doc をソースの中に含めてください。
( staticな関数においては必須ではありませんが、含めてもらっても結構です )
そして、'make htmldocs' もしくは 'make mandocs' を利用して追記した
ドキュメントのチェックを行い、問題が見つかった場合には修正を行ってください。
12: CONFIG_PREEMPT, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_SLAB,
CONFIG_DEBUG_PAGEALLOC, CONFIG_DEBUG_MUTEXES, CONFIG_DEBUG_SPINLOCK,
CONFIG_DEBUG_SPINLOCK_SLEEP これら全てを同時に有効にして動作確認を
行ってください。
13: CONFIG_SMP, CONFIG_PREEMPT を有効にした場合と無効にした場合の両方で
ビルドした上、動作確認を行ってください。
14: もしパッチがディスクのI/O性能などに影響を与えるようであれば、
'CONFIG_LBD'オプションを有効にした場合と無効にした場合の両方で
テストを実施してみてください。
15: lockdepの機能を全て有効にした上で、全てのコードパスを評価してください。
16: /proc に新しいエントリを追加した場合には、Documentation/ 配下に
必ずドキュメントを追加してください。
17: 新しいブートパラメータを追加した場合には、
必ずDocumentation/kernel-parameters.txt に説明を追加してください。
18: 新しくmoduleにパラメータを追加した場合には、MODULE_PARM_DESC()を
利用して必ずその説明を記述してください。
19: 新しいuserspaceインタフェースを作成した場合には、Documentation/ABI/ に
Documentation/ABI/README を参考にして必ずドキュメントを追加してください。
20: 'make headers_check'を実行して全く問題がないことを確認してください。
21: 少なくともslabアロケーションとpageアロケーションに失敗した場合の
挙動について、fault-injectionを利用して確認してください。
Documentation/fault-injection/ を参照してください。
追加したコードがかなりの量であったならば、サブシステム特有の
fault-injectionを追加したほうが良いかもしれません。
22: 新たに追加したコードは、`gcc -W'でコンパイルしてください。
このオプションは大量の不要なメッセージを出力しますが、
"warning: comparison between signed and unsigned" のようなメッセージは、
バグを見つけるのに役に立ちます。
23: 投稿したパッチが -mm パッチセットにマージされた後、全ての既存のパッチや
VM, VFS およびその他のサブシステムに関する様々な変更と、現時点でも共存
できることを確認するテストを行ってください。

View File

@ -365,6 +365,8 @@ and is between 256 and 4096 characters. It is defined in the file
no delay (0). no delay (0).
Format: integer Format: integer
bootmem_debug [KNL] Enable bootmem allocator debug messages.
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards) bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
bttv.radio= Most important insmod options are available as bttv.radio= Most important insmod options are available as
kernel args too. kernel args too.
@ -1072,6 +1074,9 @@ and is between 256 and 4096 characters. It is defined in the file
* [no]ncq: Turn on or off NCQ. * [no]ncq: Turn on or off NCQ.
* nohrst, nosrst, norst: suppress hard, soft
and both resets.
If there are multiple matching configurations changing If there are multiple matching configurations changing
the same attribute, the last one is used. the same attribute, the last one is used.

View File

@ -363,6 +363,11 @@ This rule exists because users of the rfkill subsystem expect to get (and set,
when possible) the overall transmitter rfkill state, not of a particular rfkill when possible) the overall transmitter rfkill state, not of a particular rfkill
line. line.
5. During suspend, the rfkill class will attempt to soft-block the radio
through a call to rfkill->toggle_radio, and will try to restore its previous
state during resume. After a rfkill class is suspended, it will *not* call
rfkill->toggle_radio until it is resumed.
Example of a WLAN wireless driver connected to the rfkill subsystem: Example of a WLAN wireless driver connected to the rfkill subsystem:
-------------------------------------------------------------------- --------------------------------------------------------------------

View File

@ -1,3 +1,26 @@
1 Release Date : Thur.July. 24 11:41:51 PST 2008 -
(emaild-id:megaraidlinux@lsi.com)
Sumant Patro
Bo Yang
2 Current Version : 00.00.04.01
3 Older Version : 00.00.03.22
1. Add the new controller (0078, 0079) support to the driver
Those controllers are LSI's next generatation(gen2) SAS controllers.
1 Release Date : Mon.June. 23 10:12:45 PST 2008 -
(emaild-id:megaraidlinux@lsi.com)
Sumant Patro
Bo Yang
2 Current Version : 00.00.03.22
3 Older Version : 00.00.03.20
1. Add shutdown DCMD cmd to the shutdown routine to make FW shutdown proper.
2. Unexpected interrupt occurs in HWR Linux driver, add the dumy readl pci flush will fix this issue.
1 Release Date : Mon. March 10 11:02:31 PDT 2008 - 1 Release Date : Mon. March 10 11:02:31 PDT 2008 -
(emaild-id:megaraidlinux@lsi.com) (emaild-id:megaraidlinux@lsi.com)
Sumant Patro Sumant Patro

View File

@ -942,96 +942,21 @@ M: joern@lazybastard.org
L: linux-mtd@lists.infradead.org L: linux-mtd@lists.infradead.org
S: Maintained S: Maintained
BLUETOOTH DRIVERS
P: Marcel Holtmann
M: marcel@holtmann.org
L: linux-bluetooth@vger.kernel.org
W: http://www.bluez.org/
S: Maintained
BLUETOOTH SUBSYSTEM BLUETOOTH SUBSYSTEM
P: Marcel Holtmann P: Marcel Holtmann
M: marcel@holtmann.org M: marcel@holtmann.org
P: Maxim Krasnyansky
M: maxk@qualcomm.com
L: linux-bluetooth@vger.kernel.org L: linux-bluetooth@vger.kernel.org
W: http://bluez.sf.net W: http://www.bluez.org/
W: http://www.bluez.org
W: http://www.holtmann.org/linux/bluetooth/
T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
S: Maintained S: Maintained
BLUETOOTH RFCOMM LAYER
P: Marcel Holtmann
M: marcel@holtmann.org
P: Maxim Krasnyansky
M: maxk@qualcomm.com
S: Maintained
BLUETOOTH BNEP LAYER
P: Marcel Holtmann
M: marcel@holtmann.org
P: Maxim Krasnyansky
M: maxk@qualcomm.com
S: Maintained
BLUETOOTH CMTP LAYER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HIDP LAYER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI UART DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
P: Maxim Krasnyansky
M: maxk@qualcomm.com
S: Maintained
BLUETOOTH HCI USB DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
P: Maxim Krasnyansky
M: maxk@qualcomm.com
S: Maintained
BLUETOOTH HCI BCM203X DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI BPA10X DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI BFUSB DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI DTL1 DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI BLUECARD DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI BT3C DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI BTUART DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
S: Maintained
BLUETOOTH HCI VHCI DRIVER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
S: Maintained
BONDING DRIVER BONDING DRIVER
P: Jay Vosburgh P: Jay Vosburgh
M: fubar@us.ibm.com M: fubar@us.ibm.com

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 27 SUBLEVEL = 27
EXTRAVERSION = -rc3 EXTRAVERSION = -rc4
NAME = Rotary Wombat NAME = Rotary Wombat
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -405,7 +405,7 @@ static int impd1_probe(struct lm_device *dev)
ret = amba_device_register(d, &dev->resource); ret = amba_device_register(d, &dev->resource);
if (ret) { if (ret) {
dev_err(&d->dev, "unable to register device: %d\n"); dev_err(&d->dev, "unable to register device: %d\n", ret);
kfree(d); kfree(d);
} }
} }

View File

@ -64,7 +64,7 @@ static struct platform_device fsg_i2c_gpio = {
static struct i2c_board_info __initdata fsg_i2c_board_info [] = { static struct i2c_board_info __initdata fsg_i2c_board_info [] = {
{ {
I2C_BOARD_INFO("rtc-isl1208", 0x6f), I2C_BOARD_INFO("isl1208", 0x6f),
}, },
}; };
@ -179,7 +179,6 @@ static void __init fsg_init(void)
{ {
DECLARE_MAC_BUF(mac_buf); DECLARE_MAC_BUF(mac_buf);
uint8_t __iomem *f; uint8_t __iomem *f;
int i;
ixp4xx_sys_init(); ixp4xx_sys_init();
@ -228,6 +227,7 @@ static void __init fsg_init(void)
f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000);
if (f) { if (f) {
#ifdef __ARMEB__ #ifdef __ARMEB__
int i;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i);
fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i);

View File

@ -125,3 +125,28 @@ void clks_register(struct clk *clks, size_t num)
list_add(&clks[i].node, &clocks); list_add(&clks[i].node, &clocks);
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
} }
int clk_add_alias(char *alias, struct device *alias_dev, char *id,
struct device *dev)
{
struct clk *r = clk_lookup(dev, id);
struct clk *new;
if (!r)
return -ENODEV;
new = kzalloc(sizeof(struct clk), GFP_KERNEL);
if (!new)
return -ENOMEM;
new->name = alias;
new->dev = alias_dev;
new->other = r;
mutex_lock(&clocks_mutex);
list_add(&new->node, &clocks);
mutex_unlock(&clocks_mutex);
return 0;
}

View File

@ -1,3 +1,5 @@
#include <linux/list.h>
struct clk; struct clk;
struct clkops { struct clkops {
@ -86,3 +88,6 @@ extern void clk_pxa3xx_cken_disable(struct clk *);
#endif #endif
void clks_register(struct clk *clks, size_t num); void clks_register(struct clk *clks, size_t num);
int clk_add_alias(char *alias, struct device *alias_dev, char *id,
struct device *dev);

View File

@ -10,18 +10,78 @@
* *
*/ */
#include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/hardware.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/mfp-pxa25x.h>
#include <mach/hardware.h>
#include "generic.h" #include "generic.h"
static unsigned long e740_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO79_nCS_3, /* CS3 - IMAGEON */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
GPIO45_GPIO, /* Used by TMIO for #SUSPEND */
/* PC Card */
GPIO8_GPIO, /* CD0 */
GPIO44_GPIO, /* CD1 */
GPIO11_GPIO, /* IRQ0 */
GPIO6_GPIO, /* IRQ1 */
GPIO27_GPIO, /* RST0 */
GPIO24_GPIO, /* RST1 */
GPIO20_GPIO, /* PWR0 */
GPIO23_GPIO, /* PWR1 */
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO52_nPCE_1,
GPIO53_nPCE_2,
GPIO54_nPSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
static unsigned long e400_pin_config[] __initdata = {
/* Chip selects */
GPIO15_nCS_1, /* CS1 - Flash */
GPIO80_nCS_4, /* CS4 - TMIO */
/* Clocks */
GPIO12_32KHz,
/* BTUART */
GPIO42_BTUART_RXD,
GPIO43_BTUART_TXD,
GPIO44_BTUART_CTS,
GPIO45_GPIO, /* Used by TMIO for #SUSPEND */
/* wakeup */
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
};
/* Only e800 has 128MB RAM */ /* Only e800 has 128MB RAM */
static void __init eseries_fixup(struct machine_desc *desc, static void __init eseries_fixup(struct machine_desc *desc,
struct tag *tags, char **cmdline, struct meminfo *mi) struct tag *tags, char **cmdline, struct meminfo *mi)
{ {
mi->nr_banks=1; mi->nr_banks=1;
mi->bank[0].start = 0xa0000000; mi->bank[0].start = 0xa0000000;
@ -32,83 +92,95 @@ static void __init eseries_fixup(struct machine_desc *desc,
mi->bank[0].size = (64*1024*1024); mi->bank[0].size = (64*1024*1024);
} }
static void __init e740_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
}
static void __init e400_init(void)
{
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
}
/* e-series machine definitions */ /* e-series machine definitions */
#ifdef CONFIG_MACH_E330 #ifdef CONFIG_MACH_E330
MACHINE_START(E330, "Toshiba e330") MACHINE_START(E330, "Toshiba e330")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_E350 #ifdef CONFIG_MACH_E350
MACHINE_START(E350, "Toshiba e350") MACHINE_START(E350, "Toshiba e350")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_E740 #ifdef CONFIG_MACH_E740
MACHINE_START(E740, "Toshiba e740") MACHINE_START(E740, "Toshiba e740")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .init_machine = e740_init,
.timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_E750 #ifdef CONFIG_MACH_E750
MACHINE_START(E750, "Toshiba e750") MACHINE_START(E750, "Toshiba e750")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_E400 #ifdef CONFIG_MACH_E400
MACHINE_START(E400, "Toshiba e400") MACHINE_START(E400, "Toshiba e400")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .init_machine = e400_init,
.timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_E800 #ifdef CONFIG_MACH_E800
MACHINE_START(E800, "Toshiba e800") MACHINE_START(E800, "Toshiba e800")
/* Maintainer: Ian Molton (spyro@f2s.com) */ /* Maintainer: Ian Molton (spyro@f2s.com) */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.timer = &pxa_timer, .timer = &pxa_timer,
MACHINE_END MACHINE_END
#endif #endif

View File

@ -183,6 +183,7 @@
defined(CONFIG_MACH_TOSA) || \ defined(CONFIG_MACH_TOSA) || \
defined(CONFIG_MACH_MAINSTONE) || \ defined(CONFIG_MACH_MAINSTONE) || \
defined(CONFIG_MACH_PCM027) || \ defined(CONFIG_MACH_PCM027) || \
defined(CONFIG_ARCH_PXA_ESERIES) || \
defined(CONFIG_MACH_MAGICIAN) defined(CONFIG_MACH_MAGICIAN)
#define NR_IRQS (IRQ_BOARD_END) #define NR_IRQS (IRQ_BOARD_END)
#elif defined(CONFIG_MACH_ZYLONITE) #elif defined(CONFIG_MACH_ZYLONITE)

View File

@ -52,6 +52,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include "generic.h" #include "generic.h"
#include "clock.h"
#include "devices.h" #include "devices.h"
static unsigned long lubbock_pin_config[] __initdata = { static unsigned long lubbock_pin_config[] __initdata = {
@ -485,6 +486,7 @@ static void __init lubbock_init(void)
pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config)); pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config));
clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
pxa_set_udc_info(&udc_info); pxa_set_udc_info(&udc_info);
set_pxa_fb_info(&sharp_lm8v31); set_pxa_fb_info(&sharp_lm8v31);
pxa_set_mci_info(&lubbock_mci_platform_data); pxa_set_mci_info(&lubbock_mci_platform_data);

View File

@ -166,8 +166,7 @@ static struct clk pxa25x_hwuart_clk =
; ;
/* /*
* PXA 2xx clock declarations. Order is important (see aliases below) * PXA 2xx clock declarations.
* Please be careful not to disrupt the ordering.
*/ */
static struct clk pxa25x_clks[] = { static struct clk pxa25x_clks[] = {
INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev),
@ -194,11 +193,6 @@ static struct clk pxa25x_clks[] = {
INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL),
}; };
static struct clk pxa2xx_clk_aliases[] = {
INIT_CKOTHER("GPIO7_CLK", &pxa25x_clks[4], NULL),
INIT_CKOTHER("SA1111_CLK", &pxa25x_clks[5], NULL),
};
#ifdef CONFIG_PM #ifdef CONFIG_PM
#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
@ -375,8 +369,6 @@ static int __init pxa25x_init(void)
if (cpu_is_pxa255()) if (cpu_is_pxa255())
ret = platform_device_register(&pxa_device_hwuart); ret = platform_device_register(&pxa_device_hwuart);
clks_register(pxa2xx_clk_aliases, ARRAY_SIZE(pxa2xx_clk_aliases));
return ret; return ret;
} }

View File

@ -90,7 +90,9 @@ static struct clk common_clks[] = {
}; };
static struct clk pxa310_clks[] = { static struct clk pxa310_clks[] = {
#ifdef CONFIG_CPU_PXA310
PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev), PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev),
#endif
}; };
static int __init pxa300_init(void) static int __init pxa300_init(void)

View File

@ -10,7 +10,6 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>

View File

@ -19,8 +19,6 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/system.h> #include <asm/system.h>
#include <linux/version.h>
#include <hwregs/reg_map.h> #include <hwregs/reg_map.h>
#include <hwregs/reg_rdwr.h> #include <hwregs/reg_rdwr.h>
#include <hwregs/timer_defs.h> #include <hwregs/timer_defs.h>

File diff suppressed because it is too large Load Diff

View File

@ -262,7 +262,7 @@ ia32_syscall_table:
data8 sys_uselib data8 sys_uselib
data8 sys_swapon data8 sys_swapon
data8 sys_reboot data8 sys_reboot
data8 sys32_readdir data8 compat_sys_old_readdir
data8 sys32_mmap /* 90 */ data8 sys32_mmap /* 90 */
data8 sys32_munmap data8 sys32_munmap
data8 sys_truncate data8 sys_truncate

View File

@ -276,13 +276,6 @@ typedef struct compat_siginfo {
} _sifields; } _sifields;
} compat_siginfo_t; } compat_siginfo_t;
struct old_linux32_dirent {
u32 d_ino;
u32 d_offset;
u16 d_namlen;
char d_name[1];
};
/* /*
* IA-32 ELF specific definitions for IA-64. * IA-32 ELF specific definitions for IA-64.
*/ */

View File

@ -1210,138 +1210,6 @@ sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz
return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
} }
struct getdents32_callback {
struct compat_dirent __user *current_dir;
struct compat_dirent __user *previous;
int count;
int error;
};
struct readdir32_callback {
struct old_linux32_dirent __user * dirent;
int count;
};
static int
filldir32 (void *__buf, const char *name, int namlen, loff_t offset, u64 ino,
unsigned int d_type)
{
struct compat_dirent __user * dirent;
struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
int reclen = ROUND_UP(offsetof(struct compat_dirent, d_name) + namlen + 1, 4);
u32 d_ino;
buf->error = -EINVAL; /* only used if we fail.. */
if (reclen > buf->count)
return -EINVAL;
d_ino = ino;
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
return -EOVERFLOW;
buf->error = -EFAULT; /* only used if we fail.. */
dirent = buf->previous;
if (dirent)
if (put_user(offset, &dirent->d_off))
return -EFAULT;
dirent = buf->current_dir;
buf->previous = dirent;
if (put_user(d_ino, &dirent->d_ino)
|| put_user(reclen, &dirent->d_reclen)
|| copy_to_user(dirent->d_name, name, namlen)
|| put_user(0, dirent->d_name + namlen))
return -EFAULT;
dirent = (struct compat_dirent __user *) ((char __user *) dirent + reclen);
buf->current_dir = dirent;
buf->count -= reclen;
return 0;
}
asmlinkage long
sys32_getdents (unsigned int fd, struct compat_dirent __user *dirent, unsigned int count)
{
struct file * file;
struct compat_dirent __user * lastdirent;
struct getdents32_callback buf;
int error;
error = -EFAULT;
if (!access_ok(VERIFY_WRITE, dirent, count))
goto out;
error = -EBADF;
file = fget(fd);
if (!file)
goto out;
buf.current_dir = dirent;
buf.previous = NULL;
buf.count = count;
buf.error = 0;
error = vfs_readdir(file, filldir32, &buf);
if (error < 0)
goto out_putf;
error = buf.error;
lastdirent = buf.previous;
if (lastdirent) {
if (put_user(file->f_pos, &lastdirent->d_off))
error = -EFAULT;
else
error = count - buf.count;
}
out_putf:
fput(file);
out:
return error;
}
static int
fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, u64 ino,
unsigned int d_type)
{
struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
struct old_linux32_dirent __user * dirent;
u32 d_ino;
if (buf->count)
return -EINVAL;
d_ino = ino;
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
return -EOVERFLOW;
buf->count++;
dirent = buf->dirent;
if (put_user(d_ino, &dirent->d_ino)
|| put_user(offset, &dirent->d_offset)
|| put_user(namlen, &dirent->d_namlen)
|| copy_to_user(dirent->d_name, name, namlen)
|| put_user(0, dirent->d_name + namlen))
return -EFAULT;
return 0;
}
asmlinkage long
sys32_readdir (unsigned int fd, void __user *dirent, unsigned int count)
{
int error;
struct file * file;
struct readdir32_callback buf;
error = -EBADF;
file = fget(fd);
if (!file)
goto out;
buf.count = 0;
buf.dirent = dirent;
error = vfs_readdir(file, fillonedir32, &buf);
if (error >= 0)
error = buf.count;
fput(file);
out:
return error;
}
struct sel_arg_struct { struct sel_arg_struct {
unsigned int n; unsigned int n;
unsigned int inp; unsigned int inp;

View File

@ -58,7 +58,7 @@ static struct local_tlb_flush_counts {
unsigned int count; unsigned int count;
} __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS]; } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS];
static DEFINE_PER_CPU(unsigned int, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned; static DEFINE_PER_CPU(unsigned short, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned;
#define IPI_CALL_FUNC 0 #define IPI_CALL_FUNC 0
#define IPI_CPU_STOP 1 #define IPI_CPU_STOP 1
@ -254,7 +254,7 @@ smp_local_flush_tlb(void)
void void
smp_flush_tlb_cpumask(cpumask_t xcpumask) smp_flush_tlb_cpumask(cpumask_t xcpumask)
{ {
unsigned int *counts = __ia64_per_cpu_var(shadow_flush_counts); unsigned short *counts = __ia64_per_cpu_var(shadow_flush_counts);
cpumask_t cpumask = xcpumask; cpumask_t cpumask = xcpumask;
int mycpu, cpu, flush_mycpu = 0; int mycpu, cpu, flush_mycpu = 0;
@ -262,7 +262,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
mycpu = smp_processor_id(); mycpu = smp_processor_id();
for_each_cpu_mask(cpu, cpumask) for_each_cpu_mask(cpu, cpumask)
counts[cpu] = local_tlb_flush_counts[cpu].count; counts[cpu] = local_tlb_flush_counts[cpu].count & 0xffff;
mb(); mb();
for_each_cpu_mask(cpu, cpumask) { for_each_cpu_mask(cpu, cpumask) {
@ -276,7 +276,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
smp_local_flush_tlb(); smp_local_flush_tlb();
for_each_cpu_mask(cpu, cpumask) for_each_cpu_mask(cpu, cpumask)
while(counts[cpu] == local_tlb_flush_counts[cpu].count) while(counts[cpu] == (local_tlb_flush_counts[cpu].count & 0xffff))
udelay(FLUSH_DELAY); udelay(FLUSH_DELAY);
preempt_enable(); preempt_enable();

View File

@ -324,7 +324,6 @@ pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
struct pci_bus * __devinit struct pci_bus * __devinit
pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
{ {
struct pci_root_info info;
struct pci_controller *controller; struct pci_controller *controller;
unsigned int windows = 0; unsigned int windows = 0;
struct pci_bus *pbus; struct pci_bus *pbus;
@ -346,22 +345,24 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
&windows); &windows);
if (windows) { if (windows) {
struct pci_root_info info;
controller->window = controller->window =
kmalloc_node(sizeof(*controller->window) * windows, kmalloc_node(sizeof(*controller->window) * windows,
GFP_KERNEL, controller->node); GFP_KERNEL, controller->node);
if (!controller->window) if (!controller->window)
goto out2; goto out2;
name = kmalloc(16, GFP_KERNEL);
if (!name)
goto out3;
sprintf(name, "PCI Bus %04x:%02x", domain, bus);
info.controller = controller;
info.name = name;
acpi_walk_resources(device->handle, METHOD_NAME__CRS,
add_window, &info);
} }
name = kmalloc(16, GFP_KERNEL);
if (!name)
goto out3;
sprintf(name, "PCI Bus %04x:%02x", domain, bus);
info.controller = controller;
info.name = name;
acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window,
&info);
/* /*
* See arch/x86/pci/acpi.c. * See arch/x86/pci/acpi.c.
* The desired pci bus might already be scanned in a quirk. We * The desired pci bus might already be scanned in a quirk. We

View File

@ -17,7 +17,6 @@ static const char serial_revdate[] = "2007-11-06";
#define SUPPORT_SYSRQ #define SUPPORT_SYSRQ
#endif #endif
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/serial.h> #include <linux/serial.h>
#include <linux/circ_buf.h> #include <linux/circ_buf.h>

View File

@ -6,12 +6,7 @@
#ifndef _ASM_POWERPC_IDE_H #ifndef _ASM_POWERPC_IDE_H
#define _ASM_POWERPC_IDE_H #define _ASM_POWERPC_IDE_H
#ifdef __KERNEL__ #include <linux/compiler.h>
#ifndef __powerpc64__
#include <linux/sched.h>
#include <asm/mpc8xx.h>
#endif
#include <asm/io.h> #include <asm/io.h>
#define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c)) #define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c))
@ -19,40 +14,4 @@
#define __ide_mm_outsw(p, a, c) writesw((void __iomem *)(p), (a), (c)) #define __ide_mm_outsw(p, a, c) writesw((void __iomem *)(p), (a), (c))
#define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c)) #define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c))
#ifndef __powerpc64__
#include <linux/ioport.h>
/* FIXME: use ide_platform host driver */
static __inline__ int ide_default_irq(unsigned long base)
{
#ifdef CONFIG_PPLUS
switch (base) {
case 0x1f0: return 14;
case 0x170: return 15;
}
#endif
return 0;
}
/* FIXME: use ide_platform host driver */
static __inline__ unsigned long ide_default_io_base(int index)
{
#ifdef CONFIG_PPLUS
switch (index) {
case 0: return 0x1f0;
case 1: return 0x170;
}
#endif
return 0;
}
#ifdef CONFIG_BLK_DEV_MPC8xx_IDE
#define IDE_ARCH_ACK_INTR 1
#define ide_ack_intr(hwif) ((hwif)->ack_intr ? (hwif)->ack_intr(hwif) : 1)
#endif
#endif /* __powerpc64__ */
#endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_IDE_H */ #endif /* _ASM_POWERPC_IDE_H */

View File

@ -86,6 +86,19 @@ static int __init parse_savemaxmem(char *p)
} }
__setup("savemaxmem=", parse_savemaxmem); __setup("savemaxmem=", parse_savemaxmem);
static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
unsigned long offset, int userbuf)
{
if (userbuf) {
if (copy_to_user((char __user *)buf, (vaddr + offset), csize))
return -EFAULT;
} else
memcpy(buf, (vaddr + offset), csize);
return csize;
}
/** /**
* copy_oldmem_page - copy one page from "oldmem" * copy_oldmem_page - copy one page from "oldmem"
* @pfn: page frame number to be copied * @pfn: page frame number to be copied
@ -107,16 +120,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
if (!csize) if (!csize)
return 0; return 0;
vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); csize = min(csize, PAGE_SIZE);
if (userbuf) { if (pfn < max_pfn) {
if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) { vaddr = __va(pfn << PAGE_SHIFT);
iounmap(vaddr); csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
return -EFAULT; } else {
} vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
} else csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
memcpy(buf, (vaddr + offset), csize); iounmap(vaddr);
}
iounmap(vaddr);
return csize; return csize;
} }

View File

@ -233,17 +233,6 @@ void ibmebus_free_irq(u32 ist, void *dev_id)
} }
EXPORT_SYMBOL(ibmebus_free_irq); EXPORT_SYMBOL(ibmebus_free_irq);
static ssize_t name_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "%s\n", to_of_device(dev)->node->name);
}
static struct device_attribute ibmebus_dev_attrs[] = {
__ATTR_RO(name),
__ATTR_NULL
};
static char *ibmebus_chomp(const char *in, size_t count) static char *ibmebus_chomp(const char *in, size_t count)
{ {
char *out = kmalloc(count + 1, GFP_KERNEL); char *out = kmalloc(count + 1, GFP_KERNEL);
@ -327,7 +316,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = {
struct bus_type ibmebus_bus_type = { struct bus_type ibmebus_bus_type = {
.uevent = of_device_uevent, .uevent = of_device_uevent,
.dev_attrs = ibmebus_dev_attrs,
.bus_attrs = ibmebus_bus_attrs .bus_attrs = ibmebus_bus_attrs
}; };
EXPORT_SYMBOL(ibmebus_bus_type); EXPORT_SYMBOL(ibmebus_bus_type);

View File

@ -1113,7 +1113,7 @@ static int vio_bus_probe(struct device *dev)
return error; return error;
} }
error = viodrv->probe(viodev, id); error = viodrv->probe(viodev, id);
if (error) if (error && firmware_has_feature(FW_FEATURE_CMO))
vio_cmo_bus_remove(viodev); vio_cmo_bus_remove(viodev);
} }

View File

@ -206,11 +206,6 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
(SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE); (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
if (runcntl == 0) if (runcntl == 0)
runcntl = SPU_RUNCNTL_RUNNABLE; runcntl = SPU_RUNCNTL_RUNNABLE;
}
if (ctx->flags & SPU_CREATE_NOSCHED) {
spuctx_switch_state(ctx, SPU_UTIL_USER);
ctx->ops->runcntl_write(ctx, runcntl);
} else { } else {
unsigned long privcntl; unsigned long privcntl;
@ -219,9 +214,15 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
else else
privcntl = SPU_PRIVCNTL_MODE_NORMAL; privcntl = SPU_PRIVCNTL_MODE_NORMAL;
ctx->ops->npc_write(ctx, *npc);
ctx->ops->privcntl_write(ctx, privcntl); ctx->ops->privcntl_write(ctx, privcntl);
ctx->ops->runcntl_write(ctx, runcntl); ctx->ops->npc_write(ctx, *npc);
}
ctx->ops->runcntl_write(ctx, runcntl);
if (ctx->flags & SPU_CREATE_NOSCHED) {
spuctx_switch_state(ctx, SPU_UTIL_USER);
} else {
if (ctx->state == SPU_STATE_SAVED) { if (ctx->state == SPU_STATE_SAVED) {
ret = spu_activate(ctx, 0); ret = spu_activate(ctx, 0);

View File

@ -641,8 +641,10 @@ static struct spu *find_victim(struct spu_context *ctx)
if (tmp && tmp->prio > ctx->prio && if (tmp && tmp->prio > ctx->prio &&
!(tmp->flags & SPU_CREATE_NOSCHED) && !(tmp->flags & SPU_CREATE_NOSCHED) &&
(!victim || tmp->prio > victim->prio)) (!victim || tmp->prio > victim->prio)) {
victim = spu->ctx; victim = spu->ctx;
get_spu_context(victim);
}
} }
mutex_unlock(&cbe_spu_info[node].list_mutex); mutex_unlock(&cbe_spu_info[node].list_mutex);
@ -658,6 +660,7 @@ static struct spu *find_victim(struct spu_context *ctx)
* look at another context or give up after X retries. * look at another context or give up after X retries.
*/ */
if (!mutex_trylock(&victim->state_mutex)) { if (!mutex_trylock(&victim->state_mutex)) {
put_spu_context(victim);
victim = NULL; victim = NULL;
goto restart; goto restart;
} }
@ -670,6 +673,7 @@ static struct spu *find_victim(struct spu_context *ctx)
* restart the search. * restart the search.
*/ */
mutex_unlock(&victim->state_mutex); mutex_unlock(&victim->state_mutex);
put_spu_context(victim);
victim = NULL; victim = NULL;
goto restart; goto restart;
} }
@ -687,6 +691,7 @@ static struct spu *find_victim(struct spu_context *ctx)
spu_add_to_rq(victim); spu_add_to_rq(victim);
mutex_unlock(&victim->state_mutex); mutex_unlock(&victim->state_mutex);
put_spu_context(victim);
return spu; return spu;
} }
@ -985,9 +990,11 @@ static int spusched_thread(void *unused)
struct spu_context *ctx = spu->ctx; struct spu_context *ctx = spu->ctx;
if (ctx) { if (ctx) {
get_spu_context(ctx);
mutex_unlock(mtx); mutex_unlock(mtx);
spusched_tick(ctx); spusched_tick(ctx);
mutex_lock(mtx); mutex_lock(mtx);
put_spu_context(ctx);
} }
} }
mutex_unlock(mtx); mutex_unlock(mtx);
@ -1030,7 +1037,7 @@ void spuctx_switch_state(struct spu_context *ctx,
node = spu->node; node = spu->node;
if (old_state == SPU_UTIL_USER) if (old_state == SPU_UTIL_USER)
atomic_dec(&cbe_spu_info[node].busy_spus); atomic_dec(&cbe_spu_info[node].busy_spus);
if (new_state == SPU_UTIL_USER); if (new_state == SPU_UTIL_USER)
atomic_inc(&cbe_spu_info[node].busy_spus); atomic_inc(&cbe_spu_info[node].busy_spus);
} }
} }

View File

@ -11,7 +11,6 @@
* *
*/ */
#include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/string.h> #include <linux/string.h>

View File

@ -1,7 +1,7 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.26-rc4 # Linux kernel version: 2.6.27-rc4
# Fri May 30 09:49:33 2008 # Thu Aug 21 19:43:29 2008
# #
CONFIG_SCHED_MC=y CONFIG_SCHED_MC=y
CONFIG_MMU=y CONFIG_MMU=y
@ -68,7 +68,6 @@ CONFIG_INITRAMFS_SOURCE=""
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_EMBEDDED is not set # CONFIG_EMBEDDED is not set
CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL=y
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
@ -93,11 +92,17 @@ CONFIG_SLAB=y
# CONFIG_MARKERS is not set # CONFIG_MARKERS is not set
CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_OPROFILE=y
CONFIG_KPROBES=y CONFIG_KPROBES=y
# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
CONFIG_KRETPROBES=y CONFIG_KRETPROBES=y
# CONFIG_HAVE_IOREMAP_PROT is not set
CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_KRETPROBES=y
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
# CONFIG_HAVE_DMA_ATTRS is not set # CONFIG_HAVE_DMA_ATTRS is not set
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
# CONFIG_HAVE_CLK is not set
CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
@ -113,6 +118,7 @@ CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y CONFIG_BLOCK=y
# CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_IO_TRACE is not set
CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSG=y
# CONFIG_BLK_DEV_INTEGRITY is not set
CONFIG_BLOCK_COMPAT=y CONFIG_BLOCK_COMPAT=y
# #
@ -175,6 +181,8 @@ CONFIG_PREEMPT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set # CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_DISCONTIGMEM_MANUAL is not set
@ -185,8 +193,12 @@ CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG_SPARSE=y
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_MIGRATION=y
CONFIG_RESOURCES_64BIT=y CONFIG_RESOURCES_64BIT=y
CONFIG_ZONE_DMA_FLAG=1 CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y CONFIG_BOUNCE=y
@ -198,6 +210,7 @@ CONFIG_VIRT_TO_BUS=y
CONFIG_MACHCHK_WARNING=y CONFIG_MACHCHK_WARNING=y
CONFIG_QDIO=y CONFIG_QDIO=y
# CONFIG_QDIO_DEBUG is not set # CONFIG_QDIO_DEBUG is not set
CONFIG_CHSC_SCH=m
# #
# Misc # Misc
@ -206,6 +219,7 @@ CONFIG_IPL=y
# CONFIG_IPL_TAPE is not set # CONFIG_IPL_TAPE is not set
CONFIG_IPL_VM=y CONFIG_IPL_VM=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
CONFIG_FORCE_MAX_ZONEORDER=9 CONFIG_FORCE_MAX_ZONEORDER=9
# CONFIG_PROCESS_DEBUG is not set # CONFIG_PROCESS_DEBUG is not set
@ -226,10 +240,6 @@ CONFIG_S390_HYPFS_FS=y
CONFIG_KEXEC=y CONFIG_KEXEC=y
# CONFIG_ZFCPDUMP is not set # CONFIG_ZFCPDUMP is not set
CONFIG_S390_GUEST=y CONFIG_S390_GUEST=y
#
# Networking
#
CONFIG_NET=y CONFIG_NET=y
# #
@ -364,7 +374,6 @@ CONFIG_NET_SCH_CBQ=m
# CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HTB is not set
# CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_HFSC is not set
CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RR=m
CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TEQL=m
@ -430,7 +439,9 @@ CONFIG_CCW=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set CONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not set
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set # CONFIG_DEBUG_DEVRES is not set
CONFIG_SYS_HYPERVISOR=y CONFIG_SYS_HYPERVISOR=y
@ -507,6 +518,11 @@ CONFIG_SCSI_LOWLEVEL=y
# CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_TCP is not set
# CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DEBUG is not set
CONFIG_ZFCP=y CONFIG_ZFCP=y
CONFIG_SCSI_DH=m
CONFIG_SCSI_DH_RDAC=m
CONFIG_SCSI_DH_HP_SW=m
CONFIG_SCSI_DH_EMC=m
CONFIG_SCSI_DH_ALUA=m
CONFIG_MD=y CONFIG_MD=y
CONFIG_BLK_DEV_MD=y CONFIG_BLK_DEV_MD=y
CONFIG_MD_LINEAR=m CONFIG_MD_LINEAR=m
@ -522,14 +538,10 @@ CONFIG_DM_CRYPT=y
CONFIG_DM_SNAPSHOT=y CONFIG_DM_SNAPSHOT=y
CONFIG_DM_MIRROR=y CONFIG_DM_MIRROR=y
CONFIG_DM_ZERO=y CONFIG_DM_ZERO=y
CONFIG_DM_MULTIPATH=y CONFIG_DM_MULTIPATH=m
# CONFIG_DM_MULTIPATH_EMC is not set
# CONFIG_DM_MULTIPATH_RDAC is not set
# CONFIG_DM_MULTIPATH_HP is not set
# CONFIG_DM_DELAY is not set # CONFIG_DM_DELAY is not set
# CONFIG_DM_UEVENT is not set # CONFIG_DM_UEVENT is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
# CONFIG_IFB is not set # CONFIG_IFB is not set
CONFIG_DUMMY=m CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
@ -544,7 +556,6 @@ CONFIG_NET_ETHERNET=y
# CONFIG_IBM_NEW_EMAC_TAH is not set # CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
CONFIG_NETDEV_1000=y CONFIG_NETDEV_1000=y
# CONFIG_E1000E_ENABLED is not set
CONFIG_NETDEV_10000=y CONFIG_NETDEV_10000=y
# CONFIG_TR is not set # CONFIG_TR is not set
# CONFIG_WAN is not set # CONFIG_WAN is not set
@ -576,7 +587,10 @@ CONFIG_DEVKMEM=y
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
CONFIG_HVC_DRIVER=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM=m CONFIG_HW_RANDOM=m
CONFIG_HW_RANDOM_VIRTIO=m
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
CONFIG_RAW_DRIVER=m CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=256 CONFIG_MAX_RAW_DEVS=256
@ -616,6 +630,7 @@ CONFIG_MONWRITER=m
CONFIG_S390_VMUR=m CONFIG_S390_VMUR=m
# CONFIG_POWER_SUPPLY is not set # CONFIG_POWER_SUPPLY is not set
# CONFIG_THERMAL is not set # CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
# #
@ -693,6 +708,7 @@ CONFIG_CONFIGFS_FS=m
# CONFIG_CRAMFS is not set # CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set # CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set # CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
@ -712,7 +728,6 @@ CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=y CONFIG_EXPORTFS=y
CONFIG_NFS_COMMON=y CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y CONFIG_SUNRPC=y
# CONFIG_SUNRPC_BIND34 is not set
# CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_KRB5 is not set
# CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set # CONFIG_SMB_FS is not set
@ -780,6 +795,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_WRITECOUNT is not set # CONFIG_DEBUG_WRITECOUNT is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_SG is not set
# CONFIG_FRAME_POINTER is not set # CONFIG_FRAME_POINTER is not set
@ -789,6 +805,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_LKDTM is not set # CONFIG_LKDTM is not set
# CONFIG_FAULT_INJECTION is not set # CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set # CONFIG_LATENCYTOP is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_SAMPLES=y CONFIG_SAMPLES=y
# CONFIG_SAMPLE_KOBJECT is not set # CONFIG_SAMPLE_KOBJECT is not set
# CONFIG_SAMPLE_KPROBES is not set # CONFIG_SAMPLE_KPROBES is not set
@ -847,6 +864,10 @@ CONFIG_CRYPTO_HMAC=m
# CONFIG_CRYPTO_MD4 is not set # CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_MD5=m
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set
CONFIG_CRYPTO_RMD128=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_RMD256=m
CONFIG_CRYPTO_RMD320=m
CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA1=m
# CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_SHA512 is not set
@ -895,6 +916,7 @@ CONFIG_BITREVERSE=m
# CONFIG_GENERIC_FIND_NEXT_BIT is not set # CONFIG_GENERIC_FIND_NEXT_BIT is not set
# CONFIG_CRC_CCITT is not set # CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set # CONFIG_CRC16 is not set
CONFIG_CRC_T10DIF=y
# CONFIG_CRC_ITU_T is not set # CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=m CONFIG_CRC32=m
CONFIG_CRC7=m CONFIG_CRC7=m

View File

@ -709,7 +709,7 @@ static inline int find_next_zero_bit (const unsigned long * addr,
* __ffz_word returns __BITOPS_WORDSIZE * __ffz_word returns __BITOPS_WORDSIZE
* if no zero bit is present in the word. * if no zero bit is present in the word.
*/ */
set = __ffz_word(0, *p >> bit) + bit; set = __ffz_word(bit, *p >> bit);
if (set >= size) if (set >= size)
return size + offset; return size + offset;
if (set < __BITOPS_WORDSIZE) if (set < __BITOPS_WORDSIZE)
@ -824,7 +824,7 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size,
* s390 version of ffz returns __BITOPS_WORDSIZE * s390 version of ffz returns __BITOPS_WORDSIZE
* if no zero bit is present in the word. * if no zero bit is present in the word.
*/ */
set = ffz(__load_ulong_le(p, 0) >> bit) + bit; set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit);
if (set >= size) if (set >= size)
return size + offset; return size + offset;
if (set < __BITOPS_WORDSIZE) if (set < __BITOPS_WORDSIZE)
@ -865,7 +865,7 @@ static inline int ext2_find_next_bit(void *vaddr, unsigned long size,
* s390 version of ffz returns __BITOPS_WORDSIZE * s390 version of ffz returns __BITOPS_WORDSIZE
* if no zero bit is present in the word. * if no zero bit is present in the word.
*/ */
set = ffs(__load_ulong_le(p, 0) >> bit) + bit; set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit));
if (set >= size) if (set >= size)
return size + offset; return size + offset;
if (set < __BITOPS_WORDSIZE) if (set < __BITOPS_WORDSIZE)

View File

@ -75,7 +75,9 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
return sf->gprs[8]; return sf->gprs[8];
} }
DEFINE_PER_CPU(struct s390_idle_data, s390_idle); DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = {
.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock)
};
static int s390_idle_enter(void) static int s390_idle_enter(void)
{ {

View File

@ -610,7 +610,6 @@ static void __init smp_create_idle(unsigned int cpu)
if (IS_ERR(p)) if (IS_ERR(p))
panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
current_set[cpu] = p; current_set[cpu] = p;
spin_lock_init(&(&per_cpu(s390_idle, cpu))->lock);
} }
static int __cpuinit smp_alloc_lowcore(int cpu) static int __cpuinit smp_alloc_lowcore(int cpu)
@ -845,7 +844,6 @@ void __init smp_prepare_boot_cpu(void)
current_set[0] = current; current_set[0] = current;
smp_cpu_state[0] = CPU_STATE_CONFIGURED; smp_cpu_state[0] = CPU_STATE_CONFIGURED;
smp_cpu_polarization[0] = POLARIZATION_UNKNWN; smp_cpu_polarization[0] = POLARIZATION_UNKNWN;
spin_lock_init(&(&__get_cpu_var(s390_idle))->lock);
} }
void __init smp_cpus_done(unsigned int max_cpus) void __init smp_cpus_done(unsigned int max_cpus)

View File

@ -140,6 +140,10 @@ static struct sh_mobile_lcdc_info lcdc_info = {
.vsync_len = 1, .vsync_len = 1,
.sync = 0, /* hsync and vsync are active low */ .sync = 0, /* hsync and vsync are active low */
}, },
.lcd_size_cfg = { /* 7.0 inch */
.width = 152,
.height = 91,
},
.board_cfg = { .board_cfg = {
.display_on = ap320_wvga_power_on, .display_on = ap320_wvga_power_on,
}, },

View File

@ -224,6 +224,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
.vsync_len = 2, .vsync_len = 2,
.sync = 0, .sync = 0,
}, },
.lcd_size_cfg = { /* 7.0 inch */
.width = 152,
.height = 91,
},
} }
#endif #endif
#ifdef CONFIG_SH_MIGOR_QVGA #ifdef CONFIG_SH_MIGOR_QVGA
@ -245,6 +249,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
.vsync_len = 2, .vsync_len = 2,
.sync = FB_SYNC_HOR_HIGH_ACT, .sync = FB_SYNC_HOR_HIGH_ACT,
}, },
.lcd_size_cfg = { /* 2.4 inch */
.width = 49,
.height = 37,
},
.board_cfg = { .board_cfg = {
.setup_sys = migor_lcd_qvga_setup, .setup_sys = migor_lcd_qvga_setup,
}, },

View File

@ -15,8 +15,11 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <asm/io.h> #include <linux/fb.h>
#include <linux/io.h>
#include <asm/sh7763rdp.h> #include <asm/sh7763rdp.h>
#include <asm/sh_eth.h>
#include <asm/sh7760fb.h>
/* NOR Flash */ /* NOR Flash */
static struct mtd_partition sh7763rdp_nor_flash_partitions[] = { static struct mtd_partition sh7763rdp_nor_flash_partitions[] = {
@ -60,8 +63,85 @@ static struct platform_device sh7763rdp_nor_flash_device = {
}, },
}; };
/* SH-Ether */
static struct resource sh_eth_resources[] = {
{
.start = 0xFEE00800, /* use eth1 */
.end = 0xFEE00F7C - 1,
.flags = IORESOURCE_MEM,
}, {
.start = 58, /* irq number */
.end = 58,
.flags = IORESOURCE_IRQ,
},
};
static struct sh_eth_plat_data sh7763_eth_pdata = {
.phy = 1,
.edmac_endian = EDMAC_LITTLE_ENDIAN,
};
static struct platform_device sh7763rdp_eth_device = {
.name = "sh-eth",
.resource = sh_eth_resources,
.num_resources = ARRAY_SIZE(sh_eth_resources),
.dev = {
.platform_data = &sh7763_eth_pdata,
},
};
/* SH7763 LCDC */
static struct resource sh7763rdp_fb_resources[] = {
{
.start = 0xFFE80000,
.end = 0xFFE80442 - 1,
.flags = IORESOURCE_MEM,
},
};
static struct fb_videomode sh7763fb_videomode = {
.refresh = 60,
.name = "VGA Monitor",
.xres = 640,
.yres = 480,
.pixclock = 10000,
.left_margin = 80,
.right_margin = 24,
.upper_margin = 30,
.lower_margin = 1,
.hsync_len = 96,
.vsync_len = 1,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED,
.flag = FBINFO_FLAG_DEFAULT,
};
static struct sh7760fb_platdata sh7763fb_def_pdata = {
.def_mode = &sh7763fb_videomode,
.ldmtr = (LDMTR_TFT_COLOR_16|LDMTR_MCNT),
.lddfr = LDDFR_16BPP_RGB565,
.ldpmmr = 0x0000,
.ldpspr = 0xFFFF,
.ldaclnr = 0x0001,
.ldickr = 0x1102,
.rotate = 0,
.novsync = 0,
.blank = NULL,
};
static struct platform_device sh7763rdp_fb_device = {
.name = "sh7760-lcdc",
.resource = sh7763rdp_fb_resources,
.num_resources = ARRAY_SIZE(sh7763rdp_fb_resources),
.dev = {
.platform_data = &sh7763fb_def_pdata,
},
};
static struct platform_device *sh7763rdp_devices[] __initdata = { static struct platform_device *sh7763rdp_devices[] __initdata = {
&sh7763rdp_nor_flash_device, &sh7763rdp_nor_flash_device,
&sh7763rdp_eth_device,
&sh7763rdp_fb_device,
}; };
static int __init sh7763rdp_devices_setup(void) static int __init sh7763rdp_devices_setup(void)
@ -69,7 +149,7 @@ static int __init sh7763rdp_devices_setup(void)
return platform_add_devices(sh7763rdp_devices, return platform_add_devices(sh7763rdp_devices,
ARRAY_SIZE(sh7763rdp_devices)); ARRAY_SIZE(sh7763rdp_devices));
} }
__initcall(sh7763rdp_devices_setup); device_initcall(sh7763rdp_devices_setup);
static void __init sh7763rdp_setup(char **cmdline_p) static void __init sh7763rdp_setup(char **cmdline_p)
{ {

View File

@ -3,7 +3,7 @@
* *
* Renesas SH-X3 Prototype Board Support. * Renesas SH-X3 Prototype Board Support.
* *
* Copyright (C) 2007 Paul Mundt * Copyright (C) 2007 - 2008 Paul Mundt
* *
* This file is subject to the terms and conditions of the GNU General Public * This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive * License. See the file "COPYING" in the main directory of this archive
@ -13,6 +13,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/smc91x.h>
#include <asm/ilsel.h> #include <asm/ilsel.h>
static struct resource heartbeat_resources[] = { static struct resource heartbeat_resources[] = {
@ -30,6 +31,10 @@ static struct platform_device heartbeat_device = {
.resource = heartbeat_resources, .resource = heartbeat_resources,
}; };
static struct smc91x_platdata smc91x_info = {
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
};
static struct resource smc91x_resources[] = { static struct resource smc91x_resources[] = {
[0] = { [0] = {
.start = 0x18000300, .start = 0x18000300,
@ -47,6 +52,9 @@ static struct platform_device smc91x_device = {
.id = -1, .id = -1,
.resource = smc91x_resources, .resource = smc91x_resources,
.num_resources = ARRAY_SIZE(smc91x_resources), .num_resources = ARRAY_SIZE(smc91x_resources),
.dev = {
.platform_data = &smc91x_info,
},
}; };
static struct resource r8a66597_usb_host_resources[] = { static struct resource r8a66597_usb_host_resources[] = {

View File

@ -1,15 +1,17 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.26-rc4 # Linux kernel version: 2.6.27-rc2
# Fri Jun 6 12:20:17 2008 # Fri Aug 8 13:44:20 2008
# #
CONFIG_SUPERH=y CONFIG_SUPERH=y
CONFIG_SUPERH32=y CONFIG_SUPERH32=y
CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig"
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_FIND_NEXT_BIT=y CONFIG_GENERIC_FIND_NEXT_BIT=y
CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME=y CONFIG_GENERIC_TIME=y
@ -19,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y
# CONFIG_ARCH_HAS_ILOG2_U32 is not set # CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set # CONFIG_ARCH_HAS_ILOG2_U64 is not set
CONFIG_ARCH_NO_VIRT_TO_BUS=y CONFIG_ARCH_NO_VIRT_TO_BUS=y
CONFIG_ARCH_SUPPORTS_AOUT=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
# #
@ -83,10 +84,16 @@ CONFIG_PROFILING=y
# CONFIG_MARKERS is not set # CONFIG_MARKERS is not set
CONFIG_OPROFILE=y CONFIG_OPROFILE=y
CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_OPROFILE=y
# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
# CONFIG_HAVE_IOREMAP_PROT is not set
# CONFIG_HAVE_KPROBES is not set # CONFIG_HAVE_KPROBES is not set
# CONFIG_HAVE_KRETPROBES is not set # CONFIG_HAVE_KRETPROBES is not set
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
# CONFIG_HAVE_DMA_ATTRS is not set # CONFIG_HAVE_DMA_ATTRS is not set
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
CONFIG_HAVE_CLK=y
CONFIG_PROC_PAGE_MONITOR=y CONFIG_PROC_PAGE_MONITOR=y
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
CONFIG_SLABINFO=y CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
@ -96,12 +103,13 @@ CONFIG_MODULES=y
# CONFIG_MODULE_UNLOAD is not set # CONFIG_MODULE_UNLOAD is not set
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_KMOD is not set CONFIG_KMOD=y
CONFIG_BLOCK=y CONFIG_BLOCK=y
# CONFIG_LBD is not set # CONFIG_LBD is not set
# CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set # CONFIG_LSF is not set
# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
# #
# IO Schedulers # IO Schedulers
@ -177,6 +185,7 @@ CONFIG_PAGE_SIZE_4KB=y
# CONFIG_PAGE_SIZE_8KB is not set # CONFIG_PAGE_SIZE_8KB is not set
# CONFIG_PAGE_SIZE_16KB is not set # CONFIG_PAGE_SIZE_16KB is not set
# CONFIG_PAGE_SIZE_64KB is not set # CONFIG_PAGE_SIZE_64KB is not set
CONFIG_ENTRY_OFFSET=0x00001000
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set # CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_DISCONTIGMEM_MANUAL is not set
@ -258,6 +267,7 @@ CONFIG_HZ=250
# CONFIG_SCHED_HRTICK is not set # CONFIG_SCHED_HRTICK is not set
# CONFIG_KEXEC is not set # CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not set # CONFIG_CRASH_DUMP is not set
CONFIG_SECCOMP=y
CONFIG_PREEMPT_NONE=y CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
@ -282,10 +292,6 @@ CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/sda1 rootdelay=10"
# #
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set # CONFIG_BINFMT_MISC is not set
#
# Networking
#
CONFIG_NET=y CONFIG_NET=y
# #
@ -361,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# #
# CONFIG_CFG80211 is not set # CONFIG_CFG80211 is not set
CONFIG_WIRELESS_EXT=y CONFIG_WIRELESS_EXT=y
CONFIG_WIRELESS_EXT_SYSFS=y
# CONFIG_MAC80211 is not set # CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set # CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set # CONFIG_RFKILL is not set
@ -377,6 +384,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_SYS_HYPERVISOR is not set # CONFIG_SYS_HYPERVISOR is not set
# CONFIG_CONNECTOR is not set # CONFIG_CONNECTOR is not set
CONFIG_MTD=y CONFIG_MTD=y
@ -471,6 +480,7 @@ CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
# CONFIG_CDROM_PKTCDVD is not set # CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set # CONFIG_ATA_OVER_ETH is not set
# CONFIG_BLK_DEV_HD is not set
# CONFIG_MISC_DEVICES is not set # CONFIG_MISC_DEVICES is not set
CONFIG_HAVE_IDE=y CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set # CONFIG_IDE is not set
@ -515,10 +525,10 @@ CONFIG_SCSI_WAIT_SCAN=m
CONFIG_SCSI_LOWLEVEL=y CONFIG_SCSI_LOWLEVEL=y
# CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_TCP is not set
# CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DEBUG is not set
# CONFIG_SCSI_DH is not set
# CONFIG_ATA is not set # CONFIG_ATA is not set
# CONFIG_MD is not set # CONFIG_MD is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
# CONFIG_DUMMY is not set # CONFIG_DUMMY is not set
# CONFIG_BONDING is not set # CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set # CONFIG_MACVLAN is not set
@ -546,7 +556,9 @@ CONFIG_NET_ETHERNET=y
CONFIG_MII=y CONFIG_MII=y
# CONFIG_AX88796 is not set # CONFIG_AX88796 is not set
# CONFIG_STNIC is not set # CONFIG_STNIC is not set
CONFIG_SH_ETH=y
# CONFIG_SMC91X is not set # CONFIG_SMC91X is not set
# CONFIG_SMC911X is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set # CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set # CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set # CONFIG_IBM_NEW_EMAC_TAH is not set
@ -613,7 +625,11 @@ CONFIG_INPUT=y
# #
# Character devices # Character devices
# #
# CONFIG_VT is not set CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
CONFIG_DEVKMEM=y CONFIG_DEVKMEM=y
# CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_SERIAL_NONSTANDARD is not set
@ -644,6 +660,7 @@ CONFIG_HW_RANDOM=y
# CONFIG_POWER_SUPPLY is not set # CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
# CONFIG_THERMAL is not set # CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
# #
@ -655,6 +672,7 @@ CONFIG_SSB_POSSIBLE=y
# #
# Multifunction device drivers # Multifunction device drivers
# #
# CONFIG_MFD_CORE is not set
# CONFIG_MFD_SM501 is not set # CONFIG_MFD_SM501 is not set
# CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_PASIC3 is not set
@ -679,7 +697,34 @@ CONFIG_SSB_POSSIBLE=y
# #
# CONFIG_VGASTATE is not set # CONFIG_VGASTATE is not set
# CONFIG_VIDEO_OUTPUT_CONTROL is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set
# CONFIG_FB is not set CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
# CONFIG_FB_SYS_FILLRECT is not set
# CONFIG_FB_SYS_COPYAREA is not set
# CONFIG_FB_SYS_IMAGEBLIT is not set
CONFIG_FB_FOREIGN_ENDIAN=y
CONFIG_FB_BOTH_ENDIAN=y
# CONFIG_FB_BIG_ENDIAN is not set
# CONFIG_FB_LITTLE_ENDIAN is not set
# CONFIG_FB_SYS_FOPS is not set
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
# CONFIG_FB_MODE_HELPERS is not set
# CONFIG_FB_TILEBLITTING is not set
#
# Frame buffer hardware drivers
#
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_SH_MOBILE_LCDC is not set
CONFIG_FB_SH7760=y
# CONFIG_FB_VIRTUAL is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
# #
@ -688,8 +733,22 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_DISPLAY_SUPPORT is not set # CONFIG_DISPLAY_SUPPORT is not set
# #
# Sound # Console display driver support
# #
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_LOGO_SUPERH_MONO=y
CONFIG_LOGO_SUPERH_VGA16=y
CONFIG_LOGO_SUPERH_CLUT224=y
# CONFIG_SOUND is not set # CONFIG_SOUND is not set
# CONFIG_HID_SUPPORT is not set # CONFIG_HID_SUPPORT is not set
CONFIG_USB_SUPPORT=y CONFIG_USB_SUPPORT=y
@ -788,11 +847,27 @@ CONFIG_USB_MON=y
# CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_GADGET is not set # CONFIG_USB_GADGET is not set
# CONFIG_MMC is not set CONFIG_MMC=y
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_UNSAFE_RESUME is not set
#
# MMC/SD Card Drivers
#
CONFIG_MMC_BLOCK=y
CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_SDIO_UART is not set
# CONFIG_MMC_TEST is not set
#
# MMC/SD Host Controller Drivers
#
# CONFIG_MMC_SDHCI is not set
# CONFIG_MEMSTICK is not set # CONFIG_MEMSTICK is not set
# CONFIG_NEW_LEDS is not set # CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set # CONFIG_ACCESSIBILITY is not set
# CONFIG_RTC_CLASS is not set # CONFIG_RTC_CLASS is not set
# CONFIG_DMADEVICES is not set
# CONFIG_UIO is not set # CONFIG_UIO is not set
# #
@ -865,6 +940,7 @@ CONFIG_TMPFS_POSIX_ACL=y
# CONFIG_CRAMFS is not set # CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set # CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set # CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
@ -874,12 +950,11 @@ CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set # CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set # CONFIG_NFS_V4 is not set
# CONFIG_NFSD is not set
CONFIG_ROOT_NFS=y CONFIG_ROOT_NFS=y
# CONFIG_NFSD is not set
CONFIG_LOCKD=y CONFIG_LOCKD=y
CONFIG_NFS_COMMON=y CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y CONFIG_SUNRPC=y
# CONFIG_SUNRPC_BIND34 is not set
# CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_KRB5 is not set
# CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set # CONFIG_SMB_FS is not set
@ -949,6 +1024,7 @@ CONFIG_FRAME_WARN=1024
# CONFIG_HEADERS_CHECK is not set # CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_KERNEL is not set # CONFIG_DEBUG_KERNEL is not set
# CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_BUGVERBOSE is not set
# CONFIG_DEBUG_MEMORY_INIT is not set
# CONFIG_SAMPLES is not set # CONFIG_SAMPLES is not set
# CONFIG_SH_STANDARD_BIOS is not set # CONFIG_SH_STANDARD_BIOS is not set
# CONFIG_EARLY_SCIF_CONSOLE is not set # CONFIG_EARLY_SCIF_CONSOLE is not set
@ -1003,6 +1079,10 @@ CONFIG_CRYPTO=y
# CONFIG_CRYPTO_MD4 is not set # CONFIG_CRYPTO_MD4 is not set
# CONFIG_CRYPTO_MD5 is not set # CONFIG_CRYPTO_MD5 is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_RMD128 is not set
# CONFIG_CRYPTO_RMD160 is not set
# CONFIG_CRYPTO_RMD256 is not set
# CONFIG_CRYPTO_RMD320 is not set
# CONFIG_CRYPTO_SHA1 is not set # CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_SHA512 is not set
@ -1042,6 +1122,7 @@ CONFIG_BITREVERSE=y
# CONFIG_GENERIC_FIND_FIRST_BIT is not set # CONFIG_GENERIC_FIND_FIRST_BIT is not set
# CONFIG_CRC_CCITT is not set # CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set # CONFIG_CRC16 is not set
CONFIG_CRC_T10DIF=y
# CONFIG_CRC_ITU_T is not set # CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y CONFIG_CRC32=y
# CONFIG_CRC7 is not set # CONFIG_CRC7 is not set

View File

@ -21,4 +21,11 @@
#define flat_get_relocate_addr(rel) (rel) #define flat_get_relocate_addr(rel) (rel)
#define flat_set_persistent(relval, p) ({ (void)p; 0; }) #define flat_set_persistent(relval, p) ({ (void)p; 0; })
#define FLAT_PLAT_INIT(_r) \
do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
_r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
_r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
_r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
_r->sr = SR_FD; } while (0)
#endif /* __ASM_SH_FLAT_H */ #endif /* __ASM_SH_FLAT_H */

View File

@ -42,9 +42,6 @@
#define PORT_MSELCRB 0xa4050182 #define PORT_MSELCRB 0xa4050182
#define MSTPCR1 0xa4150034
#define MSTPCR2 0xa4150038
#define PORT_PSELA 0xa405014e #define PORT_PSELA 0xa405014e
#define PORT_PSELB 0xa4050150 #define PORT_PSELB 0xa4050150
#define PORT_PSELC 0xa4050152 #define PORT_PSELC 0xa4050152

View File

@ -47,12 +47,18 @@ struct sh_mobile_lcdc_board_cfg {
void (*display_off)(void *board_data); void (*display_off)(void *board_data);
}; };
struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */
unsigned long width;
unsigned long height;
};
struct sh_mobile_lcdc_chan_cfg { struct sh_mobile_lcdc_chan_cfg {
int chan; int chan;
int bpp; int bpp;
int interface_type; /* selects RGBn or SYSn I/F, see above */ int interface_type; /* selects RGBn or SYSn I/F, see above */
int clock_divider; int clock_divider;
struct fb_videomode lcd_cfg; struct fb_videomode lcd_cfg;
struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg;
struct sh_mobile_lcdc_board_cfg board_cfg; struct sh_mobile_lcdc_board_cfg board_cfg;
struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */
}; };

View File

@ -29,6 +29,16 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned l
void flush_dcache_page(struct page *pg); void flush_dcache_page(struct page *pg);
void flush_icache_range(unsigned long start, unsigned long end); void flush_icache_range(unsigned long start, unsigned long end);
void flush_icache_page(struct vm_area_struct *vma, struct page *page); void flush_icache_page(struct vm_area_struct *vma, struct page *page);
#define flush_dcache_mmap_lock(mapping) do { } while (0)
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
/* SH3 has unified cache so no special action needed here */
#define flush_cache_sigtramp(vaddr) do { } while (0)
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
#define p3_cache_init() do { } while (0)
#else #else
#include <cpu-common/cpu/cacheflush.h> #include <cpu-common/cpu/cacheflush.h>
#endif #endif

View File

@ -45,7 +45,7 @@ static struct platform_device vpu_device = {
}; };
static struct uio_info veu0_platform_data = { static struct uio_info veu0_platform_data = {
.name = "VEU", .name = "VEU2H",
.version = "0", .version = "0",
.irq = 54, .irq = 54,
}; };
@ -73,7 +73,7 @@ static struct platform_device veu0_device = {
}; };
static struct uio_info veu1_platform_data = { static struct uio_info veu1_platform_data = {
.name = "VEU", .name = "VEU2H",
.version = "0", .version = "0",
.irq = 27, .irq = 27,
}; };

View File

@ -107,10 +107,12 @@ DECLARE_EXPORT(__movmemSI12_i4);
* GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST
* compiler which include backported patches. * compiler which include backported patches.
*/ */
DECLARE_EXPORT(__sdivsi3_i4i);
DECLARE_EXPORT(__udiv_qrnnd_16); DECLARE_EXPORT(__udiv_qrnnd_16);
#if !defined(CONFIG_CPU_SH2)
DECLARE_EXPORT(__sdivsi3_i4i);
DECLARE_EXPORT(__udivsi3_i4i); DECLARE_EXPORT(__udivsi3_i4i);
#endif #endif
#endif
#else /* GCC 3.x */ #else /* GCC 3.x */
DECLARE_EXPORT(__movstr_i4_even); DECLARE_EXPORT(__movstr_i4_even);
DECLARE_EXPORT(__movstr_i4_odd); DECLARE_EXPORT(__movstr_i4_odd);

View File

@ -181,10 +181,12 @@ config ENTRY_OFFSET
choice choice
prompt "HugeTLB page size" prompt "HugeTLB page size"
depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU
default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB
default HUGETLB_PAGE_SIZE_64K default HUGETLB_PAGE_SIZE_64K
config HUGETLB_PAGE_SIZE_64K config HUGETLB_PAGE_SIZE_64K
bool "64kB" bool "64kB"
depends on !PAGE_SIZE_64KB
config HUGETLB_PAGE_SIZE_256K config HUGETLB_PAGE_SIZE_256K
bool "256kB" bool "256kB"

View File

@ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
} }
EXPORT_SYMBOL(dma_cache_sync); EXPORT_SYMBOL(dma_cache_sync);
static int __init memchunk_setup(char *str)
{
return 1; /* accept anything that begins with "memchunk." */
}
__setup("memchunk.", memchunk_setup);
static void memchunk_cmdline_override(char *name, unsigned long *sizep)
{
char *p = boot_command_line;
int k = strlen(name);
while ((p = strstr(p, "memchunk."))) {
p += 9; /* strlen("memchunk.") */
if (!strncmp(name, p, k) && p[k] == '=') {
p += k + 1;
*sizep = memparse(p, NULL);
pr_info("%s: forcing memory chunk size to 0x%08lx\n",
name, *sizep);
break;
}
}
}
int platform_resource_setup_memory(struct platform_device *pdev, int platform_resource_setup_memory(struct platform_device *pdev,
char *name, unsigned long memsize) char *name, unsigned long memsize)
{ {
@ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev,
return -EINVAL; return -EINVAL;
} }
memchunk_cmdline_override(name, &memsize);
if (!memsize)
return 0;
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL); buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
if (!buf) { if (!buf) {
pr_warning("%s: unable to allocate memory\n", name); pr_warning("%s: unable to allocate memory\n", name);

View File

@ -737,63 +737,44 @@ static int find_psb_table(struct powernow_k8_data *data)
#ifdef CONFIG_X86_POWERNOW_K8_ACPI #ifdef CONFIG_X86_POWERNOW_K8_ACPI
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index)
{ {
if (!data->acpi_data->state_count || (cpu_family == CPU_HW_PSTATE)) if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE))
return; return;
data->irt = (data->acpi_data->states[index].control >> IRT_SHIFT) & IRT_MASK; data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
data->rvo = (data->acpi_data->states[index].control >> RVO_SHIFT) & RVO_MASK; data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
data->exttype = (data->acpi_data->states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
data->plllock = (data->acpi_data->states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
data->vidmvs = 1 << ((data->acpi_data->states[index].control >> MVS_SHIFT) & MVS_MASK); data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
data->vstable = (data->acpi_data->states[index].control >> VST_SHIFT) & VST_MASK; data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
}
static struct acpi_processor_performance *acpi_perf_data;
static int preregister_valid;
static int powernow_k8_cpu_preinit_acpi(void)
{
acpi_perf_data = alloc_percpu(struct acpi_processor_performance);
if (!acpi_perf_data)
return -ENODEV;
if (acpi_processor_preregister_performance(acpi_perf_data))
return -ENODEV;
else
preregister_valid = 1;
return 0;
} }
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
{ {
struct cpufreq_frequency_table *powernow_table; struct cpufreq_frequency_table *powernow_table;
int ret_val; int ret_val;
int cpu = 0;
data->acpi_data = percpu_ptr(acpi_perf_data, cpu); if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
if (acpi_processor_register_performance(data->acpi_data, data->cpu)) {
dprintk("register performance failed: bad ACPI data\n"); dprintk("register performance failed: bad ACPI data\n");
return -EIO; return -EIO;
} }
/* verify the data contained in the ACPI structures */ /* verify the data contained in the ACPI structures */
if (data->acpi_data->state_count <= 1) { if (data->acpi_data.state_count <= 1) {
dprintk("No ACPI P-States\n"); dprintk("No ACPI P-States\n");
goto err_out; goto err_out;
} }
if ((data->acpi_data->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
(data->acpi_data->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
dprintk("Invalid control/status registers (%x - %x)\n", dprintk("Invalid control/status registers (%x - %x)\n",
data->acpi_data->control_register.space_id, data->acpi_data.control_register.space_id,
data->acpi_data->status_register.space_id); data->acpi_data.status_register.space_id);
goto err_out; goto err_out;
} }
/* fill in data->powernow_table */ /* fill in data->powernow_table */
powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table)
* (data->acpi_data->state_count + 1)), GFP_KERNEL); * (data->acpi_data.state_count + 1)), GFP_KERNEL);
if (!powernow_table) { if (!powernow_table) {
dprintk("powernow_table memory alloc failure\n"); dprintk("powernow_table memory alloc failure\n");
goto err_out; goto err_out;
@ -806,12 +787,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
if (ret_val) if (ret_val)
goto err_out_mem; goto err_out_mem;
powernow_table[data->acpi_data->state_count].frequency = CPUFREQ_TABLE_END; powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END;
powernow_table[data->acpi_data->state_count].index = 0; powernow_table[data->acpi_data.state_count].index = 0;
data->powernow_table = powernow_table; data->powernow_table = powernow_table;
/* fill in data */ /* fill in data */
data->numps = data->acpi_data->state_count; data->numps = data->acpi_data.state_count;
if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu) if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu)
print_basics(data); print_basics(data);
powernow_k8_acpi_pst_values(data, 0); powernow_k8_acpi_pst_values(data, 0);
@ -819,31 +800,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
/* notify BIOS that we exist */ /* notify BIOS that we exist */
acpi_processor_notify_smm(THIS_MODULE); acpi_processor_notify_smm(THIS_MODULE);
/* determine affinity, from ACPI if available */
if (preregister_valid) {
if ((data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ALL) ||
(data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ANY))
data->starting_core_affinity = data->acpi_data->shared_cpu_map;
else
data->starting_core_affinity = cpumask_of_cpu(data->cpu);
} else {
/* best guess from family if not */
if (cpu_family == CPU_HW_PSTATE)
data->starting_core_affinity = cpumask_of_cpu(data->cpu);
else
data->starting_core_affinity = per_cpu(cpu_core_map, data->cpu);
}
return 0; return 0;
err_out_mem: err_out_mem:
kfree(powernow_table); kfree(powernow_table);
err_out: err_out:
acpi_processor_unregister_performance(data->acpi_data, data->cpu); acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
data->acpi_data->state_count = 0; data->acpi_data.state_count = 0;
return -ENODEV; return -ENODEV;
} }
@ -855,10 +821,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo); rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo);
data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT; data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT;
for (i = 0; i < data->acpi_data->state_count; i++) { for (i = 0; i < data->acpi_data.state_count; i++) {
u32 index; u32 index;
index = data->acpi_data->states[i].control & HW_PSTATE_MASK; index = data->acpi_data.states[i].control & HW_PSTATE_MASK;
if (index > data->max_hw_pstate) { if (index > data->max_hw_pstate) {
printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index);
printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); printk(KERN_ERR PFX "Please report to BIOS manufacturer\n");
@ -874,7 +840,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
powernow_table[i].index = index; powernow_table[i].index = index;
powernow_table[i].frequency = data->acpi_data->states[i].core_frequency * 1000; powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000;
} }
return 0; return 0;
} }
@ -883,16 +849,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
{ {
int i; int i;
int cntlofreq = 0; int cntlofreq = 0;
for (i = 0; i < data->acpi_data->state_count; i++) { for (i = 0; i < data->acpi_data.state_count; i++) {
u32 fid; u32 fid;
u32 vid; u32 vid;
if (data->exttype) { if (data->exttype) {
fid = data->acpi_data->states[i].status & EXT_FID_MASK; fid = data->acpi_data.states[i].status & EXT_FID_MASK;
vid = (data->acpi_data->states[i].status >> VID_SHIFT) & EXT_VID_MASK; vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK;
} else { } else {
fid = data->acpi_data->states[i].control & FID_MASK; fid = data->acpi_data.states[i].control & FID_MASK;
vid = (data->acpi_data->states[i].control >> VID_SHIFT) & VID_MASK; vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
} }
dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
@ -933,10 +899,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
cntlofreq = i; cntlofreq = i;
} }
if (powernow_table[i].frequency != (data->acpi_data->states[i].core_frequency * 1000)) { if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n",
powernow_table[i].frequency, powernow_table[i].frequency,
(unsigned int) (data->acpi_data->states[i].core_frequency * 1000)); (unsigned int) (data->acpi_data.states[i].core_frequency * 1000));
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
continue; continue;
} }
@ -946,12 +912,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
{ {
if (data->acpi_data->state_count) if (data->acpi_data.state_count)
acpi_processor_unregister_performance(data->acpi_data, data->cpu); acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
} }
#else #else
static int powernow_k8_cpu_preinit_acpi(void) { return -ENODEV; }
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
@ -1136,7 +1101,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
{ {
struct powernow_k8_data *data; struct powernow_k8_data *data;
cpumask_t oldmask = CPU_MASK_ALL; cpumask_t oldmask;
int rc; int rc;
if (!cpu_online(pol->cpu)) if (!cpu_online(pol->cpu))
@ -1209,7 +1174,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
/* run on any CPU again */ /* run on any CPU again */
set_cpus_allowed_ptr(current, &oldmask); set_cpus_allowed_ptr(current, &oldmask);
pol->cpus = data->starting_core_affinity; if (cpu_family == CPU_HW_PSTATE)
pol->cpus = cpumask_of_cpu(pol->cpu);
else
pol->cpus = per_cpu(cpu_core_map, pol->cpu);
data->available_cores = &(pol->cpus); data->available_cores = &(pol->cpus);
/* Take a crude guess here. /* Take a crude guess here.
@ -1332,7 +1300,6 @@ static int __cpuinit powernowk8_init(void)
} }
if (supported_cpus == num_online_cpus()) { if (supported_cpus == num_online_cpus()) {
powernow_k8_cpu_preinit_acpi();
printk(KERN_INFO PFX "Found %d %s " printk(KERN_INFO PFX "Found %d %s "
"processors (%d cpu cores) (" VERSION ")\n", "processors (%d cpu cores) (" VERSION ")\n",
num_online_nodes(), num_online_nodes(),
@ -1349,10 +1316,6 @@ static void __exit powernowk8_exit(void)
dprintk("exit\n"); dprintk("exit\n");
cpufreq_unregister_driver(&cpufreq_amd64_driver); cpufreq_unregister_driver(&cpufreq_amd64_driver);
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
free_percpu(acpi_perf_data);
#endif
} }
MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>"); MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>");

View File

@ -33,13 +33,12 @@ struct powernow_k8_data {
#ifdef CONFIG_X86_POWERNOW_K8_ACPI #ifdef CONFIG_X86_POWERNOW_K8_ACPI
/* the acpi table needs to be kept. it's only available if ACPI was /* the acpi table needs to be kept. it's only available if ACPI was
* used to determine valid frequency/vid/fid states */ * used to determine valid frequency/vid/fid states */
struct acpi_processor_performance *acpi_data; struct acpi_processor_performance acpi_data;
#endif #endif
/* we need to keep track of associated cores, but let cpufreq /* we need to keep track of associated cores, but let cpufreq
* handle hotplug events - so just point at cpufreq pol->cpus * handle hotplug events - so just point at cpufreq pol->cpus
* structure */ * structure */
cpumask_t *available_cores; cpumask_t *available_cores;
cpumask_t starting_core_affinity;
}; };

View File

@ -25,7 +25,6 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/version.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/gpio.h> #include <asm/gpio.h>

View File

@ -590,6 +590,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
case PCI_DEVICE_ID_INTEL_ICH10_1: case PCI_DEVICE_ID_INTEL_ICH10_1:
case PCI_DEVICE_ID_INTEL_ICH10_2: case PCI_DEVICE_ID_INTEL_ICH10_2:
case PCI_DEVICE_ID_INTEL_ICH10_3: case PCI_DEVICE_ID_INTEL_ICH10_3:
case PCI_DEVICE_ID_INTEL_PCH_0:
case PCI_DEVICE_ID_INTEL_PCH_1:
r->name = "PIIX/ICH"; r->name = "PIIX/ICH";
r->get = pirq_piix_get; r->get = pirq_piix_get;
r->set = pirq_piix_set; r->set = pirq_piix_set;

View File

@ -14,7 +14,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
int n, devfn; int n, devfn;
long node; long node;
if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff) if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff)
return; return;
DBG("PCI: Peer bridge fixup\n"); DBG("PCI: Peer bridge fixup\n");

View File

@ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl,
return AE_OK; return AE_OK;
} }
static int __init is_acpi_reserved(unsigned long start, unsigned long end) static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
{ {
struct resource mcfg_res; struct resource mcfg_res;
@ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end)
return mcfg_res.flags; return mcfg_res.flags;
} }
typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
static int __init is_mmconf_reserved(check_reserved_t is_reserved,
u64 addr, u64 size, int i,
typeof(pci_mmcfg_config[0]) *cfg, int with_e820)
{
u64 old_size = size;
int valid = 0;
while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
size >>= 1;
if (size < (16UL<<20))
break;
}
if (size >= (16UL<<20) || size == old_size) {
printk(KERN_NOTICE
"PCI: MCFG area at %Lx reserved in %s\n",
addr, with_e820?"E820":"ACPI motherboard resources");
valid = 1;
if (old_size != size) {
/* update end_bus_number */
cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1);
printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx "
"segment %hu buses %u - %u\n",
i, (unsigned long)cfg->address, cfg->pci_segment,
(unsigned int)cfg->start_bus_number,
(unsigned int)cfg->end_bus_number);
}
}
return valid;
}
static void __init pci_mmcfg_reject_broken(int early) static void __init pci_mmcfg_reject_broken(int early)
{ {
typeof(pci_mmcfg_config[0]) *cfg; typeof(pci_mmcfg_config[0]) *cfg;
@ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early)
for (i = 0; i < pci_mmcfg_config_num; i++) { for (i = 0; i < pci_mmcfg_config_num; i++) {
int valid = 0; int valid = 0;
u32 size = (cfg->end_bus_number + 1) << 20; u64 addr, size;
cfg = &pci_mmcfg_config[i]; cfg = &pci_mmcfg_config[i];
addr = cfg->start_bus_number;
addr <<= 20;
addr += cfg->address;
size = cfg->end_bus_number + 1 - cfg->start_bus_number;
size <<= 20;
printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx " printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
"segment %hu buses %u - %u\n", "segment %hu buses %u - %u\n",
i, (unsigned long)cfg->address, cfg->pci_segment, i, (unsigned long)cfg->address, cfg->pci_segment,
(unsigned int)cfg->start_bus_number, (unsigned int)cfg->start_bus_number,
(unsigned int)cfg->end_bus_number); (unsigned int)cfg->end_bus_number);
if (!early && if (!early)
is_acpi_reserved(cfg->address, cfg->address + size - 1)) { valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0);
printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved "
"in ACPI motherboard resources\n",
cfg->address);
valid = 1;
}
if (valid) if (valid)
continue; continue;
@ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early)
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not" printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
" reserved in ACPI motherboard resources\n", " reserved in ACPI motherboard resources\n",
cfg->address); cfg->address);
/* Don't try to do this check unless configuration /* Don't try to do this check unless configuration
type 1 is available. how about type 2 ?*/ type 1 is available. how about type 2 ?*/
if (raw_pci_ops && e820_all_mapped(cfg->address, if (raw_pci_ops)
cfg->address + size - 1, valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1);
E820_RESERVED)) {
printk(KERN_NOTICE
"PCI: MCFG area at %Lx reserved in E820\n",
cfg->address);
valid = 1;
}
if (!valid) if (!valid)
goto reject; goto reject;

View File

@ -293,27 +293,30 @@ void __init printk_all_partitions(void)
/* iterator */ /* iterator */
static int find_start(struct device *dev, void *data) static int find_start(struct device *dev, void *data)
{ {
loff_t k = *(loff_t *)data; loff_t *k = data;
if (dev->type != &disk_type) if (dev->type != &disk_type)
return 0; return 0;
if (!k--) if (!*k)
return 1; return 1;
(*k)--;
return 0; return 0;
} }
static void *part_start(struct seq_file *part, loff_t *pos) static void *part_start(struct seq_file *part, loff_t *pos)
{ {
struct device *dev; struct device *dev;
loff_t n = *pos; loff_t k = *pos;
if (!n) if (!k)
seq_puts(part, "major minor #blocks name\n\n"); seq_puts(part, "major minor #blocks name\n\n");
mutex_lock(&block_class_lock); mutex_lock(&block_class_lock);
dev = class_find_device(&block_class, NULL, (void *)pos, find_start); dev = class_find_device(&block_class, NULL, &k, find_start);
if (dev) if (dev) {
put_device(dev);
return dev_to_disk(dev); return dev_to_disk(dev);
}
return NULL; return NULL;
} }
@ -330,8 +333,10 @@ static void *part_next(struct seq_file *part, void *v, loff_t *pos)
struct device *dev; struct device *dev;
++*pos; ++*pos;
dev = class_find_device(&block_class, &gp->dev, NULL, find_next); dev = class_find_device(&block_class, &gp->dev, NULL, find_next);
if (dev) if (dev) {
put_device(dev);
return dev_to_disk(dev); return dev_to_disk(dev);
}
return NULL; return NULL;
} }
@ -568,11 +573,14 @@ static struct device_type disk_type = {
static void *diskstats_start(struct seq_file *part, loff_t *pos) static void *diskstats_start(struct seq_file *part, loff_t *pos)
{ {
struct device *dev; struct device *dev;
loff_t k = *pos;
mutex_lock(&block_class_lock); mutex_lock(&block_class_lock);
dev = class_find_device(&block_class, NULL, (void *)pos, find_start); dev = class_find_device(&block_class, NULL, &k, find_start);
if (dev) if (dev) {
put_device(dev);
return dev_to_disk(dev); return dev_to_disk(dev);
}
return NULL; return NULL;
} }
@ -583,8 +591,10 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos)
++*pos; ++*pos;
dev = class_find_device(&block_class, &gp->dev, NULL, find_next); dev = class_find_device(&block_class, &gp->dev, NULL, find_next);
if (dev) if (dev) {
put_device(dev);
return dev_to_disk(dev); return dev_to_disk(dev);
}
return NULL; return NULL;
} }
@ -712,10 +722,12 @@ dev_t blk_lookup_devt(const char *name, int part)
mutex_lock(&block_class_lock); mutex_lock(&block_class_lock);
find.name = name; find.name = name;
find.part = part; find.part = part;
dev = class_find_device(&block_class, NULL, (void *)&find, match_id); dev = class_find_device(&block_class, NULL, &find, match_id);
if (dev) if (dev) {
put_device(dev);
devt = MKDEV(MAJOR(dev->devt), devt = MKDEV(MAJOR(dev->devt),
MINOR(dev->devt) + part); MINOR(dev->devt) + part);
}
mutex_unlock(&block_class_lock); mutex_unlock(&block_class_lock);
return devt; return devt;

View File

@ -174,8 +174,9 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
static void crypto_authenc_encrypt_done(struct crypto_async_request *req, static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
int err) int err)
{ {
struct aead_request *areq = req->data;
if (!err) { if (!err) {
struct aead_request *areq = req->data;
struct crypto_aead *authenc = crypto_aead_reqtfm(areq); struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
struct ablkcipher_request *abreq = aead_request_ctx(areq); struct ablkcipher_request *abreq = aead_request_ctx(areq);
@ -185,7 +186,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
err = crypto_authenc_genicv(areq, iv, 0); err = crypto_authenc_genicv(areq, iv, 0);
} }
aead_request_complete(req->data, err); aead_request_complete(areq, err);
} }
static int crypto_authenc_encrypt(struct aead_request *req) static int crypto_authenc_encrypt(struct aead_request *req)
@ -216,14 +217,15 @@ static int crypto_authenc_encrypt(struct aead_request *req)
static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, static void crypto_authenc_givencrypt_done(struct crypto_async_request *req,
int err) int err)
{ {
struct aead_request *areq = req->data;
if (!err) { if (!err) {
struct aead_request *areq = req->data;
struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); struct skcipher_givcrypt_request *greq = aead_request_ctx(areq);
err = crypto_authenc_genicv(areq, greq->giv, 0); err = crypto_authenc_genicv(areq, greq->giv, 0);
} }
aead_request_complete(req->data, err); aead_request_complete(areq, err);
} }
static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req)

View File

@ -486,6 +486,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */ { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */ { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
{ PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */ { PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
/* JMicron 360/1/3/5/6, match class to avoid IDE function */ /* JMicron 360/1/3/5/6, match class to avoid IDE function */
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
@ -575,9 +577,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
{ PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */ { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */
/* SiS */ /* SiS */
{ PCI_VDEVICE(SI, 0x1184), board_ahci_nopmp }, /* SiS 966 */ { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
{ PCI_VDEVICE(SI, 0x1185), board_ahci_nopmp }, /* SiS 968 */ { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */
{ PCI_VDEVICE(SI, 0x0186), board_ahci_nopmp }, /* SiS 968 */ { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
/* Marvell */ /* Marvell */
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */

View File

@ -275,6 +275,14 @@ static const struct pci_device_id piix_pci_tbl[] = {
{ 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, { 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
/* SATA Controller IDE (ICH10) */ /* SATA Controller IDE (ICH10) */
{ 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, { 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
/* SATA Controller IDE (PCH) */
{ 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
/* SATA Controller IDE (PCH) */
{ 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
/* SATA Controller IDE (PCH) */
{ 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
/* SATA Controller IDE (PCH) */
{ 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
{ } /* terminate list */ { } /* terminate list */
}; };

View File

@ -104,6 +104,7 @@ struct ata_force_param {
unsigned long xfer_mask; unsigned long xfer_mask;
unsigned int horkage_on; unsigned int horkage_on;
unsigned int horkage_off; unsigned int horkage_off;
unsigned int lflags;
}; };
struct ata_force_ent { struct ata_force_ent {
@ -196,22 +197,23 @@ void ata_force_cbl(struct ata_port *ap)
} }
/** /**
* ata_force_spd_limit - force SATA spd limit according to libata.force * ata_force_link_limits - force link limits according to libata.force
* @link: ATA link of interest * @link: ATA link of interest
* *
* Force SATA spd limit according to libata.force and whine about * Force link flags and SATA spd limit according to libata.force
* it. When only the port part is specified (e.g. 1:), the limit * and whine about it. When only the port part is specified
* applies to all links connected to both the host link and all * (e.g. 1:), the limit applies to all links connected to both
* fan-out ports connected via PMP. If the device part is * the host link and all fan-out ports connected via PMP. If the
* specified as 0 (e.g. 1.00:), it specifies the first fan-out * device part is specified as 0 (e.g. 1.00:), it specifies the
* link not the host link. Device number 15 always points to the * first fan-out link not the host link. Device number 15 always
* host link whether PMP is attached or not. * points to the host link whether PMP is attached or not.
* *
* LOCKING: * LOCKING:
* EH context. * EH context.
*/ */
static void ata_force_spd_limit(struct ata_link *link) static void ata_force_link_limits(struct ata_link *link)
{ {
bool did_spd = false;
int linkno, i; int linkno, i;
if (ata_is_host_link(link)) if (ata_is_host_link(link))
@ -228,13 +230,22 @@ static void ata_force_spd_limit(struct ata_link *link)
if (fe->device != -1 && fe->device != linkno) if (fe->device != -1 && fe->device != linkno)
continue; continue;
if (!fe->param.spd_limit) /* only honor the first spd limit */
continue; if (!did_spd && fe->param.spd_limit) {
link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1;
ata_link_printk(link, KERN_NOTICE,
"FORCE: PHY spd limit set to %s\n",
fe->param.name);
did_spd = true;
}
link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1; /* let lflags stack */
ata_link_printk(link, KERN_NOTICE, if (fe->param.lflags) {
"FORCE: PHY spd limit set to %s\n", fe->param.name); link->flags |= fe->param.lflags;
return; ata_link_printk(link, KERN_NOTICE,
"FORCE: link flag 0x%x forced -> 0x%x\n",
fe->param.lflags, link->flags);
}
} }
} }
@ -3277,7 +3288,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
dev->dma_mode = ata_xfer_mask2mode(dma_mask); dev->dma_mode = ata_xfer_mask2mode(dma_mask);
found = 1; found = 1;
if (dev->dma_mode != 0xff) if (ata_dma_enabled(dev))
used_dma = 1; used_dma = 1;
} }
if (!found) if (!found)
@ -3302,7 +3313,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
/* step 3: set host DMA timings */ /* step 3: set host DMA timings */
ata_link_for_each_dev(dev, link) { ata_link_for_each_dev(dev, link) {
if (!ata_dev_enabled(dev) || dev->dma_mode == 0xff) if (!ata_dev_enabled(dev) || !ata_dma_enabled(dev))
continue; continue;
dev->xfer_mode = dev->dma_mode; dev->xfer_mode = dev->dma_mode;
@ -5188,19 +5199,18 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp)
*/ */
int sata_link_init_spd(struct ata_link *link) int sata_link_init_spd(struct ata_link *link)
{ {
u32 scontrol;
u8 spd; u8 spd;
int rc; int rc;
rc = sata_scr_read(link, SCR_CONTROL, &scontrol); rc = sata_scr_read(link, SCR_CONTROL, &link->saved_scontrol);
if (rc) if (rc)
return rc; return rc;
spd = (scontrol >> 4) & 0xf; spd = (link->saved_scontrol >> 4) & 0xf;
if (spd) if (spd)
link->hw_sata_spd_limit &= (1 << spd) - 1; link->hw_sata_spd_limit &= (1 << spd) - 1;
ata_force_spd_limit(link); ata_force_link_limits(link);
link->sata_spd_limit = link->hw_sata_spd_limit; link->sata_spd_limit = link->hw_sata_spd_limit;
@ -5783,9 +5793,10 @@ static void ata_port_detach(struct ata_port *ap)
ata_port_wait_eh(ap); ata_port_wait_eh(ap);
/* EH is now guaranteed to see UNLOADING - EH context belongs /* EH is now guaranteed to see UNLOADING - EH context belongs
* to us. Disable all existing devices. * to us. Restore SControl and disable all existing devices.
*/ */
ata_port_for_each_link(link, ap) { __ata_port_for_each_link(link, ap) {
sata_scr_write(link, SCR_CONTROL, link->saved_scontrol);
ata_link_for_each_dev(dev, link) ata_link_for_each_dev(dev, link)
ata_dev_disable(dev); ata_dev_disable(dev);
} }
@ -5991,6 +6002,9 @@ static int __init ata_parse_force_one(char **cur,
{ "udma133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, { "udma133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) },
{ "udma/133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, { "udma/133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) },
{ "udma7", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 7) }, { "udma7", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 7) },
{ "nohrst", .lflags = ATA_LFLAG_NO_HRST },
{ "nosrst", .lflags = ATA_LFLAG_NO_SRST },
{ "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
}; };
char *start = *cur, *p = *cur; char *start = *cur, *p = *cur;
char *id, *val, *endp; char *id, *val, *endp;

View File

@ -2040,7 +2040,7 @@ static void ata_eh_link_report(struct ata_link *link)
} }
if (ehc->i.serror) if (ehc->i.serror)
ata_port_printk(ap, KERN_ERR, ata_link_printk(link, KERN_ERR,
"SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n", "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n",
ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "", ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "",
ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "", ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "",
@ -2171,18 +2171,12 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
} }
static int ata_eh_followup_srst_needed(struct ata_link *link, static int ata_eh_followup_srst_needed(struct ata_link *link,
int rc, int classify, int rc, const unsigned int *classes)
const unsigned int *classes)
{ {
if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link)) if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
return 0; return 0;
if (rc == -EAGAIN) { if (rc == -EAGAIN)
if (classify) return 1;
return 1;
rc = 0;
}
if (rc != 0)
return 0;
if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
return 1; return 1;
return 0; return 0;
@ -2210,6 +2204,10 @@ int ata_eh_reset(struct ata_link *link, int classify,
*/ */
while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX) while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX)
max_tries++; max_tries++;
if (link->flags & ATA_LFLAG_NO_HRST)
hardreset = NULL;
if (link->flags & ATA_LFLAG_NO_SRST)
softreset = NULL;
now = jiffies; now = jiffies;
deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN); deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN);
@ -2247,10 +2245,10 @@ int ata_eh_reset(struct ata_link *link, int classify,
ehc->i.action &= ~ATA_EH_RESET; ehc->i.action &= ~ATA_EH_RESET;
if (hardreset) { if (hardreset) {
reset = hardreset; reset = hardreset;
ehc->i.action = ATA_EH_HARDRESET; ehc->i.action |= ATA_EH_HARDRESET;
} else if (softreset) { } else if (softreset) {
reset = softreset; reset = softreset;
ehc->i.action = ATA_EH_SOFTRESET; ehc->i.action |= ATA_EH_SOFTRESET;
} }
if (prereset) { if (prereset) {
@ -2305,9 +2303,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
ehc->i.flags |= ATA_EHI_DID_SOFTRESET; ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
rc = ata_do_reset(link, reset, classes, deadline); rc = ata_do_reset(link, reset, classes, deadline);
if (rc && rc != -EAGAIN)
goto fail;
if (reset == hardreset && if (reset == hardreset &&
ata_eh_followup_srst_needed(link, rc, classify, classes)) { ata_eh_followup_srst_needed(link, rc, classes)) {
/* okay, let's do follow-up softreset */ /* okay, let's do follow-up softreset */
reset = softreset; reset = softreset;
@ -2322,10 +2322,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
ata_eh_about_to_do(link, NULL, ATA_EH_RESET); ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
rc = ata_do_reset(link, reset, classes, deadline); rc = ata_do_reset(link, reset, classes, deadline);
} }
/* -EAGAIN can happen if we skipped followup SRST */
if (rc && rc != -EAGAIN)
goto fail;
} else { } else {
if (verbose) if (verbose)
ata_link_printk(link, KERN_INFO, "no reset method " ata_link_printk(link, KERN_INFO, "no reset method "

View File

@ -181,7 +181,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc)
if (adev != acpi->last) { if (adev != acpi->last) {
pacpi_set_piomode(ap, adev); pacpi_set_piomode(ap, adev);
if (adev->dma_mode) if (ata_dma_enabled(adev))
pacpi_set_dmamode(ap, adev); pacpi_set_dmamode(ap, adev);
acpi->last = adev; acpi->last = adev;
} }

View File

@ -183,7 +183,7 @@ static void atiixp_bmdma_start(struct ata_queued_cmd *qc)
u16 tmp16; u16 tmp16;
pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16); pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16);
if (adev->dma_mode >= XFER_UDMA_0) if (ata_using_udma(adev))
tmp16 |= (1 << dn); tmp16 |= (1 << dn);
else else
tmp16 &= ~(1 << dn); tmp16 &= ~(1 << dn);

View File

@ -149,10 +149,10 @@ static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc)
struct ata_device *prev = ap->private_data; struct ata_device *prev = ap->private_data;
/* See if the DMA settings could be wrong */ /* See if the DMA settings could be wrong */
if (adev->dma_mode != 0 && adev != prev && prev != NULL) { if (ata_dma_enabled(adev) && adev != prev && prev != NULL) {
/* Maybe, but do the channels match MWDMA/UDMA ? */ /* Maybe, but do the channels match MWDMA/UDMA ? */
if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || if ((ata_using_udma(adev) && !ata_using_udma(prev)) ||
(adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) (ata_using_udma(prev) && !ata_using_udma(adev)))
/* Switch the mode bits */ /* Switch the mode bits */
cs5530_set_dmamode(ap, adev); cs5530_set_dmamode(ap, adev);
} }

View File

@ -606,7 +606,7 @@ static void it821x_display_disk(int n, u8 *buf)
{ {
unsigned char id[41]; unsigned char id[41];
int mode = 0; int mode = 0;
char *mtype; char *mtype = "";
char mbuf[8]; char mbuf[8];
char *cbl = "(40 wire cable)"; char *cbl = "(40 wire cable)";

View File

@ -198,7 +198,7 @@ static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc)
if (adev != ap->private_data) { if (adev != ap->private_data) {
oldpiix_set_piomode(ap, adev); oldpiix_set_piomode(ap, adev);
if (adev->dma_mode) if (ata_dma_enabled(adev))
oldpiix_set_dmamode(ap, adev); oldpiix_set_dmamode(ap, adev);
} }
return ata_sff_qc_issue(qc); return ata_sff_qc_issue(qc);

View File

@ -167,10 +167,10 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc)
struct ata_device *prev = ap->private_data; struct ata_device *prev = ap->private_data;
/* See if the DMA settings could be wrong */ /* See if the DMA settings could be wrong */
if (adev->dma_mode != 0 && adev != prev && prev != NULL) { if (ata_dma_enabled(adev) && adev != prev && prev != NULL) {
/* Maybe, but do the channels match MWDMA/UDMA ? */ /* Maybe, but do the channels match MWDMA/UDMA ? */
if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || if ((ata_using_udma(adev) && !ata_using_udma(prev)) ||
(adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) (ata_using_udma(prev) && !ata_using_udma(adev)))
/* Switch the mode bits */ /* Switch the mode bits */
sc1200_set_dmamode(ap, adev); sc1200_set_dmamode(ap, adev);
} }

View File

@ -324,62 +324,26 @@ static void via_set_dmamode(struct ata_port *ap, struct ata_device *adev)
} }
/** /**
* via_ata_sff_tf_load - send taskfile registers to host controller * via_tf_load - send taskfile registers to host controller
* @ap: Port to which output is sent * @ap: Port to which output is sent
* @tf: ATA taskfile register set * @tf: ATA taskfile register set
* *
* Outputs ATA taskfile to standard ATA host controller. * Outputs ATA taskfile to standard ATA host controller.
* *
* Note: This is to fix the internal bug of via chipsets, which * Note: This is to fix the internal bug of via chipsets, which
* will reset the device register after changing the IEN bit on * will reset the device register after changing the IEN bit on
* ctl register * ctl register
*/ */
static void via_ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
{ {
struct ata_ioports *ioaddr = &ap->ioaddr; struct ata_taskfile tmp_tf;
unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
if (tf->ctl != ap->last_ctl) { if (ap->ctl != ap->last_ctl && !(tf->flags & ATA_TFLAG_DEVICE)) {
iowrite8(tf->ctl, ioaddr->ctl_addr); tmp_tf = *tf;
iowrite8(tf->device, ioaddr->device_addr); tmp_tf.flags |= ATA_TFLAG_DEVICE;
ap->last_ctl = tf->ctl; tf = &tmp_tf;
ata_wait_idle(ap);
} }
ata_sff_tf_load(ap, tf);
if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
iowrite8(tf->hob_feature, ioaddr->feature_addr);
iowrite8(tf->hob_nsect, ioaddr->nsect_addr);
iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
tf->hob_feature,
tf->hob_nsect,
tf->hob_lbal,
tf->hob_lbam,
tf->hob_lbah);
}
if (is_addr) {
iowrite8(tf->feature, ioaddr->feature_addr);
iowrite8(tf->nsect, ioaddr->nsect_addr);
iowrite8(tf->lbal, ioaddr->lbal_addr);
iowrite8(tf->lbam, ioaddr->lbam_addr);
iowrite8(tf->lbah, ioaddr->lbah_addr);
VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
tf->feature,
tf->nsect,
tf->lbal,
tf->lbam,
tf->lbah);
}
if (tf->flags & ATA_TFLAG_DEVICE) {
iowrite8(tf->device, ioaddr->device_addr);
VPRINTK("device 0x%X\n", tf->device);
}
ata_wait_idle(ap);
} }
static struct scsi_host_template via_sht = { static struct scsi_host_template via_sht = {
@ -392,13 +356,12 @@ static struct ata_port_operations via_port_ops = {
.set_piomode = via_set_piomode, .set_piomode = via_set_piomode,
.set_dmamode = via_set_dmamode, .set_dmamode = via_set_dmamode,
.prereset = via_pre_reset, .prereset = via_pre_reset,
.sff_tf_load = via_ata_tf_load, .sff_tf_load = via_tf_load,
}; };
static struct ata_port_operations via_port_ops_noirq = { static struct ata_port_operations via_port_ops_noirq = {
.inherits = &via_port_ops, .inherits = &via_port_ops,
.sff_data_xfer = ata_sff_data_xfer_noirq, .sff_data_xfer = ata_sff_data_xfer_noirq,
.sff_tf_load = via_ata_tf_load,
}; };
/** /**

View File

@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
if (ap->nr_active_links == 0) if (ap->nr_active_links == 0)
return 0; return 0;
if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { /*
/* * The port is operating in host queuing mode (EDMA) with NCQ
* The port is operating in host queuing mode (EDMA). * enabled, allow multiple NCQ commands. EDMA also allows
* It can accomodate a new qc if the qc protocol * queueing multiple DMA commands but libata core currently
* is compatible with the current host queue mode. * doesn't allow it.
*/ */
if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) { if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) &&
/* (pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol))
* The host queue (EDMA) is in NCQ mode. return 0;
* If the new qc is also an NCQ command,
* then allow the new qc.
*/
if (qc->tf.protocol == ATA_PROT_NCQ)
return 0;
} else {
/*
* The host queue (EDMA) is in non-NCQ, DMA mode.
* If the new qc is also a non-NCQ, DMA command,
* then allow the new qc.
*/
if (qc->tf.protocol == ATA_PROT_DMA)
return 0;
}
}
return ATA_DEFER_PORT; return ATA_DEFER_PORT;
} }
@ -3036,7 +3022,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
break; break;
case chip_soc: case chip_soc:
hpriv->ops = &mv_soc_ops; hpriv->ops = &mv_soc_ops;
hp_flags |= MV_HP_FLAG_SOC | MV_HP_ERRATA_60X1C0; hp_flags |= MV_HP_FLAG_SOC | MV_HP_GEN_IIE |
MV_HP_ERRATA_60X1C0;
break; break;
default: default:

View File

@ -3,7 +3,6 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/errno.h> #include <linux/errno.h>

View File

@ -295,6 +295,12 @@ int class_for_each_device(struct class *class, struct device *start,
if (!class) if (!class)
return -EINVAL; return -EINVAL;
if (!class->p) {
WARN(1, "%s called for class '%s' before it was initialized",
__func__, class->name);
return -EINVAL;
}
mutex_lock(&class->p->class_mutex); mutex_lock(&class->p->class_mutex);
list_for_each_entry(dev, &class->p->class_devices, node) { list_for_each_entry(dev, &class->p->class_devices, node) {
if (start) { if (start) {
@ -344,6 +350,11 @@ struct device *class_find_device(struct class *class, struct device *start,
if (!class) if (!class)
return NULL; return NULL;
if (!class->p) {
WARN(1, "%s called for class '%s' before it was initialized",
__func__, class->name);
return NULL;
}
mutex_lock(&class->p->class_mutex); mutex_lock(&class->p->class_mutex);
list_for_each_entry(dev, &class->p->class_devices, node) { list_for_each_entry(dev, &class->p->class_devices, node) {

View File

@ -53,7 +53,7 @@ static inline int device_is_not_partition(struct device *dev)
* it is attached to. If it is not attached to a bus either, an empty * it is attached to. If it is not attached to a bus either, an empty
* string will be returned. * string will be returned.
*/ */
const char *dev_driver_string(struct device *dev) const char *dev_driver_string(const struct device *dev)
{ {
return dev->driver ? dev->driver->name : return dev->driver ? dev->driver->name :
(dev->bus ? dev->bus->name : (dev->bus ? dev->bus->name :
@ -541,6 +541,7 @@ void device_initialize(struct device *dev)
spin_lock_init(&dev->devres_lock); spin_lock_init(&dev->devres_lock);
INIT_LIST_HEAD(&dev->devres_head); INIT_LIST_HEAD(&dev->devres_head);
device_init_wakeup(dev, 0); device_init_wakeup(dev, 0);
device_pm_init(dev);
set_dev_node(dev, -1); set_dev_node(dev, -1);
} }
@ -843,13 +844,19 @@ int device_add(struct device *dev)
{ {
struct device *parent = NULL; struct device *parent = NULL;
struct class_interface *class_intf; struct class_interface *class_intf;
int error; int error = -EINVAL;
dev = get_device(dev); dev = get_device(dev);
if (!dev || !strlen(dev->bus_id)) { if (!dev)
error = -EINVAL; goto done;
goto Done;
} /* Temporarily support init_name if it is set.
* It will override bus_id for now */
if (dev->init_name)
dev_set_name(dev, "%s", dev->init_name);
if (!strlen(dev->bus_id))
goto done;
pr_debug("device: '%s': %s\n", dev->bus_id, __func__); pr_debug("device: '%s': %s\n", dev->bus_id, __func__);
@ -897,9 +904,10 @@ int device_add(struct device *dev)
error = bus_add_device(dev); error = bus_add_device(dev);
if (error) if (error)
goto BusError; goto BusError;
error = device_pm_add(dev); error = dpm_sysfs_add(dev);
if (error) if (error)
goto PMError; goto DPMError;
device_pm_add(dev);
kobject_uevent(&dev->kobj, KOBJ_ADD); kobject_uevent(&dev->kobj, KOBJ_ADD);
bus_attach_device(dev); bus_attach_device(dev);
if (parent) if (parent)
@ -917,10 +925,10 @@ int device_add(struct device *dev)
class_intf->add_dev(dev, class_intf); class_intf->add_dev(dev, class_intf);
mutex_unlock(&dev->class->p->class_mutex); mutex_unlock(&dev->class->p->class_mutex);
} }
Done: done:
put_device(dev); put_device(dev);
return error; return error;
PMError: DPMError:
bus_remove_device(dev); bus_remove_device(dev);
BusError: BusError:
if (dev->bus) if (dev->bus)
@ -944,7 +952,7 @@ int device_add(struct device *dev)
cleanup_device_parent(dev); cleanup_device_parent(dev);
if (parent) if (parent)
put_device(parent); put_device(parent);
goto Done; goto done;
} }
/** /**
@ -1007,6 +1015,7 @@ void device_del(struct device *dev)
struct class_interface *class_intf; struct class_interface *class_intf;
device_pm_remove(dev); device_pm_remove(dev);
dpm_sysfs_remove(dev);
if (parent) if (parent)
klist_del(&dev->knode_parent); klist_del(&dev->knode_parent);
if (MAJOR(dev->devt)) { if (MAJOR(dev->devt)) {

View File

@ -16,9 +16,6 @@
#include <linux/string.h> #include <linux/string.h>
#include "base.h" #include "base.h"
#define to_dev(node) container_of(node, struct device, driver_list)
static struct device *next_device(struct klist_iter *i) static struct device *next_device(struct klist_iter *i)
{ {
struct klist_node *n = klist_next(i); struct klist_node *n = klist_next(i);

View File

@ -67,20 +67,16 @@ void device_pm_unlock(void)
* device_pm_add - add a device to the list of active devices * device_pm_add - add a device to the list of active devices
* @dev: Device to be added to the list * @dev: Device to be added to the list
*/ */
int device_pm_add(struct device *dev) void device_pm_add(struct device *dev)
{ {
int error;
pr_debug("PM: Adding info for %s:%s\n", pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev->bus ? dev->bus->name : "No Bus",
kobject_name(&dev->kobj)); kobject_name(&dev->kobj));
mutex_lock(&dpm_list_mtx); mutex_lock(&dpm_list_mtx);
if (dev->parent) { if (dev->parent) {
if (dev->parent->power.status >= DPM_SUSPENDING) { if (dev->parent->power.status >= DPM_SUSPENDING)
dev_warn(dev, "parent %s is sleeping, will not add\n", dev_warn(dev, "parent %s should not be sleeping\n",
dev->parent->bus_id); dev->parent->bus_id);
WARN_ON(true);
}
} else if (transition_started) { } else if (transition_started) {
/* /*
* We refuse to register parentless devices while a PM * We refuse to register parentless devices while a PM
@ -89,13 +85,9 @@ int device_pm_add(struct device *dev)
*/ */
WARN_ON(true); WARN_ON(true);
} }
error = dpm_sysfs_add(dev);
if (!error) { list_add_tail(&dev->power.entry, &dpm_list);
dev->power.status = DPM_ON;
list_add_tail(&dev->power.entry, &dpm_list);
}
mutex_unlock(&dpm_list_mtx); mutex_unlock(&dpm_list_mtx);
return error;
} }
/** /**
@ -110,7 +102,6 @@ void device_pm_remove(struct device *dev)
dev->bus ? dev->bus->name : "No Bus", dev->bus ? dev->bus->name : "No Bus",
kobject_name(&dev->kobj)); kobject_name(&dev->kobj));
mutex_lock(&dpm_list_mtx); mutex_lock(&dpm_list_mtx);
dpm_sysfs_remove(dev);
list_del_init(&dev->power.entry); list_del_init(&dev->power.entry);
mutex_unlock(&dpm_list_mtx); mutex_unlock(&dpm_list_mtx);
} }

View File

@ -1,3 +1,8 @@
static inline void device_pm_init(struct device *dev)
{
dev->power.status = DPM_ON;
}
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
/* /*
@ -11,12 +16,12 @@ static inline struct device *to_device(struct list_head *entry)
return container_of(entry, struct device, power.entry); return container_of(entry, struct device, power.entry);
} }
extern int device_pm_add(struct device *); extern void device_pm_add(struct device *);
extern void device_pm_remove(struct device *); extern void device_pm_remove(struct device *);
#else /* CONFIG_PM_SLEEP */ #else /* CONFIG_PM_SLEEP */
static inline int device_pm_add(struct device *dev) { return 0; } static inline void device_pm_add(struct device *dev) {}
static inline void device_pm_remove(struct device *dev) {} static inline void device_pm_remove(struct device *dev) {}
#endif #endif

View File

@ -571,8 +571,8 @@ out_free:
list_del(&brd->brd_list); list_del(&brd->brd_list);
brd_free(brd); brd_free(brd);
} }
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
unregister_blkdev(RAMDISK_MAJOR, "brd");
return -ENOMEM; return -ENOMEM;
} }

View File

@ -707,15 +707,15 @@ static int __init nbd_init(void)
BUILD_BUG_ON(sizeof(struct nbd_request) != 28); BUILD_BUG_ON(sizeof(struct nbd_request) != 28);
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
if (!nbd_dev)
return -ENOMEM;
if (max_part < 0) { if (max_part < 0) {
printk(KERN_CRIT "nbd: max_part must be >= 0\n"); printk(KERN_CRIT "nbd: max_part must be >= 0\n");
return -EINVAL; return -EINVAL;
} }
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
if (!nbd_dev)
return -ENOMEM;
part_shift = 0; part_shift = 0;
if (max_part > 0) if (max_part > 0)
part_shift = fls(max_part); part_shift = fls(max_part);
@ -779,6 +779,7 @@ out:
blk_cleanup_queue(nbd_dev[i].disk->queue); blk_cleanup_queue(nbd_dev[i].disk->queue);
put_disk(nbd_dev[i].disk); put_disk(nbd_dev[i].disk);
} }
kfree(nbd_dev);
return err; return err;
} }
@ -795,6 +796,7 @@ static void __exit nbd_cleanup(void)
} }
} }
unregister_blkdev(NBD_MAJOR, "nbd"); unregister_blkdev(NBD_MAJOR, "nbd");
kfree(nbd_dev);
printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR); printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR);
} }

View File

@ -3,8 +3,8 @@ menu "Bluetooth device drivers"
depends on BT depends on BT
config BT_HCIUSB config BT_HCIUSB
tristate "HCI USB driver" tristate "HCI USB driver (old version)"
depends on USB depends on USB && BT_HCIBTUSB=n
help help
Bluetooth HCI USB driver. Bluetooth HCI USB driver.
This driver is required if you want to use Bluetooth devices with This driver is required if you want to use Bluetooth devices with
@ -23,15 +23,13 @@ config BT_HCIUSB_SCO
Say Y here to compile support for SCO over HCI USB. Say Y here to compile support for SCO over HCI USB.
config BT_HCIBTUSB config BT_HCIBTUSB
tristate "HCI USB driver (alternate version)" tristate "HCI USB driver"
depends on USB && EXPERIMENTAL && BT_HCIUSB=n depends on USB
help help
Bluetooth HCI USB driver. Bluetooth HCI USB driver.
This driver is required if you want to use Bluetooth devices with This driver is required if you want to use Bluetooth devices with
USB interface. USB interface.
This driver is still experimental and has no SCO support.
Say Y here to compile support for Bluetooth USB devices into the Say Y here to compile support for Bluetooth USB devices into the
kernel or say M to compile it as module (btusb). kernel or say M to compile it as module (btusb).

View File

@ -60,7 +60,7 @@
/* ======================== Module parameters ======================== */ /* ======================== Module parameters ======================== */
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card"); MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_FIRMWARE("BT3CPCC.bin"); MODULE_FIRMWARE("BT3CPCC.bin");

View File

@ -2,7 +2,7 @@
* *
* Generic Bluetooth USB driver * Generic Bluetooth USB driver
* *
* Copyright (C) 2005-2007 Marcel Holtmann <marcel@holtmann.org> * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org>
* *
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -41,7 +41,7 @@
#define BT_DBG(D...) #define BT_DBG(D...)
#endif #endif
#define VERSION "0.2" #define VERSION "0.3"
static int ignore_dga; static int ignore_dga;
static int ignore_csr; static int ignore_csr;
@ -160,12 +160,16 @@ static struct usb_device_id blacklist_table[] = {
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
#define BTUSB_MAX_ISOC_FRAMES 10
#define BTUSB_INTR_RUNNING 0 #define BTUSB_INTR_RUNNING 0
#define BTUSB_BULK_RUNNING 1 #define BTUSB_BULK_RUNNING 1
#define BTUSB_ISOC_RUNNING 2
struct btusb_data { struct btusb_data {
struct hci_dev *hdev; struct hci_dev *hdev;
struct usb_device *udev; struct usb_device *udev;
struct usb_interface *isoc;
spinlock_t lock; spinlock_t lock;
@ -176,10 +180,15 @@ struct btusb_data {
struct usb_anchor tx_anchor; struct usb_anchor tx_anchor;
struct usb_anchor intr_anchor; struct usb_anchor intr_anchor;
struct usb_anchor bulk_anchor; struct usb_anchor bulk_anchor;
struct usb_anchor isoc_anchor;
struct usb_endpoint_descriptor *intr_ep; struct usb_endpoint_descriptor *intr_ep;
struct usb_endpoint_descriptor *bulk_tx_ep; struct usb_endpoint_descriptor *bulk_tx_ep;
struct usb_endpoint_descriptor *bulk_rx_ep; struct usb_endpoint_descriptor *bulk_rx_ep;
struct usb_endpoint_descriptor *isoc_tx_ep;
struct usb_endpoint_descriptor *isoc_rx_ep;
int isoc_altsetting;
}; };
static void btusb_intr_complete(struct urb *urb) static void btusb_intr_complete(struct urb *urb)
@ -195,6 +204,8 @@ static void btusb_intr_complete(struct urb *urb)
return; return;
if (urb->status == 0) { if (urb->status == 0) {
hdev->stat.byte_rx += urb->actual_length;
if (hci_recv_fragment(hdev, HCI_EVENT_PKT, if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
urb->transfer_buffer, urb->transfer_buffer,
urb->actual_length) < 0) { urb->actual_length) < 0) {
@ -216,7 +227,7 @@ static void btusb_intr_complete(struct urb *urb)
} }
} }
static inline int btusb_submit_intr_urb(struct hci_dev *hdev) static int btusb_submit_intr_urb(struct hci_dev *hdev)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hdev->driver_data;
struct urb *urb; struct urb *urb;
@ -226,6 +237,9 @@ static inline int btusb_submit_intr_urb(struct hci_dev *hdev)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
if (!data->intr_ep)
return -ENODEV;
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
@ -274,6 +288,8 @@ static void btusb_bulk_complete(struct urb *urb)
return; return;
if (urb->status == 0) { if (urb->status == 0) {
hdev->stat.byte_rx += urb->actual_length;
if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
urb->transfer_buffer, urb->transfer_buffer,
urb->actual_length) < 0) { urb->actual_length) < 0) {
@ -295,7 +311,7 @@ static void btusb_bulk_complete(struct urb *urb)
} }
} }
static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) static int btusb_submit_bulk_urb(struct hci_dev *hdev)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hdev->driver_data;
struct urb *urb; struct urb *urb;
@ -305,6 +321,9 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
if (!data->bulk_rx_ep)
return -ENODEV;
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, GFP_KERNEL);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
@ -339,6 +358,127 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev)
return err; return err;
} }
static void btusb_isoc_complete(struct urb *urb)
{
struct hci_dev *hdev = urb->context;
struct btusb_data *data = hdev->driver_data;
int i, err;
BT_DBG("%s urb %p status %d count %d", hdev->name,
urb, urb->status, urb->actual_length);
if (!test_bit(HCI_RUNNING, &hdev->flags))
return;
if (urb->status == 0) {
for (i = 0; i < urb->number_of_packets; i++) {
unsigned int offset = urb->iso_frame_desc[i].offset;
unsigned int length = urb->iso_frame_desc[i].actual_length;
if (urb->iso_frame_desc[i].status)
continue;
hdev->stat.byte_rx += length;
if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
urb->transfer_buffer + offset,
length) < 0) {
BT_ERR("%s corrupted SCO packet", hdev->name);
hdev->stat.err_rx++;
}
}
}
if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
return;
usb_anchor_urb(urb, &data->isoc_anchor);
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) {
BT_ERR("%s urb %p failed to resubmit (%d)",
hdev->name, urb, -err);
usb_unanchor_urb(urb);
}
}
static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
{
int i, offset = 0;
BT_DBG("len %d mtu %d", len, mtu);
for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
i++, offset += mtu, len -= mtu) {
urb->iso_frame_desc[i].offset = offset;
urb->iso_frame_desc[i].length = mtu;
}
if (len && i < BTUSB_MAX_ISOC_FRAMES) {
urb->iso_frame_desc[i].offset = offset;
urb->iso_frame_desc[i].length = len;
i++;
}
urb->number_of_packets = i;
}
static int btusb_submit_isoc_urb(struct hci_dev *hdev)
{
struct btusb_data *data = hdev->driver_data;
struct urb *urb;
unsigned char *buf;
unsigned int pipe;
int err, size;
BT_DBG("%s", hdev->name);
if (!data->isoc_rx_ep)
return -ENODEV;
urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
if (!urb)
return -ENOMEM;
size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
BTUSB_MAX_ISOC_FRAMES;
buf = kmalloc(size, GFP_KERNEL);
if (!buf) {
usb_free_urb(urb);
return -ENOMEM;
}
pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
urb->dev = data->udev;
urb->pipe = pipe;
urb->context = hdev;
urb->complete = btusb_isoc_complete;
urb->interval = data->isoc_rx_ep->bInterval;
urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
urb->transfer_buffer = buf;
urb->transfer_buffer_length = size;
__fill_isoc_descriptor(urb, size,
le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
usb_anchor_urb(urb, &data->isoc_anchor);
err = usb_submit_urb(urb, GFP_KERNEL);
if (err < 0) {
BT_ERR("%s urb %p submission failed (%d)",
hdev->name, urb, -err);
usb_unanchor_urb(urb);
kfree(buf);
}
usb_free_urb(urb);
return err;
}
static void btusb_tx_complete(struct urb *urb) static void btusb_tx_complete(struct urb *urb)
{ {
struct sk_buff *skb = urb->context; struct sk_buff *skb = urb->context;
@ -392,6 +532,9 @@ static int btusb_close(struct hci_dev *hdev)
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; return 0;
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
usb_kill_anchored_urbs(&data->intr_anchor);
clear_bit(BTUSB_BULK_RUNNING, &data->flags); clear_bit(BTUSB_BULK_RUNNING, &data->flags);
usb_kill_anchored_urbs(&data->bulk_anchor); usb_kill_anchored_urbs(&data->bulk_anchor);
@ -453,6 +596,9 @@ static int btusb_send_frame(struct sk_buff *skb)
break; break;
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1)
return -ENODEV;
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
@ -467,9 +613,31 @@ static int btusb_send_frame(struct sk_buff *skb)
break; break;
case HCI_SCODATA_PKT: case HCI_SCODATA_PKT:
if (!data->isoc_tx_ep || hdev->conn_hash.sco_num < 1)
return -ENODEV;
urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC);
if (!urb)
return -ENOMEM;
pipe = usb_sndisocpipe(data->udev,
data->isoc_tx_ep->bEndpointAddress);
urb->dev = data->udev;
urb->pipe = pipe;
urb->context = skb;
urb->complete = btusb_tx_complete;
urb->interval = data->isoc_tx_ep->bInterval;
urb->transfer_flags = URB_ISO_ASAP;
urb->transfer_buffer = skb->data;
urb->transfer_buffer_length = skb->len;
__fill_isoc_descriptor(urb, skb->len,
le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
hdev->stat.sco_tx++; hdev->stat.sco_tx++;
kfree_skb(skb); break;
return 0;
default: default:
return -EILSEQ; return -EILSEQ;
@ -508,22 +676,86 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
schedule_work(&data->work); schedule_work(&data->work);
} }
static int inline __set_isoc_interface(struct hci_dev *hdev, int altsetting)
{
struct btusb_data *data = hdev->driver_data;
struct usb_interface *intf = data->isoc;
struct usb_endpoint_descriptor *ep_desc;
int i, err;
if (!data->isoc)
return -ENODEV;
err = usb_set_interface(data->udev, 1, altsetting);
if (err < 0) {
BT_ERR("%s setting interface failed (%d)", hdev->name, -err);
return err;
}
data->isoc_altsetting = altsetting;
data->isoc_tx_ep = NULL;
data->isoc_rx_ep = NULL;
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
ep_desc = &intf->cur_altsetting->endpoint[i].desc;
if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
data->isoc_tx_ep = ep_desc;
continue;
}
if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
data->isoc_rx_ep = ep_desc;
continue;
}
}
if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
BT_ERR("%s invalid SCO descriptors", hdev->name);
return -ENODEV;
}
return 0;
}
static void btusb_work(struct work_struct *work) static void btusb_work(struct work_struct *work)
{ {
struct btusb_data *data = container_of(work, struct btusb_data, work); struct btusb_data *data = container_of(work, struct btusb_data, work);
struct hci_dev *hdev = data->hdev; struct hci_dev *hdev = data->hdev;
if (hdev->conn_hash.acl_num == 0) { if (hdev->conn_hash.acl_num > 0) {
if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
if (btusb_submit_bulk_urb(hdev) < 0)
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
else
btusb_submit_bulk_urb(hdev);
}
} else {
clear_bit(BTUSB_BULK_RUNNING, &data->flags); clear_bit(BTUSB_BULK_RUNNING, &data->flags);
usb_kill_anchored_urbs(&data->bulk_anchor); usb_kill_anchored_urbs(&data->bulk_anchor);
return;
} }
if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { if (hdev->conn_hash.sco_num > 0) {
if (btusb_submit_bulk_urb(hdev) < 0) if (data->isoc_altsetting != 2) {
clear_bit(BTUSB_BULK_RUNNING, &data->flags); clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
else usb_kill_anchored_urbs(&data->isoc_anchor);
btusb_submit_bulk_urb(hdev);
if (__set_isoc_interface(hdev, 2) < 0)
return;
}
if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
if (btusb_submit_isoc_urb(hdev) < 0)
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
else
btusb_submit_isoc_urb(hdev);
}
} else {
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
usb_kill_anchored_urbs(&data->isoc_anchor);
__set_isoc_interface(hdev, 0);
} }
} }
@ -597,6 +829,7 @@ static int btusb_probe(struct usb_interface *intf,
init_usb_anchor(&data->tx_anchor); init_usb_anchor(&data->tx_anchor);
init_usb_anchor(&data->intr_anchor); init_usb_anchor(&data->intr_anchor);
init_usb_anchor(&data->bulk_anchor); init_usb_anchor(&data->bulk_anchor);
init_usb_anchor(&data->isoc_anchor);
hdev = hci_alloc_dev(); hdev = hci_alloc_dev();
if (!hdev) { if (!hdev) {
@ -620,6 +853,9 @@ static int btusb_probe(struct usb_interface *intf,
hdev->owner = THIS_MODULE; hdev->owner = THIS_MODULE;
/* interface numbers are hardcoded in the spec */
data->isoc = usb_ifnum_to_if(data->udev, 1);
if (reset || id->driver_info & BTUSB_RESET) if (reset || id->driver_info & BTUSB_RESET)
set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks); set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
@ -628,11 +864,16 @@ static int btusb_probe(struct usb_interface *intf,
set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
} }
if (id->driver_info & BTUSB_BROKEN_ISOC)
data->isoc = NULL;
if (id->driver_info & BTUSB_SNIFFER) { if (id->driver_info & BTUSB_SNIFFER) {
struct usb_device *udev = interface_to_usbdev(intf); struct usb_device *udev = data->udev;
if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
data->isoc = NULL;
} }
if (id->driver_info & BTUSB_BCM92035) { if (id->driver_info & BTUSB_BCM92035) {
@ -646,6 +887,16 @@ static int btusb_probe(struct usb_interface *intf,
} }
} }
if (data->isoc) {
err = usb_driver_claim_interface(&btusb_driver,
data->isoc, NULL);
if (err < 0) {
hci_free_dev(hdev);
kfree(data);
return err;
}
}
err = hci_register_dev(hdev); err = hci_register_dev(hdev);
if (err < 0) { if (err < 0) {
hci_free_dev(hdev); hci_free_dev(hdev);
@ -670,6 +921,9 @@ static void btusb_disconnect(struct usb_interface *intf)
hdev = data->hdev; hdev = data->hdev;
if (data->isoc)
usb_driver_release_interface(&btusb_driver, data->isoc);
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
hci_unregister_dev(hdev); hci_unregister_dev(hdev);

View File

@ -577,7 +577,7 @@ module_exit(hci_uart_exit);
module_param(reset, bool, 0644); module_param(reset, bool, 0644);
MODULE_PARM_DESC(reset, "Send HCI reset command on initialization"); MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION); MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
MODULE_VERSION(VERSION); MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -1130,7 +1130,7 @@ module_param(isoc, int, 0644);
MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support"); MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support");
#endif #endif
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION); MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION);
MODULE_VERSION(VERSION); MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -377,7 +377,7 @@ module_exit(vhci_exit);
module_param(minor, int, 0444); module_param(minor, int, 0444);
MODULE_PARM_DESC(minor, "Miscellaneous minor device number"); MODULE_PARM_DESC(minor, "Miscellaneous minor device number");
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION); MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION);
MODULE_VERSION(VERSION); MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -408,7 +408,6 @@ int register_cdrom(struct cdrom_device_info *cdi)
ENSURE(get_last_session, CDC_MULTI_SESSION); ENSURE(get_last_session, CDC_MULTI_SESSION);
ENSURE(get_mcn, CDC_MCN); ENSURE(get_mcn, CDC_MCN);
ENSURE(reset, CDC_RESET); ENSURE(reset, CDC_RESET);
ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
ENSURE(generic_packet, CDC_GENERIC_PACKET); ENSURE(generic_packet, CDC_GENERIC_PACKET);
cdi->mc_flags = 0; cdi->mc_flags = 0;
cdo->n_minors = 0; cdo->n_minors = 0;
@ -2506,8 +2505,6 @@ static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi,
/* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
if (!CDROM_CAN(CDC_PLAY_AUDIO))
return -ENOSYS;
if (copy_from_user(&q, argp, sizeof(q))) if (copy_from_user(&q, argp, sizeof(q)))
return -EFAULT; return -EFAULT;
@ -2538,8 +2535,6 @@ static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
if (!CDROM_CAN(CDC_PLAY_AUDIO))
return -ENOSYS;
if (copy_from_user(&header, argp, sizeof(header))) if (copy_from_user(&header, argp, sizeof(header)))
return -EFAULT; return -EFAULT;
@ -2562,8 +2557,6 @@ static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
if (!CDROM_CAN(CDC_PLAY_AUDIO))
return -ENOSYS;
if (copy_from_user(&entry, argp, sizeof(entry))) if (copy_from_user(&entry, argp, sizeof(entry)))
return -EFAULT; return -EFAULT;

View File

@ -471,6 +471,12 @@ cleanup_sense_final:
return err; return err;
} }
static int gdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
void *arg)
{
return -EINVAL;
}
static struct cdrom_device_ops gdrom_ops = { static struct cdrom_device_ops gdrom_ops = {
.open = gdrom_open, .open = gdrom_open,
.release = gdrom_release, .release = gdrom_release,
@ -478,6 +484,7 @@ static struct cdrom_device_ops gdrom_ops = {
.media_changed = gdrom_mediachanged, .media_changed = gdrom_mediachanged,
.get_last_session = gdrom_get_last_session, .get_last_session = gdrom_get_last_session,
.reset = gdrom_hardreset, .reset = gdrom_hardreset,
.audio_ioctl = gdrom_audio_ioctl,
.capability = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED | .capability = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R, CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R,
.n_minors = 1, .n_minors = 1,

View File

@ -550,12 +550,19 @@ return_complete:
} }
} }
static int viocd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
void *arg)
{
return -EINVAL;
}
static struct cdrom_device_ops viocd_dops = { static struct cdrom_device_ops viocd_dops = {
.open = viocd_open, .open = viocd_open,
.release = viocd_release, .release = viocd_release,
.media_changed = viocd_media_changed, .media_changed = viocd_media_changed,
.lock_door = viocd_lock_door, .lock_door = viocd_lock_door,
.generic_packet = viocd_packet, .generic_packet = viocd_packet,
.audio_ioctl = viocd_audio_ioctl,
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM
}; };

View File

@ -2695,15 +2695,13 @@ static __devinit void default_find_bmc(void)
for (i = 0; ; i++) { for (i = 0; ; i++) {
if (!ipmi_defaults[i].port) if (!ipmi_defaults[i].port)
break; break;
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return;
#ifdef CONFIG_PPC_MERGE #ifdef CONFIG_PPC_MERGE
if (check_legacy_ioport(ipmi_defaults[i].port)) if (check_legacy_ioport(ipmi_defaults[i].port))
continue; continue;
#endif #endif
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return;
info->addr_source = NULL; info->addr_source = NULL;

View File

@ -1571,6 +1571,7 @@ u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
return half_md4_transform(hash, keyptr->secret); return half_md4_transform(hash, keyptr->secret);
} }
EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral);
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,

View File

@ -38,7 +38,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/version.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <asm/io.h> #include <asm/io.h>

View File

@ -38,7 +38,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/version.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <asm/io.h> #include <asm/io.h>

View File

@ -38,7 +38,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/version.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <asm/io.h> #include <asm/io.h>

View File

@ -34,7 +34,6 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/version.h>
#define EDAC_MC_LABEL_LEN 31 #define EDAC_MC_LABEL_LEN 31
#define EDAC_DEVICE_NAME_LEN 31 #define EDAC_DEVICE_NAME_LEN 31

View File

@ -12,8 +12,8 @@ config FIREWIRE
This is the "Juju" FireWire stack, a new alternative implementation This is the "Juju" FireWire stack, a new alternative implementation
designed for robustness and simplicity. You can build either this designed for robustness and simplicity. You can build either this
stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both. stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both.
Please read http://wiki.linux1394.org/JujuMigration before you Please read http://ieee1394.wiki.kernel.org/index.php/Juju_Migration
enable the new stack. before you enable the new stack.
To compile this driver as a module, say M here: the module will be To compile this driver as a module, say M here: the module will be
called firewire-core. called firewire-core.

View File

@ -14,7 +14,6 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/slab.h> #include <linux/slab.h>

View File

@ -1272,9 +1272,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
*/ */
static void msf_from_bcd(struct atapi_msf *msf) static void msf_from_bcd(struct atapi_msf *msf)
{ {
msf->minute = BCD2BIN(msf->minute); msf->minute = bcd2bin(msf->minute);
msf->second = BCD2BIN(msf->second); msf->second = bcd2bin(msf->second);
msf->frame = BCD2BIN(msf->frame); msf->frame = bcd2bin(msf->frame);
} }
int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
@ -1415,8 +1415,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
return stat; return stat;
if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
} }
ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
@ -1456,8 +1456,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
return stat; return stat;
if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
toc->hdr.first_track = (u8)BIN2BCD(CDROM_LEADOUT); toc->hdr.first_track = (u8)bin2bcd(CDROM_LEADOUT);
toc->hdr.last_track = (u8)BIN2BCD(CDROM_LEADOUT); toc->hdr.last_track = (u8)bin2bcd(CDROM_LEADOUT);
} else { } else {
toc->hdr.first_track = CDROM_LEADOUT; toc->hdr.first_track = CDROM_LEADOUT;
toc->hdr.last_track = CDROM_LEADOUT; toc->hdr.last_track = CDROM_LEADOUT;
@ -1470,14 +1470,14 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length); toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length);
if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
} }
for (i = 0; i <= ntracks; i++) { for (i = 0; i <= ntracks; i++) {
if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) { if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD)
toc->ent[i].track = BCD2BIN(toc->ent[i].track); toc->ent[i].track = bcd2bin(toc->ent[i].track);
msf_from_bcd(&toc->ent[i].addr.msf); msf_from_bcd(&toc->ent[i].addr.msf);
} }
toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute, toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute,

View File

@ -307,7 +307,7 @@ static struct pci_driver driver = {
.name = "AEC62xx_IDE", .name = "AEC62xx_IDE",
.id_table = aec62xx_pci_tbl, .id_table = aec62xx_pci_tbl,
.probe = aec62xx_init_one, .probe = aec62xx_init_one,
.remove = aec62xx_remove, .remove = __devexit_p(aec62xx_remove),
}; };
static int __init aec62xx_ide_init(void) static int __init aec62xx_ide_init(void)

View File

@ -447,7 +447,7 @@ static struct pci_driver driver = {
.name = "Cypress_IDE", .name = "Cypress_IDE",
.id_table = cy82c693_pci_tbl, .id_table = cy82c693_pci_tbl,
.probe = cy82c693_init_one, .probe = cy82c693_init_one,
.remove = cy82c693_remove, .remove = __devexit_p(cy82c693_remove),
}; };
static int __init cy82c693_ide_init(void) static int __init cy82c693_ide_init(void)

View File

@ -1620,7 +1620,7 @@ static struct pci_driver driver = {
.name = "HPT366_IDE", .name = "HPT366_IDE",
.id_table = hpt366_pci_tbl, .id_table = hpt366_pci_tbl,
.probe = hpt366_init_one, .probe = hpt366_init_one,
.remove = hpt366_remove, .remove = __devexit_p(hpt366_remove),
}; };
static int __init hpt366_ide_init(void) static int __init hpt366_ide_init(void)

View File

@ -686,7 +686,7 @@ static struct pci_driver driver = {
.name = "ITE821x IDE", .name = "ITE821x IDE",
.id_table = it821x_pci_tbl, .id_table = it821x_pci_tbl,
.probe = it821x_init_one, .probe = it821x_init_one,
.remove = it821x_remove, .remove = __devexit_p(it821x_remove),
}; };
static int __init it821x_ide_init(void) static int __init it821x_ide_init(void)

Some files were not shown because too many files have changed in this diff Show More