<feed xmlns='http://www.w3.org/2005/Atom'>
<title>litmus-rt.git/drivers/char/agp/Kconfig, branch wip-bbb-prio-don</title>
<subtitle>The LITMUS^RT kernel.</subtitle>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/'/>
<entry>
<title>x86, k8 nb: Fix boot crash: enable k8_northbridges unconditionally on AMD systems</title>
<updated>2010-03-13T07:36:16+00:00</updated>
<author>
<name>Borislav Petkov</name>
<email>bp@amd64.org</email>
</author>
<published>2010-03-12T14:43:03+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=0e152cd7c16832bd5cadee0c2e41d9959bc9b6f9'/>
<id>0e152cd7c16832bd5cadee0c2e41d9959bc9b6f9</id>
<content type='text'>
de957628ce7c84764ff41331111036b3ae5bad0f changed setting of the
x86_init.iommu.iommu_init function ptr only when GART IOMMU is
found.

One side effect of it is that num_k8_northbridges
is not initialized anymore if not explicitly
called. This resulted in uninitialized pointers in
&lt;arch/x86/kernel/cpu/intel_cacheinfo.c:amd_calc_l3_indices()&gt;,
for example, which uses the num_k8_northbridges thing through
node_to_k8_nb_misc().

Fix that through an initcall that runs right after the PCI
subsystem and does all the scanning. Then, remove initialization
in gart_iommu_init() which is a rootfs_initcall and we're
running before that.

What is more, since num_k8_northbridges is being used in other
places beside GART IOMMU, include it whenever we add AMD CPU
support. The previous dependency chain in kconfig contained

K8_NB depends on AGP_AMD64|GART_IOMMU

which was clearly incorrect. The more natural way in terms of
hardware dependency should be

AGP_AMD64|GART_IOMMU depends on K8_NB depends on CPU_SUP_AMD &amp;&amp;
PCI. Make it so Number One!

Signed-off-by: Borislav Petkov &lt;borislav.petkov@amd.com&gt;
Cc: FUJITA Tomonori &lt;fujita.tomonori@lab.ntt.co.jp&gt;
Cc: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
LKML-Reference: &lt;20100312144303.GA29262@aftab&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Tested-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
de957628ce7c84764ff41331111036b3ae5bad0f changed setting of the
x86_init.iommu.iommu_init function ptr only when GART IOMMU is
found.

One side effect of it is that num_k8_northbridges
is not initialized anymore if not explicitly
called. This resulted in uninitialized pointers in
&lt;arch/x86/kernel/cpu/intel_cacheinfo.c:amd_calc_l3_indices()&gt;,
for example, which uses the num_k8_northbridges thing through
node_to_k8_nb_misc().

Fix that through an initcall that runs right after the PCI
subsystem and does all the scanning. Then, remove initialization
in gart_iommu_init() which is a rootfs_initcall and we're
running before that.

What is more, since num_k8_northbridges is being used in other
places beside GART IOMMU, include it whenever we add AMD CPU
support. The previous dependency chain in kconfig contained

K8_NB depends on AGP_AMD64|GART_IOMMU

which was clearly incorrect. The more natural way in terms of
hardware dependency should be

AGP_AMD64|GART_IOMMU depends on K8_NB depends on CPU_SUP_AMD &amp;&amp;
PCI. Make it so Number One!

Signed-off-by: Borislav Petkov &lt;borislav.petkov@amd.com&gt;
Cc: FUJITA Tomonori &lt;fujita.tomonori@lab.ntt.co.jp&gt;
Cc: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
LKML-Reference: &lt;20100312144303.GA29262@aftab&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Tested-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>agp/amd64: Remove GART dependency on AGP_AMD64</title>
<updated>2009-10-29T16:29:40+00:00</updated>
<author>
<name>Pavel Vasilyev</name>
<email>pavel@pavlinux.ru</email>
</author>
<published>2009-10-29T16:16:00+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=4f65ae36f0291ef97b7d4de2f59b2e68f3c8420b'/>
<id>4f65ae36f0291ef97b7d4de2f59b2e68f3c8420b</id>
<content type='text'>
The GART IOMMU code has no strong dependency to the AMD64
AGP code. So the automatic selection of AGP_AMD64 for GART
can be removed.

Cc: Dave Jones &lt;davej@redhat.com&gt;
Signed-off-by: Pavel Vasilyev &lt;pavel@pavlinux.ru&gt;
Signed-off-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The GART IOMMU code has no strong dependency to the AMD64
AGP code. So the automatic selection of AGP_AMD64 for GART
can be removed.

Cc: Dave Jones &lt;davej@redhat.com&gt;
Signed-off-by: Pavel Vasilyev &lt;pavel@pavlinux.ru&gt;
Signed-off-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>x86 gart: rename CONFIG_IOMMU to CONFIG_GART_IOMMU</title>
<updated>2007-10-29T23:22:22+00:00</updated>
<author>
<name>Joerg Roedel</name>
<email>joerg.roedel@amd.com</email>
</author>
<published>2007-10-24T10:49:48+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=966396d3a05c8049fce5c81c49138e5ee1b05443'/>
<id>966396d3a05c8049fce5c81c49138e5ee1b05443</id>
<content type='text'>
This patch renames the IOMMU config option to GART_IOMMU because in fact it
means the GART and not general support for an IOMMU on x86.

Signed-off-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
Acked-by: Muli Ben-Yehuda &lt;muli@il.ibm.com&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This patch renames the IOMMU config option to GART_IOMMU because in fact it
means the GART and not general support for an IOMMU on x86.

Signed-off-by: Joerg Roedel &lt;joerg.roedel@amd.com&gt;
Acked-by: Muli Ben-Yehuda &lt;muli@il.ibm.com&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>video gfx: merge kconfig menus</title>
<updated>2007-10-16T16:43:20+00:00</updated>
<author>
<name>Randy Dunlap</name>
<email>randy.dunlap@oracle.com</email>
</author>
<published>2007-10-16T08:29:39+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=179b025fea2fa65760f1dcdff3585465d2177159'/>
<id>179b025fea2fa65760f1dcdff3585465d2177159</id>
<content type='text'>
Move AGP and DRM menus into the video graphics support menu.
  They use 'menuconfig' so that they can all be disabled with
  one selection.
Make the console menu use 'menuconfig' so that it can all be
  disabled with one selection.
Make the frame buffer menu use 'menuconfig' so that it can all be
  disabled with one selection.

Signed-off-by: Randy Dunlap &lt;randy.dunlap@oracle.com&gt;
Acked-by: Dave Airlie &lt;airlied@linux.ie&gt;
Signed-off-by: Antonino Daplas &lt;adaplas@gmail.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Move AGP and DRM menus into the video graphics support menu.
  They use 'menuconfig' so that they can all be disabled with
  one selection.
Make the console menu use 'menuconfig' so that it can all be
  disabled with one selection.
Make the frame buffer menu use 'menuconfig' so that it can all be
  disabled with one selection.

Signed-off-by: Randy Dunlap &lt;randy.dunlap@oracle.com&gt;
Acked-by: Dave Airlie &lt;airlied@linux.ie&gt;
Signed-off-by: Antonino Daplas &lt;adaplas@gmail.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>agp: AMD AGP is used on UP1100 &amp; UP1500 alpha boxen</title>
<updated>2007-07-27T00:56:43+00:00</updated>
<author>
<name>Alan Hourihane</name>
<email>alanh@fairlite.demon.co.uk</email>
</author>
<published>2007-07-27T00:56:43+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=f191f144079b0083c6fa7d01a4acbd7263fb5032'/>
<id>f191f144079b0083c6fa7d01a4acbd7263fb5032</id>
<content type='text'>
Signed-off-by: Dave Airlie &lt;airlied@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Signed-off-by: Dave Airlie &lt;airlied@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge ../linus</title>
<updated>2006-12-12T23:13:32+00:00</updated>
<author>
<name>Dave Jones</name>
<email>davej@redhat.com</email>
</author>
<published>2006-12-12T23:13:32+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=f0eef25339f92f7cd4aeea23d9ae97987a5a1e82'/>
<id>f0eef25339f92f7cd4aeea23d9ae97987a5a1e82</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>[AGPGART] VIA and SiS AGP chipsets are x86-only</title>
<updated>2006-12-12T23:10:52+00:00</updated>
<author>
<name>Matthew Wilcox</name>
<email>matthew@wil.cx</email>
</author>
<published>2006-12-04T10:43:14+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=0cfea5dd98205f2fa318836da664a7d7df1afbc1'/>
<id>0cfea5dd98205f2fa318836da664a7d7df1afbc1</id>
<content type='text'>
There's no point in troubling the Alpha, IA-64, PowerPC and PARISC
people with SiS and VIA options.  Andrew thinks it helps find bugs,
but there's no evidence of that.

Signed-off-by: Matthew Wilcox &lt;matthew@wil.cx&gt;
Signed-off-by: Dave Jones &lt;davej@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
There's no point in troubling the Alpha, IA-64, PowerPC and PARISC
people with SiS and VIA options.  Andrew thinks it helps find bugs,
but there's no evidence of that.

Signed-off-by: Matthew Wilcox &lt;matthew@wil.cx&gt;
Signed-off-by: Dave Jones &lt;davej@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>[PARISC] Add support for Quicksilver AGPGART</title>
<updated>2006-10-04T12:50:16+00:00</updated>
<author>
<name>Kyle McMartin</name>
<email>kyle@parisc-linux.org</email>
</author>
<published>2006-08-25T01:33:40+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=08a6436816f7a16113c73be767ee8d50440e494e'/>
<id>08a6436816f7a16113c73be767ee8d50440e494e</id>
<content type='text'>
Signed-off-by: Kyle McMartin &lt;kyle@parisc-linux.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Signed-off-by: Kyle McMartin &lt;kyle@parisc-linux.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge ../linus</title>
<updated>2006-06-29T20:01:54+00:00</updated>
<author>
<name>Dave Jones</name>
<email>davej@redhat.com</email>
</author>
<published>2006-06-29T20:01:54+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=55b4d6a52195a8f277ffddf755ddaff359878f41'/>
<id>55b4d6a52195a8f277ffddf755ddaff359878f41</id>
<content type='text'>
Conflicts:

	drivers/char/agp/Kconfig
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Conflicts:

	drivers/char/agp/Kconfig
</pre>
</div>
</content>
</entry>
<entry>
<title>[AGPGART] Make AGP depend on PCI</title>
<updated>2006-06-28T17:38:43+00:00</updated>
<author>
<name>Dave Jones</name>
<email>davej@redhat.com</email>
</author>
<published>2006-06-28T17:38:43+00:00</published>
<link rel='alternate' type='text/html' href='http://rtsrv.cs.unc.edu/cgit/cgit.cgi/litmus-rt.git/commit/?id=adf8a287150667feb5747f8beade62acacc17d4e'/>
<id>adf8a287150667feb5747f8beade62acacc17d4e</id>
<content type='text'>
Fixes possible compile error in amd64 with pci=n
pointed out by Adrian Bunk.

Signed-off-by: Dave Jones &lt;davej@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Fixes possible compile error in amd64 with pci=n
pointed out by Adrian Bunk.

Signed-off-by: Dave Jones &lt;davej@redhat.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
</pre></td>
<td class='lines'><pre><code><span class="hl com">/*</span>
<span class="hl com"> * Copyright (C) ST-Ericsson SA 2010</span>
<span class="hl com"> *</span>
<span class="hl com"> * License Terms: GNU General Public License, version 2</span>
<span class="hl com"> * Author: Hanumath Prasad &lt;hanumath.prasad&#64;stericsson.com&gt; for ST-Ericsson</span>
<span class="hl com"> * Author: Rabin Vincent &lt;rabin.vincent&#64;stericsson.com&gt; for ST-Ericsson</span>
<span class="hl com"> */</span>

<span class="hl ppc">#include &lt;linux/module.h&gt;</span>
<span class="hl ppc">#include &lt;linux/interrupt.h&gt;</span>
<span class="hl ppc">#include &lt;linux/irq.h&gt;</span>
<span class="hl ppc">#include &lt;linux/slab.h&gt;</span>
<span class="hl ppc">#include &lt;linux/i2c.h&gt;</span>
<span class="hl ppc">#include &lt;linux/mfd/core.h&gt;</span>
<span class="hl ppc">#include &lt;linux/mfd/tc3589x.h&gt;</span>

<span class="hl ppc">#define TC3589x_CLKMODE_MODCTL_SLEEP		0x0</span>
<span class="hl ppc">#define TC3589x_CLKMODE_MODCTL_OPERATION	(1 &lt;&lt; 0)</span>

<span class="hl com">/**</span>
<span class="hl com"> * tc3589x_reg_read() - read a single TC3589x register</span>
<span class="hl com"> * &#64;tc3589x:	Device to read from</span>
<span class="hl com"> * &#64;reg:	Register to read</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">,</span> u8 reg<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">i2c_smbus_read_byte_data</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">,</span> reg<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to read reg %#x: %d</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
			reg<span class="hl opt">,</span> ret<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwd">EXPORT_SYMBOL_GPL</span><span class="hl opt">(</span>tc3589x_reg_read<span class="hl opt">);</span>

<span class="hl com">/**</span>
<span class="hl com"> * tc3589x_reg_read() - write a single TC3589x register</span>
<span class="hl com"> * &#64;tc3589x:	Device to write to</span>
<span class="hl com"> * &#64;reg:	Register to read</span>
<span class="hl com"> * &#64;data:	Value to write</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">,</span> u8 reg<span class="hl opt">,</span> u8 data<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">i2c_smbus_write_byte_data</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">,</span> reg<span class="hl opt">,</span> data<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to write reg %#x: %d</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
			reg<span class="hl opt">,</span> ret<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwd">EXPORT_SYMBOL_GPL</span><span class="hl opt">(</span>tc3589x_reg_write<span class="hl opt">);</span>

<span class="hl com">/**</span>
<span class="hl com"> * tc3589x_block_read() - read multiple TC3589x registers</span>
<span class="hl com"> * &#64;tc3589x:	Device to read from</span>
<span class="hl com"> * &#64;reg:	First register</span>
<span class="hl com"> * &#64;length:	Number of registers</span>
<span class="hl com"> * &#64;values:	Buffer to write to</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">tc3589x_block_read</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">,</span> u8 reg<span class="hl opt">,</span> u8 length<span class="hl opt">,</span> u8 <span class="hl opt">*</span>values<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">i2c_smbus_read_i2c_block_data</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">,</span> reg<span class="hl opt">,</span> length<span class="hl opt">,</span> values<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to read regs %#x: %d</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
			reg<span class="hl opt">,</span> ret<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwd">EXPORT_SYMBOL_GPL</span><span class="hl opt">(</span>tc3589x_block_read<span class="hl opt">);</span>

<span class="hl com">/**</span>
<span class="hl com"> * tc3589x_block_write() - write multiple TC3589x registers</span>
<span class="hl com"> * &#64;tc3589x:	Device to write to</span>
<span class="hl com"> * &#64;reg:	First register</span>
<span class="hl com"> * &#64;length:	Number of registers</span>
<span class="hl com"> * &#64;values:	Values to write</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">tc3589x_block_write</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">,</span> u8 reg<span class="hl opt">,</span> u8 length<span class="hl opt">,</span>
			<span class="hl kwb">const</span> u8 <span class="hl opt">*</span>values<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">i2c_smbus_write_i2c_block_data</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">,</span> reg<span class="hl opt">,</span> length<span class="hl opt">,</span>
					     values<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to write regs %#x: %d</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span>
			reg<span class="hl opt">,</span> ret<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwd">EXPORT_SYMBOL_GPL</span><span class="hl opt">(</span>tc3589x_block_write<span class="hl opt">);</span>

<span class="hl com">/**</span>
<span class="hl com"> * tc3589x_set_bits() - set the value of a bitfield in a TC3589x register</span>
<span class="hl com"> * &#64;tc3589x:	Device to write to</span>
<span class="hl com"> * &#64;reg:	Register to write</span>
<span class="hl com"> * &#64;mask:	Mask of bits to set</span>
<span class="hl com"> * &#64;values:	Value to set</span>
<span class="hl com"> */</span>
<span class="hl kwb">int</span> <span class="hl kwd">tc3589x_set_bits</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">,</span> u8 reg<span class="hl opt">,</span> u8 mask<span class="hl opt">,</span> u8 val<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	<span class="hl kwd">mutex_lock</span><span class="hl opt">(&amp;</span>tc3589x<span class="hl opt">-&gt;</span>lock<span class="hl opt">);</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> reg<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwa">goto</span> out<span class="hl opt">;</span>

	ret <span class="hl opt">&amp;= ~</span>mask<span class="hl opt">;</span>
	ret <span class="hl opt">|=</span> val<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> reg<span class="hl opt">,</span> ret<span class="hl opt">);</span>

out<span class="hl opt">:</span>
	<span class="hl kwd">mutex_unlock</span><span class="hl opt">(&amp;</span>tc3589x<span class="hl opt">-&gt;</span>lock<span class="hl opt">);</span>
	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwd">EXPORT_SYMBOL_GPL</span><span class="hl opt">(</span>tc3589x_set_bits<span class="hl opt">);</span>

<span class="hl kwb">static struct</span> resource gpio_resources<span class="hl opt">[] = {</span>
	<span class="hl opt">{</span>
		<span class="hl opt">.</span>start	<span class="hl opt">=</span> TC3589x_INT_GPIIRQ<span class="hl opt">,</span>
		<span class="hl opt">.</span>end	<span class="hl opt">=</span> TC3589x_INT_GPIIRQ<span class="hl opt">,</span>
		<span class="hl opt">.</span>flags	<span class="hl opt">=</span> IORESOURCE_IRQ<span class="hl opt">,</span>
	<span class="hl opt">},</span>
<span class="hl opt">};</span>

<span class="hl kwb">static struct</span> resource keypad_resources<span class="hl opt">[] = {</span>
	<span class="hl opt">{</span>
		<span class="hl opt">.</span>start  <span class="hl opt">=</span> TC3589x_INT_KBDIRQ<span class="hl opt">,</span>
		<span class="hl opt">.</span>end    <span class="hl opt">=</span> TC3589x_INT_KBDIRQ<span class="hl opt">,</span>
		<span class="hl opt">.</span>flags  <span class="hl opt">=</span> IORESOURCE_IRQ<span class="hl opt">,</span>
	<span class="hl opt">},</span>
<span class="hl opt">};</span>

<span class="hl kwb">static struct</span> mfd_cell tc3589x_dev_gpio<span class="hl opt">[] = {</span>
	<span class="hl opt">{</span>
		<span class="hl opt">.</span>name		<span class="hl opt">=</span> <span class="hl str">&quot;tc3589x-gpio&quot;</span><span class="hl opt">,</span>
		<span class="hl opt">.</span>num_resources	<span class="hl opt">=</span> <span class="hl kwd">ARRAY_SIZE</span><span class="hl opt">(</span>gpio_resources<span class="hl opt">),</span>
		<span class="hl opt">.</span>resources	<span class="hl opt">= &amp;</span>gpio_resources<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">],</span>
	<span class="hl opt">},</span>
<span class="hl opt">};</span>

<span class="hl kwb">static struct</span> mfd_cell tc3589x_dev_keypad<span class="hl opt">[] = {</span>
	<span class="hl opt">{</span>
		<span class="hl opt">.</span>name           <span class="hl opt">=</span> <span class="hl str">&quot;tc3589x-keypad&quot;</span><span class="hl opt">,</span>
		<span class="hl opt">.</span>num_resources  <span class="hl opt">=</span> <span class="hl kwd">ARRAY_SIZE</span><span class="hl opt">(</span>keypad_resources<span class="hl opt">),</span>
		<span class="hl opt">.</span>resources      <span class="hl opt">= &amp;</span>keypad_resources<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">],</span>
	<span class="hl opt">},</span>
<span class="hl opt">};</span>

<span class="hl kwb">static</span> irqreturn_t <span class="hl kwd">tc3589x_irq</span><span class="hl opt">(</span><span class="hl kwb">int</span> irq<span class="hl opt">,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x <span class="hl opt">=</span> data<span class="hl opt">;</span>
	<span class="hl kwb">int</span> status<span class="hl opt">;</span>

again<span class="hl opt">:</span>
	status <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_IRQST<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>status <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwa">return</span> IRQ_NONE<span class="hl opt">;</span>

	<span class="hl kwa">while</span> <span class="hl opt">(</span>status<span class="hl opt">) {</span>
		<span class="hl kwb">int</span> bit <span class="hl opt">=</span> <span class="hl kwd">__ffs</span><span class="hl opt">(</span>status<span class="hl opt">);</span>

		<span class="hl kwd">handle_nested_irq</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>irq_base <span class="hl opt">+</span> bit<span class="hl opt">);</span>
		status <span class="hl opt">&amp;= ~(</span><span class="hl num">1</span> <span class="hl opt">&lt;&lt;</span> bit<span class="hl opt">);</span>
	<span class="hl opt">}</span>

	<span class="hl com">/*</span>
<span class="hl com">	 * A dummy read or write (to any register) appears to be necessary to</span>
<span class="hl com">	 * have the last interrupt clear (for example, GPIO IC write) take</span>
<span class="hl com">	 * effect. In such a case, recheck for any interrupt which is still</span>
<span class="hl com">	 * pending.</span>
<span class="hl com">	 */</span>
	status <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_IRQST<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>status<span class="hl opt">)</span>
		<span class="hl kwa">goto</span> again<span class="hl opt">;</span>

	<span class="hl kwa">return</span> IRQ_HANDLED<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">tc3589x_irq_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> base <span class="hl opt">=</span> tc3589x<span class="hl opt">-&gt;</span>irq_base<span class="hl opt">;</span>
	<span class="hl kwb">int</span> irq<span class="hl opt">;</span>

	<span class="hl kwa">for</span> <span class="hl opt">(</span>irq <span class="hl opt">=</span> base<span class="hl opt">;</span> irq <span class="hl opt">&lt;</span> base <span class="hl opt">+</span> TC3589x_NR_INTERNAL_IRQS<span class="hl opt">;</span> irq<span class="hl opt">++) {</span>
		<span class="hl kwd">irq_set_chip_data</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> tc3589x<span class="hl opt">);</span>
		<span class="hl kwd">irq_set_chip_and_handler</span><span class="hl opt">(</span>irq<span class="hl opt">, &amp;</span>dummy_irq_chip<span class="hl opt">,</span>
					 handle_edge_irq<span class="hl opt">);</span>
		<span class="hl kwd">irq_set_nested_thread</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">);</span>
<span class="hl ppc">#ifdef CONFIG_ARM</span>
		<span class="hl kwd">set_irq_flags</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> IRQF_VALID<span class="hl opt">);</span>
<span class="hl ppc">#else</span>
		<span class="hl kwd">irq_set_noprobe</span><span class="hl opt">(</span>irq<span class="hl opt">);</span>
<span class="hl ppc">#endif</span>
	<span class="hl opt">}</span>

	<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static void</span> <span class="hl kwd">tc3589x_irq_remove</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> base <span class="hl opt">=</span> tc3589x<span class="hl opt">-&gt;</span>irq_base<span class="hl opt">;</span>
	<span class="hl kwb">int</span> irq<span class="hl opt">;</span>

	<span class="hl kwa">for</span> <span class="hl opt">(</span>irq <span class="hl opt">=</span> base<span class="hl opt">;</span> irq <span class="hl opt">&lt;</span> base <span class="hl opt">+</span> TC3589x_NR_INTERNAL_IRQS<span class="hl opt">;</span> irq<span class="hl opt">++) {</span>
<span class="hl ppc">#ifdef CONFIG_ARM</span>
		<span class="hl kwd">set_irq_flags</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">);</span>
<span class="hl ppc">#endif</span>
		<span class="hl kwd">irq_set_chip_and_handler</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> NULL<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
		<span class="hl kwd">irq_set_chip_data</span><span class="hl opt">(</span>irq<span class="hl opt">,</span> NULL<span class="hl opt">);</span>
	<span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">tc3589x_chip_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> manf<span class="hl opt">,</span> ver<span class="hl opt">,</span> ret<span class="hl opt">;</span>

	manf <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_MANFCODE<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>manf <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwa">return</span> manf<span class="hl opt">;</span>

	ver <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_read</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_VERSION<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ver <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwa">return</span> ver<span class="hl opt">;</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span>manf <span class="hl opt">!=</span> TC3589x_MANFCODE_MAGIC<span class="hl opt">) {</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;unknown manufacturer: %#x</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> manf<span class="hl opt">);</span>
		<span class="hl kwa">return</span> <span class="hl opt">-</span>EINVAL<span class="hl opt">;</span>
	<span class="hl opt">}</span>

	<span class="hl kwd">dev_info</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;manufacturer: %#x, version: %#x</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> manf<span class="hl opt">,</span> ver<span class="hl opt">);</span>

	<span class="hl com">/*</span>
<span class="hl com">	 * Put everything except the IRQ module into reset;</span>
<span class="hl com">	 * also spare the GPIO module for any pin initialization</span>
<span class="hl com">	 * done during pre-kernel boot</span>
<span class="hl com">	 */</span>
	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_RSTCTRL<span class="hl opt">,</span>
				TC3589x_RSTCTRL_TIMRST
				<span class="hl opt">|</span> TC3589x_RSTCTRL_ROTRST
				<span class="hl opt">|</span> TC3589x_RSTCTRL_KBDRST<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret <span class="hl opt">&lt;</span> <span class="hl num">0</span><span class="hl opt">)</span>
		<span class="hl kwa">return</span> ret<span class="hl opt">;</span>

	<span class="hl com">/* Clear the reset interrupt. */</span>
	<span class="hl kwa">return</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_RSTINTCLR<span class="hl opt">,</span> <span class="hl num">0x1</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> __devinit <span class="hl kwd">tc3589x_device_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">int</span> ret <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl kwb">unsigned int</span> blocks <span class="hl opt">=</span> tc3589x<span class="hl opt">-&gt;</span>pdata<span class="hl opt">-&gt;</span>block<span class="hl opt">;</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span>blocks <span class="hl opt">&amp;</span> TC3589x_BLOCK_GPIO<span class="hl opt">) {</span>
		ret <span class="hl opt">=</span> <span class="hl kwd">mfd_add_devices</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">, -</span><span class="hl num">1</span><span class="hl opt">,</span> tc3589x_dev_gpio<span class="hl opt">,</span>
				<span class="hl kwd">ARRAY_SIZE</span><span class="hl opt">(</span>tc3589x_dev_gpio<span class="hl opt">),</span> NULL<span class="hl opt">,</span>
				tc3589x<span class="hl opt">-&gt;</span>irq_base<span class="hl opt">);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">) {</span>
			<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to add gpio child</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
			<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl kwd">dev_info</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;added gpio block</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span>blocks <span class="hl opt">&amp;</span> TC3589x_BLOCK_KEYPAD<span class="hl opt">) {</span>
		ret <span class="hl opt">=</span> <span class="hl kwd">mfd_add_devices</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">, -</span><span class="hl num">1</span><span class="hl opt">,</span> tc3589x_dev_keypad<span class="hl opt">,</span>
				<span class="hl kwd">ARRAY_SIZE</span><span class="hl opt">(</span>tc3589x_dev_keypad<span class="hl opt">),</span> NULL<span class="hl opt">,</span>
				tc3589x<span class="hl opt">-&gt;</span>irq_base<span class="hl opt">);</span>
		<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">) {</span>
			<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to keypad child</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
			<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
		<span class="hl opt">}</span>
		<span class="hl kwd">dev_info</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;added keypad block</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> __devinit <span class="hl kwd">tc3589x_probe</span><span class="hl opt">(</span><span class="hl kwb">struct</span> i2c_client <span class="hl opt">*</span>i2c<span class="hl opt">,</span>
				   <span class="hl kwb">const struct</span> i2c_device_id <span class="hl opt">*</span>id<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> tc3589x_platform_data <span class="hl opt">*</span>pdata <span class="hl opt">=</span> i2c<span class="hl opt">-&gt;</span>dev<span class="hl opt">.</span>platform_data<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x<span class="hl opt">;</span>
	<span class="hl kwb">int</span> ret<span class="hl opt">;</span>

	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwd">i2c_check_functionality</span><span class="hl opt">(</span>i2c<span class="hl opt">-&gt;</span>adapter<span class="hl opt">,</span> I2C_FUNC_SMBUS_BYTE_DATA
				     <span class="hl opt">|</span> I2C_FUNC_SMBUS_I2C_BLOCK<span class="hl opt">))</span>
		<span class="hl kwa">return</span> <span class="hl opt">-</span>EIO<span class="hl opt">;</span>

	tc3589x <span class="hl opt">=</span> <span class="hl kwd">kzalloc</span><span class="hl opt">(</span><span class="hl kwa">sizeof</span><span class="hl opt">(</span><span class="hl kwb">struct</span> tc3589x<span class="hl opt">),</span> GFP_KERNEL<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span>tc3589x<span class="hl opt">)</span>
		<span class="hl kwa">return</span> <span class="hl opt">-</span>ENOMEM<span class="hl opt">;</span>

	<span class="hl kwd">mutex_init</span><span class="hl opt">(&amp;</span>tc3589x<span class="hl opt">-&gt;</span>lock<span class="hl opt">);</span>

	tc3589x<span class="hl opt">-&gt;</span>dev <span class="hl opt">= &amp;</span>i2c<span class="hl opt">-&gt;</span>dev<span class="hl opt">;</span>
	tc3589x<span class="hl opt">-&gt;</span>i2c <span class="hl opt">=</span> i2c<span class="hl opt">;</span>
	tc3589x<span class="hl opt">-&gt;</span>pdata <span class="hl opt">=</span> pdata<span class="hl opt">;</span>
	tc3589x<span class="hl opt">-&gt;</span>irq_base <span class="hl opt">=</span> pdata<span class="hl opt">-&gt;</span>irq_base<span class="hl opt">;</span>
	tc3589x<span class="hl opt">-&gt;</span>num_gpio <span class="hl opt">=</span> id<span class="hl opt">-&gt;</span>driver_data<span class="hl opt">;</span>

	<span class="hl kwd">i2c_set_clientdata</span><span class="hl opt">(</span>i2c<span class="hl opt">,</span> tc3589x<span class="hl opt">);</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_chip_init</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">)</span>
		<span class="hl kwa">goto</span> out_free<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_irq_init</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">)</span>
		<span class="hl kwa">goto</span> out_free<span class="hl opt">;</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">request_threaded_irq</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">-&gt;</span>irq<span class="hl opt">,</span> NULL<span class="hl opt">,</span> tc3589x_irq<span class="hl opt">,</span>
				   IRQF_TRIGGER_FALLING <span class="hl opt">|</span> IRQF_ONESHOT<span class="hl opt">,</span>
				   <span class="hl str">&quot;tc3589x&quot;</span><span class="hl opt">,</span> tc3589x<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">) {</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to request IRQ: %d</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">,</span> ret<span class="hl opt">);</span>
		<span class="hl kwa">goto</span> out_removeirq<span class="hl opt">;</span>
	<span class="hl opt">}</span>

	ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_device_init</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span>ret<span class="hl opt">) {</span>
		<span class="hl kwd">dev_err</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">,</span> <span class="hl str">&quot;failed to add child devices</span><span class="hl esc">\n</span><span class="hl str">&quot;</span><span class="hl opt">);</span>
		<span class="hl kwa">goto</span> out_freeirq<span class="hl opt">;</span>
	<span class="hl opt">}</span>

	<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>

out_freeirq<span class="hl opt">:</span>
	<span class="hl kwd">free_irq</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">-&gt;</span>irq<span class="hl opt">,</span> tc3589x<span class="hl opt">);</span>
out_removeirq<span class="hl opt">:</span>
	<span class="hl kwd">tc3589x_irq_remove</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>
out_free<span class="hl opt">:</span>
	<span class="hl kwd">kfree</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>
	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> __devexit <span class="hl kwd">tc3589x_remove</span><span class="hl opt">(</span><span class="hl kwb">struct</span> i2c_client <span class="hl opt">*</span>client<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x <span class="hl opt">=</span> <span class="hl kwd">i2c_get_clientdata</span><span class="hl opt">(</span>client<span class="hl opt">);</span>

	<span class="hl kwd">mfd_remove_devices</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>dev<span class="hl opt">);</span>

	<span class="hl kwd">free_irq</span><span class="hl opt">(</span>tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">-&gt;</span>irq<span class="hl opt">,</span> tc3589x<span class="hl opt">);</span>
	<span class="hl kwd">tc3589x_irq_remove</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>

	<span class="hl kwd">kfree</span><span class="hl opt">(</span>tc3589x<span class="hl opt">);</span>

	<span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl ppc">#ifdef CONFIG_PM</span>
<span class="hl kwb">static int</span> <span class="hl kwd">tc3589x_suspend</span><span class="hl opt">(</span><span class="hl kwb">struct</span> device <span class="hl opt">*</span>dev<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x <span class="hl opt">=</span> <span class="hl kwd">dev_get_drvdata</span><span class="hl opt">(</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">struct</span> i2c_client <span class="hl opt">*</span>client <span class="hl opt">=</span> tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">;</span>
	<span class="hl kwb">int</span> ret <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>

	<span class="hl com">/* put the system to sleep mode */</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwd">device_may_wakeup</span><span class="hl opt">(&amp;</span>client<span class="hl opt">-&gt;</span>dev<span class="hl opt">))</span>
		ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_CLKMODE<span class="hl opt">,</span>
				TC3589x_CLKMODE_MODCTL_SLEEP<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static int</span> <span class="hl kwd">tc3589x_resume</span><span class="hl opt">(</span><span class="hl kwb">struct</span> device <span class="hl opt">*</span>dev<span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> tc3589x <span class="hl opt">*</span>tc3589x <span class="hl opt">=</span> <span class="hl kwd">dev_get_drvdata</span><span class="hl opt">(</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">struct</span> i2c_client <span class="hl opt">*</span>client <span class="hl opt">=</span> tc3589x<span class="hl opt">-&gt;</span>i2c<span class="hl opt">;</span>
	<span class="hl kwb">int</span> ret <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span>

	<span class="hl com">/* enable the system into operation */</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwd">device_may_wakeup</span><span class="hl opt">(&amp;</span>client<span class="hl opt">-&gt;</span>dev<span class="hl opt">))</span>
		ret <span class="hl opt">=</span> <span class="hl kwd">tc3589x_reg_write</span><span class="hl opt">(</span>tc3589x<span class="hl opt">,</span> TC3589x_CLKMODE<span class="hl opt">,</span>
				TC3589x_CLKMODE_MODCTL_OPERATION<span class="hl opt">);</span>

	<span class="hl kwa">return</span> ret<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwb">static const</span> <span class="hl kwd">SIMPLE_DEV_PM_OPS</span><span class="hl opt">(</span>tc3589x_dev_pm_ops<span class="hl opt">,</span> tc3589x_suspend<span class="hl opt">,</span>
						tc3589x_resume<span class="hl opt">);</span>
<span class="hl ppc">#endif</span>

<span class="hl kwb">static const struct</span> i2c_device_id tc3589x_id<span class="hl opt">[] = {</span>
	<span class="hl opt">{</span> <span class="hl str">&quot;tc3589x&quot;</span><span class="hl opt">,</span> <span class="hl num">24</span> <span class="hl opt">},</span>
	<span class="hl opt">{ }</span>
<span class="hl opt">};</span>
<span class="hl kwd">MODULE_DEVICE_TABLE</span><span class="hl opt">(</span>i2c<span class="hl opt">,</span> tc3589x_id<span class="hl opt">);</span>

<span class="hl kwb">static struct</span> i2c_driver tc3589x_driver <span class="hl opt">= {</span>
	<span class="hl opt">.</span>driver<span class="hl opt">.</span>name	<span class="hl opt">=</span> <span class="hl str">&quot;tc3589x&quot;</span><span class="hl opt">,</span>
	<span class="hl opt">.</span>driver<span class="hl opt">.</span>owner	<span class="hl opt">=</span> THIS_MODULE<span class="hl opt">,</span>
<span class="hl ppc">#ifdef CONFIG_PM</span>
	<span class="hl opt">.</span>driver<span class="hl opt">.</span>pm	<span class="hl opt">= &amp;</span>tc3589x_dev_pm_ops<span class="hl opt">,</span>
<span class="hl ppc">#endif</span>
	<span class="hl opt">.</span>probe		<span class="hl opt">=</span> tc3589x_probe<span class="hl opt">,</span>
	<span class="hl opt">.</span>remove		<span class="hl opt">=</span> <span class="hl kwd">__devexit_p</span><span class="hl opt">(</span>tc3589x_remove<span class="hl opt">),</span>
	<span class="hl opt">.</span>id_table	<span class="hl opt">=</span> tc3589x_id<span class="hl opt">,</span>
<span class="hl opt">};</span>

<span class="hl kwb">static int</span> __init <span class="hl kwd">tc3589x_init</span><span class="hl opt">(</span><span class="hl kwb">void</span><span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwa">return</span> <span class="hl kwd">i2c_add_driver</span><span class="hl opt">(&amp;</span>tc3589x_driver<span class="hl opt">);</span>
<span class="hl opt">}</span>
<span class="hl kwd">subsys_initcall</span><span class="hl opt">(</span>tc3589x_init<span class="hl opt">);</span>

<span class="hl kwb">static void</span> __exit <span class="hl kwd">tc3589x_exit</span><span class="hl opt">(</span><span class="hl kwb">void</span><span class="hl opt">)</span>
<span class="hl opt">{</span>
	<span class="hl kwd">i2c_del_driver</span><span class="hl opt">(&amp;</span>tc3589x_driver<span class="hl opt">);</span>
<span class="hl opt">}</span>
<span class="hl kwd">module_exit</span><span class="hl opt">(</span>tc3589x_exit<span class="hl opt">);</span>

<span class="hl kwd">MODULE_LICENSE</span><span class="hl opt">(</span><span class="hl str">&quot;GPL v2&quot;</span><span class="hl opt">);</span>
<span class="hl kwd">MODULE_DESCRIPTION</span><span class="hl opt">(</span><span class="hl str">&quot;TC3589x MFD core driver&quot;</span><span class="hl opt">);</span>
<span class="hl kwd">MODULE_AUTHOR</span><span class="hl opt">(</span><span class="hl str">&quot;Hanumath Prasad, Rabin Vincent&quot;</span><span class="hl opt">);</span>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.2</a> (<a href='https://git-scm.com/'>git 2.25.0</a>) at 2026-04-25 17:02:41 -0400</div>
</div> <!-- id=cgit -->
</body>
</html>
