diff options
181 files changed, 2160 insertions, 1236 deletions
diff --git a/Documentation/devicetree/bindings/clock/imx27-clock.txt b/Documentation/devicetree/bindings/clock/imx27-clock.txt index ab1a56e9de9d..7a2070393732 100644 --- a/Documentation/devicetree/bindings/clock/imx27-clock.txt +++ b/Documentation/devicetree/bindings/clock/imx27-clock.txt | |||
@@ -98,6 +98,7 @@ clocks and IDs. | |||
98 | fpm 83 | 98 | fpm 83 |
99 | mpll_osc_sel 84 | 99 | mpll_osc_sel 84 |
100 | mpll_sel 85 | 100 | mpll_sel 85 |
101 | spll_gate 86 | ||
101 | 102 | ||
102 | Examples: | 103 | Examples: |
103 | 104 | ||
diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO index 050d37fe6d40..8148a47fc70e 100644 --- a/Documentation/ja_JP/HOWTO +++ b/Documentation/ja_JP/HOWTO | |||
@@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a | |||
11 | fork. So if you have any comments or updates for this file, please try | 11 | fork. So if you have any comments or updates for this file, please try |
12 | to update the original English file first. | 12 | to update the original English file first. |
13 | 13 | ||
14 | Last Updated: 2011/03/31 | 14 | Last Updated: 2013/07/19 |
15 | ================================== | 15 | ================================== |
16 | ã“ã‚Œã¯ã€ | 16 | ã“ã‚Œã¯ã€ |
17 | linux-2.6.38/Documentation/HOWTO | 17 | linux-3.10/Documentation/HOWTO |
18 | ã®å’Œè¨³ã§ã™ã€‚ | 18 | ã®å’Œè¨³ã§ã™ã€‚ |
19 | 19 | ||
20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > | 20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://linuxjf.sourceforge.jp/ > |
21 | 翻訳日: 2011/3/28 | 21 | 翻訳日: 2013/7/19 |
22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> | 22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> |
23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> | 23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> |
24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> | 24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> |
@@ -245,7 +245,7 @@ Linux カーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã®ä¸ã«å«ã¾ã‚Œã‚‹ã€ãã‚Œã„ã«ã—ã€ä¿ | |||
245 | 自己å‚照方å¼ã§ã€ç´¢å¼•ãŒã¤ã„㟠web å½¢å¼ã§ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’å‚ç…§ã™ã‚‹ã“ã¨ãŒ | 245 | 自己å‚照方å¼ã§ã€ç´¢å¼•ãŒã¤ã„㟠web å½¢å¼ã§ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’å‚ç…§ã™ã‚‹ã“ã¨ãŒ |
246 | ã§ãã¾ã™ã€‚ã“ã®æœ€æ–°ã®ç´ æ™´ã—ã„カーãƒãƒ«ã‚³ãƒ¼ãƒ‰ã®ãƒªãƒã‚¸ãƒˆãƒªã¯ä»¥ä¸‹ã§è¦‹ã¤ã‹ã‚Š | 246 | ã§ãã¾ã™ã€‚ã“ã®æœ€æ–°ã®ç´ æ™´ã—ã„カーãƒãƒ«ã‚³ãƒ¼ãƒ‰ã®ãƒªãƒã‚¸ãƒˆãƒªã¯ä»¥ä¸‹ã§è¦‹ã¤ã‹ã‚Š |
247 | ã¾ã™- | 247 | ã¾ã™- |
248 | http://sosdg.org/~qiyong/lxr/ | 248 | http://lxr.linux.no/+trees |
249 | 249 | ||
250 | 開発プãƒã‚»ã‚¹ | 250 | 開発プãƒã‚»ã‚¹ |
251 | ----------------------- | 251 | ----------------------- |
@@ -253,24 +253,24 @@ Linux カーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã®ä¸ã«å«ã¾ã‚Œã‚‹ã€ãã‚Œã„ã«ã—ã€ä¿ | |||
253 | Linux カーãƒãƒ«ã®é–‹ç™ºãƒ—ãƒã‚»ã‚¹ã¯ç¾åœ¨å¹¾ã¤ã‹ã®ç•°ãªã‚‹ãƒ¡ã‚¤ãƒ³ã‚«ãƒ¼ãƒãƒ«ã€Œãƒ–ラン | 253 | Linux カーãƒãƒ«ã®é–‹ç™ºãƒ—ãƒã‚»ã‚¹ã¯ç¾åœ¨å¹¾ã¤ã‹ã®ç•°ãªã‚‹ãƒ¡ã‚¤ãƒ³ã‚«ãƒ¼ãƒãƒ«ã€Œãƒ–ラン |
254 | ãƒã€ã¨å¤šæ•°ã®ã‚µãƒ–システム毎ã®ã‚«ãƒ¼ãƒãƒ«ãƒ–ランãƒã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™ã€‚ | 254 | ãƒã€ã¨å¤šæ•°ã®ã‚µãƒ–システム毎ã®ã‚«ãƒ¼ãƒãƒ«ãƒ–ランãƒã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™ã€‚ |
255 | ã“れらã®ãƒ–ランãƒã¨ã¯- | 255 | ã“れらã®ãƒ–ランãƒã¨ã¯- |
256 | - メイン㮠2.6.x カーãƒãƒ«ãƒ„リー | 256 | - メイン㮠3.x カーãƒãƒ«ãƒ„リー |
257 | - 2.6.x.y -stable カーãƒãƒ«ãƒ„リー | 257 | - 3.x.y -stable カーãƒãƒ«ãƒ„リー |
258 | - 2.6.x -git カーãƒãƒ«ãƒ‘ッム| 258 | - 3.x -git カーãƒãƒ«ãƒ‘ッム|
259 | - サブシステム毎ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リーã¨ãƒ‘ッム| 259 | - サブシステム毎ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リーã¨ãƒ‘ッム|
260 | - çµ±åˆãƒ†ã‚¹ãƒˆã®ãŸã‚ã® 2.6.x -next カーãƒãƒ«ãƒ„リー | 260 | - çµ±åˆãƒ†ã‚¹ãƒˆã®ãŸã‚ã® 3.x -next カーãƒãƒ«ãƒ„リー |
261 | 261 | ||
262 | 2.6.x カーãƒãƒ«ãƒ„リー | 262 | 3.x カーãƒãƒ«ãƒ„リー |
263 | ----------------- | 263 | ----------------- |
264 | 264 | ||
265 | 2.6.x カーãƒãƒ«ã¯ Linus Torvalds ã«ã‚ˆã£ã¦ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã•ã‚Œã€kernel.org | 265 | 3.x カーãƒãƒ«ã¯ Linus Torvalds ã«ã‚ˆã£ã¦ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã•ã‚Œã€kernel.org |
266 | ã® pub/linux/kernel/v2.6/ ディレクトリã«å˜åœ¨ã—ã¾ã™ã€‚ã“ã®é–‹ç™ºãƒ—ãƒã‚»ã‚¹ã¯ | 266 | ã® pub/linux/kernel/v3.x/ ディレクトリã«å˜åœ¨ã—ã¾ã™ã€‚ã“ã®é–‹ç™ºãƒ—ãƒã‚»ã‚¹ã¯ |
267 | 以下ã®ã¨ãŠã‚Š- | 267 | 以下ã®ã¨ãŠã‚Š- |
268 | 268 | ||
269 | - æ–°ã—ã„カーãƒãƒ«ãŒãƒªãƒªãƒ¼ã‚¹ã•ã‚ŒãŸç›´å¾Œã«ã€2週間ã®ç‰¹åˆ¥æœŸé–“ãŒè¨ã‘られ〠| 269 | - æ–°ã—ã„カーãƒãƒ«ãŒãƒªãƒªãƒ¼ã‚¹ã•ã‚ŒãŸç›´å¾Œã«ã€2週間ã®ç‰¹åˆ¥æœŸé–“ãŒè¨ã‘られ〠|
270 | ã“ã®æœŸé–“ä¸ã«ã€ãƒ¡ãƒ³ãƒ†ãƒŠé”㯠Linus ã«å¤§ããªå·®åˆ†ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ | 270 | ã“ã®æœŸé–“ä¸ã«ã€ãƒ¡ãƒ³ãƒ†ãƒŠé”㯠Linus ã«å¤§ããªå·®åˆ†ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ |
271 | ã“ã®ã‚ˆã†ãªå·®åˆ†ã¯é€šå¸¸ -next カーãƒãƒ«ã«æ•°é€±é–“å«ã¾ã‚Œã¦ããŸãƒ‘ッãƒã§ã™ã€‚ | 271 | ã“ã®ã‚ˆã†ãªå·®åˆ†ã¯é€šå¸¸ -next カーãƒãƒ«ã«æ•°é€±é–“å«ã¾ã‚Œã¦ããŸãƒ‘ッãƒã§ã™ã€‚ |
272 | 大ããªå¤‰æ›´ã¯ git(カーãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ç®¡ç†ãƒ„ールã€è©³ç´°ã¯ | 272 | 大ããªå¤‰æ›´ã¯ git(カーãƒãƒ«ã®ã‚½ãƒ¼ã‚¹ç®¡ç†ãƒ„ールã€è©³ç´°ã¯ |
273 | http://git-scm.com/ å‚ç…§) を使ã£ã¦é€ã‚‹ã®ãŒå¥½ã¾ã—ã„ã‚„ã‚Šæ–¹ã§ã™ãŒã€ãƒ‘ッ | 273 | http://git-scm.com/ å‚ç…§) を使ã£ã¦é€ã‚‹ã®ãŒå¥½ã¾ã—ã„ã‚„ã‚Šæ–¹ã§ã™ãŒã€ãƒ‘ッ |
274 | ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å½¢å¼ã®ã¾ã¾é€ã‚‹ã®ã§ã‚‚å分ã§ã™ã€‚ | 274 | ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å½¢å¼ã®ã¾ã¾é€ã‚‹ã®ã§ã‚‚å分ã§ã™ã€‚ |
275 | 275 | ||
276 | - 2週間後ã€-rc1 カーãƒãƒ«ãŒãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã€ã“ã®å¾Œã«ã¯ã‚«ãƒ¼ãƒãƒ«å…¨ä½“ã®å®‰å®š | 276 | - 2週間後ã€-rc1 カーãƒãƒ«ãŒãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã€ã“ã®å¾Œã«ã¯ã‚«ãƒ¼ãƒãƒ«å…¨ä½“ã®å®‰å®š |
@@ -302,20 +302,20 @@ Andrew Morton ㌠Linux-kernel メーリングリストã«ã‚«ãƒ¼ãƒãƒ«ãƒªãƒªãƒ¼ã | |||
302 | 実ã«èªè˜ã•ã‚ŒãŸãƒã‚°ã®çŠ¶æ³ã«ã‚ˆã‚Šãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã®ã§ã‚ã‚Šã€å‰ã‚‚ã£ã¦æ±ºã‚ら | 302 | 実ã«èªè˜ã•ã‚ŒãŸãƒã‚°ã®çŠ¶æ³ã«ã‚ˆã‚Šãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã®ã§ã‚ã‚Šã€å‰ã‚‚ã£ã¦æ±ºã‚ら |
303 | ã‚ŒãŸè¨ˆç”»ã«ã‚ˆã£ã¦ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã‚‚ã®ã§ã¯ãªã„ã‹ã‚‰ã§ã™ã€‚〠| 303 | ã‚ŒãŸè¨ˆç”»ã«ã‚ˆã£ã¦ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã‚‚ã®ã§ã¯ãªã„ã‹ã‚‰ã§ã™ã€‚〠|
304 | 304 | ||
305 | 2.6.x.y -stable カーãƒãƒ«ãƒ„リー | 305 | 3.x.y -stable カーãƒãƒ«ãƒ„リー |
306 | --------------------------- | 306 | --------------------------- |
307 | 307 | ||
308 | ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ãŒ4ã¤ã®æ•°å—ã«åˆ†ã‹ã‚Œã¦ã„るカーãƒãƒ«ã¯ -stable カーãƒãƒ«ã§ã™ã€‚ | 308 | ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ãŒ3ã¤ã®æ•°å—ã«åˆ†ã‹ã‚Œã¦ã„るカーãƒãƒ«ã¯ -stable カーãƒãƒ«ã§ã™ã€‚ |
309 | ã“ã‚Œã«ã¯ã€2.6.x カーãƒãƒ«ã§è¦‹ã¤ã‹ã£ãŸã‚»ã‚ュリティå•é¡Œã‚„é‡å¤§ãªå¾Œæˆ»ã‚Šã«å¯¾ | 309 | ã“ã‚Œã«ã¯ã€3.x カーãƒãƒ«ã§è¦‹ã¤ã‹ã£ãŸã‚»ã‚ュリティå•é¡Œã‚„é‡å¤§ãªå¾Œæˆ»ã‚Šã«å¯¾ |
310 | ã™ã‚‹æ¯”較的å°ã•ã„é‡è¦ãªä¿®æ£ãŒå«ã¾ã‚Œã¾ã™ã€‚ | 310 | ã™ã‚‹æ¯”較的å°ã•ã„é‡è¦ãªä¿®æ£ãŒå«ã¾ã‚Œã¾ã™ã€‚ |
311 | 311 | ||
312 | ã“ã‚Œã¯ã€é–‹ç™º/実験的ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ†ã‚¹ãƒˆã«å”力ã™ã‚‹ã“ã¨ã«èˆˆå‘³ãŒç„¡ã〠| 312 | ã“ã‚Œã¯ã€é–‹ç™º/実験的ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ†ã‚¹ãƒˆã«å”力ã™ã‚‹ã“ã¨ã«èˆˆå‘³ãŒç„¡ã〠|
313 | 最新ã®å®‰å®šã—ãŸã‚«ãƒ¼ãƒãƒ«ã‚’使ã„ãŸã„ユーザã«æŽ¨å¥¨ã™ã‚‹ãƒ–ランãƒã§ã™ã€‚ | 313 | 最新ã®å®‰å®šã—ãŸã‚«ãƒ¼ãƒãƒ«ã‚’使ã„ãŸã„ユーザã«æŽ¨å¥¨ã™ã‚‹ãƒ–ランãƒã§ã™ã€‚ |
314 | 314 | ||
315 | ã‚‚ã—ã€2.6.x.y カーãƒãƒ«ãŒå˜åœ¨ã—ãªã„å ´åˆã«ã¯ã€ç•ªå·ãŒä¸€ç•ªå¤§ãã„ 2.6.x ㌠| 315 | ã‚‚ã—ã€3.x.y カーãƒãƒ«ãŒå˜åœ¨ã—ãªã„å ´åˆã«ã¯ã€ç•ªå·ãŒä¸€ç•ªå¤§ãã„ 3.x ㌠|
316 | 最新ã®å®‰å®šç‰ˆã‚«ãƒ¼ãƒãƒ«ã§ã™ã€‚ | 316 | 最新ã®å®‰å®šç‰ˆã‚«ãƒ¼ãƒãƒ«ã§ã™ã€‚ |
317 | 317 | ||
318 | 2.6.x.y 㯠"stable" ãƒãƒ¼ãƒ <stable@kernel.org> ã§ãƒ¡ãƒ³ãƒ†ã•ã‚Œã¦ãŠã‚Šã€å¿… | 318 | 3.x.y 㯠"stable" ãƒãƒ¼ãƒ <stable@kernel.org> ã§ãƒ¡ãƒ³ãƒ†ã•ã‚Œã¦ãŠã‚Šã€å¿… |
319 | è¦ã«å¿œã˜ã¦ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¾ã™ã€‚通常ã®ãƒªãƒªãƒ¼ã‚¹æœŸé–“㯠2週間毎ã§ã™ãŒã€å·®ã—迫㣠| 319 | è¦ã«å¿œã˜ã¦ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¾ã™ã€‚通常ã®ãƒªãƒªãƒ¼ã‚¹æœŸé–“㯠2週間毎ã§ã™ãŒã€å·®ã—迫㣠|
320 | ãŸå•é¡ŒãŒãªã‘ã‚Œã°ã‚‚ã†å°‘ã—é•·ããªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚ã‚»ã‚ュリティ関連ã®å•é¡Œ | 320 | ãŸå•é¡ŒãŒãªã‘ã‚Œã°ã‚‚ã†å°‘ã—é•·ããªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚ã‚»ã‚ュリティ関連ã®å•é¡Œ |
321 | ã®å ´åˆã¯ã“ã‚Œã«å¯¾ã—ã¦ã ã„ãŸã„ã®å ´åˆã€ã™ãã«ãƒªãƒªãƒ¼ã‚¹ãŒã•ã‚Œã¾ã™ã€‚ | 321 | ã®å ´åˆã¯ã“ã‚Œã«å¯¾ã—ã¦ã ã„ãŸã„ã®å ´åˆã€ã™ãã«ãƒªãƒªãƒ¼ã‚¹ãŒã•ã‚Œã¾ã™ã€‚ |
@@ -324,7 +324,7 @@ Andrew Morton ㌠Linux-kernel メーリングリストã«ã‚«ãƒ¼ãƒãƒ«ãƒªãƒªãƒ¼ã | |||
324 | イルã«ã¯ã©ã®ã‚ˆã†ãªç¨®é¡žã®å¤‰æ›´ãŒ -stable ツリーã«å—ã‘入れå¯èƒ½ã‹ã€ã¾ãŸãƒª | 324 | イルã«ã¯ã©ã®ã‚ˆã†ãªç¨®é¡žã®å¤‰æ›´ãŒ -stable ツリーã«å—ã‘入れå¯èƒ½ã‹ã€ã¾ãŸãƒª |
325 | リースプãƒã‚»ã‚¹ãŒã©ã†å‹•ãã‹ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã¾ã™ã€‚ | 325 | リースプãƒã‚»ã‚¹ãŒã©ã†å‹•ãã‹ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã¾ã™ã€‚ |
326 | 326 | ||
327 | 2.6.x -git パッム| 327 | 3.x -git パッム|
328 | ------------------ | 328 | ------------------ |
329 | 329 | ||
330 | git リãƒã‚¸ãƒˆãƒªã§ç®¡ç†ã•ã‚Œã¦ã„ã‚‹Linus ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リーã®æ¯Žæ—¥ã®ã‚¹ãƒŠãƒƒãƒ— | 330 | git リãƒã‚¸ãƒˆãƒªã§ç®¡ç†ã•ã‚Œã¦ã„ã‚‹Linus ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リーã®æ¯Žæ—¥ã®ã‚¹ãƒŠãƒƒãƒ— |
@@ -358,14 +358,14 @@ quilt シリーズã¨ã—ã¦å…¬é–‹ã•ã‚Œã¦ã„るパッãƒã‚ューも使ã‚ã‚Œã | |||
358 | ã‚’ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚大部分ã®ã“れら㮠patchwork ã®ã‚µã‚¤ãƒˆã¯ | 358 | ã‚’ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚大部分ã®ã“れら㮠patchwork ã®ã‚µã‚¤ãƒˆã¯ |
359 | http://patchwork.kernel.org/ ã§ãƒªã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ | 359 | http://patchwork.kernel.org/ ã§ãƒªã‚¹ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ |
360 | 360 | ||
361 | çµ±åˆãƒ†ã‚¹ãƒˆã®ãŸã‚ã® 2.6.x -next カーãƒãƒ«ãƒ„リー | 361 | çµ±åˆãƒ†ã‚¹ãƒˆã®ãŸã‚ã® 3.x -next カーãƒãƒ«ãƒ„リー |
362 | --------------------------------------------- | 362 | --------------------------------------------- |
363 | 363 | ||
364 | サブシステムツリーã®æ›´æ–°å†…容ãŒãƒ¡ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã® 2.6.x ツリーã«ãƒžãƒ¼ã‚¸ã•ã‚Œ | 364 | サブシステムツリーã®æ›´æ–°å†…容ãŒãƒ¡ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã® 3.x ツリーã«ãƒžãƒ¼ã‚¸ã•ã‚Œ |
365 | ã‚‹å‰ã«ã€ãれらã¯çµ±åˆãƒ†ã‚¹ãƒˆã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ç›®çš„ã®ãŸã‚ã€å®Ÿè³ªçš„ | 365 | ã‚‹å‰ã«ã€ãれらã¯çµ±åˆãƒ†ã‚¹ãƒˆã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ç›®çš„ã®ãŸã‚ã€å®Ÿè³ªçš„ |
366 | ã«å…¨ã‚µãƒ–システムツリーã‹ã‚‰ã»ã¼æ¯Žæ—¥ãƒ—ルã•ã‚Œã¦ã§ãる特別ãªãƒ†ã‚¹ãƒˆç”¨ã®ãƒª | 366 | ã«å…¨ã‚µãƒ–システムツリーã‹ã‚‰ã»ã¼æ¯Žæ—¥ãƒ—ルã•ã‚Œã¦ã§ãる特別ãªãƒ†ã‚¹ãƒˆç”¨ã®ãƒª |
367 | ãƒã‚¸ãƒˆãƒªãŒå˜åœ¨ã—ã¾ã™- | 367 | ãƒã‚¸ãƒˆãƒªãŒå˜åœ¨ã—ã¾ã™- |
368 | http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git | 368 | http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git |
369 | http://linux.f-seidel.de/linux-next/pmwiki/ | 369 | http://linux.f-seidel.de/linux-next/pmwiki/ |
370 | 370 | ||
371 | ã“ã®ã‚„ã‚Šæ–¹ã«ã‚ˆã£ã¦ã€-next カーãƒãƒ«ã¯æ¬¡ã®ãƒžãƒ¼ã‚¸æ©Ÿä¼šã§ã©ã‚“ãªã‚‚ã®ãŒãƒ¡ã‚¤ãƒ³ | 371 | ã“ã®ã‚„ã‚Šæ–¹ã«ã‚ˆã£ã¦ã€-next カーãƒãƒ«ã¯æ¬¡ã®ãƒžãƒ¼ã‚¸æ©Ÿä¼šã§ã©ã‚“ãªã‚‚ã®ãŒãƒ¡ã‚¤ãƒ³ |
diff --git a/MAINTAINERS b/MAINTAINERS index f817ae196a8e..a26b10e52aea 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -7818,7 +7818,7 @@ F: drivers/staging/asus_oled/ | |||
7818 | 7818 | ||
7819 | STAGING - COMEDI | 7819 | STAGING - COMEDI |
7820 | M: Ian Abbott <abbotti@mev.co.uk> | 7820 | M: Ian Abbott <abbotti@mev.co.uk> |
7821 | M: Mori Hess <fmhess@users.sourceforge.net> | 7821 | M: H Hartley Sweeten <hsweeten@visionengravers.com> |
7822 | S: Odd Fixes | 7822 | S: Odd Fixes |
7823 | F: drivers/staging/comedi/ | 7823 | F: drivers/staging/comedi/ |
7824 | 7824 | ||
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 11 | 2 | PATCHLEVEL = 11 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc3 |
5 | NAME = Linux for Workgroups | 5 | NAME = Linux for Workgroups |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ba412e02ec0c..37c0f4e978d4 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1600,8 +1600,7 @@ config LOCAL_TIMERS | |||
1600 | config ARCH_NR_GPIO | 1600 | config ARCH_NR_GPIO |
1601 | int | 1601 | int |
1602 | default 1024 if ARCH_SHMOBILE || ARCH_TEGRA | 1602 | default 1024 if ARCH_SHMOBILE || ARCH_TEGRA |
1603 | default 512 if SOC_OMAP5 | 1603 | default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 |
1604 | default 512 if ARCH_KEYSTONE | ||
1605 | default 392 if ARCH_U8500 | 1604 | default 392 if ARCH_U8500 |
1606 | default 352 if ARCH_VT8500 | 1605 | default 352 if ARCH_VT8500 |
1607 | default 288 if ARCH_SUNXI | 1606 | default 288 if ARCH_SUNXI |
diff --git a/arch/arm/boot/dts/atlas6.dtsi b/arch/arm/boot/dts/atlas6.dtsi index 9866cd736dee..a0f2721ea583 100644 --- a/arch/arm/boot/dts/atlas6.dtsi +++ b/arch/arm/boot/dts/atlas6.dtsi | |||
@@ -485,6 +485,12 @@ | |||
485 | sirf,function = "usp0"; | 485 | sirf,function = "usp0"; |
486 | }; | 486 | }; |
487 | }; | 487 | }; |
488 | usp0_uart_nostreamctrl_pins_a: usp0@1 { | ||
489 | usp0 { | ||
490 | sirf,pins = "usp0_uart_nostreamctrl_grp"; | ||
491 | sirf,function = "usp0_uart_nostreamctrl"; | ||
492 | }; | ||
493 | }; | ||
488 | usp1_pins_a: usp1@0 { | 494 | usp1_pins_a: usp1@0 { |
489 | usp1 { | 495 | usp1 { |
490 | sirf,pins = "usp1grp"; | 496 | sirf,pins = "usp1grp"; |
@@ -515,16 +521,16 @@ | |||
515 | sirf,function = "pulse_count"; | 521 | sirf,function = "pulse_count"; |
516 | }; | 522 | }; |
517 | }; | 523 | }; |
518 | cko0_rst_pins_a: cko0_rst@0 { | 524 | cko0_pins_a: cko0@0 { |
519 | cko0_rst { | 525 | cko0 { |
520 | sirf,pins = "cko0_rstgrp"; | 526 | sirf,pins = "cko0grp"; |
521 | sirf,function = "cko0_rst"; | 527 | sirf,function = "cko0"; |
522 | }; | 528 | }; |
523 | }; | 529 | }; |
524 | cko1_rst_pins_a: cko1_rst@0 { | 530 | cko1_pins_a: cko1@0 { |
525 | cko1_rst { | 531 | cko1 { |
526 | sirf,pins = "cko1_rstgrp"; | 532 | sirf,pins = "cko1grp"; |
527 | sirf,function = "cko1_rst"; | 533 | sirf,function = "cko1"; |
528 | }; | 534 | }; |
529 | }; | 535 | }; |
530 | }; | 536 | }; |
diff --git a/arch/arm/boot/dts/imx28-apx4devkit.dts b/arch/arm/boot/dts/imx28-apx4devkit.dts index 43bf3c796cba..0e7fed47bd8d 100644 --- a/arch/arm/boot/dts/imx28-apx4devkit.dts +++ b/arch/arm/boot/dts/imx28-apx4devkit.dts | |||
@@ -147,7 +147,7 @@ | |||
147 | reg = <0x0a>; | 147 | reg = <0x0a>; |
148 | VDDA-supply = <®_3p3v>; | 148 | VDDA-supply = <®_3p3v>; |
149 | VDDIO-supply = <®_3p3v>; | 149 | VDDIO-supply = <®_3p3v>; |
150 | 150 | clocks = <&saif0>; | |
151 | }; | 151 | }; |
152 | 152 | ||
153 | pcf8563: rtc@51 { | 153 | pcf8563: rtc@51 { |
diff --git a/arch/arm/boot/dts/imx28-evk.dts b/arch/arm/boot/dts/imx28-evk.dts index 1f0d38d7b16f..e035f4664b97 100644 --- a/arch/arm/boot/dts/imx28-evk.dts +++ b/arch/arm/boot/dts/imx28-evk.dts | |||
@@ -195,7 +195,7 @@ | |||
195 | reg = <0x0a>; | 195 | reg = <0x0a>; |
196 | VDDA-supply = <®_3p3v>; | 196 | VDDA-supply = <®_3p3v>; |
197 | VDDIO-supply = <®_3p3v>; | 197 | VDDIO-supply = <®_3p3v>; |
198 | 198 | clocks = <&saif0>; | |
199 | }; | 199 | }; |
200 | 200 | ||
201 | at24@51 { | 201 | at24@51 { |
diff --git a/arch/arm/boot/dts/imx28-m28evk.dts b/arch/arm/boot/dts/imx28-m28evk.dts index 880df2f13be8..44d9da57736e 100644 --- a/arch/arm/boot/dts/imx28-m28evk.dts +++ b/arch/arm/boot/dts/imx28-m28evk.dts | |||
@@ -184,7 +184,7 @@ | |||
184 | reg = <0x0a>; | 184 | reg = <0x0a>; |
185 | VDDA-supply = <®_3p3v>; | 185 | VDDA-supply = <®_3p3v>; |
186 | VDDIO-supply = <®_3p3v>; | 186 | VDDIO-supply = <®_3p3v>; |
187 | 187 | clocks = <&saif0>; | |
188 | }; | 188 | }; |
189 | 189 | ||
190 | eeprom: eeprom@51 { | 190 | eeprom: eeprom@51 { |
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi index 6a8acb01b1d3..9524a0571281 100644 --- a/arch/arm/boot/dts/imx28.dtsi +++ b/arch/arm/boot/dts/imx28.dtsi | |||
@@ -837,6 +837,7 @@ | |||
837 | compatible = "fsl,imx28-saif"; | 837 | compatible = "fsl,imx28-saif"; |
838 | reg = <0x80042000 0x2000>; | 838 | reg = <0x80042000 0x2000>; |
839 | interrupts = <59 80>; | 839 | interrupts = <59 80>; |
840 | #clock-cells = <0>; | ||
840 | clocks = <&clks 53>; | 841 | clocks = <&clks 53>; |
841 | dmas = <&dma_apbx 4>; | 842 | dmas = <&dma_apbx 4>; |
842 | dma-names = "rx-tx"; | 843 | dma-names = "rx-tx"; |
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index 6dd9486c755b..ad3471ca17c7 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts | |||
@@ -61,6 +61,16 @@ | |||
61 | mux-int-port = <2>; | 61 | mux-int-port = <2>; |
62 | mux-ext-port = <3>; | 62 | mux-ext-port = <3>; |
63 | }; | 63 | }; |
64 | |||
65 | clocks { | ||
66 | clk_26M: codec_clock { | ||
67 | compatible = "fixed-clock"; | ||
68 | reg=<0>; | ||
69 | #clock-cells = <0>; | ||
70 | clock-frequency = <26000000>; | ||
71 | gpios = <&gpio4 26 1>; | ||
72 | }; | ||
73 | }; | ||
64 | }; | 74 | }; |
65 | 75 | ||
66 | &esdhc1 { | 76 | &esdhc1 { |
@@ -229,6 +239,7 @@ | |||
229 | MX51_PAD_EIM_A27__GPIO2_21 0x5 | 239 | MX51_PAD_EIM_A27__GPIO2_21 0x5 |
230 | MX51_PAD_CSPI1_SS0__GPIO4_24 0x85 | 240 | MX51_PAD_CSPI1_SS0__GPIO4_24 0x85 |
231 | MX51_PAD_CSPI1_SS1__GPIO4_25 0x85 | 241 | MX51_PAD_CSPI1_SS1__GPIO4_25 0x85 |
242 | MX51_PAD_CSPI1_RDY__GPIO4_26 0x80000000 | ||
232 | >; | 243 | >; |
233 | }; | 244 | }; |
234 | }; | 245 | }; |
@@ -255,7 +266,7 @@ | |||
255 | sgtl5000: codec@0a { | 266 | sgtl5000: codec@0a { |
256 | compatible = "fsl,sgtl5000"; | 267 | compatible = "fsl,sgtl5000"; |
257 | reg = <0x0a>; | 268 | reg = <0x0a>; |
258 | clock-frequency = <26000000>; | 269 | clocks = <&clk_26M>; |
259 | VDDA-supply = <&vdig_reg>; | 270 | VDDA-supply = <&vdig_reg>; |
260 | VDDIO-supply = <&vvideo_reg>; | 271 | VDDIO-supply = <&vvideo_reg>; |
261 | }; | 272 | }; |
diff --git a/arch/arm/boot/dts/imx53-mba53.dts b/arch/arm/boot/dts/imx53-mba53.dts index aaa33bc99f78..a63090267941 100644 --- a/arch/arm/boot/dts/imx53-mba53.dts +++ b/arch/arm/boot/dts/imx53-mba53.dts | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | backlight { | 28 | backlight { |
29 | compatible = "pwm-backlight"; | 29 | compatible = "pwm-backlight"; |
30 | pwms = <&pwm2 0 50000 0 0>; | 30 | pwms = <&pwm2 0 50000>; |
31 | brightness-levels = <0 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100>; | 31 | brightness-levels = <0 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100>; |
32 | default-brightness-level = <10>; | 32 | default-brightness-level = <10>; |
33 | enable-gpios = <&gpio7 7 0>; | 33 | enable-gpios = <&gpio7 7 0>; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 3895fbba8fce..569aa9f2c4ed 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
@@ -725,15 +725,15 @@ | |||
725 | uart1 { | 725 | uart1 { |
726 | pinctrl_uart1_1: uart1grp-1 { | 726 | pinctrl_uart1_1: uart1grp-1 { |
727 | fsl,pins = < | 727 | fsl,pins = < |
728 | MX53_PAD_CSI0_DAT10__UART1_TXD_MUX 0x1c5 | 728 | MX53_PAD_CSI0_DAT10__UART1_TXD_MUX 0x1e4 |
729 | MX53_PAD_CSI0_DAT11__UART1_RXD_MUX 0x1c5 | 729 | MX53_PAD_CSI0_DAT11__UART1_RXD_MUX 0x1e4 |
730 | >; | 730 | >; |
731 | }; | 731 | }; |
732 | 732 | ||
733 | pinctrl_uart1_2: uart1grp-2 { | 733 | pinctrl_uart1_2: uart1grp-2 { |
734 | fsl,pins = < | 734 | fsl,pins = < |
735 | MX53_PAD_PATA_DIOW__UART1_TXD_MUX 0x1c5 | 735 | MX53_PAD_PATA_DIOW__UART1_TXD_MUX 0x1e4 |
736 | MX53_PAD_PATA_DMACK__UART1_RXD_MUX 0x1c5 | 736 | MX53_PAD_PATA_DMACK__UART1_RXD_MUX 0x1e4 |
737 | >; | 737 | >; |
738 | }; | 738 | }; |
739 | 739 | ||
@@ -748,8 +748,8 @@ | |||
748 | uart2 { | 748 | uart2 { |
749 | pinctrl_uart2_1: uart2grp-1 { | 749 | pinctrl_uart2_1: uart2grp-1 { |
750 | fsl,pins = < | 750 | fsl,pins = < |
751 | MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX 0x1c5 | 751 | MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX 0x1e4 |
752 | MX53_PAD_PATA_DMARQ__UART2_TXD_MUX 0x1c5 | 752 | MX53_PAD_PATA_DMARQ__UART2_TXD_MUX 0x1e4 |
753 | >; | 753 | >; |
754 | }; | 754 | }; |
755 | 755 | ||
@@ -766,17 +766,17 @@ | |||
766 | uart3 { | 766 | uart3 { |
767 | pinctrl_uart3_1: uart3grp-1 { | 767 | pinctrl_uart3_1: uart3grp-1 { |
768 | fsl,pins = < | 768 | fsl,pins = < |
769 | MX53_PAD_PATA_CS_0__UART3_TXD_MUX 0x1c5 | 769 | MX53_PAD_PATA_CS_0__UART3_TXD_MUX 0x1e4 |
770 | MX53_PAD_PATA_CS_1__UART3_RXD_MUX 0x1c5 | 770 | MX53_PAD_PATA_CS_1__UART3_RXD_MUX 0x1e4 |
771 | MX53_PAD_PATA_DA_1__UART3_CTS 0x1c5 | 771 | MX53_PAD_PATA_DA_1__UART3_CTS 0x1e4 |
772 | MX53_PAD_PATA_DA_2__UART3_RTS 0x1c5 | 772 | MX53_PAD_PATA_DA_2__UART3_RTS 0x1e4 |
773 | >; | 773 | >; |
774 | }; | 774 | }; |
775 | 775 | ||
776 | pinctrl_uart3_2: uart3grp-2 { | 776 | pinctrl_uart3_2: uart3grp-2 { |
777 | fsl,pins = < | 777 | fsl,pins = < |
778 | MX53_PAD_PATA_CS_0__UART3_TXD_MUX 0x1c5 | 778 | MX53_PAD_PATA_CS_0__UART3_TXD_MUX 0x1e4 |
779 | MX53_PAD_PATA_CS_1__UART3_RXD_MUX 0x1c5 | 779 | MX53_PAD_PATA_CS_1__UART3_RXD_MUX 0x1e4 |
780 | >; | 780 | >; |
781 | }; | 781 | }; |
782 | 782 | ||
@@ -785,8 +785,8 @@ | |||
785 | uart4 { | 785 | uart4 { |
786 | pinctrl_uart4_1: uart4grp-1 { | 786 | pinctrl_uart4_1: uart4grp-1 { |
787 | fsl,pins = < | 787 | fsl,pins = < |
788 | MX53_PAD_KEY_COL0__UART4_TXD_MUX 0x1c5 | 788 | MX53_PAD_KEY_COL0__UART4_TXD_MUX 0x1e4 |
789 | MX53_PAD_KEY_ROW0__UART4_RXD_MUX 0x1c5 | 789 | MX53_PAD_KEY_ROW0__UART4_RXD_MUX 0x1e4 |
790 | >; | 790 | >; |
791 | }; | 791 | }; |
792 | }; | 792 | }; |
@@ -794,8 +794,8 @@ | |||
794 | uart5 { | 794 | uart5 { |
795 | pinctrl_uart5_1: uart5grp-1 { | 795 | pinctrl_uart5_1: uart5grp-1 { |
796 | fsl,pins = < | 796 | fsl,pins = < |
797 | MX53_PAD_KEY_COL1__UART5_TXD_MUX 0x1c5 | 797 | MX53_PAD_KEY_COL1__UART5_TXD_MUX 0x1e4 |
798 | MX53_PAD_KEY_ROW1__UART5_RXD_MUX 0x1c5 | 798 | MX53_PAD_KEY_ROW1__UART5_RXD_MUX 0x1e4 |
799 | >; | 799 | >; |
800 | }; | 800 | }; |
801 | }; | 801 | }; |
diff --git a/arch/arm/boot/dts/prima2.dtsi b/arch/arm/boot/dts/prima2.dtsi index 05e9489cf95c..bbeb623fc2c6 100644 --- a/arch/arm/boot/dts/prima2.dtsi +++ b/arch/arm/boot/dts/prima2.dtsi | |||
@@ -515,16 +515,16 @@ | |||
515 | sirf,function = "pulse_count"; | 515 | sirf,function = "pulse_count"; |
516 | }; | 516 | }; |
517 | }; | 517 | }; |
518 | cko0_rst_pins_a: cko0_rst@0 { | 518 | cko0_pins_a: cko0@0 { |
519 | cko0_rst { | 519 | cko0 { |
520 | sirf,pins = "cko0_rstgrp"; | 520 | sirf,pins = "cko0grp"; |
521 | sirf,function = "cko0_rst"; | 521 | sirf,function = "cko0"; |
522 | }; | 522 | }; |
523 | }; | 523 | }; |
524 | cko1_rst_pins_a: cko1_rst@0 { | 524 | cko1_pins_a: cko1@0 { |
525 | cko1_rst { | 525 | cko1 { |
526 | sirf,pins = "cko1_rstgrp"; | 526 | sirf,pins = "cko1grp"; |
527 | sirf,function = "cko1_rst"; | 527 | sirf,function = "cko1"; |
528 | }; | 528 | }; |
529 | }; | 529 | }; |
530 | }; | 530 | }; |
diff --git a/arch/arm/boot/dts/stih416-pinctrl.dtsi b/arch/arm/boot/dts/stih416-pinctrl.dtsi index 957b21a71b4b..0f246c979262 100644 --- a/arch/arm/boot/dts/stih416-pinctrl.dtsi +++ b/arch/arm/boot/dts/stih416-pinctrl.dtsi | |||
@@ -166,6 +166,15 @@ | |||
166 | reg = <0x9000 0x100>; | 166 | reg = <0x9000 0x100>; |
167 | st,bank-name = "PIO31"; | 167 | st,bank-name = "PIO31"; |
168 | }; | 168 | }; |
169 | |||
170 | serial2-oe { | ||
171 | pinctrl_serial2_oe: serial2-1 { | ||
172 | st,pins { | ||
173 | output-enable = <&PIO11 3 ALT2 OUT>; | ||
174 | }; | ||
175 | }; | ||
176 | }; | ||
177 | |||
169 | }; | 178 | }; |
170 | 179 | ||
171 | pin-controller-rear { | 180 | pin-controller-rear { |
@@ -218,7 +227,6 @@ | |||
218 | st,pins { | 227 | st,pins { |
219 | tx = <&PIO17 4 ALT2 OUT>; | 228 | tx = <&PIO17 4 ALT2 OUT>; |
220 | rx = <&PIO17 5 ALT2 IN>; | 229 | rx = <&PIO17 5 ALT2 IN>; |
221 | output-enable = <&PIO11 3 ALT2 OUT>; | ||
222 | }; | 230 | }; |
223 | }; | 231 | }; |
224 | }; | 232 | }; |
diff --git a/arch/arm/boot/dts/stih416.dtsi b/arch/arm/boot/dts/stih416.dtsi index 3cecd9689a49..1a0326ea7d07 100644 --- a/arch/arm/boot/dts/stih416.dtsi +++ b/arch/arm/boot/dts/stih416.dtsi | |||
@@ -79,7 +79,7 @@ | |||
79 | interrupts = <0 197 0>; | 79 | interrupts = <0 197 0>; |
80 | clocks = <&CLK_S_ICN_REG_0>; | 80 | clocks = <&CLK_S_ICN_REG_0>; |
81 | pinctrl-names = "default"; | 81 | pinctrl-names = "default"; |
82 | pinctrl-0 = <&pinctrl_serial2>; | 82 | pinctrl-0 = <&pinctrl_serial2 &pinctrl_serial2_oe>; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | /* SBC_UART1 */ | 85 | /* SBC_UART1 */ |
diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi index b3034da00a37..ae6a17aed9ee 100644 --- a/arch/arm/boot/dts/twl4030.dtsi +++ b/arch/arm/boot/dts/twl4030.dtsi | |||
@@ -47,6 +47,12 @@ | |||
47 | regulator-max-microvolt = <3150000>; | 47 | regulator-max-microvolt = <3150000>; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | vmmc2: regulator-vmmc2 { | ||
51 | compatible = "ti,twl4030-vmmc2"; | ||
52 | regulator-min-microvolt = <1850000>; | ||
53 | regulator-max-microvolt = <3150000>; | ||
54 | }; | ||
55 | |||
50 | vusb1v5: regulator-vusb1v5 { | 56 | vusb1v5: regulator-vusb1v5 { |
51 | compatible = "ti,twl4030-vusb1v5"; | 57 | compatible = "ti,twl4030-vusb1v5"; |
52 | }; | 58 | }; |
diff --git a/arch/arm/boot/dts/vf610.dtsi b/arch/arm/boot/dts/vf610.dtsi index e1eb7dadda80..67d929cf9804 100644 --- a/arch/arm/boot/dts/vf610.dtsi +++ b/arch/arm/boot/dts/vf610.dtsi | |||
@@ -442,8 +442,8 @@ | |||
442 | compatible = "fsl,mvf600-fec"; | 442 | compatible = "fsl,mvf600-fec"; |
443 | reg = <0x400d0000 0x1000>; | 443 | reg = <0x400d0000 0x1000>; |
444 | interrupts = <0 78 0x04>; | 444 | interrupts = <0 78 0x04>; |
445 | clocks = <&clks VF610_CLK_ENET>, | 445 | clocks = <&clks VF610_CLK_ENET0>, |
446 | <&clks VF610_CLK_ENET>, | 446 | <&clks VF610_CLK_ENET0>, |
447 | <&clks VF610_CLK_ENET>; | 447 | <&clks VF610_CLK_ENET>; |
448 | clock-names = "ipg", "ahb", "ptp"; | 448 | clock-names = "ipg", "ahb", "ptp"; |
449 | status = "disabled"; | 449 | status = "disabled"; |
@@ -453,8 +453,8 @@ | |||
453 | compatible = "fsl,mvf600-fec"; | 453 | compatible = "fsl,mvf600-fec"; |
454 | reg = <0x400d1000 0x1000>; | 454 | reg = <0x400d1000 0x1000>; |
455 | interrupts = <0 79 0x04>; | 455 | interrupts = <0 79 0x04>; |
456 | clocks = <&clks VF610_CLK_ENET>, | 456 | clocks = <&clks VF610_CLK_ENET1>, |
457 | <&clks VF610_CLK_ENET>, | 457 | <&clks VF610_CLK_ENET1>, |
458 | <&clks VF610_CLK_ENET>; | 458 | <&clks VF610_CLK_ENET>; |
459 | clock-names = "ipg", "ahb", "ptp"; | 459 | clock-names = "ipg", "ahb", "ptp"; |
460 | status = "disabled"; | 460 | status = "disabled"; |
diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c index a432e6c1dac1..39ad030ac0c7 100644 --- a/arch/arm/common/edma.c +++ b/arch/arm/common/edma.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/edma.h> | 28 | #include <linux/edma.h> |
29 | #include <linux/err.h> | ||
30 | #include <linux/of_address.h> | 29 | #include <linux/of_address.h> |
31 | #include <linux/of_device.h> | 30 | #include <linux/of_device.h> |
32 | #include <linux/of_dma.h> | 31 | #include <linux/of_dma.h> |
diff --git a/arch/arm/configs/da8xx_omapl_defconfig b/arch/arm/configs/da8xx_omapl_defconfig index 7c868139bdb0..1571bea48bed 100644 --- a/arch/arm/configs/da8xx_omapl_defconfig +++ b/arch/arm/configs/da8xx_omapl_defconfig | |||
@@ -102,6 +102,8 @@ CONFIG_SND_SOC=m | |||
102 | CONFIG_SND_DAVINCI_SOC=m | 102 | CONFIG_SND_DAVINCI_SOC=m |
103 | # CONFIG_HID_SUPPORT is not set | 103 | # CONFIG_HID_SUPPORT is not set |
104 | # CONFIG_USB_SUPPORT is not set | 104 | # CONFIG_USB_SUPPORT is not set |
105 | CONFIG_DMADEVICES=y | ||
106 | CONFIG_TI_EDMA=y | ||
105 | CONFIG_EXT2_FS=y | 107 | CONFIG_EXT2_FS=y |
106 | CONFIG_EXT3_FS=y | 108 | CONFIG_EXT3_FS=y |
107 | CONFIG_XFS_FS=m | 109 | CONFIG_XFS_FS=m |
diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig index c86fd75e181a..ab2f7378352c 100644 --- a/arch/arm/configs/davinci_all_defconfig +++ b/arch/arm/configs/davinci_all_defconfig | |||
@@ -162,6 +162,8 @@ CONFIG_LEDS_TRIGGERS=y | |||
162 | CONFIG_LEDS_TRIGGER_TIMER=m | 162 | CONFIG_LEDS_TRIGGER_TIMER=m |
163 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | 163 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m |
164 | CONFIG_RTC_CLASS=y | 164 | CONFIG_RTC_CLASS=y |
165 | CONFIG_DMADEVICES=y | ||
166 | CONFIG_TI_EDMA=y | ||
165 | CONFIG_EXT2_FS=y | 167 | CONFIG_EXT2_FS=y |
166 | CONFIG_EXT3_FS=y | 168 | CONFIG_EXT3_FS=y |
167 | CONFIG_XFS_FS=m | 169 | CONFIG_XFS_FS=m |
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index fe0bdc361d2c..6e572c64cf5a 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig | |||
@@ -53,6 +53,7 @@ CONFIG_IP_PNP=y | |||
53 | CONFIG_IP_PNP_DHCP=y | 53 | CONFIG_IP_PNP_DHCP=y |
54 | CONFIG_DEVTMPFS=y | 54 | CONFIG_DEVTMPFS=y |
55 | CONFIG_DEVTMPFS_MOUNT=y | 55 | CONFIG_DEVTMPFS_MOUNT=y |
56 | CONFIG_OMAP_OCP2SCP=y | ||
56 | CONFIG_BLK_DEV_SD=y | 57 | CONFIG_BLK_DEV_SD=y |
57 | CONFIG_ATA=y | 58 | CONFIG_ATA=y |
58 | CONFIG_SATA_AHCI_PLATFORM=y | 59 | CONFIG_SATA_AHCI_PLATFORM=y |
@@ -61,6 +62,7 @@ CONFIG_SATA_MV=y | |||
61 | CONFIG_NETDEVICES=y | 62 | CONFIG_NETDEVICES=y |
62 | CONFIG_SUN4I_EMAC=y | 63 | CONFIG_SUN4I_EMAC=y |
63 | CONFIG_NET_CALXEDA_XGMAC=y | 64 | CONFIG_NET_CALXEDA_XGMAC=y |
65 | CONFIG_KS8851=y | ||
64 | CONFIG_SMSC911X=y | 66 | CONFIG_SMSC911X=y |
65 | CONFIG_STMMAC_ETH=y | 67 | CONFIG_STMMAC_ETH=y |
66 | CONFIG_MDIO_SUN4I=y | 68 | CONFIG_MDIO_SUN4I=y |
@@ -89,6 +91,7 @@ CONFIG_I2C_DESIGNWARE_PLATFORM=y | |||
89 | CONFIG_I2C_SIRF=y | 91 | CONFIG_I2C_SIRF=y |
90 | CONFIG_I2C_TEGRA=y | 92 | CONFIG_I2C_TEGRA=y |
91 | CONFIG_SPI=y | 93 | CONFIG_SPI=y |
94 | CONFIG_SPI_OMAP24XX=y | ||
92 | CONFIG_SPI_PL022=y | 95 | CONFIG_SPI_PL022=y |
93 | CONFIG_SPI_SIRF=y | 96 | CONFIG_SPI_SIRF=y |
94 | CONFIG_SPI_TEGRA114=y | 97 | CONFIG_SPI_TEGRA114=y |
@@ -111,11 +114,12 @@ CONFIG_FB_SIMPLE=y | |||
111 | CONFIG_USB=y | 114 | CONFIG_USB=y |
112 | CONFIG_USB_XHCI_HCD=y | 115 | CONFIG_USB_XHCI_HCD=y |
113 | CONFIG_USB_EHCI_HCD=y | 116 | CONFIG_USB_EHCI_HCD=y |
114 | CONFIG_USB_EHCI_MXC=y | ||
115 | CONFIG_USB_EHCI_TEGRA=y | 117 | CONFIG_USB_EHCI_TEGRA=y |
116 | CONFIG_USB_EHCI_HCD_PLATFORM=y | 118 | CONFIG_USB_EHCI_HCD_PLATFORM=y |
117 | CONFIG_USB_ISP1760_HCD=y | 119 | CONFIG_USB_ISP1760_HCD=y |
118 | CONFIG_USB_STORAGE=y | 120 | CONFIG_USB_STORAGE=y |
121 | CONFIG_USB_CHIPIDEA=y | ||
122 | CONFIG_USB_CHIPIDEA_HOST=y | ||
119 | CONFIG_AB8500_USB=y | 123 | CONFIG_AB8500_USB=y |
120 | CONFIG_NOP_USB_XCEIV=y | 124 | CONFIG_NOP_USB_XCEIV=y |
121 | CONFIG_OMAP_USB2=y | 125 | CONFIG_OMAP_USB2=y |
diff --git a/arch/arm/configs/nhk8815_defconfig b/arch/arm/configs/nhk8815_defconfig index 35f8cf299fa2..263ae3869e32 100644 --- a/arch/arm/configs/nhk8815_defconfig +++ b/arch/arm/configs/nhk8815_defconfig | |||
@@ -1,6 +1,8 @@ | |||
1 | # CONFIG_LOCALVERSION_AUTO is not set | 1 | # CONFIG_LOCALVERSION_AUTO is not set |
2 | # CONFIG_SWAP is not set | 2 | # CONFIG_SWAP is not set |
3 | CONFIG_SYSVIPC=y | 3 | CONFIG_SYSVIPC=y |
4 | CONFIG_NO_HZ_IDLE=y | ||
5 | CONFIG_HIGH_RES_TIMERS=y | ||
4 | CONFIG_IKCONFIG=y | 6 | CONFIG_IKCONFIG=y |
5 | CONFIG_IKCONFIG_PROC=y | 7 | CONFIG_IKCONFIG_PROC=y |
6 | CONFIG_LOG_BUF_SHIFT=14 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
@@ -48,7 +50,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
48 | CONFIG_MTD=y | 50 | CONFIG_MTD=y |
49 | CONFIG_MTD_TESTS=m | 51 | CONFIG_MTD_TESTS=m |
50 | CONFIG_MTD_CMDLINE_PARTS=y | 52 | CONFIG_MTD_CMDLINE_PARTS=y |
51 | CONFIG_MTD_CHAR=y | ||
52 | CONFIG_MTD_BLOCK=y | 53 | CONFIG_MTD_BLOCK=y |
53 | CONFIG_MTD_NAND_ECC_SMC=y | 54 | CONFIG_MTD_NAND_ECC_SMC=y |
54 | CONFIG_MTD_NAND=y | 55 | CONFIG_MTD_NAND=y |
@@ -94,8 +95,10 @@ CONFIG_I2C_GPIO=y | |||
94 | CONFIG_I2C_NOMADIK=y | 95 | CONFIG_I2C_NOMADIK=y |
95 | CONFIG_DEBUG_GPIO=y | 96 | CONFIG_DEBUG_GPIO=y |
96 | # CONFIG_HWMON is not set | 97 | # CONFIG_HWMON is not set |
98 | CONFIG_REGULATOR=y | ||
97 | CONFIG_MMC=y | 99 | CONFIG_MMC=y |
98 | CONFIG_MMC_CLKGATE=y | 100 | CONFIG_MMC_UNSAFE_RESUME=y |
101 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
99 | CONFIG_MMC_ARMMMCI=y | 102 | CONFIG_MMC_ARMMMCI=y |
100 | CONFIG_NEW_LEDS=y | 103 | CONFIG_NEW_LEDS=y |
101 | CONFIG_LEDS_CLASS=y | 104 | CONFIG_LEDS_CLASS=y |
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index afbc439f11d4..4cdb61c54459 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c | |||
@@ -505,7 +505,7 @@ static struct vpbe_output dm365evm_vpbe_outputs[] = { | |||
505 | /* | 505 | /* |
506 | * Amplifiers on the board | 506 | * Amplifiers on the board |
507 | */ | 507 | */ |
508 | struct ths7303_platform_data ths7303_pdata = { | 508 | static struct ths7303_platform_data ths7303_pdata = { |
509 | .ch_1 = 3, | 509 | .ch_1 = 3, |
510 | .ch_2 = 3, | 510 | .ch_2 = 3, |
511 | .ch_3 = 3, | 511 | .ch_3 = 3, |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index 42ef53f62c6c..86100d179694 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
@@ -860,7 +860,7 @@ static struct platform_device dm355_vpbe_display = { | |||
860 | }, | 860 | }, |
861 | }; | 861 | }; |
862 | 862 | ||
863 | struct venc_platform_data dm355_venc_pdata = { | 863 | static struct venc_platform_data dm355_venc_pdata = { |
864 | .setup_pinmux = dm355_vpbe_setup_pinmux, | 864 | .setup_pinmux = dm355_vpbe_setup_pinmux, |
865 | .setup_clock = dm355_venc_setup_clock, | 865 | .setup_clock = dm355_venc_setup_clock, |
866 | }; | 866 | }; |
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index fa7af5eda52d..dad28029ba9b 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
@@ -1349,7 +1349,7 @@ static struct platform_device dm365_vpbe_display = { | |||
1349 | }, | 1349 | }, |
1350 | }; | 1350 | }; |
1351 | 1351 | ||
1352 | struct venc_platform_data dm365_venc_pdata = { | 1352 | static struct venc_platform_data dm365_venc_pdata = { |
1353 | .setup_pinmux = dm365_vpbe_setup_pinmux, | 1353 | .setup_pinmux = dm365_vpbe_setup_pinmux, |
1354 | .setup_clock = dm365_venc_setup_clock, | 1354 | .setup_clock = dm365_venc_setup_clock, |
1355 | }; | 1355 | }; |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 855d4a7b462d..5952e68c76c4 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
@@ -92,6 +92,7 @@ config SOC_EXYNOS5440 | |||
92 | bool "SAMSUNG EXYNOS5440" | 92 | bool "SAMSUNG EXYNOS5440" |
93 | default y | 93 | default y |
94 | depends on ARCH_EXYNOS5 | 94 | depends on ARCH_EXYNOS5 |
95 | select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE | ||
95 | select ARCH_HAS_OPP | 96 | select ARCH_HAS_OPP |
96 | select HAVE_ARM_ARCH_TIMER | 97 | select HAVE_ARM_ARCH_TIMER |
97 | select AUTO_ZRELADDR | 98 | select AUTO_ZRELADDR |
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile index e970a7a4e278..53696154aead 100644 --- a/arch/arm/mach-exynos/Makefile +++ b/arch/arm/mach-exynos/Makefile | |||
@@ -14,7 +14,7 @@ obj- := | |||
14 | 14 | ||
15 | obj-$(CONFIG_ARCH_EXYNOS) += common.o | 15 | obj-$(CONFIG_ARCH_EXYNOS) += common.o |
16 | 16 | ||
17 | obj-$(CONFIG_PM) += pm.o | 17 | obj-$(CONFIG_S5P_PM) += pm.o |
18 | obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o | 18 | obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o |
19 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | 19 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o |
20 | 20 | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 164685bd25c8..ba95e5db2501 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -58,7 +58,6 @@ static const char name_exynos5440[] = "EXYNOS5440"; | |||
58 | 58 | ||
59 | static void exynos4_map_io(void); | 59 | static void exynos4_map_io(void); |
60 | static void exynos5_map_io(void); | 60 | static void exynos5_map_io(void); |
61 | static void exynos5440_map_io(void); | ||
62 | static int exynos_init(void); | 61 | static int exynos_init(void); |
63 | 62 | ||
64 | static struct cpu_table cpu_ids[] __initdata = { | 63 | static struct cpu_table cpu_ids[] __initdata = { |
@@ -95,7 +94,6 @@ static struct cpu_table cpu_ids[] __initdata = { | |||
95 | }, { | 94 | }, { |
96 | .idcode = EXYNOS5440_SOC_ID, | 95 | .idcode = EXYNOS5440_SOC_ID, |
97 | .idmask = EXYNOS5_SOC_MASK, | 96 | .idmask = EXYNOS5_SOC_MASK, |
98 | .map_io = exynos5440_map_io, | ||
99 | .init = exynos_init, | 97 | .init = exynos_init, |
100 | .name = name_exynos5440, | 98 | .name = name_exynos5440, |
101 | }, | 99 | }, |
@@ -150,11 +148,6 @@ static struct map_desc exynos4_iodesc[] __initdata = { | |||
150 | .length = SZ_64K, | 148 | .length = SZ_64K, |
151 | .type = MT_DEVICE, | 149 | .type = MT_DEVICE, |
152 | }, { | 150 | }, { |
153 | .virtual = (unsigned long)S3C_VA_UART, | ||
154 | .pfn = __phys_to_pfn(EXYNOS4_PA_UART), | ||
155 | .length = SZ_512K, | ||
156 | .type = MT_DEVICE, | ||
157 | }, { | ||
158 | .virtual = (unsigned long)S5P_VA_CMU, | 151 | .virtual = (unsigned long)S5P_VA_CMU, |
159 | .pfn = __phys_to_pfn(EXYNOS4_PA_CMU), | 152 | .pfn = __phys_to_pfn(EXYNOS4_PA_CMU), |
160 | .length = SZ_128K, | 153 | .length = SZ_128K, |
@@ -268,20 +261,6 @@ static struct map_desc exynos5_iodesc[] __initdata = { | |||
268 | .pfn = __phys_to_pfn(EXYNOS5_PA_PMU), | 261 | .pfn = __phys_to_pfn(EXYNOS5_PA_PMU), |
269 | .length = SZ_64K, | 262 | .length = SZ_64K, |
270 | .type = MT_DEVICE, | 263 | .type = MT_DEVICE, |
271 | }, { | ||
272 | .virtual = (unsigned long)S3C_VA_UART, | ||
273 | .pfn = __phys_to_pfn(EXYNOS5_PA_UART), | ||
274 | .length = SZ_512K, | ||
275 | .type = MT_DEVICE, | ||
276 | }, | ||
277 | }; | ||
278 | |||
279 | static struct map_desc exynos5440_iodesc0[] __initdata = { | ||
280 | { | ||
281 | .virtual = (unsigned long)S3C_VA_UART, | ||
282 | .pfn = __phys_to_pfn(EXYNOS5440_PA_UART0), | ||
283 | .length = SZ_512K, | ||
284 | .type = MT_DEVICE, | ||
285 | }, | 264 | }, |
286 | }; | 265 | }; |
287 | 266 | ||
@@ -388,11 +367,6 @@ static void __init exynos5_map_io(void) | |||
388 | iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc)); | 367 | iotable_init(exynos5250_iodesc, ARRAY_SIZE(exynos5250_iodesc)); |
389 | } | 368 | } |
390 | 369 | ||
391 | static void __init exynos5440_map_io(void) | ||
392 | { | ||
393 | iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0)); | ||
394 | } | ||
395 | |||
396 | void __init exynos_init_time(void) | 370 | void __init exynos_init_time(void) |
397 | { | 371 | { |
398 | of_clk_init(NULL); | 372 | of_clk_init(NULL); |
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 3e156bcddcb4..972490fc09d6 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
@@ -97,6 +97,5 @@ struct exynos_pmu_conf { | |||
97 | }; | 97 | }; |
98 | 98 | ||
99 | extern void exynos_sys_powerdown_conf(enum sys_powerdown mode); | 99 | extern void exynos_sys_powerdown_conf(enum sys_powerdown mode); |
100 | extern void s3c_cpu_resume(void); | ||
101 | 100 | ||
102 | #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ | 101 | #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ |
diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c index 17a18ff3d71e..225ee8431c72 100644 --- a/arch/arm/mach-exynos/cpuidle.c +++ b/arch/arm/mach-exynos/cpuidle.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <mach/regs-pmu.h> | 25 | #include <mach/regs-pmu.h> |
26 | 26 | ||
27 | #include <plat/cpu.h> | 27 | #include <plat/cpu.h> |
28 | #include <plat/pm.h> | ||
28 | 29 | ||
29 | #include "common.h" | 30 | #include "common.h" |
30 | 31 | ||
diff --git a/arch/arm/mach-exynos/include/mach/memory.h b/arch/arm/mach-exynos/include/mach/memory.h index 374ef2cf7152..2a4cdb7cb326 100644 --- a/arch/arm/mach-exynos/include/mach/memory.h +++ b/arch/arm/mach-exynos/include/mach/memory.h | |||
@@ -15,8 +15,13 @@ | |||
15 | 15 | ||
16 | #define PLAT_PHYS_OFFSET UL(0x40000000) | 16 | #define PLAT_PHYS_OFFSET UL(0x40000000) |
17 | 17 | ||
18 | #ifndef CONFIG_ARM_LPAE | ||
18 | /* Maximum of 256MiB in one bank */ | 19 | /* Maximum of 256MiB in one bank */ |
19 | #define MAX_PHYSMEM_BITS 32 | 20 | #define MAX_PHYSMEM_BITS 32 |
20 | #define SECTION_SIZE_BITS 28 | 21 | #define SECTION_SIZE_BITS 28 |
22 | #else | ||
23 | #define MAX_PHYSMEM_BITS 36 | ||
24 | #define SECTION_SIZE_BITS 31 | ||
25 | #endif | ||
21 | 26 | ||
22 | #endif /* __ASM_ARCH_MEMORY_H */ | 27 | #endif /* __ASM_ARCH_MEMORY_H */ |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 41c20692a13f..c679db577269 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -217,6 +217,9 @@ static __init int exynos_pm_drvinit(void) | |||
217 | struct clk *pll_base; | 217 | struct clk *pll_base; |
218 | unsigned int tmp; | 218 | unsigned int tmp; |
219 | 219 | ||
220 | if (soc_is_exynos5440()) | ||
221 | return 0; | ||
222 | |||
220 | s3c_pm_init(); | 223 | s3c_pm_init(); |
221 | 224 | ||
222 | /* All wakeup disable */ | 225 | /* All wakeup disable */ |
@@ -340,6 +343,9 @@ static struct syscore_ops exynos_pm_syscore_ops = { | |||
340 | 343 | ||
341 | static __init int exynos_pm_syscore_init(void) | 344 | static __init int exynos_pm_syscore_init(void) |
342 | { | 345 | { |
346 | if (soc_is_exynos5440()) | ||
347 | return 0; | ||
348 | |||
343 | register_syscore_ops(&exynos_pm_syscore_ops); | 349 | register_syscore_ops(&exynos_pm_syscore_ops); |
344 | return 0; | 350 | return 0; |
345 | } | 351 | } |
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index a7cd2cf5e08d..3490a24f969e 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c | |||
@@ -276,8 +276,6 @@ int __init dc21285_setup(int nr, struct pci_sys_data *sys) | |||
276 | 276 | ||
277 | sys->mem_offset = DC21285_PCI_MEM; | 277 | sys->mem_offset = DC21285_PCI_MEM; |
278 | 278 | ||
279 | pci_ioremap_io(0, DC21285_PCI_IO); | ||
280 | |||
281 | pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset); | 279 | pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset); |
282 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); | 280 | pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset); |
283 | 281 | ||
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index dc5d6becd8c7..88815795fe26 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -115,6 +115,7 @@ static int highbank_platform_notifier(struct notifier_block *nb, | |||
115 | { | 115 | { |
116 | struct resource *res; | 116 | struct resource *res; |
117 | int reg = -1; | 117 | int reg = -1; |
118 | u32 val; | ||
118 | struct device *dev = __dev; | 119 | struct device *dev = __dev; |
119 | 120 | ||
120 | if (event != BUS_NOTIFY_ADD_DEVICE) | 121 | if (event != BUS_NOTIFY_ADD_DEVICE) |
@@ -141,10 +142,10 @@ static int highbank_platform_notifier(struct notifier_block *nb, | |||
141 | return NOTIFY_DONE; | 142 | return NOTIFY_DONE; |
142 | 143 | ||
143 | if (of_property_read_bool(dev->of_node, "dma-coherent")) { | 144 | if (of_property_read_bool(dev->of_node, "dma-coherent")) { |
144 | writel(0xff31, sregs_base + reg); | 145 | val = readl(sregs_base + reg); |
146 | writel(val | 0xff01, sregs_base + reg); | ||
145 | set_dma_ops(dev, &arm_coherent_dma_ops); | 147 | set_dma_ops(dev, &arm_coherent_dma_ops); |
146 | } else | 148 | } |
147 | writel(0, sregs_base + reg); | ||
148 | 149 | ||
149 | return NOTIFY_OK; | 150 | return NOTIFY_OK; |
150 | } | 151 | } |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 4282e99f5ca1..86567d980b07 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -199,7 +199,8 @@ static const char *pcie_axi_sels[] = { "axi", "ahb", }; | |||
199 | static const char *ssi_sels[] = { "pll3_pfd2_508m", "pll3_pfd3_454m", "pll4_post_div", }; | 199 | static const char *ssi_sels[] = { "pll3_pfd2_508m", "pll3_pfd3_454m", "pll4_post_div", }; |
200 | static const char *usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", }; | 200 | static const char *usdhc_sels[] = { "pll2_pfd2_396m", "pll2_pfd0_352m", }; |
201 | static const char *enfc_sels[] = { "pll2_pfd0_352m", "pll2_bus", "pll3_usb_otg", "pll2_pfd2_396m", }; | 201 | static const char *enfc_sels[] = { "pll2_pfd0_352m", "pll2_bus", "pll3_usb_otg", "pll2_pfd2_396m", }; |
202 | static const char *emi_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd2_396m", "pll2_pfd0_352m", }; | 202 | static const char *emi_sels[] = { "pll2_pfd2_396m", "pll3_usb_otg", "axi", "pll2_pfd0_352m", }; |
203 | static const char *emi_slow_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd2_396m", "pll2_pfd0_352m", }; | ||
203 | static const char *vdo_axi_sels[] = { "axi", "ahb", }; | 204 | static const char *vdo_axi_sels[] = { "axi", "ahb", }; |
204 | static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m", }; | 205 | static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m", }; |
205 | static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div", | 206 | static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div", |
@@ -392,7 +393,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
392 | clk[usdhc4_sel] = imx_clk_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); | 393 | clk[usdhc4_sel] = imx_clk_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); |
393 | clk[enfc_sel] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels)); | 394 | clk[enfc_sel] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels)); |
394 | clk[emi_sel] = imx_clk_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels)); | 395 | clk[emi_sel] = imx_clk_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels)); |
395 | clk[emi_slow_sel] = imx_clk_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_sels, ARRAY_SIZE(emi_sels)); | 396 | clk[emi_slow_sel] = imx_clk_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_slow_sels, ARRAY_SIZE(emi_slow_sels)); |
396 | clk[vdo_axi_sel] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels)); | 397 | clk[vdo_axi_sel] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels)); |
397 | clk[vpu_axi_sel] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels)); | 398 | clk[vpu_axi_sel] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels)); |
398 | clk[cko1_sel] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); | 399 | clk[cko1_sel] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); |
diff --git a/arch/arm/mach-imx/clk-vf610.c b/arch/arm/mach-imx/clk-vf610.c index d617c0b7c809..b169a396d93b 100644 --- a/arch/arm/mach-imx/clk-vf610.c +++ b/arch/arm/mach-imx/clk-vf610.c | |||
@@ -183,6 +183,8 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) | |||
183 | clk[VF610_CLK_ENET_TS_SEL] = imx_clk_mux("enet_ts_sel", CCM_CSCMR2, 0, 3, enet_ts_sels, 7); | 183 | clk[VF610_CLK_ENET_TS_SEL] = imx_clk_mux("enet_ts_sel", CCM_CSCMR2, 0, 3, enet_ts_sels, 7); |
184 | clk[VF610_CLK_ENET] = imx_clk_gate("enet", "enet_sel", CCM_CSCDR1, 24); | 184 | clk[VF610_CLK_ENET] = imx_clk_gate("enet", "enet_sel", CCM_CSCDR1, 24); |
185 | clk[VF610_CLK_ENET_TS] = imx_clk_gate("enet_ts", "enet_ts_sel", CCM_CSCDR1, 23); | 185 | clk[VF610_CLK_ENET_TS] = imx_clk_gate("enet_ts", "enet_ts_sel", CCM_CSCDR1, 23); |
186 | clk[VF610_CLK_ENET0] = imx_clk_gate2("enet0", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(0)); | ||
187 | clk[VF610_CLK_ENET1] = imx_clk_gate2("enet1", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(1)); | ||
186 | 188 | ||
187 | clk[VF610_CLK_PIT] = imx_clk_gate2("pit", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(7)); | 189 | clk[VF610_CLK_PIT] = imx_clk_gate2("pit", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(7)); |
188 | 190 | ||
diff --git a/arch/arm/mach-imx/mx27.h b/arch/arm/mach-imx/mx27.h index e074616d54ca..8a65f192e7f3 100644 --- a/arch/arm/mach-imx/mx27.h +++ b/arch/arm/mach-imx/mx27.h | |||
@@ -135,7 +135,7 @@ | |||
135 | #define MX27_INT_GPT4 (NR_IRQS_LEGACY + 4) | 135 | #define MX27_INT_GPT4 (NR_IRQS_LEGACY + 4) |
136 | #define MX27_INT_RTIC (NR_IRQS_LEGACY + 5) | 136 | #define MX27_INT_RTIC (NR_IRQS_LEGACY + 5) |
137 | #define MX27_INT_CSPI3 (NR_IRQS_LEGACY + 6) | 137 | #define MX27_INT_CSPI3 (NR_IRQS_LEGACY + 6) |
138 | #define MX27_INT_SDHC (NR_IRQS_LEGACY + 7) | 138 | #define MX27_INT_MSHC (NR_IRQS_LEGACY + 7) |
139 | #define MX27_INT_GPIO (NR_IRQS_LEGACY + 8) | 139 | #define MX27_INT_GPIO (NR_IRQS_LEGACY + 8) |
140 | #define MX27_INT_SDHC3 (NR_IRQS_LEGACY + 9) | 140 | #define MX27_INT_SDHC3 (NR_IRQS_LEGACY + 9) |
141 | #define MX27_INT_SDHC2 (NR_IRQS_LEGACY + 10) | 141 | #define MX27_INT_SDHC2 (NR_IRQS_LEGACY + 10) |
diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c index fe4d9ff93a7e..b661c5c2870a 100644 --- a/arch/arm/mach-keystone/keystone.c +++ b/arch/arm/mach-keystone/keystone.c | |||
@@ -49,7 +49,7 @@ static const char *keystone_match[] __initconst = { | |||
49 | NULL, | 49 | NULL, |
50 | }; | 50 | }; |
51 | 51 | ||
52 | void keystone_restart(char mode, const char *cmd) | 52 | void keystone_restart(enum reboot_mode mode, const char *cmd) |
53 | { | 53 | { |
54 | u32 val; | 54 | u32 val; |
55 | 55 | ||
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 627fa7e41fba..3eed0006d189 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -62,7 +62,7 @@ config SOC_OMAP5 | |||
62 | select HAVE_SMP | 62 | select HAVE_SMP |
63 | select COMMON_CLK | 63 | select COMMON_CLK |
64 | select HAVE_ARM_ARCH_TIMER | 64 | select HAVE_ARM_ARCH_TIMER |
65 | select ARM_ERRATA_798181 | 65 | select ARM_ERRATA_798181 if SMP |
66 | 66 | ||
67 | config SOC_AM33XX | 67 | config SOC_AM33XX |
68 | bool "AM33XX support" | 68 | bool "AM33XX support" |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index e5fbfed69aa2..be5d005ebad2 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/of_irq.h> | 15 | #include <linux/of_irq.h> |
16 | #include <linux/of_platform.h> | 16 | #include <linux/of_platform.h> |
17 | #include <linux/irqdomain.h> | 17 | #include <linux/irqdomain.h> |
18 | #include <linux/clk.h> | ||
18 | 19 | ||
19 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
20 | 21 | ||
@@ -35,6 +36,21 @@ static struct of_device_id omap_dt_match_table[] __initdata = { | |||
35 | { } | 36 | { } |
36 | }; | 37 | }; |
37 | 38 | ||
39 | /* | ||
40 | * Create alias for USB host PHY clock. | ||
41 | * Remove this when clock phandle can be provided via DT | ||
42 | */ | ||
43 | static void __init legacy_init_ehci_clk(char *clkname) | ||
44 | { | ||
45 | int ret; | ||
46 | |||
47 | ret = clk_add_alias("main_clk", NULL, clkname, NULL); | ||
48 | if (ret) { | ||
49 | pr_err("%s:Failed to add main_clk alias to %s :%d\n", | ||
50 | __func__, clkname, ret); | ||
51 | } | ||
52 | } | ||
53 | |||
38 | static void __init omap_generic_init(void) | 54 | static void __init omap_generic_init(void) |
39 | { | 55 | { |
40 | omap_sdrc_init(NULL, NULL); | 56 | omap_sdrc_init(NULL, NULL); |
@@ -45,10 +61,15 @@ static void __init omap_generic_init(void) | |||
45 | * HACK: call display setup code for selected boards to enable omapdss. | 61 | * HACK: call display setup code for selected boards to enable omapdss. |
46 | * This will be removed when omapdss supports DT. | 62 | * This will be removed when omapdss supports DT. |
47 | */ | 63 | */ |
48 | if (of_machine_is_compatible("ti,omap4-panda")) | 64 | if (of_machine_is_compatible("ti,omap4-panda")) { |
49 | omap4_panda_display_init_of(); | 65 | omap4_panda_display_init_of(); |
66 | legacy_init_ehci_clk("auxclk3_ck"); | ||
67 | |||
68 | } | ||
50 | else if (of_machine_is_compatible("ti,omap4-sdp")) | 69 | else if (of_machine_is_compatible("ti,omap4-sdp")) |
51 | omap_4430sdp_display_init_of(); | 70 | omap_4430sdp_display_init_of(); |
71 | else if (of_machine_is_compatible("ti,omap5-uevm")) | ||
72 | legacy_init_ehci_clk("auxclk1_ck"); | ||
52 | } | 73 | } |
53 | 74 | ||
54 | #ifdef CONFIG_SOC_OMAP2420 | 75 | #ifdef CONFIG_SOC_OMAP2420 |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index f6726bb4eb95..3a3362fa793e 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
@@ -477,16 +477,24 @@ static int em_x270_usb_hub_init(void) | |||
477 | /* USB Hub power-on and reset */ | 477 | /* USB Hub power-on and reset */ |
478 | gpio_direction_output(usb_hub_reset, 1); | 478 | gpio_direction_output(usb_hub_reset, 1); |
479 | gpio_direction_output(GPIO9_USB_VBUS_EN, 0); | 479 | gpio_direction_output(GPIO9_USB_VBUS_EN, 0); |
480 | regulator_enable(em_x270_usb_ldo); | 480 | err = regulator_enable(em_x270_usb_ldo); |
481 | if (err) | ||
482 | goto err_free_rst_gpio; | ||
483 | |||
481 | gpio_set_value(usb_hub_reset, 0); | 484 | gpio_set_value(usb_hub_reset, 0); |
482 | gpio_set_value(usb_hub_reset, 1); | 485 | gpio_set_value(usb_hub_reset, 1); |
483 | regulator_disable(em_x270_usb_ldo); | 486 | regulator_disable(em_x270_usb_ldo); |
484 | regulator_enable(em_x270_usb_ldo); | 487 | err = regulator_enable(em_x270_usb_ldo); |
488 | if (err) | ||
489 | goto err_free_rst_gpio; | ||
490 | |||
485 | gpio_set_value(usb_hub_reset, 0); | 491 | gpio_set_value(usb_hub_reset, 0); |
486 | gpio_set_value(GPIO9_USB_VBUS_EN, 1); | 492 | gpio_set_value(GPIO9_USB_VBUS_EN, 1); |
487 | 493 | ||
488 | return 0; | 494 | return 0; |
489 | 495 | ||
496 | err_free_rst_gpio: | ||
497 | gpio_free(usb_hub_reset); | ||
490 | err_free_vbus_gpio: | 498 | err_free_vbus_gpio: |
491 | gpio_free(GPIO9_USB_VBUS_EN); | 499 | gpio_free(GPIO9_USB_VBUS_EN); |
492 | err_free_usb_ldo: | 500 | err_free_usb_ldo: |
@@ -592,7 +600,7 @@ err_irq: | |||
592 | return err; | 600 | return err; |
593 | } | 601 | } |
594 | 602 | ||
595 | static void em_x270_mci_setpower(struct device *dev, unsigned int vdd) | 603 | static int em_x270_mci_setpower(struct device *dev, unsigned int vdd) |
596 | { | 604 | { |
597 | struct pxamci_platform_data* p_d = dev->platform_data; | 605 | struct pxamci_platform_data* p_d = dev->platform_data; |
598 | 606 | ||
@@ -600,10 +608,11 @@ static void em_x270_mci_setpower(struct device *dev, unsigned int vdd) | |||
600 | int vdd_uV = (2000 + (vdd - __ffs(MMC_VDD_20_21)) * 100) * 1000; | 608 | int vdd_uV = (2000 + (vdd - __ffs(MMC_VDD_20_21)) * 100) * 1000; |
601 | 609 | ||
602 | regulator_set_voltage(em_x270_sdio_ldo, vdd_uV, vdd_uV); | 610 | regulator_set_voltage(em_x270_sdio_ldo, vdd_uV, vdd_uV); |
603 | regulator_enable(em_x270_sdio_ldo); | 611 | return regulator_enable(em_x270_sdio_ldo); |
604 | } else { | 612 | } else { |
605 | regulator_disable(em_x270_sdio_ldo); | 613 | regulator_disable(em_x270_sdio_ldo); |
606 | } | 614 | } |
615 | return 0; | ||
607 | } | 616 | } |
608 | 617 | ||
609 | static void em_x270_mci_exit(struct device *dev, void *data) | 618 | static void em_x270_mci_exit(struct device *dev, void *data) |
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index d2c652318376..dd70343c8708 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -408,7 +408,7 @@ static int mainstone_mci_init(struct device *dev, irq_handler_t mstone_detect_in | |||
408 | return err; | 408 | return err; |
409 | } | 409 | } |
410 | 410 | ||
411 | static void mainstone_mci_setpower(struct device *dev, unsigned int vdd) | 411 | static int mainstone_mci_setpower(struct device *dev, unsigned int vdd) |
412 | { | 412 | { |
413 | struct pxamci_platform_data* p_d = dev->platform_data; | 413 | struct pxamci_platform_data* p_d = dev->platform_data; |
414 | 414 | ||
@@ -420,6 +420,7 @@ static void mainstone_mci_setpower(struct device *dev, unsigned int vdd) | |||
420 | printk(KERN_DEBUG "%s: off\n", __func__); | 420 | printk(KERN_DEBUG "%s: off\n", __func__); |
421 | MST_MSCWR1 &= ~MST_MSCWR1_MMC_ON; | 421 | MST_MSCWR1 &= ~MST_MSCWR1_MMC_ON; |
422 | } | 422 | } |
423 | return 0; | ||
423 | } | 424 | } |
424 | 425 | ||
425 | static void mainstone_mci_exit(struct device *dev, void *data) | 426 | static void mainstone_mci_exit(struct device *dev, void *data) |
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c index fb7f1d1627dc..13e5b00eae90 100644 --- a/arch/arm/mach-pxa/pcm990-baseboard.c +++ b/arch/arm/mach-pxa/pcm990-baseboard.c | |||
@@ -335,7 +335,7 @@ static int pcm990_mci_init(struct device *dev, irq_handler_t mci_detect_int, | |||
335 | return err; | 335 | return err; |
336 | } | 336 | } |
337 | 337 | ||
338 | static void pcm990_mci_setpower(struct device *dev, unsigned int vdd) | 338 | static int pcm990_mci_setpower(struct device *dev, unsigned int vdd) |
339 | { | 339 | { |
340 | struct pxamci_platform_data *p_d = dev->platform_data; | 340 | struct pxamci_platform_data *p_d = dev->platform_data; |
341 | u8 val; | 341 | u8 val; |
@@ -348,6 +348,7 @@ static void pcm990_mci_setpower(struct device *dev, unsigned int vdd) | |||
348 | val &= ~PCM990_CTRL_MMC2PWR; | 348 | val &= ~PCM990_CTRL_MMC2PWR; |
349 | 349 | ||
350 | pcm990_cpld_writeb(PCM990_CTRL_MMC2PWR, PCM990_CTRL_REG5); | 350 | pcm990_cpld_writeb(PCM990_CTRL_MMC2PWR, PCM990_CTRL_REG5); |
351 | return 0; | ||
351 | } | 352 | } |
352 | 353 | ||
353 | static void pcm990_mci_exit(struct device *dev, void *data) | 354 | static void pcm990_mci_exit(struct device *dev, void *data) |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 711d37e26bd8..aedf053a1de5 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -258,7 +258,7 @@ err_free_2: | |||
258 | return err; | 258 | return err; |
259 | } | 259 | } |
260 | 260 | ||
261 | static void poodle_mci_setpower(struct device *dev, unsigned int vdd) | 261 | static int poodle_mci_setpower(struct device *dev, unsigned int vdd) |
262 | { | 262 | { |
263 | struct pxamci_platform_data* p_d = dev->platform_data; | 263 | struct pxamci_platform_data* p_d = dev->platform_data; |
264 | 264 | ||
@@ -270,6 +270,8 @@ static void poodle_mci_setpower(struct device *dev, unsigned int vdd) | |||
270 | gpio_set_value(POODLE_GPIO_SD_PWR1, 0); | 270 | gpio_set_value(POODLE_GPIO_SD_PWR1, 0); |
271 | gpio_set_value(POODLE_GPIO_SD_PWR, 0); | 271 | gpio_set_value(POODLE_GPIO_SD_PWR, 0); |
272 | } | 272 | } |
273 | |||
274 | return 0; | ||
273 | } | 275 | } |
274 | 276 | ||
275 | static void poodle_mci_exit(struct device *dev, void *data) | 277 | static void poodle_mci_exit(struct device *dev, void *data) |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 2125df0444e7..4c29173026e8 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -598,7 +598,7 @@ static inline void spitz_spi_init(void) {} | |||
598 | * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to | 598 | * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to |
599 | * give the card a chance to fully insert/eject. | 599 | * give the card a chance to fully insert/eject. |
600 | */ | 600 | */ |
601 | static void spitz_mci_setpower(struct device *dev, unsigned int vdd) | 601 | static int spitz_mci_setpower(struct device *dev, unsigned int vdd) |
602 | { | 602 | { |
603 | struct pxamci_platform_data* p_d = dev->platform_data; | 603 | struct pxamci_platform_data* p_d = dev->platform_data; |
604 | 604 | ||
@@ -606,6 +606,8 @@ static void spitz_mci_setpower(struct device *dev, unsigned int vdd) | |||
606 | spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V); | 606 | spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V); |
607 | else | 607 | else |
608 | spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0); | 608 | spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0); |
609 | |||
610 | return 0; | ||
609 | } | 611 | } |
610 | 612 | ||
611 | static struct pxamci_platform_data spitz_mci_platform_data = { | 613 | static struct pxamci_platform_data spitz_mci_platform_data = { |
diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c index 88fde43c948c..62aea3e835f3 100644 --- a/arch/arm/mach-pxa/stargate2.c +++ b/arch/arm/mach-pxa/stargate2.c | |||
@@ -734,9 +734,10 @@ static int stargate2_mci_init(struct device *dev, | |||
734 | * | 734 | * |
735 | * Very simple control. Either it is on or off and is controlled by | 735 | * Very simple control. Either it is on or off and is controlled by |
736 | * a gpio pin */ | 736 | * a gpio pin */ |
737 | static void stargate2_mci_setpower(struct device *dev, unsigned int vdd) | 737 | static int stargate2_mci_setpower(struct device *dev, unsigned int vdd) |
738 | { | 738 | { |
739 | gpio_set_value(SG2_SD_POWER_ENABLE, !!vdd); | 739 | gpio_set_value(SG2_SD_POWER_ENABLE, !!vdd); |
740 | return 0; | ||
740 | } | 741 | } |
741 | 742 | ||
742 | static void stargate2_mci_exit(struct device *dev, void *data) | 743 | static void stargate2_mci_exit(struct device *dev, void *data) |
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2410.c b/arch/arm/mach-s3c24xx/clock-s3c2410.c index 34fffdf6fc1d..564553694b54 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2410.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2410.c | |||
@@ -119,66 +119,101 @@ static struct clk init_clocks_off[] = { | |||
119 | } | 119 | } |
120 | }; | 120 | }; |
121 | 121 | ||
122 | static struct clk init_clocks[] = { | 122 | static struct clk clk_lcd = { |
123 | { | 123 | .name = "lcd", |
124 | .name = "lcd", | 124 | .parent = &clk_h, |
125 | .parent = &clk_h, | 125 | .enable = s3c2410_clkcon_enable, |
126 | .enable = s3c2410_clkcon_enable, | 126 | .ctrlbit = S3C2410_CLKCON_LCDC, |
127 | .ctrlbit = S3C2410_CLKCON_LCDC, | 127 | }; |
128 | }, { | 128 | |
129 | .name = "gpio", | 129 | static struct clk clk_gpio = { |
130 | .parent = &clk_p, | 130 | .name = "gpio", |
131 | .enable = s3c2410_clkcon_enable, | 131 | .parent = &clk_p, |
132 | .ctrlbit = S3C2410_CLKCON_GPIO, | 132 | .enable = s3c2410_clkcon_enable, |
133 | }, { | 133 | .ctrlbit = S3C2410_CLKCON_GPIO, |
134 | .name = "usb-host", | 134 | }; |
135 | .parent = &clk_h, | 135 | |
136 | .enable = s3c2410_clkcon_enable, | 136 | static struct clk clk_usb_host = { |
137 | .ctrlbit = S3C2410_CLKCON_USBH, | 137 | .name = "usb-host", |
138 | }, { | 138 | .parent = &clk_h, |
139 | .name = "usb-device", | 139 | .enable = s3c2410_clkcon_enable, |
140 | .parent = &clk_h, | 140 | .ctrlbit = S3C2410_CLKCON_USBH, |
141 | .enable = s3c2410_clkcon_enable, | 141 | }; |
142 | .ctrlbit = S3C2410_CLKCON_USBD, | 142 | |
143 | }, { | 143 | static struct clk clk_usb_device = { |
144 | .name = "timers", | 144 | .name = "usb-device", |
145 | .parent = &clk_p, | 145 | .parent = &clk_h, |
146 | .enable = s3c2410_clkcon_enable, | 146 | .enable = s3c2410_clkcon_enable, |
147 | .ctrlbit = S3C2410_CLKCON_PWMT, | 147 | .ctrlbit = S3C2410_CLKCON_USBD, |
148 | }, { | 148 | }; |
149 | .name = "uart", | 149 | |
150 | .devname = "s3c2410-uart.0", | 150 | static struct clk clk_timers = { |
151 | .parent = &clk_p, | 151 | .name = "timers", |
152 | .enable = s3c2410_clkcon_enable, | 152 | .parent = &clk_p, |
153 | .ctrlbit = S3C2410_CLKCON_UART0, | 153 | .enable = s3c2410_clkcon_enable, |
154 | }, { | 154 | .ctrlbit = S3C2410_CLKCON_PWMT, |
155 | .name = "uart", | 155 | }; |
156 | .devname = "s3c2410-uart.1", | 156 | |
157 | .parent = &clk_p, | 157 | struct clk s3c24xx_clk_uart0 = { |
158 | .enable = s3c2410_clkcon_enable, | 158 | .name = "uart", |
159 | .ctrlbit = S3C2410_CLKCON_UART1, | 159 | .devname = "s3c2410-uart.0", |
160 | }, { | 160 | .parent = &clk_p, |
161 | .name = "uart", | 161 | .enable = s3c2410_clkcon_enable, |
162 | .devname = "s3c2410-uart.2", | 162 | .ctrlbit = S3C2410_CLKCON_UART0, |
163 | .parent = &clk_p, | 163 | }; |
164 | .enable = s3c2410_clkcon_enable, | 164 | |
165 | .ctrlbit = S3C2410_CLKCON_UART2, | 165 | struct clk s3c24xx_clk_uart1 = { |
166 | }, { | 166 | .name = "uart", |
167 | .name = "rtc", | 167 | .devname = "s3c2410-uart.1", |
168 | .parent = &clk_p, | 168 | .parent = &clk_p, |
169 | .enable = s3c2410_clkcon_enable, | 169 | .enable = s3c2410_clkcon_enable, |
170 | .ctrlbit = S3C2410_CLKCON_RTC, | 170 | .ctrlbit = S3C2410_CLKCON_UART1, |
171 | }, { | 171 | }; |
172 | .name = "watchdog", | 172 | |
173 | .parent = &clk_p, | 173 | struct clk s3c24xx_clk_uart2 = { |
174 | .ctrlbit = 0, | 174 | .name = "uart", |
175 | }, { | 175 | .devname = "s3c2410-uart.2", |
176 | .name = "usb-bus-host", | 176 | .parent = &clk_p, |
177 | .parent = &clk_usb_bus, | 177 | .enable = s3c2410_clkcon_enable, |
178 | }, { | 178 | .ctrlbit = S3C2410_CLKCON_UART2, |
179 | .name = "usb-bus-gadget", | 179 | }; |
180 | .parent = &clk_usb_bus, | 180 | |
181 | }, | 181 | static struct clk clk_rtc = { |
182 | .name = "rtc", | ||
183 | .parent = &clk_p, | ||
184 | .enable = s3c2410_clkcon_enable, | ||
185 | .ctrlbit = S3C2410_CLKCON_RTC, | ||
186 | }; | ||
187 | |||
188 | static struct clk clk_watchdog = { | ||
189 | .name = "watchdog", | ||
190 | .parent = &clk_p, | ||
191 | .ctrlbit = 0, | ||
192 | }; | ||
193 | |||
194 | static struct clk clk_usb_bus_host = { | ||
195 | .name = "usb-bus-host", | ||
196 | .parent = &clk_usb_bus, | ||
197 | }; | ||
198 | |||
199 | static struct clk clk_usb_bus_gadget = { | ||
200 | .name = "usb-bus-gadget", | ||
201 | .parent = &clk_usb_bus, | ||
202 | }; | ||
203 | |||
204 | static struct clk *init_clocks[] = { | ||
205 | &clk_lcd, | ||
206 | &clk_gpio, | ||
207 | &clk_usb_host, | ||
208 | &clk_usb_device, | ||
209 | &clk_timers, | ||
210 | &s3c24xx_clk_uart0, | ||
211 | &s3c24xx_clk_uart1, | ||
212 | &s3c24xx_clk_uart2, | ||
213 | &clk_rtc, | ||
214 | &clk_watchdog, | ||
215 | &clk_usb_bus_host, | ||
216 | &clk_usb_bus_gadget, | ||
182 | }; | 217 | }; |
183 | 218 | ||
184 | /* s3c2410_baseclk_add() | 219 | /* s3c2410_baseclk_add() |
@@ -195,7 +230,6 @@ int __init s3c2410_baseclk_add(void) | |||
195 | { | 230 | { |
196 | unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); | 231 | unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); |
197 | unsigned long clkcon = __raw_readl(S3C2410_CLKCON); | 232 | unsigned long clkcon = __raw_readl(S3C2410_CLKCON); |
198 | struct clk *clkp; | ||
199 | struct clk *xtal; | 233 | struct clk *xtal; |
200 | int ret; | 234 | int ret; |
201 | int ptr; | 235 | int ptr; |
@@ -207,8 +241,9 @@ int __init s3c2410_baseclk_add(void) | |||
207 | 241 | ||
208 | /* register clocks from clock array */ | 242 | /* register clocks from clock array */ |
209 | 243 | ||
210 | clkp = init_clocks; | 244 | for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++) { |
211 | for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++, clkp++) { | 245 | struct clk *clkp = init_clocks[ptr]; |
246 | |||
212 | /* ensure that we note the clock state */ | 247 | /* ensure that we note the clock state */ |
213 | 248 | ||
214 | clkp->usage = clkcon & clkp->ctrlbit ? 1 : 0; | 249 | clkp->usage = clkcon & clkp->ctrlbit ? 1 : 0; |
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2440.c b/arch/arm/mach-s3c24xx/clock-s3c2440.c index 1069b5680826..aaf006d1d6dc 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2440.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2440.c | |||
@@ -166,6 +166,9 @@ static struct clk_lookup s3c2440_clk_lookup[] = { | |||
166 | CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), | 166 | CLKDEV_INIT(NULL, "clk_uart_baud1", &s3c24xx_uclk), |
167 | CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), | 167 | CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p), |
168 | CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), | 168 | CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), |
169 | CLKDEV_INIT("s3c2440-uart.0", "uart", &s3c24xx_clk_uart0), | ||
170 | CLKDEV_INIT("s3c2440-uart.1", "uart", &s3c24xx_clk_uart1), | ||
171 | CLKDEV_INIT("s3c2440-uart.2", "uart", &s3c24xx_clk_uart2), | ||
169 | CLKDEV_INIT("s3c2440-camif", "camera", &s3c2440_clk_cam_upll), | 172 | CLKDEV_INIT("s3c2440-camif", "camera", &s3c2440_clk_cam_upll), |
170 | }; | 173 | }; |
171 | 174 | ||
diff --git a/arch/arm/mach-sti/Kconfig b/arch/arm/mach-sti/Kconfig index d04e3bfe1918..835833e3c4f8 100644 --- a/arch/arm/mach-sti/Kconfig +++ b/arch/arm/mach-sti/Kconfig | |||
@@ -11,8 +11,9 @@ menuconfig ARCH_STI | |||
11 | select HAVE_SMP | 11 | select HAVE_SMP |
12 | select HAVE_ARM_SCU if SMP | 12 | select HAVE_ARM_SCU if SMP |
13 | select ARCH_REQUIRE_GPIOLIB | 13 | select ARCH_REQUIRE_GPIOLIB |
14 | select ARM_ERRATA_720789 | ||
15 | select ARM_ERRATA_754322 | 14 | select ARM_ERRATA_754322 |
15 | select ARM_ERRATA_764369 | ||
16 | select ARM_ERRATA_775420 | ||
16 | select PL310_ERRATA_753970 if CACHE_PL310 | 17 | select PL310_ERRATA_753970 if CACHE_PL310 |
17 | select PL310_ERRATA_769419 if CACHE_PL310 | 18 | select PL310_ERRATA_769419 if CACHE_PL310 |
18 | help | 19 | help |
diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 5b799c29886e..5f252569c689 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c | |||
@@ -91,7 +91,7 @@ static void __init zynq_map_io(void) | |||
91 | zynq_scu_map_io(); | 91 | zynq_scu_map_io(); |
92 | } | 92 | } |
93 | 93 | ||
94 | static void zynq_system_reset(char mode, const char *cmd) | 94 | static void zynq_system_reset(enum reboot_mode mode, const char *cmd) |
95 | { | 95 | { |
96 | zynq_slcr_system_reset(); | 96 | zynq_slcr_system_reset(); |
97 | } | 97 | } |
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig index 3dc5cbea86cc..a5b5ff6e68d2 100644 --- a/arch/arm/plat-samsung/Kconfig +++ b/arch/arm/plat-samsung/Kconfig | |||
@@ -29,6 +29,13 @@ config PLAT_S5P | |||
29 | help | 29 | help |
30 | Base platform code for Samsung's S5P series SoC. | 30 | Base platform code for Samsung's S5P series SoC. |
31 | 31 | ||
32 | config SAMSUNG_PM | ||
33 | bool | ||
34 | depends on PM && (PLAT_S3C24XX || ARCH_S3C64XX || ARCH_S5P64X0 || S5P_PM) | ||
35 | default y | ||
36 | help | ||
37 | Base platform power management code for samsung code | ||
38 | |||
32 | if PLAT_SAMSUNG | 39 | if PLAT_SAMSUNG |
33 | 40 | ||
34 | # boot configurations | 41 | # boot configurations |
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile index 98d07d8fc7a7..199bbe304d02 100644 --- a/arch/arm/plat-samsung/Makefile +++ b/arch/arm/plat-samsung/Makefile | |||
@@ -51,7 +51,7 @@ obj-$(CONFIG_SAMSUNG_DMADEV) += dma-ops.o | |||
51 | 51 | ||
52 | # PM support | 52 | # PM support |
53 | 53 | ||
54 | obj-$(CONFIG_PM) += pm.o | 54 | obj-$(CONFIG_SAMSUNG_PM) += pm.o |
55 | obj-$(CONFIG_SAMSUNG_PM_GPIO) += pm-gpio.o | 55 | obj-$(CONFIG_SAMSUNG_PM_GPIO) += pm-gpio.o |
56 | obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o | 56 | obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o |
57 | 57 | ||
diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat-samsung/include/plat/clock.h index a62753dc15ba..df45d6edc98d 100644 --- a/arch/arm/plat-samsung/include/plat/clock.h +++ b/arch/arm/plat-samsung/include/plat/clock.h | |||
@@ -83,6 +83,11 @@ extern struct clk clk_ext; | |||
83 | extern struct clksrc_clk clk_epllref; | 83 | extern struct clksrc_clk clk_epllref; |
84 | extern struct clksrc_clk clk_esysclk; | 84 | extern struct clksrc_clk clk_esysclk; |
85 | 85 | ||
86 | /* S3C24XX UART clocks */ | ||
87 | extern struct clk s3c24xx_clk_uart0; | ||
88 | extern struct clk s3c24xx_clk_uart1; | ||
89 | extern struct clk s3c24xx_clk_uart2; | ||
90 | |||
86 | /* S3C64XX specific clocks */ | 91 | /* S3C64XX specific clocks */ |
87 | extern struct clk clk_h2; | 92 | extern struct clk clk_h2; |
88 | extern struct clk clk_27m; | 93 | extern struct clk clk_27m; |
diff --git a/arch/arm/plat-samsung/include/plat/pm.h b/arch/arm/plat-samsung/include/plat/pm.h index 5d47ca35cabd..6bc1a8f471e3 100644 --- a/arch/arm/plat-samsung/include/plat/pm.h +++ b/arch/arm/plat-samsung/include/plat/pm.h | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | struct device; | 20 | struct device; |
21 | 21 | ||
22 | #ifdef CONFIG_PM | 22 | #ifdef CONFIG_SAMSUNG_PM |
23 | 23 | ||
24 | extern __init int s3c_pm_init(void); | 24 | extern __init int s3c_pm_init(void); |
25 | extern __init int s3c64xx_pm_init(void); | 25 | extern __init int s3c64xx_pm_init(void); |
@@ -58,8 +58,6 @@ extern unsigned char pm_uart_udivslot; /* true to save UART UDIVSLOT */ | |||
58 | 58 | ||
59 | /* from sleep.S */ | 59 | /* from sleep.S */ |
60 | 60 | ||
61 | extern void s3c_cpu_resume(void); | ||
62 | |||
63 | extern int s3c2410_cpu_suspend(unsigned long); | 61 | extern int s3c2410_cpu_suspend(unsigned long); |
64 | 62 | ||
65 | /* sleep save info */ | 63 | /* sleep save info */ |
@@ -106,12 +104,14 @@ extern void s3c_pm_do_save(struct sleep_save *ptr, int count); | |||
106 | extern void s3c_pm_do_restore(struct sleep_save *ptr, int count); | 104 | extern void s3c_pm_do_restore(struct sleep_save *ptr, int count); |
107 | extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count); | 105 | extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count); |
108 | 106 | ||
109 | #ifdef CONFIG_PM | 107 | #ifdef CONFIG_SAMSUNG_PM |
110 | extern int s3c_irq_wake(struct irq_data *data, unsigned int state); | 108 | extern int s3c_irq_wake(struct irq_data *data, unsigned int state); |
111 | extern int s3c_irqext_wake(struct irq_data *data, unsigned int state); | 109 | extern int s3c_irqext_wake(struct irq_data *data, unsigned int state); |
110 | extern void s3c_cpu_resume(void); | ||
112 | #else | 111 | #else |
113 | #define s3c_irq_wake NULL | 112 | #define s3c_irq_wake NULL |
114 | #define s3c_irqext_wake NULL | 113 | #define s3c_irqext_wake NULL |
114 | #define s3c_cpu_resume NULL | ||
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | /* PM debug functions */ | 117 | /* PM debug functions */ |
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c index ea3613642451..d0c23010b693 100644 --- a/arch/arm/plat-samsung/pm.c +++ b/arch/arm/plat-samsung/pm.c | |||
@@ -80,7 +80,7 @@ unsigned char pm_uart_udivslot; | |||
80 | 80 | ||
81 | #ifdef CONFIG_SAMSUNG_PM_DEBUG | 81 | #ifdef CONFIG_SAMSUNG_PM_DEBUG |
82 | 82 | ||
83 | static struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS]; | 83 | static struct pm_uart_save uart_save; |
84 | 84 | ||
85 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) | 85 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) |
86 | { | 86 | { |
@@ -101,11 +101,7 @@ static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) | |||
101 | 101 | ||
102 | static void s3c_pm_save_uarts(void) | 102 | static void s3c_pm_save_uarts(void) |
103 | { | 103 | { |
104 | struct pm_uart_save *save = uart_save; | 104 | s3c_pm_save_uart(CONFIG_DEBUG_S3C_UART, &uart_save); |
105 | unsigned int uart; | ||
106 | |||
107 | for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++) | ||
108 | s3c_pm_save_uart(uart, save); | ||
109 | } | 105 | } |
110 | 106 | ||
111 | static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save) | 107 | static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save) |
@@ -126,11 +122,7 @@ static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save) | |||
126 | 122 | ||
127 | static void s3c_pm_restore_uarts(void) | 123 | static void s3c_pm_restore_uarts(void) |
128 | { | 124 | { |
129 | struct pm_uart_save *save = uart_save; | 125 | s3c_pm_restore_uart(CONFIG_DEBUG_S3C_UART, &uart_save); |
130 | unsigned int uart; | ||
131 | |||
132 | for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++) | ||
133 | s3c_pm_restore_uart(uart, save); | ||
134 | } | 126 | } |
135 | #else | 127 | #else |
136 | static void s3c_pm_save_uarts(void) { } | 128 | static void s3c_pm_save_uarts(void) { } |
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h index 3659e460071d..23a3c4791d86 100644 --- a/arch/arm64/include/asm/thread_info.h +++ b/arch/arm64/include/asm/thread_info.h | |||
@@ -24,10 +24,10 @@ | |||
24 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
25 | 25 | ||
26 | #ifndef CONFIG_ARM64_64K_PAGES | 26 | #ifndef CONFIG_ARM64_64K_PAGES |
27 | #define THREAD_SIZE_ORDER 1 | 27 | #define THREAD_SIZE_ORDER 2 |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #define THREAD_SIZE 8192 | 30 | #define THREAD_SIZE 16384 |
31 | #define THREAD_START_SP (THREAD_SIZE - 16) | 31 | #define THREAD_START_SP (THREAD_SIZE - 16) |
32 | 32 | ||
33 | #ifndef __ASSEMBLY__ | 33 | #ifndef __ASSEMBLY__ |
diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h index 439827271e3d..26e310c54344 100644 --- a/arch/arm64/include/asm/virt.h +++ b/arch/arm64/include/asm/virt.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #define BOOT_CPU_MODE_EL2 (0x0e12b007) | 21 | #define BOOT_CPU_MODE_EL2 (0x0e12b007) |
22 | 22 | ||
23 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
24 | #include <asm/cacheflush.h> | ||
24 | 25 | ||
25 | /* | 26 | /* |
26 | * __boot_cpu_mode records what mode CPUs were booted in. | 27 | * __boot_cpu_mode records what mode CPUs were booted in. |
@@ -36,9 +37,20 @@ extern u32 __boot_cpu_mode[2]; | |||
36 | void __hyp_set_vectors(phys_addr_t phys_vector_base); | 37 | void __hyp_set_vectors(phys_addr_t phys_vector_base); |
37 | phys_addr_t __hyp_get_vectors(void); | 38 | phys_addr_t __hyp_get_vectors(void); |
38 | 39 | ||
40 | static inline void sync_boot_mode(void) | ||
41 | { | ||
42 | /* | ||
43 | * As secondaries write to __boot_cpu_mode with caches disabled, we | ||
44 | * must flush the corresponding cache entries to ensure the visibility | ||
45 | * of their writes. | ||
46 | */ | ||
47 | __flush_dcache_area(__boot_cpu_mode, sizeof(__boot_cpu_mode)); | ||
48 | } | ||
49 | |||
39 | /* Reports the availability of HYP mode */ | 50 | /* Reports the availability of HYP mode */ |
40 | static inline bool is_hyp_mode_available(void) | 51 | static inline bool is_hyp_mode_available(void) |
41 | { | 52 | { |
53 | sync_boot_mode(); | ||
42 | return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 && | 54 | return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 && |
43 | __boot_cpu_mode[1] == BOOT_CPU_MODE_EL2); | 55 | __boot_cpu_mode[1] == BOOT_CPU_MODE_EL2); |
44 | } | 56 | } |
@@ -46,6 +58,7 @@ static inline bool is_hyp_mode_available(void) | |||
46 | /* Check if the bootloader has booted CPUs in different modes */ | 58 | /* Check if the bootloader has booted CPUs in different modes */ |
47 | static inline bool is_hyp_mode_mismatched(void) | 59 | static inline bool is_hyp_mode_mismatched(void) |
48 | { | 60 | { |
61 | sync_boot_mode(); | ||
49 | return __boot_cpu_mode[0] != __boot_cpu_mode[1]; | 62 | return __boot_cpu_mode[0] != __boot_cpu_mode[1]; |
50 | } | 63 | } |
51 | 64 | ||
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 1d1314280a03..6ad781b21c08 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S | |||
@@ -121,7 +121,7 @@ | |||
121 | 121 | ||
122 | .macro get_thread_info, rd | 122 | .macro get_thread_info, rd |
123 | mov \rd, sp | 123 | mov \rd, sp |
124 | and \rd, \rd, #~((1 << 13) - 1) // top of 8K stack | 124 | and \rd, \rd, #~(THREAD_SIZE - 1) // top of stack |
125 | .endm | 125 | .endm |
126 | 126 | ||
127 | /* | 127 | /* |
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 1788bf6b471f..57fb55c44c90 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c | |||
@@ -81,7 +81,7 @@ void soft_restart(unsigned long addr) | |||
81 | void (*pm_power_off)(void); | 81 | void (*pm_power_off)(void); |
82 | EXPORT_SYMBOL_GPL(pm_power_off); | 82 | EXPORT_SYMBOL_GPL(pm_power_off); |
83 | 83 | ||
84 | void (*arm_pm_restart)(char str, const char *cmd); | 84 | void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd); |
85 | EXPORT_SYMBOL_GPL(arm_pm_restart); | 85 | EXPORT_SYMBOL_GPL(arm_pm_restart); |
86 | 86 | ||
87 | void arch_cpu_idle_prepare(void) | 87 | void arch_cpu_idle_prepare(void) |
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index 227aca77ee1e..5da44e81dd4d 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
@@ -169,10 +169,8 @@ int acpi_create_platform_device(struct acpi_device *adev, | |||
169 | -------------------------------------------------------------------------- */ | 169 | -------------------------------------------------------------------------- */ |
170 | #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) | 170 | #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) |
171 | bool acpi_video_backlight_quirks(void); | 171 | bool acpi_video_backlight_quirks(void); |
172 | bool acpi_video_verify_backlight_support(void); | ||
173 | #else | 172 | #else |
174 | static inline bool acpi_video_backlight_quirks(void) { return false; } | 173 | static inline bool acpi_video_backlight_quirks(void) { return false; } |
175 | static inline bool acpi_video_verify_backlight_support(void) { return false; } | ||
176 | #endif | 174 | #endif |
177 | 175 | ||
178 | #endif /* _ACPI_INTERNAL_H_ */ | 176 | #endif /* _ACPI_INTERNAL_H_ */ |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 6dd237e79b4f..0ec434d2586d 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -911,7 +911,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
911 | if (acpi_video_init_brightness(device)) | 911 | if (acpi_video_init_brightness(device)) |
912 | return; | 912 | return; |
913 | 913 | ||
914 | if (acpi_video_verify_backlight_support()) { | 914 | if (acpi_video_backlight_support()) { |
915 | struct backlight_properties props; | 915 | struct backlight_properties props; |
916 | struct pci_dev *pdev; | 916 | struct pci_dev *pdev; |
917 | acpi_handle acpi_parent; | 917 | acpi_handle acpi_parent; |
@@ -1366,8 +1366,8 @@ acpi_video_switch_brightness(struct acpi_video_device *device, int event) | |||
1366 | unsigned long long level_current, level_next; | 1366 | unsigned long long level_current, level_next; |
1367 | int result = -EINVAL; | 1367 | int result = -EINVAL; |
1368 | 1368 | ||
1369 | /* no warning message if acpi_backlight=vendor or a quirk is used */ | 1369 | /* no warning message if acpi_backlight=vendor is used */ |
1370 | if (!acpi_video_verify_backlight_support()) | 1370 | if (!acpi_video_backlight_support()) |
1371 | return 0; | 1371 | return 0; |
1372 | 1372 | ||
1373 | if (!device->brightness) | 1373 | if (!device->brightness) |
@@ -1875,46 +1875,6 @@ static int acpi_video_bus_remove(struct acpi_device *device) | |||
1875 | return 0; | 1875 | return 0; |
1876 | } | 1876 | } |
1877 | 1877 | ||
1878 | static acpi_status video_unregister_backlight(acpi_handle handle, u32 lvl, | ||
1879 | void *context, void **rv) | ||
1880 | { | ||
1881 | struct acpi_device *acpi_dev; | ||
1882 | struct acpi_video_bus *video; | ||
1883 | struct acpi_video_device *dev, *next; | ||
1884 | |||
1885 | if (acpi_bus_get_device(handle, &acpi_dev)) | ||
1886 | return AE_OK; | ||
1887 | |||
1888 | if (acpi_match_device_ids(acpi_dev, video_device_ids)) | ||
1889 | return AE_OK; | ||
1890 | |||
1891 | video = acpi_driver_data(acpi_dev); | ||
1892 | if (!video) | ||
1893 | return AE_OK; | ||
1894 | |||
1895 | acpi_video_bus_stop_devices(video); | ||
1896 | mutex_lock(&video->device_list_lock); | ||
1897 | list_for_each_entry_safe(dev, next, &video->video_device_list, entry) { | ||
1898 | if (dev->backlight) { | ||
1899 | backlight_device_unregister(dev->backlight); | ||
1900 | dev->backlight = NULL; | ||
1901 | kfree(dev->brightness->levels); | ||
1902 | kfree(dev->brightness); | ||
1903 | } | ||
1904 | if (dev->cooling_dev) { | ||
1905 | sysfs_remove_link(&dev->dev->dev.kobj, | ||
1906 | "thermal_cooling"); | ||
1907 | sysfs_remove_link(&dev->cooling_dev->device.kobj, | ||
1908 | "device"); | ||
1909 | thermal_cooling_device_unregister(dev->cooling_dev); | ||
1910 | dev->cooling_dev = NULL; | ||
1911 | } | ||
1912 | } | ||
1913 | mutex_unlock(&video->device_list_lock); | ||
1914 | acpi_video_bus_start_devices(video); | ||
1915 | return AE_OK; | ||
1916 | } | ||
1917 | |||
1918 | static int __init is_i740(struct pci_dev *dev) | 1878 | static int __init is_i740(struct pci_dev *dev) |
1919 | { | 1879 | { |
1920 | if (dev->device == 0x00D1) | 1880 | if (dev->device == 0x00D1) |
@@ -1946,25 +1906,14 @@ static int __init intel_opregion_present(void) | |||
1946 | return opregion; | 1906 | return opregion; |
1947 | } | 1907 | } |
1948 | 1908 | ||
1949 | int __acpi_video_register(bool backlight_quirks) | 1909 | int acpi_video_register(void) |
1950 | { | 1910 | { |
1951 | bool no_backlight; | 1911 | int result = 0; |
1952 | int result; | ||
1953 | |||
1954 | no_backlight = backlight_quirks ? acpi_video_backlight_quirks() : false; | ||
1955 | |||
1956 | if (register_count) { | 1912 | if (register_count) { |
1957 | /* | 1913 | /* |
1958 | * If acpi_video_register() has been called already, don't try | 1914 | * if the function of acpi_video_register is already called, |
1959 | * to register acpi_video_bus, but unregister backlight devices | 1915 | * don't register the acpi_vide_bus again and return no error. |
1960 | * if no backlight support is requested. | ||
1961 | */ | 1916 | */ |
1962 | if (no_backlight) | ||
1963 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | ||
1964 | ACPI_UINT32_MAX, | ||
1965 | video_unregister_backlight, | ||
1966 | NULL, NULL, NULL); | ||
1967 | |||
1968 | return 0; | 1917 | return 0; |
1969 | } | 1918 | } |
1970 | 1919 | ||
@@ -1980,7 +1929,7 @@ int __acpi_video_register(bool backlight_quirks) | |||
1980 | 1929 | ||
1981 | return 0; | 1930 | return 0; |
1982 | } | 1931 | } |
1983 | EXPORT_SYMBOL(__acpi_video_register); | 1932 | EXPORT_SYMBOL(acpi_video_register); |
1984 | 1933 | ||
1985 | void acpi_video_unregister(void) | 1934 | void acpi_video_unregister(void) |
1986 | { | 1935 | { |
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index 826e52def080..c3397748ba46 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c | |||
@@ -238,12 +238,7 @@ static void acpi_video_caps_check(void) | |||
238 | 238 | ||
239 | bool acpi_video_backlight_quirks(void) | 239 | bool acpi_video_backlight_quirks(void) |
240 | { | 240 | { |
241 | if (acpi_gbl_osi_data >= ACPI_OSI_WIN_8) { | 241 | return acpi_gbl_osi_data >= ACPI_OSI_WIN_8; |
242 | acpi_video_caps_check(); | ||
243 | acpi_video_support |= ACPI_VIDEO_SKIP_BACKLIGHT; | ||
244 | return true; | ||
245 | } | ||
246 | return false; | ||
247 | } | 242 | } |
248 | EXPORT_SYMBOL(acpi_video_backlight_quirks); | 243 | EXPORT_SYMBOL(acpi_video_backlight_quirks); |
249 | 244 | ||
@@ -291,14 +286,6 @@ int acpi_video_backlight_support(void) | |||
291 | } | 286 | } |
292 | EXPORT_SYMBOL(acpi_video_backlight_support); | 287 | EXPORT_SYMBOL(acpi_video_backlight_support); |
293 | 288 | ||
294 | /* For the ACPI video driver use only. */ | ||
295 | bool acpi_video_verify_backlight_support(void) | ||
296 | { | ||
297 | return (acpi_video_support & ACPI_VIDEO_SKIP_BACKLIGHT) ? | ||
298 | false : acpi_video_backlight_support(); | ||
299 | } | ||
300 | EXPORT_SYMBOL(acpi_video_verify_backlight_support); | ||
301 | |||
302 | /* | 289 | /* |
303 | * Use acpi_backlight=vendor/video to force that backlight switching | 290 | * Use acpi_backlight=vendor/video to force that backlight switching |
304 | * is processed by vendor specific acpi drivers or video.ko driver. | 291 | * is processed by vendor specific acpi drivers or video.ko driver. |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 80dc988f01e4..4e737728aee2 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -97,6 +97,15 @@ config SATA_AHCI_PLATFORM | |||
97 | 97 | ||
98 | If unsure, say N. | 98 | If unsure, say N. |
99 | 99 | ||
100 | config AHCI_IMX | ||
101 | tristate "Freescale i.MX AHCI SATA support" | ||
102 | depends on SATA_AHCI_PLATFORM && MFD_SYSCON | ||
103 | help | ||
104 | This option enables support for the Freescale i.MX SoC's | ||
105 | onboard AHCI SATA. | ||
106 | |||
107 | If unsure, say N. | ||
108 | |||
100 | config SATA_FSL | 109 | config SATA_FSL |
101 | tristate "Freescale 3.0Gbps SATA support" | 110 | tristate "Freescale 3.0Gbps SATA support" |
102 | depends on FSL_SOC | 111 | depends on FSL_SOC |
@@ -107,7 +116,7 @@ config SATA_FSL | |||
107 | If unsure, say N. | 116 | If unsure, say N. |
108 | 117 | ||
109 | config SATA_INIC162X | 118 | config SATA_INIC162X |
110 | tristate "Initio 162x SATA support" | 119 | tristate "Initio 162x SATA support (Very Experimental)" |
111 | depends on PCI | 120 | depends on PCI |
112 | help | 121 | help |
113 | This option enables support for Initio 162x Serial ATA. | 122 | This option enables support for Initio 162x Serial ATA. |
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index c04d0fd038a3..46518c622460 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_SATA_INIC162X) += sata_inic162x.o | |||
10 | obj-$(CONFIG_SATA_SIL24) += sata_sil24.o | 10 | obj-$(CONFIG_SATA_SIL24) += sata_sil24.o |
11 | obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o | 11 | obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o |
12 | obj-$(CONFIG_SATA_HIGHBANK) += sata_highbank.o libahci.o | 12 | obj-$(CONFIG_SATA_HIGHBANK) += sata_highbank.o libahci.o |
13 | obj-$(CONFIG_AHCI_IMX) += ahci_imx.o | ||
13 | 14 | ||
14 | # SFF w/ custom DMA | 15 | # SFF w/ custom DMA |
15 | obj-$(CONFIG_PDC_ADMA) += pdc_adma.o | 16 | obj-$(CONFIG_PDC_ADMA) += pdc_adma.o |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 5064f3ea20f1..db4380d70031 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1146,11 +1146,18 @@ int ahci_host_activate(struct ata_host *host, int irq, unsigned int n_msis) | |||
1146 | return rc; | 1146 | return rc; |
1147 | 1147 | ||
1148 | for (i = 0; i < host->n_ports; i++) { | 1148 | for (i = 0; i < host->n_ports; i++) { |
1149 | const char* desc; | ||
1149 | struct ahci_port_priv *pp = host->ports[i]->private_data; | 1150 | struct ahci_port_priv *pp = host->ports[i]->private_data; |
1150 | 1151 | ||
1152 | /* pp is NULL for dummy ports */ | ||
1153 | if (pp) | ||
1154 | desc = pp->irq_desc; | ||
1155 | else | ||
1156 | desc = dev_driver_string(host->dev); | ||
1157 | |||
1151 | rc = devm_request_threaded_irq(host->dev, | 1158 | rc = devm_request_threaded_irq(host->dev, |
1152 | irq + i, ahci_hw_interrupt, ahci_thread_fn, IRQF_SHARED, | 1159 | irq + i, ahci_hw_interrupt, ahci_thread_fn, IRQF_SHARED, |
1153 | pp->irq_desc, host->ports[i]); | 1160 | desc, host->ports[i]); |
1154 | if (rc) | 1161 | if (rc) |
1155 | goto out_free_irqs; | 1162 | goto out_free_irqs; |
1156 | } | 1163 | } |
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c new file mode 100644 index 000000000000..58debb0acc3a --- /dev/null +++ b/drivers/ata/ahci_imx.c | |||
@@ -0,0 +1,236 @@ | |||
1 | /* | ||
2 | * Freescale IMX AHCI SATA platform driver | ||
3 | * Copyright 2013 Freescale Semiconductor, Inc. | ||
4 | * | ||
5 | * based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms and conditions of the GNU General Public License, | ||
9 | * version 2, as published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
14 | * more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along with | ||
17 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/module.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/regmap.h> | ||
24 | #include <linux/ahci_platform.h> | ||
25 | #include <linux/of_device.h> | ||
26 | #include <linux/mfd/syscon.h> | ||
27 | #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> | ||
28 | #include "ahci.h" | ||
29 | |||
30 | enum { | ||
31 | HOST_TIMER1MS = 0xe0, /* Timer 1-ms */ | ||
32 | }; | ||
33 | |||
34 | struct imx_ahci_priv { | ||
35 | struct platform_device *ahci_pdev; | ||
36 | struct clk *sata_ref_clk; | ||
37 | struct clk *ahb_clk; | ||
38 | struct regmap *gpr; | ||
39 | }; | ||
40 | |||
41 | static int imx6q_sata_init(struct device *dev, void __iomem *mmio) | ||
42 | { | ||
43 | int ret = 0; | ||
44 | unsigned int reg_val; | ||
45 | struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent); | ||
46 | |||
47 | imxpriv->gpr = | ||
48 | syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); | ||
49 | if (IS_ERR(imxpriv->gpr)) { | ||
50 | dev_err(dev, "failed to find fsl,imx6q-iomux-gpr regmap\n"); | ||
51 | return PTR_ERR(imxpriv->gpr); | ||
52 | } | ||
53 | |||
54 | ret = clk_prepare_enable(imxpriv->sata_ref_clk); | ||
55 | if (ret < 0) { | ||
56 | dev_err(dev, "prepare-enable sata_ref clock err:%d\n", ret); | ||
57 | return ret; | ||
58 | } | ||
59 | |||
60 | /* | ||
61 | * set PHY Paremeters, two steps to configure the GPR13, | ||
62 | * one write for rest of parameters, mask of first write | ||
63 | * is 0x07fffffd, and the other one write for setting | ||
64 | * the mpll_clk_en. | ||
65 | */ | ||
66 | regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK | ||
67 | | IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK | ||
68 | | IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK | ||
69 | | IMX6Q_GPR13_SATA_SPD_MODE_MASK | ||
70 | | IMX6Q_GPR13_SATA_MPLL_SS_EN | ||
71 | | IMX6Q_GPR13_SATA_TX_ATTEN_MASK | ||
72 | | IMX6Q_GPR13_SATA_TX_BOOST_MASK | ||
73 | | IMX6Q_GPR13_SATA_TX_LVL_MASK | ||
74 | | IMX6Q_GPR13_SATA_TX_EDGE_RATE | ||
75 | , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB | ||
76 | | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M | ||
77 | | IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F | ||
78 | | IMX6Q_GPR13_SATA_SPD_MODE_3P0G | ||
79 | | IMX6Q_GPR13_SATA_MPLL_SS_EN | ||
80 | | IMX6Q_GPR13_SATA_TX_ATTEN_9_16 | ||
81 | | IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB | ||
82 | | IMX6Q_GPR13_SATA_TX_LVL_1_025_V); | ||
83 | regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN, | ||
84 | IMX6Q_GPR13_SATA_MPLL_CLK_EN); | ||
85 | usleep_range(100, 200); | ||
86 | |||
87 | /* | ||
88 | * Configure the HWINIT bits of the HOST_CAP and HOST_PORTS_IMPL, | ||
89 | * and IP vendor specific register HOST_TIMER1MS. | ||
90 | * Configure CAP_SSS (support stagered spin up). | ||
91 | * Implement the port0. | ||
92 | * Get the ahb clock rate, and configure the TIMER1MS register. | ||
93 | */ | ||
94 | reg_val = readl(mmio + HOST_CAP); | ||
95 | if (!(reg_val & HOST_CAP_SSS)) { | ||
96 | reg_val |= HOST_CAP_SSS; | ||
97 | writel(reg_val, mmio + HOST_CAP); | ||
98 | } | ||
99 | reg_val = readl(mmio + HOST_PORTS_IMPL); | ||
100 | if (!(reg_val & 0x1)) { | ||
101 | reg_val |= 0x1; | ||
102 | writel(reg_val, mmio + HOST_PORTS_IMPL); | ||
103 | } | ||
104 | |||
105 | reg_val = clk_get_rate(imxpriv->ahb_clk) / 1000; | ||
106 | writel(reg_val, mmio + HOST_TIMER1MS); | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static void imx6q_sata_exit(struct device *dev) | ||
112 | { | ||
113 | struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent); | ||
114 | |||
115 | regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_MPLL_CLK_EN, | ||
116 | !IMX6Q_GPR13_SATA_MPLL_CLK_EN); | ||
117 | clk_disable_unprepare(imxpriv->sata_ref_clk); | ||
118 | } | ||
119 | |||
120 | static struct ahci_platform_data imx6q_sata_pdata = { | ||
121 | .init = imx6q_sata_init, | ||
122 | .exit = imx6q_sata_exit, | ||
123 | }; | ||
124 | |||
125 | static const struct of_device_id imx_ahci_of_match[] = { | ||
126 | { .compatible = "fsl,imx6q-ahci", .data = &imx6q_sata_pdata}, | ||
127 | {}, | ||
128 | }; | ||
129 | MODULE_DEVICE_TABLE(of, imx_ahci_of_match); | ||
130 | |||
131 | static int imx_ahci_probe(struct platform_device *pdev) | ||
132 | { | ||
133 | struct device *dev = &pdev->dev; | ||
134 | struct resource *mem, *irq, res[2]; | ||
135 | const struct of_device_id *of_id; | ||
136 | const struct ahci_platform_data *pdata = NULL; | ||
137 | struct imx_ahci_priv *imxpriv; | ||
138 | struct device *ahci_dev; | ||
139 | struct platform_device *ahci_pdev; | ||
140 | int ret; | ||
141 | |||
142 | imxpriv = devm_kzalloc(dev, sizeof(*imxpriv), GFP_KERNEL); | ||
143 | if (!imxpriv) { | ||
144 | dev_err(dev, "can't alloc ahci_host_priv\n"); | ||
145 | return -ENOMEM; | ||
146 | } | ||
147 | |||
148 | ahci_pdev = platform_device_alloc("ahci", -1); | ||
149 | if (!ahci_pdev) | ||
150 | return -ENODEV; | ||
151 | |||
152 | ahci_dev = &ahci_pdev->dev; | ||
153 | ahci_dev->parent = dev; | ||
154 | |||
155 | imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); | ||
156 | if (IS_ERR(imxpriv->ahb_clk)) { | ||
157 | dev_err(dev, "can't get ahb clock.\n"); | ||
158 | ret = PTR_ERR(imxpriv->ahb_clk); | ||
159 | goto err_out; | ||
160 | } | ||
161 | |||
162 | imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref"); | ||
163 | if (IS_ERR(imxpriv->sata_ref_clk)) { | ||
164 | dev_err(dev, "can't get sata_ref clock.\n"); | ||
165 | ret = PTR_ERR(imxpriv->sata_ref_clk); | ||
166 | goto err_out; | ||
167 | } | ||
168 | |||
169 | imxpriv->ahci_pdev = ahci_pdev; | ||
170 | platform_set_drvdata(pdev, imxpriv); | ||
171 | |||
172 | of_id = of_match_device(imx_ahci_of_match, dev); | ||
173 | if (of_id) { | ||
174 | pdata = of_id->data; | ||
175 | } else { | ||
176 | ret = -EINVAL; | ||
177 | goto err_out; | ||
178 | } | ||
179 | |||
180 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
181 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
182 | if (!mem || !irq) { | ||
183 | dev_err(dev, "no mmio/irq resource\n"); | ||
184 | ret = -ENOMEM; | ||
185 | goto err_out; | ||
186 | } | ||
187 | |||
188 | res[0] = *mem; | ||
189 | res[1] = *irq; | ||
190 | |||
191 | ahci_dev->coherent_dma_mask = DMA_BIT_MASK(32); | ||
192 | ahci_dev->dma_mask = &ahci_dev->coherent_dma_mask; | ||
193 | ahci_dev->of_node = dev->of_node; | ||
194 | |||
195 | ret = platform_device_add_resources(ahci_pdev, res, 2); | ||
196 | if (ret) | ||
197 | goto err_out; | ||
198 | |||
199 | ret = platform_device_add_data(ahci_pdev, pdata, sizeof(*pdata)); | ||
200 | if (ret) | ||
201 | goto err_out; | ||
202 | |||
203 | ret = platform_device_add(ahci_pdev); | ||
204 | if (ret) { | ||
205 | err_out: | ||
206 | platform_device_put(ahci_pdev); | ||
207 | return ret; | ||
208 | } | ||
209 | |||
210 | return 0; | ||
211 | } | ||
212 | |||
213 | static int imx_ahci_remove(struct platform_device *pdev) | ||
214 | { | ||
215 | struct imx_ahci_priv *imxpriv = platform_get_drvdata(pdev); | ||
216 | struct platform_device *ahci_pdev = imxpriv->ahci_pdev; | ||
217 | |||
218 | platform_device_unregister(ahci_pdev); | ||
219 | return 0; | ||
220 | } | ||
221 | |||
222 | static struct platform_driver imx_ahci_driver = { | ||
223 | .probe = imx_ahci_probe, | ||
224 | .remove = imx_ahci_remove, | ||
225 | .driver = { | ||
226 | .name = "ahci-imx", | ||
227 | .owner = THIS_MODULE, | ||
228 | .of_match_table = imx_ahci_of_match, | ||
229 | }, | ||
230 | }; | ||
231 | module_platform_driver(imx_ahci_driver); | ||
232 | |||
233 | MODULE_DESCRIPTION("Freescale i.MX AHCI SATA platform driver"); | ||
234 | MODULE_AUTHOR("Richard Zhu <Hong-Xing.Zhu@freescale.com>"); | ||
235 | MODULE_LICENSE("GPL"); | ||
236 | MODULE_ALIAS("ahci:imx"); | ||
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index b52a10c8eeb9..513ad7ed0c99 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -330,7 +330,7 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
330 | /* SATA Controller IDE (Wellsburg) */ | 330 | /* SATA Controller IDE (Wellsburg) */ |
331 | { 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | 331 | { 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
332 | /* SATA Controller IDE (Wellsburg) */ | 332 | /* SATA Controller IDE (Wellsburg) */ |
333 | { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 333 | { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb }, |
334 | /* SATA Controller IDE (Wellsburg) */ | 334 | /* SATA Controller IDE (Wellsburg) */ |
335 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | 335 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
336 | /* SATA Controller IDE (Wellsburg) */ | 336 | /* SATA Controller IDE (Wellsburg) */ |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 83c08907e042..b1e880a3c3da 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -206,8 +206,10 @@ static ssize_t ata_scsi_park_store(struct device *device, | |||
206 | unsigned long flags; | 206 | unsigned long flags; |
207 | int rc; | 207 | int rc; |
208 | 208 | ||
209 | rc = strict_strtol(buf, 10, &input); | 209 | rc = kstrtol(buf, 10, &input); |
210 | if (rc || input < -2) | 210 | if (rc) |
211 | return rc; | ||
212 | if (input < -2) | ||
211 | return -EINVAL; | 213 | return -EINVAL; |
212 | if (input > ATA_TMOUT_MAX_PARK) { | 214 | if (input > ATA_TMOUT_MAX_PARK) { |
213 | rc = -EOVERFLOW; | 215 | rc = -EOVERFLOW; |
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index e45131748248..5c54d957370a 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -6,6 +6,18 @@ | |||
6 | * | 6 | * |
7 | * This file is released under GPL v2. | 7 | * This file is released under GPL v2. |
8 | * | 8 | * |
9 | * **** WARNING **** | ||
10 | * | ||
11 | * This driver never worked properly and unfortunately data corruption is | ||
12 | * relatively common. There isn't anyone working on the driver and there's | ||
13 | * no support from the vendor. Do not use this driver in any production | ||
14 | * environment. | ||
15 | * | ||
16 | * http://thread.gmane.org/gmane.linux.debian.devel.bugs.rc/378525/focus=54491 | ||
17 | * https://bugzilla.kernel.org/show_bug.cgi?id=60565 | ||
18 | * | ||
19 | * ***************** | ||
20 | * | ||
9 | * This controller is eccentric and easily locks up if something isn't | 21 | * This controller is eccentric and easily locks up if something isn't |
10 | * right. Documentation is available at initio's website but it only | 22 | * right. Documentation is available at initio's website but it only |
11 | * documents registers (not programming model). | 23 | * documents registers (not programming model). |
@@ -807,6 +819,8 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
807 | 819 | ||
808 | ata_print_version_once(&pdev->dev, DRV_VERSION); | 820 | ata_print_version_once(&pdev->dev, DRV_VERSION); |
809 | 821 | ||
822 | dev_alert(&pdev->dev, "inic162x support is broken with common data corruption issues and will be disabled by default, contact linux-ide@vger.kernel.org if in production use\n"); | ||
823 | |||
810 | /* alloc host */ | 824 | /* alloc host */ |
811 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, NR_PORTS); | 825 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, NR_PORTS); |
812 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); | 826 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index b012d7600e1a..7cde885011ed 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
@@ -103,10 +103,10 @@ struct pstate_adjust_policy { | |||
103 | static struct pstate_adjust_policy default_policy = { | 103 | static struct pstate_adjust_policy default_policy = { |
104 | .sample_rate_ms = 10, | 104 | .sample_rate_ms = 10, |
105 | .deadband = 0, | 105 | .deadband = 0, |
106 | .setpoint = 109, | 106 | .setpoint = 97, |
107 | .p_gain_pct = 17, | 107 | .p_gain_pct = 20, |
108 | .d_gain_pct = 0, | 108 | .d_gain_pct = 0, |
109 | .i_gain_pct = 4, | 109 | .i_gain_pct = 0, |
110 | }; | 110 | }; |
111 | 111 | ||
112 | struct perf_limits { | 112 | struct perf_limits { |
@@ -468,12 +468,12 @@ static inline void intel_pstate_set_sample_time(struct cpudata *cpu) | |||
468 | static inline int intel_pstate_get_scaled_busy(struct cpudata *cpu) | 468 | static inline int intel_pstate_get_scaled_busy(struct cpudata *cpu) |
469 | { | 469 | { |
470 | int32_t busy_scaled; | 470 | int32_t busy_scaled; |
471 | int32_t core_busy, turbo_pstate, current_pstate; | 471 | int32_t core_busy, max_pstate, current_pstate; |
472 | 472 | ||
473 | core_busy = int_tofp(cpu->samples[cpu->sample_ptr].core_pct_busy); | 473 | core_busy = int_tofp(cpu->samples[cpu->sample_ptr].core_pct_busy); |
474 | turbo_pstate = int_tofp(cpu->pstate.turbo_pstate); | 474 | max_pstate = int_tofp(cpu->pstate.max_pstate); |
475 | current_pstate = int_tofp(cpu->pstate.current_pstate); | 475 | current_pstate = int_tofp(cpu->pstate.current_pstate); |
476 | busy_scaled = mul_fp(core_busy, div_fp(turbo_pstate, current_pstate)); | 476 | busy_scaled = mul_fp(core_busy, div_fp(max_pstate, current_pstate)); |
477 | 477 | ||
478 | return fp_toint(busy_scaled); | 478 | return fp_toint(busy_scaled); |
479 | } | 479 | } |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index b1520682cb23..66c63808fa35 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1649,7 +1649,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1649 | if (INTEL_INFO(dev)->num_pipes) { | 1649 | if (INTEL_INFO(dev)->num_pipes) { |
1650 | /* Must be done after probing outputs */ | 1650 | /* Must be done after probing outputs */ |
1651 | intel_opregion_init(dev); | 1651 | intel_opregion_init(dev); |
1652 | acpi_video_register_with_quirks(); | 1652 | acpi_video_register(); |
1653 | } | 1653 | } |
1654 | 1654 | ||
1655 | if (IS_GEN5(dev)) | 1655 | if (IS_GEN5(dev)) |
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 251784aa2225..503a414cbdad 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c | |||
@@ -29,6 +29,7 @@ static void mga_crtc_load_lut(struct drm_crtc *crtc) | |||
29 | struct mga_crtc *mga_crtc = to_mga_crtc(crtc); | 29 | struct mga_crtc *mga_crtc = to_mga_crtc(crtc); |
30 | struct drm_device *dev = crtc->dev; | 30 | struct drm_device *dev = crtc->dev; |
31 | struct mga_device *mdev = dev->dev_private; | 31 | struct mga_device *mdev = dev->dev_private; |
32 | struct drm_framebuffer *fb = crtc->fb; | ||
32 | int i; | 33 | int i; |
33 | 34 | ||
34 | if (!crtc->enabled) | 35 | if (!crtc->enabled) |
@@ -36,6 +37,28 @@ static void mga_crtc_load_lut(struct drm_crtc *crtc) | |||
36 | 37 | ||
37 | WREG8(DAC_INDEX + MGA1064_INDEX, 0); | 38 | WREG8(DAC_INDEX + MGA1064_INDEX, 0); |
38 | 39 | ||
40 | if (fb && fb->bits_per_pixel == 16) { | ||
41 | int inc = (fb->depth == 15) ? 8 : 4; | ||
42 | u8 r, b; | ||
43 | for (i = 0; i < MGAG200_LUT_SIZE; i += inc) { | ||
44 | if (fb->depth == 16) { | ||
45 | if (i > (MGAG200_LUT_SIZE >> 1)) { | ||
46 | r = b = 0; | ||
47 | } else { | ||
48 | r = mga_crtc->lut_r[i << 1]; | ||
49 | b = mga_crtc->lut_b[i << 1]; | ||
50 | } | ||
51 | } else { | ||
52 | r = mga_crtc->lut_r[i]; | ||
53 | b = mga_crtc->lut_b[i]; | ||
54 | } | ||
55 | /* VGA registers */ | ||
56 | WREG8(DAC_INDEX + MGA1064_COL_PAL, r); | ||
57 | WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_g[i]); | ||
58 | WREG8(DAC_INDEX + MGA1064_COL_PAL, b); | ||
59 | } | ||
60 | return; | ||
61 | } | ||
39 | for (i = 0; i < MGAG200_LUT_SIZE; i++) { | 62 | for (i = 0; i < MGAG200_LUT_SIZE; i++) { |
40 | /* VGA registers */ | 63 | /* VGA registers */ |
41 | WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_r[i]); | 64 | WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_r[i]); |
@@ -877,7 +900,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, | |||
877 | 900 | ||
878 | pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8); | 901 | pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8); |
879 | if (crtc->fb->bits_per_pixel == 24) | 902 | if (crtc->fb->bits_per_pixel == 24) |
880 | pitch = pitch >> (4 - bppshift); | 903 | pitch = (pitch * 3) >> (4 - bppshift); |
881 | else | 904 | else |
882 | pitch = pitch >> (4 - bppshift); | 905 | pitch = pitch >> (4 - bppshift); |
883 | 906 | ||
@@ -1251,6 +1274,24 @@ static void mga_crtc_destroy(struct drm_crtc *crtc) | |||
1251 | kfree(mga_crtc); | 1274 | kfree(mga_crtc); |
1252 | } | 1275 | } |
1253 | 1276 | ||
1277 | static void mga_crtc_disable(struct drm_crtc *crtc) | ||
1278 | { | ||
1279 | int ret; | ||
1280 | DRM_DEBUG_KMS("\n"); | ||
1281 | mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); | ||
1282 | if (crtc->fb) { | ||
1283 | struct mga_framebuffer *mga_fb = to_mga_framebuffer(crtc->fb); | ||
1284 | struct drm_gem_object *obj = mga_fb->obj; | ||
1285 | struct mgag200_bo *bo = gem_to_mga_bo(obj); | ||
1286 | ret = mgag200_bo_reserve(bo, false); | ||
1287 | if (ret) | ||
1288 | return; | ||
1289 | mgag200_bo_push_sysram(bo); | ||
1290 | mgag200_bo_unreserve(bo); | ||
1291 | } | ||
1292 | crtc->fb = NULL; | ||
1293 | } | ||
1294 | |||
1254 | /* These provide the minimum set of functions required to handle a CRTC */ | 1295 | /* These provide the minimum set of functions required to handle a CRTC */ |
1255 | static const struct drm_crtc_funcs mga_crtc_funcs = { | 1296 | static const struct drm_crtc_funcs mga_crtc_funcs = { |
1256 | .cursor_set = mga_crtc_cursor_set, | 1297 | .cursor_set = mga_crtc_cursor_set, |
@@ -1261,6 +1302,7 @@ static const struct drm_crtc_funcs mga_crtc_funcs = { | |||
1261 | }; | 1302 | }; |
1262 | 1303 | ||
1263 | static const struct drm_crtc_helper_funcs mga_helper_funcs = { | 1304 | static const struct drm_crtc_helper_funcs mga_helper_funcs = { |
1305 | .disable = mga_crtc_disable, | ||
1264 | .dpms = mga_crtc_dpms, | 1306 | .dpms = mga_crtc_dpms, |
1265 | .mode_fixup = mga_crtc_mode_fixup, | 1307 | .mode_fixup = mga_crtc_mode_fixup, |
1266 | .mode_set = mga_crtc_mode_set, | 1308 | .mode_set = mga_crtc_mode_set, |
@@ -1581,6 +1623,8 @@ static struct drm_connector *mga_vga_init(struct drm_device *dev) | |||
1581 | 1623 | ||
1582 | drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs); | 1624 | drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs); |
1583 | 1625 | ||
1626 | drm_sysfs_connector_add(connector); | ||
1627 | |||
1584 | mga_connector->i2c = mgag200_i2c_create(dev); | 1628 | mga_connector->i2c = mgag200_i2c_create(dev); |
1585 | if (!mga_connector->i2c) | 1629 | if (!mga_connector->i2c) |
1586 | DRM_ERROR("failed to add ddc bus\n"); | 1630 | DRM_ERROR("failed to add ddc bus\n"); |
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c index 3acb2b044c7b..13878d5de063 100644 --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c | |||
@@ -353,6 +353,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr) | |||
353 | bo->pin_count++; | 353 | bo->pin_count++; |
354 | if (gpu_addr) | 354 | if (gpu_addr) |
355 | *gpu_addr = mgag200_bo_gpu_offset(bo); | 355 | *gpu_addr = mgag200_bo_gpu_offset(bo); |
356 | return 0; | ||
356 | } | 357 | } |
357 | 358 | ||
358 | mgag200_ttm_placement(bo, pl_flag); | 359 | mgag200_ttm_placement(bo, pl_flag); |
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 93c2f2cceb51..eb89653a7a17 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c | |||
@@ -179,9 +179,10 @@ qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *relea | |||
179 | uint32_t type, bool interruptible) | 179 | uint32_t type, bool interruptible) |
180 | { | 180 | { |
181 | struct qxl_command cmd; | 181 | struct qxl_command cmd; |
182 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | ||
182 | 183 | ||
183 | cmd.type = type; | 184 | cmd.type = type; |
184 | cmd.data = qxl_bo_physical_address(qdev, release->bos[0], release->release_offset); | 185 | cmd.data = qxl_bo_physical_address(qdev, to_qxl_bo(entry->tv.bo), release->release_offset); |
185 | 186 | ||
186 | return qxl_ring_push(qdev->command_ring, &cmd, interruptible); | 187 | return qxl_ring_push(qdev->command_ring, &cmd, interruptible); |
187 | } | 188 | } |
@@ -191,9 +192,10 @@ qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *releas | |||
191 | uint32_t type, bool interruptible) | 192 | uint32_t type, bool interruptible) |
192 | { | 193 | { |
193 | struct qxl_command cmd; | 194 | struct qxl_command cmd; |
195 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | ||
194 | 196 | ||
195 | cmd.type = type; | 197 | cmd.type = type; |
196 | cmd.data = qxl_bo_physical_address(qdev, release->bos[0], release->release_offset); | 198 | cmd.data = qxl_bo_physical_address(qdev, to_qxl_bo(entry->tv.bo), release->release_offset); |
197 | 199 | ||
198 | return qxl_ring_push(qdev->cursor_ring, &cmd, interruptible); | 200 | return qxl_ring_push(qdev->cursor_ring, &cmd, interruptible); |
199 | } | 201 | } |
@@ -214,7 +216,6 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
214 | struct qxl_release *release; | 216 | struct qxl_release *release; |
215 | uint64_t id, next_id; | 217 | uint64_t id, next_id; |
216 | int i = 0; | 218 | int i = 0; |
217 | int ret; | ||
218 | union qxl_release_info *info; | 219 | union qxl_release_info *info; |
219 | 220 | ||
220 | while (qxl_ring_pop(qdev->release_ring, &id)) { | 221 | while (qxl_ring_pop(qdev->release_ring, &id)) { |
@@ -224,17 +225,10 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
224 | if (release == NULL) | 225 | if (release == NULL) |
225 | break; | 226 | break; |
226 | 227 | ||
227 | ret = qxl_release_reserve(qdev, release, false); | ||
228 | if (ret) { | ||
229 | qxl_io_log(qdev, "failed to reserve release on garbage collect %lld\n", id); | ||
230 | DRM_ERROR("failed to reserve release %lld\n", id); | ||
231 | } | ||
232 | |||
233 | info = qxl_release_map(qdev, release); | 228 | info = qxl_release_map(qdev, release); |
234 | next_id = info->next; | 229 | next_id = info->next; |
235 | qxl_release_unmap(qdev, release, info); | 230 | qxl_release_unmap(qdev, release, info); |
236 | 231 | ||
237 | qxl_release_unreserve(qdev, release); | ||
238 | QXL_INFO(qdev, "popped %lld, next %lld\n", id, | 232 | QXL_INFO(qdev, "popped %lld, next %lld\n", id, |
239 | next_id); | 233 | next_id); |
240 | 234 | ||
@@ -259,27 +253,29 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
259 | return i; | 253 | return i; |
260 | } | 254 | } |
261 | 255 | ||
262 | int qxl_alloc_bo_reserved(struct qxl_device *qdev, unsigned long size, | 256 | int qxl_alloc_bo_reserved(struct qxl_device *qdev, |
257 | struct qxl_release *release, | ||
258 | unsigned long size, | ||
263 | struct qxl_bo **_bo) | 259 | struct qxl_bo **_bo) |
264 | { | 260 | { |
265 | struct qxl_bo *bo; | 261 | struct qxl_bo *bo; |
266 | int ret; | 262 | int ret; |
267 | 263 | ||
268 | ret = qxl_bo_create(qdev, size, false /* not kernel - device */, | 264 | ret = qxl_bo_create(qdev, size, false /* not kernel - device */, |
269 | QXL_GEM_DOMAIN_VRAM, NULL, &bo); | 265 | false, QXL_GEM_DOMAIN_VRAM, NULL, &bo); |
270 | if (ret) { | 266 | if (ret) { |
271 | DRM_ERROR("failed to allocate VRAM BO\n"); | 267 | DRM_ERROR("failed to allocate VRAM BO\n"); |
272 | return ret; | 268 | return ret; |
273 | } | 269 | } |
274 | ret = qxl_bo_reserve(bo, false); | 270 | ret = qxl_release_list_add(release, bo); |
275 | if (unlikely(ret != 0)) | 271 | if (ret) |
276 | goto out_unref; | 272 | goto out_unref; |
277 | 273 | ||
278 | *_bo = bo; | 274 | *_bo = bo; |
279 | return 0; | 275 | return 0; |
280 | out_unref: | 276 | out_unref: |
281 | qxl_bo_unref(&bo); | 277 | qxl_bo_unref(&bo); |
282 | return 0; | 278 | return ret; |
283 | } | 279 | } |
284 | 280 | ||
285 | static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr) | 281 | static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr) |
@@ -503,6 +499,10 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev, | |||
503 | if (ret) | 499 | if (ret) |
504 | return ret; | 500 | return ret; |
505 | 501 | ||
502 | ret = qxl_release_reserve_list(release, true); | ||
503 | if (ret) | ||
504 | return ret; | ||
505 | |||
506 | cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release); | 506 | cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release); |
507 | cmd->type = QXL_SURFACE_CMD_CREATE; | 507 | cmd->type = QXL_SURFACE_CMD_CREATE; |
508 | cmd->u.surface_create.format = surf->surf.format; | 508 | cmd->u.surface_create.format = surf->surf.format; |
@@ -524,14 +524,11 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev, | |||
524 | 524 | ||
525 | surf->surf_create = release; | 525 | surf->surf_create = release; |
526 | 526 | ||
527 | /* no need to add a release to the fence for this bo, | 527 | /* no need to add a release to the fence for this surface bo, |
528 | since it is only released when we ask to destroy the surface | 528 | since it is only released when we ask to destroy the surface |
529 | and it would never signal otherwise */ | 529 | and it would never signal otherwise */ |
530 | qxl_fence_releaseable(qdev, release); | ||
531 | |||
532 | qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false); | 530 | qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false); |
533 | 531 | qxl_release_fence_buffer_objects(release); | |
534 | qxl_release_unreserve(qdev, release); | ||
535 | 532 | ||
536 | surf->hw_surf_alloc = true; | 533 | surf->hw_surf_alloc = true; |
537 | spin_lock(&qdev->surf_id_idr_lock); | 534 | spin_lock(&qdev->surf_id_idr_lock); |
@@ -573,12 +570,9 @@ int qxl_hw_surface_dealloc(struct qxl_device *qdev, | |||
573 | cmd->surface_id = id; | 570 | cmd->surface_id = id; |
574 | qxl_release_unmap(qdev, release, &cmd->release_info); | 571 | qxl_release_unmap(qdev, release, &cmd->release_info); |
575 | 572 | ||
576 | qxl_fence_releaseable(qdev, release); | ||
577 | |||
578 | qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false); | 573 | qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false); |
579 | 574 | ||
580 | qxl_release_unreserve(qdev, release); | 575 | qxl_release_fence_buffer_objects(release); |
581 | |||
582 | 576 | ||
583 | return 0; | 577 | return 0; |
584 | } | 578 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index f76f5dd7bfc4..835caba026d3 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
@@ -179,7 +179,7 @@ static void qxl_crtc_destroy(struct drm_crtc *crtc) | |||
179 | kfree(qxl_crtc); | 179 | kfree(qxl_crtc); |
180 | } | 180 | } |
181 | 181 | ||
182 | static void | 182 | static int |
183 | qxl_hide_cursor(struct qxl_device *qdev) | 183 | qxl_hide_cursor(struct qxl_device *qdev) |
184 | { | 184 | { |
185 | struct qxl_release *release; | 185 | struct qxl_release *release; |
@@ -188,14 +188,22 @@ qxl_hide_cursor(struct qxl_device *qdev) | |||
188 | 188 | ||
189 | ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, | 189 | ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, |
190 | &release, NULL); | 190 | &release, NULL); |
191 | if (ret) | ||
192 | return ret; | ||
193 | |||
194 | ret = qxl_release_reserve_list(release, true); | ||
195 | if (ret) { | ||
196 | qxl_release_free(qdev, release); | ||
197 | return ret; | ||
198 | } | ||
191 | 199 | ||
192 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); | 200 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); |
193 | cmd->type = QXL_CURSOR_HIDE; | 201 | cmd->type = QXL_CURSOR_HIDE; |
194 | qxl_release_unmap(qdev, release, &cmd->release_info); | 202 | qxl_release_unmap(qdev, release, &cmd->release_info); |
195 | 203 | ||
196 | qxl_fence_releaseable(qdev, release); | ||
197 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | 204 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); |
198 | qxl_release_unreserve(qdev, release); | 205 | qxl_release_fence_buffer_objects(release); |
206 | return 0; | ||
199 | } | 207 | } |
200 | 208 | ||
201 | static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | 209 | static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, |
@@ -216,10 +224,8 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
216 | 224 | ||
217 | int size = 64*64*4; | 225 | int size = 64*64*4; |
218 | int ret = 0; | 226 | int ret = 0; |
219 | if (!handle) { | 227 | if (!handle) |
220 | qxl_hide_cursor(qdev); | 228 | return qxl_hide_cursor(qdev); |
221 | return 0; | ||
222 | } | ||
223 | 229 | ||
224 | obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); | 230 | obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); |
225 | if (!obj) { | 231 | if (!obj) { |
@@ -234,8 +240,9 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
234 | goto out_unref; | 240 | goto out_unref; |
235 | 241 | ||
236 | ret = qxl_bo_pin(user_bo, QXL_GEM_DOMAIN_CPU, NULL); | 242 | ret = qxl_bo_pin(user_bo, QXL_GEM_DOMAIN_CPU, NULL); |
243 | qxl_bo_unreserve(user_bo); | ||
237 | if (ret) | 244 | if (ret) |
238 | goto out_unreserve; | 245 | goto out_unref; |
239 | 246 | ||
240 | ret = qxl_bo_kmap(user_bo, &user_ptr); | 247 | ret = qxl_bo_kmap(user_bo, &user_ptr); |
241 | if (ret) | 248 | if (ret) |
@@ -246,14 +253,20 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
246 | &release, NULL); | 253 | &release, NULL); |
247 | if (ret) | 254 | if (ret) |
248 | goto out_kunmap; | 255 | goto out_kunmap; |
249 | ret = qxl_alloc_bo_reserved(qdev, sizeof(struct qxl_cursor) + size, | 256 | |
250 | &cursor_bo); | 257 | ret = qxl_alloc_bo_reserved(qdev, release, sizeof(struct qxl_cursor) + size, |
258 | &cursor_bo); | ||
251 | if (ret) | 259 | if (ret) |
252 | goto out_free_release; | 260 | goto out_free_release; |
253 | ret = qxl_bo_kmap(cursor_bo, (void **)&cursor); | 261 | |
262 | ret = qxl_release_reserve_list(release, false); | ||
254 | if (ret) | 263 | if (ret) |
255 | goto out_free_bo; | 264 | goto out_free_bo; |
256 | 265 | ||
266 | ret = qxl_bo_kmap(cursor_bo, (void **)&cursor); | ||
267 | if (ret) | ||
268 | goto out_backoff; | ||
269 | |||
257 | cursor->header.unique = 0; | 270 | cursor->header.unique = 0; |
258 | cursor->header.type = SPICE_CURSOR_TYPE_ALPHA; | 271 | cursor->header.type = SPICE_CURSOR_TYPE_ALPHA; |
259 | cursor->header.width = 64; | 272 | cursor->header.width = 64; |
@@ -269,11 +282,7 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
269 | 282 | ||
270 | qxl_bo_kunmap(cursor_bo); | 283 | qxl_bo_kunmap(cursor_bo); |
271 | 284 | ||
272 | /* finish with the userspace bo */ | ||
273 | qxl_bo_kunmap(user_bo); | 285 | qxl_bo_kunmap(user_bo); |
274 | qxl_bo_unpin(user_bo); | ||
275 | qxl_bo_unreserve(user_bo); | ||
276 | drm_gem_object_unreference_unlocked(obj); | ||
277 | 286 | ||
278 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); | 287 | cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); |
279 | cmd->type = QXL_CURSOR_SET; | 288 | cmd->type = QXL_CURSOR_SET; |
@@ -281,30 +290,35 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, | |||
281 | cmd->u.set.position.y = qcrtc->cur_y; | 290 | cmd->u.set.position.y = qcrtc->cur_y; |
282 | 291 | ||
283 | cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); | 292 | cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); |
284 | qxl_release_add_res(qdev, release, cursor_bo); | ||
285 | 293 | ||
286 | cmd->u.set.visible = 1; | 294 | cmd->u.set.visible = 1; |
287 | qxl_release_unmap(qdev, release, &cmd->release_info); | 295 | qxl_release_unmap(qdev, release, &cmd->release_info); |
288 | 296 | ||
289 | qxl_fence_releaseable(qdev, release); | ||
290 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | 297 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); |
291 | qxl_release_unreserve(qdev, release); | 298 | qxl_release_fence_buffer_objects(release); |
299 | |||
300 | /* finish with the userspace bo */ | ||
301 | ret = qxl_bo_reserve(user_bo, false); | ||
302 | if (!ret) { | ||
303 | qxl_bo_unpin(user_bo); | ||
304 | qxl_bo_unreserve(user_bo); | ||
305 | } | ||
306 | drm_gem_object_unreference_unlocked(obj); | ||
292 | 307 | ||
293 | qxl_bo_unreserve(cursor_bo); | ||
294 | qxl_bo_unref(&cursor_bo); | 308 | qxl_bo_unref(&cursor_bo); |
295 | 309 | ||
296 | return ret; | 310 | return ret; |
311 | |||
312 | out_backoff: | ||
313 | qxl_release_backoff_reserve_list(release); | ||
297 | out_free_bo: | 314 | out_free_bo: |
298 | qxl_bo_unref(&cursor_bo); | 315 | qxl_bo_unref(&cursor_bo); |
299 | out_free_release: | 316 | out_free_release: |
300 | qxl_release_unreserve(qdev, release); | ||
301 | qxl_release_free(qdev, release); | 317 | qxl_release_free(qdev, release); |
302 | out_kunmap: | 318 | out_kunmap: |
303 | qxl_bo_kunmap(user_bo); | 319 | qxl_bo_kunmap(user_bo); |
304 | out_unpin: | 320 | out_unpin: |
305 | qxl_bo_unpin(user_bo); | 321 | qxl_bo_unpin(user_bo); |
306 | out_unreserve: | ||
307 | qxl_bo_unreserve(user_bo); | ||
308 | out_unref: | 322 | out_unref: |
309 | drm_gem_object_unreference_unlocked(obj); | 323 | drm_gem_object_unreference_unlocked(obj); |
310 | return ret; | 324 | return ret; |
@@ -322,6 +336,14 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc, | |||
322 | 336 | ||
323 | ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, | 337 | ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, |
324 | &release, NULL); | 338 | &release, NULL); |
339 | if (ret) | ||
340 | return ret; | ||
341 | |||
342 | ret = qxl_release_reserve_list(release, true); | ||
343 | if (ret) { | ||
344 | qxl_release_free(qdev, release); | ||
345 | return ret; | ||
346 | } | ||
325 | 347 | ||
326 | qcrtc->cur_x = x; | 348 | qcrtc->cur_x = x; |
327 | qcrtc->cur_y = y; | 349 | qcrtc->cur_y = y; |
@@ -332,9 +354,9 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc, | |||
332 | cmd->u.position.y = qcrtc->cur_y; | 354 | cmd->u.position.y = qcrtc->cur_y; |
333 | qxl_release_unmap(qdev, release, &cmd->release_info); | 355 | qxl_release_unmap(qdev, release, &cmd->release_info); |
334 | 356 | ||
335 | qxl_fence_releaseable(qdev, release); | ||
336 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | 357 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); |
337 | qxl_release_unreserve(qdev, release); | 358 | qxl_release_fence_buffer_objects(release); |
359 | |||
338 | return 0; | 360 | return 0; |
339 | } | 361 | } |
340 | 362 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_draw.c b/drivers/gpu/drm/qxl/qxl_draw.c index 3c8c3dbf9378..56e1d633875e 100644 --- a/drivers/gpu/drm/qxl/qxl_draw.c +++ b/drivers/gpu/drm/qxl/qxl_draw.c | |||
@@ -23,25 +23,29 @@ | |||
23 | #include "qxl_drv.h" | 23 | #include "qxl_drv.h" |
24 | #include "qxl_object.h" | 24 | #include "qxl_object.h" |
25 | 25 | ||
26 | static int alloc_clips(struct qxl_device *qdev, | ||
27 | struct qxl_release *release, | ||
28 | unsigned num_clips, | ||
29 | struct qxl_bo **clips_bo) | ||
30 | { | ||
31 | int size = sizeof(struct qxl_clip_rects) + sizeof(struct qxl_rect) * num_clips; | ||
32 | |||
33 | return qxl_alloc_bo_reserved(qdev, release, size, clips_bo); | ||
34 | } | ||
35 | |||
26 | /* returns a pointer to the already allocated qxl_rect array inside | 36 | /* returns a pointer to the already allocated qxl_rect array inside |
27 | * the qxl_clip_rects. This is *not* the same as the memory allocated | 37 | * the qxl_clip_rects. This is *not* the same as the memory allocated |
28 | * on the device, it is offset to qxl_clip_rects.chunk.data */ | 38 | * on the device, it is offset to qxl_clip_rects.chunk.data */ |
29 | static struct qxl_rect *drawable_set_clipping(struct qxl_device *qdev, | 39 | static struct qxl_rect *drawable_set_clipping(struct qxl_device *qdev, |
30 | struct qxl_drawable *drawable, | 40 | struct qxl_drawable *drawable, |
31 | unsigned num_clips, | 41 | unsigned num_clips, |
32 | struct qxl_bo **clips_bo, | 42 | struct qxl_bo *clips_bo) |
33 | struct qxl_release *release) | ||
34 | { | 43 | { |
35 | struct qxl_clip_rects *dev_clips; | 44 | struct qxl_clip_rects *dev_clips; |
36 | int ret; | 45 | int ret; |
37 | int size = sizeof(*dev_clips) + sizeof(struct qxl_rect) * num_clips; | ||
38 | ret = qxl_alloc_bo_reserved(qdev, size, clips_bo); | ||
39 | if (ret) | ||
40 | return NULL; | ||
41 | 46 | ||
42 | ret = qxl_bo_kmap(*clips_bo, (void **)&dev_clips); | 47 | ret = qxl_bo_kmap(clips_bo, (void **)&dev_clips); |
43 | if (ret) { | 48 | if (ret) { |
44 | qxl_bo_unref(clips_bo); | ||
45 | return NULL; | 49 | return NULL; |
46 | } | 50 | } |
47 | dev_clips->num_rects = num_clips; | 51 | dev_clips->num_rects = num_clips; |
@@ -52,20 +56,34 @@ static struct qxl_rect *drawable_set_clipping(struct qxl_device *qdev, | |||
52 | } | 56 | } |
53 | 57 | ||
54 | static int | 58 | static int |
59 | alloc_drawable(struct qxl_device *qdev, struct qxl_release **release) | ||
60 | { | ||
61 | int ret; | ||
62 | ret = qxl_alloc_release_reserved(qdev, sizeof(struct qxl_drawable), | ||
63 | QXL_RELEASE_DRAWABLE, release, | ||
64 | NULL); | ||
65 | return ret; | ||
66 | } | ||
67 | |||
68 | static void | ||
69 | free_drawable(struct qxl_device *qdev, struct qxl_release *release) | ||
70 | { | ||
71 | qxl_release_free(qdev, release); | ||
72 | } | ||
73 | |||
74 | /* release needs to be reserved at this point */ | ||
75 | static int | ||
55 | make_drawable(struct qxl_device *qdev, int surface, uint8_t type, | 76 | make_drawable(struct qxl_device *qdev, int surface, uint8_t type, |
56 | const struct qxl_rect *rect, | 77 | const struct qxl_rect *rect, |
57 | struct qxl_release **release) | 78 | struct qxl_release *release) |
58 | { | 79 | { |
59 | struct qxl_drawable *drawable; | 80 | struct qxl_drawable *drawable; |
60 | int i, ret; | 81 | int i; |
61 | 82 | ||
62 | ret = qxl_alloc_release_reserved(qdev, sizeof(*drawable), | 83 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); |
63 | QXL_RELEASE_DRAWABLE, release, | 84 | if (!drawable) |
64 | NULL); | 85 | return -ENOMEM; |
65 | if (ret) | ||
66 | return ret; | ||
67 | 86 | ||
68 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, *release); | ||
69 | drawable->type = type; | 87 | drawable->type = type; |
70 | 88 | ||
71 | drawable->surface_id = surface; /* Only primary for now */ | 89 | drawable->surface_id = surface; /* Only primary for now */ |
@@ -91,14 +109,23 @@ make_drawable(struct qxl_device *qdev, int surface, uint8_t type, | |||
91 | drawable->bbox = *rect; | 109 | drawable->bbox = *rect; |
92 | 110 | ||
93 | drawable->mm_time = qdev->rom->mm_clock; | 111 | drawable->mm_time = qdev->rom->mm_clock; |
94 | qxl_release_unmap(qdev, *release, &drawable->release_info); | 112 | qxl_release_unmap(qdev, release, &drawable->release_info); |
95 | return 0; | 113 | return 0; |
96 | } | 114 | } |
97 | 115 | ||
98 | static int qxl_palette_create_1bit(struct qxl_bo **palette_bo, | 116 | static int alloc_palette_object(struct qxl_device *qdev, |
117 | struct qxl_release *release, | ||
118 | struct qxl_bo **palette_bo) | ||
119 | { | ||
120 | return qxl_alloc_bo_reserved(qdev, release, | ||
121 | sizeof(struct qxl_palette) + sizeof(uint32_t) * 2, | ||
122 | palette_bo); | ||
123 | } | ||
124 | |||
125 | static int qxl_palette_create_1bit(struct qxl_bo *palette_bo, | ||
126 | struct qxl_release *release, | ||
99 | const struct qxl_fb_image *qxl_fb_image) | 127 | const struct qxl_fb_image *qxl_fb_image) |
100 | { | 128 | { |
101 | struct qxl_device *qdev = qxl_fb_image->qdev; | ||
102 | const struct fb_image *fb_image = &qxl_fb_image->fb_image; | 129 | const struct fb_image *fb_image = &qxl_fb_image->fb_image; |
103 | uint32_t visual = qxl_fb_image->visual; | 130 | uint32_t visual = qxl_fb_image->visual; |
104 | const uint32_t *pseudo_palette = qxl_fb_image->pseudo_palette; | 131 | const uint32_t *pseudo_palette = qxl_fb_image->pseudo_palette; |
@@ -108,12 +135,7 @@ static int qxl_palette_create_1bit(struct qxl_bo **palette_bo, | |||
108 | static uint64_t unique; /* we make no attempt to actually set this | 135 | static uint64_t unique; /* we make no attempt to actually set this |
109 | * correctly globaly, since that would require | 136 | * correctly globaly, since that would require |
110 | * tracking all of our palettes. */ | 137 | * tracking all of our palettes. */ |
111 | 138 | ret = qxl_bo_kmap(palette_bo, (void **)&pal); | |
112 | ret = qxl_alloc_bo_reserved(qdev, | ||
113 | sizeof(struct qxl_palette) + sizeof(uint32_t) * 2, | ||
114 | palette_bo); | ||
115 | |||
116 | ret = qxl_bo_kmap(*palette_bo, (void **)&pal); | ||
117 | pal->num_ents = 2; | 139 | pal->num_ents = 2; |
118 | pal->unique = unique++; | 140 | pal->unique = unique++; |
119 | if (visual == FB_VISUAL_TRUECOLOR || visual == FB_VISUAL_DIRECTCOLOR) { | 141 | if (visual == FB_VISUAL_TRUECOLOR || visual == FB_VISUAL_DIRECTCOLOR) { |
@@ -126,7 +148,7 @@ static int qxl_palette_create_1bit(struct qxl_bo **palette_bo, | |||
126 | } | 148 | } |
127 | pal->ents[0] = bgcolor; | 149 | pal->ents[0] = bgcolor; |
128 | pal->ents[1] = fgcolor; | 150 | pal->ents[1] = fgcolor; |
129 | qxl_bo_kunmap(*palette_bo); | 151 | qxl_bo_kunmap(palette_bo); |
130 | return 0; | 152 | return 0; |
131 | } | 153 | } |
132 | 154 | ||
@@ -144,44 +166,63 @@ void qxl_draw_opaque_fb(const struct qxl_fb_image *qxl_fb_image, | |||
144 | const char *src = fb_image->data; | 166 | const char *src = fb_image->data; |
145 | int depth = fb_image->depth; | 167 | int depth = fb_image->depth; |
146 | struct qxl_release *release; | 168 | struct qxl_release *release; |
147 | struct qxl_bo *image_bo; | ||
148 | struct qxl_image *image; | 169 | struct qxl_image *image; |
149 | int ret; | 170 | int ret; |
150 | 171 | struct qxl_drm_image *dimage; | |
172 | struct qxl_bo *palette_bo = NULL; | ||
151 | if (stride == 0) | 173 | if (stride == 0) |
152 | stride = depth * width / 8; | 174 | stride = depth * width / 8; |
153 | 175 | ||
176 | ret = alloc_drawable(qdev, &release); | ||
177 | if (ret) | ||
178 | return; | ||
179 | |||
180 | ret = qxl_image_alloc_objects(qdev, release, | ||
181 | &dimage, | ||
182 | height, stride); | ||
183 | if (ret) | ||
184 | goto out_free_drawable; | ||
185 | |||
186 | if (depth == 1) { | ||
187 | ret = alloc_palette_object(qdev, release, &palette_bo); | ||
188 | if (ret) | ||
189 | goto out_free_image; | ||
190 | } | ||
191 | |||
192 | /* do a reservation run over all the objects we just allocated */ | ||
193 | ret = qxl_release_reserve_list(release, true); | ||
194 | if (ret) | ||
195 | goto out_free_palette; | ||
196 | |||
154 | rect.left = x; | 197 | rect.left = x; |
155 | rect.right = x + width; | 198 | rect.right = x + width; |
156 | rect.top = y; | 199 | rect.top = y; |
157 | rect.bottom = y + height; | 200 | rect.bottom = y + height; |
158 | 201 | ||
159 | ret = make_drawable(qdev, 0, QXL_DRAW_COPY, &rect, &release); | 202 | ret = make_drawable(qdev, 0, QXL_DRAW_COPY, &rect, release); |
160 | if (ret) | 203 | if (ret) { |
161 | return; | 204 | qxl_release_backoff_reserve_list(release); |
205 | goto out_free_palette; | ||
206 | } | ||
162 | 207 | ||
163 | ret = qxl_image_create(qdev, release, &image_bo, | 208 | ret = qxl_image_init(qdev, release, dimage, |
164 | (const uint8_t *)src, 0, 0, | 209 | (const uint8_t *)src, 0, 0, |
165 | width, height, depth, stride); | 210 | width, height, depth, stride); |
166 | if (ret) { | 211 | if (ret) { |
167 | qxl_release_unreserve(qdev, release); | 212 | qxl_release_backoff_reserve_list(release); |
168 | qxl_release_free(qdev, release); | 213 | qxl_release_free(qdev, release); |
169 | return; | 214 | return; |
170 | } | 215 | } |
171 | 216 | ||
172 | if (depth == 1) { | 217 | if (depth == 1) { |
173 | struct qxl_bo *palette_bo; | ||
174 | void *ptr; | 218 | void *ptr; |
175 | ret = qxl_palette_create_1bit(&palette_bo, qxl_fb_image); | 219 | ret = qxl_palette_create_1bit(palette_bo, release, qxl_fb_image); |
176 | qxl_release_add_res(qdev, release, palette_bo); | ||
177 | 220 | ||
178 | ptr = qxl_bo_kmap_atomic_page(qdev, image_bo, 0); | 221 | ptr = qxl_bo_kmap_atomic_page(qdev, dimage->bo, 0); |
179 | image = ptr; | 222 | image = ptr; |
180 | image->u.bitmap.palette = | 223 | image->u.bitmap.palette = |
181 | qxl_bo_physical_address(qdev, palette_bo, 0); | 224 | qxl_bo_physical_address(qdev, palette_bo, 0); |
182 | qxl_bo_kunmap_atomic_page(qdev, image_bo, ptr); | 225 | qxl_bo_kunmap_atomic_page(qdev, dimage->bo, ptr); |
183 | qxl_bo_unreserve(palette_bo); | ||
184 | qxl_bo_unref(&palette_bo); | ||
185 | } | 226 | } |
186 | 227 | ||
187 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); | 228 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); |
@@ -199,16 +240,20 @@ void qxl_draw_opaque_fb(const struct qxl_fb_image *qxl_fb_image, | |||
199 | drawable->u.copy.mask.bitmap = 0; | 240 | drawable->u.copy.mask.bitmap = 0; |
200 | 241 | ||
201 | drawable->u.copy.src_bitmap = | 242 | drawable->u.copy.src_bitmap = |
202 | qxl_bo_physical_address(qdev, image_bo, 0); | 243 | qxl_bo_physical_address(qdev, dimage->bo, 0); |
203 | qxl_release_unmap(qdev, release, &drawable->release_info); | 244 | qxl_release_unmap(qdev, release, &drawable->release_info); |
204 | 245 | ||
205 | qxl_release_add_res(qdev, release, image_bo); | ||
206 | qxl_bo_unreserve(image_bo); | ||
207 | qxl_bo_unref(&image_bo); | ||
208 | |||
209 | qxl_fence_releaseable(qdev, release); | ||
210 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); | 246 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); |
211 | qxl_release_unreserve(qdev, release); | 247 | qxl_release_fence_buffer_objects(release); |
248 | |||
249 | out_free_palette: | ||
250 | if (palette_bo) | ||
251 | qxl_bo_unref(&palette_bo); | ||
252 | out_free_image: | ||
253 | qxl_image_free_objects(qdev, dimage); | ||
254 | out_free_drawable: | ||
255 | if (ret) | ||
256 | free_drawable(qdev, release); | ||
212 | } | 257 | } |
213 | 258 | ||
214 | /* push a draw command using the given clipping rectangles as | 259 | /* push a draw command using the given clipping rectangles as |
@@ -243,10 +288,14 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev, | |||
243 | int depth = qxl_fb->base.bits_per_pixel; | 288 | int depth = qxl_fb->base.bits_per_pixel; |
244 | uint8_t *surface_base; | 289 | uint8_t *surface_base; |
245 | struct qxl_release *release; | 290 | struct qxl_release *release; |
246 | struct qxl_bo *image_bo; | ||
247 | struct qxl_bo *clips_bo; | 291 | struct qxl_bo *clips_bo; |
292 | struct qxl_drm_image *dimage; | ||
248 | int ret; | 293 | int ret; |
249 | 294 | ||
295 | ret = alloc_drawable(qdev, &release); | ||
296 | if (ret) | ||
297 | return; | ||
298 | |||
250 | left = clips->x1; | 299 | left = clips->x1; |
251 | right = clips->x2; | 300 | right = clips->x2; |
252 | top = clips->y1; | 301 | top = clips->y1; |
@@ -263,36 +312,52 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev, | |||
263 | 312 | ||
264 | width = right - left; | 313 | width = right - left; |
265 | height = bottom - top; | 314 | height = bottom - top; |
315 | |||
316 | ret = alloc_clips(qdev, release, num_clips, &clips_bo); | ||
317 | if (ret) | ||
318 | goto out_free_drawable; | ||
319 | |||
320 | ret = qxl_image_alloc_objects(qdev, release, | ||
321 | &dimage, | ||
322 | height, stride); | ||
323 | if (ret) | ||
324 | goto out_free_clips; | ||
325 | |||
326 | /* do a reservation run over all the objects we just allocated */ | ||
327 | ret = qxl_release_reserve_list(release, true); | ||
328 | if (ret) | ||
329 | goto out_free_image; | ||
330 | |||
266 | drawable_rect.left = left; | 331 | drawable_rect.left = left; |
267 | drawable_rect.right = right; | 332 | drawable_rect.right = right; |
268 | drawable_rect.top = top; | 333 | drawable_rect.top = top; |
269 | drawable_rect.bottom = bottom; | 334 | drawable_rect.bottom = bottom; |
335 | |||
270 | ret = make_drawable(qdev, 0, QXL_DRAW_COPY, &drawable_rect, | 336 | ret = make_drawable(qdev, 0, QXL_DRAW_COPY, &drawable_rect, |
271 | &release); | 337 | release); |
272 | if (ret) | 338 | if (ret) |
273 | return; | 339 | goto out_release_backoff; |
274 | 340 | ||
275 | ret = qxl_bo_kmap(bo, (void **)&surface_base); | 341 | ret = qxl_bo_kmap(bo, (void **)&surface_base); |
276 | if (ret) | 342 | if (ret) |
277 | goto out_unref; | 343 | goto out_release_backoff; |
278 | 344 | ||
279 | ret = qxl_image_create(qdev, release, &image_bo, surface_base, | 345 | |
280 | left, top, width, height, depth, stride); | 346 | ret = qxl_image_init(qdev, release, dimage, surface_base, |
347 | left, top, width, height, depth, stride); | ||
281 | qxl_bo_kunmap(bo); | 348 | qxl_bo_kunmap(bo); |
282 | if (ret) | 349 | if (ret) |
283 | goto out_unref; | 350 | goto out_release_backoff; |
351 | |||
352 | rects = drawable_set_clipping(qdev, drawable, num_clips, clips_bo); | ||
353 | if (!rects) | ||
354 | goto out_release_backoff; | ||
284 | 355 | ||
285 | rects = drawable_set_clipping(qdev, drawable, num_clips, &clips_bo, release); | ||
286 | if (!rects) { | ||
287 | qxl_bo_unref(&image_bo); | ||
288 | goto out_unref; | ||
289 | } | ||
290 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); | 356 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); |
291 | 357 | ||
292 | drawable->clip.type = SPICE_CLIP_TYPE_RECTS; | 358 | drawable->clip.type = SPICE_CLIP_TYPE_RECTS; |
293 | drawable->clip.data = qxl_bo_physical_address(qdev, | 359 | drawable->clip.data = qxl_bo_physical_address(qdev, |
294 | clips_bo, 0); | 360 | clips_bo, 0); |
295 | qxl_release_add_res(qdev, release, clips_bo); | ||
296 | 361 | ||
297 | drawable->u.copy.src_area.top = 0; | 362 | drawable->u.copy.src_area.top = 0; |
298 | drawable->u.copy.src_area.bottom = height; | 363 | drawable->u.copy.src_area.bottom = height; |
@@ -306,11 +371,9 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev, | |||
306 | drawable->u.copy.mask.pos.y = 0; | 371 | drawable->u.copy.mask.pos.y = 0; |
307 | drawable->u.copy.mask.bitmap = 0; | 372 | drawable->u.copy.mask.bitmap = 0; |
308 | 373 | ||
309 | drawable->u.copy.src_bitmap = qxl_bo_physical_address(qdev, image_bo, 0); | 374 | drawable->u.copy.src_bitmap = qxl_bo_physical_address(qdev, dimage->bo, 0); |
310 | qxl_release_unmap(qdev, release, &drawable->release_info); | 375 | qxl_release_unmap(qdev, release, &drawable->release_info); |
311 | qxl_release_add_res(qdev, release, image_bo); | 376 | |
312 | qxl_bo_unreserve(image_bo); | ||
313 | qxl_bo_unref(&image_bo); | ||
314 | clips_ptr = clips; | 377 | clips_ptr = clips; |
315 | for (i = 0; i < num_clips; i++, clips_ptr += inc) { | 378 | for (i = 0; i < num_clips; i++, clips_ptr += inc) { |
316 | rects[i].left = clips_ptr->x1; | 379 | rects[i].left = clips_ptr->x1; |
@@ -319,17 +382,22 @@ void qxl_draw_dirty_fb(struct qxl_device *qdev, | |||
319 | rects[i].bottom = clips_ptr->y2; | 382 | rects[i].bottom = clips_ptr->y2; |
320 | } | 383 | } |
321 | qxl_bo_kunmap(clips_bo); | 384 | qxl_bo_kunmap(clips_bo); |
322 | qxl_bo_unreserve(clips_bo); | ||
323 | qxl_bo_unref(&clips_bo); | ||
324 | 385 | ||
325 | qxl_fence_releaseable(qdev, release); | ||
326 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); | 386 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); |
327 | qxl_release_unreserve(qdev, release); | 387 | qxl_release_fence_buffer_objects(release); |
328 | return; | 388 | |
389 | out_release_backoff: | ||
390 | if (ret) | ||
391 | qxl_release_backoff_reserve_list(release); | ||
392 | out_free_image: | ||
393 | qxl_image_free_objects(qdev, dimage); | ||
394 | out_free_clips: | ||
395 | qxl_bo_unref(&clips_bo); | ||
396 | out_free_drawable: | ||
397 | /* only free drawable on error */ | ||
398 | if (ret) | ||
399 | free_drawable(qdev, release); | ||
329 | 400 | ||
330 | out_unref: | ||
331 | qxl_release_unreserve(qdev, release); | ||
332 | qxl_release_free(qdev, release); | ||
333 | } | 401 | } |
334 | 402 | ||
335 | void qxl_draw_copyarea(struct qxl_device *qdev, | 403 | void qxl_draw_copyarea(struct qxl_device *qdev, |
@@ -342,22 +410,36 @@ void qxl_draw_copyarea(struct qxl_device *qdev, | |||
342 | struct qxl_release *release; | 410 | struct qxl_release *release; |
343 | int ret; | 411 | int ret; |
344 | 412 | ||
413 | ret = alloc_drawable(qdev, &release); | ||
414 | if (ret) | ||
415 | return; | ||
416 | |||
417 | /* do a reservation run over all the objects we just allocated */ | ||
418 | ret = qxl_release_reserve_list(release, true); | ||
419 | if (ret) | ||
420 | goto out_free_release; | ||
421 | |||
345 | rect.left = dx; | 422 | rect.left = dx; |
346 | rect.top = dy; | 423 | rect.top = dy; |
347 | rect.right = dx + width; | 424 | rect.right = dx + width; |
348 | rect.bottom = dy + height; | 425 | rect.bottom = dy + height; |
349 | ret = make_drawable(qdev, 0, QXL_COPY_BITS, &rect, &release); | 426 | ret = make_drawable(qdev, 0, QXL_COPY_BITS, &rect, release); |
350 | if (ret) | 427 | if (ret) { |
351 | return; | 428 | qxl_release_backoff_reserve_list(release); |
429 | goto out_free_release; | ||
430 | } | ||
352 | 431 | ||
353 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); | 432 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); |
354 | drawable->u.copy_bits.src_pos.x = sx; | 433 | drawable->u.copy_bits.src_pos.x = sx; |
355 | drawable->u.copy_bits.src_pos.y = sy; | 434 | drawable->u.copy_bits.src_pos.y = sy; |
356 | |||
357 | qxl_release_unmap(qdev, release, &drawable->release_info); | 435 | qxl_release_unmap(qdev, release, &drawable->release_info); |
358 | qxl_fence_releaseable(qdev, release); | 436 | |
359 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); | 437 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); |
360 | qxl_release_unreserve(qdev, release); | 438 | qxl_release_fence_buffer_objects(release); |
439 | |||
440 | out_free_release: | ||
441 | if (ret) | ||
442 | free_drawable(qdev, release); | ||
361 | } | 443 | } |
362 | 444 | ||
363 | void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec) | 445 | void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec) |
@@ -370,10 +452,21 @@ void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec) | |||
370 | struct qxl_release *release; | 452 | struct qxl_release *release; |
371 | int ret; | 453 | int ret; |
372 | 454 | ||
373 | ret = make_drawable(qdev, 0, QXL_DRAW_FILL, &rect, &release); | 455 | ret = alloc_drawable(qdev, &release); |
374 | if (ret) | 456 | if (ret) |
375 | return; | 457 | return; |
376 | 458 | ||
459 | /* do a reservation run over all the objects we just allocated */ | ||
460 | ret = qxl_release_reserve_list(release, true); | ||
461 | if (ret) | ||
462 | goto out_free_release; | ||
463 | |||
464 | ret = make_drawable(qdev, 0, QXL_DRAW_FILL, &rect, release); | ||
465 | if (ret) { | ||
466 | qxl_release_backoff_reserve_list(release); | ||
467 | goto out_free_release; | ||
468 | } | ||
469 | |||
377 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); | 470 | drawable = (struct qxl_drawable *)qxl_release_map(qdev, release); |
378 | drawable->u.fill.brush.type = SPICE_BRUSH_TYPE_SOLID; | 471 | drawable->u.fill.brush.type = SPICE_BRUSH_TYPE_SOLID; |
379 | drawable->u.fill.brush.u.color = color; | 472 | drawable->u.fill.brush.u.color = color; |
@@ -384,7 +477,11 @@ void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec) | |||
384 | drawable->u.fill.mask.bitmap = 0; | 477 | drawable->u.fill.mask.bitmap = 0; |
385 | 478 | ||
386 | qxl_release_unmap(qdev, release, &drawable->release_info); | 479 | qxl_release_unmap(qdev, release, &drawable->release_info); |
387 | qxl_fence_releaseable(qdev, release); | 480 | |
388 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); | 481 | qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false); |
389 | qxl_release_unreserve(qdev, release); | 482 | qxl_release_fence_buffer_objects(release); |
483 | |||
484 | out_free_release: | ||
485 | if (ret) | ||
486 | free_drawable(qdev, release); | ||
390 | } | 487 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index aacb791464a3..7e96f4f11738 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
@@ -42,6 +42,9 @@ | |||
42 | #include <ttm/ttm_placement.h> | 42 | #include <ttm/ttm_placement.h> |
43 | #include <ttm/ttm_module.h> | 43 | #include <ttm/ttm_module.h> |
44 | 44 | ||
45 | /* just for ttm_validate_buffer */ | ||
46 | #include <ttm/ttm_execbuf_util.h> | ||
47 | |||
45 | #include <drm/qxl_drm.h> | 48 | #include <drm/qxl_drm.h> |
46 | #include "qxl_dev.h" | 49 | #include "qxl_dev.h" |
47 | 50 | ||
@@ -118,9 +121,9 @@ struct qxl_bo { | |||
118 | uint32_t surface_id; | 121 | uint32_t surface_id; |
119 | struct qxl_fence fence; /* per bo fence - list of releases */ | 122 | struct qxl_fence fence; /* per bo fence - list of releases */ |
120 | struct qxl_release *surf_create; | 123 | struct qxl_release *surf_create; |
121 | atomic_t reserve_count; | ||
122 | }; | 124 | }; |
123 | #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base) | 125 | #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base) |
126 | #define to_qxl_bo(tobj) container_of((tobj), struct qxl_bo, tbo) | ||
124 | 127 | ||
125 | struct qxl_gem { | 128 | struct qxl_gem { |
126 | struct mutex mutex; | 129 | struct mutex mutex; |
@@ -128,12 +131,7 @@ struct qxl_gem { | |||
128 | }; | 131 | }; |
129 | 132 | ||
130 | struct qxl_bo_list { | 133 | struct qxl_bo_list { |
131 | struct list_head lhead; | 134 | struct ttm_validate_buffer tv; |
132 | struct qxl_bo *bo; | ||
133 | }; | ||
134 | |||
135 | struct qxl_reloc_list { | ||
136 | struct list_head bos; | ||
137 | }; | 135 | }; |
138 | 136 | ||
139 | struct qxl_crtc { | 137 | struct qxl_crtc { |
@@ -195,10 +193,20 @@ enum { | |||
195 | struct qxl_release { | 193 | struct qxl_release { |
196 | int id; | 194 | int id; |
197 | int type; | 195 | int type; |
198 | int bo_count; | ||
199 | uint32_t release_offset; | 196 | uint32_t release_offset; |
200 | uint32_t surface_release_id; | 197 | uint32_t surface_release_id; |
201 | struct qxl_bo *bos[QXL_MAX_RES]; | 198 | struct ww_acquire_ctx ticket; |
199 | struct list_head bos; | ||
200 | }; | ||
201 | |||
202 | struct qxl_drm_chunk { | ||
203 | struct list_head head; | ||
204 | struct qxl_bo *bo; | ||
205 | }; | ||
206 | |||
207 | struct qxl_drm_image { | ||
208 | struct qxl_bo *bo; | ||
209 | struct list_head chunk_list; | ||
202 | }; | 210 | }; |
203 | 211 | ||
204 | struct qxl_fb_image { | 212 | struct qxl_fb_image { |
@@ -314,6 +322,7 @@ struct qxl_device { | |||
314 | struct workqueue_struct *gc_queue; | 322 | struct workqueue_struct *gc_queue; |
315 | struct work_struct gc_work; | 323 | struct work_struct gc_work; |
316 | 324 | ||
325 | struct work_struct fb_work; | ||
317 | }; | 326 | }; |
318 | 327 | ||
319 | /* forward declaration for QXL_INFO_IO */ | 328 | /* forward declaration for QXL_INFO_IO */ |
@@ -433,12 +442,19 @@ int qxl_mmap(struct file *filp, struct vm_area_struct *vma); | |||
433 | 442 | ||
434 | /* qxl image */ | 443 | /* qxl image */ |
435 | 444 | ||
436 | int qxl_image_create(struct qxl_device *qdev, | 445 | int qxl_image_init(struct qxl_device *qdev, |
437 | struct qxl_release *release, | 446 | struct qxl_release *release, |
438 | struct qxl_bo **image_bo, | 447 | struct qxl_drm_image *dimage, |
439 | const uint8_t *data, | 448 | const uint8_t *data, |
440 | int x, int y, int width, int height, | 449 | int x, int y, int width, int height, |
441 | int depth, int stride); | 450 | int depth, int stride); |
451 | int | ||
452 | qxl_image_alloc_objects(struct qxl_device *qdev, | ||
453 | struct qxl_release *release, | ||
454 | struct qxl_drm_image **image_ptr, | ||
455 | int height, int stride); | ||
456 | void qxl_image_free_objects(struct qxl_device *qdev, struct qxl_drm_image *dimage); | ||
457 | |||
442 | void qxl_update_screen(struct qxl_device *qxl); | 458 | void qxl_update_screen(struct qxl_device *qxl); |
443 | 459 | ||
444 | /* qxl io operations (qxl_cmd.c) */ | 460 | /* qxl io operations (qxl_cmd.c) */ |
@@ -459,20 +475,15 @@ int qxl_ring_push(struct qxl_ring *ring, const void *new_elt, bool interruptible | |||
459 | void qxl_io_flush_release(struct qxl_device *qdev); | 475 | void qxl_io_flush_release(struct qxl_device *qdev); |
460 | void qxl_io_flush_surfaces(struct qxl_device *qdev); | 476 | void qxl_io_flush_surfaces(struct qxl_device *qdev); |
461 | 477 | ||
462 | int qxl_release_reserve(struct qxl_device *qdev, | ||
463 | struct qxl_release *release, bool no_wait); | ||
464 | void qxl_release_unreserve(struct qxl_device *qdev, | ||
465 | struct qxl_release *release); | ||
466 | union qxl_release_info *qxl_release_map(struct qxl_device *qdev, | 478 | union qxl_release_info *qxl_release_map(struct qxl_device *qdev, |
467 | struct qxl_release *release); | 479 | struct qxl_release *release); |
468 | void qxl_release_unmap(struct qxl_device *qdev, | 480 | void qxl_release_unmap(struct qxl_device *qdev, |
469 | struct qxl_release *release, | 481 | struct qxl_release *release, |
470 | union qxl_release_info *info); | 482 | union qxl_release_info *info); |
471 | /* | 483 | int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo); |
472 | * qxl_bo_add_resource. | 484 | int qxl_release_reserve_list(struct qxl_release *release, bool no_intr); |
473 | * | 485 | void qxl_release_backoff_reserve_list(struct qxl_release *release); |
474 | */ | 486 | void qxl_release_fence_buffer_objects(struct qxl_release *release); |
475 | void qxl_bo_add_resource(struct qxl_bo *main_bo, struct qxl_bo *resource); | ||
476 | 487 | ||
477 | int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, | 488 | int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, |
478 | enum qxl_surface_cmd_type surface_cmd_type, | 489 | enum qxl_surface_cmd_type surface_cmd_type, |
@@ -481,15 +492,16 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, | |||
481 | int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | 492 | int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, |
482 | int type, struct qxl_release **release, | 493 | int type, struct qxl_release **release, |
483 | struct qxl_bo **rbo); | 494 | struct qxl_bo **rbo); |
484 | int qxl_fence_releaseable(struct qxl_device *qdev, | 495 | |
485 | struct qxl_release *release); | ||
486 | int | 496 | int |
487 | qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release, | 497 | qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release, |
488 | uint32_t type, bool interruptible); | 498 | uint32_t type, bool interruptible); |
489 | int | 499 | int |
490 | qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release, | 500 | qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release, |
491 | uint32_t type, bool interruptible); | 501 | uint32_t type, bool interruptible); |
492 | int qxl_alloc_bo_reserved(struct qxl_device *qdev, unsigned long size, | 502 | int qxl_alloc_bo_reserved(struct qxl_device *qdev, |
503 | struct qxl_release *release, | ||
504 | unsigned long size, | ||
493 | struct qxl_bo **_bo); | 505 | struct qxl_bo **_bo); |
494 | /* qxl drawing commands */ | 506 | /* qxl drawing commands */ |
495 | 507 | ||
@@ -510,15 +522,9 @@ void qxl_draw_copyarea(struct qxl_device *qdev, | |||
510 | u32 sx, u32 sy, | 522 | u32 sx, u32 sy, |
511 | u32 dx, u32 dy); | 523 | u32 dx, u32 dy); |
512 | 524 | ||
513 | uint64_t | ||
514 | qxl_release_alloc(struct qxl_device *qdev, int type, | ||
515 | struct qxl_release **ret); | ||
516 | |||
517 | void qxl_release_free(struct qxl_device *qdev, | 525 | void qxl_release_free(struct qxl_device *qdev, |
518 | struct qxl_release *release); | 526 | struct qxl_release *release); |
519 | void qxl_release_add_res(struct qxl_device *qdev, | 527 | |
520 | struct qxl_release *release, | ||
521 | struct qxl_bo *bo); | ||
522 | /* used by qxl_debugfs_release */ | 528 | /* used by qxl_debugfs_release */ |
523 | struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, | 529 | struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, |
524 | uint64_t id); | 530 | uint64_t id); |
@@ -561,7 +567,7 @@ void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freein | |||
561 | int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf); | 567 | int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf); |
562 | 568 | ||
563 | /* qxl_fence.c */ | 569 | /* qxl_fence.c */ |
564 | int qxl_fence_add_release(struct qxl_fence *qfence, uint32_t rel_id); | 570 | void qxl_fence_add_release_locked(struct qxl_fence *qfence, uint32_t rel_id); |
565 | int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id); | 571 | int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id); |
566 | int qxl_fence_init(struct qxl_device *qdev, struct qxl_fence *qfence); | 572 | int qxl_fence_init(struct qxl_device *qdev, struct qxl_fence *qfence); |
567 | void qxl_fence_fini(struct qxl_fence *qfence); | 573 | void qxl_fence_fini(struct qxl_fence *qfence); |
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 76f39d88d684..88722f233430 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c | |||
@@ -37,12 +37,29 @@ | |||
37 | 37 | ||
38 | #define QXL_DIRTY_DELAY (HZ / 30) | 38 | #define QXL_DIRTY_DELAY (HZ / 30) |
39 | 39 | ||
40 | #define QXL_FB_OP_FILLRECT 1 | ||
41 | #define QXL_FB_OP_COPYAREA 2 | ||
42 | #define QXL_FB_OP_IMAGEBLIT 3 | ||
43 | |||
44 | struct qxl_fb_op { | ||
45 | struct list_head head; | ||
46 | int op_type; | ||
47 | union { | ||
48 | struct fb_fillrect fr; | ||
49 | struct fb_copyarea ca; | ||
50 | struct fb_image ib; | ||
51 | } op; | ||
52 | void *img_data; | ||
53 | }; | ||
54 | |||
40 | struct qxl_fbdev { | 55 | struct qxl_fbdev { |
41 | struct drm_fb_helper helper; | 56 | struct drm_fb_helper helper; |
42 | struct qxl_framebuffer qfb; | 57 | struct qxl_framebuffer qfb; |
43 | struct list_head fbdev_list; | 58 | struct list_head fbdev_list; |
44 | struct qxl_device *qdev; | 59 | struct qxl_device *qdev; |
45 | 60 | ||
61 | spinlock_t delayed_ops_lock; | ||
62 | struct list_head delayed_ops; | ||
46 | void *shadow; | 63 | void *shadow; |
47 | int size; | 64 | int size; |
48 | 65 | ||
@@ -164,8 +181,69 @@ static struct fb_deferred_io qxl_defio = { | |||
164 | .deferred_io = qxl_deferred_io, | 181 | .deferred_io = qxl_deferred_io, |
165 | }; | 182 | }; |
166 | 183 | ||
167 | static void qxl_fb_fillrect(struct fb_info *info, | 184 | static void qxl_fb_delayed_fillrect(struct qxl_fbdev *qfbdev, |
168 | const struct fb_fillrect *fb_rect) | 185 | const struct fb_fillrect *fb_rect) |
186 | { | ||
187 | struct qxl_fb_op *op; | ||
188 | unsigned long flags; | ||
189 | |||
190 | op = kmalloc(sizeof(struct qxl_fb_op), GFP_ATOMIC | __GFP_NOWARN); | ||
191 | if (!op) | ||
192 | return; | ||
193 | |||
194 | op->op.fr = *fb_rect; | ||
195 | op->img_data = NULL; | ||
196 | op->op_type = QXL_FB_OP_FILLRECT; | ||
197 | |||
198 | spin_lock_irqsave(&qfbdev->delayed_ops_lock, flags); | ||
199 | list_add_tail(&op->head, &qfbdev->delayed_ops); | ||
200 | spin_unlock_irqrestore(&qfbdev->delayed_ops_lock, flags); | ||
201 | } | ||
202 | |||
203 | static void qxl_fb_delayed_copyarea(struct qxl_fbdev *qfbdev, | ||
204 | const struct fb_copyarea *fb_copy) | ||
205 | { | ||
206 | struct qxl_fb_op *op; | ||
207 | unsigned long flags; | ||
208 | |||
209 | op = kmalloc(sizeof(struct qxl_fb_op), GFP_ATOMIC | __GFP_NOWARN); | ||
210 | if (!op) | ||
211 | return; | ||
212 | |||
213 | op->op.ca = *fb_copy; | ||
214 | op->img_data = NULL; | ||
215 | op->op_type = QXL_FB_OP_COPYAREA; | ||
216 | |||
217 | spin_lock_irqsave(&qfbdev->delayed_ops_lock, flags); | ||
218 | list_add_tail(&op->head, &qfbdev->delayed_ops); | ||
219 | spin_unlock_irqrestore(&qfbdev->delayed_ops_lock, flags); | ||
220 | } | ||
221 | |||
222 | static void qxl_fb_delayed_imageblit(struct qxl_fbdev *qfbdev, | ||
223 | const struct fb_image *fb_image) | ||
224 | { | ||
225 | struct qxl_fb_op *op; | ||
226 | unsigned long flags; | ||
227 | uint32_t size = fb_image->width * fb_image->height * (fb_image->depth >= 8 ? fb_image->depth / 8 : 1); | ||
228 | |||
229 | op = kmalloc(sizeof(struct qxl_fb_op) + size, GFP_ATOMIC | __GFP_NOWARN); | ||
230 | if (!op) | ||
231 | return; | ||
232 | |||
233 | op->op.ib = *fb_image; | ||
234 | op->img_data = (void *)(op + 1); | ||
235 | op->op_type = QXL_FB_OP_IMAGEBLIT; | ||
236 | |||
237 | memcpy(op->img_data, fb_image->data, size); | ||
238 | |||
239 | op->op.ib.data = op->img_data; | ||
240 | spin_lock_irqsave(&qfbdev->delayed_ops_lock, flags); | ||
241 | list_add_tail(&op->head, &qfbdev->delayed_ops); | ||
242 | spin_unlock_irqrestore(&qfbdev->delayed_ops_lock, flags); | ||
243 | } | ||
244 | |||
245 | static void qxl_fb_fillrect_internal(struct fb_info *info, | ||
246 | const struct fb_fillrect *fb_rect) | ||
169 | { | 247 | { |
170 | struct qxl_fbdev *qfbdev = info->par; | 248 | struct qxl_fbdev *qfbdev = info->par; |
171 | struct qxl_device *qdev = qfbdev->qdev; | 249 | struct qxl_device *qdev = qfbdev->qdev; |
@@ -203,17 +281,28 @@ static void qxl_fb_fillrect(struct fb_info *info, | |||
203 | qxl_draw_fill_rec.rect = rect; | 281 | qxl_draw_fill_rec.rect = rect; |
204 | qxl_draw_fill_rec.color = color; | 282 | qxl_draw_fill_rec.color = color; |
205 | qxl_draw_fill_rec.rop = rop; | 283 | qxl_draw_fill_rec.rop = rop; |
284 | |||
285 | qxl_draw_fill(&qxl_draw_fill_rec); | ||
286 | } | ||
287 | |||
288 | static void qxl_fb_fillrect(struct fb_info *info, | ||
289 | const struct fb_fillrect *fb_rect) | ||
290 | { | ||
291 | struct qxl_fbdev *qfbdev = info->par; | ||
292 | struct qxl_device *qdev = qfbdev->qdev; | ||
293 | |||
206 | if (!drm_can_sleep()) { | 294 | if (!drm_can_sleep()) { |
207 | qxl_io_log(qdev, | 295 | qxl_fb_delayed_fillrect(qfbdev, fb_rect); |
208 | "%s: TODO use RCU, mysterious locks with spin_lock\n", | 296 | schedule_work(&qdev->fb_work); |
209 | __func__); | ||
210 | return; | 297 | return; |
211 | } | 298 | } |
212 | qxl_draw_fill(&qxl_draw_fill_rec); | 299 | /* make sure any previous work is done */ |
300 | flush_work(&qdev->fb_work); | ||
301 | qxl_fb_fillrect_internal(info, fb_rect); | ||
213 | } | 302 | } |
214 | 303 | ||
215 | static void qxl_fb_copyarea(struct fb_info *info, | 304 | static void qxl_fb_copyarea_internal(struct fb_info *info, |
216 | const struct fb_copyarea *region) | 305 | const struct fb_copyarea *region) |
217 | { | 306 | { |
218 | struct qxl_fbdev *qfbdev = info->par; | 307 | struct qxl_fbdev *qfbdev = info->par; |
219 | 308 | ||
@@ -223,37 +312,89 @@ static void qxl_fb_copyarea(struct fb_info *info, | |||
223 | region->dx, region->dy); | 312 | region->dx, region->dy); |
224 | } | 313 | } |
225 | 314 | ||
315 | static void qxl_fb_copyarea(struct fb_info *info, | ||
316 | const struct fb_copyarea *region) | ||
317 | { | ||
318 | struct qxl_fbdev *qfbdev = info->par; | ||
319 | struct qxl_device *qdev = qfbdev->qdev; | ||
320 | |||
321 | if (!drm_can_sleep()) { | ||
322 | qxl_fb_delayed_copyarea(qfbdev, region); | ||
323 | schedule_work(&qdev->fb_work); | ||
324 | return; | ||
325 | } | ||
326 | /* make sure any previous work is done */ | ||
327 | flush_work(&qdev->fb_work); | ||
328 | qxl_fb_copyarea_internal(info, region); | ||
329 | } | ||
330 | |||
226 | static void qxl_fb_imageblit_safe(struct qxl_fb_image *qxl_fb_image) | 331 | static void qxl_fb_imageblit_safe(struct qxl_fb_image *qxl_fb_image) |
227 | { | 332 | { |
228 | qxl_draw_opaque_fb(qxl_fb_image, 0); | 333 | qxl_draw_opaque_fb(qxl_fb_image, 0); |
229 | } | 334 | } |
230 | 335 | ||
336 | static void qxl_fb_imageblit_internal(struct fb_info *info, | ||
337 | const struct fb_image *image) | ||
338 | { | ||
339 | struct qxl_fbdev *qfbdev = info->par; | ||
340 | struct qxl_fb_image qxl_fb_image; | ||
341 | |||
342 | /* ensure proper order rendering operations - TODO: must do this | ||
343 | * for everything. */ | ||
344 | qxl_fb_image_init(&qxl_fb_image, qfbdev->qdev, info, image); | ||
345 | qxl_fb_imageblit_safe(&qxl_fb_image); | ||
346 | } | ||
347 | |||
231 | static void qxl_fb_imageblit(struct fb_info *info, | 348 | static void qxl_fb_imageblit(struct fb_info *info, |
232 | const struct fb_image *image) | 349 | const struct fb_image *image) |
233 | { | 350 | { |
234 | struct qxl_fbdev *qfbdev = info->par; | 351 | struct qxl_fbdev *qfbdev = info->par; |
235 | struct qxl_device *qdev = qfbdev->qdev; | 352 | struct qxl_device *qdev = qfbdev->qdev; |
236 | struct qxl_fb_image qxl_fb_image; | ||
237 | 353 | ||
238 | if (!drm_can_sleep()) { | 354 | if (!drm_can_sleep()) { |
239 | /* we cannot do any ttm_bo allocation since that will fail on | 355 | qxl_fb_delayed_imageblit(qfbdev, image); |
240 | * ioremap_wc..__get_vm_area_node, so queue the work item | 356 | schedule_work(&qdev->fb_work); |
241 | * instead This can happen from printk inside an interrupt | ||
242 | * context, i.e.: smp_apic_timer_interrupt..check_cpu_stall */ | ||
243 | qxl_io_log(qdev, | ||
244 | "%s: TODO use RCU, mysterious locks with spin_lock\n", | ||
245 | __func__); | ||
246 | return; | 357 | return; |
247 | } | 358 | } |
359 | /* make sure any previous work is done */ | ||
360 | flush_work(&qdev->fb_work); | ||
361 | qxl_fb_imageblit_internal(info, image); | ||
362 | } | ||
248 | 363 | ||
249 | /* ensure proper order of rendering operations - TODO: must do this | 364 | static void qxl_fb_work(struct work_struct *work) |
250 | * for everything. */ | 365 | { |
251 | qxl_fb_image_init(&qxl_fb_image, qfbdev->qdev, info, image); | 366 | struct qxl_device *qdev = container_of(work, struct qxl_device, fb_work); |
252 | qxl_fb_imageblit_safe(&qxl_fb_image); | 367 | unsigned long flags; |
368 | struct qxl_fb_op *entry, *tmp; | ||
369 | struct qxl_fbdev *qfbdev = qdev->mode_info.qfbdev; | ||
370 | |||
371 | /* since the irq context just adds entries to the end of the | ||
372 | list dropping the lock should be fine, as entry isn't modified | ||
373 | in the operation code */ | ||
374 | spin_lock_irqsave(&qfbdev->delayed_ops_lock, flags); | ||
375 | list_for_each_entry_safe(entry, tmp, &qfbdev->delayed_ops, head) { | ||
376 | spin_unlock_irqrestore(&qfbdev->delayed_ops_lock, flags); | ||
377 | switch (entry->op_type) { | ||
378 | case QXL_FB_OP_FILLRECT: | ||
379 | qxl_fb_fillrect_internal(qfbdev->helper.fbdev, &entry->op.fr); | ||
380 | break; | ||
381 | case QXL_FB_OP_COPYAREA: | ||
382 | qxl_fb_copyarea_internal(qfbdev->helper.fbdev, &entry->op.ca); | ||
383 | break; | ||
384 | case QXL_FB_OP_IMAGEBLIT: | ||
385 | qxl_fb_imageblit_internal(qfbdev->helper.fbdev, &entry->op.ib); | ||
386 | break; | ||
387 | } | ||
388 | spin_lock_irqsave(&qfbdev->delayed_ops_lock, flags); | ||
389 | list_del(&entry->head); | ||
390 | kfree(entry); | ||
391 | } | ||
392 | spin_unlock_irqrestore(&qfbdev->delayed_ops_lock, flags); | ||
253 | } | 393 | } |
254 | 394 | ||
255 | int qxl_fb_init(struct qxl_device *qdev) | 395 | int qxl_fb_init(struct qxl_device *qdev) |
256 | { | 396 | { |
397 | INIT_WORK(&qdev->fb_work, qxl_fb_work); | ||
257 | return 0; | 398 | return 0; |
258 | } | 399 | } |
259 | 400 | ||
@@ -536,7 +677,8 @@ int qxl_fbdev_init(struct qxl_device *qdev) | |||
536 | qfbdev->qdev = qdev; | 677 | qfbdev->qdev = qdev; |
537 | qdev->mode_info.qfbdev = qfbdev; | 678 | qdev->mode_info.qfbdev = qfbdev; |
538 | qfbdev->helper.funcs = &qxl_fb_helper_funcs; | 679 | qfbdev->helper.funcs = &qxl_fb_helper_funcs; |
539 | 680 | spin_lock_init(&qfbdev->delayed_ops_lock); | |
681 | INIT_LIST_HEAD(&qfbdev->delayed_ops); | ||
540 | ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, | 682 | ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, |
541 | qxl_num_crtc /* num_crtc - QXL supports just 1 */, | 683 | qxl_num_crtc /* num_crtc - QXL supports just 1 */, |
542 | QXLFB_CONN_LIMIT); | 684 | QXLFB_CONN_LIMIT); |
diff --git a/drivers/gpu/drm/qxl/qxl_fence.c b/drivers/gpu/drm/qxl/qxl_fence.c index 63c6715ad385..ae59e91cfb9a 100644 --- a/drivers/gpu/drm/qxl/qxl_fence.c +++ b/drivers/gpu/drm/qxl/qxl_fence.c | |||
@@ -49,17 +49,11 @@ | |||
49 | 49 | ||
50 | For some reason every so often qxl hw fails to release, things go wrong. | 50 | For some reason every so often qxl hw fails to release, things go wrong. |
51 | */ | 51 | */ |
52 | 52 | /* must be called with the fence lock held */ | |
53 | 53 | void qxl_fence_add_release_locked(struct qxl_fence *qfence, uint32_t rel_id) | |
54 | int qxl_fence_add_release(struct qxl_fence *qfence, uint32_t rel_id) | ||
55 | { | 54 | { |
56 | struct qxl_bo *bo = container_of(qfence, struct qxl_bo, fence); | ||
57 | |||
58 | spin_lock(&bo->tbo.bdev->fence_lock); | ||
59 | radix_tree_insert(&qfence->tree, rel_id, qfence); | 55 | radix_tree_insert(&qfence->tree, rel_id, qfence); |
60 | qfence->num_active_releases++; | 56 | qfence->num_active_releases++; |
61 | spin_unlock(&bo->tbo.bdev->fence_lock); | ||
62 | return 0; | ||
63 | } | 57 | } |
64 | 58 | ||
65 | int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id) | 59 | int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id) |
diff --git a/drivers/gpu/drm/qxl/qxl_gem.c b/drivers/gpu/drm/qxl/qxl_gem.c index a235693aabba..25e1777fb0a2 100644 --- a/drivers/gpu/drm/qxl/qxl_gem.c +++ b/drivers/gpu/drm/qxl/qxl_gem.c | |||
@@ -55,7 +55,7 @@ int qxl_gem_object_create(struct qxl_device *qdev, int size, | |||
55 | /* At least align on page size */ | 55 | /* At least align on page size */ |
56 | if (alignment < PAGE_SIZE) | 56 | if (alignment < PAGE_SIZE) |
57 | alignment = PAGE_SIZE; | 57 | alignment = PAGE_SIZE; |
58 | r = qxl_bo_create(qdev, size, kernel, initial_domain, surf, &qbo); | 58 | r = qxl_bo_create(qdev, size, kernel, false, initial_domain, surf, &qbo); |
59 | if (r) { | 59 | if (r) { |
60 | if (r != -ERESTARTSYS) | 60 | if (r != -ERESTARTSYS) |
61 | DRM_ERROR( | 61 | DRM_ERROR( |
diff --git a/drivers/gpu/drm/qxl/qxl_image.c b/drivers/gpu/drm/qxl/qxl_image.c index cf856206996b..7fbcc35e8ad3 100644 --- a/drivers/gpu/drm/qxl/qxl_image.c +++ b/drivers/gpu/drm/qxl/qxl_image.c | |||
@@ -30,31 +30,100 @@ | |||
30 | #include "qxl_object.h" | 30 | #include "qxl_object.h" |
31 | 31 | ||
32 | static int | 32 | static int |
33 | qxl_image_create_helper(struct qxl_device *qdev, | 33 | qxl_allocate_chunk(struct qxl_device *qdev, |
34 | struct qxl_release *release, | ||
35 | struct qxl_drm_image *image, | ||
36 | unsigned int chunk_size) | ||
37 | { | ||
38 | struct qxl_drm_chunk *chunk; | ||
39 | int ret; | ||
40 | |||
41 | chunk = kmalloc(sizeof(struct qxl_drm_chunk), GFP_KERNEL); | ||
42 | if (!chunk) | ||
43 | return -ENOMEM; | ||
44 | |||
45 | ret = qxl_alloc_bo_reserved(qdev, release, chunk_size, &chunk->bo); | ||
46 | if (ret) { | ||
47 | kfree(chunk); | ||
48 | return ret; | ||
49 | } | ||
50 | |||
51 | list_add_tail(&chunk->head, &image->chunk_list); | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | int | ||
56 | qxl_image_alloc_objects(struct qxl_device *qdev, | ||
34 | struct qxl_release *release, | 57 | struct qxl_release *release, |
35 | struct qxl_bo **image_bo, | 58 | struct qxl_drm_image **image_ptr, |
36 | const uint8_t *data, | 59 | int height, int stride) |
37 | int width, int height, | 60 | { |
38 | int depth, unsigned int hash, | 61 | struct qxl_drm_image *image; |
39 | int stride) | 62 | int ret; |
63 | |||
64 | image = kmalloc(sizeof(struct qxl_drm_image), GFP_KERNEL); | ||
65 | if (!image) | ||
66 | return -ENOMEM; | ||
67 | |||
68 | INIT_LIST_HEAD(&image->chunk_list); | ||
69 | |||
70 | ret = qxl_alloc_bo_reserved(qdev, release, sizeof(struct qxl_image), &image->bo); | ||
71 | if (ret) { | ||
72 | kfree(image); | ||
73 | return ret; | ||
74 | } | ||
75 | |||
76 | ret = qxl_allocate_chunk(qdev, release, image, sizeof(struct qxl_data_chunk) + stride * height); | ||
77 | if (ret) { | ||
78 | qxl_bo_unref(&image->bo); | ||
79 | kfree(image); | ||
80 | return ret; | ||
81 | } | ||
82 | *image_ptr = image; | ||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | void qxl_image_free_objects(struct qxl_device *qdev, struct qxl_drm_image *dimage) | ||
40 | { | 87 | { |
88 | struct qxl_drm_chunk *chunk, *tmp; | ||
89 | |||
90 | list_for_each_entry_safe(chunk, tmp, &dimage->chunk_list, head) { | ||
91 | qxl_bo_unref(&chunk->bo); | ||
92 | kfree(chunk); | ||
93 | } | ||
94 | |||
95 | qxl_bo_unref(&dimage->bo); | ||
96 | kfree(dimage); | ||
97 | } | ||
98 | |||
99 | static int | ||
100 | qxl_image_init_helper(struct qxl_device *qdev, | ||
101 | struct qxl_release *release, | ||
102 | struct qxl_drm_image *dimage, | ||
103 | const uint8_t *data, | ||
104 | int width, int height, | ||
105 | int depth, unsigned int hash, | ||
106 | int stride) | ||
107 | { | ||
108 | struct qxl_drm_chunk *drv_chunk; | ||
41 | struct qxl_image *image; | 109 | struct qxl_image *image; |
42 | struct qxl_data_chunk *chunk; | 110 | struct qxl_data_chunk *chunk; |
43 | int i; | 111 | int i; |
44 | int chunk_stride; | 112 | int chunk_stride; |
45 | int linesize = width * depth / 8; | 113 | int linesize = width * depth / 8; |
46 | struct qxl_bo *chunk_bo; | 114 | struct qxl_bo *chunk_bo, *image_bo; |
47 | int ret; | ||
48 | void *ptr; | 115 | void *ptr; |
49 | /* Chunk */ | 116 | /* Chunk */ |
50 | /* FIXME: Check integer overflow */ | 117 | /* FIXME: Check integer overflow */ |
51 | /* TODO: variable number of chunks */ | 118 | /* TODO: variable number of chunks */ |
119 | |||
120 | drv_chunk = list_first_entry(&dimage->chunk_list, struct qxl_drm_chunk, head); | ||
121 | |||
122 | chunk_bo = drv_chunk->bo; | ||
52 | chunk_stride = stride; /* TODO: should use linesize, but it renders | 123 | chunk_stride = stride; /* TODO: should use linesize, but it renders |
53 | wrong (check the bitmaps are sent correctly | 124 | wrong (check the bitmaps are sent correctly |
54 | first) */ | 125 | first) */ |
55 | ret = qxl_alloc_bo_reserved(qdev, sizeof(*chunk) + height * chunk_stride, | 126 | |
56 | &chunk_bo); | ||
57 | |||
58 | ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, 0); | 127 | ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, 0); |
59 | chunk = ptr; | 128 | chunk = ptr; |
60 | chunk->data_size = height * chunk_stride; | 129 | chunk->data_size = height * chunk_stride; |
@@ -102,7 +171,6 @@ qxl_image_create_helper(struct qxl_device *qdev, | |||
102 | while (remain > 0) { | 171 | while (remain > 0) { |
103 | page_base = out_offset & PAGE_MASK; | 172 | page_base = out_offset & PAGE_MASK; |
104 | page_offset = offset_in_page(out_offset); | 173 | page_offset = offset_in_page(out_offset); |
105 | |||
106 | size = min((int)(PAGE_SIZE - page_offset), remain); | 174 | size = min((int)(PAGE_SIZE - page_offset), remain); |
107 | 175 | ||
108 | ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page_base); | 176 | ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page_base); |
@@ -116,14 +184,10 @@ qxl_image_create_helper(struct qxl_device *qdev, | |||
116 | } | 184 | } |
117 | } | 185 | } |
118 | } | 186 | } |
119 | |||
120 | |||
121 | qxl_bo_kunmap(chunk_bo); | 187 | qxl_bo_kunmap(chunk_bo); |
122 | 188 | ||
123 | /* Image */ | 189 | image_bo = dimage->bo; |
124 | ret = qxl_alloc_bo_reserved(qdev, sizeof(*image), image_bo); | 190 | ptr = qxl_bo_kmap_atomic_page(qdev, image_bo, 0); |
125 | |||
126 | ptr = qxl_bo_kmap_atomic_page(qdev, *image_bo, 0); | ||
127 | image = ptr; | 191 | image = ptr; |
128 | 192 | ||
129 | image->descriptor.id = 0; | 193 | image->descriptor.id = 0; |
@@ -154,23 +218,20 @@ qxl_image_create_helper(struct qxl_device *qdev, | |||
154 | image->u.bitmap.stride = chunk_stride; | 218 | image->u.bitmap.stride = chunk_stride; |
155 | image->u.bitmap.palette = 0; | 219 | image->u.bitmap.palette = 0; |
156 | image->u.bitmap.data = qxl_bo_physical_address(qdev, chunk_bo, 0); | 220 | image->u.bitmap.data = qxl_bo_physical_address(qdev, chunk_bo, 0); |
157 | qxl_release_add_res(qdev, release, chunk_bo); | ||
158 | qxl_bo_unreserve(chunk_bo); | ||
159 | qxl_bo_unref(&chunk_bo); | ||
160 | 221 | ||
161 | qxl_bo_kunmap_atomic_page(qdev, *image_bo, ptr); | 222 | qxl_bo_kunmap_atomic_page(qdev, image_bo, ptr); |
162 | 223 | ||
163 | return 0; | 224 | return 0; |
164 | } | 225 | } |
165 | 226 | ||
166 | int qxl_image_create(struct qxl_device *qdev, | 227 | int qxl_image_init(struct qxl_device *qdev, |
167 | struct qxl_release *release, | 228 | struct qxl_release *release, |
168 | struct qxl_bo **image_bo, | 229 | struct qxl_drm_image *dimage, |
169 | const uint8_t *data, | 230 | const uint8_t *data, |
170 | int x, int y, int width, int height, | 231 | int x, int y, int width, int height, |
171 | int depth, int stride) | 232 | int depth, int stride) |
172 | { | 233 | { |
173 | data += y * stride + x * (depth / 8); | 234 | data += y * stride + x * (depth / 8); |
174 | return qxl_image_create_helper(qdev, release, image_bo, data, | 235 | return qxl_image_init_helper(qdev, release, dimage, data, |
175 | width, height, depth, 0, stride); | 236 | width, height, depth, 0, stride); |
176 | } | 237 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 27f45e49250d..6de33563d6f1 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c | |||
@@ -68,55 +68,60 @@ static int qxl_map_ioctl(struct drm_device *dev, void *data, | |||
68 | &qxl_map->offset); | 68 | &qxl_map->offset); |
69 | } | 69 | } |
70 | 70 | ||
71 | struct qxl_reloc_info { | ||
72 | int type; | ||
73 | struct qxl_bo *dst_bo; | ||
74 | uint32_t dst_offset; | ||
75 | struct qxl_bo *src_bo; | ||
76 | int src_offset; | ||
77 | }; | ||
78 | |||
71 | /* | 79 | /* |
72 | * dst must be validated, i.e. whole bo on vram/surfacesram (right now all bo's | 80 | * dst must be validated, i.e. whole bo on vram/surfacesram (right now all bo's |
73 | * are on vram). | 81 | * are on vram). |
74 | * *(dst + dst_off) = qxl_bo_physical_address(src, src_off) | 82 | * *(dst + dst_off) = qxl_bo_physical_address(src, src_off) |
75 | */ | 83 | */ |
76 | static void | 84 | static void |
77 | apply_reloc(struct qxl_device *qdev, struct qxl_bo *dst, uint64_t dst_off, | 85 | apply_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info) |
78 | struct qxl_bo *src, uint64_t src_off) | ||
79 | { | 86 | { |
80 | void *reloc_page; | 87 | void *reloc_page; |
81 | 88 | reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); | |
82 | reloc_page = qxl_bo_kmap_atomic_page(qdev, dst, dst_off & PAGE_MASK); | 89 | *(uint64_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = qxl_bo_physical_address(qdev, |
83 | *(uint64_t *)(reloc_page + (dst_off & ~PAGE_MASK)) = qxl_bo_physical_address(qdev, | 90 | info->src_bo, |
84 | src, src_off); | 91 | info->src_offset); |
85 | qxl_bo_kunmap_atomic_page(qdev, dst, reloc_page); | 92 | qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page); |
86 | } | 93 | } |
87 | 94 | ||
88 | static void | 95 | static void |
89 | apply_surf_reloc(struct qxl_device *qdev, struct qxl_bo *dst, uint64_t dst_off, | 96 | apply_surf_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info) |
90 | struct qxl_bo *src) | ||
91 | { | 97 | { |
92 | uint32_t id = 0; | 98 | uint32_t id = 0; |
93 | void *reloc_page; | 99 | void *reloc_page; |
94 | 100 | ||
95 | if (src && !src->is_primary) | 101 | if (info->src_bo && !info->src_bo->is_primary) |
96 | id = src->surface_id; | 102 | id = info->src_bo->surface_id; |
97 | 103 | ||
98 | reloc_page = qxl_bo_kmap_atomic_page(qdev, dst, dst_off & PAGE_MASK); | 104 | reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); |
99 | *(uint32_t *)(reloc_page + (dst_off & ~PAGE_MASK)) = id; | 105 | *(uint32_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = id; |
100 | qxl_bo_kunmap_atomic_page(qdev, dst, reloc_page); | 106 | qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page); |
101 | } | 107 | } |
102 | 108 | ||
103 | /* return holding the reference to this object */ | 109 | /* return holding the reference to this object */ |
104 | static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev, | 110 | static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev, |
105 | struct drm_file *file_priv, uint64_t handle, | 111 | struct drm_file *file_priv, uint64_t handle, |
106 | struct qxl_reloc_list *reloc_list) | 112 | struct qxl_release *release) |
107 | { | 113 | { |
108 | struct drm_gem_object *gobj; | 114 | struct drm_gem_object *gobj; |
109 | struct qxl_bo *qobj; | 115 | struct qxl_bo *qobj; |
110 | int ret; | 116 | int ret; |
111 | 117 | ||
112 | gobj = drm_gem_object_lookup(qdev->ddev, file_priv, handle); | 118 | gobj = drm_gem_object_lookup(qdev->ddev, file_priv, handle); |
113 | if (!gobj) { | 119 | if (!gobj) |
114 | DRM_ERROR("bad bo handle %lld\n", handle); | ||
115 | return NULL; | 120 | return NULL; |
116 | } | 121 | |
117 | qobj = gem_to_qxl_bo(gobj); | 122 | qobj = gem_to_qxl_bo(gobj); |
118 | 123 | ||
119 | ret = qxl_bo_list_add(reloc_list, qobj); | 124 | ret = qxl_release_list_add(release, qobj); |
120 | if (ret) | 125 | if (ret) |
121 | return NULL; | 126 | return NULL; |
122 | 127 | ||
@@ -129,151 +134,177 @@ static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev, | |||
129 | * However, the command as passed from user space must *not* contain the initial | 134 | * However, the command as passed from user space must *not* contain the initial |
130 | * QXLReleaseInfo struct (first XXX bytes) | 135 | * QXLReleaseInfo struct (first XXX bytes) |
131 | */ | 136 | */ |
132 | static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, | 137 | static int qxl_process_single_command(struct qxl_device *qdev, |
133 | struct drm_file *file_priv) | 138 | struct drm_qxl_command *cmd, |
139 | struct drm_file *file_priv) | ||
134 | { | 140 | { |
135 | struct qxl_device *qdev = dev->dev_private; | 141 | struct qxl_reloc_info *reloc_info; |
136 | struct drm_qxl_execbuffer *execbuffer = data; | 142 | int release_type; |
137 | struct drm_qxl_command user_cmd; | 143 | struct qxl_release *release; |
138 | int cmd_num; | 144 | struct qxl_bo *cmd_bo; |
139 | struct qxl_bo *reloc_src_bo; | ||
140 | struct qxl_bo *reloc_dst_bo; | ||
141 | struct drm_qxl_reloc reloc; | ||
142 | void *fb_cmd; | 145 | void *fb_cmd; |
143 | int i, ret; | 146 | int i, j, ret, num_relocs; |
144 | struct qxl_reloc_list reloc_list; | ||
145 | int unwritten; | 147 | int unwritten; |
146 | uint32_t reloc_dst_offset; | ||
147 | INIT_LIST_HEAD(&reloc_list.bos); | ||
148 | 148 | ||
149 | for (cmd_num = 0; cmd_num < execbuffer->commands_num; ++cmd_num) { | 149 | switch (cmd->type) { |
150 | struct qxl_release *release; | 150 | case QXL_CMD_DRAW: |
151 | struct qxl_bo *cmd_bo; | 151 | release_type = QXL_RELEASE_DRAWABLE; |
152 | int release_type; | 152 | break; |
153 | struct drm_qxl_command *commands = | 153 | case QXL_CMD_SURFACE: |
154 | (struct drm_qxl_command *)(uintptr_t)execbuffer->commands; | 154 | case QXL_CMD_CURSOR: |
155 | default: | ||
156 | DRM_DEBUG("Only draw commands in execbuffers\n"); | ||
157 | return -EINVAL; | ||
158 | break; | ||
159 | } | ||
155 | 160 | ||
156 | if (DRM_COPY_FROM_USER(&user_cmd, &commands[cmd_num], | 161 | if (cmd->command_size > PAGE_SIZE - sizeof(union qxl_release_info)) |
157 | sizeof(user_cmd))) | 162 | return -EINVAL; |
158 | return -EFAULT; | ||
159 | switch (user_cmd.type) { | ||
160 | case QXL_CMD_DRAW: | ||
161 | release_type = QXL_RELEASE_DRAWABLE; | ||
162 | break; | ||
163 | case QXL_CMD_SURFACE: | ||
164 | case QXL_CMD_CURSOR: | ||
165 | default: | ||
166 | DRM_DEBUG("Only draw commands in execbuffers\n"); | ||
167 | return -EINVAL; | ||
168 | break; | ||
169 | } | ||
170 | 163 | ||
171 | if (user_cmd.command_size > PAGE_SIZE - sizeof(union qxl_release_info)) | 164 | if (!access_ok(VERIFY_READ, |
172 | return -EINVAL; | 165 | (void *)(unsigned long)cmd->command, |
166 | cmd->command_size)) | ||
167 | return -EFAULT; | ||
173 | 168 | ||
174 | if (!access_ok(VERIFY_READ, | 169 | reloc_info = kmalloc(sizeof(struct qxl_reloc_info) * cmd->relocs_num, GFP_KERNEL); |
175 | (void *)(unsigned long)user_cmd.command, | 170 | if (!reloc_info) |
176 | user_cmd.command_size)) | 171 | return -ENOMEM; |
177 | return -EFAULT; | ||
178 | 172 | ||
179 | ret = qxl_alloc_release_reserved(qdev, | 173 | ret = qxl_alloc_release_reserved(qdev, |
180 | sizeof(union qxl_release_info) + | 174 | sizeof(union qxl_release_info) + |
181 | user_cmd.command_size, | 175 | cmd->command_size, |
182 | release_type, | 176 | release_type, |
183 | &release, | 177 | &release, |
184 | &cmd_bo); | 178 | &cmd_bo); |
185 | if (ret) | 179 | if (ret) |
186 | return ret; | 180 | goto out_free_reloc; |
187 | 181 | ||
188 | /* TODO copy slow path code from i915 */ | 182 | /* TODO copy slow path code from i915 */ |
189 | fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE)); | 183 | fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE)); |
190 | unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void *)(unsigned long)user_cmd.command, user_cmd.command_size); | 184 | unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void *)(unsigned long)cmd->command, cmd->command_size); |
191 | 185 | ||
192 | { | 186 | { |
193 | struct qxl_drawable *draw = fb_cmd; | 187 | struct qxl_drawable *draw = fb_cmd; |
188 | draw->mm_time = qdev->rom->mm_clock; | ||
189 | } | ||
194 | 190 | ||
195 | draw->mm_time = qdev->rom->mm_clock; | 191 | qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd); |
196 | } | 192 | if (unwritten) { |
197 | qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd); | 193 | DRM_ERROR("got unwritten %d\n", unwritten); |
198 | if (unwritten) { | 194 | ret = -EFAULT; |
199 | DRM_ERROR("got unwritten %d\n", unwritten); | 195 | goto out_free_release; |
200 | qxl_release_unreserve(qdev, release); | 196 | } |
201 | qxl_release_free(qdev, release); | 197 | |
202 | return -EFAULT; | 198 | /* fill out reloc info structs */ |
199 | num_relocs = 0; | ||
200 | for (i = 0; i < cmd->relocs_num; ++i) { | ||
201 | struct drm_qxl_reloc reloc; | ||
202 | |||
203 | if (DRM_COPY_FROM_USER(&reloc, | ||
204 | &((struct drm_qxl_reloc *)(uintptr_t)cmd->relocs)[i], | ||
205 | sizeof(reloc))) { | ||
206 | ret = -EFAULT; | ||
207 | goto out_free_bos; | ||
203 | } | 208 | } |
204 | 209 | ||
205 | for (i = 0 ; i < user_cmd.relocs_num; ++i) { | 210 | /* add the bos to the list of bos to validate - |
206 | if (DRM_COPY_FROM_USER(&reloc, | 211 | need to validate first then process relocs? */ |
207 | &((struct drm_qxl_reloc *)(uintptr_t)user_cmd.relocs)[i], | 212 | if (reloc.reloc_type != QXL_RELOC_TYPE_BO && reloc.reloc_type != QXL_RELOC_TYPE_SURF) { |
208 | sizeof(reloc))) { | 213 | DRM_DEBUG("unknown reloc type %d\n", reloc_info[i].type); |
209 | qxl_bo_list_unreserve(&reloc_list, true); | ||
210 | qxl_release_unreserve(qdev, release); | ||
211 | qxl_release_free(qdev, release); | ||
212 | return -EFAULT; | ||
213 | } | ||
214 | 214 | ||
215 | /* add the bos to the list of bos to validate - | 215 | ret = -EINVAL; |
216 | need to validate first then process relocs? */ | 216 | goto out_free_bos; |
217 | if (reloc.dst_handle) { | 217 | } |
218 | reloc_dst_bo = qxlhw_handle_to_bo(qdev, file_priv, | 218 | reloc_info[i].type = reloc.reloc_type; |
219 | reloc.dst_handle, &reloc_list); | 219 | |
220 | if (!reloc_dst_bo) { | 220 | if (reloc.dst_handle) { |
221 | qxl_bo_list_unreserve(&reloc_list, true); | 221 | reloc_info[i].dst_bo = qxlhw_handle_to_bo(qdev, file_priv, |
222 | qxl_release_unreserve(qdev, release); | 222 | reloc.dst_handle, release); |
223 | qxl_release_free(qdev, release); | 223 | if (!reloc_info[i].dst_bo) { |
224 | return -EINVAL; | 224 | ret = -EINVAL; |
225 | } | 225 | reloc_info[i].src_bo = NULL; |
226 | reloc_dst_offset = 0; | 226 | goto out_free_bos; |
227 | } else { | ||
228 | reloc_dst_bo = cmd_bo; | ||
229 | reloc_dst_offset = release->release_offset; | ||
230 | } | 227 | } |
231 | 228 | reloc_info[i].dst_offset = reloc.dst_offset; | |
232 | /* reserve and validate the reloc dst bo */ | 229 | } else { |
233 | if (reloc.reloc_type == QXL_RELOC_TYPE_BO || reloc.src_handle > 0) { | 230 | reloc_info[i].dst_bo = cmd_bo; |
234 | reloc_src_bo = | 231 | reloc_info[i].dst_offset = reloc.dst_offset + release->release_offset; |
235 | qxlhw_handle_to_bo(qdev, file_priv, | 232 | } |
236 | reloc.src_handle, &reloc_list); | 233 | num_relocs++; |
237 | if (!reloc_src_bo) { | 234 | |
238 | if (reloc_dst_bo != cmd_bo) | 235 | /* reserve and validate the reloc dst bo */ |
239 | drm_gem_object_unreference_unlocked(&reloc_dst_bo->gem_base); | 236 | if (reloc.reloc_type == QXL_RELOC_TYPE_BO || reloc.src_handle > 0) { |
240 | qxl_bo_list_unreserve(&reloc_list, true); | 237 | reloc_info[i].src_bo = |
241 | qxl_release_unreserve(qdev, release); | 238 | qxlhw_handle_to_bo(qdev, file_priv, |
242 | qxl_release_free(qdev, release); | 239 | reloc.src_handle, release); |
243 | return -EINVAL; | 240 | if (!reloc_info[i].src_bo) { |
244 | } | 241 | if (reloc_info[i].dst_bo != cmd_bo) |
245 | } else | 242 | drm_gem_object_unreference_unlocked(&reloc_info[i].dst_bo->gem_base); |
246 | reloc_src_bo = NULL; | 243 | ret = -EINVAL; |
247 | if (reloc.reloc_type == QXL_RELOC_TYPE_BO) { | 244 | goto out_free_bos; |
248 | apply_reloc(qdev, reloc_dst_bo, reloc_dst_offset + reloc.dst_offset, | ||
249 | reloc_src_bo, reloc.src_offset); | ||
250 | } else if (reloc.reloc_type == QXL_RELOC_TYPE_SURF) { | ||
251 | apply_surf_reloc(qdev, reloc_dst_bo, reloc_dst_offset + reloc.dst_offset, reloc_src_bo); | ||
252 | } else { | ||
253 | DRM_ERROR("unknown reloc type %d\n", reloc.reloc_type); | ||
254 | return -EINVAL; | ||
255 | } | 245 | } |
246 | reloc_info[i].src_offset = reloc.src_offset; | ||
247 | } else { | ||
248 | reloc_info[i].src_bo = NULL; | ||
249 | reloc_info[i].src_offset = 0; | ||
250 | } | ||
251 | } | ||
256 | 252 | ||
257 | if (reloc_src_bo && reloc_src_bo != cmd_bo) { | 253 | /* validate all buffers */ |
258 | qxl_release_add_res(qdev, release, reloc_src_bo); | 254 | ret = qxl_release_reserve_list(release, false); |
259 | drm_gem_object_unreference_unlocked(&reloc_src_bo->gem_base); | 255 | if (ret) |
260 | } | 256 | goto out_free_bos; |
261 | 257 | ||
262 | if (reloc_dst_bo != cmd_bo) | 258 | for (i = 0; i < cmd->relocs_num; ++i) { |
263 | drm_gem_object_unreference_unlocked(&reloc_dst_bo->gem_base); | 259 | if (reloc_info[i].type == QXL_RELOC_TYPE_BO) |
264 | } | 260 | apply_reloc(qdev, &reloc_info[i]); |
265 | qxl_fence_releaseable(qdev, release); | 261 | else if (reloc_info[i].type == QXL_RELOC_TYPE_SURF) |
262 | apply_surf_reloc(qdev, &reloc_info[i]); | ||
263 | } | ||
266 | 264 | ||
267 | ret = qxl_push_command_ring_release(qdev, release, user_cmd.type, true); | 265 | ret = qxl_push_command_ring_release(qdev, release, cmd->type, true); |
268 | if (ret == -ERESTARTSYS) { | 266 | if (ret) |
269 | qxl_release_unreserve(qdev, release); | 267 | qxl_release_backoff_reserve_list(release); |
270 | qxl_release_free(qdev, release); | 268 | else |
271 | qxl_bo_list_unreserve(&reloc_list, true); | 269 | qxl_release_fence_buffer_objects(release); |
270 | |||
271 | out_free_bos: | ||
272 | for (j = 0; j < num_relocs; j++) { | ||
273 | if (reloc_info[j].dst_bo != cmd_bo) | ||
274 | drm_gem_object_unreference_unlocked(&reloc_info[j].dst_bo->gem_base); | ||
275 | if (reloc_info[j].src_bo && reloc_info[j].src_bo != cmd_bo) | ||
276 | drm_gem_object_unreference_unlocked(&reloc_info[j].src_bo->gem_base); | ||
277 | } | ||
278 | out_free_release: | ||
279 | if (ret) | ||
280 | qxl_release_free(qdev, release); | ||
281 | out_free_reloc: | ||
282 | kfree(reloc_info); | ||
283 | return ret; | ||
284 | } | ||
285 | |||
286 | static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, | ||
287 | struct drm_file *file_priv) | ||
288 | { | ||
289 | struct qxl_device *qdev = dev->dev_private; | ||
290 | struct drm_qxl_execbuffer *execbuffer = data; | ||
291 | struct drm_qxl_command user_cmd; | ||
292 | int cmd_num; | ||
293 | int ret; | ||
294 | |||
295 | for (cmd_num = 0; cmd_num < execbuffer->commands_num; ++cmd_num) { | ||
296 | |||
297 | struct drm_qxl_command *commands = | ||
298 | (struct drm_qxl_command *)(uintptr_t)execbuffer->commands; | ||
299 | |||
300 | if (DRM_COPY_FROM_USER(&user_cmd, &commands[cmd_num], | ||
301 | sizeof(user_cmd))) | ||
302 | return -EFAULT; | ||
303 | |||
304 | ret = qxl_process_single_command(qdev, &user_cmd, file_priv); | ||
305 | if (ret) | ||
272 | return ret; | 306 | return ret; |
273 | } | ||
274 | qxl_release_unreserve(qdev, release); | ||
275 | } | 307 | } |
276 | qxl_bo_list_unreserve(&reloc_list, 0); | ||
277 | return 0; | 308 | return 0; |
278 | } | 309 | } |
279 | 310 | ||
@@ -305,7 +336,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data, | |||
305 | goto out; | 336 | goto out; |
306 | 337 | ||
307 | if (!qobj->pin_count) { | 338 | if (!qobj->pin_count) { |
308 | qxl_ttm_placement_from_domain(qobj, qobj->type); | 339 | qxl_ttm_placement_from_domain(qobj, qobj->type, false); |
309 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, | 340 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, |
310 | true, false); | 341 | true, false); |
311 | if (unlikely(ret)) | 342 | if (unlikely(ret)) |
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c index 1191fe7788c9..aa161cddd87e 100644 --- a/drivers/gpu/drm/qxl/qxl_object.c +++ b/drivers/gpu/drm/qxl/qxl_object.c | |||
@@ -51,20 +51,21 @@ bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo) | |||
51 | return false; | 51 | return false; |
52 | } | 52 | } |
53 | 53 | ||
54 | void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain) | 54 | void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned) |
55 | { | 55 | { |
56 | u32 c = 0; | 56 | u32 c = 0; |
57 | u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0; | ||
57 | 58 | ||
58 | qbo->placement.fpfn = 0; | 59 | qbo->placement.fpfn = 0; |
59 | qbo->placement.lpfn = 0; | 60 | qbo->placement.lpfn = 0; |
60 | qbo->placement.placement = qbo->placements; | 61 | qbo->placement.placement = qbo->placements; |
61 | qbo->placement.busy_placement = qbo->placements; | 62 | qbo->placement.busy_placement = qbo->placements; |
62 | if (domain == QXL_GEM_DOMAIN_VRAM) | 63 | if (domain == QXL_GEM_DOMAIN_VRAM) |
63 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM; | 64 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag; |
64 | if (domain == QXL_GEM_DOMAIN_SURFACE) | 65 | if (domain == QXL_GEM_DOMAIN_SURFACE) |
65 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0; | 66 | qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag; |
66 | if (domain == QXL_GEM_DOMAIN_CPU) | 67 | if (domain == QXL_GEM_DOMAIN_CPU) |
67 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; | 68 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag; |
68 | if (!c) | 69 | if (!c) |
69 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; | 70 | qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM; |
70 | qbo->placement.num_placement = c; | 71 | qbo->placement.num_placement = c; |
@@ -73,7 +74,7 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain) | |||
73 | 74 | ||
74 | 75 | ||
75 | int qxl_bo_create(struct qxl_device *qdev, | 76 | int qxl_bo_create(struct qxl_device *qdev, |
76 | unsigned long size, bool kernel, u32 domain, | 77 | unsigned long size, bool kernel, bool pinned, u32 domain, |
77 | struct qxl_surface *surf, | 78 | struct qxl_surface *surf, |
78 | struct qxl_bo **bo_ptr) | 79 | struct qxl_bo **bo_ptr) |
79 | { | 80 | { |
@@ -99,15 +100,15 @@ int qxl_bo_create(struct qxl_device *qdev, | |||
99 | } | 100 | } |
100 | bo->gem_base.driver_private = NULL; | 101 | bo->gem_base.driver_private = NULL; |
101 | bo->type = domain; | 102 | bo->type = domain; |
102 | bo->pin_count = 0; | 103 | bo->pin_count = pinned ? 1 : 0; |
103 | bo->surface_id = 0; | 104 | bo->surface_id = 0; |
104 | qxl_fence_init(qdev, &bo->fence); | 105 | qxl_fence_init(qdev, &bo->fence); |
105 | INIT_LIST_HEAD(&bo->list); | 106 | INIT_LIST_HEAD(&bo->list); |
106 | atomic_set(&bo->reserve_count, 0); | 107 | |
107 | if (surf) | 108 | if (surf) |
108 | bo->surf = *surf; | 109 | bo->surf = *surf; |
109 | 110 | ||
110 | qxl_ttm_placement_from_domain(bo, domain); | 111 | qxl_ttm_placement_from_domain(bo, domain, pinned); |
111 | 112 | ||
112 | r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type, | 113 | r = ttm_bo_init(&qdev->mman.bdev, &bo->tbo, size, type, |
113 | &bo->placement, 0, !kernel, NULL, size, | 114 | &bo->placement, 0, !kernel, NULL, size, |
@@ -228,7 +229,7 @@ struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo) | |||
228 | int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) | 229 | int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) |
229 | { | 230 | { |
230 | struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; | 231 | struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; |
231 | int r, i; | 232 | int r; |
232 | 233 | ||
233 | if (bo->pin_count) { | 234 | if (bo->pin_count) { |
234 | bo->pin_count++; | 235 | bo->pin_count++; |
@@ -236,9 +237,7 @@ int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) | |||
236 | *gpu_addr = qxl_bo_gpu_offset(bo); | 237 | *gpu_addr = qxl_bo_gpu_offset(bo); |
237 | return 0; | 238 | return 0; |
238 | } | 239 | } |
239 | qxl_ttm_placement_from_domain(bo, domain); | 240 | qxl_ttm_placement_from_domain(bo, domain, true); |
240 | for (i = 0; i < bo->placement.num_placement; i++) | ||
241 | bo->placements[i] |= TTM_PL_FLAG_NO_EVICT; | ||
242 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); | 241 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); |
243 | if (likely(r == 0)) { | 242 | if (likely(r == 0)) { |
244 | bo->pin_count = 1; | 243 | bo->pin_count = 1; |
@@ -317,53 +316,6 @@ int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo) | |||
317 | return 0; | 316 | return 0; |
318 | } | 317 | } |
319 | 318 | ||
320 | void qxl_bo_list_unreserve(struct qxl_reloc_list *reloc_list, bool failed) | ||
321 | { | ||
322 | struct qxl_bo_list *entry, *sf; | ||
323 | |||
324 | list_for_each_entry_safe(entry, sf, &reloc_list->bos, lhead) { | ||
325 | qxl_bo_unreserve(entry->bo); | ||
326 | list_del(&entry->lhead); | ||
327 | kfree(entry); | ||
328 | } | ||
329 | } | ||
330 | |||
331 | int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo) | ||
332 | { | ||
333 | struct qxl_bo_list *entry; | ||
334 | int ret; | ||
335 | |||
336 | list_for_each_entry(entry, &reloc_list->bos, lhead) { | ||
337 | if (entry->bo == bo) | ||
338 | return 0; | ||
339 | } | ||
340 | |||
341 | entry = kmalloc(sizeof(struct qxl_bo_list), GFP_KERNEL); | ||
342 | if (!entry) | ||
343 | return -ENOMEM; | ||
344 | |||
345 | entry->bo = bo; | ||
346 | list_add(&entry->lhead, &reloc_list->bos); | ||
347 | |||
348 | ret = qxl_bo_reserve(bo, false); | ||
349 | if (ret) | ||
350 | return ret; | ||
351 | |||
352 | if (!bo->pin_count) { | ||
353 | qxl_ttm_placement_from_domain(bo, bo->type); | ||
354 | ret = ttm_bo_validate(&bo->tbo, &bo->placement, | ||
355 | true, false); | ||
356 | if (ret) | ||
357 | return ret; | ||
358 | } | ||
359 | |||
360 | /* allocate a surface for reserved + validated buffers */ | ||
361 | ret = qxl_bo_check_id(bo->gem_base.dev->dev_private, bo); | ||
362 | if (ret) | ||
363 | return ret; | ||
364 | return 0; | ||
365 | } | ||
366 | |||
367 | int qxl_surf_evict(struct qxl_device *qdev) | 319 | int qxl_surf_evict(struct qxl_device *qdev) |
368 | { | 320 | { |
369 | return ttm_bo_evict_mm(&qdev->mman.bdev, TTM_PL_PRIV0); | 321 | return ttm_bo_evict_mm(&qdev->mman.bdev, TTM_PL_PRIV0); |
diff --git a/drivers/gpu/drm/qxl/qxl_object.h b/drivers/gpu/drm/qxl/qxl_object.h index ee7ad79ce781..8cb6167038e5 100644 --- a/drivers/gpu/drm/qxl/qxl_object.h +++ b/drivers/gpu/drm/qxl/qxl_object.h | |||
@@ -88,7 +88,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type, | |||
88 | 88 | ||
89 | extern int qxl_bo_create(struct qxl_device *qdev, | 89 | extern int qxl_bo_create(struct qxl_device *qdev, |
90 | unsigned long size, | 90 | unsigned long size, |
91 | bool kernel, u32 domain, | 91 | bool kernel, bool pinned, u32 domain, |
92 | struct qxl_surface *surf, | 92 | struct qxl_surface *surf, |
93 | struct qxl_bo **bo_ptr); | 93 | struct qxl_bo **bo_ptr); |
94 | extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); | 94 | extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); |
@@ -99,9 +99,7 @@ extern struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo); | |||
99 | extern void qxl_bo_unref(struct qxl_bo **bo); | 99 | extern void qxl_bo_unref(struct qxl_bo **bo); |
100 | extern int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr); | 100 | extern int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr); |
101 | extern int qxl_bo_unpin(struct qxl_bo *bo); | 101 | extern int qxl_bo_unpin(struct qxl_bo *bo); |
102 | extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain); | 102 | extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned); |
103 | extern bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo); | 103 | extern bool qxl_ttm_bo_is_qxl_bo(struct ttm_buffer_object *bo); |
104 | 104 | ||
105 | extern int qxl_bo_list_add(struct qxl_reloc_list *reloc_list, struct qxl_bo *bo); | ||
106 | extern void qxl_bo_list_unreserve(struct qxl_reloc_list *reloc_list, bool failed); | ||
107 | #endif | 105 | #endif |
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index b443d6751d5f..b61449e52cd5 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c | |||
@@ -38,7 +38,8 @@ | |||
38 | 38 | ||
39 | static const int release_size_per_bo[] = { RELEASE_SIZE, SURFACE_RELEASE_SIZE, RELEASE_SIZE }; | 39 | static const int release_size_per_bo[] = { RELEASE_SIZE, SURFACE_RELEASE_SIZE, RELEASE_SIZE }; |
40 | static const int releases_per_bo[] = { RELEASES_PER_BO, SURFACE_RELEASES_PER_BO, RELEASES_PER_BO }; | 40 | static const int releases_per_bo[] = { RELEASES_PER_BO, SURFACE_RELEASES_PER_BO, RELEASES_PER_BO }; |
41 | uint64_t | 41 | |
42 | static uint64_t | ||
42 | qxl_release_alloc(struct qxl_device *qdev, int type, | 43 | qxl_release_alloc(struct qxl_device *qdev, int type, |
43 | struct qxl_release **ret) | 44 | struct qxl_release **ret) |
44 | { | 45 | { |
@@ -53,9 +54,9 @@ qxl_release_alloc(struct qxl_device *qdev, int type, | |||
53 | return 0; | 54 | return 0; |
54 | } | 55 | } |
55 | release->type = type; | 56 | release->type = type; |
56 | release->bo_count = 0; | ||
57 | release->release_offset = 0; | 57 | release->release_offset = 0; |
58 | release->surface_release_id = 0; | 58 | release->surface_release_id = 0; |
59 | INIT_LIST_HEAD(&release->bos); | ||
59 | 60 | ||
60 | idr_preload(GFP_KERNEL); | 61 | idr_preload(GFP_KERNEL); |
61 | spin_lock(&qdev->release_idr_lock); | 62 | spin_lock(&qdev->release_idr_lock); |
@@ -77,20 +78,20 @@ void | |||
77 | qxl_release_free(struct qxl_device *qdev, | 78 | qxl_release_free(struct qxl_device *qdev, |
78 | struct qxl_release *release) | 79 | struct qxl_release *release) |
79 | { | 80 | { |
80 | int i; | 81 | struct qxl_bo_list *entry, *tmp; |
81 | 82 | QXL_INFO(qdev, "release %d, type %d\n", release->id, | |
82 | QXL_INFO(qdev, "release %d, type %d, %d bos\n", release->id, | 83 | release->type); |
83 | release->type, release->bo_count); | ||
84 | 84 | ||
85 | if (release->surface_release_id) | 85 | if (release->surface_release_id) |
86 | qxl_surface_id_dealloc(qdev, release->surface_release_id); | 86 | qxl_surface_id_dealloc(qdev, release->surface_release_id); |
87 | 87 | ||
88 | for (i = 0 ; i < release->bo_count; ++i) { | 88 | list_for_each_entry_safe(entry, tmp, &release->bos, tv.head) { |
89 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
89 | QXL_INFO(qdev, "release %llx\n", | 90 | QXL_INFO(qdev, "release %llx\n", |
90 | release->bos[i]->tbo.addr_space_offset | 91 | entry->tv.bo->addr_space_offset |
91 | - DRM_FILE_OFFSET); | 92 | - DRM_FILE_OFFSET); |
92 | qxl_fence_remove_release(&release->bos[i]->fence, release->id); | 93 | qxl_fence_remove_release(&bo->fence, release->id); |
93 | qxl_bo_unref(&release->bos[i]); | 94 | qxl_bo_unref(&bo); |
94 | } | 95 | } |
95 | spin_lock(&qdev->release_idr_lock); | 96 | spin_lock(&qdev->release_idr_lock); |
96 | idr_remove(&qdev->release_idr, release->id); | 97 | idr_remove(&qdev->release_idr, release->id); |
@@ -98,83 +99,117 @@ qxl_release_free(struct qxl_device *qdev, | |||
98 | kfree(release); | 99 | kfree(release); |
99 | } | 100 | } |
100 | 101 | ||
101 | void | ||
102 | qxl_release_add_res(struct qxl_device *qdev, struct qxl_release *release, | ||
103 | struct qxl_bo *bo) | ||
104 | { | ||
105 | int i; | ||
106 | for (i = 0; i < release->bo_count; i++) | ||
107 | if (release->bos[i] == bo) | ||
108 | return; | ||
109 | |||
110 | if (release->bo_count >= QXL_MAX_RES) { | ||
111 | DRM_ERROR("exceeded max resource on a qxl_release item\n"); | ||
112 | return; | ||
113 | } | ||
114 | release->bos[release->bo_count++] = qxl_bo_ref(bo); | ||
115 | } | ||
116 | |||
117 | static int qxl_release_bo_alloc(struct qxl_device *qdev, | 102 | static int qxl_release_bo_alloc(struct qxl_device *qdev, |
118 | struct qxl_bo **bo) | 103 | struct qxl_bo **bo) |
119 | { | 104 | { |
120 | int ret; | 105 | int ret; |
121 | ret = qxl_bo_create(qdev, PAGE_SIZE, false, QXL_GEM_DOMAIN_VRAM, NULL, | 106 | /* pin releases bo's they are too messy to evict */ |
107 | ret = qxl_bo_create(qdev, PAGE_SIZE, false, true, | ||
108 | QXL_GEM_DOMAIN_VRAM, NULL, | ||
122 | bo); | 109 | bo); |
123 | return ret; | 110 | return ret; |
124 | } | 111 | } |
125 | 112 | ||
126 | int qxl_release_reserve(struct qxl_device *qdev, | 113 | int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo) |
127 | struct qxl_release *release, bool no_wait) | 114 | { |
115 | struct qxl_bo_list *entry; | ||
116 | |||
117 | list_for_each_entry(entry, &release->bos, tv.head) { | ||
118 | if (entry->tv.bo == &bo->tbo) | ||
119 | return 0; | ||
120 | } | ||
121 | |||
122 | entry = kmalloc(sizeof(struct qxl_bo_list), GFP_KERNEL); | ||
123 | if (!entry) | ||
124 | return -ENOMEM; | ||
125 | |||
126 | qxl_bo_ref(bo); | ||
127 | entry->tv.bo = &bo->tbo; | ||
128 | list_add_tail(&entry->tv.head, &release->bos); | ||
129 | return 0; | ||
130 | } | ||
131 | |||
132 | static int qxl_release_validate_bo(struct qxl_bo *bo) | ||
128 | { | 133 | { |
129 | int ret; | 134 | int ret; |
130 | if (atomic_inc_return(&release->bos[0]->reserve_count) == 1) { | 135 | |
131 | ret = qxl_bo_reserve(release->bos[0], no_wait); | 136 | if (!bo->pin_count) { |
137 | qxl_ttm_placement_from_domain(bo, bo->type, false); | ||
138 | ret = ttm_bo_validate(&bo->tbo, &bo->placement, | ||
139 | true, false); | ||
132 | if (ret) | 140 | if (ret) |
133 | return ret; | 141 | return ret; |
134 | } | 142 | } |
143 | |||
144 | /* allocate a surface for reserved + validated buffers */ | ||
145 | ret = qxl_bo_check_id(bo->gem_base.dev->dev_private, bo); | ||
146 | if (ret) | ||
147 | return ret; | ||
148 | return 0; | ||
149 | } | ||
150 | |||
151 | int qxl_release_reserve_list(struct qxl_release *release, bool no_intr) | ||
152 | { | ||
153 | int ret; | ||
154 | struct qxl_bo_list *entry; | ||
155 | |||
156 | /* if only one object on the release its the release itself | ||
157 | since these objects are pinned no need to reserve */ | ||
158 | if (list_is_singular(&release->bos)) | ||
159 | return 0; | ||
160 | |||
161 | ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos); | ||
162 | if (ret) | ||
163 | return ret; | ||
164 | |||
165 | list_for_each_entry(entry, &release->bos, tv.head) { | ||
166 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
167 | |||
168 | ret = qxl_release_validate_bo(bo); | ||
169 | if (ret) { | ||
170 | ttm_eu_backoff_reservation(&release->ticket, &release->bos); | ||
171 | return ret; | ||
172 | } | ||
173 | } | ||
135 | return 0; | 174 | return 0; |
136 | } | 175 | } |
137 | 176 | ||
138 | void qxl_release_unreserve(struct qxl_device *qdev, | 177 | void qxl_release_backoff_reserve_list(struct qxl_release *release) |
139 | struct qxl_release *release) | ||
140 | { | 178 | { |
141 | if (atomic_dec_and_test(&release->bos[0]->reserve_count)) | 179 | /* if only one object on the release its the release itself |
142 | qxl_bo_unreserve(release->bos[0]); | 180 | since these objects are pinned no need to reserve */ |
181 | if (list_is_singular(&release->bos)) | ||
182 | return; | ||
183 | |||
184 | ttm_eu_backoff_reservation(&release->ticket, &release->bos); | ||
143 | } | 185 | } |
144 | 186 | ||
187 | |||
145 | int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, | 188 | int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, |
146 | enum qxl_surface_cmd_type surface_cmd_type, | 189 | enum qxl_surface_cmd_type surface_cmd_type, |
147 | struct qxl_release *create_rel, | 190 | struct qxl_release *create_rel, |
148 | struct qxl_release **release) | 191 | struct qxl_release **release) |
149 | { | 192 | { |
150 | int ret; | ||
151 | |||
152 | if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) { | 193 | if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) { |
153 | int idr_ret; | 194 | int idr_ret; |
195 | struct qxl_bo_list *entry = list_first_entry(&create_rel->bos, struct qxl_bo_list, tv.head); | ||
154 | struct qxl_bo *bo; | 196 | struct qxl_bo *bo; |
155 | union qxl_release_info *info; | 197 | union qxl_release_info *info; |
156 | 198 | ||
157 | /* stash the release after the create command */ | 199 | /* stash the release after the create command */ |
158 | idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release); | 200 | idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release); |
159 | bo = qxl_bo_ref(create_rel->bos[0]); | 201 | bo = qxl_bo_ref(to_qxl_bo(entry->tv.bo)); |
160 | 202 | ||
161 | (*release)->release_offset = create_rel->release_offset + 64; | 203 | (*release)->release_offset = create_rel->release_offset + 64; |
162 | 204 | ||
163 | qxl_release_add_res(qdev, *release, bo); | 205 | qxl_release_list_add(*release, bo); |
164 | 206 | ||
165 | ret = qxl_release_reserve(qdev, *release, false); | ||
166 | if (ret) { | ||
167 | DRM_ERROR("release reserve failed\n"); | ||
168 | goto out_unref; | ||
169 | } | ||
170 | info = qxl_release_map(qdev, *release); | 207 | info = qxl_release_map(qdev, *release); |
171 | info->id = idr_ret; | 208 | info->id = idr_ret; |
172 | qxl_release_unmap(qdev, *release, info); | 209 | qxl_release_unmap(qdev, *release, info); |
173 | 210 | ||
174 | |||
175 | out_unref: | ||
176 | qxl_bo_unref(&bo); | 211 | qxl_bo_unref(&bo); |
177 | return ret; | 212 | return 0; |
178 | } | 213 | } |
179 | 214 | ||
180 | return qxl_alloc_release_reserved(qdev, sizeof(struct qxl_surface_cmd), | 215 | return qxl_alloc_release_reserved(qdev, sizeof(struct qxl_surface_cmd), |
@@ -187,7 +222,7 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | |||
187 | { | 222 | { |
188 | struct qxl_bo *bo; | 223 | struct qxl_bo *bo; |
189 | int idr_ret; | 224 | int idr_ret; |
190 | int ret; | 225 | int ret = 0; |
191 | union qxl_release_info *info; | 226 | union qxl_release_info *info; |
192 | int cur_idx; | 227 | int cur_idx; |
193 | 228 | ||
@@ -216,11 +251,6 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | |||
216 | mutex_unlock(&qdev->release_mutex); | 251 | mutex_unlock(&qdev->release_mutex); |
217 | return ret; | 252 | return ret; |
218 | } | 253 | } |
219 | |||
220 | /* pin releases bo's they are too messy to evict */ | ||
221 | ret = qxl_bo_reserve(qdev->current_release_bo[cur_idx], false); | ||
222 | qxl_bo_pin(qdev->current_release_bo[cur_idx], QXL_GEM_DOMAIN_VRAM, NULL); | ||
223 | qxl_bo_unreserve(qdev->current_release_bo[cur_idx]); | ||
224 | } | 254 | } |
225 | 255 | ||
226 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); | 256 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); |
@@ -231,36 +261,18 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | |||
231 | if (rbo) | 261 | if (rbo) |
232 | *rbo = bo; | 262 | *rbo = bo; |
233 | 263 | ||
234 | qxl_release_add_res(qdev, *release, bo); | ||
235 | |||
236 | ret = qxl_release_reserve(qdev, *release, false); | ||
237 | mutex_unlock(&qdev->release_mutex); | 264 | mutex_unlock(&qdev->release_mutex); |
238 | if (ret) | 265 | |
239 | goto out_unref; | 266 | qxl_release_list_add(*release, bo); |
240 | 267 | ||
241 | info = qxl_release_map(qdev, *release); | 268 | info = qxl_release_map(qdev, *release); |
242 | info->id = idr_ret; | 269 | info->id = idr_ret; |
243 | qxl_release_unmap(qdev, *release, info); | 270 | qxl_release_unmap(qdev, *release, info); |
244 | 271 | ||
245 | out_unref: | ||
246 | qxl_bo_unref(&bo); | 272 | qxl_bo_unref(&bo); |
247 | return ret; | 273 | return ret; |
248 | } | 274 | } |
249 | 275 | ||
250 | int qxl_fence_releaseable(struct qxl_device *qdev, | ||
251 | struct qxl_release *release) | ||
252 | { | ||
253 | int i, ret; | ||
254 | for (i = 0; i < release->bo_count; i++) { | ||
255 | if (!release->bos[i]->tbo.sync_obj) | ||
256 | release->bos[i]->tbo.sync_obj = &release->bos[i]->fence; | ||
257 | ret = qxl_fence_add_release(&release->bos[i]->fence, release->id); | ||
258 | if (ret) | ||
259 | return ret; | ||
260 | } | ||
261 | return 0; | ||
262 | } | ||
263 | |||
264 | struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, | 276 | struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, |
265 | uint64_t id) | 277 | uint64_t id) |
266 | { | 278 | { |
@@ -273,10 +285,7 @@ struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, | |||
273 | DRM_ERROR("failed to find id in release_idr\n"); | 285 | DRM_ERROR("failed to find id in release_idr\n"); |
274 | return NULL; | 286 | return NULL; |
275 | } | 287 | } |
276 | if (release->bo_count < 1) { | 288 | |
277 | DRM_ERROR("read a released resource with 0 bos\n"); | ||
278 | return NULL; | ||
279 | } | ||
280 | return release; | 289 | return release; |
281 | } | 290 | } |
282 | 291 | ||
@@ -285,9 +294,12 @@ union qxl_release_info *qxl_release_map(struct qxl_device *qdev, | |||
285 | { | 294 | { |
286 | void *ptr; | 295 | void *ptr; |
287 | union qxl_release_info *info; | 296 | union qxl_release_info *info; |
288 | struct qxl_bo *bo = release->bos[0]; | 297 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); |
298 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
289 | 299 | ||
290 | ptr = qxl_bo_kmap_atomic_page(qdev, bo, release->release_offset & PAGE_SIZE); | 300 | ptr = qxl_bo_kmap_atomic_page(qdev, bo, release->release_offset & PAGE_SIZE); |
301 | if (!ptr) | ||
302 | return NULL; | ||
291 | info = ptr + (release->release_offset & ~PAGE_SIZE); | 303 | info = ptr + (release->release_offset & ~PAGE_SIZE); |
292 | return info; | 304 | return info; |
293 | } | 305 | } |
@@ -296,9 +308,51 @@ void qxl_release_unmap(struct qxl_device *qdev, | |||
296 | struct qxl_release *release, | 308 | struct qxl_release *release, |
297 | union qxl_release_info *info) | 309 | union qxl_release_info *info) |
298 | { | 310 | { |
299 | struct qxl_bo *bo = release->bos[0]; | 311 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); |
312 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
300 | void *ptr; | 313 | void *ptr; |
301 | 314 | ||
302 | ptr = ((void *)info) - (release->release_offset & ~PAGE_SIZE); | 315 | ptr = ((void *)info) - (release->release_offset & ~PAGE_SIZE); |
303 | qxl_bo_kunmap_atomic_page(qdev, bo, ptr); | 316 | qxl_bo_kunmap_atomic_page(qdev, bo, ptr); |
304 | } | 317 | } |
318 | |||
319 | void qxl_release_fence_buffer_objects(struct qxl_release *release) | ||
320 | { | ||
321 | struct ttm_validate_buffer *entry; | ||
322 | struct ttm_buffer_object *bo; | ||
323 | struct ttm_bo_global *glob; | ||
324 | struct ttm_bo_device *bdev; | ||
325 | struct ttm_bo_driver *driver; | ||
326 | struct qxl_bo *qbo; | ||
327 | |||
328 | /* if only one object on the release its the release itself | ||
329 | since these objects are pinned no need to reserve */ | ||
330 | if (list_is_singular(&release->bos)) | ||
331 | return; | ||
332 | |||
333 | bo = list_first_entry(&release->bos, struct ttm_validate_buffer, head)->bo; | ||
334 | bdev = bo->bdev; | ||
335 | driver = bdev->driver; | ||
336 | glob = bo->glob; | ||
337 | |||
338 | spin_lock(&glob->lru_lock); | ||
339 | spin_lock(&bdev->fence_lock); | ||
340 | |||
341 | list_for_each_entry(entry, &release->bos, head) { | ||
342 | bo = entry->bo; | ||
343 | qbo = to_qxl_bo(bo); | ||
344 | |||
345 | if (!entry->bo->sync_obj) | ||
346 | entry->bo->sync_obj = &qbo->fence; | ||
347 | |||
348 | qxl_fence_add_release_locked(&qbo->fence, release->id); | ||
349 | |||
350 | ttm_bo_add_to_lru(bo); | ||
351 | ww_mutex_unlock(&bo->resv->lock); | ||
352 | entry->reserved = false; | ||
353 | } | ||
354 | spin_unlock(&bdev->fence_lock); | ||
355 | spin_unlock(&glob->lru_lock); | ||
356 | ww_acquire_fini(&release->ticket); | ||
357 | } | ||
358 | |||
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 489cb8cece4d..1dfd84cda2a1 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c | |||
@@ -206,7 +206,7 @@ static void qxl_evict_flags(struct ttm_buffer_object *bo, | |||
206 | return; | 206 | return; |
207 | } | 207 | } |
208 | qbo = container_of(bo, struct qxl_bo, tbo); | 208 | qbo = container_of(bo, struct qxl_bo, tbo); |
209 | qxl_ttm_placement_from_domain(qbo, QXL_GEM_DOMAIN_CPU); | 209 | qxl_ttm_placement_from_domain(qbo, QXL_GEM_DOMAIN_CPU, false); |
210 | *placement = qbo->placement; | 210 | *placement = qbo->placement; |
211 | } | 211 | } |
212 | 212 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index b0d3fb341417..bb9ea3641312 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -157,9 +157,9 @@ static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock) | |||
157 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | 157 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
158 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 158 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
159 | */ | 159 | */ |
160 | WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); | ||
160 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); | 161 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); |
161 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); | 162 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); |
162 | WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); | ||
163 | } | 163 | } |
164 | 164 | ||
165 | 165 | ||
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c index 559cf24d51af..4f9b9bc20daa 100644 --- a/drivers/gpu/drm/radeon/ni_dpm.c +++ b/drivers/gpu/drm/radeon/ni_dpm.c | |||
@@ -1054,10 +1054,6 @@ static int ni_restrict_performance_levels_before_switch(struct radeon_device *rd | |||
1054 | int ni_dpm_force_performance_level(struct radeon_device *rdev, | 1054 | int ni_dpm_force_performance_level(struct radeon_device *rdev, |
1055 | enum radeon_dpm_forced_level level) | 1055 | enum radeon_dpm_forced_level level) |
1056 | { | 1056 | { |
1057 | struct radeon_ps *rps = rdev->pm.dpm.current_ps; | ||
1058 | struct ni_ps *ps = ni_get_ps(rps); | ||
1059 | u32 levels; | ||
1060 | |||
1061 | if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { | 1057 | if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { |
1062 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) | 1058 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) |
1063 | return -EINVAL; | 1059 | return -EINVAL; |
@@ -1068,8 +1064,7 @@ int ni_dpm_force_performance_level(struct radeon_device *rdev, | |||
1068 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) | 1064 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) |
1069 | return -EINVAL; | 1065 | return -EINVAL; |
1070 | 1066 | ||
1071 | levels = ps->performance_level_count - 1; | 1067 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK) |
1072 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) | ||
1073 | return -EINVAL; | 1068 | return -EINVAL; |
1074 | } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { | 1069 | } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { |
1075 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) | 1070 | if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index e3f3e8841789..4ccd61f60eb6 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -2782,7 +2782,7 @@ int radeon_atom_get_clock_dividers(struct radeon_device *rdev, | |||
2782 | ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false; | 2782 | ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false; |
2783 | dividers->enable_dithen = (args.v3.ucCntlFlag & | 2783 | dividers->enable_dithen = (args.v3.ucCntlFlag & |
2784 | ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true; | 2784 | ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true; |
2785 | dividers->fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv); | 2785 | dividers->whole_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv); |
2786 | dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac); | 2786 | dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac); |
2787 | dividers->ref_div = args.v3.ucRefDiv; | 2787 | dividers->ref_div = args.v3.ucRefDiv; |
2788 | dividers->vco_mode = (args.v3.ucCntlFlag & | 2788 | dividers->vco_mode = (args.v3.ucCntlFlag & |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index d325280e2f9f..6ca904673a4f 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -5215,14 +5215,12 @@ static void si_enable_mc_ls(struct radeon_device *rdev, | |||
5215 | 5215 | ||
5216 | static void si_init_cg(struct radeon_device *rdev) | 5216 | static void si_init_cg(struct radeon_device *rdev) |
5217 | { | 5217 | { |
5218 | bool has_uvd = true; | ||
5219 | |||
5220 | si_enable_mgcg(rdev, true); | 5218 | si_enable_mgcg(rdev, true); |
5221 | si_enable_cgcg(rdev, true); | 5219 | si_enable_cgcg(rdev, false); |
5222 | /* disable MC LS on Tahiti */ | 5220 | /* disable MC LS on Tahiti */ |
5223 | if (rdev->family == CHIP_TAHITI) | 5221 | if (rdev->family == CHIP_TAHITI) |
5224 | si_enable_mc_ls(rdev, false); | 5222 | si_enable_mc_ls(rdev, false); |
5225 | if (has_uvd) { | 5223 | if (rdev->has_uvd) { |
5226 | si_enable_uvd_mgcg(rdev, true); | 5224 | si_enable_uvd_mgcg(rdev, true); |
5227 | si_init_uvd_internal_cg(rdev); | 5225 | si_init_uvd_internal_cg(rdev); |
5228 | } | 5226 | } |
@@ -5230,9 +5228,7 @@ static void si_init_cg(struct radeon_device *rdev) | |||
5230 | 5228 | ||
5231 | static void si_fini_cg(struct radeon_device *rdev) | 5229 | static void si_fini_cg(struct radeon_device *rdev) |
5232 | { | 5230 | { |
5233 | bool has_uvd = true; | 5231 | if (rdev->has_uvd) |
5234 | |||
5235 | if (has_uvd) | ||
5236 | si_enable_uvd_mgcg(rdev, false); | 5232 | si_enable_uvd_mgcg(rdev, false); |
5237 | si_enable_cgcg(rdev, false); | 5233 | si_enable_cgcg(rdev, false); |
5238 | si_enable_mgcg(rdev, false); | 5234 | si_enable_mgcg(rdev, false); |
@@ -5241,11 +5237,11 @@ static void si_fini_cg(struct radeon_device *rdev) | |||
5241 | static void si_init_pg(struct radeon_device *rdev) | 5237 | static void si_init_pg(struct radeon_device *rdev) |
5242 | { | 5238 | { |
5243 | bool has_pg = false; | 5239 | bool has_pg = false; |
5244 | 5240 | #if 0 | |
5245 | /* only cape verde supports PG */ | 5241 | /* only cape verde supports PG */ |
5246 | if (rdev->family == CHIP_VERDE) | 5242 | if (rdev->family == CHIP_VERDE) |
5247 | has_pg = true; | 5243 | has_pg = true; |
5248 | 5244 | #endif | |
5249 | if (has_pg) { | 5245 | if (has_pg) { |
5250 | si_init_ao_cu_mask(rdev); | 5246 | si_init_ao_cu_mask(rdev); |
5251 | si_init_dma_pg(rdev); | 5247 | si_init_dma_pg(rdev); |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 73aaa2e4c312..1604a87cf2fe 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -37,8 +37,6 @@ | |||
37 | 37 | ||
38 | #define SMC_RAM_END 0x20000 | 38 | #define SMC_RAM_END 0x20000 |
39 | 39 | ||
40 | #define DDR3_DRAM_ROWS 0x2000 | ||
41 | |||
42 | #define SCLK_MIN_DEEPSLEEP_FREQ 1350 | 40 | #define SCLK_MIN_DEEPSLEEP_FREQ 1350 |
43 | 41 | ||
44 | static const struct si_cac_config_reg cac_weights_tahiti[] = | 42 | static const struct si_cac_config_reg cac_weights_tahiti[] = |
@@ -1931,6 +1929,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev) | |||
1931 | si_pi->cac_override = cac_override_pitcairn; | 1929 | si_pi->cac_override = cac_override_pitcairn; |
1932 | si_pi->powertune_data = &powertune_data_pitcairn; | 1930 | si_pi->powertune_data = &powertune_data_pitcairn; |
1933 | si_pi->dte_data = dte_data_pitcairn; | 1931 | si_pi->dte_data = dte_data_pitcairn; |
1932 | break; | ||
1934 | } | 1933 | } |
1935 | } else if (rdev->family == CHIP_VERDE) { | 1934 | } else if (rdev->family == CHIP_VERDE) { |
1936 | si_pi->lcac_config = lcac_cape_verde; | 1935 | si_pi->lcac_config = lcac_cape_verde; |
@@ -1941,6 +1940,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev) | |||
1941 | case 0x683B: | 1940 | case 0x683B: |
1942 | case 0x683F: | 1941 | case 0x683F: |
1943 | case 0x6829: | 1942 | case 0x6829: |
1943 | case 0x6835: | ||
1944 | si_pi->cac_weights = cac_weights_cape_verde_pro; | 1944 | si_pi->cac_weights = cac_weights_cape_verde_pro; |
1945 | si_pi->dte_data = dte_data_cape_verde; | 1945 | si_pi->dte_data = dte_data_cape_verde; |
1946 | break; | 1946 | break; |
@@ -2042,7 +2042,8 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev) | |||
2042 | ni_pi->enable_sq_ramping = false; | 2042 | ni_pi->enable_sq_ramping = false; |
2043 | si_pi->enable_dte = false; | 2043 | si_pi->enable_dte = false; |
2044 | 2044 | ||
2045 | if (si_pi->powertune_data->enable_powertune_by_default) { | 2045 | /* XXX: fix me */ |
2046 | if (0/*si_pi->powertune_data->enable_powertune_by_default*/) { | ||
2046 | ni_pi->enable_power_containment= true; | 2047 | ni_pi->enable_power_containment= true; |
2047 | ni_pi->enable_cac = true; | 2048 | ni_pi->enable_cac = true; |
2048 | if (si_pi->dte_data.enable_dte_by_default) { | 2049 | if (si_pi->dte_data.enable_dte_by_default) { |
@@ -3237,10 +3238,10 @@ int si_dpm_force_performance_level(struct radeon_device *rdev, | |||
3237 | { | 3238 | { |
3238 | struct radeon_ps *rps = rdev->pm.dpm.current_ps; | 3239 | struct radeon_ps *rps = rdev->pm.dpm.current_ps; |
3239 | struct ni_ps *ps = ni_get_ps(rps); | 3240 | struct ni_ps *ps = ni_get_ps(rps); |
3240 | u32 levels; | 3241 | u32 levels = ps->performance_level_count; |
3241 | 3242 | ||
3242 | if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { | 3243 | if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { |
3243 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) | 3244 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) |
3244 | return -EINVAL; | 3245 | return -EINVAL; |
3245 | 3246 | ||
3246 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK) | 3247 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK) |
@@ -3249,14 +3250,13 @@ int si_dpm_force_performance_level(struct radeon_device *rdev, | |||
3249 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) | 3250 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) |
3250 | return -EINVAL; | 3251 | return -EINVAL; |
3251 | 3252 | ||
3252 | levels = ps->performance_level_count - 1; | 3253 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK) |
3253 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) | ||
3254 | return -EINVAL; | 3254 | return -EINVAL; |
3255 | } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { | 3255 | } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { |
3256 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) | 3256 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) |
3257 | return -EINVAL; | 3257 | return -EINVAL; |
3258 | 3258 | ||
3259 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) | 3259 | if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) |
3260 | return -EINVAL; | 3260 | return -EINVAL; |
3261 | } | 3261 | } |
3262 | 3262 | ||
@@ -3620,8 +3620,12 @@ static void si_enable_display_gap(struct radeon_device *rdev) | |||
3620 | { | 3620 | { |
3621 | u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL); | 3621 | u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL); |
3622 | 3622 | ||
3623 | tmp &= ~(DISP1_GAP_MASK | DISP2_GAP_MASK); | ||
3624 | tmp |= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE) | | ||
3625 | DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE)); | ||
3626 | |||
3623 | tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK); | 3627 | tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK); |
3624 | tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE) | | 3628 | tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK) | |
3625 | DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE)); | 3629 | DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE)); |
3626 | WREG32(CG_DISPLAY_GAP_CNTL, tmp); | 3630 | WREG32(CG_DISPLAY_GAP_CNTL, tmp); |
3627 | } | 3631 | } |
@@ -4036,16 +4040,15 @@ static int si_force_switch_to_arb_f0(struct radeon_device *rdev) | |||
4036 | static u32 si_calculate_memory_refresh_rate(struct radeon_device *rdev, | 4040 | static u32 si_calculate_memory_refresh_rate(struct radeon_device *rdev, |
4037 | u32 engine_clock) | 4041 | u32 engine_clock) |
4038 | { | 4042 | { |
4039 | struct rv7xx_power_info *pi = rv770_get_pi(rdev); | ||
4040 | u32 dram_rows; | 4043 | u32 dram_rows; |
4041 | u32 dram_refresh_rate; | 4044 | u32 dram_refresh_rate; |
4042 | u32 mc_arb_rfsh_rate; | 4045 | u32 mc_arb_rfsh_rate; |
4043 | u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT; | 4046 | u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT; |
4044 | 4047 | ||
4045 | if (pi->mem_gddr5) | 4048 | if (tmp >= 4) |
4046 | dram_rows = 1 << (tmp + 10); | 4049 | dram_rows = 16384; |
4047 | else | 4050 | else |
4048 | dram_rows = DDR3_DRAM_ROWS; | 4051 | dram_rows = 1 << (tmp + 10); |
4049 | 4052 | ||
4050 | dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3); | 4053 | dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3); |
4051 | mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64; | 4054 | mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64; |
@@ -6013,16 +6016,11 @@ int si_dpm_set_power_state(struct radeon_device *rdev) | |||
6013 | return ret; | 6016 | return ret; |
6014 | } | 6017 | } |
6015 | 6018 | ||
6016 | #if 0 | ||
6017 | /* XXX */ | ||
6018 | ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO); | 6019 | ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO); |
6019 | if (ret) { | 6020 | if (ret) { |
6020 | DRM_ERROR("si_dpm_force_performance_level failed\n"); | 6021 | DRM_ERROR("si_dpm_force_performance_level failed\n"); |
6021 | return ret; | 6022 | return ret; |
6022 | } | 6023 | } |
6023 | #else | ||
6024 | rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO; | ||
6025 | #endif | ||
6026 | 6024 | ||
6027 | return 0; | 6025 | return 0; |
6028 | } | 6026 | } |
diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c index 4c605c70ebf9..deb5c25305af 100644 --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c | |||
@@ -562,7 +562,7 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size, | |||
562 | struct hv_hotadd_state *has) | 562 | struct hv_hotadd_state *has) |
563 | { | 563 | { |
564 | int ret = 0; | 564 | int ret = 0; |
565 | int i, nid, t; | 565 | int i, nid; |
566 | unsigned long start_pfn; | 566 | unsigned long start_pfn; |
567 | unsigned long processed_pfn; | 567 | unsigned long processed_pfn; |
568 | unsigned long total_pfn = pfn_count; | 568 | unsigned long total_pfn = pfn_count; |
@@ -607,14 +607,11 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size, | |||
607 | 607 | ||
608 | /* | 608 | /* |
609 | * Wait for the memory block to be onlined. | 609 | * Wait for the memory block to be onlined. |
610 | * Since the hot add has succeeded, it is ok to | ||
611 | * proceed even if the pages in the hot added region | ||
612 | * have not been "onlined" within the allowed time. | ||
610 | */ | 613 | */ |
611 | t = wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ); | 614 | wait_for_completion_timeout(&dm_device.ol_waitevent, 5*HZ); |
612 | if (t == 0) { | ||
613 | pr_info("hot_add memory timedout\n"); | ||
614 | has->ha_end_pfn -= HA_CHUNK; | ||
615 | has->covered_end_pfn -= processed_pfn; | ||
616 | break; | ||
617 | } | ||
618 | 615 | ||
619 | } | 616 | } |
620 | 617 | ||
@@ -978,6 +975,14 @@ static void post_status(struct hv_dynmem_device *dm) | |||
978 | dm->num_pages_ballooned + | 975 | dm->num_pages_ballooned + |
979 | compute_balloon_floor(); | 976 | compute_balloon_floor(); |
980 | 977 | ||
978 | /* | ||
979 | * If our transaction ID is no longer current, just don't | ||
980 | * send the status. This can happen if we were interrupted | ||
981 | * after we picked our transaction ID. | ||
982 | */ | ||
983 | if (status.hdr.trans_id != atomic_read(&trans_id)) | ||
984 | return; | ||
985 | |||
981 | vmbus_sendpacket(dm->dev->channel, &status, | 986 | vmbus_sendpacket(dm->dev->channel, &status, |
982 | sizeof(struct dm_status), | 987 | sizeof(struct dm_status), |
983 | (unsigned long)NULL, | 988 | (unsigned long)NULL, |
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index a2464bf07c49..e8e071fc1d6d 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c | |||
@@ -690,7 +690,7 @@ int vmbus_device_register(struct hv_device *child_device_obj) | |||
690 | if (ret) | 690 | if (ret) |
691 | pr_err("Unable to register child device\n"); | 691 | pr_err("Unable to register child device\n"); |
692 | else | 692 | else |
693 | pr_info("child device %s registered\n", | 693 | pr_debug("child device %s registered\n", |
694 | dev_name(&child_device_obj->device)); | 694 | dev_name(&child_device_obj->device)); |
695 | 695 | ||
696 | return ret; | 696 | return ret; |
@@ -702,14 +702,14 @@ int vmbus_device_register(struct hv_device *child_device_obj) | |||
702 | */ | 702 | */ |
703 | void vmbus_device_unregister(struct hv_device *device_obj) | 703 | void vmbus_device_unregister(struct hv_device *device_obj) |
704 | { | 704 | { |
705 | pr_debug("child device %s unregistered\n", | ||
706 | dev_name(&device_obj->device)); | ||
707 | |||
705 | /* | 708 | /* |
706 | * Kick off the process of unregistering the device. | 709 | * Kick off the process of unregistering the device. |
707 | * This will call vmbus_remove() and eventually vmbus_device_release() | 710 | * This will call vmbus_remove() and eventually vmbus_device_release() |
708 | */ | 711 | */ |
709 | device_unregister(&device_obj->device); | 712 | device_unregister(&device_obj->device); |
710 | |||
711 | pr_info("child device %s unregistered\n", | ||
712 | dev_name(&device_obj->device)); | ||
713 | } | 713 | } |
714 | 714 | ||
715 | 715 | ||
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 957a719e8c2f..df7b0a06b0ea 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -2290,12 +2290,18 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) | |||
2290 | d = r10_bio->devs[1].devnum; | 2290 | d = r10_bio->devs[1].devnum; |
2291 | wbio = r10_bio->devs[1].bio; | 2291 | wbio = r10_bio->devs[1].bio; |
2292 | wbio2 = r10_bio->devs[1].repl_bio; | 2292 | wbio2 = r10_bio->devs[1].repl_bio; |
2293 | /* Need to test wbio2->bi_end_io before we call | ||
2294 | * generic_make_request as if the former is NULL, | ||
2295 | * the latter is free to free wbio2. | ||
2296 | */ | ||
2297 | if (wbio2 && !wbio2->bi_end_io) | ||
2298 | wbio2 = NULL; | ||
2293 | if (wbio->bi_end_io) { | 2299 | if (wbio->bi_end_io) { |
2294 | atomic_inc(&conf->mirrors[d].rdev->nr_pending); | 2300 | atomic_inc(&conf->mirrors[d].rdev->nr_pending); |
2295 | md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio)); | 2301 | md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(wbio)); |
2296 | generic_make_request(wbio); | 2302 | generic_make_request(wbio); |
2297 | } | 2303 | } |
2298 | if (wbio2 && wbio2->bi_end_io) { | 2304 | if (wbio2) { |
2299 | atomic_inc(&conf->mirrors[d].replacement->nr_pending); | 2305 | atomic_inc(&conf->mirrors[d].replacement->nr_pending); |
2300 | md_sync_acct(conf->mirrors[d].replacement->bdev, | 2306 | md_sync_acct(conf->mirrors[d].replacement->bdev, |
2301 | bio_sectors(wbio2)); | 2307 | bio_sectors(wbio2)); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2bf094a587cb..78ea44336e75 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3462,6 +3462,7 @@ static void handle_stripe(struct stripe_head *sh) | |||
3462 | test_and_clear_bit(STRIPE_SYNC_REQUESTED, &sh->state)) { | 3462 | test_and_clear_bit(STRIPE_SYNC_REQUESTED, &sh->state)) { |
3463 | set_bit(STRIPE_SYNCING, &sh->state); | 3463 | set_bit(STRIPE_SYNCING, &sh->state); |
3464 | clear_bit(STRIPE_INSYNC, &sh->state); | 3464 | clear_bit(STRIPE_INSYNC, &sh->state); |
3465 | clear_bit(STRIPE_REPLACED, &sh->state); | ||
3465 | } | 3466 | } |
3466 | spin_unlock(&sh->stripe_lock); | 3467 | spin_unlock(&sh->stripe_lock); |
3467 | } | 3468 | } |
@@ -3607,19 +3608,23 @@ static void handle_stripe(struct stripe_head *sh) | |||
3607 | handle_parity_checks5(conf, sh, &s, disks); | 3608 | handle_parity_checks5(conf, sh, &s, disks); |
3608 | } | 3609 | } |
3609 | 3610 | ||
3610 | if (s.replacing && s.locked == 0 | 3611 | if ((s.replacing || s.syncing) && s.locked == 0 |
3611 | && !test_bit(STRIPE_INSYNC, &sh->state)) { | 3612 | && !test_bit(STRIPE_COMPUTE_RUN, &sh->state) |
3613 | && !test_bit(STRIPE_REPLACED, &sh->state)) { | ||
3612 | /* Write out to replacement devices where possible */ | 3614 | /* Write out to replacement devices where possible */ |
3613 | for (i = 0; i < conf->raid_disks; i++) | 3615 | for (i = 0; i < conf->raid_disks; i++) |
3614 | if (test_bit(R5_UPTODATE, &sh->dev[i].flags) && | 3616 | if (test_bit(R5_NeedReplace, &sh->dev[i].flags)) { |
3615 | test_bit(R5_NeedReplace, &sh->dev[i].flags)) { | 3617 | WARN_ON(!test_bit(R5_UPTODATE, &sh->dev[i].flags)); |
3616 | set_bit(R5_WantReplace, &sh->dev[i].flags); | 3618 | set_bit(R5_WantReplace, &sh->dev[i].flags); |
3617 | set_bit(R5_LOCKED, &sh->dev[i].flags); | 3619 | set_bit(R5_LOCKED, &sh->dev[i].flags); |
3618 | s.locked++; | 3620 | s.locked++; |
3619 | } | 3621 | } |
3620 | set_bit(STRIPE_INSYNC, &sh->state); | 3622 | if (s.replacing) |
3623 | set_bit(STRIPE_INSYNC, &sh->state); | ||
3624 | set_bit(STRIPE_REPLACED, &sh->state); | ||
3621 | } | 3625 | } |
3622 | if ((s.syncing || s.replacing) && s.locked == 0 && | 3626 | if ((s.syncing || s.replacing) && s.locked == 0 && |
3627 | !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && | ||
3623 | test_bit(STRIPE_INSYNC, &sh->state)) { | 3628 | test_bit(STRIPE_INSYNC, &sh->state)) { |
3624 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); | 3629 | md_done_sync(conf->mddev, STRIPE_SECTORS, 1); |
3625 | clear_bit(STRIPE_SYNCING, &sh->state); | 3630 | clear_bit(STRIPE_SYNCING, &sh->state); |
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index b0b663b119a8..70c49329ca9a 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
@@ -306,6 +306,7 @@ enum { | |||
306 | STRIPE_SYNC_REQUESTED, | 306 | STRIPE_SYNC_REQUESTED, |
307 | STRIPE_SYNCING, | 307 | STRIPE_SYNCING, |
308 | STRIPE_INSYNC, | 308 | STRIPE_INSYNC, |
309 | STRIPE_REPLACED, | ||
309 | STRIPE_PREREAD_ACTIVE, | 310 | STRIPE_PREREAD_ACTIVE, |
310 | STRIPE_DELAYED, | 311 | STRIPE_DELAYED, |
311 | STRIPE_DEGRADED, | 312 | STRIPE_DEGRADED, |
diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c index f7b90661e321..e068a76a5f6f 100644 --- a/drivers/misc/atmel-ssc.c +++ b/drivers/misc/atmel-ssc.c | |||
@@ -66,14 +66,19 @@ EXPORT_SYMBOL(ssc_request); | |||
66 | 66 | ||
67 | void ssc_free(struct ssc_device *ssc) | 67 | void ssc_free(struct ssc_device *ssc) |
68 | { | 68 | { |
69 | bool disable_clk = true; | ||
70 | |||
69 | spin_lock(&user_lock); | 71 | spin_lock(&user_lock); |
70 | if (ssc->user) { | 72 | if (ssc->user) |
71 | ssc->user--; | 73 | ssc->user--; |
72 | clk_disable_unprepare(ssc->clk); | 74 | else { |
73 | } else { | 75 | disable_clk = false; |
74 | dev_dbg(&ssc->pdev->dev, "device already free\n"); | 76 | dev_dbg(&ssc->pdev->dev, "device already free\n"); |
75 | } | 77 | } |
76 | spin_unlock(&user_lock); | 78 | spin_unlock(&user_lock); |
79 | |||
80 | if (disable_clk) | ||
81 | clk_disable_unprepare(ssc->clk); | ||
77 | } | 82 | } |
78 | EXPORT_SYMBOL(ssc_free); | 83 | EXPORT_SYMBOL(ssc_free); |
79 | 84 | ||
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index f9296abcf02a..6127ab64bb39 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
@@ -167,7 +167,7 @@ int mei_hbm_start_req(struct mei_device *dev) | |||
167 | 167 | ||
168 | dev->hbm_state = MEI_HBM_IDLE; | 168 | dev->hbm_state = MEI_HBM_IDLE; |
169 | if (mei_write_message(dev, mei_hdr, dev->wr_msg.data)) { | 169 | if (mei_write_message(dev, mei_hdr, dev->wr_msg.data)) { |
170 | dev_err(&dev->pdev->dev, "version message writet failed\n"); | 170 | dev_err(&dev->pdev->dev, "version message write failed\n"); |
171 | dev->dev_state = MEI_DEV_RESETTING; | 171 | dev->dev_state = MEI_DEV_RESETTING; |
172 | mei_reset(dev, 1); | 172 | mei_reset(dev, 1); |
173 | return -ENODEV; | 173 | return -ENODEV; |
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index e4f8dec4dc3c..b22c7e247225 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
@@ -239,14 +239,18 @@ static int mei_me_hw_ready_wait(struct mei_device *dev) | |||
239 | if (mei_me_hw_is_ready(dev)) | 239 | if (mei_me_hw_is_ready(dev)) |
240 | return 0; | 240 | return 0; |
241 | 241 | ||
242 | dev->recvd_hw_ready = false; | ||
242 | mutex_unlock(&dev->device_lock); | 243 | mutex_unlock(&dev->device_lock); |
243 | err = wait_event_interruptible_timeout(dev->wait_hw_ready, | 244 | err = wait_event_interruptible_timeout(dev->wait_hw_ready, |
244 | dev->recvd_hw_ready, MEI_INTEROP_TIMEOUT); | 245 | dev->recvd_hw_ready, |
246 | mei_secs_to_jiffies(MEI_INTEROP_TIMEOUT)); | ||
245 | mutex_lock(&dev->device_lock); | 247 | mutex_lock(&dev->device_lock); |
246 | if (!err && !dev->recvd_hw_ready) { | 248 | if (!err && !dev->recvd_hw_ready) { |
249 | if (!err) | ||
250 | err = -ETIMEDOUT; | ||
247 | dev_err(&dev->pdev->dev, | 251 | dev_err(&dev->pdev->dev, |
248 | "wait hw ready failed. status = 0x%x\n", err); | 252 | "wait hw ready failed. status = %d\n", err); |
249 | return -ETIMEDOUT; | 253 | return err; |
250 | } | 254 | } |
251 | 255 | ||
252 | dev->recvd_hw_ready = false; | 256 | dev->recvd_hw_ready = false; |
@@ -483,7 +487,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id) | |||
483 | /* check if ME wants a reset */ | 487 | /* check if ME wants a reset */ |
484 | if (!mei_hw_is_ready(dev) && | 488 | if (!mei_hw_is_ready(dev) && |
485 | dev->dev_state != MEI_DEV_RESETTING && | 489 | dev->dev_state != MEI_DEV_RESETTING && |
486 | dev->dev_state != MEI_DEV_INITIALIZING) { | 490 | dev->dev_state != MEI_DEV_INITIALIZING && |
491 | dev->dev_state != MEI_DEV_POWER_DOWN && | ||
492 | dev->dev_state != MEI_DEV_POWER_UP) { | ||
487 | dev_dbg(&dev->pdev->dev, "FW not ready.\n"); | 493 | dev_dbg(&dev->pdev->dev, "FW not ready.\n"); |
488 | mei_reset(dev, 1); | 494 | mei_reset(dev, 1); |
489 | mutex_unlock(&dev->device_lock); | 495 | mutex_unlock(&dev->device_lock); |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index ed1d75203af6..e6f16f83ecde 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
@@ -148,7 +148,8 @@ void mei_reset(struct mei_device *dev, int interrupts_enabled) | |||
148 | 148 | ||
149 | dev->hbm_state = MEI_HBM_IDLE; | 149 | dev->hbm_state = MEI_HBM_IDLE; |
150 | 150 | ||
151 | if (dev->dev_state != MEI_DEV_INITIALIZING) { | 151 | if (dev->dev_state != MEI_DEV_INITIALIZING && |
152 | dev->dev_state != MEI_DEV_POWER_UP) { | ||
152 | if (dev->dev_state != MEI_DEV_DISABLED && | 153 | if (dev->dev_state != MEI_DEV_DISABLED && |
153 | dev->dev_state != MEI_DEV_POWER_DOWN) | 154 | dev->dev_state != MEI_DEV_POWER_DOWN) |
154 | dev->dev_state = MEI_DEV_RESETTING; | 155 | dev->dev_state = MEI_DEV_RESETTING; |
diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index 847b1996ce8e..2c5a91bb8ec3 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c | |||
@@ -128,7 +128,7 @@ static inline int pxamci_set_power(struct pxamci_host *host, | |||
128 | !!on ^ host->pdata->gpio_power_invert); | 128 | !!on ^ host->pdata->gpio_power_invert); |
129 | } | 129 | } |
130 | if (!host->vcc && host->pdata && host->pdata->setpower) | 130 | if (!host->vcc && host->pdata && host->pdata->setpower) |
131 | host->pdata->setpower(mmc_dev(host->mmc), vdd); | 131 | return host->pdata->setpower(mmc_dev(host->mmc), vdd); |
132 | 132 | ||
133 | return 0; | 133 | return 0; |
134 | } | 134 | } |
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 5b272bfd261d..2a00239661b3 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -1193,6 +1193,7 @@ void pinctrl_unregister_map(struct pinctrl_map const *map) | |||
1193 | list_for_each_entry(maps_node, &pinctrl_maps, node) { | 1193 | list_for_each_entry(maps_node, &pinctrl_maps, node) { |
1194 | if (maps_node->maps == map) { | 1194 | if (maps_node->maps == map) { |
1195 | list_del(&maps_node->node); | 1195 | list_del(&maps_node->node); |
1196 | kfree(maps_node); | ||
1196 | mutex_unlock(&pinctrl_maps_mutex); | 1197 | mutex_unlock(&pinctrl_maps_mutex); |
1197 | return; | 1198 | return; |
1198 | } | 1199 | } |
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 6866548fab31..7323cca440b5 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
@@ -1483,6 +1483,7 @@ static int pcs_add_gpio_func(struct device_node *node, struct pcs_device *pcs) | |||
1483 | return ret; | 1483 | return ret; |
1484 | } | 1484 | } |
1485 | 1485 | ||
1486 | #ifdef CONFIG_PM | ||
1486 | static int pinctrl_single_suspend(struct platform_device *pdev, | 1487 | static int pinctrl_single_suspend(struct platform_device *pdev, |
1487 | pm_message_t state) | 1488 | pm_message_t state) |
1488 | { | 1489 | { |
@@ -1505,6 +1506,7 @@ static int pinctrl_single_resume(struct platform_device *pdev) | |||
1505 | 1506 | ||
1506 | return pinctrl_force_default(pcs->pctl); | 1507 | return pinctrl_force_default(pcs->pctl); |
1507 | } | 1508 | } |
1509 | #endif | ||
1508 | 1510 | ||
1509 | static int pcs_probe(struct platform_device *pdev) | 1511 | static int pcs_probe(struct platform_device *pdev) |
1510 | { | 1512 | { |
diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c index 7956df58d751..31f7d0e04aaa 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c | |||
@@ -3785,6 +3785,7 @@ static const struct regulator_desc sh73a0_vccq_mc0_desc = { | |||
3785 | 3785 | ||
3786 | static struct regulator_consumer_supply sh73a0_vccq_mc0_consumers[] = { | 3786 | static struct regulator_consumer_supply sh73a0_vccq_mc0_consumers[] = { |
3787 | REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), | 3787 | REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), |
3788 | REGULATOR_SUPPLY("vqmmc", "ee100000.sdhi"), | ||
3788 | }; | 3789 | }; |
3789 | 3790 | ||
3790 | static const struct regulator_init_data sh73a0_vccq_mc0_init_data = { | 3791 | static const struct regulator_init_data sh73a0_vccq_mc0_init_data = { |
diff --git a/drivers/pinctrl/sirf/pinctrl-atlas6.c b/drivers/pinctrl/sirf/pinctrl-atlas6.c index 1fa39a444171..867c9681763c 100644 --- a/drivers/pinctrl/sirf/pinctrl-atlas6.c +++ b/drivers/pinctrl/sirf/pinctrl-atlas6.c | |||
@@ -496,7 +496,7 @@ static const unsigned sdmmc5_pins[] = { 24, 25, 26 }; | |||
496 | static const struct sirfsoc_muxmask usp0_muxmask[] = { | 496 | static const struct sirfsoc_muxmask usp0_muxmask[] = { |
497 | { | 497 | { |
498 | .group = 1, | 498 | .group = 1, |
499 | .mask = BIT(19) | BIT(20) | BIT(21) | BIT(22), | 499 | .mask = BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23), |
500 | }, | 500 | }, |
501 | }; | 501 | }; |
502 | 502 | ||
@@ -507,8 +507,21 @@ static const struct sirfsoc_padmux usp0_padmux = { | |||
507 | .funcval = 0, | 507 | .funcval = 0, |
508 | }; | 508 | }; |
509 | 509 | ||
510 | static const unsigned usp0_pins[] = { 51, 52, 53, 54 }; | 510 | static const unsigned usp0_pins[] = { 51, 52, 53, 54, 55 }; |
511 | 511 | ||
512 | static const struct sirfsoc_muxmask usp0_uart_nostreamctrl_muxmask[] = { | ||
513 | { | ||
514 | .group = 1, | ||
515 | .mask = BIT(20) | BIT(21), | ||
516 | }, | ||
517 | }; | ||
518 | |||
519 | static const struct sirfsoc_padmux usp0_uart_nostreamctrl_padmux = { | ||
520 | .muxmask_counts = ARRAY_SIZE(usp0_uart_nostreamctrl_muxmask), | ||
521 | .muxmask = usp0_uart_nostreamctrl_muxmask, | ||
522 | }; | ||
523 | |||
524 | static const unsigned usp0_uart_nostreamctrl_pins[] = { 52, 53 }; | ||
512 | static const struct sirfsoc_muxmask usp1_muxmask[] = { | 525 | static const struct sirfsoc_muxmask usp1_muxmask[] = { |
513 | { | 526 | { |
514 | .group = 0, | 527 | .group = 0, |
@@ -822,6 +835,8 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = { | |||
822 | SIRFSOC_PIN_GROUP("uart2grp", uart2_pins), | 835 | SIRFSOC_PIN_GROUP("uart2grp", uart2_pins), |
823 | SIRFSOC_PIN_GROUP("uart2_nostreamctrlgrp", uart2_nostreamctrl_pins), | 836 | SIRFSOC_PIN_GROUP("uart2_nostreamctrlgrp", uart2_nostreamctrl_pins), |
824 | SIRFSOC_PIN_GROUP("usp0grp", usp0_pins), | 837 | SIRFSOC_PIN_GROUP("usp0grp", usp0_pins), |
838 | SIRFSOC_PIN_GROUP("usp0_uart_nostreamctrl_grp", | ||
839 | usp0_uart_nostreamctrl_pins), | ||
825 | SIRFSOC_PIN_GROUP("usp1grp", usp1_pins), | 840 | SIRFSOC_PIN_GROUP("usp1grp", usp1_pins), |
826 | SIRFSOC_PIN_GROUP("i2c0grp", i2c0_pins), | 841 | SIRFSOC_PIN_GROUP("i2c0grp", i2c0_pins), |
827 | SIRFSOC_PIN_GROUP("i2c1grp", i2c1_pins), | 842 | SIRFSOC_PIN_GROUP("i2c1grp", i2c1_pins), |
@@ -862,6 +877,8 @@ static const char * const uart0grp[] = { "uart0grp" }; | |||
862 | static const char * const uart1grp[] = { "uart1grp" }; | 877 | static const char * const uart1grp[] = { "uart1grp" }; |
863 | static const char * const uart2grp[] = { "uart2grp" }; | 878 | static const char * const uart2grp[] = { "uart2grp" }; |
864 | static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" }; | 879 | static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" }; |
880 | static const char * const usp0_uart_nostreamctrl_grp[] = { | ||
881 | "usp0_uart_nostreamctrl_grp" }; | ||
865 | static const char * const usp0grp[] = { "usp0grp" }; | 882 | static const char * const usp0grp[] = { "usp0grp" }; |
866 | static const char * const usp1grp[] = { "usp1grp" }; | 883 | static const char * const usp1grp[] = { "usp1grp" }; |
867 | static const char * const i2c0grp[] = { "i2c0grp" }; | 884 | static const char * const i2c0grp[] = { "i2c0grp" }; |
@@ -904,6 +921,9 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = { | |||
904 | SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux), | 921 | SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux), |
905 | SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux), | 922 | SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux), |
906 | SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux), | 923 | SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux), |
924 | SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl", | ||
925 | usp0_uart_nostreamctrl_grp, | ||
926 | usp0_uart_nostreamctrl_padmux), | ||
907 | SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux), | 927 | SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux), |
908 | SIRFSOC_PMX_FUNCTION("i2c0", i2c0grp, i2c0_padmux), | 928 | SIRFSOC_PMX_FUNCTION("i2c0", i2c0grp, i2c0_padmux), |
909 | SIRFSOC_PMX_FUNCTION("i2c1", i2c1grp, i2c1_padmux), | 929 | SIRFSOC_PMX_FUNCTION("i2c1", i2c1grp, i2c1_padmux), |
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index 7b082157eb79..99d2930b18c8 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
@@ -185,7 +185,7 @@ static void sci_io_request_build_ssp_command_iu(struct isci_request *ireq) | |||
185 | cmd_iu->_r_c = 0; | 185 | cmd_iu->_r_c = 0; |
186 | 186 | ||
187 | sci_swab32_cpy(&cmd_iu->cdb, task->ssp_task.cmd->cmnd, | 187 | sci_swab32_cpy(&cmd_iu->cdb, task->ssp_task.cmd->cmnd, |
188 | task->ssp_task.cmd->cmd_len / sizeof(u32)); | 188 | (task->ssp_task.cmd->cmd_len+3) / sizeof(u32)); |
189 | } | 189 | } |
190 | 190 | ||
191 | static void sci_task_request_build_ssp_task_iu(struct isci_request *ireq) | 191 | static void sci_task_request_build_ssp_task_iu(struct isci_request *ireq) |
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index 9bb020ac089c..0d30ca849e8f 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c | |||
@@ -491,6 +491,7 @@ int isci_task_abort_task(struct sas_task *task) | |||
491 | struct isci_tmf tmf; | 491 | struct isci_tmf tmf; |
492 | int ret = TMF_RESP_FUNC_FAILED; | 492 | int ret = TMF_RESP_FUNC_FAILED; |
493 | unsigned long flags; | 493 | unsigned long flags; |
494 | int target_done_already = 0; | ||
494 | 495 | ||
495 | /* Get the isci_request reference from the task. Note that | 496 | /* Get the isci_request reference from the task. Note that |
496 | * this check does not depend on the pending request list | 497 | * this check does not depend on the pending request list |
@@ -505,9 +506,11 @@ int isci_task_abort_task(struct sas_task *task) | |||
505 | /* If task is already done, the request isn't valid */ | 506 | /* If task is already done, the request isn't valid */ |
506 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && | 507 | if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && |
507 | (task->task_state_flags & SAS_TASK_AT_INITIATOR) && | 508 | (task->task_state_flags & SAS_TASK_AT_INITIATOR) && |
508 | old_request) | 509 | old_request) { |
509 | idev = isci_get_device(task->dev->lldd_dev); | 510 | idev = isci_get_device(task->dev->lldd_dev); |
510 | 511 | target_done_already = test_bit(IREQ_COMPLETE_IN_TARGET, | |
512 | &old_request->flags); | ||
513 | } | ||
511 | spin_unlock(&task->task_state_lock); | 514 | spin_unlock(&task->task_state_lock); |
512 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 515 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
513 | 516 | ||
@@ -561,7 +564,7 @@ int isci_task_abort_task(struct sas_task *task) | |||
561 | 564 | ||
562 | if (task->task_proto == SAS_PROTOCOL_SMP || | 565 | if (task->task_proto == SAS_PROTOCOL_SMP || |
563 | sas_protocol_ata(task->task_proto) || | 566 | sas_protocol_ata(task->task_proto) || |
564 | test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags) || | 567 | target_done_already || |
565 | test_bit(IDEV_GONE, &idev->flags)) { | 568 | test_bit(IDEV_GONE, &idev->flags)) { |
566 | 569 | ||
567 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 570 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index f14665a6293d..6b1b4e91e53f 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c | |||
@@ -1857,11 +1857,16 @@ int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags) | |||
1857 | goto out; | 1857 | goto out; |
1858 | } | 1858 | } |
1859 | 1859 | ||
1860 | /* error info record present */ | 1860 | /* |
1861 | if (unlikely((rx_desc & RXQ_ERR) && (*(u64 *) slot->response))) { | 1861 | * error info record present; slot->response is 32 bit aligned but may |
1862 | * not be 64 bit aligned, so check for zero in two 32 bit reads | ||
1863 | */ | ||
1864 | if (unlikely((rx_desc & RXQ_ERR) | ||
1865 | && (*((u32 *)slot->response) | ||
1866 | || *(((u32 *)slot->response) + 1)))) { | ||
1862 | mv_dprintk("port %d slot %d rx_desc %X has error info" | 1867 | mv_dprintk("port %d slot %d rx_desc %X has error info" |
1863 | "%016llX.\n", slot->port->sas_port.id, slot_idx, | 1868 | "%016llX.\n", slot->port->sas_port.id, slot_idx, |
1864 | rx_desc, (u64)(*(u64 *)slot->response)); | 1869 | rx_desc, get_unaligned_le64(slot->response)); |
1865 | tstat->stat = mvs_slot_err(mvi, task, slot_idx); | 1870 | tstat->stat = mvs_slot_err(mvi, task, slot_idx); |
1866 | tstat->resp = SAS_TASK_COMPLETE; | 1871 | tstat->resp = SAS_TASK_COMPLETE; |
1867 | goto out; | 1872 | goto out; |
diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h index 60e2fb7f2dca..d6b19dc80bee 100644 --- a/drivers/scsi/mvsas/mv_sas.h +++ b/drivers/scsi/mvsas/mv_sas.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/irq.h> | 39 | #include <linux/irq.h> |
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | #include <linux/vmalloc.h> | 41 | #include <linux/vmalloc.h> |
42 | #include <asm/unaligned.h> | ||
42 | #include <scsi/libsas.h> | 43 | #include <scsi/libsas.h> |
43 | #include <scsi/scsi.h> | 44 | #include <scsi/scsi.h> |
44 | #include <scsi/scsi_tcq.h> | 45 | #include <scsi/scsi_tcq.h> |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 42ef481db942..ef0a5481b9dd 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
@@ -419,6 +419,8 @@ qla2x00_start_scsi(srb_t *sp) | |||
419 | __constant_cpu_to_le16(CF_SIMPLE_TAG); | 419 | __constant_cpu_to_le16(CF_SIMPLE_TAG); |
420 | break; | 420 | break; |
421 | } | 421 | } |
422 | } else { | ||
423 | cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG); | ||
422 | } | 424 | } |
423 | 425 | ||
424 | /* Load SCSI command packet. */ | 426 | /* Load SCSI command packet. */ |
@@ -1307,11 +1309,11 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, | |||
1307 | fcp_cmnd->task_attribute = TSK_ORDERED; | 1309 | fcp_cmnd->task_attribute = TSK_ORDERED; |
1308 | break; | 1310 | break; |
1309 | default: | 1311 | default: |
1310 | fcp_cmnd->task_attribute = 0; | 1312 | fcp_cmnd->task_attribute = TSK_SIMPLE; |
1311 | break; | 1313 | break; |
1312 | } | 1314 | } |
1313 | } else { | 1315 | } else { |
1314 | fcp_cmnd->task_attribute = 0; | 1316 | fcp_cmnd->task_attribute = TSK_SIMPLE; |
1315 | } | 1317 | } |
1316 | 1318 | ||
1317 | cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ | 1319 | cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */ |
@@ -1525,7 +1527,12 @@ qla24xx_start_scsi(srb_t *sp) | |||
1525 | case ORDERED_QUEUE_TAG: | 1527 | case ORDERED_QUEUE_TAG: |
1526 | cmd_pkt->task = TSK_ORDERED; | 1528 | cmd_pkt->task = TSK_ORDERED; |
1527 | break; | 1529 | break; |
1530 | default: | ||
1531 | cmd_pkt->task = TSK_SIMPLE; | ||
1532 | break; | ||
1528 | } | 1533 | } |
1534 | } else { | ||
1535 | cmd_pkt->task = TSK_SIMPLE; | ||
1529 | } | 1536 | } |
1530 | 1537 | ||
1531 | /* Load SCSI command packet. */ | 1538 | /* Load SCSI command packet. */ |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 80f39b8b0223..86fcf2c313ad 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -838,10 +838,17 @@ static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) | |||
838 | 838 | ||
839 | static void sd_unprep_fn(struct request_queue *q, struct request *rq) | 839 | static void sd_unprep_fn(struct request_queue *q, struct request *rq) |
840 | { | 840 | { |
841 | struct scsi_cmnd *SCpnt = rq->special; | ||
842 | |||
841 | if (rq->cmd_flags & REQ_DISCARD) { | 843 | if (rq->cmd_flags & REQ_DISCARD) { |
842 | free_page((unsigned long)rq->buffer); | 844 | free_page((unsigned long)rq->buffer); |
843 | rq->buffer = NULL; | 845 | rq->buffer = NULL; |
844 | } | 846 | } |
847 | if (SCpnt->cmnd != rq->cmd) { | ||
848 | mempool_free(SCpnt->cmnd, sd_cdb_pool); | ||
849 | SCpnt->cmnd = NULL; | ||
850 | SCpnt->cmd_len = 0; | ||
851 | } | ||
845 | } | 852 | } |
846 | 853 | ||
847 | /** | 854 | /** |
@@ -1720,21 +1727,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
1720 | if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt)) | 1727 | if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt)) |
1721 | sd_dif_complete(SCpnt, good_bytes); | 1728 | sd_dif_complete(SCpnt, good_bytes); |
1722 | 1729 | ||
1723 | if (scsi_host_dif_capable(sdkp->device->host, sdkp->protection_type) | ||
1724 | == SD_DIF_TYPE2_PROTECTION && SCpnt->cmnd != SCpnt->request->cmd) { | ||
1725 | |||
1726 | /* We have to print a failed command here as the | ||
1727 | * extended CDB gets freed before scsi_io_completion() | ||
1728 | * is called. | ||
1729 | */ | ||
1730 | if (result) | ||
1731 | scsi_print_command(SCpnt); | ||
1732 | |||
1733 | mempool_free(SCpnt->cmnd, sd_cdb_pool); | ||
1734 | SCpnt->cmnd = NULL; | ||
1735 | SCpnt->cmd_len = 0; | ||
1736 | } | ||
1737 | |||
1738 | return good_bytes; | 1730 | return good_bytes; |
1739 | } | 1731 | } |
1740 | 1732 | ||
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 080abf2faf97..a8c344422a77 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c | |||
@@ -469,7 +469,7 @@ static ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
469 | unsigned long nr_segs, loff_t ppos) | 469 | unsigned long nr_segs, loff_t ppos) |
470 | { | 470 | { |
471 | struct logger_log *log = file_get_log(iocb->ki_filp); | 471 | struct logger_log *log = file_get_log(iocb->ki_filp); |
472 | size_t orig = log->w_off; | 472 | size_t orig; |
473 | struct logger_entry header; | 473 | struct logger_entry header; |
474 | struct timespec now; | 474 | struct timespec now; |
475 | ssize_t ret = 0; | 475 | ssize_t ret = 0; |
@@ -490,6 +490,8 @@ static ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
490 | 490 | ||
491 | mutex_lock(&log->mutex); | 491 | mutex_lock(&log->mutex); |
492 | 492 | ||
493 | orig = log->w_off; | ||
494 | |||
493 | /* | 495 | /* |
494 | * Fix up any readers, pulling them forward to the first readable | 496 | * Fix up any readers, pulling them forward to the first readable |
495 | * entry after (what will be) the new write offset. We do this now | 497 | * entry after (what will be) the new write offset. We do this now |
diff --git a/drivers/staging/comedi/TODO b/drivers/staging/comedi/TODO index b10f739b7e3e..fa8da9aada30 100644 --- a/drivers/staging/comedi/TODO +++ b/drivers/staging/comedi/TODO | |||
@@ -9,4 +9,4 @@ TODO: | |||
9 | Please send patches to Greg Kroah-Hartman <greg@kroah.com> and | 9 | Please send patches to Greg Kroah-Hartman <greg@kroah.com> and |
10 | copy: | 10 | copy: |
11 | Ian Abbott <abbotti@mev.co.uk> | 11 | Ian Abbott <abbotti@mev.co.uk> |
12 | Frank Mori Hess <fmhess@users.sourceforge.net> | 12 | H Hartley Sweeten <hsweeten@visionengravers.com> |
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index 8647518259f6..f4a197b2d1fd 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c | |||
@@ -1413,22 +1413,19 @@ static int do_cmd_ioctl(struct comedi_device *dev, | |||
1413 | DPRINTK("subdevice busy\n"); | 1413 | DPRINTK("subdevice busy\n"); |
1414 | return -EBUSY; | 1414 | return -EBUSY; |
1415 | } | 1415 | } |
1416 | s->busy = file; | ||
1417 | 1416 | ||
1418 | /* make sure channel/gain list isn't too long */ | 1417 | /* make sure channel/gain list isn't too long */ |
1419 | if (cmd.chanlist_len > s->len_chanlist) { | 1418 | if (cmd.chanlist_len > s->len_chanlist) { |
1420 | DPRINTK("channel/gain list too long %u > %d\n", | 1419 | DPRINTK("channel/gain list too long %u > %d\n", |
1421 | cmd.chanlist_len, s->len_chanlist); | 1420 | cmd.chanlist_len, s->len_chanlist); |
1422 | ret = -EINVAL; | 1421 | return -EINVAL; |
1423 | goto cleanup; | ||
1424 | } | 1422 | } |
1425 | 1423 | ||
1426 | /* make sure channel/gain list isn't too short */ | 1424 | /* make sure channel/gain list isn't too short */ |
1427 | if (cmd.chanlist_len < 1) { | 1425 | if (cmd.chanlist_len < 1) { |
1428 | DPRINTK("channel/gain list too short %u < 1\n", | 1426 | DPRINTK("channel/gain list too short %u < 1\n", |
1429 | cmd.chanlist_len); | 1427 | cmd.chanlist_len); |
1430 | ret = -EINVAL; | 1428 | return -EINVAL; |
1431 | goto cleanup; | ||
1432 | } | 1429 | } |
1433 | 1430 | ||
1434 | async->cmd = cmd; | 1431 | async->cmd = cmd; |
@@ -1438,8 +1435,7 @@ static int do_cmd_ioctl(struct comedi_device *dev, | |||
1438 | kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL); | 1435 | kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL); |
1439 | if (!async->cmd.chanlist) { | 1436 | if (!async->cmd.chanlist) { |
1440 | DPRINTK("allocation failed\n"); | 1437 | DPRINTK("allocation failed\n"); |
1441 | ret = -ENOMEM; | 1438 | return -ENOMEM; |
1442 | goto cleanup; | ||
1443 | } | 1439 | } |
1444 | 1440 | ||
1445 | if (copy_from_user(async->cmd.chanlist, user_chanlist, | 1441 | if (copy_from_user(async->cmd.chanlist, user_chanlist, |
@@ -1491,6 +1487,9 @@ static int do_cmd_ioctl(struct comedi_device *dev, | |||
1491 | 1487 | ||
1492 | comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); | 1488 | comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); |
1493 | 1489 | ||
1490 | /* set s->busy _after_ setting SRF_RUNNING flag to avoid race with | ||
1491 | * comedi_read() or comedi_write() */ | ||
1492 | s->busy = file; | ||
1494 | ret = s->do_cmd(dev, s); | 1493 | ret = s->do_cmd(dev, s); |
1495 | if (ret == 0) | 1494 | if (ret == 0) |
1496 | return 0; | 1495 | return 0; |
@@ -1705,6 +1704,7 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | |||
1705 | void *file) | 1704 | void *file) |
1706 | { | 1705 | { |
1707 | struct comedi_subdevice *s; | 1706 | struct comedi_subdevice *s; |
1707 | int ret; | ||
1708 | 1708 | ||
1709 | if (arg >= dev->n_subdevices) | 1709 | if (arg >= dev->n_subdevices) |
1710 | return -EINVAL; | 1710 | return -EINVAL; |
@@ -1721,7 +1721,11 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg, | |||
1721 | if (s->busy != file) | 1721 | if (s->busy != file) |
1722 | return -EBUSY; | 1722 | return -EBUSY; |
1723 | 1723 | ||
1724 | return do_cancel(dev, s); | 1724 | ret = do_cancel(dev, s); |
1725 | if (comedi_get_subdevice_runflags(s) & SRF_USER) | ||
1726 | wake_up_interruptible(&s->async->wait_head); | ||
1727 | |||
1728 | return ret; | ||
1725 | } | 1729 | } |
1726 | 1730 | ||
1727 | /* | 1731 | /* |
@@ -2053,11 +2057,13 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, | |||
2053 | 2057 | ||
2054 | if (!comedi_is_subdevice_running(s)) { | 2058 | if (!comedi_is_subdevice_running(s)) { |
2055 | if (count == 0) { | 2059 | if (count == 0) { |
2060 | mutex_lock(&dev->mutex); | ||
2056 | if (comedi_is_subdevice_in_error(s)) | 2061 | if (comedi_is_subdevice_in_error(s)) |
2057 | retval = -EPIPE; | 2062 | retval = -EPIPE; |
2058 | else | 2063 | else |
2059 | retval = 0; | 2064 | retval = 0; |
2060 | do_become_nonbusy(dev, s); | 2065 | do_become_nonbusy(dev, s); |
2066 | mutex_unlock(&dev->mutex); | ||
2061 | } | 2067 | } |
2062 | break; | 2068 | break; |
2063 | } | 2069 | } |
@@ -2156,11 +2162,13 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, | |||
2156 | 2162 | ||
2157 | if (n == 0) { | 2163 | if (n == 0) { |
2158 | if (!comedi_is_subdevice_running(s)) { | 2164 | if (!comedi_is_subdevice_running(s)) { |
2165 | mutex_lock(&dev->mutex); | ||
2159 | do_become_nonbusy(dev, s); | 2166 | do_become_nonbusy(dev, s); |
2160 | if (comedi_is_subdevice_in_error(s)) | 2167 | if (comedi_is_subdevice_in_error(s)) |
2161 | retval = -EPIPE; | 2168 | retval = -EPIPE; |
2162 | else | 2169 | else |
2163 | retval = 0; | 2170 | retval = 0; |
2171 | mutex_unlock(&dev->mutex); | ||
2164 | break; | 2172 | break; |
2165 | } | 2173 | } |
2166 | if (file->f_flags & O_NONBLOCK) { | 2174 | if (file->f_flags & O_NONBLOCK) { |
@@ -2198,9 +2206,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, | |||
2198 | buf += n; | 2206 | buf += n; |
2199 | break; /* makes device work like a pipe */ | 2207 | break; /* makes device work like a pipe */ |
2200 | } | 2208 | } |
2201 | if (comedi_is_subdevice_idle(s) && | 2209 | if (comedi_is_subdevice_idle(s)) { |
2202 | async->buf_read_count - async->buf_write_count == 0) { | 2210 | mutex_lock(&dev->mutex); |
2203 | do_become_nonbusy(dev, s); | 2211 | if (async->buf_read_count - async->buf_write_count == 0) |
2212 | do_become_nonbusy(dev, s); | ||
2213 | mutex_unlock(&dev->mutex); | ||
2204 | } | 2214 | } |
2205 | set_current_state(TASK_RUNNING); | 2215 | set_current_state(TASK_RUNNING); |
2206 | remove_wait_queue(&async->wait_head, &wait); | 2216 | remove_wait_queue(&async->wait_head, &wait); |
diff --git a/drivers/staging/frontier/alphatrack.c b/drivers/staging/frontier/alphatrack.c index 5590ebf1da15..817f837b240d 100644 --- a/drivers/staging/frontier/alphatrack.c +++ b/drivers/staging/frontier/alphatrack.c | |||
@@ -827,11 +827,11 @@ static void usb_alphatrack_disconnect(struct usb_interface *intf) | |||
827 | mutex_unlock(&dev->mtx); | 827 | mutex_unlock(&dev->mtx); |
828 | usb_alphatrack_delete(dev); | 828 | usb_alphatrack_delete(dev); |
829 | } else { | 829 | } else { |
830 | atomic_set(&dev->writes_pending, 0); | ||
830 | dev->intf = NULL; | 831 | dev->intf = NULL; |
831 | mutex_unlock(&dev->mtx); | 832 | mutex_unlock(&dev->mtx); |
832 | } | 833 | } |
833 | 834 | ||
834 | atomic_set(&dev->writes_pending, 0); | ||
835 | mutex_unlock(&disconnect_mutex); | 835 | mutex_unlock(&disconnect_mutex); |
836 | 836 | ||
837 | dev_info(&intf->dev, "Alphatrack Surface #%d now disconnected\n", | 837 | dev_info(&intf->dev, "Alphatrack Surface #%d now disconnected\n", |
diff --git a/drivers/staging/gdm72xx/gdm_qos.c b/drivers/staging/gdm72xx/gdm_qos.c index b795353e8348..cc3692439a5c 100644 --- a/drivers/staging/gdm72xx/gdm_qos.c +++ b/drivers/staging/gdm72xx/gdm_qos.c | |||
@@ -250,8 +250,8 @@ static void send_qos_list(struct nic *nic, struct list_head *head) | |||
250 | 250 | ||
251 | list_for_each_entry_safe(entry, n, head, list) { | 251 | list_for_each_entry_safe(entry, n, head, list) { |
252 | list_del(&entry->list); | 252 | list_del(&entry->list); |
253 | free_qos_entry(entry); | ||
254 | gdm_wimax_send_tx(entry->skb, entry->dev); | 253 | gdm_wimax_send_tx(entry->skb, entry->dev); |
254 | free_qos_entry(entry); | ||
255 | } | 255 | } |
256 | } | 256 | } |
257 | 257 | ||
diff --git a/drivers/staging/imx-drm/Kconfig b/drivers/staging/imx-drm/Kconfig index 22339059837f..bd0f2fd01db4 100644 --- a/drivers/staging/imx-drm/Kconfig +++ b/drivers/staging/imx-drm/Kconfig | |||
@@ -33,7 +33,6 @@ config DRM_IMX_TVE | |||
33 | config DRM_IMX_LDB | 33 | config DRM_IMX_LDB |
34 | tristate "Support for LVDS displays" | 34 | tristate "Support for LVDS displays" |
35 | depends on DRM_IMX | 35 | depends on DRM_IMX |
36 | select OF_VIDEOMODE | ||
37 | help | 36 | help |
38 | Choose this to enable the internal LVDS Display Bridge (LDB) | 37 | Choose this to enable the internal LVDS Display Bridge (LDB) |
39 | found on i.MX53 and i.MX6 processors. | 38 | found on i.MX53 and i.MX6 processors. |
diff --git a/drivers/staging/tidspbridge/pmgr/dbll.c b/drivers/staging/tidspbridge/pmgr/dbll.c index c191ae203565..41e88abe47af 100644 --- a/drivers/staging/tidspbridge/pmgr/dbll.c +++ b/drivers/staging/tidspbridge/pmgr/dbll.c | |||
@@ -1120,8 +1120,11 @@ static int dbll_rmm_alloc(struct dynamic_loader_allocate *this, | |||
1120 | or DYN_EXTERNAL, then mem granularity information is present | 1120 | or DYN_EXTERNAL, then mem granularity information is present |
1121 | within the section name - only process if there are at least three | 1121 | within the section name - only process if there are at least three |
1122 | tokens within the section name (just a minor optimization) */ | 1122 | tokens within the section name (just a minor optimization) */ |
1123 | if (count >= 3) | 1123 | if (count >= 3) { |
1124 | strict_strtol(sz_last_token, 10, (long *)&req); | 1124 | status = kstrtos32(sz_last_token, 10, &req); |
1125 | if (status) | ||
1126 | goto func_cont; | ||
1127 | } | ||
1125 | 1128 | ||
1126 | if ((req == 0) || (req == 1)) { | 1129 | if ((req == 0) || (req == 1)) { |
1127 | if (strcmp(sz_sec_last_token, "DYN_DARAM") == 0) { | 1130 | if (strcmp(sz_sec_last_token, "DYN_DARAM") == 0) { |
diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 82c7202fd5cc..e77fb6ea40c9 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c | |||
@@ -527,8 +527,11 @@ static void zram_reset_device(struct zram *zram) | |||
527 | size_t index; | 527 | size_t index; |
528 | struct zram_meta *meta; | 528 | struct zram_meta *meta; |
529 | 529 | ||
530 | if (!zram->init_done) | 530 | down_write(&zram->init_lock); |
531 | if (!zram->init_done) { | ||
532 | up_write(&zram->init_lock); | ||
531 | return; | 533 | return; |
534 | } | ||
532 | 535 | ||
533 | meta = zram->meta; | 536 | meta = zram->meta; |
534 | zram->init_done = 0; | 537 | zram->init_done = 0; |
@@ -549,6 +552,7 @@ static void zram_reset_device(struct zram *zram) | |||
549 | 552 | ||
550 | zram->disksize = 0; | 553 | zram->disksize = 0; |
551 | set_capacity(zram->disk, 0); | 554 | set_capacity(zram->disk, 0); |
555 | up_write(&zram->init_lock); | ||
552 | } | 556 | } |
553 | 557 | ||
554 | static void zram_init_device(struct zram *zram, struct zram_meta *meta) | 558 | static void zram_init_device(struct zram *zram, struct zram_meta *meta) |
diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c index 721904f8efa9..946ddd2b3a54 100644 --- a/drivers/tty/serial/8250/8250_early.c +++ b/drivers/tty/serial/8250/8250_early.c | |||
@@ -193,7 +193,8 @@ static int __init parse_options(struct early_serial8250_device *device, | |||
193 | if (options) { | 193 | if (options) { |
194 | options++; | 194 | options++; |
195 | device->baud = simple_strtoul(options, NULL, 0); | 195 | device->baud = simple_strtoul(options, NULL, 0); |
196 | length = min(strcspn(options, " "), sizeof(device->options)); | 196 | length = min(strcspn(options, " ") + 1, |
197 | sizeof(device->options)); | ||
197 | strlcpy(device->options, options, length); | 198 | strlcpy(device->options, options, length); |
198 | } else { | 199 | } else { |
199 | device->baud = probe_baud(port); | 200 | device->baud = probe_baud(port); |
diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 5e3d68917ffe..1456673bcca0 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig | |||
@@ -277,7 +277,7 @@ config SERIAL_TEGRA | |||
277 | select SERIAL_CORE | 277 | select SERIAL_CORE |
278 | help | 278 | help |
279 | Support for the on-chip UARTs on the NVIDIA Tegra series SOCs | 279 | Support for the on-chip UARTs on the NVIDIA Tegra series SOCs |
280 | providing /dev/ttyHS0, 1, 2, 3 and 4 (note, some machines may not | 280 | providing /dev/ttyTHS0, 1, 2, 3 and 4 (note, some machines may not |
281 | provide all of these ports, depending on how the serial port | 281 | provide all of these ports, depending on how the serial port |
282 | are enabled). This driver uses the APB DMA to achieve higher baudrate | 282 | are enabled). This driver uses the APB DMA to achieve higher baudrate |
283 | and better performance. | 283 | and better performance. |
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c index ff171384ea52..dc6e96996ead 100644 --- a/drivers/tty/synclinkmp.c +++ b/drivers/tty/synclinkmp.c | |||
@@ -3478,7 +3478,7 @@ static int alloc_buf_list(SLMP_INFO *info) | |||
3478 | for ( i = 0; i < info->rx_buf_count; i++ ) { | 3478 | for ( i = 0; i < info->rx_buf_count; i++ ) { |
3479 | /* calculate and store physical address of this buffer entry */ | 3479 | /* calculate and store physical address of this buffer entry */ |
3480 | info->rx_buf_list_ex[i].phys_entry = | 3480 | info->rx_buf_list_ex[i].phys_entry = |
3481 | info->buffer_list_phys + (i * sizeof(SCABUFSIZE)); | 3481 | info->buffer_list_phys + (i * SCABUFSIZE); |
3482 | 3482 | ||
3483 | /* calculate and store physical address of */ | 3483 | /* calculate and store physical address of */ |
3484 | /* next entry in cirular list of entries */ | 3484 | /* next entry in cirular list of entries */ |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 4191db32f12c..4a8a1d68002c 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -668,6 +668,15 @@ resubmit: | |||
668 | static inline int | 668 | static inline int |
669 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) | 669 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) |
670 | { | 670 | { |
671 | /* Need to clear both directions for control ep */ | ||
672 | if (((devinfo >> 11) & USB_ENDPOINT_XFERTYPE_MASK) == | ||
673 | USB_ENDPOINT_XFER_CONTROL) { | ||
674 | int status = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
675 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, | ||
676 | devinfo ^ 0x8000, tt, NULL, 0, 1000); | ||
677 | if (status) | ||
678 | return status; | ||
679 | } | ||
671 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | 680 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), |
672 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, | 681 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, |
673 | tt, NULL, 0, 1000); | 682 | tt, NULL, 0, 1000); |
@@ -2848,6 +2857,15 @@ static int usb_disable_function_remotewakeup(struct usb_device *udev) | |||
2848 | USB_CTRL_SET_TIMEOUT); | 2857 | USB_CTRL_SET_TIMEOUT); |
2849 | } | 2858 | } |
2850 | 2859 | ||
2860 | /* Count of wakeup-enabled devices at or below udev */ | ||
2861 | static unsigned wakeup_enabled_descendants(struct usb_device *udev) | ||
2862 | { | ||
2863 | struct usb_hub *hub = usb_hub_to_struct_hub(udev); | ||
2864 | |||
2865 | return udev->do_remote_wakeup + | ||
2866 | (hub ? hub->wakeup_enabled_descendants : 0); | ||
2867 | } | ||
2868 | |||
2851 | /* | 2869 | /* |
2852 | * usb_port_suspend - suspend a usb device's upstream port | 2870 | * usb_port_suspend - suspend a usb device's upstream port |
2853 | * @udev: device that's no longer in active use, not a root hub | 2871 | * @udev: device that's no longer in active use, not a root hub |
@@ -2888,8 +2906,8 @@ static int usb_disable_function_remotewakeup(struct usb_device *udev) | |||
2888 | * Linux (2.6) currently has NO mechanisms to initiate that: no khubd | 2906 | * Linux (2.6) currently has NO mechanisms to initiate that: no khubd |
2889 | * timer, no SRP, no requests through sysfs. | 2907 | * timer, no SRP, no requests through sysfs. |
2890 | * | 2908 | * |
2891 | * If Runtime PM isn't enabled or used, non-SuperSpeed devices really get | 2909 | * If Runtime PM isn't enabled or used, non-SuperSpeed devices may not get |
2892 | * suspended only when their bus goes into global suspend (i.e., the root | 2910 | * suspended until their bus goes into global suspend (i.e., the root |
2893 | * hub is suspended). Nevertheless, we change @udev->state to | 2911 | * hub is suspended). Nevertheless, we change @udev->state to |
2894 | * USB_STATE_SUSPENDED as this is the device's "logical" state. The actual | 2912 | * USB_STATE_SUSPENDED as this is the device's "logical" state. The actual |
2895 | * upstream port setting is stored in @udev->port_is_suspended. | 2913 | * upstream port setting is stored in @udev->port_is_suspended. |
@@ -2960,15 +2978,21 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
2960 | /* see 7.1.7.6 */ | 2978 | /* see 7.1.7.6 */ |
2961 | if (hub_is_superspeed(hub->hdev)) | 2979 | if (hub_is_superspeed(hub->hdev)) |
2962 | status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U3); | 2980 | status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U3); |
2963 | else if (PMSG_IS_AUTO(msg)) | 2981 | |
2964 | status = set_port_feature(hub->hdev, port1, | ||
2965 | USB_PORT_FEAT_SUSPEND); | ||
2966 | /* | 2982 | /* |
2967 | * For system suspend, we do not need to enable the suspend feature | 2983 | * For system suspend, we do not need to enable the suspend feature |
2968 | * on individual USB-2 ports. The devices will automatically go | 2984 | * on individual USB-2 ports. The devices will automatically go |
2969 | * into suspend a few ms after the root hub stops sending packets. | 2985 | * into suspend a few ms after the root hub stops sending packets. |
2970 | * The USB 2.0 spec calls this "global suspend". | 2986 | * The USB 2.0 spec calls this "global suspend". |
2987 | * | ||
2988 | * However, many USB hubs have a bug: They don't relay wakeup requests | ||
2989 | * from a downstream port if the port's suspend feature isn't on. | ||
2990 | * Therefore we will turn on the suspend feature if udev or any of its | ||
2991 | * descendants is enabled for remote wakeup. | ||
2971 | */ | 2992 | */ |
2993 | else if (PMSG_IS_AUTO(msg) || wakeup_enabled_descendants(udev) > 0) | ||
2994 | status = set_port_feature(hub->hdev, port1, | ||
2995 | USB_PORT_FEAT_SUSPEND); | ||
2972 | else { | 2996 | else { |
2973 | really_suspend = false; | 2997 | really_suspend = false; |
2974 | status = 0; | 2998 | status = 0; |
@@ -3003,15 +3027,16 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
3003 | if (!PMSG_IS_AUTO(msg)) | 3027 | if (!PMSG_IS_AUTO(msg)) |
3004 | status = 0; | 3028 | status = 0; |
3005 | } else { | 3029 | } else { |
3006 | /* device has up to 10 msec to fully suspend */ | ||
3007 | dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", | 3030 | dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", |
3008 | (PMSG_IS_AUTO(msg) ? "auto-" : ""), | 3031 | (PMSG_IS_AUTO(msg) ? "auto-" : ""), |
3009 | udev->do_remote_wakeup); | 3032 | udev->do_remote_wakeup); |
3010 | usb_set_device_state(udev, USB_STATE_SUSPENDED); | ||
3011 | if (really_suspend) { | 3033 | if (really_suspend) { |
3012 | udev->port_is_suspended = 1; | 3034 | udev->port_is_suspended = 1; |
3035 | |||
3036 | /* device has up to 10 msec to fully suspend */ | ||
3013 | msleep(10); | 3037 | msleep(10); |
3014 | } | 3038 | } |
3039 | usb_set_device_state(udev, USB_STATE_SUSPENDED); | ||
3015 | } | 3040 | } |
3016 | 3041 | ||
3017 | /* | 3042 | /* |
@@ -3293,7 +3318,11 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
3293 | unsigned port1; | 3318 | unsigned port1; |
3294 | int status; | 3319 | int status; |
3295 | 3320 | ||
3296 | /* Warn if children aren't already suspended */ | 3321 | /* |
3322 | * Warn if children aren't already suspended. | ||
3323 | * Also, add up the number of wakeup-enabled descendants. | ||
3324 | */ | ||
3325 | hub->wakeup_enabled_descendants = 0; | ||
3297 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 3326 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
3298 | struct usb_device *udev; | 3327 | struct usb_device *udev; |
3299 | 3328 | ||
@@ -3303,6 +3332,9 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
3303 | if (PMSG_IS_AUTO(msg)) | 3332 | if (PMSG_IS_AUTO(msg)) |
3304 | return -EBUSY; | 3333 | return -EBUSY; |
3305 | } | 3334 | } |
3335 | if (udev) | ||
3336 | hub->wakeup_enabled_descendants += | ||
3337 | wakeup_enabled_descendants(udev); | ||
3306 | } | 3338 | } |
3307 | 3339 | ||
3308 | if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) { | 3340 | if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) { |
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 6508e02b3dac..4e4790dea343 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h | |||
@@ -59,6 +59,9 @@ struct usb_hub { | |||
59 | struct usb_tt tt; /* Transaction Translator */ | 59 | struct usb_tt tt; /* Transaction Translator */ |
60 | 60 | ||
61 | unsigned mA_per_port; /* current for each child */ | 61 | unsigned mA_per_port; /* current for each child */ |
62 | #ifdef CONFIG_PM | ||
63 | unsigned wakeup_enabled_descendants; | ||
64 | #endif | ||
62 | 65 | ||
63 | unsigned limited_power:1; | 66 | unsigned limited_power:1; |
64 | unsigned quiescing:1; | 67 | unsigned quiescing:1; |
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig index 757aa18027d0..2378958ea63e 100644 --- a/drivers/usb/dwc3/Kconfig +++ b/drivers/usb/dwc3/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config USB_DWC3 | 1 | config USB_DWC3 |
2 | tristate "DesignWare USB3 DRD Core Support" | 2 | tristate "DesignWare USB3 DRD Core Support" |
3 | depends on (USB || USB_GADGET) && GENERIC_HARDIRQS | 3 | depends on (USB || USB_GADGET) && GENERIC_HARDIRQS && HAS_DMA |
4 | select USB_XHCI_PLATFORM if USB_SUPPORT && USB_XHCI_HCD | 4 | select USB_XHCI_PLATFORM if USB_SUPPORT && USB_XHCI_HCD |
5 | help | 5 | help |
6 | Say Y or M here if your system has a Dual Role SuperSpeed | 6 | Say Y or M here if your system has a Dual Role SuperSpeed |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c35d49d39b76..358375e0b291 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -450,7 +450,7 @@ static int dwc3_probe(struct platform_device *pdev) | |||
450 | } | 450 | } |
451 | 451 | ||
452 | if (IS_ERR(dwc->usb3_phy)) { | 452 | if (IS_ERR(dwc->usb3_phy)) { |
453 | ret = PTR_ERR(dwc->usb2_phy); | 453 | ret = PTR_ERR(dwc->usb3_phy); |
454 | 454 | ||
455 | /* | 455 | /* |
456 | * if -ENXIO is returned, it means PHY layer wasn't | 456 | * if -ENXIO is returned, it means PHY layer wasn't |
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index b69d322e3cab..27dad993b007 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -759,8 +759,8 @@ struct dwc3 { | |||
759 | 759 | ||
760 | struct dwc3_event_type { | 760 | struct dwc3_event_type { |
761 | u32 is_devspec:1; | 761 | u32 is_devspec:1; |
762 | u32 type:6; | 762 | u32 type:7; |
763 | u32 reserved8_31:25; | 763 | u32 reserved8_31:24; |
764 | } __packed; | 764 | } __packed; |
765 | 765 | ||
766 | #define DWC3_DEPEVT_XFERCOMPLETE 0x01 | 766 | #define DWC3_DEPEVT_XFERCOMPLETE 0x01 |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index b5e5b35df49c..f77083fedc68 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -1584,6 +1584,7 @@ err1: | |||
1584 | __dwc3_gadget_ep_disable(dwc->eps[0]); | 1584 | __dwc3_gadget_ep_disable(dwc->eps[0]); |
1585 | 1585 | ||
1586 | err0: | 1586 | err0: |
1587 | dwc->gadget_driver = NULL; | ||
1587 | spin_unlock_irqrestore(&dwc->lock, flags); | 1588 | spin_unlock_irqrestore(&dwc->lock, flags); |
1588 | 1589 | ||
1589 | return ret; | 1590 | return ret; |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 62f6802f6e0f..8e9368330b10 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -193,6 +193,7 @@ config USB_FUSB300 | |||
193 | Faraday usb device controller FUSB300 driver | 193 | Faraday usb device controller FUSB300 driver |
194 | 194 | ||
195 | config USB_FOTG210_UDC | 195 | config USB_FOTG210_UDC |
196 | depends on HAS_DMA | ||
196 | tristate "Faraday FOTG210 USB Peripheral Controller" | 197 | tristate "Faraday FOTG210 USB Peripheral Controller" |
197 | help | 198 | help |
198 | Faraday USB2.0 OTG controller which can be configured as | 199 | Faraday USB2.0 OTG controller which can be configured as |
@@ -328,13 +329,14 @@ config USB_S3C_HSUDC | |||
328 | 329 | ||
329 | config USB_MV_UDC | 330 | config USB_MV_UDC |
330 | tristate "Marvell USB2.0 Device Controller" | 331 | tristate "Marvell USB2.0 Device Controller" |
331 | depends on GENERIC_HARDIRQS | 332 | depends on GENERIC_HARDIRQS && HAS_DMA |
332 | help | 333 | help |
333 | Marvell Socs (including PXA and MMP series) include a high speed | 334 | Marvell Socs (including PXA and MMP series) include a high speed |
334 | USB2.0 OTG controller, which can be configured as high speed or | 335 | USB2.0 OTG controller, which can be configured as high speed or |
335 | full speed USB peripheral. | 336 | full speed USB peripheral. |
336 | 337 | ||
337 | config USB_MV_U3D | 338 | config USB_MV_U3D |
339 | depends on HAS_DMA | ||
338 | tristate "MARVELL PXA2128 USB 3.0 controller" | 340 | tristate "MARVELL PXA2128 USB 3.0 controller" |
339 | help | 341 | help |
340 | MARVELL PXA2128 Processor series include a super speed USB3.0 device | 342 | MARVELL PXA2128 Processor series include a super speed USB3.0 device |
@@ -639,6 +641,7 @@ config USB_CONFIGFS_RNDIS | |||
639 | depends on USB_CONFIGFS | 641 | depends on USB_CONFIGFS |
640 | depends on NET | 642 | depends on NET |
641 | select USB_U_ETHER | 643 | select USB_U_ETHER |
644 | select USB_U_RNDIS | ||
642 | select USB_F_RNDIS | 645 | select USB_F_RNDIS |
643 | help | 646 | help |
644 | Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol, | 647 | Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol, |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 073b938f9135..d9a6add0c852 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -870,8 +870,8 @@ static void clk_on(struct at91_udc *udc) | |||
870 | if (udc->clocked) | 870 | if (udc->clocked) |
871 | return; | 871 | return; |
872 | udc->clocked = 1; | 872 | udc->clocked = 1; |
873 | clk_enable(udc->iclk); | 873 | clk_prepare_enable(udc->iclk); |
874 | clk_enable(udc->fclk); | 874 | clk_prepare_enable(udc->fclk); |
875 | } | 875 | } |
876 | 876 | ||
877 | static void clk_off(struct at91_udc *udc) | 877 | static void clk_off(struct at91_udc *udc) |
@@ -880,8 +880,8 @@ static void clk_off(struct at91_udc *udc) | |||
880 | return; | 880 | return; |
881 | udc->clocked = 0; | 881 | udc->clocked = 0; |
882 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 882 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
883 | clk_disable(udc->fclk); | 883 | clk_disable_unprepare(udc->fclk); |
884 | clk_disable(udc->iclk); | 884 | clk_disable_unprepare(udc->iclk); |
885 | } | 885 | } |
886 | 886 | ||
887 | /* | 887 | /* |
@@ -1725,7 +1725,7 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1725 | /* init software state */ | 1725 | /* init software state */ |
1726 | udc = &controller; | 1726 | udc = &controller; |
1727 | udc->gadget.dev.parent = dev; | 1727 | udc->gadget.dev.parent = dev; |
1728 | if (pdev->dev.of_node) | 1728 | if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) |
1729 | at91udc_of_init(udc, pdev->dev.of_node); | 1729 | at91udc_of_init(udc, pdev->dev.of_node); |
1730 | else | 1730 | else |
1731 | memcpy(&udc->board, dev->platform_data, | 1731 | memcpy(&udc->board, dev->platform_data, |
@@ -1782,12 +1782,14 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1782 | } | 1782 | } |
1783 | 1783 | ||
1784 | /* don't do anything until we have both gadget driver and VBUS */ | 1784 | /* don't do anything until we have both gadget driver and VBUS */ |
1785 | clk_enable(udc->iclk); | 1785 | retval = clk_prepare_enable(udc->iclk); |
1786 | if (retval) | ||
1787 | goto fail1; | ||
1786 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 1788 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
1787 | at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); | 1789 | at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); |
1788 | /* Clear all pending interrupts - UDP may be used by bootloader. */ | 1790 | /* Clear all pending interrupts - UDP may be used by bootloader. */ |
1789 | at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff); | 1791 | at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff); |
1790 | clk_disable(udc->iclk); | 1792 | clk_disable_unprepare(udc->iclk); |
1791 | 1793 | ||
1792 | /* request UDC and maybe VBUS irqs */ | 1794 | /* request UDC and maybe VBUS irqs */ |
1793 | udc->udp_irq = platform_get_irq(pdev, 0); | 1795 | udc->udp_irq = platform_get_irq(pdev, 0); |
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 5d3561ea1c15..edab45da3741 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c | |||
@@ -959,8 +959,11 @@ static struct usb_function_instance *ecm_alloc_inst(void) | |||
959 | mutex_init(&opts->lock); | 959 | mutex_init(&opts->lock); |
960 | opts->func_inst.free_func_inst = ecm_free_inst; | 960 | opts->func_inst.free_func_inst = ecm_free_inst; |
961 | opts->net = gether_setup_default(); | 961 | opts->net = gether_setup_default(); |
962 | if (IS_ERR(opts->net)) | 962 | if (IS_ERR(opts->net)) { |
963 | return ERR_PTR(PTR_ERR(opts->net)); | 963 | struct net_device *net = opts->net; |
964 | kfree(opts); | ||
965 | return ERR_CAST(net); | ||
966 | } | ||
964 | 967 | ||
965 | config_group_init_type_name(&opts->func_inst.group, "", &ecm_func_type); | 968 | config_group_init_type_name(&opts->func_inst.group, "", &ecm_func_type); |
966 | 969 | ||
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c index 90ee8022e8d8..d00392d879db 100644 --- a/drivers/usb/gadget/f_eem.c +++ b/drivers/usb/gadget/f_eem.c | |||
@@ -593,8 +593,11 @@ static struct usb_function_instance *eem_alloc_inst(void) | |||
593 | mutex_init(&opts->lock); | 593 | mutex_init(&opts->lock); |
594 | opts->func_inst.free_func_inst = eem_free_inst; | 594 | opts->func_inst.free_func_inst = eem_free_inst; |
595 | opts->net = gether_setup_default(); | 595 | opts->net = gether_setup_default(); |
596 | if (IS_ERR(opts->net)) | 596 | if (IS_ERR(opts->net)) { |
597 | return ERR_CAST(opts->net); | 597 | struct net_device *net = opts->net; |
598 | kfree(opts); | ||
599 | return ERR_CAST(net); | ||
600 | } | ||
598 | 601 | ||
599 | config_group_init_type_name(&opts->func_inst.group, "", &eem_func_type); | 602 | config_group_init_type_name(&opts->func_inst.group, "", &eem_func_type); |
600 | 603 | ||
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c index 952177f7eb9b..1c28fe13328a 100644 --- a/drivers/usb/gadget/f_ncm.c +++ b/drivers/usb/gadget/f_ncm.c | |||
@@ -1350,8 +1350,11 @@ static struct usb_function_instance *ncm_alloc_inst(void) | |||
1350 | mutex_init(&opts->lock); | 1350 | mutex_init(&opts->lock); |
1351 | opts->func_inst.free_func_inst = ncm_free_inst; | 1351 | opts->func_inst.free_func_inst = ncm_free_inst; |
1352 | opts->net = gether_setup_default(); | 1352 | opts->net = gether_setup_default(); |
1353 | if (IS_ERR(opts->net)) | 1353 | if (IS_ERR(opts->net)) { |
1354 | return ERR_PTR(PTR_ERR(opts->net)); | 1354 | struct net_device *net = opts->net; |
1355 | kfree(opts); | ||
1356 | return ERR_CAST(net); | ||
1357 | } | ||
1355 | 1358 | ||
1356 | config_group_init_type_name(&opts->func_inst.group, "", &ncm_func_type); | 1359 | config_group_init_type_name(&opts->func_inst.group, "", &ncm_func_type); |
1357 | 1360 | ||
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 7944fb0efe3b..1bf26e9f38cd 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
@@ -656,8 +656,11 @@ static struct usb_function_instance *phonet_alloc_inst(void) | |||
656 | 656 | ||
657 | opts->func_inst.free_func_inst = phonet_free_inst; | 657 | opts->func_inst.free_func_inst = phonet_free_inst; |
658 | opts->net = gphonet_setup_default(); | 658 | opts->net = gphonet_setup_default(); |
659 | if (IS_ERR(opts->net)) | 659 | if (IS_ERR(opts->net)) { |
660 | return ERR_PTR(PTR_ERR(opts->net)); | 660 | struct net_device *net = opts->net; |
661 | kfree(opts); | ||
662 | return ERR_CAST(net); | ||
663 | } | ||
661 | 664 | ||
662 | config_group_init_type_name(&opts->func_inst.group, "", | 665 | config_group_init_type_name(&opts->func_inst.group, "", |
663 | &phonet_func_type); | 666 | &phonet_func_type); |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 191df35ae69d..717ed7f95639 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -963,8 +963,11 @@ static struct usb_function_instance *rndis_alloc_inst(void) | |||
963 | mutex_init(&opts->lock); | 963 | mutex_init(&opts->lock); |
964 | opts->func_inst.free_func_inst = rndis_free_inst; | 964 | opts->func_inst.free_func_inst = rndis_free_inst; |
965 | opts->net = gether_setup_default(); | 965 | opts->net = gether_setup_default(); |
966 | if (IS_ERR(opts->net)) | 966 | if (IS_ERR(opts->net)) { |
967 | return ERR_CAST(opts->net); | 967 | struct net_device *net = opts->net; |
968 | kfree(opts); | ||
969 | return ERR_CAST(net); | ||
970 | } | ||
968 | 971 | ||
969 | config_group_init_type_name(&opts->func_inst.group, "", | 972 | config_group_init_type_name(&opts->func_inst.group, "", |
970 | &rndis_func_type); | 973 | &rndis_func_type); |
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index 5601e1d96c4f..7c8674fa7e80 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c | |||
@@ -505,8 +505,11 @@ static struct usb_function_instance *geth_alloc_inst(void) | |||
505 | mutex_init(&opts->lock); | 505 | mutex_init(&opts->lock); |
506 | opts->func_inst.free_func_inst = geth_free_inst; | 506 | opts->func_inst.free_func_inst = geth_free_inst; |
507 | opts->net = gether_setup_default(); | 507 | opts->net = gether_setup_default(); |
508 | if (IS_ERR(opts->net)) | 508 | if (IS_ERR(opts->net)) { |
509 | return ERR_CAST(opts->net); | 509 | struct net_device *net = opts->net; |
510 | kfree(opts); | ||
511 | return ERR_CAST(net); | ||
512 | } | ||
510 | 513 | ||
511 | config_group_init_type_name(&opts->func_inst.group, "", | 514 | config_group_init_type_name(&opts->func_inst.group, "", |
512 | &gether_func_type); | 515 | &gether_func_type); |
diff --git a/drivers/usb/gadget/fotg210-udc.c b/drivers/usb/gadget/fotg210-udc.c index cce5535b1dc6..10cd18ddd0d4 100644 --- a/drivers/usb/gadget/fotg210-udc.c +++ b/drivers/usb/gadget/fotg210-udc.c | |||
@@ -1074,7 +1074,7 @@ static struct usb_gadget_ops fotg210_gadget_ops = { | |||
1074 | .udc_stop = fotg210_udc_stop, | 1074 | .udc_stop = fotg210_udc_stop, |
1075 | }; | 1075 | }; |
1076 | 1076 | ||
1077 | static int __exit fotg210_udc_remove(struct platform_device *pdev) | 1077 | static int fotg210_udc_remove(struct platform_device *pdev) |
1078 | { | 1078 | { |
1079 | struct fotg210_udc *fotg210 = dev_get_drvdata(&pdev->dev); | 1079 | struct fotg210_udc *fotg210 = dev_get_drvdata(&pdev->dev); |
1080 | 1080 | ||
@@ -1088,7 +1088,7 @@ static int __exit fotg210_udc_remove(struct platform_device *pdev) | |||
1088 | return 0; | 1088 | return 0; |
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | static int __init fotg210_udc_probe(struct platform_device *pdev) | 1091 | static int fotg210_udc_probe(struct platform_device *pdev) |
1092 | { | 1092 | { |
1093 | struct resource *res, *ires; | 1093 | struct resource *res, *ires; |
1094 | struct fotg210_udc *fotg210 = NULL; | 1094 | struct fotg210_udc *fotg210 = NULL; |
diff --git a/drivers/usb/gadget/mv_u3d_core.c b/drivers/usb/gadget/mv_u3d_core.c index 07fdb3eaf48a..ec6a2d290398 100644 --- a/drivers/usb/gadget/mv_u3d_core.c +++ b/drivers/usb/gadget/mv_u3d_core.c | |||
@@ -1776,7 +1776,7 @@ static int mv_u3d_remove(struct platform_device *dev) | |||
1776 | kfree(u3d->eps); | 1776 | kfree(u3d->eps); |
1777 | 1777 | ||
1778 | if (u3d->irq) | 1778 | if (u3d->irq) |
1779 | free_irq(u3d->irq, &dev->dev); | 1779 | free_irq(u3d->irq, u3d); |
1780 | 1780 | ||
1781 | if (u3d->cap_regs) | 1781 | if (u3d->cap_regs) |
1782 | iounmap(u3d->cap_regs); | 1782 | iounmap(u3d->cap_regs); |
@@ -1974,7 +1974,7 @@ static int mv_u3d_probe(struct platform_device *dev) | |||
1974 | return 0; | 1974 | return 0; |
1975 | 1975 | ||
1976 | err_unregister: | 1976 | err_unregister: |
1977 | free_irq(u3d->irq, &dev->dev); | 1977 | free_irq(u3d->irq, u3d); |
1978 | err_request_irq: | 1978 | err_request_irq: |
1979 | err_get_irq: | 1979 | err_get_irq: |
1980 | kfree(u3d->status_req); | 1980 | kfree(u3d->status_req); |
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index ffd8fa541101..c28ac9872030 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c | |||
@@ -50,6 +50,8 @@ static DEFINE_MUTEX(udc_lock); | |||
50 | 50 | ||
51 | /* ------------------------------------------------------------------------- */ | 51 | /* ------------------------------------------------------------------------- */ |
52 | 52 | ||
53 | #ifdef CONFIG_HAS_DMA | ||
54 | |||
53 | int usb_gadget_map_request(struct usb_gadget *gadget, | 55 | int usb_gadget_map_request(struct usb_gadget *gadget, |
54 | struct usb_request *req, int is_in) | 56 | struct usb_request *req, int is_in) |
55 | { | 57 | { |
@@ -99,6 +101,8 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget, | |||
99 | } | 101 | } |
100 | EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); | 102 | EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); |
101 | 103 | ||
104 | #endif /* CONFIG_HAS_DMA */ | ||
105 | |||
102 | /* ------------------------------------------------------------------------- */ | 106 | /* ------------------------------------------------------------------------- */ |
103 | 107 | ||
104 | void usb_gadget_set_state(struct usb_gadget *gadget, | 108 | void usb_gadget_set_state(struct usb_gadget *gadget, |
@@ -194,9 +198,11 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, | |||
194 | dev_set_name(&gadget->dev, "gadget"); | 198 | dev_set_name(&gadget->dev, "gadget"); |
195 | gadget->dev.parent = parent; | 199 | gadget->dev.parent = parent; |
196 | 200 | ||
201 | #ifdef CONFIG_HAS_DMA | ||
197 | dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask); | 202 | dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask); |
198 | gadget->dev.dma_parms = parent->dma_parms; | 203 | gadget->dev.dma_parms = parent->dma_parms; |
199 | gadget->dev.dma_mask = parent->dma_mask; | 204 | gadget->dev.dma_mask = parent->dma_mask; |
205 | #endif | ||
200 | 206 | ||
201 | if (release) | 207 | if (release) |
202 | gadget->dev.release = release; | 208 | gadget->dev.release = release; |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 2b702772d04d..6dce37555c4f 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -874,6 +874,7 @@ static int ehci_hub_control ( | |||
874 | ehci->reset_done[wIndex] = jiffies | 874 | ehci->reset_done[wIndex] = jiffies |
875 | + msecs_to_jiffies(20); | 875 | + msecs_to_jiffies(20); |
876 | usb_hcd_start_port_resume(&hcd->self, wIndex); | 876 | usb_hcd_start_port_resume(&hcd->self, wIndex); |
877 | set_bit(wIndex, &ehci->resuming_ports); | ||
877 | /* check the port again */ | 878 | /* check the port again */ |
878 | mod_timer(&ehci_to_hcd(ehci)->rh_timer, | 879 | mod_timer(&ehci_to_hcd(ehci)->rh_timer, |
879 | ehci->reset_done[wIndex]); | 880 | ehci->reset_done[wIndex]); |
diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h index 4b8a2092432f..978c849f9c9a 100644 --- a/drivers/usb/host/pci-quirks.h +++ b/drivers/usb/host/pci-quirks.h | |||
@@ -13,6 +13,7 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev); | |||
13 | void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); | 13 | void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); |
14 | void sb800_prefetch(struct device *dev, int on); | 14 | void sb800_prefetch(struct device *dev, int on); |
15 | #else | 15 | #else |
16 | struct pci_dev; | ||
16 | static inline void usb_amd_quirk_pll_disable(void) {} | 17 | static inline void usb_amd_quirk_pll_disable(void) {} |
17 | static inline void usb_amd_quirk_pll_enable(void) {} | 18 | static inline void usb_amd_quirk_pll_enable(void) {} |
18 | static inline void usb_amd_dev_put(void) {} | 19 | static inline void usb_amd_dev_put(void) {} |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index cc24e39b97d5..f00cb203faea 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -93,7 +93,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
93 | } | 93 | } |
94 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | 94 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && |
95 | pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) { | 95 | pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) { |
96 | xhci->quirks |= XHCI_SPURIOUS_SUCCESS; | ||
97 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; | 96 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; |
98 | xhci->limit_active_eps = 64; | 97 | xhci->limit_active_eps = 64; |
99 | xhci->quirks |= XHCI_SW_BW_CHECKING; | 98 | xhci->quirks |= XHCI_SW_BW_CHECKING; |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 1e57eafa6910..5b08cd85f8e7 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -434,7 +434,7 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, | |||
434 | 434 | ||
435 | /* A ring has pending URBs if its TD list is not empty */ | 435 | /* A ring has pending URBs if its TD list is not empty */ |
436 | if (!(ep->ep_state & EP_HAS_STREAMS)) { | 436 | if (!(ep->ep_state & EP_HAS_STREAMS)) { |
437 | if (!(list_empty(&ep->ring->td_list))) | 437 | if (ep->ring && !(list_empty(&ep->ring->td_list))) |
438 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, 0); | 438 | xhci_ring_ep_doorbell(xhci, slot_id, ep_index, 0); |
439 | return; | 439 | return; |
440 | } | 440 | } |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 2c49f00260ca..41eb4fc33453 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -329,7 +329,7 @@ static void xhci_cleanup_msix(struct xhci_hcd *xhci) | |||
329 | return; | 329 | return; |
330 | } | 330 | } |
331 | 331 | ||
332 | static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) | 332 | static void __maybe_unused xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
333 | { | 333 | { |
334 | int i; | 334 | int i; |
335 | 335 | ||
@@ -1181,9 +1181,6 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, | |||
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | xhci = hcd_to_xhci(hcd); | 1183 | xhci = hcd_to_xhci(hcd); |
1184 | if (xhci->xhc_state & XHCI_STATE_HALTED) | ||
1185 | return -ENODEV; | ||
1186 | |||
1187 | if (check_virt_dev) { | 1184 | if (check_virt_dev) { |
1188 | if (!udev->slot_id || !xhci->devs[udev->slot_id]) { | 1185 | if (!udev->slot_id || !xhci->devs[udev->slot_id]) { |
1189 | printk(KERN_DEBUG "xHCI %s called with unaddressed " | 1186 | printk(KERN_DEBUG "xHCI %s called with unaddressed " |
@@ -1199,6 +1196,9 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, | |||
1199 | } | 1196 | } |
1200 | } | 1197 | } |
1201 | 1198 | ||
1199 | if (xhci->xhc_state & XHCI_STATE_HALTED) | ||
1200 | return -ENODEV; | ||
1201 | |||
1202 | return 1; | 1202 | return 1; |
1203 | } | 1203 | } |
1204 | 1204 | ||
@@ -3898,7 +3898,7 @@ int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1) | |||
3898 | * Issue an Evaluate Context command to change the Maximum Exit Latency in the | 3898 | * Issue an Evaluate Context command to change the Maximum Exit Latency in the |
3899 | * slot context. If that succeeds, store the new MEL in the xhci_virt_device. | 3899 | * slot context. If that succeeds, store the new MEL in the xhci_virt_device. |
3900 | */ | 3900 | */ |
3901 | static int xhci_change_max_exit_latency(struct xhci_hcd *xhci, | 3901 | static int __maybe_unused xhci_change_max_exit_latency(struct xhci_hcd *xhci, |
3902 | struct usb_device *udev, u16 max_exit_latency) | 3902 | struct usb_device *udev, u16 max_exit_latency) |
3903 | { | 3903 | { |
3904 | struct xhci_virt_device *virt_dev; | 3904 | struct xhci_virt_device *virt_dev; |
@@ -4892,6 +4892,13 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) | |||
4892 | 4892 | ||
4893 | get_quirks(dev, xhci); | 4893 | get_quirks(dev, xhci); |
4894 | 4894 | ||
4895 | /* In xhci controllers which follow xhci 1.0 spec gives a spurious | ||
4896 | * success event after a short transfer. This quirk will ignore such | ||
4897 | * spurious event. | ||
4898 | */ | ||
4899 | if (xhci->hci_version > 0x96) | ||
4900 | xhci->quirks |= XHCI_SPURIOUS_SUCCESS; | ||
4901 | |||
4895 | /* Make sure the HC is halted. */ | 4902 | /* Make sure the HC is halted. */ |
4896 | retval = xhci_halt(xhci); | 4903 | retval = xhci_halt(xhci); |
4897 | if (retval) | 4904 | if (retval) |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index c21386ec5d35..de98906f786d 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -3247,6 +3247,7 @@ static const struct usb_device_id sisusb_table[] = { | |||
3247 | { USB_DEVICE(0x0711, 0x0903) }, | 3247 | { USB_DEVICE(0x0711, 0x0903) }, |
3248 | { USB_DEVICE(0x0711, 0x0918) }, | 3248 | { USB_DEVICE(0x0711, 0x0918) }, |
3249 | { USB_DEVICE(0x0711, 0x0920) }, | 3249 | { USB_DEVICE(0x0711, 0x0920) }, |
3250 | { USB_DEVICE(0x0711, 0x0950) }, | ||
3250 | { USB_DEVICE(0x182d, 0x021c) }, | 3251 | { USB_DEVICE(0x182d, 0x021c) }, |
3251 | { USB_DEVICE(0x182d, 0x0269) }, | 3252 | { USB_DEVICE(0x182d, 0x0269) }, |
3252 | { } | 3253 | { } |
diff --git a/drivers/usb/phy/phy-omap-usb3.c b/drivers/usb/phy/phy-omap-usb3.c index efe6e1464f45..a2fb30bbb971 100644 --- a/drivers/usb/phy/phy-omap-usb3.c +++ b/drivers/usb/phy/phy-omap-usb3.c | |||
@@ -71,9 +71,9 @@ static struct usb_dpll_params omap_usb3_dpll_params[NUM_SYS_CLKS] = { | |||
71 | {1250, 5, 4, 20, 0}, /* 12 MHz */ | 71 | {1250, 5, 4, 20, 0}, /* 12 MHz */ |
72 | {3125, 20, 4, 20, 0}, /* 16.8 MHz */ | 72 | {3125, 20, 4, 20, 0}, /* 16.8 MHz */ |
73 | {1172, 8, 4, 20, 65537}, /* 19.2 MHz */ | 73 | {1172, 8, 4, 20, 65537}, /* 19.2 MHz */ |
74 | {1000, 7, 4, 10, 0}, /* 20 MHz */ | ||
74 | {1250, 12, 4, 20, 0}, /* 26 MHz */ | 75 | {1250, 12, 4, 20, 0}, /* 26 MHz */ |
75 | {3125, 47, 4, 20, 92843}, /* 38.4 MHz */ | 76 | {3125, 47, 4, 20, 92843}, /* 38.4 MHz */ |
76 | {1000, 7, 4, 10, 0}, /* 20 MHz */ | ||
77 | 77 | ||
78 | }; | 78 | }; |
79 | 79 | ||
diff --git a/drivers/usb/phy/phy-samsung-usb2.c b/drivers/usb/phy/phy-samsung-usb2.c index 1011c16ade7e..758b86d0fcb3 100644 --- a/drivers/usb/phy/phy-samsung-usb2.c +++ b/drivers/usb/phy/phy-samsung-usb2.c | |||
@@ -388,7 +388,7 @@ static int samsung_usb2phy_probe(struct platform_device *pdev) | |||
388 | clk = devm_clk_get(dev, "otg"); | 388 | clk = devm_clk_get(dev, "otg"); |
389 | 389 | ||
390 | if (IS_ERR(clk)) { | 390 | if (IS_ERR(clk)) { |
391 | dev_err(dev, "Failed to get otg clock\n"); | 391 | dev_err(dev, "Failed to get usbhost/otg clock\n"); |
392 | return PTR_ERR(clk); | 392 | return PTR_ERR(clk); |
393 | } | 393 | } |
394 | 394 | ||
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index ed4949faa70d..805940c37353 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -855,10 +855,6 @@ static int usbhsg_gadget_stop(struct usb_gadget *gadget, | |||
855 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | 855 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); |
856 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | 856 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
857 | 857 | ||
858 | if (!driver || | ||
859 | !driver->unbind) | ||
860 | return -EINVAL; | ||
861 | |||
862 | usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD); | 858 | usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD); |
863 | gpriv->driver = NULL; | 859 | gpriv->driver = NULL; |
864 | 860 | ||
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index d6ef2f8da37d..0eae4ba3760e 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -53,6 +53,7 @@ static const struct usb_device_id id_table[] = { | |||
53 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ | 53 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ |
54 | { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ | 54 | { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ |
55 | { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */ | 55 | { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */ |
56 | { USB_DEVICE(0x0846, 0x1100) }, /* NetGear Managed Switch M4100 series, M5300 series, M7100 series */ | ||
56 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | 57 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ |
57 | { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ | 58 | { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ |
58 | { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ | 59 | { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ |
@@ -118,6 +119,8 @@ static const struct usb_device_id id_table[] = { | |||
118 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | 119 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
119 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | 120 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
120 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | 121 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
122 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | ||
123 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | ||
121 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 124 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
122 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 125 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
123 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | 126 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ |
@@ -148,6 +151,7 @@ static const struct usb_device_id id_table[] = { | |||
148 | { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ | 151 | { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ |
149 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ | 152 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
150 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ | 153 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
154 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ | ||
151 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ | 155 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ |
152 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ | 156 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ |
153 | { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ | 157 | { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 0a818b238508..603fb70dde80 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -905,20 +905,20 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
905 | status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); | 905 | status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); |
906 | if (status < 0) { | 906 | if (status < 0) { |
907 | dev_dbg(&port->dev, "Reading Spreg failed\n"); | 907 | dev_dbg(&port->dev, "Reading Spreg failed\n"); |
908 | return -1; | 908 | goto err; |
909 | } | 909 | } |
910 | Data |= 0x80; | 910 | Data |= 0x80; |
911 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); | 911 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); |
912 | if (status < 0) { | 912 | if (status < 0) { |
913 | dev_dbg(&port->dev, "writing Spreg failed\n"); | 913 | dev_dbg(&port->dev, "writing Spreg failed\n"); |
914 | return -1; | 914 | goto err; |
915 | } | 915 | } |
916 | 916 | ||
917 | Data &= ~0x80; | 917 | Data &= ~0x80; |
918 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); | 918 | status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); |
919 | if (status < 0) { | 919 | if (status < 0) { |
920 | dev_dbg(&port->dev, "writing Spreg failed\n"); | 920 | dev_dbg(&port->dev, "writing Spreg failed\n"); |
921 | return -1; | 921 | goto err; |
922 | } | 922 | } |
923 | /* End of block to be checked */ | 923 | /* End of block to be checked */ |
924 | 924 | ||
@@ -927,7 +927,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
927 | &Data); | 927 | &Data); |
928 | if (status < 0) { | 928 | if (status < 0) { |
929 | dev_dbg(&port->dev, "Reading Controlreg failed\n"); | 929 | dev_dbg(&port->dev, "Reading Controlreg failed\n"); |
930 | return -1; | 930 | goto err; |
931 | } | 931 | } |
932 | Data |= 0x08; /* Driver done bit */ | 932 | Data |= 0x08; /* Driver done bit */ |
933 | Data |= 0x20; /* rx_disable */ | 933 | Data |= 0x20; /* rx_disable */ |
@@ -935,7 +935,7 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
935 | mos7840_port->ControlRegOffset, Data); | 935 | mos7840_port->ControlRegOffset, Data); |
936 | if (status < 0) { | 936 | if (status < 0) { |
937 | dev_dbg(&port->dev, "writing Controlreg failed\n"); | 937 | dev_dbg(&port->dev, "writing Controlreg failed\n"); |
938 | return -1; | 938 | goto err; |
939 | } | 939 | } |
940 | /* do register settings here */ | 940 | /* do register settings here */ |
941 | /* Set all regs to the device default values. */ | 941 | /* Set all regs to the device default values. */ |
@@ -946,21 +946,21 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
946 | status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); | 946 | status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); |
947 | if (status < 0) { | 947 | if (status < 0) { |
948 | dev_dbg(&port->dev, "disabling interrupts failed\n"); | 948 | dev_dbg(&port->dev, "disabling interrupts failed\n"); |
949 | return -1; | 949 | goto err; |
950 | } | 950 | } |
951 | /* Set FIFO_CONTROL_REGISTER to the default value */ | 951 | /* Set FIFO_CONTROL_REGISTER to the default value */ |
952 | Data = 0x00; | 952 | Data = 0x00; |
953 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); | 953 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); |
954 | if (status < 0) { | 954 | if (status < 0) { |
955 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); | 955 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); |
956 | return -1; | 956 | goto err; |
957 | } | 957 | } |
958 | 958 | ||
959 | Data = 0xcf; | 959 | Data = 0xcf; |
960 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); | 960 | status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); |
961 | if (status < 0) { | 961 | if (status < 0) { |
962 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); | 962 | dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n"); |
963 | return -1; | 963 | goto err; |
964 | } | 964 | } |
965 | 965 | ||
966 | Data = 0x03; | 966 | Data = 0x03; |
@@ -1103,6 +1103,15 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1103 | /* mos7840_change_port_settings(mos7840_port,old_termios); */ | 1103 | /* mos7840_change_port_settings(mos7840_port,old_termios); */ |
1104 | 1104 | ||
1105 | return 0; | 1105 | return 0; |
1106 | err: | ||
1107 | for (j = 0; j < NUM_URBS; ++j) { | ||
1108 | urb = mos7840_port->write_urb_pool[j]; | ||
1109 | if (!urb) | ||
1110 | continue; | ||
1111 | kfree(urb->transfer_buffer); | ||
1112 | usb_free_urb(urb); | ||
1113 | } | ||
1114 | return status; | ||
1106 | } | 1115 | } |
1107 | 1116 | ||
1108 | /***************************************************************************** | 1117 | /***************************************************************************** |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 5dd857de05b0..1cf6f125f5f0 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -341,17 +341,12 @@ static void option_instat_callback(struct urb *urb); | |||
341 | #define OLIVETTI_VENDOR_ID 0x0b3c | 341 | #define OLIVETTI_VENDOR_ID 0x0b3c |
342 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 | 342 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 |
343 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 | 343 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 |
344 | #define OLIVETTI_PRODUCT_OLICARD200 0xc005 | ||
344 | 345 | ||
345 | /* Celot products */ | 346 | /* Celot products */ |
346 | #define CELOT_VENDOR_ID 0x211f | 347 | #define CELOT_VENDOR_ID 0x211f |
347 | #define CELOT_PRODUCT_CT680M 0x6801 | 348 | #define CELOT_PRODUCT_CT680M 0x6801 |
348 | 349 | ||
349 | /* ONDA Communication vendor id */ | ||
350 | #define ONDA_VENDOR_ID 0x1ee8 | ||
351 | |||
352 | /* ONDA MT825UP HSDPA 14.2 modem */ | ||
353 | #define ONDA_MT825UP 0x000b | ||
354 | |||
355 | /* Samsung products */ | 350 | /* Samsung products */ |
356 | #define SAMSUNG_VENDOR_ID 0x04e8 | 351 | #define SAMSUNG_VENDOR_ID 0x04e8 |
357 | #define SAMSUNG_PRODUCT_GT_B3730 0x6889 | 352 | #define SAMSUNG_PRODUCT_GT_B3730 0x6889 |
@@ -444,7 +439,8 @@ static void option_instat_callback(struct urb *urb); | |||
444 | 439 | ||
445 | /* Hyundai Petatel Inc. products */ | 440 | /* Hyundai Petatel Inc. products */ |
446 | #define PETATEL_VENDOR_ID 0x1ff4 | 441 | #define PETATEL_VENDOR_ID 0x1ff4 |
447 | #define PETATEL_PRODUCT_NP10T 0x600e | 442 | #define PETATEL_PRODUCT_NP10T_600A 0x600a |
443 | #define PETATEL_PRODUCT_NP10T_600E 0x600e | ||
448 | 444 | ||
449 | /* TP-LINK Incorporated products */ | 445 | /* TP-LINK Incorporated products */ |
450 | #define TPLINK_VENDOR_ID 0x2357 | 446 | #define TPLINK_VENDOR_ID 0x2357 |
@@ -782,6 +778,7 @@ static const struct usb_device_id option_ids[] = { | |||
782 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, | 778 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, |
783 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 779 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
784 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 780 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
781 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | ||
785 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 782 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
786 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 783 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
787 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | 784 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, |
@@ -817,7 +814,8 @@ static const struct usb_device_id option_ids[] = { | |||
817 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), | 814 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), |
818 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | 815 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
819 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0018, 0xff, 0xff, 0xff) }, | 816 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0018, 0xff, 0xff, 0xff) }, |
820 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff) }, | 817 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff), |
818 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
821 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0020, 0xff, 0xff, 0xff) }, | 819 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0020, 0xff, 0xff, 0xff) }, |
822 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff), | 820 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff), |
823 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 821 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
@@ -1256,8 +1254,8 @@ static const struct usb_device_id option_ids[] = { | |||
1256 | 1254 | ||
1257 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, | 1255 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, |
1258 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, | 1256 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, |
1257 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200) }, | ||
1259 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | 1258 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
1260 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ | ||
1261 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | 1259 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
1262 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, | 1260 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, |
1263 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM610) }, | 1261 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM610) }, |
@@ -1329,9 +1327,12 @@ static const struct usb_device_id option_ids[] = { | |||
1329 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, | 1327 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, |
1330 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, | 1328 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, |
1331 | { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, | 1329 | { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, |
1332 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, | 1330 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600A) }, |
1331 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600E) }, | ||
1333 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), | 1332 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), |
1334 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1333 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1334 | { USB_DEVICE(TPLINK_VENDOR_ID, 0x9000), /* TP-Link MA260 */ | ||
1335 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
1335 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, | 1336 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, |
1336 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ | 1337 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ |
1337 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ | 1338 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ |
@@ -1339,6 +1340,8 @@ static const struct usb_device_id option_ids[] = { | |||
1339 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, | 1340 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, |
1340 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, | 1341 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, |
1341 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | 1342 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, |
1343 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ | ||
1344 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ | ||
1342 | { } /* Terminating entry */ | 1345 | { } /* Terminating entry */ |
1343 | }; | 1346 | }; |
1344 | MODULE_DEVICE_TABLE(usb, option_ids); | 1347 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 7182bb774b79..375b5a400b6f 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -371,7 +371,7 @@ static int ti_startup(struct usb_serial *serial) | |||
371 | usb_set_serial_data(serial, tdev); | 371 | usb_set_serial_data(serial, tdev); |
372 | 372 | ||
373 | /* determine device type */ | 373 | /* determine device type */ |
374 | if (usb_match_id(serial->interface, ti_id_table_3410)) | 374 | if (serial->type == &ti_1port_device) |
375 | tdev->td_is_3410 = 1; | 375 | tdev->td_is_3410 = 1; |
376 | dev_dbg(&dev->dev, "%s - device type is %s\n", __func__, | 376 | dev_dbg(&dev->dev, "%s - device type is %s\n", __func__, |
377 | tdev->td_is_3410 ? "3410" : "5052"); | 377 | tdev->td_is_3410 ? "3410" : "5052"); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 1799335288bd..c015f2c16729 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -665,6 +665,13 @@ UNUSUAL_DEV( 0x054c, 0x016a, 0x0000, 0x9999, | |||
665 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 665 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
666 | US_FL_FIX_INQUIRY ), | 666 | US_FL_FIX_INQUIRY ), |
667 | 667 | ||
668 | /* Submitted by Ren Bigcren <bigcren.ren@sonymobile.com> */ | ||
669 | UNUSUAL_DEV( 0x054c, 0x02a5, 0x0100, 0x0100, | ||
670 | "Sony Corp.", | ||
671 | "MicroVault Flash Drive", | ||
672 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
673 | US_FL_NO_READ_CAPACITY_16 ), | ||
674 | |||
668 | /* floppy reports multiple luns */ | 675 | /* floppy reports multiple luns */ |
669 | UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210, | 676 | UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210, |
670 | "SAMSUNG", | 677 | "SAMSUNG", |
diff --git a/drivers/video/backlight/max8925_bl.c b/drivers/video/backlight/max8925_bl.c index 5ca11b066b7e..886e797f75f9 100644 --- a/drivers/video/backlight/max8925_bl.c +++ b/drivers/video/backlight/max8925_bl.c | |||
@@ -101,33 +101,37 @@ static const struct backlight_ops max8925_backlight_ops = { | |||
101 | .get_brightness = max8925_backlight_get_brightness, | 101 | .get_brightness = max8925_backlight_get_brightness, |
102 | }; | 102 | }; |
103 | 103 | ||
104 | #ifdef CONFIG_OF | 104 | static void max8925_backlight_dt_init(struct platform_device *pdev) |
105 | static int max8925_backlight_dt_init(struct platform_device *pdev, | ||
106 | struct max8925_backlight_pdata *pdata) | ||
107 | { | 105 | { |
108 | struct device_node *nproot = pdev->dev.parent->of_node, *np; | 106 | struct device_node *nproot = pdev->dev.parent->of_node, *np; |
109 | int dual_string; | 107 | struct max8925_backlight_pdata *pdata; |
108 | u32 val; | ||
109 | |||
110 | if (!nproot || !IS_ENABLED(CONFIG_OF)) | ||
111 | return; | ||
112 | |||
113 | pdata = devm_kzalloc(&pdev->dev, | ||
114 | sizeof(struct max8925_backlight_pdata), | ||
115 | GFP_KERNEL); | ||
116 | if (!pdata) | ||
117 | return; | ||
110 | 118 | ||
111 | if (!nproot) | ||
112 | return -ENODEV; | ||
113 | np = of_find_node_by_name(nproot, "backlight"); | 119 | np = of_find_node_by_name(nproot, "backlight"); |
114 | if (!np) { | 120 | if (!np) { |
115 | dev_err(&pdev->dev, "failed to find backlight node\n"); | 121 | dev_err(&pdev->dev, "failed to find backlight node\n"); |
116 | return -ENODEV; | 122 | return; |
117 | } | 123 | } |
118 | 124 | ||
119 | of_property_read_u32(np, "maxim,max8925-dual-string", &dual_string); | 125 | if (!of_property_read_u32(np, "maxim,max8925-dual-string", &val)) |
120 | pdata->dual_string = dual_string; | 126 | pdata->dual_string = val; |
121 | return 0; | 127 | |
128 | pdev->dev.platform_data = pdata; | ||
122 | } | 129 | } |
123 | #else | ||
124 | #define max8925_backlight_dt_init(x, y) (-1) | ||
125 | #endif | ||
126 | 130 | ||
127 | static int max8925_backlight_probe(struct platform_device *pdev) | 131 | static int max8925_backlight_probe(struct platform_device *pdev) |
128 | { | 132 | { |
129 | struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); | 133 | struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); |
130 | struct max8925_backlight_pdata *pdata = pdev->dev.platform_data; | 134 | struct max8925_backlight_pdata *pdata; |
131 | struct max8925_backlight_data *data; | 135 | struct max8925_backlight_data *data; |
132 | struct backlight_device *bl; | 136 | struct backlight_device *bl; |
133 | struct backlight_properties props; | 137 | struct backlight_properties props; |
@@ -170,13 +174,10 @@ static int max8925_backlight_probe(struct platform_device *pdev) | |||
170 | platform_set_drvdata(pdev, bl); | 174 | platform_set_drvdata(pdev, bl); |
171 | 175 | ||
172 | value = 0; | 176 | value = 0; |
173 | if (pdev->dev.parent->of_node && !pdata) { | 177 | if (!pdev->dev.platform_data) |
174 | pdata = devm_kzalloc(&pdev->dev, | 178 | max8925_backlight_dt_init(pdev); |
175 | sizeof(struct max8925_backlight_pdata), | ||
176 | GFP_KERNEL); | ||
177 | max8925_backlight_dt_init(pdev, pdata); | ||
178 | } | ||
179 | 179 | ||
180 | pdata = pdev->dev.platform_data; | ||
180 | if (pdata) { | 181 | if (pdata) { |
181 | if (pdata->lxw_scl) | 182 | if (pdata->lxw_scl) |
182 | value |= (1 << 7); | 183 | value |= (1 << 7); |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 8ff6a0019b0b..c827acb0e943 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -830,9 +830,10 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type, | |||
830 | flags = O_WRONLY|O_LARGEFILE; | 830 | flags = O_WRONLY|O_LARGEFILE; |
831 | } | 831 | } |
832 | *filp = dentry_open(&path, flags, current_cred()); | 832 | *filp = dentry_open(&path, flags, current_cred()); |
833 | if (IS_ERR(*filp)) | 833 | if (IS_ERR(*filp)) { |
834 | host_err = PTR_ERR(*filp); | 834 | host_err = PTR_ERR(*filp); |
835 | else { | 835 | *filp = NULL; |
836 | } else { | ||
836 | host_err = ima_file_check(*filp, may_flags); | 837 | host_err = ima_file_check(*filp, may_flags); |
837 | 838 | ||
838 | if (may_flags & NFSD_MAY_64BIT_COOKIE) | 839 | if (may_flags & NFSD_MAY_64BIT_COOKIE) |
diff --git a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h index 07d735a80a0f..e5869b50dc41 100644 --- a/fs/xfs/xfs_dinode.h +++ b/fs/xfs/xfs_dinode.h | |||
@@ -39,6 +39,9 @@ typedef struct xfs_timestamp { | |||
39 | * There is a very similar struct icdinode in xfs_inode which matches the | 39 | * There is a very similar struct icdinode in xfs_inode which matches the |
40 | * layout of the first 96 bytes of this structure, but is kept in native | 40 | * layout of the first 96 bytes of this structure, but is kept in native |
41 | * format instead of big endian. | 41 | * format instead of big endian. |
42 | * | ||
43 | * Note: di_flushiter is only used by v1/2 inodes - it's effectively a zeroed | ||
44 | * padding field for v3 inodes. | ||
42 | */ | 45 | */ |
43 | typedef struct xfs_dinode { | 46 | typedef struct xfs_dinode { |
44 | __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ | 47 | __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b78481f99d9d..bb262c25c8de 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -896,7 +896,6 @@ xfs_dinode_to_disk( | |||
896 | to->di_projid_lo = cpu_to_be16(from->di_projid_lo); | 896 | to->di_projid_lo = cpu_to_be16(from->di_projid_lo); |
897 | to->di_projid_hi = cpu_to_be16(from->di_projid_hi); | 897 | to->di_projid_hi = cpu_to_be16(from->di_projid_hi); |
898 | memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); | 898 | memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); |
899 | to->di_flushiter = cpu_to_be16(from->di_flushiter); | ||
900 | to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); | 899 | to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); |
901 | to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); | 900 | to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); |
902 | to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); | 901 | to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); |
@@ -924,6 +923,9 @@ xfs_dinode_to_disk( | |||
924 | to->di_lsn = cpu_to_be64(from->di_lsn); | 923 | to->di_lsn = cpu_to_be64(from->di_lsn); |
925 | memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); | 924 | memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); |
926 | uuid_copy(&to->di_uuid, &from->di_uuid); | 925 | uuid_copy(&to->di_uuid, &from->di_uuid); |
926 | to->di_flushiter = 0; | ||
927 | } else { | ||
928 | to->di_flushiter = cpu_to_be16(from->di_flushiter); | ||
927 | } | 929 | } |
928 | } | 930 | } |
929 | 931 | ||
@@ -1029,10 +1031,14 @@ xfs_dinode_calc_crc( | |||
1029 | /* | 1031 | /* |
1030 | * Read the disk inode attributes into the in-core inode structure. | 1032 | * Read the disk inode attributes into the in-core inode structure. |
1031 | * | 1033 | * |
1032 | * If we are initialising a new inode and we are not utilising the | 1034 | * For version 5 superblocks, if we are initialising a new inode and we are not |
1033 | * XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new inode core | 1035 | * utilising the XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new |
1034 | * with a random generation number. If we are keeping inodes around, we need to | 1036 | * inode core with a random generation number. If we are keeping inodes around, |
1035 | * read the inode cluster to get the existing generation number off disk. | 1037 | * we need to read the inode cluster to get the existing generation number off |
1038 | * disk. Further, if we are using version 4 superblocks (i.e. v1/v2 inode | ||
1039 | * format) then log recovery is dependent on the di_flushiter field being | ||
1040 | * initialised from the current on-disk value and hence we must also read the | ||
1041 | * inode off disk. | ||
1036 | */ | 1042 | */ |
1037 | int | 1043 | int |
1038 | xfs_iread( | 1044 | xfs_iread( |
@@ -1054,6 +1060,7 @@ xfs_iread( | |||
1054 | 1060 | ||
1055 | /* shortcut IO on inode allocation if possible */ | 1061 | /* shortcut IO on inode allocation if possible */ |
1056 | if ((iget_flags & XFS_IGET_CREATE) && | 1062 | if ((iget_flags & XFS_IGET_CREATE) && |
1063 | xfs_sb_version_hascrc(&mp->m_sb) && | ||
1057 | !(mp->m_flags & XFS_MOUNT_IKEEP)) { | 1064 | !(mp->m_flags & XFS_MOUNT_IKEEP)) { |
1058 | /* initialise the on-disk inode core */ | 1065 | /* initialise the on-disk inode core */ |
1059 | memset(&ip->i_d, 0, sizeof(ip->i_d)); | 1066 | memset(&ip->i_d, 0, sizeof(ip->i_d)); |
@@ -2882,12 +2889,18 @@ xfs_iflush_int( | |||
2882 | __func__, ip->i_ino, ip->i_d.di_forkoff, ip); | 2889 | __func__, ip->i_ino, ip->i_d.di_forkoff, ip); |
2883 | goto corrupt_out; | 2890 | goto corrupt_out; |
2884 | } | 2891 | } |
2892 | |||
2885 | /* | 2893 | /* |
2886 | * bump the flush iteration count, used to detect flushes which | 2894 | * Inode item log recovery for v1/v2 inodes are dependent on the |
2887 | * postdate a log record during recovery. This is redundant as we now | 2895 | * di_flushiter count for correct sequencing. We bump the flush |
2888 | * log every change and hence this can't happen. Still, it doesn't hurt. | 2896 | * iteration count so we can detect flushes which postdate a log record |
2897 | * during recovery. This is redundant as we now log every change and | ||
2898 | * hence this can't happen but we need to still do it to ensure | ||
2899 | * backwards compatibility with old kernels that predate logging all | ||
2900 | * inode changes. | ||
2889 | */ | 2901 | */ |
2890 | ip->i_d.di_flushiter++; | 2902 | if (ip->i_d.di_version < 3) |
2903 | ip->i_d.di_flushiter++; | ||
2891 | 2904 | ||
2892 | /* | 2905 | /* |
2893 | * Copy the dirty parts of the inode into the on-disk | 2906 | * Copy the dirty parts of the inode into the on-disk |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 6fcc910a50b9..7681b19aa5dc 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -2592,8 +2592,16 @@ xlog_recover_inode_pass2( | |||
2592 | goto error; | 2592 | goto error; |
2593 | } | 2593 | } |
2594 | 2594 | ||
2595 | /* Skip replay when the on disk inode is newer than the log one */ | 2595 | /* |
2596 | if (dicp->di_flushiter < be16_to_cpu(dip->di_flushiter)) { | 2596 | * di_flushiter is only valid for v1/2 inodes. All changes for v3 inodes |
2597 | * are transactional and if ordering is necessary we can determine that | ||
2598 | * more accurately by the LSN field in the V3 inode core. Don't trust | ||
2599 | * the inode versions we might be changing them here - use the | ||
2600 | * superblock flag to determine whether we need to look at di_flushiter | ||
2601 | * to skip replay when the on disk inode is newer than the log one | ||
2602 | */ | ||
2603 | if (!xfs_sb_version_hascrc(&mp->m_sb) && | ||
2604 | dicp->di_flushiter < be16_to_cpu(dip->di_flushiter)) { | ||
2597 | /* | 2605 | /* |
2598 | * Deal with the wrap case, DI_MAX_FLUSH is less | 2606 | * Deal with the wrap case, DI_MAX_FLUSH is less |
2599 | * than smaller numbers | 2607 | * than smaller numbers |
@@ -2608,6 +2616,7 @@ xlog_recover_inode_pass2( | |||
2608 | goto error; | 2616 | goto error; |
2609 | } | 2617 | } |
2610 | } | 2618 | } |
2619 | |||
2611 | /* Take the opportunity to reset the flush iteration count */ | 2620 | /* Take the opportunity to reset the flush iteration count */ |
2612 | dicp->di_flushiter = 0; | 2621 | dicp->di_flushiter = 0; |
2613 | 2622 | ||
diff --git a/include/acpi/video.h b/include/acpi/video.h index b26dc4fb7ba8..61109f2609fc 100644 --- a/include/acpi/video.h +++ b/include/acpi/video.h | |||
@@ -17,21 +17,12 @@ struct acpi_device; | |||
17 | #define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200 | 17 | #define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200 |
18 | 18 | ||
19 | #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE) | 19 | #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE) |
20 | extern int __acpi_video_register(bool backlight_quirks); | 20 | extern int acpi_video_register(void); |
21 | static inline int acpi_video_register(void) | ||
22 | { | ||
23 | return __acpi_video_register(false); | ||
24 | } | ||
25 | static inline int acpi_video_register_with_quirks(void) | ||
26 | { | ||
27 | return __acpi_video_register(true); | ||
28 | } | ||
29 | extern void acpi_video_unregister(void); | 21 | extern void acpi_video_unregister(void); |
30 | extern int acpi_video_get_edid(struct acpi_device *device, int type, | 22 | extern int acpi_video_get_edid(struct acpi_device *device, int type, |
31 | int device_id, void **edid); | 23 | int device_id, void **edid); |
32 | #else | 24 | #else |
33 | static inline int acpi_video_register(void) { return 0; } | 25 | static inline int acpi_video_register(void) { return 0; } |
34 | static inline int acpi_video_register_with_quirks(void) { return 0; } | ||
35 | static inline void acpi_video_unregister(void) { return; } | 26 | static inline void acpi_video_unregister(void) { return; } |
36 | static inline int acpi_video_get_edid(struct acpi_device *device, int type, | 27 | static inline int acpi_video_get_edid(struct acpi_device *device, int type, |
37 | int device_id, void **edid) | 28 | int device_id, void **edid) |
diff --git a/include/dt-bindings/clock/vf610-clock.h b/include/dt-bindings/clock/vf610-clock.h index 15e997fa78f2..4aa2b48cd151 100644 --- a/include/dt-bindings/clock/vf610-clock.h +++ b/include/dt-bindings/clock/vf610-clock.h | |||
@@ -158,6 +158,8 @@ | |||
158 | #define VF610_CLK_GPU_SEL 145 | 158 | #define VF610_CLK_GPU_SEL 145 |
159 | #define VF610_CLK_GPU_EN 146 | 159 | #define VF610_CLK_GPU_EN 146 |
160 | #define VF610_CLK_GPU2D 147 | 160 | #define VF610_CLK_GPU2D 147 |
161 | #define VF610_CLK_END 148 | 161 | #define VF610_CLK_ENET0 148 |
162 | #define VF610_CLK_ENET1 149 | ||
163 | #define VF610_CLK_END 150 | ||
162 | 164 | ||
163 | #endif /* __DT_BINDINGS_CLOCK_VF610_H */ | 165 | #endif /* __DT_BINDINGS_CLOCK_VF610_H */ |
diff --git a/include/dt-bindings/pinctrl/am33xx.h b/include/dt-bindings/pinctrl/am33xx.h index 469e0325e6f4..2fbc804e1a45 100644 --- a/include/dt-bindings/pinctrl/am33xx.h +++ b/include/dt-bindings/pinctrl/am33xx.h | |||
@@ -5,7 +5,7 @@ | |||
5 | #ifndef _DT_BINDINGS_PINCTRL_AM33XX_H | 5 | #ifndef _DT_BINDINGS_PINCTRL_AM33XX_H |
6 | #define _DT_BINDINGS_PINCTRL_AM33XX_H | 6 | #define _DT_BINDINGS_PINCTRL_AM33XX_H |
7 | 7 | ||
8 | #include <include/dt-bindings/pinctrl/omap.h> | 8 | #include <dt-bindings/pinctrl/omap.h> |
9 | 9 | ||
10 | /* am33xx specific mux bit defines */ | 10 | /* am33xx specific mux bit defines */ |
11 | #undef PULL_ENA | 11 | #undef PULL_ENA |
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 6ad72f92469c..353ba256f368 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -191,7 +191,6 @@ extern bool wmi_has_guid(const char *guid); | |||
191 | #define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO 0x0200 | 191 | #define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO 0x0200 |
192 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400 | 192 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400 |
193 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800 | 193 | #define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800 |
194 | #define ACPI_VIDEO_SKIP_BACKLIGHT 0x1000 | ||
195 | 194 | ||
196 | #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) | 195 | #if defined(CONFIG_ACPI_VIDEO) || defined(CONFIG_ACPI_VIDEO_MODULE) |
197 | 196 | ||
diff --git a/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h b/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h index dab34a1deb2c..b6bdcd66c07d 100644 --- a/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h +++ b/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h | |||
@@ -103,15 +103,15 @@ | |||
103 | #define IMX6Q_GPR1_EXC_MON_MASK BIT(22) | 103 | #define IMX6Q_GPR1_EXC_MON_MASK BIT(22) |
104 | #define IMX6Q_GPR1_EXC_MON_OKAY 0x0 | 104 | #define IMX6Q_GPR1_EXC_MON_OKAY 0x0 |
105 | #define IMX6Q_GPR1_EXC_MON_SLVE BIT(22) | 105 | #define IMX6Q_GPR1_EXC_MON_SLVE BIT(22) |
106 | #define IMX6Q_GPR1_MIPI_IPU2_SEL_MASK BIT(21) | 106 | #define IMX6Q_GPR1_ENET_CLK_SEL_MASK BIT(21) |
107 | #define IMX6Q_GPR1_MIPI_IPU2_SEL_GASKET 0x0 | 107 | #define IMX6Q_GPR1_ENET_CLK_SEL_PAD 0 |
108 | #define IMX6Q_GPR1_MIPI_IPU2_SEL_IOMUX BIT(21) | 108 | #define IMX6Q_GPR1_ENET_CLK_SEL_ANATOP BIT(21) |
109 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_MASK BIT(20) | 109 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_MASK BIT(20) |
110 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_GASKET 0x0 | ||
111 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_IOMUX BIT(20) | ||
112 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_MASK BIT(19) | ||
113 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_GASKET 0x0 | 110 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_GASKET 0x0 |
114 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_IOMUX BIT(19) | 111 | #define IMX6Q_GPR1_MIPI_IPU2_MUX_IOMUX BIT(20) |
112 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_MASK BIT(19) | ||
113 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_GASKET 0x0 | ||
114 | #define IMX6Q_GPR1_MIPI_IPU1_MUX_IOMUX BIT(19) | ||
115 | #define IMX6Q_GPR1_PCIE_TEST_PD BIT(18) | 115 | #define IMX6Q_GPR1_PCIE_TEST_PD BIT(18) |
116 | #define IMX6Q_GPR1_IPU_VPU_MUX_MASK BIT(17) | 116 | #define IMX6Q_GPR1_IPU_VPU_MUX_MASK BIT(17) |
117 | #define IMX6Q_GPR1_IPU_VPU_MUX_IPU1 0x0 | 117 | #define IMX6Q_GPR1_IPU_VPU_MUX_IPU1 0x0 |
@@ -279,41 +279,88 @@ | |||
279 | #define IMX6Q_GPR13_CAN2_STOP_REQ BIT(29) | 279 | #define IMX6Q_GPR13_CAN2_STOP_REQ BIT(29) |
280 | #define IMX6Q_GPR13_CAN1_STOP_REQ BIT(28) | 280 | #define IMX6Q_GPR13_CAN1_STOP_REQ BIT(28) |
281 | #define IMX6Q_GPR13_ENET_STOP_REQ BIT(27) | 281 | #define IMX6Q_GPR13_ENET_STOP_REQ BIT(27) |
282 | #define IMX6Q_GPR13_SATA_PHY_8_MASK (0x7 << 24) | 282 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK (0x7 << 24) |
283 | #define IMX6Q_GPR13_SATA_PHY_8_0_5_DB (0x0 << 24) | 283 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_0_5_DB (0x0 << 24) |
284 | #define IMX6Q_GPR13_SATA_PHY_8_1_0_DB (0x1 << 24) | 284 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_1_0_DB (0x1 << 24) |
285 | #define IMX6Q_GPR13_SATA_PHY_8_1_5_DB (0x2 << 24) | 285 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_1_5_DB (0x2 << 24) |
286 | #define IMX6Q_GPR13_SATA_PHY_8_2_0_DB (0x3 << 24) | 286 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_2_0_DB (0x3 << 24) |
287 | #define IMX6Q_GPR13_SATA_PHY_8_2_5_DB (0x4 << 24) | 287 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_2_5_DB (0x4 << 24) |
288 | #define IMX6Q_GPR13_SATA_PHY_8_3_0_DB (0x5 << 24) | 288 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB (0x5 << 24) |
289 | #define IMX6Q_GPR13_SATA_PHY_8_3_5_DB (0x6 << 24) | 289 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_3_5_DB (0x6 << 24) |
290 | #define IMX6Q_GPR13_SATA_PHY_8_4_0_DB (0x7 << 24) | 290 | #define IMX6Q_GPR13_SATA_RX_EQ_VAL_4_0_DB (0x7 << 24) |
291 | #define IMX6Q_GPR13_SATA_PHY_7_MASK (0x1f << 19) | 291 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_MASK (0x1f << 19) |
292 | #define IMX6Q_GPR13_SATA_PHY_7_SATA1I (0x10 << 19) | 292 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA1I (0x10 << 19) |
293 | #define IMX6Q_GPR13_SATA_PHY_7_SATA1M (0x10 << 19) | 293 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA1M (0x10 << 19) |
294 | #define IMX6Q_GPR13_SATA_PHY_7_SATA1X (0x1a << 19) | 294 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA1X (0x1a << 19) |
295 | #define IMX6Q_GPR13_SATA_PHY_7_SATA2I (0x12 << 19) | 295 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2I (0x12 << 19) |
296 | #define IMX6Q_GPR13_SATA_PHY_7_SATA2M (0x12 << 19) | 296 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M (0x12 << 19) |
297 | #define IMX6Q_GPR13_SATA_PHY_7_SATA2X (0x1a << 19) | 297 | #define IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2X (0x1a << 19) |
298 | #define IMX6Q_GPR13_SATA_PHY_6_MASK (0x7 << 16) | 298 | #define IMX6Q_GPR13_SATA_RX_DPLL_MODE_MASK (0x7 << 16) |
299 | #define IMX6Q_GPR13_SATA_SPEED_MASK BIT(15) | 299 | #define IMX6Q_GPR13_SATA_RX_DPLL_MODE_1P_1F (0x0 << 16) |
300 | #define IMX6Q_GPR13_SATA_SPEED_1P5G 0x0 | 300 | #define IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_2F (0x1 << 16) |
301 | #define IMX6Q_GPR13_SATA_SPEED_3P0G BIT(15) | 301 | #define IMX6Q_GPR13_SATA_RX_DPLL_MODE_1P_4F (0x2 << 16) |
302 | #define IMX6Q_GPR13_SATA_PHY_5 BIT(14) | 302 | #define IMX6Q_GPR13_SATA_RX_DPLL_MODE_2P_4F (0x3 << 16) |
303 | #define IMX6Q_GPR13_SATA_PHY_4_MASK (0x7 << 11) | 303 | #define IMX6Q_GPR13_SATA_SPD_MODE_MASK BIT(15) |
304 | #define IMX6Q_GPR13_SATA_PHY_4_16_16 (0x0 << 11) | 304 | #define IMX6Q_GPR13_SATA_SPD_MODE_1P5G 0x0 |
305 | #define IMX6Q_GPR13_SATA_PHY_4_14_16 (0x1 << 11) | 305 | #define IMX6Q_GPR13_SATA_SPD_MODE_3P0G BIT(15) |
306 | #define IMX6Q_GPR13_SATA_PHY_4_12_16 (0x2 << 11) | 306 | #define IMX6Q_GPR13_SATA_MPLL_SS_EN BIT(14) |
307 | #define IMX6Q_GPR13_SATA_PHY_4_10_16 (0x3 << 11) | 307 | #define IMX6Q_GPR13_SATA_TX_ATTEN_MASK (0x7 << 11) |
308 | #define IMX6Q_GPR13_SATA_PHY_4_9_16 (0x4 << 11) | 308 | #define IMX6Q_GPR13_SATA_TX_ATTEN_16_16 (0x0 << 11) |
309 | #define IMX6Q_GPR13_SATA_PHY_4_8_16 (0x5 << 11) | 309 | #define IMX6Q_GPR13_SATA_TX_ATTEN_14_16 (0x1 << 11) |
310 | #define IMX6Q_GPR13_SATA_PHY_3_MASK (0xf << 7) | 310 | #define IMX6Q_GPR13_SATA_TX_ATTEN_12_16 (0x2 << 11) |
311 | #define IMX6Q_GPR13_SATA_PHY_3_OFF 0x7 | 311 | #define IMX6Q_GPR13_SATA_TX_ATTEN_10_16 (0x3 << 11) |
312 | #define IMX6Q_GPR13_SATA_PHY_2_MASK (0x1f << 2) | 312 | #define IMX6Q_GPR13_SATA_TX_ATTEN_9_16 (0x4 << 11) |
313 | #define IMX6Q_GPR13_SATA_PHY_2_OFF 0x2 | 313 | #define IMX6Q_GPR13_SATA_TX_ATTEN_8_16 (0x5 << 11) |
314 | #define IMX6Q_GPR13_SATA_PHY_1_MASK (0x3 << 0) | 314 | #define IMX6Q_GPR13_SATA_TX_BOOST_MASK (0xf << 7) |
315 | #define IMX6Q_GPR13_SATA_PHY_1_FAST (0x0 << 0) | 315 | #define IMX6Q_GPR13_SATA_TX_BOOST_0_00_DB (0x0 << 7) |
316 | #define IMX6Q_GPR13_SATA_PHY_1_MED (0x1 << 0) | 316 | #define IMX6Q_GPR13_SATA_TX_BOOST_0_37_DB (0x1 << 7) |
317 | #define IMX6Q_GPR13_SATA_PHY_1_SLOW (0x2 << 0) | 317 | #define IMX6Q_GPR13_SATA_TX_BOOST_0_74_DB (0x2 << 7) |
318 | 318 | #define IMX6Q_GPR13_SATA_TX_BOOST_1_11_DB (0x3 << 7) | |
319 | #define IMX6Q_GPR13_SATA_TX_BOOST_1_48_DB (0x4 << 7) | ||
320 | #define IMX6Q_GPR13_SATA_TX_BOOST_1_85_DB (0x5 << 7) | ||
321 | #define IMX6Q_GPR13_SATA_TX_BOOST_2_22_DB (0x6 << 7) | ||
322 | #define IMX6Q_GPR13_SATA_TX_BOOST_2_59_DB (0x7 << 7) | ||
323 | #define IMX6Q_GPR13_SATA_TX_BOOST_2_96_DB (0x8 << 7) | ||
324 | #define IMX6Q_GPR13_SATA_TX_BOOST_3_33_DB (0x9 << 7) | ||
325 | #define IMX6Q_GPR13_SATA_TX_BOOST_3_70_DB (0xa << 7) | ||
326 | #define IMX6Q_GPR13_SATA_TX_BOOST_4_07_DB (0xb << 7) | ||
327 | #define IMX6Q_GPR13_SATA_TX_BOOST_4_44_DB (0xc << 7) | ||
328 | #define IMX6Q_GPR13_SATA_TX_BOOST_4_81_DB (0xd << 7) | ||
329 | #define IMX6Q_GPR13_SATA_TX_BOOST_5_28_DB (0xe << 7) | ||
330 | #define IMX6Q_GPR13_SATA_TX_BOOST_5_75_DB (0xf << 7) | ||
331 | #define IMX6Q_GPR13_SATA_TX_LVL_MASK (0x1f << 2) | ||
332 | #define IMX6Q_GPR13_SATA_TX_LVL_0_937_V (0x00 << 2) | ||
333 | #define IMX6Q_GPR13_SATA_TX_LVL_0_947_V (0x01 << 2) | ||
334 | #define IMX6Q_GPR13_SATA_TX_LVL_0_957_V (0x02 << 2) | ||
335 | #define IMX6Q_GPR13_SATA_TX_LVL_0_966_V (0x03 << 2) | ||
336 | #define IMX6Q_GPR13_SATA_TX_LVL_0_976_V (0x04 << 2) | ||
337 | #define IMX6Q_GPR13_SATA_TX_LVL_0_986_V (0x05 << 2) | ||
338 | #define IMX6Q_GPR13_SATA_TX_LVL_0_996_V (0x06 << 2) | ||
339 | #define IMX6Q_GPR13_SATA_TX_LVL_1_005_V (0x07 << 2) | ||
340 | #define IMX6Q_GPR13_SATA_TX_LVL_1_015_V (0x08 << 2) | ||
341 | #define IMX6Q_GPR13_SATA_TX_LVL_1_025_V (0x09 << 2) | ||
342 | #define IMX6Q_GPR13_SATA_TX_LVL_1_035_V (0x0a << 2) | ||
343 | #define IMX6Q_GPR13_SATA_TX_LVL_1_045_V (0x0b << 2) | ||
344 | #define IMX6Q_GPR13_SATA_TX_LVL_1_054_V (0x0c << 2) | ||
345 | #define IMX6Q_GPR13_SATA_TX_LVL_1_064_V (0x0d << 2) | ||
346 | #define IMX6Q_GPR13_SATA_TX_LVL_1_074_V (0x0e << 2) | ||
347 | #define IMX6Q_GPR13_SATA_TX_LVL_1_084_V (0x0f << 2) | ||
348 | #define IMX6Q_GPR13_SATA_TX_LVL_1_094_V (0x10 << 2) | ||
349 | #define IMX6Q_GPR13_SATA_TX_LVL_1_104_V (0x11 << 2) | ||
350 | #define IMX6Q_GPR13_SATA_TX_LVL_1_113_V (0x12 << 2) | ||
351 | #define IMX6Q_GPR13_SATA_TX_LVL_1_123_V (0x13 << 2) | ||
352 | #define IMX6Q_GPR13_SATA_TX_LVL_1_133_V (0x14 << 2) | ||
353 | #define IMX6Q_GPR13_SATA_TX_LVL_1_143_V (0x15 << 2) | ||
354 | #define IMX6Q_GPR13_SATA_TX_LVL_1_152_V (0x16 << 2) | ||
355 | #define IMX6Q_GPR13_SATA_TX_LVL_1_162_V (0x17 << 2) | ||
356 | #define IMX6Q_GPR13_SATA_TX_LVL_1_172_V (0x18 << 2) | ||
357 | #define IMX6Q_GPR13_SATA_TX_LVL_1_182_V (0x19 << 2) | ||
358 | #define IMX6Q_GPR13_SATA_TX_LVL_1_191_V (0x1a << 2) | ||
359 | #define IMX6Q_GPR13_SATA_TX_LVL_1_201_V (0x1b << 2) | ||
360 | #define IMX6Q_GPR13_SATA_TX_LVL_1_211_V (0x1c << 2) | ||
361 | #define IMX6Q_GPR13_SATA_TX_LVL_1_221_V (0x1d << 2) | ||
362 | #define IMX6Q_GPR13_SATA_TX_LVL_1_230_V (0x1e << 2) | ||
363 | #define IMX6Q_GPR13_SATA_TX_LVL_1_240_V (0x1f << 2) | ||
364 | #define IMX6Q_GPR13_SATA_MPLL_CLK_EN BIT(1) | ||
365 | #define IMX6Q_GPR13_SATA_TX_EDGE_RATE BIT(0) | ||
319 | #endif /* __LINUX_IMX6Q_IOMUXC_GPR_H */ | 366 | #endif /* __LINUX_IMX6Q_IOMUXC_GPR_H */ |
diff --git a/include/linux/platform_data/mmc-pxamci.h b/include/linux/platform_data/mmc-pxamci.h index 9eb515bb799d..1706b3597ce0 100644 --- a/include/linux/platform_data/mmc-pxamci.h +++ b/include/linux/platform_data/mmc-pxamci.h | |||
@@ -12,7 +12,7 @@ struct pxamci_platform_data { | |||
12 | unsigned long detect_delay_ms; /* delay in millisecond before detecting cards after interrupt */ | 12 | unsigned long detect_delay_ms; /* delay in millisecond before detecting cards after interrupt */ |
13 | int (*init)(struct device *, irq_handler_t , void *); | 13 | int (*init)(struct device *, irq_handler_t , void *); |
14 | int (*get_ro)(struct device *); | 14 | int (*get_ro)(struct device *); |
15 | void (*setpower)(struct device *, unsigned int); | 15 | int (*setpower)(struct device *, unsigned int); |
16 | void (*exit)(struct device *, void *); | 16 | void (*exit)(struct device *, void *); |
17 | int gpio_card_detect; /* gpio detecting card insertion */ | 17 | int gpio_card_detect; /* gpio detecting card insertion */ |
18 | int gpio_card_ro; /* gpio detecting read only toggle */ | 18 | int gpio_card_ro; /* gpio detecting read only toggle */ |
diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h index 382cf710ca9a..5b1c9848124c 100644 --- a/include/linux/shdma-base.h +++ b/include/linux/shdma-base.h | |||
@@ -124,6 +124,10 @@ void shdma_chan_remove(struct shdma_chan *schan); | |||
124 | int shdma_init(struct device *dev, struct shdma_dev *sdev, | 124 | int shdma_init(struct device *dev, struct shdma_dev *sdev, |
125 | int chan_num); | 125 | int chan_num); |
126 | void shdma_cleanup(struct shdma_dev *sdev); | 126 | void shdma_cleanup(struct shdma_dev *sdev); |
127 | #if IS_ENABLED(CONFIG_SH_DMAE_BASE) | ||
127 | bool shdma_chan_filter(struct dma_chan *chan, void *arg); | 128 | bool shdma_chan_filter(struct dma_chan *chan, void *arg); |
129 | #else | ||
130 | #define shdma_chan_filter NULL | ||
131 | #endif | ||
128 | 132 | ||
129 | #endif | 133 | #endif |
diff --git a/include/linux/usb.h b/include/linux/usb.h index a232b7ece1f6..0eec2689b955 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -367,17 +367,6 @@ struct usb_bus { | |||
367 | 367 | ||
368 | /* ----------------------------------------------------------------------- */ | 368 | /* ----------------------------------------------------------------------- */ |
369 | 369 | ||
370 | /* This is arbitrary. | ||
371 | * From USB 2.0 spec Table 11-13, offset 7, a hub can | ||
372 | * have up to 255 ports. The most yet reported is 10. | ||
373 | * | ||
374 | * Current Wireless USB host hardware (Intel i1480 for example) allows | ||
375 | * up to 22 devices to connect. Upcoming hardware might raise that | ||
376 | * limit. Because the arrays need to add a bit for hub status data, we | ||
377 | * do 31, so plus one evens out to four bytes. | ||
378 | */ | ||
379 | #define USB_MAXCHILDREN (31) | ||
380 | |||
381 | struct usb_tt; | 370 | struct usb_tt; |
382 | 371 | ||
383 | enum usb_device_removable { | 372 | enum usb_device_removable { |
diff --git a/include/uapi/linux/usb/ch11.h b/include/uapi/linux/usb/ch11.h index 7692dc69ccf7..331499d597fa 100644 --- a/include/uapi/linux/usb/ch11.h +++ b/include/uapi/linux/usb/ch11.h | |||
@@ -11,6 +11,17 @@ | |||
11 | 11 | ||
12 | #include <linux/types.h> /* __u8 etc */ | 12 | #include <linux/types.h> /* __u8 etc */ |
13 | 13 | ||
14 | /* This is arbitrary. | ||
15 | * From USB 2.0 spec Table 11-13, offset 7, a hub can | ||
16 | * have up to 255 ports. The most yet reported is 10. | ||
17 | * | ||
18 | * Current Wireless USB host hardware (Intel i1480 for example) allows | ||
19 | * up to 22 devices to connect. Upcoming hardware might raise that | ||
20 | * limit. Because the arrays need to add a bit for hub status data, we | ||
21 | * use 31, so plus one evens out to four bytes. | ||
22 | */ | ||
23 | #define USB_MAXCHILDREN 31 | ||
24 | |||
14 | /* | 25 | /* |
15 | * Hub request types | 26 | * Hub request types |
16 | */ | 27 | */ |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 67708f46baae..8ce9eefc5bb4 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1441,12 +1441,22 @@ ftrace_hash_move(struct ftrace_ops *ops, int enable, | |||
1441 | * the hashes are freed with call_rcu_sched(). | 1441 | * the hashes are freed with call_rcu_sched(). |
1442 | */ | 1442 | */ |
1443 | static int | 1443 | static int |
1444 | ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip) | 1444 | ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs) |
1445 | { | 1445 | { |
1446 | struct ftrace_hash *filter_hash; | 1446 | struct ftrace_hash *filter_hash; |
1447 | struct ftrace_hash *notrace_hash; | 1447 | struct ftrace_hash *notrace_hash; |
1448 | int ret; | 1448 | int ret; |
1449 | 1449 | ||
1450 | #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS | ||
1451 | /* | ||
1452 | * There's a small race when adding ops that the ftrace handler | ||
1453 | * that wants regs, may be called without them. We can not | ||
1454 | * allow that handler to be called if regs is NULL. | ||
1455 | */ | ||
1456 | if (regs == NULL && (ops->flags & FTRACE_OPS_FL_SAVE_REGS)) | ||
1457 | return 0; | ||
1458 | #endif | ||
1459 | |||
1450 | filter_hash = rcu_dereference_raw_notrace(ops->filter_hash); | 1460 | filter_hash = rcu_dereference_raw_notrace(ops->filter_hash); |
1451 | notrace_hash = rcu_dereference_raw_notrace(ops->notrace_hash); | 1461 | notrace_hash = rcu_dereference_raw_notrace(ops->notrace_hash); |
1452 | 1462 | ||
@@ -4218,7 +4228,7 @@ static inline void ftrace_startup_enable(int command) { } | |||
4218 | # define ftrace_shutdown_sysctl() do { } while (0) | 4228 | # define ftrace_shutdown_sysctl() do { } while (0) |
4219 | 4229 | ||
4220 | static inline int | 4230 | static inline int |
4221 | ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip) | 4231 | ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs) |
4222 | { | 4232 | { |
4223 | return 1; | 4233 | return 1; |
4224 | } | 4234 | } |
@@ -4241,7 +4251,7 @@ ftrace_ops_control_func(unsigned long ip, unsigned long parent_ip, | |||
4241 | do_for_each_ftrace_op(op, ftrace_control_list) { | 4251 | do_for_each_ftrace_op(op, ftrace_control_list) { |
4242 | if (!(op->flags & FTRACE_OPS_FL_STUB) && | 4252 | if (!(op->flags & FTRACE_OPS_FL_STUB) && |
4243 | !ftrace_function_local_disabled(op) && | 4253 | !ftrace_function_local_disabled(op) && |
4244 | ftrace_ops_test(op, ip)) | 4254 | ftrace_ops_test(op, ip, regs)) |
4245 | op->func(ip, parent_ip, op, regs); | 4255 | op->func(ip, parent_ip, op, regs); |
4246 | } while_for_each_ftrace_op(op); | 4256 | } while_for_each_ftrace_op(op); |
4247 | trace_recursion_clear(TRACE_CONTROL_BIT); | 4257 | trace_recursion_clear(TRACE_CONTROL_BIT); |
@@ -4274,7 +4284,7 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip, | |||
4274 | */ | 4284 | */ |
4275 | preempt_disable_notrace(); | 4285 | preempt_disable_notrace(); |
4276 | do_for_each_ftrace_op(op, ftrace_ops_list) { | 4286 | do_for_each_ftrace_op(op, ftrace_ops_list) { |
4277 | if (ftrace_ops_test(op, ip)) | 4287 | if (ftrace_ops_test(op, ip, regs)) |
4278 | op->func(ip, parent_ip, op, regs); | 4288 | op->func(ip, parent_ip, op, regs); |
4279 | } while_for_each_ftrace_op(op); | 4289 | } while_for_each_ftrace_op(op); |
4280 | preempt_enable_notrace(); | 4290 | preempt_enable_notrace(); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 3f2477713aca..882ec1dd1515 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1224,18 +1224,17 @@ void tracing_reset_current(int cpu) | |||
1224 | tracing_reset(&global_trace.trace_buffer, cpu); | 1224 | tracing_reset(&global_trace.trace_buffer, cpu); |
1225 | } | 1225 | } |
1226 | 1226 | ||
1227 | /* Must have trace_types_lock held */ | ||
1227 | void tracing_reset_all_online_cpus(void) | 1228 | void tracing_reset_all_online_cpus(void) |
1228 | { | 1229 | { |
1229 | struct trace_array *tr; | 1230 | struct trace_array *tr; |
1230 | 1231 | ||
1231 | mutex_lock(&trace_types_lock); | ||
1232 | list_for_each_entry(tr, &ftrace_trace_arrays, list) { | 1232 | list_for_each_entry(tr, &ftrace_trace_arrays, list) { |
1233 | tracing_reset_online_cpus(&tr->trace_buffer); | 1233 | tracing_reset_online_cpus(&tr->trace_buffer); |
1234 | #ifdef CONFIG_TRACER_MAX_TRACE | 1234 | #ifdef CONFIG_TRACER_MAX_TRACE |
1235 | tracing_reset_online_cpus(&tr->max_buffer); | 1235 | tracing_reset_online_cpus(&tr->max_buffer); |
1236 | #endif | 1236 | #endif |
1237 | } | 1237 | } |
1238 | mutex_unlock(&trace_types_lock); | ||
1239 | } | 1238 | } |
1240 | 1239 | ||
1241 | #define SAVED_CMDLINES 128 | 1240 | #define SAVED_CMDLINES 128 |
@@ -2843,6 +2842,17 @@ static int s_show(struct seq_file *m, void *v) | |||
2843 | return 0; | 2842 | return 0; |
2844 | } | 2843 | } |
2845 | 2844 | ||
2845 | /* | ||
2846 | * Should be used after trace_array_get(), trace_types_lock | ||
2847 | * ensures that i_cdev was already initialized. | ||
2848 | */ | ||
2849 | static inline int tracing_get_cpu(struct inode *inode) | ||
2850 | { | ||
2851 | if (inode->i_cdev) /* See trace_create_cpu_file() */ | ||
2852 | return (long)inode->i_cdev - 1; | ||
2853 | return RING_BUFFER_ALL_CPUS; | ||
2854 | } | ||
2855 | |||
2846 | static const struct seq_operations tracer_seq_ops = { | 2856 | static const struct seq_operations tracer_seq_ops = { |
2847 | .start = s_start, | 2857 | .start = s_start, |
2848 | .next = s_next, | 2858 | .next = s_next, |
@@ -2851,9 +2861,9 @@ static const struct seq_operations tracer_seq_ops = { | |||
2851 | }; | 2861 | }; |
2852 | 2862 | ||
2853 | static struct trace_iterator * | 2863 | static struct trace_iterator * |
2854 | __tracing_open(struct trace_array *tr, struct trace_cpu *tc, | 2864 | __tracing_open(struct inode *inode, struct file *file, bool snapshot) |
2855 | struct inode *inode, struct file *file, bool snapshot) | ||
2856 | { | 2865 | { |
2866 | struct trace_array *tr = inode->i_private; | ||
2857 | struct trace_iterator *iter; | 2867 | struct trace_iterator *iter; |
2858 | int cpu; | 2868 | int cpu; |
2859 | 2869 | ||
@@ -2894,8 +2904,8 @@ __tracing_open(struct trace_array *tr, struct trace_cpu *tc, | |||
2894 | iter->trace_buffer = &tr->trace_buffer; | 2904 | iter->trace_buffer = &tr->trace_buffer; |
2895 | iter->snapshot = snapshot; | 2905 | iter->snapshot = snapshot; |
2896 | iter->pos = -1; | 2906 | iter->pos = -1; |
2907 | iter->cpu_file = tracing_get_cpu(inode); | ||
2897 | mutex_init(&iter->mutex); | 2908 | mutex_init(&iter->mutex); |
2898 | iter->cpu_file = tc->cpu; | ||
2899 | 2909 | ||
2900 | /* Notify the tracer early; before we stop tracing. */ | 2910 | /* Notify the tracer early; before we stop tracing. */ |
2901 | if (iter->trace && iter->trace->open) | 2911 | if (iter->trace && iter->trace->open) |
@@ -2971,44 +2981,22 @@ static int tracing_open_generic_tr(struct inode *inode, struct file *filp) | |||
2971 | filp->private_data = inode->i_private; | 2981 | filp->private_data = inode->i_private; |
2972 | 2982 | ||
2973 | return 0; | 2983 | return 0; |
2974 | |||
2975 | } | ||
2976 | |||
2977 | static int tracing_open_generic_tc(struct inode *inode, struct file *filp) | ||
2978 | { | ||
2979 | struct trace_cpu *tc = inode->i_private; | ||
2980 | struct trace_array *tr = tc->tr; | ||
2981 | |||
2982 | if (tracing_disabled) | ||
2983 | return -ENODEV; | ||
2984 | |||
2985 | if (trace_array_get(tr) < 0) | ||
2986 | return -ENODEV; | ||
2987 | |||
2988 | filp->private_data = inode->i_private; | ||
2989 | |||
2990 | return 0; | ||
2991 | |||
2992 | } | 2984 | } |
2993 | 2985 | ||
2994 | static int tracing_release(struct inode *inode, struct file *file) | 2986 | static int tracing_release(struct inode *inode, struct file *file) |
2995 | { | 2987 | { |
2988 | struct trace_array *tr = inode->i_private; | ||
2996 | struct seq_file *m = file->private_data; | 2989 | struct seq_file *m = file->private_data; |
2997 | struct trace_iterator *iter; | 2990 | struct trace_iterator *iter; |
2998 | struct trace_array *tr; | ||
2999 | int cpu; | 2991 | int cpu; |
3000 | 2992 | ||
3001 | /* Writes do not use seq_file, need to grab tr from inode */ | ||
3002 | if (!(file->f_mode & FMODE_READ)) { | 2993 | if (!(file->f_mode & FMODE_READ)) { |
3003 | struct trace_cpu *tc = inode->i_private; | 2994 | trace_array_put(tr); |
3004 | |||
3005 | trace_array_put(tc->tr); | ||
3006 | return 0; | 2995 | return 0; |
3007 | } | 2996 | } |
3008 | 2997 | ||
2998 | /* Writes do not use seq_file */ | ||
3009 | iter = m->private; | 2999 | iter = m->private; |
3010 | tr = iter->tr; | ||
3011 | |||
3012 | mutex_lock(&trace_types_lock); | 3000 | mutex_lock(&trace_types_lock); |
3013 | 3001 | ||
3014 | for_each_tracing_cpu(cpu) { | 3002 | for_each_tracing_cpu(cpu) { |
@@ -3044,15 +3032,6 @@ static int tracing_release_generic_tr(struct inode *inode, struct file *file) | |||
3044 | return 0; | 3032 | return 0; |
3045 | } | 3033 | } |
3046 | 3034 | ||
3047 | static int tracing_release_generic_tc(struct inode *inode, struct file *file) | ||
3048 | { | ||
3049 | struct trace_cpu *tc = inode->i_private; | ||
3050 | struct trace_array *tr = tc->tr; | ||
3051 | |||
3052 | trace_array_put(tr); | ||
3053 | return 0; | ||
3054 | } | ||
3055 | |||
3056 | static int tracing_single_release_tr(struct inode *inode, struct file *file) | 3035 | static int tracing_single_release_tr(struct inode *inode, struct file *file) |
3057 | { | 3036 | { |
3058 | struct trace_array *tr = inode->i_private; | 3037 | struct trace_array *tr = inode->i_private; |
@@ -3064,8 +3043,7 @@ static int tracing_single_release_tr(struct inode *inode, struct file *file) | |||
3064 | 3043 | ||
3065 | static int tracing_open(struct inode *inode, struct file *file) | 3044 | static int tracing_open(struct inode *inode, struct file *file) |
3066 | { | 3045 | { |
3067 | struct trace_cpu *tc = inode->i_private; | 3046 | struct trace_array *tr = inode->i_private; |
3068 | struct trace_array *tr = tc->tr; | ||
3069 | struct trace_iterator *iter; | 3047 | struct trace_iterator *iter; |
3070 | int ret = 0; | 3048 | int ret = 0; |
3071 | 3049 | ||
@@ -3073,16 +3051,17 @@ static int tracing_open(struct inode *inode, struct file *file) | |||
3073 | return -ENODEV; | 3051 | return -ENODEV; |
3074 | 3052 | ||
3075 | /* If this file was open for write, then erase contents */ | 3053 | /* If this file was open for write, then erase contents */ |
3076 | if ((file->f_mode & FMODE_WRITE) && | 3054 | if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { |
3077 | (file->f_flags & O_TRUNC)) { | 3055 | int cpu = tracing_get_cpu(inode); |
3078 | if (tc->cpu == RING_BUFFER_ALL_CPUS) | 3056 | |
3057 | if (cpu == RING_BUFFER_ALL_CPUS) | ||
3079 | tracing_reset_online_cpus(&tr->trace_buffer); | 3058 | tracing_reset_online_cpus(&tr->trace_buffer); |
3080 | else | 3059 | else |
3081 | tracing_reset(&tr->trace_buffer, tc->cpu); | 3060 | tracing_reset(&tr->trace_buffer, cpu); |
3082 | } | 3061 | } |
3083 | 3062 | ||
3084 | if (file->f_mode & FMODE_READ) { | 3063 | if (file->f_mode & FMODE_READ) { |
3085 | iter = __tracing_open(tr, tc, inode, file, false); | 3064 | iter = __tracing_open(inode, file, false); |
3086 | if (IS_ERR(iter)) | 3065 | if (IS_ERR(iter)) |
3087 | ret = PTR_ERR(iter); | 3066 | ret = PTR_ERR(iter); |
3088 | else if (trace_flags & TRACE_ITER_LATENCY_FMT) | 3067 | else if (trace_flags & TRACE_ITER_LATENCY_FMT) |
@@ -3948,8 +3927,7 @@ tracing_max_lat_write(struct file *filp, const char __user *ubuf, | |||
3948 | 3927 | ||
3949 | static int tracing_open_pipe(struct inode *inode, struct file *filp) | 3928 | static int tracing_open_pipe(struct inode *inode, struct file *filp) |
3950 | { | 3929 | { |
3951 | struct trace_cpu *tc = inode->i_private; | 3930 | struct trace_array *tr = inode->i_private; |
3952 | struct trace_array *tr = tc->tr; | ||
3953 | struct trace_iterator *iter; | 3931 | struct trace_iterator *iter; |
3954 | int ret = 0; | 3932 | int ret = 0; |
3955 | 3933 | ||
@@ -3995,9 +3973,9 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp) | |||
3995 | if (trace_clocks[tr->clock_id].in_ns) | 3973 | if (trace_clocks[tr->clock_id].in_ns) |
3996 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; | 3974 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; |
3997 | 3975 | ||
3998 | iter->cpu_file = tc->cpu; | 3976 | iter->tr = tr; |
3999 | iter->tr = tc->tr; | 3977 | iter->trace_buffer = &tr->trace_buffer; |
4000 | iter->trace_buffer = &tc->tr->trace_buffer; | 3978 | iter->cpu_file = tracing_get_cpu(inode); |
4001 | mutex_init(&iter->mutex); | 3979 | mutex_init(&iter->mutex); |
4002 | filp->private_data = iter; | 3980 | filp->private_data = iter; |
4003 | 3981 | ||
@@ -4020,8 +3998,7 @@ fail: | |||
4020 | static int tracing_release_pipe(struct inode *inode, struct file *file) | 3998 | static int tracing_release_pipe(struct inode *inode, struct file *file) |
4021 | { | 3999 | { |
4022 | struct trace_iterator *iter = file->private_data; | 4000 | struct trace_iterator *iter = file->private_data; |
4023 | struct trace_cpu *tc = inode->i_private; | 4001 | struct trace_array *tr = inode->i_private; |
4024 | struct trace_array *tr = tc->tr; | ||
4025 | 4002 | ||
4026 | mutex_lock(&trace_types_lock); | 4003 | mutex_lock(&trace_types_lock); |
4027 | 4004 | ||
@@ -4374,15 +4351,16 @@ static ssize_t | |||
4374 | tracing_entries_read(struct file *filp, char __user *ubuf, | 4351 | tracing_entries_read(struct file *filp, char __user *ubuf, |
4375 | size_t cnt, loff_t *ppos) | 4352 | size_t cnt, loff_t *ppos) |
4376 | { | 4353 | { |
4377 | struct trace_cpu *tc = filp->private_data; | 4354 | struct inode *inode = file_inode(filp); |
4378 | struct trace_array *tr = tc->tr; | 4355 | struct trace_array *tr = inode->i_private; |
4356 | int cpu = tracing_get_cpu(inode); | ||
4379 | char buf[64]; | 4357 | char buf[64]; |
4380 | int r = 0; | 4358 | int r = 0; |
4381 | ssize_t ret; | 4359 | ssize_t ret; |
4382 | 4360 | ||
4383 | mutex_lock(&trace_types_lock); | 4361 | mutex_lock(&trace_types_lock); |
4384 | 4362 | ||
4385 | if (tc->cpu == RING_BUFFER_ALL_CPUS) { | 4363 | if (cpu == RING_BUFFER_ALL_CPUS) { |
4386 | int cpu, buf_size_same; | 4364 | int cpu, buf_size_same; |
4387 | unsigned long size; | 4365 | unsigned long size; |
4388 | 4366 | ||
@@ -4409,7 +4387,7 @@ tracing_entries_read(struct file *filp, char __user *ubuf, | |||
4409 | } else | 4387 | } else |
4410 | r = sprintf(buf, "X\n"); | 4388 | r = sprintf(buf, "X\n"); |
4411 | } else | 4389 | } else |
4412 | r = sprintf(buf, "%lu\n", per_cpu_ptr(tr->trace_buffer.data, tc->cpu)->entries >> 10); | 4390 | r = sprintf(buf, "%lu\n", per_cpu_ptr(tr->trace_buffer.data, cpu)->entries >> 10); |
4413 | 4391 | ||
4414 | mutex_unlock(&trace_types_lock); | 4392 | mutex_unlock(&trace_types_lock); |
4415 | 4393 | ||
@@ -4421,7 +4399,8 @@ static ssize_t | |||
4421 | tracing_entries_write(struct file *filp, const char __user *ubuf, | 4399 | tracing_entries_write(struct file *filp, const char __user *ubuf, |
4422 | size_t cnt, loff_t *ppos) | 4400 | size_t cnt, loff_t *ppos) |
4423 | { | 4401 | { |
4424 | struct trace_cpu *tc = filp->private_data; | 4402 | struct inode *inode = file_inode(filp); |
4403 | struct trace_array *tr = inode->i_private; | ||
4425 | unsigned long val; | 4404 | unsigned long val; |
4426 | int ret; | 4405 | int ret; |
4427 | 4406 | ||
@@ -4435,8 +4414,7 @@ tracing_entries_write(struct file *filp, const char __user *ubuf, | |||
4435 | 4414 | ||
4436 | /* value is in KB */ | 4415 | /* value is in KB */ |
4437 | val <<= 10; | 4416 | val <<= 10; |
4438 | 4417 | ret = tracing_resize_ring_buffer(tr, val, tracing_get_cpu(inode)); | |
4439 | ret = tracing_resize_ring_buffer(tc->tr, val, tc->cpu); | ||
4440 | if (ret < 0) | 4418 | if (ret < 0) |
4441 | return ret; | 4419 | return ret; |
4442 | 4420 | ||
@@ -4697,8 +4675,7 @@ struct ftrace_buffer_info { | |||
4697 | #ifdef CONFIG_TRACER_SNAPSHOT | 4675 | #ifdef CONFIG_TRACER_SNAPSHOT |
4698 | static int tracing_snapshot_open(struct inode *inode, struct file *file) | 4676 | static int tracing_snapshot_open(struct inode *inode, struct file *file) |
4699 | { | 4677 | { |
4700 | struct trace_cpu *tc = inode->i_private; | 4678 | struct trace_array *tr = inode->i_private; |
4701 | struct trace_array *tr = tc->tr; | ||
4702 | struct trace_iterator *iter; | 4679 | struct trace_iterator *iter; |
4703 | struct seq_file *m; | 4680 | struct seq_file *m; |
4704 | int ret = 0; | 4681 | int ret = 0; |
@@ -4707,7 +4684,7 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file) | |||
4707 | return -ENODEV; | 4684 | return -ENODEV; |
4708 | 4685 | ||
4709 | if (file->f_mode & FMODE_READ) { | 4686 | if (file->f_mode & FMODE_READ) { |
4710 | iter = __tracing_open(tr, tc, inode, file, true); | 4687 | iter = __tracing_open(inode, file, true); |
4711 | if (IS_ERR(iter)) | 4688 | if (IS_ERR(iter)) |
4712 | ret = PTR_ERR(iter); | 4689 | ret = PTR_ERR(iter); |
4713 | } else { | 4690 | } else { |
@@ -4724,8 +4701,8 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file) | |||
4724 | ret = 0; | 4701 | ret = 0; |
4725 | 4702 | ||
4726 | iter->tr = tr; | 4703 | iter->tr = tr; |
4727 | iter->trace_buffer = &tc->tr->max_buffer; | 4704 | iter->trace_buffer = &tr->max_buffer; |
4728 | iter->cpu_file = tc->cpu; | 4705 | iter->cpu_file = tracing_get_cpu(inode); |
4729 | m->private = iter; | 4706 | m->private = iter; |
4730 | file->private_data = m; | 4707 | file->private_data = m; |
4731 | } | 4708 | } |
@@ -4884,11 +4861,11 @@ static const struct file_operations tracing_pipe_fops = { | |||
4884 | }; | 4861 | }; |
4885 | 4862 | ||
4886 | static const struct file_operations tracing_entries_fops = { | 4863 | static const struct file_operations tracing_entries_fops = { |
4887 | .open = tracing_open_generic_tc, | 4864 | .open = tracing_open_generic_tr, |
4888 | .read = tracing_entries_read, | 4865 | .read = tracing_entries_read, |
4889 | .write = tracing_entries_write, | 4866 | .write = tracing_entries_write, |
4890 | .llseek = generic_file_llseek, | 4867 | .llseek = generic_file_llseek, |
4891 | .release = tracing_release_generic_tc, | 4868 | .release = tracing_release_generic_tr, |
4892 | }; | 4869 | }; |
4893 | 4870 | ||
4894 | static const struct file_operations tracing_total_entries_fops = { | 4871 | static const struct file_operations tracing_total_entries_fops = { |
@@ -4940,8 +4917,7 @@ static const struct file_operations snapshot_raw_fops = { | |||
4940 | 4917 | ||
4941 | static int tracing_buffers_open(struct inode *inode, struct file *filp) | 4918 | static int tracing_buffers_open(struct inode *inode, struct file *filp) |
4942 | { | 4919 | { |
4943 | struct trace_cpu *tc = inode->i_private; | 4920 | struct trace_array *tr = inode->i_private; |
4944 | struct trace_array *tr = tc->tr; | ||
4945 | struct ftrace_buffer_info *info; | 4921 | struct ftrace_buffer_info *info; |
4946 | int ret; | 4922 | int ret; |
4947 | 4923 | ||
@@ -4960,7 +4936,7 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp) | |||
4960 | mutex_lock(&trace_types_lock); | 4936 | mutex_lock(&trace_types_lock); |
4961 | 4937 | ||
4962 | info->iter.tr = tr; | 4938 | info->iter.tr = tr; |
4963 | info->iter.cpu_file = tc->cpu; | 4939 | info->iter.cpu_file = tracing_get_cpu(inode); |
4964 | info->iter.trace = tr->current_trace; | 4940 | info->iter.trace = tr->current_trace; |
4965 | info->iter.trace_buffer = &tr->trace_buffer; | 4941 | info->iter.trace_buffer = &tr->trace_buffer; |
4966 | info->spare = NULL; | 4942 | info->spare = NULL; |
@@ -5277,14 +5253,14 @@ static ssize_t | |||
5277 | tracing_stats_read(struct file *filp, char __user *ubuf, | 5253 | tracing_stats_read(struct file *filp, char __user *ubuf, |
5278 | size_t count, loff_t *ppos) | 5254 | size_t count, loff_t *ppos) |
5279 | { | 5255 | { |
5280 | struct trace_cpu *tc = filp->private_data; | 5256 | struct inode *inode = file_inode(filp); |
5281 | struct trace_array *tr = tc->tr; | 5257 | struct trace_array *tr = inode->i_private; |
5282 | struct trace_buffer *trace_buf = &tr->trace_buffer; | 5258 | struct trace_buffer *trace_buf = &tr->trace_buffer; |
5259 | int cpu = tracing_get_cpu(inode); | ||
5283 | struct trace_seq *s; | 5260 | struct trace_seq *s; |
5284 | unsigned long cnt; | 5261 | unsigned long cnt; |
5285 | unsigned long long t; | 5262 | unsigned long long t; |
5286 | unsigned long usec_rem; | 5263 | unsigned long usec_rem; |
5287 | int cpu = tc->cpu; | ||
5288 | 5264 | ||
5289 | s = kmalloc(sizeof(*s), GFP_KERNEL); | 5265 | s = kmalloc(sizeof(*s), GFP_KERNEL); |
5290 | if (!s) | 5266 | if (!s) |
@@ -5337,10 +5313,10 @@ tracing_stats_read(struct file *filp, char __user *ubuf, | |||
5337 | } | 5313 | } |
5338 | 5314 | ||
5339 | static const struct file_operations tracing_stats_fops = { | 5315 | static const struct file_operations tracing_stats_fops = { |
5340 | .open = tracing_open_generic_tc, | 5316 | .open = tracing_open_generic_tr, |
5341 | .read = tracing_stats_read, | 5317 | .read = tracing_stats_read, |
5342 | .llseek = generic_file_llseek, | 5318 | .llseek = generic_file_llseek, |
5343 | .release = tracing_release_generic_tc, | 5319 | .release = tracing_release_generic_tr, |
5344 | }; | 5320 | }; |
5345 | 5321 | ||
5346 | #ifdef CONFIG_DYNAMIC_FTRACE | 5322 | #ifdef CONFIG_DYNAMIC_FTRACE |
@@ -5529,10 +5505,20 @@ static struct dentry *tracing_dentry_percpu(struct trace_array *tr, int cpu) | |||
5529 | return tr->percpu_dir; | 5505 | return tr->percpu_dir; |
5530 | } | 5506 | } |
5531 | 5507 | ||
5508 | static struct dentry * | ||
5509 | trace_create_cpu_file(const char *name, umode_t mode, struct dentry *parent, | ||
5510 | void *data, long cpu, const struct file_operations *fops) | ||
5511 | { | ||
5512 | struct dentry *ret = trace_create_file(name, mode, parent, data, fops); | ||
5513 | |||
5514 | if (ret) /* See tracing_get_cpu() */ | ||
5515 | ret->d_inode->i_cdev = (void *)(cpu + 1); | ||
5516 | return ret; | ||
5517 | } | ||
5518 | |||
5532 | static void | 5519 | static void |
5533 | tracing_init_debugfs_percpu(struct trace_array *tr, long cpu) | 5520 | tracing_init_debugfs_percpu(struct trace_array *tr, long cpu) |
5534 | { | 5521 | { |
5535 | struct trace_array_cpu *data = per_cpu_ptr(tr->trace_buffer.data, cpu); | ||
5536 | struct dentry *d_percpu = tracing_dentry_percpu(tr, cpu); | 5522 | struct dentry *d_percpu = tracing_dentry_percpu(tr, cpu); |
5537 | struct dentry *d_cpu; | 5523 | struct dentry *d_cpu; |
5538 | char cpu_dir[30]; /* 30 characters should be more than enough */ | 5524 | char cpu_dir[30]; /* 30 characters should be more than enough */ |
@@ -5548,28 +5534,28 @@ tracing_init_debugfs_percpu(struct trace_array *tr, long cpu) | |||
5548 | } | 5534 | } |
5549 | 5535 | ||
5550 | /* per cpu trace_pipe */ | 5536 | /* per cpu trace_pipe */ |
5551 | trace_create_file("trace_pipe", 0444, d_cpu, | 5537 | trace_create_cpu_file("trace_pipe", 0444, d_cpu, |
5552 | (void *)&data->trace_cpu, &tracing_pipe_fops); | 5538 | tr, cpu, &tracing_pipe_fops); |
5553 | 5539 | ||
5554 | /* per cpu trace */ | 5540 | /* per cpu trace */ |
5555 | trace_create_file("trace", 0644, d_cpu, | 5541 | trace_create_cpu_file("trace", 0644, d_cpu, |
5556 | (void *)&data->trace_cpu, &tracing_fops); | 5542 | tr, cpu, &tracing_fops); |
5557 | 5543 | ||
5558 | trace_create_file("trace_pipe_raw", 0444, d_cpu, | 5544 | trace_create_cpu_file("trace_pipe_raw", 0444, d_cpu, |
5559 | (void *)&data->trace_cpu, &tracing_buffers_fops); | 5545 | tr, cpu, &tracing_buffers_fops); |
5560 | 5546 | ||
5561 | trace_create_file("stats", 0444, d_cpu, | 5547 | trace_create_cpu_file("stats", 0444, d_cpu, |
5562 | (void *)&data->trace_cpu, &tracing_stats_fops); | 5548 | tr, cpu, &tracing_stats_fops); |
5563 | 5549 | ||
5564 | trace_create_file("buffer_size_kb", 0444, d_cpu, | 5550 | trace_create_cpu_file("buffer_size_kb", 0444, d_cpu, |
5565 | (void *)&data->trace_cpu, &tracing_entries_fops); | 5551 | tr, cpu, &tracing_entries_fops); |
5566 | 5552 | ||
5567 | #ifdef CONFIG_TRACER_SNAPSHOT | 5553 | #ifdef CONFIG_TRACER_SNAPSHOT |
5568 | trace_create_file("snapshot", 0644, d_cpu, | 5554 | trace_create_cpu_file("snapshot", 0644, d_cpu, |
5569 | (void *)&data->trace_cpu, &snapshot_fops); | 5555 | tr, cpu, &snapshot_fops); |
5570 | 5556 | ||
5571 | trace_create_file("snapshot_raw", 0444, d_cpu, | 5557 | trace_create_cpu_file("snapshot_raw", 0444, d_cpu, |
5572 | (void *)&data->trace_cpu, &snapshot_raw_fops); | 5558 | tr, cpu, &snapshot_raw_fops); |
5573 | #endif | 5559 | #endif |
5574 | } | 5560 | } |
5575 | 5561 | ||
@@ -5878,17 +5864,6 @@ struct dentry *trace_instance_dir; | |||
5878 | static void | 5864 | static void |
5879 | init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer); | 5865 | init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer); |
5880 | 5866 | ||
5881 | static void init_trace_buffers(struct trace_array *tr, struct trace_buffer *buf) | ||
5882 | { | ||
5883 | int cpu; | ||
5884 | |||
5885 | for_each_tracing_cpu(cpu) { | ||
5886 | memset(per_cpu_ptr(buf->data, cpu), 0, sizeof(struct trace_array_cpu)); | ||
5887 | per_cpu_ptr(buf->data, cpu)->trace_cpu.cpu = cpu; | ||
5888 | per_cpu_ptr(buf->data, cpu)->trace_cpu.tr = tr; | ||
5889 | } | ||
5890 | } | ||
5891 | |||
5892 | static int | 5867 | static int |
5893 | allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size) | 5868 | allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size) |
5894 | { | 5869 | { |
@@ -5906,8 +5881,6 @@ allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size | |||
5906 | return -ENOMEM; | 5881 | return -ENOMEM; |
5907 | } | 5882 | } |
5908 | 5883 | ||
5909 | init_trace_buffers(tr, buf); | ||
5910 | |||
5911 | /* Allocate the first page for all buffers */ | 5884 | /* Allocate the first page for all buffers */ |
5912 | set_buffer_entries(&tr->trace_buffer, | 5885 | set_buffer_entries(&tr->trace_buffer, |
5913 | ring_buffer_size(tr->trace_buffer.buffer, 0)); | 5886 | ring_buffer_size(tr->trace_buffer.buffer, 0)); |
@@ -5974,10 +5947,6 @@ static int new_instance_create(const char *name) | |||
5974 | if (allocate_trace_buffers(tr, trace_buf_size) < 0) | 5947 | if (allocate_trace_buffers(tr, trace_buf_size) < 0) |
5975 | goto out_free_tr; | 5948 | goto out_free_tr; |
5976 | 5949 | ||
5977 | /* Holder for file callbacks */ | ||
5978 | tr->trace_cpu.cpu = RING_BUFFER_ALL_CPUS; | ||
5979 | tr->trace_cpu.tr = tr; | ||
5980 | |||
5981 | tr->dir = debugfs_create_dir(name, trace_instance_dir); | 5950 | tr->dir = debugfs_create_dir(name, trace_instance_dir); |
5982 | if (!tr->dir) | 5951 | if (!tr->dir) |
5983 | goto out_free_tr; | 5952 | goto out_free_tr; |
@@ -6132,13 +6101,13 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer) | |||
6132 | tr, &tracing_iter_fops); | 6101 | tr, &tracing_iter_fops); |
6133 | 6102 | ||
6134 | trace_create_file("trace", 0644, d_tracer, | 6103 | trace_create_file("trace", 0644, d_tracer, |
6135 | (void *)&tr->trace_cpu, &tracing_fops); | 6104 | tr, &tracing_fops); |
6136 | 6105 | ||
6137 | trace_create_file("trace_pipe", 0444, d_tracer, | 6106 | trace_create_file("trace_pipe", 0444, d_tracer, |
6138 | (void *)&tr->trace_cpu, &tracing_pipe_fops); | 6107 | tr, &tracing_pipe_fops); |
6139 | 6108 | ||
6140 | trace_create_file("buffer_size_kb", 0644, d_tracer, | 6109 | trace_create_file("buffer_size_kb", 0644, d_tracer, |
6141 | (void *)&tr->trace_cpu, &tracing_entries_fops); | 6110 | tr, &tracing_entries_fops); |
6142 | 6111 | ||
6143 | trace_create_file("buffer_total_size_kb", 0444, d_tracer, | 6112 | trace_create_file("buffer_total_size_kb", 0444, d_tracer, |
6144 | tr, &tracing_total_entries_fops); | 6113 | tr, &tracing_total_entries_fops); |
@@ -6153,11 +6122,11 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer) | |||
6153 | &trace_clock_fops); | 6122 | &trace_clock_fops); |
6154 | 6123 | ||
6155 | trace_create_file("tracing_on", 0644, d_tracer, | 6124 | trace_create_file("tracing_on", 0644, d_tracer, |
6156 | tr, &rb_simple_fops); | 6125 | tr, &rb_simple_fops); |
6157 | 6126 | ||
6158 | #ifdef CONFIG_TRACER_SNAPSHOT | 6127 | #ifdef CONFIG_TRACER_SNAPSHOT |
6159 | trace_create_file("snapshot", 0644, d_tracer, | 6128 | trace_create_file("snapshot", 0644, d_tracer, |
6160 | (void *)&tr->trace_cpu, &snapshot_fops); | 6129 | tr, &snapshot_fops); |
6161 | #endif | 6130 | #endif |
6162 | 6131 | ||
6163 | for_each_tracing_cpu(cpu) | 6132 | for_each_tracing_cpu(cpu) |
@@ -6451,10 +6420,6 @@ __init static int tracer_alloc_buffers(void) | |||
6451 | 6420 | ||
6452 | global_trace.flags = TRACE_ARRAY_FL_GLOBAL; | 6421 | global_trace.flags = TRACE_ARRAY_FL_GLOBAL; |
6453 | 6422 | ||
6454 | /* Holder for file callbacks */ | ||
6455 | global_trace.trace_cpu.cpu = RING_BUFFER_ALL_CPUS; | ||
6456 | global_trace.trace_cpu.tr = &global_trace; | ||
6457 | |||
6458 | INIT_LIST_HEAD(&global_trace.systems); | 6423 | INIT_LIST_HEAD(&global_trace.systems); |
6459 | INIT_LIST_HEAD(&global_trace.events); | 6424 | INIT_LIST_HEAD(&global_trace.events); |
6460 | list_add(&global_trace.list, &ftrace_trace_arrays); | 6425 | list_add(&global_trace.list, &ftrace_trace_arrays); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index e7d643b8a907..afaae41b0a02 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -130,19 +130,12 @@ enum trace_flag_type { | |||
130 | 130 | ||
131 | struct trace_array; | 131 | struct trace_array; |
132 | 132 | ||
133 | struct trace_cpu { | ||
134 | struct trace_array *tr; | ||
135 | struct dentry *dir; | ||
136 | int cpu; | ||
137 | }; | ||
138 | |||
139 | /* | 133 | /* |
140 | * The CPU trace array - it consists of thousands of trace entries | 134 | * The CPU trace array - it consists of thousands of trace entries |
141 | * plus some other descriptor data: (for example which task started | 135 | * plus some other descriptor data: (for example which task started |
142 | * the trace, etc.) | 136 | * the trace, etc.) |
143 | */ | 137 | */ |
144 | struct trace_array_cpu { | 138 | struct trace_array_cpu { |
145 | struct trace_cpu trace_cpu; | ||
146 | atomic_t disabled; | 139 | atomic_t disabled; |
147 | void *buffer_page; /* ring buffer spare */ | 140 | void *buffer_page; /* ring buffer spare */ |
148 | 141 | ||
@@ -196,7 +189,6 @@ struct trace_array { | |||
196 | bool allocated_snapshot; | 189 | bool allocated_snapshot; |
197 | #endif | 190 | #endif |
198 | int buffer_disabled; | 191 | int buffer_disabled; |
199 | struct trace_cpu trace_cpu; /* place holder */ | ||
200 | #ifdef CONFIG_FTRACE_SYSCALLS | 192 | #ifdef CONFIG_FTRACE_SYSCALLS |
201 | int sys_refcount_enter; | 193 | int sys_refcount_enter; |
202 | int sys_refcount_exit; | 194 | int sys_refcount_exit; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index e2f83591161b..92b9b4324372 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -417,9 +417,11 @@ static void stac_update_outputs(struct hda_codec *codec) | |||
417 | val &= ~spec->eapd_mask; | 417 | val &= ~spec->eapd_mask; |
418 | else | 418 | else |
419 | val |= spec->eapd_mask; | 419 | val |= spec->eapd_mask; |
420 | if (spec->gpio_data != val) | 420 | if (spec->gpio_data != val) { |
421 | spec->gpio_data = val; | ||
421 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, | 422 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, |
422 | val); | 423 | val); |
424 | } | ||
423 | } | 425 | } |
424 | } | 426 | } |
425 | 427 | ||
@@ -3231,7 +3233,7 @@ static const struct hda_fixup stac927x_fixups[] = { | |||
3231 | /* configure the analog microphone on some laptops */ | 3233 | /* configure the analog microphone on some laptops */ |
3232 | { 0x0c, 0x90a79130 }, | 3234 | { 0x0c, 0x90a79130 }, |
3233 | /* correct the front output jack as a hp out */ | 3235 | /* correct the front output jack as a hp out */ |
3234 | { 0x0f, 0x0227011f }, | 3236 | { 0x0f, 0x0221101f }, |
3235 | /* correct the front input jack as a mic */ | 3237 | /* correct the front input jack as a mic */ |
3236 | { 0x0e, 0x02a79130 }, | 3238 | { 0x0e, 0x02a79130 }, |
3237 | {} | 3239 | {} |
@@ -3612,20 +3614,18 @@ static int stac_parse_auto_config(struct hda_codec *codec) | |||
3612 | static int stac_init(struct hda_codec *codec) | 3614 | static int stac_init(struct hda_codec *codec) |
3613 | { | 3615 | { |
3614 | struct sigmatel_spec *spec = codec->spec; | 3616 | struct sigmatel_spec *spec = codec->spec; |
3615 | unsigned int gpio; | ||
3616 | int i; | 3617 | int i; |
3617 | 3618 | ||
3618 | /* override some hints */ | 3619 | /* override some hints */ |
3619 | stac_store_hints(codec); | 3620 | stac_store_hints(codec); |
3620 | 3621 | ||
3621 | /* set up GPIO */ | 3622 | /* set up GPIO */ |
3622 | gpio = spec->gpio_data; | ||
3623 | /* turn on EAPD statically when spec->eapd_switch isn't set. | 3623 | /* turn on EAPD statically when spec->eapd_switch isn't set. |
3624 | * otherwise, unsol event will turn it on/off dynamically | 3624 | * otherwise, unsol event will turn it on/off dynamically |
3625 | */ | 3625 | */ |
3626 | if (!spec->eapd_switch) | 3626 | if (!spec->eapd_switch) |
3627 | gpio |= spec->eapd_mask; | 3627 | spec->gpio_data |= spec->eapd_mask; |
3628 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio); | 3628 | stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); |
3629 | 3629 | ||
3630 | snd_hda_gen_init(codec); | 3630 | snd_hda_gen_init(codec); |
3631 | 3631 | ||
@@ -3915,6 +3915,7 @@ static void stac_setup_gpio(struct hda_codec *codec) | |||
3915 | { | 3915 | { |
3916 | struct sigmatel_spec *spec = codec->spec; | 3916 | struct sigmatel_spec *spec = codec->spec; |
3917 | 3917 | ||
3918 | spec->gpio_mask |= spec->eapd_mask; | ||
3918 | if (spec->gpio_led) { | 3919 | if (spec->gpio_led) { |
3919 | if (!spec->vref_mute_led_nid) { | 3920 | if (!spec->vref_mute_led_nid) { |
3920 | spec->gpio_mask |= spec->gpio_led; | 3921 | spec->gpio_mask |= spec->gpio_led; |
diff --git a/sound/soc/cirrus/ep93xx-ac97.c b/sound/soc/cirrus/ep93xx-ac97.c index ac73c607410a..04491f0e8d1b 100644 --- a/sound/soc/cirrus/ep93xx-ac97.c +++ b/sound/soc/cirrus/ep93xx-ac97.c | |||
@@ -102,13 +102,13 @@ static struct ep93xx_ac97_info *ep93xx_ac97_info; | |||
102 | 102 | ||
103 | static struct ep93xx_dma_data ep93xx_ac97_pcm_out = { | 103 | static struct ep93xx_dma_data ep93xx_ac97_pcm_out = { |
104 | .name = "ac97-pcm-out", | 104 | .name = "ac97-pcm-out", |
105 | .dma_port = EP93XX_DMA_AAC1, | 105 | .port = EP93XX_DMA_AAC1, |
106 | .direction = DMA_MEM_TO_DEV, | 106 | .direction = DMA_MEM_TO_DEV, |
107 | }; | 107 | }; |
108 | 108 | ||
109 | static struct ep93xx_dma_data ep93xx_ac97_pcm_in = { | 109 | static struct ep93xx_dma_data ep93xx_ac97_pcm_in = { |
110 | .name = "ac97-pcm-in", | 110 | .name = "ac97-pcm-in", |
111 | .dma_port = EP93XX_DMA_AAC1, | 111 | .port = EP93XX_DMA_AAC1, |
112 | .direction = DMA_DEV_TO_MEM, | 112 | .direction = DMA_DEV_TO_MEM, |
113 | }; | 113 | }; |
114 | 114 | ||
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c index 3eeada57e87d..566a367c94fa 100644 --- a/sound/soc/codecs/max98088.c +++ b/sound/soc/codecs/max98088.c | |||
@@ -1612,7 +1612,7 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) | |||
1612 | 1612 | ||
1613 | static void max98088_sync_cache(struct snd_soc_codec *codec) | 1613 | static void max98088_sync_cache(struct snd_soc_codec *codec) |
1614 | { | 1614 | { |
1615 | u16 *reg_cache = codec->reg_cache; | 1615 | u8 *reg_cache = codec->reg_cache; |
1616 | int i; | 1616 | int i; |
1617 | 1617 | ||
1618 | if (!codec->cache_sync) | 1618 | if (!codec->cache_sync) |
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index d659d3adcfb3..6c8a9e7bee25 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c | |||
@@ -1527,6 +1527,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, | |||
1527 | if (IS_ERR(sgtl5000->mclk)) { | 1527 | if (IS_ERR(sgtl5000->mclk)) { |
1528 | ret = PTR_ERR(sgtl5000->mclk); | 1528 | ret = PTR_ERR(sgtl5000->mclk); |
1529 | dev_err(&client->dev, "Failed to get mclock: %d\n", ret); | 1529 | dev_err(&client->dev, "Failed to get mclock: %d\n", ret); |
1530 | /* Defer the probe to see if the clk will be provided later */ | ||
1531 | if (ret == -ENOENT) | ||
1532 | return -EPROBE_DEFER; | ||
1530 | return ret; | 1533 | return ret; |
1531 | } | 1534 | } |
1532 | 1535 | ||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 0ec070cf7231..d82ee386eab5 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -3908,10 +3908,8 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform, | |||
3908 | { | 3908 | { |
3909 | /* create platform component name */ | 3909 | /* create platform component name */ |
3910 | platform->name = fmt_single_name(dev, &platform->id); | 3910 | platform->name = fmt_single_name(dev, &platform->id); |
3911 | if (platform->name == NULL) { | 3911 | if (platform->name == NULL) |
3912 | kfree(platform); | ||
3913 | return -ENOMEM; | 3912 | return -ENOMEM; |
3914 | } | ||
3915 | 3913 | ||
3916 | platform->dev = dev; | 3914 | platform->dev = dev; |
3917 | platform->driver = platform_drv; | 3915 | platform->driver = platform_drv; |
diff --git a/sound/soc/tegra/tegra20_ac97.c b/sound/soc/tegra/tegra20_ac97.c index e58233f7df61..6c486625321b 100644 --- a/sound/soc/tegra/tegra20_ac97.c +++ b/sound/soc/tegra/tegra20_ac97.c | |||
@@ -389,9 +389,9 @@ static int tegra20_ac97_platform_probe(struct platform_device *pdev) | |||
389 | ac97->capture_dma_data.slave_id = of_dma[1]; | 389 | ac97->capture_dma_data.slave_id = of_dma[1]; |
390 | 390 | ||
391 | ac97->playback_dma_data.addr = mem->start + TEGRA20_AC97_FIFO_TX1; | 391 | ac97->playback_dma_data.addr = mem->start + TEGRA20_AC97_FIFO_TX1; |
392 | ac97->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | 392 | ac97->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
393 | ac97->capture_dma_data.maxburst = 4; | 393 | ac97->playback_dma_data.maxburst = 4; |
394 | ac97->capture_dma_data.slave_id = of_dma[0]; | 394 | ac97->playback_dma_data.slave_id = of_dma[1]; |
395 | 395 | ||
396 | ret = tegra_asoc_utils_init(&ac97->util_data, &pdev->dev); | 396 | ret = tegra_asoc_utils_init(&ac97->util_data, &pdev->dev); |
397 | if (ret) | 397 | if (ret) |
diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c index 5eaa12cdc6eb..551b3c93ce93 100644 --- a/sound/soc/tegra/tegra20_spdif.c +++ b/sound/soc/tegra/tegra20_spdif.c | |||
@@ -323,8 +323,8 @@ static int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
323 | } | 323 | } |
324 | 324 | ||
325 | spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT; | 325 | spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT; |
326 | spdif->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | 326 | spdif->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
327 | spdif->capture_dma_data.maxburst = 4; | 327 | spdif->playback_dma_data.maxburst = 4; |
328 | spdif->playback_dma_data.slave_id = dmareq->start; | 328 | spdif->playback_dma_data.slave_id = dmareq->start; |
329 | 329 | ||
330 | pm_runtime_enable(&pdev->dev); | 330 | pm_runtime_enable(&pdev->dev); |
diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c index 2aa4e13063a8..3d2551cc10f2 100644 --- a/sound/usb/6fire/pcm.c +++ b/sound/usb/6fire/pcm.c | |||
@@ -543,7 +543,7 @@ static snd_pcm_uframes_t usb6fire_pcm_pointer( | |||
543 | snd_pcm_uframes_t ret; | 543 | snd_pcm_uframes_t ret; |
544 | 544 | ||
545 | if (rt->panic || !sub) | 545 | if (rt->panic || !sub) |
546 | return SNDRV_PCM_STATE_XRUN; | 546 | return SNDRV_PCM_POS_XRUN; |
547 | 547 | ||
548 | spin_lock_irqsave(&sub->lock, flags); | 548 | spin_lock_irqsave(&sub->lock, flags); |
549 | ret = sub->dma_off; | 549 | ret = sub->dma_off; |
diff --git a/sound/usb/hiface/pcm.c b/sound/usb/hiface/pcm.c index 6430ed2a9f65..c21a3df9a0df 100644 --- a/sound/usb/hiface/pcm.c +++ b/sound/usb/hiface/pcm.c | |||
@@ -503,7 +503,7 @@ static snd_pcm_uframes_t hiface_pcm_pointer(struct snd_pcm_substream *alsa_sub) | |||
503 | snd_pcm_uframes_t dma_offset; | 503 | snd_pcm_uframes_t dma_offset; |
504 | 504 | ||
505 | if (rt->panic || !sub) | 505 | if (rt->panic || !sub) |
506 | return SNDRV_PCM_STATE_XRUN; | 506 | return SNDRV_PCM_POS_XRUN; |
507 | 507 | ||
508 | spin_lock_irqsave(&sub->lock, flags); | 508 | spin_lock_irqsave(&sub->lock, flags); |
509 | dma_offset = sub->dma_off; | 509 | dma_offset = sub->dma_off; |
diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c index ca9fa4d32e07..07819bfa7dba 100644 --- a/tools/hv/hv_kvp_daemon.c +++ b/tools/hv/hv_kvp_daemon.c | |||
@@ -1026,9 +1026,10 @@ kvp_get_ip_info(int family, char *if_name, int op, | |||
1026 | 1026 | ||
1027 | if (sn_offset == 0) | 1027 | if (sn_offset == 0) |
1028 | strcpy(sn_str, cidr_mask); | 1028 | strcpy(sn_str, cidr_mask); |
1029 | else | 1029 | else { |
1030 | strcat((char *)ip_buffer->sub_net, ";"); | ||
1030 | strcat(sn_str, cidr_mask); | 1031 | strcat(sn_str, cidr_mask); |
1031 | strcat((char *)ip_buffer->sub_net, ";"); | 1032 | } |
1032 | sn_offset += strlen(sn_str) + 1; | 1033 | sn_offset += strlen(sn_str) + 1; |
1033 | } | 1034 | } |
1034 | 1035 | ||