diff options
author | Koen Kooi <koen@openembedded.org> | 2007-10-18 12:12:05 +0000 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2007-10-18 12:12:05 +0000 |
commit | b5bfd7f1fd6bd34ef51701e918b40f724cb46258 (patch) | |
tree | 005a7d449e934743db904d5c09d8c4981e2971b5 /packages | |
parent | 1c5df3f485ba9992931e06d07f28c57a29d89e5e (diff) | |
parent | d1b8caf7848752ca2f69f1ecdc7791e83457c7ff (diff) |
propagate from branch 'org.openembedded.dev' (head d46c4661bf8a227094ce244e37836233fb938268)
to branch 'org.openembedded.dev.avr32' (head 7cd1ae5351316a6cdc9fe3db60bb05198d50af39)
Diffstat (limited to 'packages')
111 files changed, 18779 insertions, 1041 deletions
diff --git a/packages/alsa/alsa-state.bb b/packages/alsa/alsa-state.bb index 1bac841a6e..d51df961a1 100644 --- a/packages/alsa/alsa-state.bb +++ b/packages/alsa/alsa-state.bb @@ -8,7 +8,7 @@ DESCRIPTION = "Default ALSA configuration" LICENSE = "GPL" RRECOMMENDS_alsa-state = "alsa-states" PV = "0.1.0" -PR = "r3" +PR = "r5" SRC_URI = " \ file://asoundrc \ @@ -21,6 +21,7 @@ SRC_URI_append_fic-gta01 = " \ file://gsmbluetooth.state \ file://gsmhandset.state \ file://gsmheadset.state \ + file://gsmspeakerout.state \ file://stereoout.state" inherit update-rc.d diff --git a/packages/alsa/alsa-state/fic-gta01/gsmspeakerout.state b/packages/alsa/alsa-state/fic-gta01/gsmspeakerout.state new file mode 100644 index 0000000000..950f7e1379 --- /dev/null +++ b/packages/alsa/alsa-state/fic-gta01/gsmspeakerout.state @@ -0,0 +1,900 @@ +state.neo1973 { + control.1 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 255' + iface MIXER + name 'PCM Volume' + value.0 255 + value.1 255 + } + control.2 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 255' + iface MIXER + name 'ADC Capture Volume' + value.0 0 + value.1 0 + } + control.3 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 127' + iface MIXER + name 'Headphone Playback Volume' + value.0 121 + value.1 121 + } + control.4 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 127' + iface MIXER + name 'Speaker Playback Volume' + value.0 121 + value.1 121 + } + control.5 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 127' + iface MIXER + name 'Mono Playback Volume' + value 111 + } + control.6 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 7' + iface MIXER + name 'Bypass Playback Volume' + value.0 5 + value.1 5 + } + control.7 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 7' + iface MIXER + name 'Sidetone Playback Volume' + value.0 1 + value.1 1 + } + control.8 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 7' + iface MIXER + name 'Voice Playback Volume' + value.0 2 + value.1 2 + } + control.9 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 2 + iface MIXER + name 'Headphone Playback ZC Switch' + value.0 false + value.1 false + } + control.10 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 2 + iface MIXER + name 'Speaker Playback ZC Switch' + value.0 false + value.1 false + } + control.11 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'Mono Bypass Playback Volume' + value 5 + } + control.12 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'Mono Sidetone Playback Volume' + value 6 + } + control.13 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'Mono Voice Playback Volume' + value 6 + } + control.14 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Playback ZC Switch' + value false + } + control.15 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Linear Control' + comment.item.1 'Adaptive Boost' + iface MIXER + name 'Bass Boost' + value 'Linear Control' + } + control.16 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 '130Hz @ 48kHz' + comment.item.1 '200Hz @ 48kHz' + comment.item.2 '100Hz @ 16kHz' + comment.item.3 '400Hz @ 48kHz' + comment.item.4 '100Hz @ 8kHz' + comment.item.5 '200Hz @ 8kHz' + iface MIXER + name 'Bass Filter' + value '130Hz @ 48kHz' + } + control.17 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name 'Bass Volume' + value 0 + } + control.18 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name 'Treble Volume' + value 7 + } + control.19 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 '8kHz' + comment.item.1 '4kHz' + iface MIXER + name 'Treble Cut-off' + value '8kHz' + } + control.20 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 7' + iface MIXER + name 'Sidetone Capture Volume' + value.0 0 + value.1 0 + } + control.21 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'Voice Sidetone Capture Volume' + value 0 + } + control.22 { + comment.access 'read write' + comment.type INTEGER + comment.count 2 + comment.range '0 - 63' + iface MIXER + name 'Capture Volume' + value.0 0 + value.1 0 + } + control.23 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 2 + iface MIXER + name 'Capture ZC Switch' + value.0 false + value.1 false + } + control.24 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 2 + iface MIXER + name 'Capture Switch' + value.0 false + value.1 false + } + control.25 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 '3.4Hz @ 48kHz' + comment.item.1 '82Hz @ 16k' + comment.item.2 '82Hz @ 8kHz' + comment.item.3 '170Hz @ 8kHz' + iface MIXER + name 'Capture Filter Select' + value '3.4Hz @ 48kHz' + } + control.26 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 HiFi + comment.item.1 Voice + iface MIXER + name 'Capture Filter Cut-off' + value Voice + } + control.27 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Capture Filter Switch' + value true + } + control.28 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'ALC Capture Target Volume' + value 5 + } + control.29 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 7' + iface MIXER + name 'ALC Capture Max Volume' + value 7 + } + control.30 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Off + comment.item.1 Right + comment.item.2 Left + comment.item.3 Stereo + iface MIXER + name 'ALC Capture Function' + value Off + } + control.31 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Capture ZC Switch' + value false + } + control.32 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name 'ALC Capture Hold Time' + value 15 + } + control.33 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name 'ALC Capture Decay Time' + value 12 + } + control.34 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name 'ALC Capture Attack Time' + value 5 + } + control.35 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 31' + iface MIXER + name 'ALC Capture NG Threshold' + value 0 + } + control.36 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Constant PGA Gain' + comment.item.1 'Mute ADC Output' + iface MIXER + name 'ALC Capture NG Type' + value 'Constant PGA Gain' + } + control.37 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Capture NG Switch' + value false + } + control.38 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Capture + comment.item.1 Playback + iface MIXER + name '3D Function' + value Capture + } + control.39 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 '2.2kHz' + comment.item.1 '1.5kHz' + iface MIXER + name '3D Upper Cut-off' + value '2.2kHz' + } + control.40 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 '200Hz' + comment.item.1 '500Hz' + iface MIXER + name '3D Lower Cut-off' + value '200Hz' + } + control.41 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 15' + iface MIXER + name '3D Volume' + value 0 + } + control.42 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name '3D Switch' + value false + } + control.43 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Capture 6dB Attenuate' + value false + } + control.44 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Playback 6dB Attenuate' + value false + } + control.45 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 None + comment.item.1 '32kHz' + comment.item.2 '44.1kHz' + comment.item.3 '48kHz' + iface MIXER + name De-emphasis + value None + } + control.46 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Stereo + comment.item.1 Left + comment.item.2 Right + comment.item.3 Mono + iface MIXER + name 'Playback Mono Mix' + value Stereo + } + control.47 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Non Inverted' + comment.item.1 Inverted + iface MIXER + name 'Playback Phase' + value Inverted + } + control.48 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 3' + iface MIXER + name 'Mic2 Capture Volume' + value 0 + } + control.49 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 3' + iface MIXER + name 'Mic1 Capture Volume' + value 0 + } + control.50 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'DAI 0' + comment.item.1 'DAI 1' + comment.item.2 'DAI 2' + comment.item.3 'DAI 3' + iface MIXER + name 'DAI Mode' + value 'DAI 0' + } + control.51 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Stereo + comment.item.1 'Left ADC' + comment.item.2 'Right ADC' + comment.item.3 'Channel Swap' + iface MIXER + name 'ADC Data Select' + value Stereo + } + control.52 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Mic 1' + comment.item.1 'Mic 2' + comment.item.2 'Mic 3' + iface MIXER + name 'Mic Selection Mux' + value 'Mic 1' + } + control.53 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'RXP - RXN' + comment.item.1 'RXP + RXN' + comment.item.2 RXP + comment.item.3 RXN + iface MIXER + name 'Rx Mixer' + value 'RXP - RXN' + } + control.54 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Line 1 + 2' + comment.item.1 'Line 1 - 2' + comment.item.2 'Line 1' + comment.item.3 'Line 2' + iface MIXER + name 'Line Mixer' + value 'Line 1 + 2' + } + control.55 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Line Mix' + comment.item.1 'Rx Mix' + iface MIXER + name 'Line Mono Mux' + value 'Line Mix' + } + control.56 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Line 2' + comment.item.1 'Rx Mix' + iface MIXER + name 'Line Right Mux' + value 'Rx Mix' + } + control.57 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Line 1' + comment.item.1 'Rx Mix' + iface MIXER + name 'Line Left Mux' + value 'Rx Mix' + } + control.58 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Mixer Line Capture Switch' + value false + } + control.59 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Mixer Mic2 Capture Switch' + value false + } + control.60 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Mixer Mic1 Capture Switch' + value false + } + control.61 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'ALC Mixer Rx Capture Switch' + value false + } + control.62 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Left PGA' + comment.item.1 'Mic 1' + comment.item.2 'Mic 2' + comment.item.3 'Right PGA' + iface MIXER + name 'Mic Sidetone Mux' + value 'Mic 1' + } + control.63 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 PGA + comment.item.1 'Line or RXP-RXN' + comment.item.2 Sidetone + iface MIXER + name 'Capture Right Mux' + value PGA + } + control.64 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 PGA + comment.item.1 'Line or RXP-RXN' + comment.item.2 Line + iface MIXER + name 'Capture Left Mux' + value PGA + } + control.65 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Stereo + comment.item.1 'Analogue Mix Left' + comment.item.2 'Analogue Mix Right' + comment.item.3 'Digital Mono Mix' + iface MIXER + name 'Capture Right Mixer' + value Stereo + } + control.66 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Stereo + comment.item.1 'Analogue Mix Left' + comment.item.2 'Analogue Mix Right' + comment.item.3 'Digital Mono Mix' + iface MIXER + name 'Capture Left Mixer' + value Stereo + } + control.67 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Playback Mixer Voice Capture Sw' + value false + } + control.68 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Playback Mixer Left Capture Swi' + value false + } + control.69 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Playback Mixer Right Capture Sw' + value false + } + control.70 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 VREF + comment.item.1 'Capture ST' + comment.item.2 LOUT2 + iface MIXER + name 'Out4 Mux' + value VREF + } + control.71 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 VREF + comment.item.1 ROUT2 + comment.item.2 'Left + Right' + iface MIXER + name 'Out3 Mux' + value VREF + } + control.72 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 'Inverted Mono 1' + comment.item.1 Left + comment.item.2 Right + comment.item.3 'Left + Right' + iface MIXER + name 'Mono 2 Mux' + value 'Inverted Mono 1' + } + control.73 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Mixer Left Playback Switch' + value false + } + control.74 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Mixer Right Playback Switc' + value false + } + control.75 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Mixer Voice Playback Switc' + value false + } + control.76 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Mixer Sidetone Playback Sw' + value true + } + control.77 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Mono Mixer Bypass Playback Swit' + value false + } + control.78 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Right Mixer Voice Playback Swit' + value false + } + control.79 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Right Mixer Sidetone Playback S' + value false + } + control.80 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Right Mixer Right Playback Swit' + value false + } + control.81 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Right Mixer Bypass Playback Swi' + value true + } + control.82 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Left Mixer Voice Playback Switc' + value false + } + control.83 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Left Mixer Sidetone Playback Sw' + value false + } + control.84 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Left Mixer Left Playback Switch' + value false + } + control.85 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Left Mixer Bypass Playback Swit' + value true + } + control.86 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 31' + iface MIXER + name 'Amp Left Playback Volume' + value 31 + } + control.87 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 31' + iface MIXER + name 'Amp Right Playback Volume' + value 31 + } + control.88 { + comment.access 'read write' + comment.type INTEGER + comment.count 1 + comment.range '0 - 31' + iface MIXER + name 'Amp Mono Playback Volume' + value 9 + } + control.89 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Off + comment.item.1 'Call Speaker' + comment.item.2 'Stereo Speakers' + comment.item.3 'Stereo Speakers + Headphones' + comment.item.4 Headphones + iface MIXER + name 'Amp Mode' + value 'Stereo Speakers' + } + control.90 { + comment.access 'read write' + comment.type ENUMERATED + comment.count 1 + comment.item.0 Off + comment.item.1 'GSM Handset' + comment.item.2 'GSM Headset' + comment.item.3 'GSM Bluetooth' + comment.item.4 Speakers + comment.item.5 Headphones + comment.item.6 'Capture Handset' + comment.item.7 'Capture Headset' + comment.item.8 'Capture Bluetooth' + iface MIXER + name 'Neo Mode' + value 'GSM Handset' + } + control.91 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Amp Spk 3D Playback Switch' + value false + } + control.92 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Amp HP 3d Playback Switch' + value false + } + control.93 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Amp Fast Wakeup Playback Switch' + value false + } + control.94 { + comment.access 'read write' + comment.type BOOLEAN + comment.count 1 + iface MIXER + name 'Amp Earpiece 6dB Playback Switch' + value false + } +} diff --git a/packages/alsa/alsa-state/fic-gta01/stereoout.state b/packages/alsa/alsa-state/fic-gta01/stereoout.state index c27b78bb27..84117065a4 100644 --- a/packages/alsa/alsa-state/fic-gta01/stereoout.state +++ b/packages/alsa/alsa-state/fic-gta01/stereoout.state @@ -6,8 +6,8 @@ state.neo1973 { comment.range '0 - 255' iface MIXER name 'PCM Volume' - value.0 255 - value.1 255 + value.0 230 + value.1 230 } control.2 { comment.access 'read write' @@ -159,7 +159,7 @@ state.neo1973 { comment.access 'read write' comment.type INTEGER comment.count 1 - comment.range '0 - 7' + comment.range '0 - 15' iface MIXER name 'Bass Volume' value 0 @@ -168,7 +168,7 @@ state.neo1973 { comment.access 'read write' comment.type INTEGER comment.count 1 - comment.range '0 - 7' + comment.range '0 - 15' iface MIXER name 'Treble Volume' value 7 @@ -815,7 +815,7 @@ state.neo1973 { comment.range '0 - 31' iface MIXER name 'Amp Left Playback Volume' - value 21 + value 22 } control.87 { comment.access 'read write' @@ -824,7 +824,7 @@ state.neo1973 { comment.range '0 - 31' iface MIXER name 'Amp Right Playback Volume' - value 21 + value 22 } control.88 { comment.access 'read write' @@ -858,6 +858,9 @@ state.neo1973 { comment.item.3 'GSM Bluetooth' comment.item.4 Speakers comment.item.5 Headphones + comment.item.6 'Capture Handset' + comment.item.7 'Capture Headset' + comment.item.8 'Capture Bluetooth' iface MIXER name 'Neo Mode' value Headphones @@ -868,7 +871,7 @@ state.neo1973 { comment.count 1 iface MIXER name 'Amp Spk 3D Playback Switch' - value false + value true } control.92 { comment.access 'read write' diff --git a/packages/avahi/avahi-ui_0.6.21.bb b/packages/avahi/avahi-ui_0.6.21.bb new file mode 100644 index 0000000000..1159b8ead4 --- /dev/null +++ b/packages/avahi/avahi-ui_0.6.21.bb @@ -0,0 +1,20 @@ +require avahi.inc +PR = "r0" + +DEPENDS += "avahi gtk+" + +SRC_URI += "file://dbus-pre-1.1.1-support.patch;patch=1" +AVAHI_GTK = "--enable-gtk" + +S = "${WORKDIR}/avahi-${PV}" + +do_stage() { + install -d ${STAGING_INCDIR}/avahi-ui + cp ${S}/avahi-ui/*.h ${STAGING_INCDIR}/avahi-ui/ + oe_libinstall -C avahi-ui -a -so libavahi-ui ${STAGING_LIBDIR} +} + +PACKAGES = "${PN} ${PN}-dbg" + +FILES_${PN} = "${libdir}/libavahi-ui*.so.*" +FILES_${PN}-dbg = "${libdir}/.debug/libavah-ui*" diff --git a/packages/avahi/mango-lassi_git.bb b/packages/avahi/mango-lassi_git.bb new file mode 100644 index 0000000000..99fd617ec9 --- /dev/null +++ b/packages/avahi/mango-lassi_git.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Input sharing, the avahi way" +DEPENDS = "avahi-ui libglade libnotify" + +PV = "0.0+git${SRCDATE}" + +SRC_URI = "git://git.0pointer.de/repos/mango-lassi.git/;protocol=http" + + +S = "${WORKDIR}/${PN}" + +do_compile_prepend() { + export CFLAGS="-Wall -Wextra -W -O0 -g -pipe -Wno-unused-parameter `pkg-config --cflags dbus-glib-1 glib-2.0 gtk+-2.0 xtst avahi-ui avahi-glib avahi-client libnotify libglade-2.0` `pkg-config --libs dbus-glib-1 glib-2.0 gtk+-2.0 xtst avahi-glib avahi-client avahi-ui libnotify libglade-2.0`" +} + +do_install() { + install -d ${D}${bindir} + install -m 755 mango-lassi ${D}${bindir} +} diff --git a/packages/nonworking/gutenprint/.mtn2git_empty b/packages/base-files/base-files/ghi270/.mtn2git_empty index e69de29bb2..e69de29bb2 100644 --- a/packages/nonworking/gutenprint/.mtn2git_empty +++ b/packages/base-files/base-files/ghi270/.mtn2git_empty diff --git a/packages/bluez/bluez-utils.inc b/packages/bluez/bluez-utils.inc index 8a8766cbf8..4d2ce6505e 100644 --- a/packages/bluez/bluez-utils.inc +++ b/packages/bluez/bluez-utils.inc @@ -12,6 +12,8 @@ SRC_URI = "http://bluez.sourceforge.net/download/bluez-utils-${PV}.tar.gz \ file://hcid.conf \ file://hciattach-ti-bts.patch;patch=1 \ file://handle-eintr.patch;patch=1;status=applied" +SRC_URI_append_r1000 = " file://hciattach.sh" +SRC_URI_append_ghi270 = " file://hciattach.sh" # Almost all serial CF cards w/ manfid 0x0000,0x0000 seem to use the bcs protocol # Let's default to that instead of 'any' until further notice... @@ -43,6 +45,16 @@ do_install_append() { install -m 0755 ${S}/daemon/.libs/passkey-agent ${D}${base_bindir}/ } +do_install_append_r1000() { + install -d ${D}${sysconfdir} ${D}${sysconfdir}/bluetooth + install -m 0755 ${WORKDIR}/hciattach.sh ${D}${sysconfdir}/bluetooth/hciattach +} + +do_install_append_ghi270() { + install -d ${D}${sysconfdir} ${D}${sysconfdir}/bluetooth + install -m 0755 ${WORKDIR}/hciattach.sh ${D}${sysconfdir}/bluetooth/hciattach +} + CONFFILES_${PN} = "${sysconfdir}/bluetooth/hcid.conf ${sysconfdir}/bluetooth/rfcomm.conf \ ${sysconfdir}/default/bluetooth" diff --git a/packages/opie-usermanager/.mtn2git_empty b/packages/bluez/files/ghi270/.mtn2git_empty index e69de29bb2..e69de29bb2 100644 --- a/packages/opie-usermanager/.mtn2git_empty +++ b/packages/bluez/files/ghi270/.mtn2git_empty diff --git a/packages/bluez/files/r1000/.mtn2git_empty b/packages/bluez/files/r1000/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/bluez/files/r1000/.mtn2git_empty diff --git a/packages/busybox/busybox-1.7.2/angstrom/defconfig b/packages/busybox/busybox-1.7.2/angstrom/defconfig index eb0b8d7c64..19cfafab2c 100644 --- a/packages/busybox/busybox-1.7.2/angstrom/defconfig +++ b/packages/busybox/busybox-1.7.2/angstrom/defconfig @@ -1,7 +1,9 @@ # # Automatically generated make config: don't edit +# Busybox version: 1.7.2 +# Fri Oct 12 19:00:27 2007 # -HAVE_DOT_CONFIG=y +CONFIG_HAVE_DOT_CONFIG=y # # Busybox Settings @@ -11,22 +13,27 @@ HAVE_DOT_CONFIG=y # General Configuration # # CONFIG_NITPICK is not set +# CONFIG_DESKTOP is not set # CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set # CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set # CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set CONFIG_SHOW_USAGE=y # CONFIG_FEATURE_VERBOSE_USAGE is not set -# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_FEATURE_COMPRESS_USAGE=y # CONFIG_FEATURE_INSTALLER is not set CONFIG_LOCALE_SUPPORT=y CONFIG_GETOPT_LONG=y CONFIG_FEATURE_DEVPTS=y # CONFIG_FEATURE_CLEAN_UP is not set -# CONFIG_FEATURE_SUID is not set -# CONFIG_FEATURE_SUID_CONFIG is not set -# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +CONFIG_FEATURE_PIDFILE=y +CONFIG_FEATURE_SUID=y +CONFIG_FEATURE_SUID_CONFIG=y +CONFIG_FEATURE_SUID_CONFIG_QUIET=y # CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +CONFIG_FEATURE_HAVE_RPC=y # # Build Options @@ -36,19 +43,17 @@ CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" # CONFIG_FEATURE_FULL_LIBBUSYBOX is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set CONFIG_LFS=y -USING_CROSS_COMPILER=y -CROSS_COMPILER_PREFIX="arm-angstrom-linux-gnueabi-" CONFIG_BUILD_AT_ONCE=y # # Debugging Options # # CONFIG_DEBUG is not set -# CONFIG_DEBUG_PESSIMIZE is not set -# CONFIG_NO_DEBUG_LIB is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y # CONFIG_DMALLOC is not set # CONFIG_EFENCE is not set -CONFIG_DEBUG_YANK_SUSv2=y +# CONFIG_INCLUDE_SUSv2 is not set # # Installation Options @@ -57,12 +62,26 @@ CONFIG_DEBUG_YANK_SUSv2=y CONFIG_INSTALL_APPLET_SYMLINKS=y # CONFIG_INSTALL_APPLET_HARDLINKS is not set # CONFIG_INSTALL_APPLET_DONT is not set -PREFIX="./_install" +CONFIG_PREFIX="./_install" # # Busybox Library Tuning # +CONFIG_PASSWORD_MINLEN=6 CONFIG_MD5_SIZE_VS_SPEED=2 +CONFIG_FEATURE_FAST_TOP=y +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +# CONFIG_FEATURE_EDITING_FANCY_KEYS is not set +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=15 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +CONFIG_FEATURE_TAB_COMPLETION=y +CONFIG_FEATURE_USERNAME_COMPLETION=y +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y # # Applets @@ -83,6 +102,7 @@ CONFIG_GUNZIP=y CONFIG_GZIP=y # CONFIG_RPM2CPIO is not set # CONFIG_RPM is not set +# CONFIG_FEATURE_RPM_BZ2 is not set CONFIG_TAR=y CONFIG_FEATURE_TAR_CREATE=y CONFIG_FEATURE_TAR_BZIP2=y @@ -91,6 +111,7 @@ CONFIG_FEATURE_TAR_FROM=y CONFIG_FEATURE_TAR_GZIP=y # CONFIG_FEATURE_TAR_COMPRESS is not set # CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y # CONFIG_FEATURE_TAR_LONG_OPTIONS is not set # CONFIG_UNCOMPRESS is not set @@ -118,7 +139,6 @@ CONFIG_CHMOD=y CONFIG_CHOWN=y CONFIG_CHROOT=y # CONFIG_CKSUM is not set -# CONFIG_CMP is not set # CONFIG_COMM is not set CONFIG_CP=y CONFIG_CUT=y @@ -128,10 +148,6 @@ CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y # CONFIG_FEATURE_DD_IBS_OBS is not set CONFIG_DF=y -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_BINARY=y -CONFIG_FEATURE_DIFF_DIR=y -# CONFIG_FEATURE_DIFF_MINIMAL is not set CONFIG_DIRNAME=y # CONFIG_DOS2UNIX is not set # CONFIG_UNIX2DOS is not set @@ -141,6 +157,8 @@ CONFIG_ECHO=y CONFIG_FEATURE_FANCY_ECHO=y CONFIG_ENV=y CONFIG_FEATURE_ENV_LONG_OPTIONS=y +# CONFIG_EXPAND is not set +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set CONFIG_EXPR=y # CONFIG_EXPR_MATH_SUPPORT_64 is not set CONFIG_FALSE=y @@ -176,6 +194,8 @@ CONFIG_OD=y # CONFIG_PRINTENV is not set CONFIG_PRINTF=y CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_REALPATH=y CONFIG_RM=y CONFIG_RMDIR=y @@ -185,6 +205,8 @@ CONFIG_SLEEP=y CONFIG_FEATURE_FANCY_SLEEP=y CONFIG_SORT=y CONFIG_FEATURE_SORT_BIG=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set # CONFIG_STAT is not set # CONFIG_FEATURE_STAT_FORMAT is not set CONFIG_STTY=y @@ -203,12 +225,14 @@ CONFIG_FEATURE_TR_CLASSES=y CONFIG_TRUE=y CONFIG_TTY=y CONFIG_UNAME=y +# CONFIG_UNEXPAND is not set +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set CONFIG_UNIQ=y CONFIG_USLEEP=y # CONFIG_UUDECODE is not set # CONFIG_UUENCODE is not set -CONFIG_WATCH=y CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set CONFIG_WHO=y CONFIG_WHOAMI=y CONFIG_YES=y @@ -244,6 +268,8 @@ CONFIG_LOADFONT=y CONFIG_LOADKMAP=y CONFIG_OPENVT=y CONFIG_RESET=y +# CONFIG_RESIZE is not set +# CONFIG_FEATURE_RESIZE_PRINT is not set CONFIG_SETCONSOLE=y # CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set # CONFIG_SETKEYCODES is not set @@ -254,10 +280,9 @@ CONFIG_SETCONSOLE=y # CONFIG_MKTEMP=y # CONFIG_PIPE_PROGRESS is not set -CONFIG_READLINK=y -CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_RUN_PARTS=y # CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set CONFIG_START_STOP_DAEMON=y CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y @@ -268,10 +293,16 @@ CONFIG_WHICH=y # CONFIG_AWK=y CONFIG_FEATURE_AWK_MATH=y +# CONFIG_CMP is not set +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_BINARY=y +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_FEATURE_DIFF_MINIMAL is not set # CONFIG_ED is not set CONFIG_PATCH=y CONFIG_SED=y CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=1024 CONFIG_FEATURE_VI_COLON=y CONFIG_FEATURE_VI_YANKMARK=y CONFIG_FEATURE_VI_SEARCH=y @@ -282,6 +313,7 @@ CONFIG_FEATURE_VI_USE_SIGNALS=y # CONFIG_FEATURE_VI_SET is not set CONFIG_FEATURE_VI_WIN_RESIZE=y CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y +CONFIG_FEATURE_ALLOW_EXEC=y # # Finding Utilities @@ -293,9 +325,21 @@ CONFIG_FEATURE_FIND_MMIN=y CONFIG_FEATURE_FIND_PERM=y CONFIG_FEATURE_FIND_TYPE=y CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y CONFIG_FEATURE_FIND_NEWER=y # CONFIG_FEATURE_FIND_INUM is not set CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set CONFIG_GREP=y CONFIG_FEATURE_GREP_EGREP_ALIAS=y CONFIG_FEATURE_GREP_FGREP_ALIAS=y @@ -313,6 +357,7 @@ CONFIG_XARGS=y # CONFIG_DEBUG_INIT is not set # CONFIG_FEATURE_USE_INITTAB is not set # CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set # CONFIG_FEATURE_EXTRA_QUIET is not set # CONFIG_FEATURE_INIT_COREDUMPS is not set # CONFIG_FEATURE_INITRD is not set @@ -326,16 +371,26 @@ CONFIG_XARGS=y # CONFIG_USE_BB_SHADOW is not set # CONFIG_USE_BB_PWD_GRP is not set # CONFIG_ADDGROUP is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set # CONFIG_DELGROUP is not set +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set # CONFIG_ADDUSER is not set # CONFIG_DELUSER is not set # CONFIG_GETTY is not set CONFIG_FEATURE_UTMP=y # CONFIG_FEATURE_WTMP is not set # CONFIG_LOGIN is not set +# CONFIG_PAM is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set # CONFIG_FEATURE_SECURETTY is not set # CONFIG_PASSWD is not set +# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set +# CONFIG_CRYPTPW is not set +# CONFIG_CHPASSWD is not set # CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set # CONFIG_SULOGIN is not set # CONFIG_VLOCK is not set @@ -343,13 +398,8 @@ CONFIG_FEATURE_UTMP=y # Linux Ext2 FS Progs # CONFIG_CHATTR=y -CONFIG_E2FSCK=y CONFIG_FSCK=y # CONFIG_LSATTR is not set -CONFIG_MKE2FS=y -# CONFIG_TUNE2FS is not set -# CONFIG_E2LABEL is not set -# CONFIG_FINDFS is not set # # Linux Module Utilities @@ -365,6 +415,7 @@ CONFIG_LSMOD=y # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set CONFIG_MODPROBE=y CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS=y +CONFIG_FEATURE_MODPROBE_FANCY_ALIAS=y # # Options common to multiple modutils @@ -378,13 +429,14 @@ CONFIG_FEATURE_2_6_MODULES=y # Linux System Utilities # CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y CONFIG_FBSET=y CONFIG_FEATURE_FBSET_FANCY=y CONFIG_FEATURE_FBSET_READMODE=y # CONFIG_FDFLUSH is not set # CONFIG_FDFORMAT is not set CONFIG_FDISK=y -FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y CONFIG_FEATURE_FDISK_WRITABLE=y # CONFIG_FEATURE_AIX_LABEL is not set # CONFIG_FEATURE_SGI_LABEL is not set @@ -410,12 +462,16 @@ CONFIG_LOSETUP=y # CONFIG_MDEV is not set # CONFIG_FEATURE_MDEV_CONF is not set # CONFIG_FEATURE_MDEV_EXEC is not set +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set CONFIG_MKSWAP=y # CONFIG_FEATURE_MKSWAP_V0 is not set CONFIG_MORE=y CONFIG_FEATURE_USE_TERMIOS=y CONFIG_MOUNT=y CONFIG_FEATURE_MOUNT_NFS=y +# CONFIG_FEATURE_MOUNT_CIFS is not set +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y CONFIG_PIVOT_ROOT=y CONFIG_RDATE=y # CONFIG_READPROFILE is not set @@ -436,6 +492,7 @@ CONFIG_FEATURE_MOUNT_LOOP=y # # CONFIG_ADJTIMEX is not set # CONFIG_BBCONFIG is not set +# CONFIG_CHRT is not set # CONFIG_CROND is not set # CONFIG_DEBUG_CROND_OPTION is not set # CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set @@ -449,6 +506,7 @@ CONFIG_DC=y # CONFIG_EJECT is not set # CONFIG_LAST is not set CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y # CONFIG_FEATURE_LESS_FLAGCS is not set @@ -466,18 +524,24 @@ CONFIG_FEATURE_LESS_FLAGS=y # CONFIG_FEATURE_MAKEDEVS_TABLE is not set # CONFIG_MOUNTPOINT is not set # CONFIG_MT is not set +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set # CONFIG_RUNLEVEL is not set # CONFIG_RX is not set CONFIG_STRINGS=y # CONFIG_SETSID is not set # CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set CONFIG_TIME=y +# CONFIG_TTYSIZE is not set # CONFIG_WATCHDOG is not set # # Networking Utilities # CONFIG_FEATURE_IPV6=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_ARP is not set # CONFIG_ARPING is not set # CONFIG_DNSD is not set # CONFIG_ETHER_WAKE is not set @@ -487,7 +551,7 @@ CONFIG_FEATURE_IPV6=y # CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set CONFIG_HOSTNAME=y # CONFIG_HTTPD is not set -# CONFIG_FEATURE_HTTPD_WITHOUT_INETD is not set +# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set # CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set # CONFIG_FEATURE_HTTPD_SETUID is not set # CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set @@ -497,6 +561,7 @@ CONFIG_HOSTNAME=y # CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set # CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set # CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set CONFIG_IFCONFIG=y CONFIG_FEATURE_IFCONFIG_STATUS=y # CONFIG_FEATURE_IFCONFIG_SLIP is not set @@ -504,12 +569,14 @@ CONFIG_FEATURE_IFCONFIG_STATUS=y CONFIG_FEATURE_IFCONFIG_HW=y # CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" # CONFIG_FEATURE_IFUPDOWN_IP is not set -CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN=y CONFIG_FEATURE_IFUPDOWN_IPV4=y CONFIG_FEATURE_IFUPDOWN_IPV6=y -# CONFIG_FEATURE_IFUPDOWN_IPX is not set CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set # CONFIG_INETD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set @@ -522,29 +589,34 @@ CONFIG_FEATURE_IP_ADDRESS=y CONFIG_FEATURE_IP_LINK=y CONFIG_FEATURE_IP_ROUTE=y CONFIG_FEATURE_IP_TUNNEL=y +# CONFIG_FEATURE_IP_RULE is not set # CONFIG_FEATURE_IP_SHORT_FORMS is not set # CONFIG_IPADDR is not set # CONFIG_IPLINK is not set # CONFIG_IPROUTE is not set # CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set # CONFIG_IPCALC is not set # CONFIG_FEATURE_IPCALC_FANCY is not set # CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set # CONFIG_NAMEIF is not set CONFIG_NC=y -# CONFIG_NC_GAPING_SECURITY_HOLE is not set +# CONFIG_NC_SERVER is not set +# CONFIG_NC_EXTRA is not set CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set CONFIG_NSLOOKUP=y CONFIG_PING=y -CONFIG_FEATURE_FANCY_PING=y CONFIG_PING6=y -CONFIG_FEATURE_FANCY_PING6=y +# CONFIG_PSCAN is not set +CONFIG_FEATURE_FANCY_PING=y CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set CONFIG_TELNET=y # CONFIG_FEATURE_TELNET_TTYPE is not set CONFIG_FEATURE_TELNET_AUTOLOGIN=y # CONFIG_TELNETD is not set -# CONFIG_FEATURE_TELNETD_INETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set CONFIG_TFTP=y CONFIG_FEATURE_TFTP_GET=y CONFIG_FEATURE_TFTP_PUT=y @@ -554,20 +626,17 @@ CONFIG_TRACEROUTE=y # CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set # CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set # CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set - -# -# udhcp Server/Client -# CONFIG_APP_UDHCPD=y -CONFIG_APP_UDHCPC=y +# CONFIG_APP_DHCPRELAY is not set CONFIG_APP_DUMPLEASES=y -CONFIG_FEATURE_UDHCP_SYSLOG=y +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_APP_UDHCPC=y # CONFIG_FEATURE_UDHCP_DEBUG is not set +# CONFIG_FEATURE_RFC3397 is not set # CONFIG_VCONFIG is not set CONFIG_WGET=y CONFIG_FEATURE_WGET_STATUSBAR=y CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_IP6_LITERAL=y CONFIG_FEATURE_WGET_LONG_OPTIONS=y # CONFIG_ZCIP is not set @@ -578,6 +647,8 @@ CONFIG_FREE=y CONFIG_FUSER=y CONFIG_KILL=y CONFIG_KILLALL=y +# CONFIG_KILLALL5 is not set +# CONFIG_NMETER is not set CONFIG_PIDOF=y # CONFIG_FEATURE_PIDOF_SINGLE is not set # CONFIG_FEATURE_PIDOF_OMIT is not set @@ -587,7 +658,10 @@ CONFIG_RENICE=y CONFIG_BB_SYSCTL=y CONFIG_TOP=y CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_DECIMALS is not set CONFIG_UPTIME=y +CONFIG_WATCH=y # # Shells @@ -617,6 +691,12 @@ CONFIG_ASH_OPTIMIZE_FOR_SIZE=y # CONFIG_ASH_RANDOM_SUPPORT is not set CONFIG_ASH_EXPAND_PRMT=y # CONFIG_HUSH is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set # CONFIG_LASH is not set # CONFIG_MSH is not set @@ -624,14 +704,8 @@ CONFIG_ASH_EXPAND_PRMT=y # Bourne Shell Options # CONFIG_FEATURE_SH_EXTRA_QUIET=y -# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set -CONFIG_FEATURE_COMMAND_EDITING=y -# CONFIG_FEATURE_COMMAND_EDITING_VI is not set -CONFIG_FEATURE_COMMAND_HISTORY=63 -# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set -CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y -# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set -CONFIG_FEATURE_SH_FANCY_PROMPT=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_CTTYHACK is not set # # System Logging Utilities @@ -645,3 +719,35 @@ CONFIG_LOGREAD=y CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y CONFIG_KLOGD=y CONFIG_LOGGER=y + +# +# Runit Utilities +# +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_SV is not set +# CONFIG_SVLOGD is not set +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set + +# +# ipsvd utilities +# +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set diff --git a/packages/busybox/busybox_1.7.2.bb b/packages/busybox/busybox_1.7.2.bb index 24e1b61df6..0963e9bb9d 100644 --- a/packages/busybox/busybox_1.7.2.bb +++ b/packages/busybox/busybox_1.7.2.bb @@ -1,6 +1,6 @@ require busybox.inc -PR = "r0" +PR = "r1" DEFAULT_PREFERENCE = "-1" diff --git a/packages/dfu-util/dfu-util-native_svn.bb b/packages/dfu-util/dfu-util-native_svn.bb index 9bfe4bae2c..457094df9e 100644 --- a/packages/dfu-util/dfu-util-native_svn.bb +++ b/packages/dfu-util/dfu-util-native_svn.bb @@ -2,7 +2,7 @@ require dfu-util_${PV}.bb inherit native -DEPENDS = "libusb-native" +DEPENDS = "libusb-native usbpath-native" do_stage() { install -d ${STAGING_BINDIR_NATIVE} diff --git a/packages/dfu-util/dfu-util_svn.bb b/packages/dfu-util/dfu-util_svn.bb index 9be5b92979..1f34a5bc24 100644 --- a/packages/dfu-util/dfu-util_svn.bb +++ b/packages/dfu-util/dfu-util_svn.bb @@ -5,7 +5,7 @@ LICENSE = "GPL" PV = "0.1+svnr${SRCREV}" PR = "r0" -DEPENDS = "libusb" +DEPENDS = "libusb usbpath" SRC_URI = "svn://svn.openmoko.org/trunk/src/host/;module=dfu-util;proto=http" S = "${WORKDIR}/dfu-util" diff --git a/packages/directfb/directfb_1.1.0.bb b/packages/directfb/directfb_1.1.0.bb index bbda02e900..84772b6a25 100644 --- a/packages/directfb/directfb_1.1.0.bb +++ b/packages/directfb/directfb_1.1.0.bb @@ -7,7 +7,7 @@ SECTION = "libs" LICENSE = "LGPL" HOMEPAGE = "http://directfb.org" DEPENDS = "jpeg libpng freetype zlib tslib" -PR = "r0" +PR = "r1" RV = "1.1-0" SRC_URI = "http://www.directfb.org/download/DirectFB/DirectFB-${PV}.tar.gz \ @@ -27,6 +27,7 @@ EXTRA_OECONF = "--with-gfxdrivers=none \ --enable-libmpeg3=no \ --enable-freetype=yes \ --enable-sdl=no \ + --enable-vnc=no \ --disable-x11 \ " @@ -38,6 +39,13 @@ do_install() { oe_runmake 'DESTDIR=${D}' install } +PACKAGES_DYNAMIC = "directfb-inputdrivers-*" + +#python populate_packages_prepend () { +# import os.path +# inputdrivers_libdir = bb.data.expand('${libdir}/directfb-${RV}/inputdrivers', d) +# do_split_packages(d, inputdrivers_libdir, '*.so$', 'directfb-inputdrivers-%s', 'Directfb plugin for %s') +#} FILES_directfb-dbg_append = " ${libdir}/directfb-${RV}/*/*/.debug/*.so \ ${libdir}/directfb-${RV}/*/.debug/*.so \ " @@ -50,8 +58,8 @@ FILES_directfb-dev_append = " ${libdir}/directfb-${RV}/systems/*.la \ FILES_directfb_append = " ${libdir}/directfb-${RV}/systems/*.so \ - ${libdir}/directfb-${RV}/inputdrivers/*.so \ - ${libdir}/directfb-${RV}/interfaces/*/*.so \ + # ${libdir}/directfb-${RV}/inputdrivers/*.so \ + # ${libdir}/directfb-${RV}/interfaces/*/*.so \ ${libdir}/directfb-${RV}/wm/*.so \ ${datadir}/directfb-1.1.0 \ " diff --git a/packages/glibc/glibc_2.3.3+cvs20050221.bb b/packages/glibc/glibc_2.3.3+cvs20050221.bb index 577e480a45..1bb949665d 100644 --- a/packages/glibc/glibc_2.3.3+cvs20050221.bb +++ b/packages/glibc/glibc_2.3.3+cvs20050221.bb @@ -22,7 +22,7 @@ SRC_URI = "cvs://anoncvs@sources.redhat.com/cvs/glibc;module=libc;date=${@bb.dat file://arm-longlong.patch;patch=1;pnum=0 \ file://arm-machine-gmon.patch;patch=1;pnum=0 \ file://trampoline.patch;patch=1;pnum=0 \ - file://dl-cache-libcmp.patch;patch=1;pnum=0 \ + file://dl-cache-libcmp.patch;patch=1 \ \ file://etc/ld.so.conf \ file://generate-supported.mk" diff --git a/packages/gpe-conf/gpe-conf_0.2.6.bb b/packages/gpe-conf/gpe-conf_0.2.6.bb index 1256ce5291..b56b780210 100644 --- a/packages/gpe-conf/gpe-conf_0.2.6.bb +++ b/packages/gpe-conf/gpe-conf_0.2.6.bb @@ -4,13 +4,13 @@ PRIORITY = "optional" LICENSE = "GPL" DEPENDS = "gtk+ esound audiofile libgpewidget libxsettings libxsettings-client libxrandr" -RDEPENDS_${PN} = "xst xset ntpdate gpe-login gpe-icons tzdata xrandr" +RDEPENDS_${PN} = "xst gpe-confd xset ntpdate gpe-icons tzdata xrandr" RDEPENDS_gpe-conf-panel = "gpe-conf" RPROVIDES_${PN} += " bl" RCONFLICTS_${PN} = "bl" -PR = "r0" +PR = "r1" GPE_TARBALL_SUFFIX = "bz2" diff --git a/packages/gsm/libgsmd_svn.bb b/packages/gsm/libgsmd_svn.bb index 9aaad58ee6..e07b4acfa9 100644 --- a/packages/gsm/libgsmd_svn.bb +++ b/packages/gsm/libgsmd_svn.bb @@ -7,15 +7,15 @@ PV = "0.1+svnr${SRCREV}" PR = "r31" SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \ - file://024_sms-text-in-bracket.patch;patch=1;minrev=2957 \ - file://025_sms-status-report.patch;patch=1;minrev=2957 \ - file://027_phonebook-find-and-read-range-support.patch;patch=1;minrev=2957 \ - file://028_shell-phonebook-find-and-read-range-support.patch;patch=1;minrev=2957 \ + file://024_sms-text-in-bracket.patch;patch=1;minrev=2957;maxrev=3199 \ + file://025_sms-status-report.patch;patch=1;minrev=2957;maxrev=3200 \ + file://027_phonebook-find-and-read-range-support.patch;patch=1;minrev=2957;maxrev=3202 \ + file://028_shell-phonebook-find-and-read-range-support.patch;patch=1;minrev=2957;maxrev=3203 \ file://0001-Introduce-ports.patch;patch=1;minrev=2957 \ file://0002-Flush-all-pending-commands-before-restarting-the-mod.patch;patch=1;minrev=2957 \ file://0003-Correctly-segment-incoming-usock-data-into-packets.patch;patch=1;minrev=2957 \ file://0004-Handle-read-and-write-return-values.patch;patch=1;minrev=2957 \ - file://0005-Add-ask-ds-option-forSMS.patch;patch=1;minrev=2957 \ + file://0005-Add-ask-ds-option-forSMS.patch;patch=1;minrev=2957;maxrev=3201 \ file://lgsm_send_fix_return_value.patch;patch=1 \ file://gsmd \ file://default" diff --git a/packages/gstreamer/gst-plugins-ugly/gstmad_16bit.patch b/packages/gstreamer/gst-plugins-ugly/gstmad_16bit.patch new file mode 100644 index 0000000000..1d1eb83484 --- /dev/null +++ b/packages/gstreamer/gst-plugins-ugly/gstmad_16bit.patch @@ -0,0 +1,109 @@ +--- gst-plugins-ugly-0.10.6/ext/mad/gstmad.c.orig 2007-06-13 11:21:25.000000000 +0200 ++++ gst-plugins-ugly-0.10.6/ext/mad/gstmad.c 2007-09-16 22:45:04.000000000 +0200 +@@ -119,8 +119,8 @@ + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "signed = (boolean) true, " +- "width = (int) 32, " +- "depth = (int) 32, " ++ "width = (int) 16, " ++ "depth = (int) 16, " + "rate = (int) { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 }, " + "channels = (int) [ 1, 2 ]") + ); +@@ -458,7 +458,7 @@ + + mad = GST_MAD (GST_PAD_PARENT (pad)); + +- bytes_per_sample = MAD_NCHANNELS (&mad->frame.header) * 4; ++ bytes_per_sample = MAD_NCHANNELS (&mad->frame.header) << 1; + + switch (src_format) { + case GST_FORMAT_BYTES: +@@ -870,13 +870,11 @@ + return res; + } + +-static inline gint32 ++static inline gint16 + scale (mad_fixed_t sample) + { +-#if MAD_F_FRACBITS < 28 + /* round */ +- sample += (1L << (28 - MAD_F_FRACBITS - 1)); +-#endif ++ sample += (1L << (MAD_F_FRACBITS - 16)); + + /* clip */ + if (sample >= MAD_F_ONE) +@@ -884,13 +882,8 @@ + else if (sample < -MAD_F_ONE) + sample = -MAD_F_ONE; + +-#if MAD_F_FRACBITS < 28 + /* quantize */ +- sample >>= (28 - MAD_F_FRACBITS); +-#endif +- +- /* convert from 29 bits to 32 bits */ +- return (gint32) (sample << 3); ++ return sample >> (MAD_F_FRACBITS + 1 - 16); + } + + /* do we need this function? */ +@@ -1277,8 +1270,8 @@ + caps = gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, +- "width", G_TYPE_INT, 32, +- "depth", G_TYPE_INT, 32, ++ "width", G_TYPE_INT, 16, ++ "depth", G_TYPE_INT, 16, + "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, nchannels, NULL); + + gst_pad_set_caps (mad->srcpad, caps); +@@ -1576,7 +1569,7 @@ + to skip and send the remaining pcm samples */ + + GstBuffer *outbuffer = NULL; +- gint32 *outdata; ++ gint16 *outdata; + mad_fixed_t const *left_ch, *right_ch; + + if (mad->need_newsegment) { +@@ -1594,7 +1587,7 @@ + /* will attach the caps to the buffer */ + result = + gst_pad_alloc_buffer_and_set_caps (mad->srcpad, 0, +- nsamples * mad->channels * 4, GST_PAD_CAPS (mad->srcpad), ++ nsamples * mad->channels * 2, GST_PAD_CAPS (mad->srcpad), + &outbuffer); + if (result != GST_FLOW_OK) { + /* Head for the exit, dropping samples as we go */ +@@ -1607,7 +1600,7 @@ + left_ch = mad->synth.pcm.samples[0]; + right_ch = mad->synth.pcm.samples[1]; + +- outdata = (gint32 *) GST_BUFFER_DATA (outbuffer); ++ outdata = (gint16 *) GST_BUFFER_DATA (outbuffer); + + GST_DEBUG ("mad out timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (time_offset)); +@@ -1621,14 +1614,14 @@ + gint count = nsamples; + + while (count--) { +- *outdata++ = scale (*left_ch++) & 0xffffffff; ++ *outdata++ = scale (*left_ch++) & 0xffff; + } + } else { + gint count = nsamples; + + while (count--) { +- *outdata++ = scale (*left_ch++) & 0xffffffff; +- *outdata++ = scale (*right_ch++) & 0xffffffff; ++ *outdata++ = scale (*left_ch++) & 0xffff; ++ *outdata++ = scale (*right_ch++) & 0xffff; + } + } + diff --git a/packages/gstreamer/gst-plugins-ugly_0.10.6.bb b/packages/gstreamer/gst-plugins-ugly_0.10.6.bb index 4caf56e522..9eb6410d09 100644 --- a/packages/gstreamer/gst-plugins-ugly_0.10.6.bb +++ b/packages/gstreamer/gst-plugins-ugly_0.10.6.bb @@ -1,6 +1,7 @@ require gst-plugins.inc DEPENDS += "gst-plugins-base" -SRC_URI += "file://cross-compile.patch;patch=1" +SRC_URI += "file://cross-compile.patch;patch=1 \ + file://gstmad_16bit.patch;patch=1" -PR = "r0" +PR = "r1" diff --git a/packages/gstreamer/gst-plugins.inc b/packages/gstreamer/gst-plugins.inc index 48f33ff539..8e8fd0f1ca 100644 --- a/packages/gstreamer/gst-plugins.inc +++ b/packages/gstreamer/gst-plugins.inc @@ -6,7 +6,7 @@ PACKAGES_DYNAMIC = "gst-plugin-*" SRC_URI = "http://gstreamer.freedesktop.org/src/${PN}/${PN}-${PV}.tar.bz2" -EXTRA_OECONF = "--disable-aalib --disable-shout2 --disable-sdl -disable-cdaudio --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} " +EXTRA_OECONF = "--disable-aalib --disable-shout2 --disable-sdl --disable-cdaudio --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} " acpaths = "-I ${S}/common/m4 -I ${S}/m4" diff --git a/packages/gtk+/gtk+-fastscaling_2.10.14.bb b/packages/gtk+/gtk+-fastscaling_2.10.14.bb new file mode 100644 index 0000000000..09c78662d9 --- /dev/null +++ b/packages/gtk+/gtk+-fastscaling_2.10.14.bb @@ -0,0 +1,14 @@ +require gtk+_${PV}.bb + +FILESPATH_prepend = "${FILE_DIRNAME}/gtk+-${PV}:" + +DEFAULT_PREFERENCE = "-1" + +PROVIDES = "gtk+" +RPROVIDES_${PN} = "gtk+" +PR = "r0" + +SRC_URI += "file://lower-quality-scaling-in-pixbuf-engine.patch;patch=1" + +S = "${WORKDIR}/gtk+-${PV}" + diff --git a/packages/gtk+/gtk+_2.10.14.bb b/packages/gtk+/gtk+_2.10.14.bb index ef783b01f0..3efe492d34 100644 --- a/packages/gtk+/gtk+_2.10.14.bb +++ b/packages/gtk+/gtk+_2.10.14.bb @@ -30,12 +30,3 @@ SRC_URI = "ftp://ftp.gtk.org/pub/gtk/v2.10/gtk+-${PV}.tar.bz2 \ require gtk-fpu.inc EXTRA_OECONF += "${@get_gtk_fpu_setting(bb, d)}" -# try to squeeze some more performance out of it -SRC_URI_append_fic-gta01 = " file://lower-quality-scaling-in-pixbuf-engine.patch;patch=1" -SRC_URI_append_fic-gta02 = " file://lower-quality-scaling-in-pixbuf-engine.patch;patch=1" - -# this doesn't seem to work -SRC_URI_OVERRIDES_PACKAGE_ARCH = "1" -# let's do it manually then -PACKAGE_ARCH_fic-gta01 = "fic-gta01" -PACKAGE_ARCH_fic-gta02 = "fic-gta02" diff --git a/packages/gtk-sharp/gtk-sharp_2.10.2.bb b/packages/gtk-sharp/gtk-sharp_2.10.2.bb index 87865b7aed..ddb209e15c 100644 --- a/packages/gtk-sharp/gtk-sharp_2.10.2.bb +++ b/packages/gtk-sharp/gtk-sharp_2.10.2.bb @@ -1,9 +1,9 @@ PV = "2.10.2" -PR = "r0" +PR = "r1" SDIRVER = "210" SEXT = "bz2" -inherit mono +inherit mono pkgconfig require gtk-sharp.inc FILES_libgtk2.0-cil = "/usr/lib/libgtksharpglue-2.so \ diff --git a/packages/gtk-webcore/midori_0.0.10.bb b/packages/gtk-webcore/midori_0.0.10.bb new file mode 100644 index 0000000000..23d0179375 --- /dev/null +++ b/packages/gtk-webcore/midori_0.0.10.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "Midori is a lightweight web browser." +LICENSE = "GPLv2" + +DEPENDS = "webkit-gtk libsexy" + +inherit autotools pkgconfig + +SRC_URI = "http://software.twotoasts.de/media/midori/midori-${PV}.tar.gz \ + " + + diff --git a/packages/gutenprint/.mtn2git_empty b/packages/gutenprint/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/gutenprint/.mtn2git_empty diff --git a/packages/gutenprint/gutenprint-native_5.1.3.bb b/packages/gutenprint/gutenprint-native_5.1.3.bb new file mode 100644 index 0000000000..4fe56d6c59 --- /dev/null +++ b/packages/gutenprint/gutenprint-native_5.1.3.bb @@ -0,0 +1,39 @@ +SECTION = "libs" +require gutenprint_${PV}.bb +DEPENDS = "" +inherit native + +EXTRA_OECONF = "\ + --disable-nls \ + --disable-gtktest \ + --enable-cups-ppds \ + --disable-libgutenprintui \ + --disable-libgutenprintui2 \ + --disable-translated-cups-ppds \ + --with-ghostscript \ + --enable-cups-level3-ppds \ + --disable-gimptest \ + --enable-test \ + --enable-epson \ + --with-user-guide \ + --with-samples \ + --with-escputil \ + " + +do_configure() { + gnu-configize + libtoolize --force + oe_runconf +} + + + + +do_stage() { + autotools_stage_includes + install -m 0755 -d ${STAGING_DATADIR}/cups/model + install -m 0644 src/cups/ppd/C/*ppd* ${STAGING_DATADIR}/cups/model/ +# oe_libinstall -so -a -C objs libfreetype ${STAGING_LIBDIR} +} + + diff --git a/packages/gutenprint/gutenprint.inc b/packages/gutenprint/gutenprint.inc new file mode 100644 index 0000000000..961613036a --- /dev/null +++ b/packages/gutenprint/gutenprint.inc @@ -0,0 +1,28 @@ +DESCRIPTION = "Gutenprint printer drivers" +HOMEPAGE = "http://gimp-print.sourceforge.net/" +LICENSE = "GPL" + +DEPENDS = "glib-2.0 cups tiff jpeg libpng gutenprint-native espgs" + + +inherit autotools pkgconfig +PARALLEL_MAKE="" + +#EXTRA_OECONF = "\ +# --disable-nls \ +# --disable-gtktest \ +# --enable-cups-ppds \ +# --disable-libgutenprintui \ +# --disable-libgutenprintui2 \ +# --disable-translated-cups-ppds \ +# --with-ghostscript \ +# --enable-cups-level3-ppds \ +# --disable-gimptest \ +# --enable-test \ +# --enable-epson \ +# --with-user-guide \ +# --with-samples \ +# --with-escputil \ +# " + + diff --git a/packages/gutenprint/gutenprint_5.1.3.bb b/packages/gutenprint/gutenprint_5.1.3.bb new file mode 100644 index 0000000000..8886323da5 --- /dev/null +++ b/packages/gutenprint/gutenprint_5.1.3.bb @@ -0,0 +1,48 @@ +require gutenprint.inc + +PR = "r1" + +DEPENDS = "glib-2.0 ijs ncurses cups tiff jpeg libpng gutenprint-native espgs" + +SRC_URI = "${SOURCEFORGE_MIRROR}/gimp-print/gutenprint-5.1.3.tar.bz2" +S = "${WORKDIR}/gutenprint-${PV}" + + +EXTRA_OECONF = "\ + --disable-nls \ + --disable-gtktest \ +# --enable-cups-ppds \ +# this option is disabled here, since the ppds are generated during native build + --disable-libgutenprintui \ + --disable-libgutenprintui2 \ + --disable-translated-cups-ppds \ +# --with-ghostscript \ +# i MAY have to disable this one as well, since these are probably built in native as well + --enable-cups-level3-ppds \ + --disable-gimptest \ + --enable-test \ + --enable-epson \ + --with-user-guide \ + --with-samples \ + --with-escputil \ + " + +do_configure() { + gnu-configize + libtoolize --force + oe_runconf +} + + +do_install_append() { + install -d ${D}${datadir}/cups/model/ + install -m 644 ${STAGING_DIR}/${BUILD_SYS}/share/cups/model/* ${D}${datadir}/cups/model/ + cp -pPr ${D}${STAGING_LIBDIR}/* ${D}${libdir}/ + cp -pPr ${D}${STAGING_DATADIR}/* ${D}${datadir}/ +} + + +FILES_${PN} += "${datadir}/cups/model ${libdir}/cups ${datadir}/cups/calibrate.ppm" +FILES_${PN}-dbg += "${libdir}/cups/*/.debug" + + diff --git a/packages/gutenprint/ijs_0.35.bb b/packages/gutenprint/ijs_0.35.bb new file mode 100644 index 0000000000..18407480c9 --- /dev/null +++ b/packages/gutenprint/ijs_0.35.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Inkjet driver from linuxprinting.org" +LICENSE = "MIT" +HOMEPAGE = "http://www.linuxprinting.org/ijs/" + +SRC_URI = "http://www.linuxprinting.org/ijs/download/ijs-${PV}.tar.bz2" + +inherit autotools pkgconfig binconfig lib_package + +EXTRA_OECONF = " --enable-shared " + +do_stage() { + autotools_stage_all +} + + diff --git a/packages/ipkg/ipkg-collateral.bb b/packages/ipkg/ipkg-collateral.bb index 244d29d08a..3fd55507e2 100644 --- a/packages/ipkg/ipkg-collateral.bb +++ b/packages/ipkg/ipkg-collateral.bb @@ -2,7 +2,6 @@ DESCRIPTION = "ipkg configuration files" SECTION = "base" LICENSE = "MIT" PR = "r7" -PACKAGE_ARCH = "${MACHINE_ARCH}" SRC_URI = " \ file://ipkg.conf.comments \ diff --git a/packages/libid3tag/libid3tag_0.15.0b.bb b/packages/libid3tag/libid3tag_0.15.1b.bb index 226a3cca5f..21f2c0f41d 100644 --- a/packages/libid3tag/libid3tag_0.15.0b.bb +++ b/packages/libid3tag/libid3tag_0.15.1b.bb @@ -3,9 +3,8 @@ PRIORITY = "optional" DEPENDS = "zlib" DESCRIPTION = "Library for interacting with ID3 tags." LICENSE = "GPL" -PR = "r2" -SRC_URI = "ftp://ftp.mars.org/pub/mpeg/libid3tag-${PV}.tar.gz " +SRC_URI = "${SOURCEFORGE_MIRROR}/mad/libid3tag-${PV}.tar.gz" S = "${WORKDIR}/libid3tag-${PV}" inherit autotools diff --git a/packages/libmad/libmad_0.15.1b.bb b/packages/libmad/libmad_0.15.1b.bb index 5393f822cf..9669cbd531 100644 --- a/packages/libmad/libmad_0.15.1b.bb +++ b/packages/libmad/libmad_0.15.1b.bb @@ -6,7 +6,7 @@ LICENSE = "GPL" PR = "r1" -SRC_URI = "ftp://ftp.mars.org/pub/mpeg/libmad-${PV}.tar.gz" +SRC_URI = "${SOURCEFORGE_MIRROR}/mad/libmad-${PV}.tar.gz" S = "${WORKDIR}/libmad-${PV}" SRC_URI_append_avr32 = " file://libmad-0.15.1b-avr32-optimization.patch;patch=1" diff --git a/packages/libqpe/libqpe-opie_cvs.bb b/packages/libqpe/libqpe-opie_cvs.bb index f206529480..10ad8d56ea 100644 --- a/packages/libqpe/libqpe-opie_cvs.bb +++ b/packages/libqpe/libqpe-opie_cvs.bb @@ -1,7 +1,6 @@ require ${PN}.inc -PV = "1.2.2+cvs${SRCDATE}" -PR = "r10" +PV = "1.2.3+cvs${SRCDATE}" SRC_URI = "${HANDHELDS_CVS};module=opie/library \ file://fix-titleheight.patch;patch=1 \ diff --git a/packages/linux-libc-headers/linux-libc-headers-2.6.23/.mtn2git_empty b/packages/linux-libc-headers/linux-libc-headers-2.6.23/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux-libc-headers/linux-libc-headers-2.6.23/.mtn2git_empty diff --git a/packages/linux-libc-headers/linux-libc-headers-2.6.23/procinfo.h b/packages/linux-libc-headers/linux-libc-headers-2.6.23/procinfo.h new file mode 100644 index 0000000000..8cdf828af8 --- /dev/null +++ b/packages/linux-libc-headers/linux-libc-headers-2.6.23/procinfo.h @@ -0,0 +1,24 @@ +/* + * linux/include/asm-arm/procinfo.h + * + * Copyright (C) 1996-1999 Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef __ASM_PROCINFO_H +#define __ASM_PROCINFO_H + +#define HWCAP_SWP 1 +#define HWCAP_HALF 2 +#define HWCAP_THUMB 4 +#define HWCAP_26BIT 8 /* Play it safe */ +#define HWCAP_FAST_MULT 16 +#define HWCAP_FPA 32 +#define HWCAP_VFP 64 +#define HWCAP_EDSP 128 +#define HWCAP_JAVA 256 +#define HWCAP_IWMMXT 512 +#define HWCAP_CRUNCH 1024 +#endif diff --git a/packages/linux-libc-headers/linux-libc-headers_2.6.23.bb b/packages/linux-libc-headers/linux-libc-headers_2.6.23.bb new file mode 100644 index 0000000000..43a5cb9ef1 --- /dev/null +++ b/packages/linux-libc-headers/linux-libc-headers_2.6.23.bb @@ -0,0 +1,66 @@ +require linux-libc-headers.inc + +INHIBIT_DEFAULT_DEPS = "1" +DEPENDS += "unifdef-native" +PR = "r0" + +SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \ + file://procinfo.h" + +S = "${WORKDIR}/linux-${PV}" + +set_arch() { + case ${TARGET_ARCH} in + alpha*) ARCH=alpha ;; + arm*) ARCH=arm ;; + cris*) ARCH=cris ;; + hppa*) ARCH=parisc ;; + i*86*) ARCH=i386 ;; + ia64*) ARCH=ia64 ;; + mips*) ARCH=mips ;; + m68k*) ARCH=m68k ;; + powerpc*) ARCH=powerpc ;; + s390*) ARCH=s390 ;; + sh*) ARCH=sh ;; + sparc64*) ARCH=sparc64 ;; + sparc*) ARCH=sparc ;; + x86_64*) ARCH=x86_64 ;; + avr32*) ARCH=avr32 ;; + bfin*) ARCH=blackfin ;; + esac +} + +do_configure() { + set_arch + oe_runmake allnoconfig ARCH=$ARCH +} + +do_compile () { +} + +do_install() { + set_arch + oe_runmake headers_install INSTALL_HDR_PATH=${D}/usr ARCH=$ARCH +} + +do_install_append_arm() { + cp ${WORKDIR}/procinfo.h ${D}${includedir}/asm/ +} + +STAGE_TEMP="${WORKDIR}/temp-staging" + +do_stage () { + set_arch + echo $ARCH + rm -rf ${STAGE_TEMP} + mkdir -p ${STAGE_TEMP} + oe_runmake headers_install INSTALL_HDR_PATH=${STAGE_TEMP}/usr ARCH=$ARCH + if [ "$ARCH" = "arm" ]; then + cp ${WORKDIR}/procinfo.h ${STAGE_TEMP}${includedir}/asm/ + fi + install -d ${STAGING_INCDIR} + rm -rf ${STAGING_INCDIR}/linux ${STAGING_INCDIR}/asm ${STAGING_INCDIR}/asm-generic + cp -pfLR ${STAGE_TEMP}${includedir}/linux ${STAGING_INCDIR}/ + cp -pfLR ${STAGE_TEMP}${includedir}/asm ${STAGING_INCDIR}/ + cp -pfLR ${STAGE_TEMP}${includedir}/asm-generic ${STAGING_INCDIR}/ +} diff --git a/packages/linux/em-x270-2.6.23/.mtn2git_empty b/packages/linux/em-x270-2.6.23/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/em-x270-2.6.23/.mtn2git_empty diff --git a/packages/linux/em-x270-2.6.23/defconfig b/packages/linux/em-x270-2.6.23/defconfig new file mode 100644 index 0000000000..3246136571 --- /dev/null +++ b/packages/linux/em-x270-2.6.23/defconfig @@ -0,0 +1,1354 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.23-rc9 +# Tue Oct 9 11:19:21 2007 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ZONE_DMA=y +CONFIG_ARCH_MTD_XIP=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="-em-x270" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_USER_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_SYSFS_DEPRECATED=y +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_PNX4008 is not set +CONFIG_ARCH_PXA=y +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set + +# +# Intel PXA2xx Implementations +# +# CONFIG_ARCH_LUBBOCK is not set +# CONFIG_MACH_LOGICPD_PXA270 is not set +# CONFIG_MACH_MAINSTONE is not set +# CONFIG_ARCH_PXA_IDP is not set +# CONFIG_PXA_SHARPSL is not set +# CONFIG_MACH_TRIZEPS4 is not set +CONFIG_MACH_EM_X270=y +CONFIG_PXA27x=y +CONFIG_PXA_PWR_I2C=y + +# +# Boot options +# + +# +# Power management +# + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_XSCALE=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5T=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_OUTER_CACHE is not set +CONFIG_IWMMXT=y +CONFIG_XSCALE_PMU=y + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_TICK_ONESHOT is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +CONFIG_OABI_COMPAT=y +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200" +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +# CONFIG_CPU_FREQ_DEBUG is not set +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_STAT_DETAILS is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +CONFIG_CPU_FREQ_GOV_ONDEMAND=m +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m +CONFIG_CPU_FREQ_PXA=y + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Power management options +# +CONFIG_PM=y +CONFIG_PM_LEGACY=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_SLEEP=y +CONFIG_SUSPEND_UP_POSSIBLE=y +CONFIG_SUSPEND=y +CONFIG_APM_EMULATION=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set +CONFIG_NET_SCH_FIFO=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +# CONFIG_BT_RFCOMM_TTY is not set +CONFIG_BT_BNEP=m +# CONFIG_BT_BNEP_MC_FILTER is not set +# CONFIG_BT_BNEP_PROTO_FILTER is not set +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +# CONFIG_BT_HCIUSB_SCO is not set +CONFIG_BT_HCIUART=m +# CONFIG_BT_HCIUART_H4 is not set +# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +# CONFIG_BT_HCIVHCI is not set +# CONFIG_AF_RXRPC is not set + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=m +# CONFIG_MAC80211_LEDS is not set +CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +# CONFIG_IEEE80211_CRYPT_TKIP is not set +# CONFIG_IEEE80211_SOFTMAC is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=y +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_XIP is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x0 +CONFIG_MTD_PHYSMAP_LEN=0x100000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_IMPA7 is not set +# CONFIG_MTD_SHARP_SL is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_H1900 is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_SHARPSL is not set +# CONFIG_MTD_NAND_NANDSIM is not set +CONFIG_MTD_NAND_PLATFORM=y +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +CONFIG_MTD_UBI=m +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_RESERVE=1 +CONFIG_MTD_UBI_GLUEBI=y + +# +# UBI debugging options +# +# CONFIG_MTD_UBI_DEBUG is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=12000 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_NETDEVICES_MULTIQUEUE is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_PHYLIB is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +CONFIG_DM9000=y +# CONFIG_SMC911X is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +# CONFIG_PPPOE is not set +CONFIG_PPPOL2TP=m +# CONFIG_SLIP is not set +CONFIG_SLHC=m +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_PXA27x=y +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +CONFIG_TOUCHSCREEN_WM97XX=y +# CONFIG_TOUCHSCREEN_WM9705 is not set +CONFIG_TOUCHSCREEN_WM9712=y +# CONFIG_TOUCHSCREEN_WM9713 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_UCB1400 is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_PXA=y +CONFIG_SERIAL_PXA_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_WATCHDOG is not set +CONFIG_HW_RANDOM=m +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# +# CONFIG_I2C_ALGOBIT is not set +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_GPIO is not set +CONFIG_I2C_PXA=y +# CONFIG_I2C_PXA_SLAVE is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +# CONFIG_DS1682 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_SENSORS_TSL2550 is not set +CONFIG_DA9030=y +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set +# CONFIG_W1 is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +CONFIG_APM_POWER=y +# CONFIG_BATTERY_DS2760 is not set +# CONFIG_BATTERY_EM_X270 is not set +# CONFIG_HWMON is not set +CONFIG_MISC_DEVICES=y +# CONFIG_EEPROM_93CX6 is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=m + +# +# LED drivers +# +CONFIG_LEDS_GPIO=m +CONFIG_LEDS_EM_X270=m + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_HEARTBEAT=m + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_DAB is not set + +# +# Graphics support +# +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_CORGI=y + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_VGASTATE is not set +CONFIG_VIDEO_OUTPUT_CONTROL=m +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_SYS_FOPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_PXA=y +CONFIG_FB_PXA_PARAMETERS=y +# CONFIG_FB_MBX is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# +CONFIG_SND_PXA2XX_PCM=m +CONFIG_SND_PXA2XX_AC97=m + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set + +# +# System on Chip audio support +# +CONFIG_SND_SOC_AC97_BUS=y +CONFIG_SND_SOC=y +CONFIG_SND_PXA2XX_SOC=y +CONFIG_SND_PXA2XX_SOC_AC97=y +CONFIG_SND_PXA2XX_SOC_EM_X270=y + +# +# SoC Audio support for SuperH +# +CONFIG_SND_SOC_WM9712=y + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=y +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_DEVICE_CLASS is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_PERSIST is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +# CONFIG_USB_MON is not set + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y + +# +# MMC/SD Host Controller Drivers +# +CONFIG_MMC_PXA=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc1" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set + +# +# SPI RTC drivers +# + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T59 is not set +CONFIG_RTC_DRV_V3020=y + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_SA1100=y + +# +# DMA Engine support +# +# CONFIG_DMA_ENGINE is not set + +# +# DMA Clients +# + +# +# DMA Devices +# + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_NFSD is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_BIND34 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +CONFIG_SMB_FS=y +# CONFIG_SMB_NLS_DEFAULT is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=y + +# +# Distributed Lock Manager +# +# CONFIG_DLM is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +# CONFIG_DETECT_SOFTLOCKUP is not set +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +CONFIG_FRAME_POINTER=y +CONFIG_FORCED_INLINING=y +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_MANAGER=m +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +CONFIG_CRYPTO_SHA1=m +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_PCBC=m +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_SERPENT is not set +CONFIG_CRYPTO_AES=m +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_ARC4=m +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_CRC32C is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_HW=y + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=m +# CONFIG_CRC16 is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/em-x270-2.6.23/em-x270.patch b/packages/linux/em-x270-2.6.23/em-x270.patch new file mode 100644 index 0000000000..3c28be83c7 --- /dev/null +++ b/packages/linux/em-x270-2.6.23/em-x270.patch @@ -0,0 +1,12063 @@ + arch/arm/Kconfig | 13 +- + arch/arm/configs/em_x270_defconfig | 367 +++-- + arch/arm/mach-pxa/Kconfig | 8 + + arch/arm/mach-pxa/Makefile | 9 +- + arch/arm/mach-pxa/cpu-pxa.c | 442 ++++++ + arch/arm/mach-pxa/em-x270-devices.c | 331 +++++ + arch/arm/mach-pxa/em-x270-lcd.c | 223 +++ + arch/arm/mach-pxa/em-x270-pm.c | 892 ++++++++++++ + arch/arm/mach-pxa/em-x270.c | 127 ++- + arch/arm/mach-pxa/pwr-i2c.c | 539 +++++++ + arch/arm/mach-pxa/pxa27x.c | 6 +- + arch/arm/mach-pxa/spitz.c | 27 + + drivers/i2c/chips/Kconfig | 13 + + drivers/i2c/chips/Makefile | 1 + + drivers/i2c/chips/da9030.c | 1213 ++++++++++++++++ + drivers/i2c/chips/da9030.h | 282 ++++ + drivers/input/touchscreen/Kconfig | 43 + + drivers/input/touchscreen/Makefile | 14 + + drivers/input/touchscreen/wm9705.c | 360 +++++ + drivers/input/touchscreen/wm9712.c | 464 ++++++ + drivers/input/touchscreen/wm9713.c | 461 ++++++ + drivers/input/touchscreen/wm97xx-core.c | 859 +++++++++++ + drivers/leds/Kconfig | 6 + + drivers/leds/Makefile | 1 + + drivers/leds/leds-em-x270.c | 99 ++ + drivers/mtd/chips/jedec_probe.c | 58 +- + drivers/net/dm9000.c | 1 + + drivers/power/Kconfig | 6 + + drivers/power/Makefile | 1 + + drivers/power/em_x270_battery.c | 579 ++++++++ + drivers/usb/gadget/Kconfig | 20 + + drivers/usb/gadget/Makefile | 1 + + drivers/usb/gadget/epautoconf.c | 9 +- + drivers/usb/gadget/ether.c | 63 +- + drivers/usb/gadget/file_storage.c | 11 +- + drivers/usb/gadget/pxa27x_udc.c | 2387 +++++++++++++++++++++++++++++++ + drivers/usb/gadget/pxa27x_udc.h | 298 ++++ + drivers/usb/gadget/pxa2xx_udc.h | 7 +- + drivers/usb/gadget/serial.c | 18 +- + drivers/usb/gadget/zero.c | 13 +- + drivers/video/backlight/Kconfig | 2 +- + include/asm-arm/arch-pxa/pwr-i2c.h | 61 + + include/linux/da9030.h | 118 ++ + include/linux/usb_gadget.h | 23 +- + include/linux/wm97xx.h | 291 ++++ + sound/soc/pxa/Kconfig | 9 + + sound/soc/pxa/Makefile | 2 + + sound/soc/pxa/em-x270.c | 137 ++ + 48 files changed, 10742 insertions(+), 173 deletions(-) + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 691aae3..cf1dbc2 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -858,7 +858,7 @@ config KEXEC + + endmenu + +-if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX ) ++if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA) + + menu "CPU Frequency scaling" + +@@ -894,6 +894,15 @@ config CPU_FREQ_IMX + + If in doubt, say N. + ++config CPU_FREQ_PXA ++ tristate "CPUfreq driver for PXA2xx CPUs" ++ depends on CPU_FREQ && ARCH_PXA ++ default y ++ help ++ Thes enables the CPUfreq driver for PXA2xx CPUs. ++ ++ If in doubt, say Y. ++ + endmenu + + endif +@@ -1029,6 +1038,8 @@ source "drivers/spi/Kconfig" + + source "drivers/w1/Kconfig" + ++source "drivers/power/Kconfig" ++ + source "drivers/hwmon/Kconfig" + + #source "drivers/l3/Kconfig" +diff --git a/arch/arm/configs/em_x270_defconfig b/arch/arm/configs/em_x270_defconfig +index 6bea090..3246136 100644 +--- a/arch/arm/configs/em_x270_defconfig ++++ b/arch/arm/configs/em_x270_defconfig +@@ -1,13 +1,13 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.22 +-# Mon Jul 9 15:18:20 2007 ++# Linux kernel version: 2.6.23-rc9 ++# Tue Oct 9 11:19:21 2007 + # + CONFIG_ARM=y + CONFIG_SYS_SUPPORTS_APM_EMULATION=y + CONFIG_GENERIC_GPIO=y + CONFIG_GENERIC_TIME=y +-# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_GENERIC_CLOCKEVENTS=y + CONFIG_MMU=y + # CONFIG_NO_IOPORT is not set + CONFIG_GENERIC_HARDIRQS=y +@@ -27,25 +27,20 @@ CONFIG_VECTORS_BASE=0xffff0000 + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + CONFIG_EXPERIMENTAL=y + CONFIG_BROKEN_ON_SMP=y + CONFIG_INIT_ENV_ARG_LIMIT=32 +- +-# +-# General setup +-# + CONFIG_LOCALVERSION="-em-x270" + # CONFIG_LOCALVERSION_AUTO is not set + CONFIG_SWAP=y + CONFIG_SYSVIPC=y +-# CONFIG_IPC_NS is not set + CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_UTS_NS is not set ++# CONFIG_USER_NS is not set + # CONFIG_AUDIT is not set + CONFIG_IKCONFIG=y + CONFIG_IKCONFIG_PROC=y +@@ -71,34 +66,27 @@ CONFIG_FUTEX=y + CONFIG_ANON_INODES=y + CONFIG_EPOLL=y + CONFIG_SIGNALFD=y +-CONFIG_TIMERFD=y + CONFIG_EVENTFD=y + CONFIG_SHMEM=y + CONFIG_VM_EVENT_COUNTERS=y +-CONFIG_SLAB=y +-# CONFIG_SLUB is not set ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y + # CONFIG_SLOB is not set + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 +- +-# +-# Loadable module support +-# + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y + CONFIG_MODULE_FORCE_UNLOAD=y + # CONFIG_MODVERSIONS is not set + # CONFIG_MODULE_SRCVERSION_ALL is not set + CONFIG_KMOD=y +- +-# +-# Block layer +-# + CONFIG_BLOCK=y + # CONFIG_LBD is not set + # CONFIG_BLK_DEV_IO_TRACE is not set + # CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -139,6 +127,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" + # CONFIG_ARCH_L7200 is not set + # CONFIG_ARCH_KS8695 is not set + # CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set + # CONFIG_ARCH_PNX4008 is not set + CONFIG_ARCH_PXA=y + # CONFIG_ARCH_RPC is not set +@@ -160,6 +149,15 @@ CONFIG_ARCH_PXA=y + # CONFIG_MACH_TRIZEPS4 is not set + CONFIG_MACH_EM_X270=y + CONFIG_PXA27x=y ++CONFIG_PXA_PWR_I2C=y ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# + + # + # Processor Type +@@ -185,6 +183,7 @@ CONFIG_XSCALE_PMU=y + # + # Bus support + # ++# CONFIG_PCI_SYSCALL is not set + # CONFIG_ARCH_SUPPORTS_MSI is not set + + # +@@ -196,8 +195,9 @@ CONFIG_XSCALE_PMU=y + # Kernel Features + # + # CONFIG_TICK_ONESHOT is not set ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set + # CONFIG_PREEMPT is not set +-# CONFIG_NO_IDLE_HZ is not set + CONFIG_HZ=100 + CONFIG_AEABI=y + CONFIG_OABI_COMPAT=y +@@ -212,6 +212,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y + CONFIG_SPLIT_PTLOCK_CPUS=4096 + # CONFIG_RESOURCES_64BIT is not set + CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + CONFIG_ALIGNMENT_TRAP=y + + # +@@ -219,11 +221,28 @@ CONFIG_ALIGNMENT_TRAP=y + # + CONFIG_ZBOOT_ROM_TEXT=0x0 + CONFIG_ZBOOT_ROM_BSS=0x0 +-CONFIG_CMDLINE="" ++CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200" + # CONFIG_XIP_KERNEL is not set + # CONFIG_KEXEC is not set + + # ++# CPU Frequency scaling ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_TABLE=y ++# CONFIG_CPU_FREQ_DEBUG is not set ++CONFIG_CPU_FREQ_STAT=y ++# CONFIG_CPU_FREQ_STAT_DETAILS is not set ++CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_POWERSAVE=m ++CONFIG_CPU_FREQ_GOV_USERSPACE=m ++CONFIG_CPU_FREQ_GOV_ONDEMAND=m ++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m ++CONFIG_CPU_FREQ_PXA=y ++ ++# + # Floating point emulation + # + +@@ -238,8 +257,8 @@ CONFIG_FPE_NWFPE=y + # Userspace binary formats + # + CONFIG_BINFMT_ELF=y +-# CONFIG_BINFMT_AOUT is not set +-# CONFIG_BINFMT_MISC is not set ++CONFIG_BINFMT_AOUT=m ++CONFIG_BINFMT_MISC=m + + # + # Power management options +@@ -247,8 +266,10 @@ CONFIG_BINFMT_ELF=y + CONFIG_PM=y + CONFIG_PM_LEGACY=y + # CONFIG_PM_DEBUG is not set +-# CONFIG_PM_SYSFS_DEPRECATED is not set +-CONFIG_APM_EMULATION=m ++CONFIG_PM_SLEEP=y ++CONFIG_SUSPEND_UP_POSSIBLE=y ++CONFIG_SUSPEND=y ++CONFIG_APM_EMULATION=y + + # + # Networking +@@ -316,6 +337,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" + # QoS and/or fair queueing + # + # CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y + + # + # Network testing +@@ -350,9 +372,12 @@ CONFIG_BT_HCIBFUSB=m + # + # Wireless + # +-# CONFIG_CFG80211 is not set +-# CONFIG_WIRELESS_EXT is not set +-# CONFIG_MAC80211 is not set ++CONFIG_CFG80211=m ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=m ++# CONFIG_MAC80211_LEDS is not set ++CONFIG_MAC80211_DEBUGFS=y ++# CONFIG_MAC80211_DEBUG is not set + CONFIG_IEEE80211=m + # CONFIG_IEEE80211_DEBUG is not set + CONFIG_IEEE80211_CRYPT_WEP=m +@@ -360,6 +385,7 @@ CONFIG_IEEE80211_CRYPT_CCMP=m + # CONFIG_IEEE80211_CRYPT_TKIP is not set + # CONFIG_IEEE80211_SOFTMAC is not set + # CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -374,10 +400,6 @@ CONFIG_FW_LOADER=y + # CONFIG_DEBUG_DRIVER is not set + # CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR is not set +- +-# +-# Connector - unified userspace <-> kernelspace linker +-# + # CONFIG_CONNECTOR is not set + CONFIG_MTD=y + # CONFIG_MTD_DEBUG is not set +@@ -402,11 +424,10 @@ CONFIG_MTD_BLOCK=y + # + # RAM/ROM/Flash chip drivers + # +-# CONFIG_MTD_CFI is not set +-# CONFIG_MTD_JEDECPROBE is not set +-# CONFIG_MTD_CFI_NOSWAP is not set +-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++CONFIG_MTD_CFI=y ++CONFIG_MTD_JEDECPROBE=y ++CONFIG_MTD_GEN_PROBE=y ++# CONFIG_MTD_CFI_ADV_OPTIONS is not set + CONFIG_MTD_MAP_BANK_WIDTH_1=y + CONFIG_MTD_MAP_BANK_WIDTH_2=y + CONFIG_MTD_MAP_BANK_WIDTH_4=y +@@ -417,14 +438,25 @@ CONFIG_MTD_CFI_I1=y + CONFIG_MTD_CFI_I2=y + # CONFIG_MTD_CFI_I4 is not set + # CONFIG_MTD_CFI_I8 is not set ++CONFIG_MTD_CFI_INTELEXT=y ++CONFIG_MTD_CFI_AMDSTD=y ++CONFIG_MTD_CFI_STAA=y ++CONFIG_MTD_CFI_UTIL=y + # CONFIG_MTD_RAM is not set + # CONFIG_MTD_ROM is not set + # CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_XIP is not set + + # + # Mapping drivers for chip access + # + # CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x0 ++CONFIG_MTD_PHYSMAP_LEN=0x100000 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=2 ++# CONFIG_MTD_ARM_INTEGRATOR is not set ++# CONFIG_MTD_IMPA7 is not set + # CONFIG_MTD_SHARP_SL is not set + # CONFIG_MTD_PLATRAM is not set + +@@ -457,21 +489,17 @@ CONFIG_MTD_NAND_PLATFORM=y + # + # UBI - Unsorted block images + # +-# CONFIG_MTD_UBI is not set ++CONFIG_MTD_UBI=m ++CONFIG_MTD_UBI_WL_THRESHOLD=4096 ++CONFIG_MTD_UBI_BEB_RESERVE=1 ++CONFIG_MTD_UBI_GLUEBI=y + + # +-# Parallel port support ++# UBI debugging options + # ++# CONFIG_MTD_UBI_DEBUG is not set + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +-# CONFIG_PNPACPI is not set +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set +@@ -490,6 +518,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y + # CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set + # CONFIG_SCSI_PROC_FS is not set +@@ -519,36 +548,23 @@ CONFIG_SCSI_WAIT_SCAN=m + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set + # CONFIG_SCSI_SAS_LIBSAS is not set +- +-# +-# SCSI low-level drivers +-# ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_ISCSI_TCP is not set + # CONFIG_SCSI_DEBUG is not set + # CONFIG_ATA is not set +- +-# +-# Multi-device support (RAID and LVM) +-# + # CONFIG_MD is not set +- +-# +-# Network device support +-# + CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set + # CONFIG_DUMMY is not set + # CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set + # CONFIG_EQUALIZER is not set + # CONFIG_TUN is not set + # CONFIG_PHYLIB is not set +- +-# +-# Ethernet (10 or 100Mbit) +-# + CONFIG_NET_ETHERNET=y + CONFIG_MII=y ++# CONFIG_AX88796 is not set + # CONFIG_SMC91X is not set + CONFIG_DM9000=y + # CONFIG_SMC911X is not set +@@ -571,16 +587,22 @@ CONFIG_DM9000=y + # CONFIG_USB_USBNET_MII is not set + # CONFIG_USB_USBNET is not set + # CONFIG_WAN is not set +-# CONFIG_PPP is not set ++CONFIG_PPP=m ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_MPPE=m ++# CONFIG_PPPOE is not set ++CONFIG_PPPOL2TP=m + # CONFIG_SLIP is not set ++CONFIG_SLHC=m + # CONFIG_SHAPER is not set + # CONFIG_NETCONSOLE is not set + # CONFIG_NETPOLL is not set + # CONFIG_NET_POLL_CONTROLLER is not set +- +-# +-# ISDN subsystem +-# + # CONFIG_ISDN is not set + + # +@@ -612,16 +634,21 @@ CONFIG_INPUT_KEYBOARD=y + # CONFIG_KEYBOARD_XTKBD is not set + # CONFIG_KEYBOARD_NEWTON is not set + # CONFIG_KEYBOARD_STOWAWAY is not set +-CONFIG_KEYBOARD_PXA27x=m ++CONFIG_KEYBOARD_PXA27x=y + # CONFIG_KEYBOARD_GPIO is not set + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set + # CONFIG_INPUT_TABLET is not set + CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set + # CONFIG_TOUCHSCREEN_GUNZE is not set + # CONFIG_TOUCHSCREEN_ELO is not set + # CONFIG_TOUCHSCREEN_MTOUCH is not set + # CONFIG_TOUCHSCREEN_MK712 is not set ++CONFIG_TOUCHSCREEN_WM97XX=y ++# CONFIG_TOUCHSCREEN_WM9705 is not set ++CONFIG_TOUCHSCREEN_WM9712=y ++# CONFIG_TOUCHSCREEN_WM9713 is not set + # CONFIG_TOUCHSCREEN_PENMOUNT is not set + # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set + # CONFIG_TOUCHSCREEN_TOUCHWIN is not set +@@ -660,58 +687,91 @@ CONFIG_SERIAL_PXA_CONSOLE=y + CONFIG_SERIAL_CORE=y + CONFIG_SERIAL_CORE_CONSOLE=y + CONFIG_UNIX98_PTYS=y +-CONFIG_LEGACY_PTYS=y +-CONFIG_LEGACY_PTY_COUNT=256 +- +-# +-# IPMI +-# ++# CONFIG_LEGACY_PTYS is not set + # CONFIG_IPMI_HANDLER is not set + # CONFIG_WATCHDOG is not set + CONFIG_HW_RANDOM=m + # CONFIG_NVRAM is not set + # CONFIG_R3964 is not set + # CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++# CONFIG_I2C_CHARDEV is not set + + # +-# TPM devices ++# I2C Algorithms + # +-# CONFIG_TCG_TPM is not set +-# CONFIG_I2C is not set ++# CONFIG_I2C_ALGOBIT is not set ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set + + # +-# SPI support ++# I2C Hardware Bus support + # +-# CONFIG_SPI is not set +-# CONFIG_SPI_MASTER is not set ++# CONFIG_I2C_GPIO is not set ++CONFIG_I2C_PXA=y ++# CONFIG_I2C_PXA_SLAVE is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set + + # +-# Dallas's 1-wire bus ++# Miscellaneous I2C Chip support + # +-# CONFIG_W1 is not set +-# CONFIG_HWMON is not set ++# CONFIG_SENSORS_DS1337 is not set ++# CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 is not set ++# CONFIG_SENSORS_EEPROM is not set ++# CONFIG_SENSORS_PCF8574 is not set ++# CONFIG_SENSORS_PCA9539 is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_SENSORS_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++CONFIG_DA9030=y ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set + + # +-# Misc devices ++# SPI support + # ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++CONFIG_POWER_SUPPLY=y ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++# CONFIG_PDA_POWER is not set ++CONFIG_APM_POWER=y ++# CONFIG_BATTERY_DS2760 is not set ++# CONFIG_BATTERY_EM_X270 is not set ++# CONFIG_HWMON is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set + + # + # Multifunction device drivers + # + # CONFIG_MFD_SM501 is not set +- +-# +-# LED devices +-# +-# CONFIG_NEW_LEDS is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=m + + # + # LED drivers + # ++CONFIG_LEDS_GPIO=m ++CONFIG_LEDS_EM_X270=m + + # + # LED Triggers + # ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=m ++CONFIG_LEDS_TRIGGER_HEARTBEAT=m + + # + # Multimedia devices +@@ -723,13 +783,17 @@ CONFIG_HW_RANDOM=m + # + # Graphics support + # +-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++CONFIG_BACKLIGHT_LCD_SUPPORT=y ++CONFIG_LCD_CLASS_DEVICE=y ++CONFIG_BACKLIGHT_CLASS_DEVICE=y ++CONFIG_BACKLIGHT_CORGI=y + + # + # Display device support + # + # CONFIG_DISPLAY_SUPPORT is not set + # CONFIG_VGASTATE is not set ++CONFIG_VIDEO_OUTPUT_CONTROL=m + CONFIG_FB=y + # CONFIG_FIRMWARE_EDID is not set + # CONFIG_FB_DDC is not set +@@ -752,7 +816,7 @@ CONFIG_FB_DEFERRED_IO=y + # + # CONFIG_FB_S1D13XXX is not set + CONFIG_FB_PXA=y +-# CONFIG_FB_PXA_PARAMETERS is not set ++CONFIG_FB_PXA_PARAMETERS=y + # CONFIG_FB_MBX is not set + # CONFIG_FB_VIRTUAL is not set + +@@ -762,6 +826,7 @@ CONFIG_FB_PXA=y + # CONFIG_VGA_CONSOLE is not set + CONFIG_DUMMY_CONSOLE=y + CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set + # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set + # CONFIG_FONTS is not set + CONFIG_FONT_8x8=y +@@ -774,18 +839,18 @@ CONFIG_LOGO_LINUX_CLUT224=y + # + # Sound + # +-CONFIG_SOUND=m ++CONFIG_SOUND=y + + # + # Advanced Linux Sound Architecture + # +-CONFIG_SND=m +-CONFIG_SND_TIMER=m +-CONFIG_SND_PCM=m ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y + # CONFIG_SND_SEQUENCER is not set + CONFIG_SND_OSSEMUL=y +-CONFIG_SND_MIXER_OSS=m +-CONFIG_SND_PCM_OSS=m ++CONFIG_SND_MIXER_OSS=y ++CONFIG_SND_PCM_OSS=y + CONFIG_SND_PCM_OSS_PLUGINS=y + # CONFIG_SND_DYNAMIC_MINORS is not set + CONFIG_SND_SUPPORT_OLD_API=y +@@ -817,17 +882,23 @@ CONFIG_SND_PXA2XX_AC97=m + # + # System on Chip audio support + # +-# CONFIG_SND_SOC is not set ++CONFIG_SND_SOC_AC97_BUS=y ++CONFIG_SND_SOC=y ++CONFIG_SND_PXA2XX_SOC=y ++CONFIG_SND_PXA2XX_SOC_AC97=y ++CONFIG_SND_PXA2XX_SOC_EM_X270=y + + # +-# Open Sound System ++# SoC Audio support for SuperH + # +-# CONFIG_SOUND_PRIME is not set +-CONFIG_AC97_BUS=m ++CONFIG_SND_SOC_WM9712=y + + # +-# HID Devices ++# Open Sound System + # ++# CONFIG_SOUND_PRIME is not set ++CONFIG_AC97_BUS=y ++CONFIG_HID_SUPPORT=y + CONFIG_HID=y + # CONFIG_HID_DEBUG is not set + +@@ -838,10 +909,7 @@ CONFIG_USB_HID=y + # CONFIG_USB_HIDINPUT_POWERBOOK is not set + # CONFIG_HID_FF is not set + # CONFIG_USB_HIDDEV is not set +- +-# +-# USB support +-# ++CONFIG_USB_SUPPORT=y + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y + # CONFIG_USB_ARCH_HAS_EHCI is not set +@@ -855,6 +923,7 @@ CONFIG_USB_DEVICEFS=y + # CONFIG_USB_DEVICE_CLASS is not set + # CONFIG_USB_DYNAMIC_MINORS is not set + # CONFIG_USB_SUSPEND is not set ++# CONFIG_USB_PERSIST is not set + # CONFIG_USB_OTG is not set + + # +@@ -866,12 +935,13 @@ CONFIG_USB_OHCI_HCD=y + # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set + + # + # USB Device Class drivers + # +-# CONFIG_USB_ACM is not set +-# CONFIG_USB_PRINTER is not set ++CONFIG_USB_ACM=m ++CONFIG_USB_PRINTER=m + + # + # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +@@ -896,8 +966,8 @@ CONFIG_USB_STORAGE=y + # + # USB Imaging devices + # +-# CONFIG_USB_MDC800 is not set +-# CONFIG_USB_MICROTEK is not set ++CONFIG_USB_MDC800=m ++CONFIG_USB_MICROTEK=m + # CONFIG_USB_MON is not set + + # +@@ -940,25 +1010,25 @@ CONFIG_USB_STORAGE=y + # USB Gadget Support + # + # CONFIG_USB_GADGET is not set +-CONFIG_MMC=m ++CONFIG_MMC=y + # CONFIG_MMC_DEBUG is not set +-# CONFIG_MMC_UNSAFE_RESUME is not set ++CONFIG_MMC_UNSAFE_RESUME=y + + # + # MMC/SD Card Drivers + # +-CONFIG_MMC_BLOCK=m ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y + + # + # MMC/SD Host Controller Drivers + # +-CONFIG_MMC_PXA=m +- +-# +-# Real Time Clock +-# ++CONFIG_MMC_PXA=y + CONFIG_RTC_LIB=y +-CONFIG_RTC_CLASS=m ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc1" ++# CONFIG_RTC_DEBUG is not set + + # + # RTC interfaces +@@ -972,6 +1042,15 @@ CONFIG_RTC_INTF_DEV=y + # + # I2C RTC drivers + # ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set + + # + # SPI RTC drivers +@@ -982,14 +1061,29 @@ CONFIG_RTC_INTF_DEV=y + # + # CONFIG_RTC_DRV_CMOS is not set + # CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set + # CONFIG_RTC_DRV_DS1742 is not set + # CONFIG_RTC_DRV_M48T86 is not set +-CONFIG_RTC_DRV_V3020=m ++# CONFIG_RTC_DRV_M48T59 is not set ++CONFIG_RTC_DRV_V3020=y + + # + # on-CPU RTC drivers + # +-CONFIG_RTC_DRV_SA1100=m ++CONFIG_RTC_DRV_SA1100=y ++ ++# ++# DMA Engine support ++# ++# CONFIG_DMA_ENGINE is not set ++ ++# ++# DMA Clients ++# ++ ++# ++# DMA Devices ++# + + # + # File systems +@@ -1098,7 +1192,6 @@ CONFIG_SMB_FS=y + # CONFIG_NCP_FS is not set + # CONFIG_CODA_FS is not set + # CONFIG_AFS_FS is not set +-# CONFIG_9P_FS is not set + + # + # Partition Types +@@ -1167,20 +1260,22 @@ CONFIG_NLS_UTF8=y + CONFIG_ENABLE_MUST_CHECK=y + CONFIG_MAGIC_SYSRQ=y + # CONFIG_UNUSED_SYMBOLS is not set +-# CONFIG_DEBUG_FS is not set ++CONFIG_DEBUG_FS=y + # CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y + # CONFIG_DEBUG_SHIRQ is not set + # CONFIG_DETECT_SOFTLOCKUP is not set ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set + # CONFIG_TIMER_STATS is not set +-# CONFIG_DEBUG_SLAB is not set ++# CONFIG_SLUB_DEBUG_ON is not set + # CONFIG_DEBUG_RT_MUTEXES is not set + # CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set + # CONFIG_DEBUG_MUTEXES is not set + # CONFIG_DEBUG_LOCK_ALLOC is not set + # CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set + # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set + # CONFIG_DEBUG_KOBJECT is not set +@@ -1202,10 +1297,6 @@ CONFIG_DEBUG_LL=y + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# + CONFIG_CRYPTO=y + CONFIG_CRYPTO_ALGAPI=m + CONFIG_CRYPTO_BLKCIPHER=m +@@ -1215,7 +1306,7 @@ CONFIG_CRYPTO_MANAGER=m + # CONFIG_CRYPTO_NULL is not set + # CONFIG_CRYPTO_MD4 is not set + # CONFIG_CRYPTO_MD5 is not set +-# CONFIG_CRYPTO_SHA1 is not set ++CONFIG_CRYPTO_SHA1=m + # CONFIG_CRYPTO_SHA256 is not set + # CONFIG_CRYPTO_SHA512 is not set + # CONFIG_CRYPTO_WP512 is not set +@@ -1243,19 +1334,17 @@ CONFIG_CRYPTO_ARC4=m + # CONFIG_CRYPTO_CRC32C is not set + # CONFIG_CRYPTO_CAMELLIA is not set + # CONFIG_CRYPTO_TEST is not set +- +-# +-# Hardware crypto devices +-# ++CONFIG_CRYPTO_HW=y + + # + # Library routines + # + CONFIG_BITREVERSE=y +-# CONFIG_CRC_CCITT is not set ++CONFIG_CRC_CCITT=m + # CONFIG_CRC16 is not set + # CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y + CONFIG_ZLIB_DEFLATE=y +diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig +index 5ebec6d..2957cb9 100644 +--- a/arch/arm/mach-pxa/Kconfig ++++ b/arch/arm/mach-pxa/Kconfig +@@ -148,4 +148,12 @@ config PXA_SSP + tristate + help + Enable support for PXA2xx SSP ports ++ ++config PXA_PWR_I2C ++ bool "Simple Power I2C interface" ++ depends on PXA27x ++ help ++ Enable support for PXA27x Power I2C interface. This driver ++ enables very simple blocking access to Power I2C, which ++ might be useful for early access to Power Management ICs. + endif +diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile +index 7d6ab5c..2d7a431 100644 +--- a/arch/arm/mach-pxa/Makefile ++++ b/arch/arm/mach-pxa/Makefile +@@ -18,7 +18,7 @@ obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o sp + obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o + obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o + obj-$(CONFIG_MACH_TOSA) += tosa.o +-obj-$(CONFIG_MACH_EM_X270) += em-x270.o ++obj-$(CONFIG_MACH_EM_X270) += em-x270.o em-x270-pm.o em-x270-lcd.o em-x270-devices.o + + # Support for blinky lights + led-y := leds.o +@@ -29,9 +29,16 @@ led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o + + obj-$(CONFIG_LEDS) += $(led-y) + ++# CPU Frequency scaling ++obj-$(CONFIG_CPU_FREQ_PXA) += cpu-pxa.o ++ + # Misc features + obj-$(CONFIG_PM) += pm.o sleep.o + obj-$(CONFIG_PXA_SSP) += ssp.o ++obj-$(CONFIG_PXA_PWR_I2C) += pwr-i2c.o ++ ++#obj-m += da9030_asm.o ++#da9030_asm-y += da9030.o da9030_c.o + + ifeq ($(CONFIG_PXA27x),y) + obj-$(CONFIG_PM) += standby.o +diff --git a/arch/arm/mach-pxa/cpu-pxa.c b/arch/arm/mach-pxa/cpu-pxa.c +new file mode 100644 +index 0000000..7fa9703 +--- /dev/null ++++ b/arch/arm/mach-pxa/cpu-pxa.c +@@ -0,0 +1,442 @@ ++/* ++ * linux/arch/arm/mach-pxa/cpu-pxa.c ++ * ++ * Copyright (C) 2002,2003 Intrinsyc Software ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * History: ++ * 31-Jul-2002 : Initial version [FB] ++ * 29-Jan-2003 : added PXA255 support [FB] ++ * 20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.) ++ * 11-Jan-2006 : v2.6, support for PXA27x processor up to 624MHz (Bill Reese, Hewlett Packard) ++ * ++ * Note: ++ * This driver may change the memory bus clock rate, but will not do any ++ * platform specific access timing changes... for example if you have flash ++ * memory connected to CS0, you will need to register a platform specific ++ * notifier which will adjust the memory access strobes to maintain a ++ * minimum strobe width. ++ * ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/init.h> ++#include <linux/cpufreq.h> ++ ++#include <asm/hardware.h> ++ ++#include <asm/arch/pxa-regs.h> ++ ++/* ++ * This comes from generic.h in this directory. ++ */ ++extern unsigned int get_clk_frequency_khz(int info); ++ ++#define DEBUG 0 ++ ++#ifdef DEBUG ++ static unsigned int freq_debug = DEBUG; ++ module_param(freq_debug, int, 0644); ++ MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); ++#else ++ #define freq_debug 0 ++#endif ++ ++typedef struct ++{ ++ unsigned int khz; /* CPU frequency */ ++ unsigned int membus; /* memory bus frequency */ ++ unsigned int cccr; /* new CCLKCFG setting */ ++ unsigned int div2; /* alter memory controller settings to divide by 2 */ ++ unsigned int cclkcfg; /* new CCLKCFG setting */ ++} pxa_freqs_t; ++ ++/* Define the refresh period in mSec for the SDRAM and the number of rows */ ++#define SDRAM_TREF 64 /* standard 64ms SDRAM */ ++#if defined(CONFIG_MACH_H4700) || defined(CONFIG_ARCH_H2200) || defined(CONFIG_MACH_MAGICIAN) ++#define SDRAM_ROWS 8192 /* hx4700 uses 2 64Mb DRAMs, 8912 rows */ ++#else ++#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */ ++#endif ++#define MDREFR_DRI(x) (((x*SDRAM_TREF/SDRAM_ROWS - 31)/32)) ++ ++#define CCLKCFG_TURBO 0x1 ++#define CCLKCFG_FCS 0x2 ++#define CCLKCFG_HALFTURBO 0x4 ++#define CCLKCFG_FASTBUS 0x8 ++#ifdef CONFIG_ARCH_H5400 ++/* H5400's SAMCOP chip does not like when K2DB2 touched */ ++#define MDREFR_DB2_MASK (MDREFR_K1DB2) ++#else ++#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) ++#endif ++#define MDREFR_DRI_MASK 0xFFF ++#define PXA25x_CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS ++ ++/* ++ * For the PXA27x: ++ * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG. ++ * ++ * A = 0 => memory controller clock from table 3-7, ++ * A = 1 => memory controller clock = system bus clock ++ * Run mode frequency = 13 MHz * L ++ * Turbo mode frequency = 13 MHz * L * N ++ * System bus frequency = 13 MHz * L / (B + 1) ++ * System initialized by bootldr to: ++ * ++ * In CCCR: ++ * A = 1 ++ * L = 16 oscillator to run mode ratio ++ * 2N = 6 2 * (turbo mode to run mode ratio) ++ * ++ * In CCLKCFG: ++ * B = 1 Fast bus mode ++ * HT = 0 Half-Turbo mode ++ * T = 1 Turbo mode ++ * ++ * For now, just support some of the combinations in table 3-7 of ++ * PXA27x Processor Family Developer's Manual to simplify frequency ++ * change sequences. ++ * ++ * Specify 2N in the PXA27x_CCCR macro, not N! ++ */ ++#define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L) ++#define PXA27x_CCLKCFG(B, HT, T) (B << 3 | HT << 2 | CCLKCFG_FCS | T) ++ ++#define PXA25x_CCCR(L, M, N) (L << 0 | M << 5 | N << 7) ++ ++/* ++ * Valid frequency assignments ++ */ ++static pxa_freqs_t pxa2xx_freqs[] = ++{ ++ /* CPU MEMBUS CCCR DIV2 */ ++#if defined(CONFIG_PXA25x) ++#if defined(CONFIG_PXA25x_ALTERNATE_FREQS) ++ { 99500, 99500, PXA25x_CCCR(1, 1, 2), 1, PXA25x_CCLKCFG}, /* run=99, turbo= 99, PXbus=50, SDRAM=50 */ ++ {199100, 99500, PXA25x_CCCR(1, 1, 4), 0, PXA25x_CCLKCFG}, /* run=99, turbo=199, PXbus=50, SDRAM=99 */ ++ {298500, 99500, PXA25x_CCCR(1, 1, 6), 0, PXA25x_CCLKCFG}, /* run=99, turbo=287, PXbus=50, SDRAM=99 */ ++ {298600, 99500, PXA25x_CCCR(1, 2, 3), 0, PXA25x_CCLKCFG}, /* run=199, turbo=287, PXbus=99, SDRAM=99 */ ++ {398100, 99500, PXA25x_CCCR(1, 2, 4), 0, PXA25x_CCLKCFG} /* run=199, turbo=398, PXbus=99, SDRAM=99 */ ++#else ++ { 99500, 99500, PXA25x_CCCR(1, 1, 2), 1, PXA25x_CCLKCFG}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ ++ {132700, 132700, PXA25x_CCCR(3, 1, 2), 1, PXA25x_CCLKCFG}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ ++ {199100, 99500, PXA25x_CCCR(1, 2, 2), 0, PXA25x_CCLKCFG}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ ++ {265400, 132700, PXA25x_CCCR(3, 2, 2), 1, PXA25x_CCLKCFG}, /* run=265, turbo=265, PXbus=133, SDRAM=66 */ ++ {331800, 165900, PXA25x_CCCR(5, 2, 2), 1, PXA25x_CCLKCFG}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ ++ {398100, 99500, PXA25x_CCCR(1, 3, 2), 0, PXA25x_CCLKCFG} /* run=398, turbo=398, PXbus=196, SDRAM=99 */ ++#endif ++#elif defined(CONFIG_PXA27x) ++ {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, PXA27x_CCLKCFG(1, 0, 1)}, ++ {156000, 104000, PXA27x_CCCR(1, 8, 6), 0, PXA27x_CCLKCFG(1, 1, 1)}, ++ {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, PXA27x_CCLKCFG(0, 0, 1)}, ++ {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, PXA27x_CCLKCFG(1, 0, 1)}, ++ {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, PXA27x_CCLKCFG(1, 0, 1)}, ++ {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, PXA27x_CCLKCFG(1, 0, 1)}, ++/* {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, PXA27x_CCLKCFG(1, 0, 1)} */ ++#endif ++}; ++#define NUM_FREQS (sizeof(pxa2xx_freqs)/sizeof(pxa_freqs_t)) ++ ++static struct cpufreq_frequency_table pxa2xx_freq_table[NUM_FREQS+1]; ++ ++/* Return the memory clock rate for a given cpu frequency. */ ++int pxa_cpufreq_memclk(int cpu_khz) ++{ ++ int i; ++ int freq_mem = 0; ++ ++ for (i = 0; i < NUM_FREQS; i++) { ++ if (pxa2xx_freqs[i].khz == cpu_khz) { ++ freq_mem = pxa2xx_freqs[i].membus; ++ break; ++ } ++ } ++ ++ return freq_mem; ++} ++EXPORT_SYMBOL(pxa_cpufreq_memclk); ++ ++ ++/* find a valid frequency point */ ++static int pxa_verify_policy(struct cpufreq_policy *policy) ++{ ++ int ret; ++ ++ ret=cpufreq_frequency_table_verify(policy, pxa2xx_freq_table); ++ ++ if(freq_debug) { ++ printk("Verified CPU policy: %dKhz min to %dKhz max\n", ++ policy->min, policy->max); ++ } ++ ++ return ret; ++} ++ ++static int pxa_set_target(struct cpufreq_policy *policy, ++ unsigned int target_freq, ++ unsigned int relation) ++{ ++ int idx; ++ cpumask_t cpus_allowed, allowedcpuset; ++ int cpu = policy->cpu; ++ struct cpufreq_freqs freqs; ++ unsigned long flags; ++ unsigned int unused; ++ unsigned int preset_mdrefr, postset_mdrefr, cclkcfg; ++ ++ if(freq_debug) { ++ printk ("CPU PXA: target freq %d\n", target_freq); ++ printk ("CPU PXA: relation %d\n", relation); ++ } ++ ++ /* ++ * Save this threads cpus_allowed mask. ++ */ ++ cpus_allowed = current->cpus_allowed; ++ ++ /* ++ * Bind to the specified CPU. When this call returns, ++ * we should be running on the right CPU. ++ */ ++ cpus_clear (allowedcpuset); ++ cpu_set (cpu, allowedcpuset); ++ set_cpus_allowed(current, allowedcpuset); ++ BUG_ON(cpu != smp_processor_id()); ++ ++ /* Lookup the next frequency */ ++ if (cpufreq_frequency_table_target(policy, pxa2xx_freq_table, ++ target_freq, relation, &idx)) { ++ return -EINVAL; ++ } ++ ++ freqs.old = policy->cur; ++ freqs.new = pxa2xx_freqs[idx].khz; ++ freqs.cpu = policy->cpu; ++ if(freq_debug) { ++ printk(KERN_INFO "Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", ++ freqs.new/1000, (pxa2xx_freqs[idx].div2) ? ++ (pxa2xx_freqs[idx].membus/2000) : ++ (pxa2xx_freqs[idx].membus/1000)); ++ } ++ ++ /* ++ * Tell everyone what we're about to do... ++ * you should add a notify client with any platform specific ++ * Vcc changing capability ++ */ ++ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); ++ ++ /* Calculate the next MDREFR. If we're slowing down the SDRAM clock ++ * we need to preset the smaller DRI before the change. If we're speeding ++ * up we need to set the larger DRI value after the change. ++ */ ++ preset_mdrefr = postset_mdrefr = MDREFR; ++ if((MDREFR & MDREFR_DRI_MASK) > MDREFR_DRI(pxa2xx_freqs[idx].membus)) { ++ preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK) | ++ MDREFR_DRI(pxa2xx_freqs[idx].membus); ++ } ++ postset_mdrefr = (postset_mdrefr & ~MDREFR_DRI_MASK) | ++ MDREFR_DRI(pxa2xx_freqs[idx].membus); ++ ++ /* If we're dividing the memory clock by two for the SDRAM clock, this ++ * must be set prior to the change. Clearing the divide must be done ++ * after the change. ++ */ ++ if(pxa2xx_freqs[idx].div2) { ++ /* ++ * Potentially speeding up memory clock, so slow down the memory ++ * before speeding up the clock. ++ */ ++ preset_mdrefr |= MDREFR_DB2_MASK | MDREFR_K0DB4; ++ preset_mdrefr &= ~MDREFR_K0DB2; ++ ++ postset_mdrefr |= MDREFR_DB2_MASK | MDREFR_K0DB4; ++ postset_mdrefr &= ~MDREFR_K0DB2; ++ } else { ++ /* ++ * Potentially slowing down memory clock. Wait until after the change ++ * to speed up the memory. ++ */ ++ postset_mdrefr &= ~MDREFR_DB2_MASK; ++ postset_mdrefr &= ~MDREFR_K0DB4; ++ postset_mdrefr |= MDREFR_K0DB2; ++ } ++ ++ cclkcfg = pxa2xx_freqs[idx].cclkcfg; ++ ++ if (freq_debug) { ++ printk (KERN_INFO "CPU PXA writing 0x%08x to CCCR\n", ++ pxa2xx_freqs[idx].cccr); ++ printk (KERN_INFO "CPU PXA writing 0x%08x to CCLKCFG\n", ++ pxa2xx_freqs[idx].cclkcfg); ++ printk (KERN_INFO "CPU PXA writing 0x%08x to MDREFR before change\n", ++ preset_mdrefr); ++ printk (KERN_INFO "CPU PXA writing 0x%08x to MDREFR after change\n", ++ postset_mdrefr); ++ } ++ ++ local_irq_save(flags); ++ ++ /* Set new the CCCR */ ++ CCCR = pxa2xx_freqs[idx].cccr; ++ ++ /* ++ * Should really set both of PMCR[xIDAE] while changing the core frequency ++ */ ++ ++ /* ++ * TODO: On the PXA27x: If we're setting half-turbo mode and changing the ++ * core frequency at the same time we must split it up into two operations. ++ * The current values in the pxa2xx_freqs table don't do this, so the code ++ * is unimplemented. ++ */ ++ ++ __asm__ __volatile__(" \ ++ ldr r4, [%1] ; /* load MDREFR */ \ ++ b 2f ; \ ++ .align 5 ; \ ++1: \ ++ str %3, [%1] ; /* preset the MDREFR */ \ ++ mcr p14, 0, %2, c6, c0, 0 ; /* set CCLKCFG[FCS] */ \ ++ str %4, [%1] ; /* postset the MDREFR */ \ ++ \ ++ b 3f ; \ ++2: b 1b ; \ ++3: nop ; \ ++ " ++ : "=&r" (unused) ++ : "r" (&MDREFR), "r" (cclkcfg), \ ++ "r" (preset_mdrefr), "r" (postset_mdrefr) ++ : "r4", "r5"); ++ local_irq_restore(flags); ++ ++ if (freq_debug) { ++ printk (KERN_INFO "CPU PXA Frequency change successful\n"); ++ printk (KERN_INFO "CPU PXA new CCSR 0x%08x\n", CCSR); ++ } ++ ++ /* ++ * Restore the CPUs allowed mask. ++ */ ++ set_cpus_allowed(current, cpus_allowed); ++ ++ /* ++ * Tell everyone what we've just done... ++ * you should add a notify client with any platform specific ++ * SDRAM refresh timer adjustments ++ */ ++ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); ++ ++ return 0; ++} ++ ++static int pxa_cpufreq_init(struct cpufreq_policy *policy) ++{ ++ cpumask_t cpus_allowed, allowedcpuset; ++ unsigned int cpu = policy->cpu; ++ int i; ++ unsigned int cclkcfg; ++ ++ cpus_allowed = current->cpus_allowed; ++ ++ cpus_clear (allowedcpuset); ++ cpu_set (cpu, allowedcpuset); ++ set_cpus_allowed(current, allowedcpuset); ++ BUG_ON(cpu != smp_processor_id()); ++ ++ /* set default governor and cpuinfo */ ++ policy->governor = CPUFREQ_DEFAULT_GOVERNOR; ++ policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ ++ policy->cur = get_clk_frequency_khz(0); /* current freq */ ++ ++ /* Generate the cpufreq_frequency_table struct */ ++ for(i=0;i<NUM_FREQS;i++) { ++ pxa2xx_freq_table[i].frequency = pxa2xx_freqs[i].khz; ++ pxa2xx_freq_table[i].index = i; ++ } ++ pxa2xx_freq_table[i].frequency = CPUFREQ_TABLE_END; ++ ++ /* ++ * Set the policy's minimum and maximum frequencies from the tables ++ * just constructed. This sets cpuinfo.mxx_freq, min and max. ++ */ ++ cpufreq_frequency_table_cpuinfo (policy, pxa2xx_freq_table); ++ ++ set_cpus_allowed(current, cpus_allowed); ++ printk(KERN_INFO "PXA CPU frequency change support initialized\n"); ++ ++ if (freq_debug) { ++ printk (KERN_INFO "PXA CPU initial CCCR 0x%08x\n", CCCR); ++ asm ++ ( ++ "mrc p14, 0, %0, c6, c0, 0 ; /* read CCLKCFG from CP14 */ " ++ : "=r" (cclkcfg) : ++ ); ++ printk ("PXA CPU initial CCLKCFG 0x%08x\n", cclkcfg); ++ printk ("PXA CPU initial MDREFR 0x%08x\n", MDREFR); ++ } ++ ++ return 0; ++} ++ ++static unsigned int pxa_cpufreq_get(unsigned int cpu) ++{ ++ cpumask_t cpumask_saved; ++ unsigned int cur_freq; ++ ++ cpumask_saved = current->cpus_allowed; ++ set_cpus_allowed(current, cpumask_of_cpu(cpu)); ++ BUG_ON(cpu != smp_processor_id()); ++ ++ cur_freq = get_clk_frequency_khz(0); ++ ++ set_cpus_allowed(current, cpumask_saved); ++ ++ return cur_freq; ++} ++ ++static struct cpufreq_driver pxa_cpufreq_driver = { ++ .verify = pxa_verify_policy, ++ .target = pxa_set_target, ++ .init = pxa_cpufreq_init, ++ .get = pxa_cpufreq_get, ++#if defined(CONFIG_PXA25x) ++ .name = "PXA25x", ++#elif defined(CONFIG_PXA27x) ++ .name = "PXA27x", ++#endif ++}; ++ ++static int __init pxa_cpu_init(void) ++{ ++ return cpufreq_register_driver(&pxa_cpufreq_driver); ++} ++ ++static void __exit pxa_cpu_exit(void) ++{ ++ cpufreq_unregister_driver(&pxa_cpufreq_driver); ++} ++ ++ ++MODULE_AUTHOR ("Intrinsyc Software Inc."); ++MODULE_DESCRIPTION ("CPU frequency changing driver for the PXA architecture"); ++MODULE_LICENSE("GPL"); ++module_init(pxa_cpu_init); ++module_exit(pxa_cpu_exit); ++ +diff --git a/arch/arm/mach-pxa/em-x270-devices.c b/arch/arm/mach-pxa/em-x270-devices.c +new file mode 100644 +index 0000000..d142930 +--- /dev/null ++++ b/arch/arm/mach-pxa/em-x270-devices.c +@@ -0,0 +1,331 @@ ++/* ++ * Support for CompuLab EM-X270 platfrom specific device ++ * initialization, and per-device power management functions. ++ * ++ * Copyright (C) 2007 CompuLab, Ltd. ++ * Author: Mike Rapoport <mike@compulab.co.il> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/sysfs.h> ++#include <linux/ctype.h> ++#include <linux/delay.h> ++#include <linux/da9030.h> ++#include <linux/interrupt.h> ++#include <linux/irq.h> ++ ++#include "../../../drivers/i2c/chips/da9030.h" ++ ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++struct em_x270_dev_data { ++ int (*is_on)(struct device *dev); ++ int (*set_on)(struct device *dev, int on); ++ int (*get_opts)(struct device *dev, ++ struct device_attribute *attr, ++ char *buf); ++ int (*set_opts)(struct device *dev, int opts); ++}; ++ ++static void em_x270_dev_release(struct device * dev) ++{ ++ ++} ++ ++static ssize_t em_x270_dev_pm_show(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct em_x270_dev_data *pm_data = dev->platform_data; ++ int is_on = pm_data->is_on(dev); ++ ++ return sprintf(buf, "%d\n", is_on); ++} ++ ++static ssize_t em_x270_dev_pm_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ char *endp; ++ int on = simple_strtoul(buf, &endp, 0); ++ size_t size = endp - buf; ++ struct em_x270_dev_data *pm_data = dev->platform_data; ++ ++ pr_info("%s: %s\n", __FUNCTION__, buf); ++ ++ if (*endp && isspace(*endp)) ++ size++; ++ if (size != count) ++ return -EINVAL; ++ ++ pm_data->set_on(dev, on); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(pwr_on, S_IWUSR | S_IRUGO, ++ em_x270_dev_pm_show, em_x270_dev_pm_store); ++ ++static int gprs_is_on(struct device *dev) ++{ ++ return !!(pxa_gpio_get_value(20)); ++} ++ ++static int gprs_set_on(struct device *dev, int on) ++{ ++ pr_info("%s: on = %d\n", __FUNCTION__, on); ++ if (on) { ++ pxa_gpio_mode(20 | GPIO_OUT | GPIO_DFLT_HIGH); ++ mdelay(500); ++ pxa_gpio_set_value(82, 0); ++ mdelay(500); ++ pxa_gpio_mode(82 | GPIO_OUT | GPIO_DFLT_HIGH); ++ mdelay(1000); ++ pxa_gpio_set_value(82, 0); ++ } ++ else { ++ pxa_gpio_set_value(20, 0); ++ pxa_gpio_mode(20 | GPIO_OUT); ++ } ++ ++ return 0; ++} ++ ++static struct em_x270_dev_data em_x270_gprs_data = { ++ .is_on = gprs_is_on, ++ .set_on = gprs_set_on, ++}; ++ ++static struct platform_device em_x270_gprs = { ++ .name = "gprs", ++ .id = -1, ++ .dev = { ++ .platform_data = &em_x270_gprs_data, ++ .release = em_x270_dev_release, ++ }, ++}; ++ ++static int is_wlan_on; ++ ++static int wlan_is_on(struct device *dev) ++{ ++ return is_wlan_on; ++} ++ ++static int wlan_set_on(struct device *dev, int on) ++{ ++ if (on) { ++ /* WLAN power-up sequence */ ++ /* Mask LDO17 and LDO19 tolerance events */ ++ da9030_set_reg(IRQ_MASK_C, ++ IRQ_MASK_C_LDO19 | IRQ_MASK_C_LDO17); ++ ++ /* Force I2C control over LDO17, LDO19 */ ++ da9030_set_reg(SLEEP_CONTROL, ++ APP_SLEEP_CTL_BYPASS_LDO19 | ++ APP_SLEEP_CTL_BYPASS_LDO17); ++ ++ /* Turn off LDO17 and LDO19 */ ++ da9030_set_reg(REG_CONTROL_1_17, ++ RC1_LDO16_EN | RC1_LDO15_EN | ++ RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); ++ da9030_set_reg(REG_CONTROL_2_18, RC2_SIMCP_EN | RC2_LDO18_EN); ++ ++ /* Set LDO17 voltage to 3V (VCC_WLAN_IO) */ ++ da9030_set_reg(LDO_17_SIMCP0, LDO_17_SIMCP0_LDO17_3V); ++ mdelay(200); ++ ++ /* Turn WLAN RF power on */ ++ pxa_gpio_mode(115 | GPIO_OUT | GPIO_DFLT_HIGH); ++ ++ /* Turn LDO17 on */ ++ da9030_set_reg(REG_CONTROL_1_17, ++ RC1_LDO17_EN| RC1_LDO16_EN | RC1_LDO15_EN | ++ RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); ++ mdelay(200); ++ ++ /* Turn on LDO19 */ ++ da9030_set_reg(REG_CONTROL_2_18, ++ RC2_SIMCP_EN | RC2_LDO18_EN | RC2_LDO19_EN); ++ ++ } ++ else { ++ /* FIXME: implement BGW shutdown */ ++ } ++ is_wlan_on = on; ++ ++ return 0; ++} ++ ++static struct em_x270_dev_data em_x270_wlan_data = { ++ .is_on = wlan_is_on, ++ .set_on = wlan_set_on, ++}; ++ ++static struct platform_device em_x270_wlan = { ++ .name = "wlan", ++ .id = -1, ++ .dev = { ++ .platform_data = &em_x270_wlan_data, ++ .release = em_x270_dev_release, ++ }, ++}; ++ ++static int gps_is_on(struct device *dev) ++{ ++ int val = da9030_get_reg(REG_CONTROL_1_97); ++ return !!(val & RC3_LDO3_EN); ++} ++ ++static int gps_set_on(struct device *dev, int on) ++{ ++ int val = da9030_get_reg(REG_CONTROL_1_97); ++ ++ if (on) ++ val |= RC3_LDO3_EN; ++ else ++ val &= ~RC3_LDO3_EN; ++ da9030_set_reg(REG_CONTROL_1_97, val); ++ ++ return 0; ++} ++ ++static struct em_x270_dev_data em_x270_gps_data = { ++ .is_on = gps_is_on, ++ .set_on = gps_set_on, ++}; ++ ++static struct platform_device em_x270_gps = { ++ .name = "gps", ++ .id = -1, ++ .dev = { ++ .platform_data = &em_x270_gps_data, ++ .release = em_x270_dev_release, ++ }, ++}; ++ ++static int usb_mode; ++static int usb_host_is_on(struct device *dev) ++{ ++ return usb_mode; ++} ++ ++static int usb_host_set_on(struct device *dev, int on) ++{ ++ if (on) { ++ da9030_set_reg(MISC_CONTROLB, MISCB_SESSION_VALID_ENABLE); ++ da9030_set_reg(USBPUMP, ++ USB_PUMP_EN_USBVEP | ++ USB_PUMP_EN_USBVE | ++ USB_PUMP_USBVE); ++ ++ /* enable port 2 transiever */ ++ UP2OCR = UP2OCR_HXS | UP2OCR_HXOE; ++ usb_mode = 1; ++ } ++ else { ++ UP2OCR = UP2OCR_DPPUE | UP2OCR_DPPUBE | UP2OCR_HXOE; ++ da9030_set_reg(USBPUMP, ++ USB_PUMP_EN_USBVEP | USB_PUMP_EN_USBVE); ++ usb_mode = 0; ++ } ++ ++ return 0; ++} ++ ++static struct em_x270_dev_data em_x270_usb_host_data = { ++ .is_on = usb_host_is_on, ++ .set_on = usb_host_set_on, ++}; ++ ++static struct platform_device em_x270_usb_host = { ++ .name = "usb_host", ++ .id = -1, ++ .dev = { ++ .platform_data = &em_x270_usb_host_data, ++ .release = em_x270_dev_release, ++ }, ++}; ++ ++static struct platform_device *em_x270_devices[] = { ++ &em_x270_gprs, ++ &em_x270_wlan, ++ &em_x270_gps, ++ &em_x270_usb_host, ++}; ++ ++static struct work_struct usb_work; ++static void usb_worker(struct work_struct *work) ++{ ++ usb_host_set_on(NULL, !pxa_gpio_get_value(21)); ++} ++ ++static irqreturn_t usb_irq_handler(int irq, void *regs) ++{ ++ schedule_work(&usb_work); ++ ++ pr_info("%s\n", __FUNCTION__); ++ return IRQ_HANDLED; ++} ++ ++static int em_x270_devices_init(void) ++{ ++ int i, ret; ++ ++ for (i = 0; i < ARRAY_SIZE(em_x270_devices); i++ ) { ++ ret = platform_device_register(em_x270_devices[i]); ++ if (ret) { ++ dev_dbg(&em_x270_devices[i]->dev, ++ "Registration failed: %d\n", ret); ++ continue; ++ } ++ ++ ret = device_create_file(&em_x270_devices[i]->dev, ++ &dev_attr_pwr_on); ++ if (ret) { ++ dev_dbg(&em_x270_devices[i]->dev, ++ "PWR_ON attribute failed: %d\n", ret); ++ } ++ ++ dev_dbg(&em_x270_devices[i]->dev, ++ "Registered PWR ON attribute\n"); ++ } ++ ++ /* setup USB detection irq */ ++ INIT_WORK(&usb_work, usb_worker); ++ set_irq_type(IRQ_GPIO(21), IRQT_BOTHEDGE); ++ ret = request_irq(IRQ_GPIO(21), usb_irq_handler, IRQF_DISABLED, ++ "usb detect", 0); ++ if (ret) { ++ pr_info("USB device detection disabled\n"); ++ } ++ else { ++ schedule_work(&usb_work); ++ } ++ ++ return 0; ++} ++ ++static void em_x270_devices_exit(void) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(em_x270_devices); i++ ) { ++ device_remove_file(&em_x270_devices[i]->dev, ++ &dev_attr_pwr_on); ++ platform_device_unregister(em_x270_devices[i]); ++ } ++} ++ ++late_initcall(em_x270_devices_init); ++module_exit(em_x270_devices_exit); ++ ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_DESCRIPTION("Support for platfrom specific device attributes for EM-X270"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-pxa/em-x270-lcd.c b/arch/arm/mach-pxa/em-x270-lcd.c +new file mode 100644 +index 0000000..437efe1 +--- /dev/null ++++ b/arch/arm/mach-pxa/em-x270-lcd.c +@@ -0,0 +1,223 @@ ++/* ++ * LCD initialization and backlight managemnet for EM-X270 ++ * ++ * Copyright (C) 2007 CompuLab, Ltd. ++ * Author: Igor Vaisbein <igor@compulab.co.il> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/da9030.h> ++#include <linux/delay.h> ++ ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++#include <asm/arch/sharpsl.h> ++#include <asm/arch/ssp.h> ++ ++#include "devices.h" ++ ++#define GPIO87_nPCE_2 87 /* Card Enable for Card Space (PXA27x) */ ++#define GPIO87_nPCE_2_MD (87 | GPIO_ALT_FN_1_IN) ++#define GPIO87_USB3_1_MD (87 | GPIO_ALT_FN_3_IN) ++#define GPIO87_SSPTXD2_MD (87 | GPIO_ALT_FN_1_OUT) ++#define GPIO87_SSFRM2_MD (87 | GPIO_ALT_FN_3_OUT) ++ ++#define LCCR4 __REG(0x44000010) ++ ++#define TD035STEE1_LCD_ID 0x2008 ++ ++static void em_x270_set_bl_intensity(int intensity) ++{ ++ da9030_set_wled((intensity != 0), intensity); ++} ++ ++struct corgibl_machinfo em_x270_bl_machinfo = { ++ .max_intensity = 0x7, ++ .default_intensity = 0x3, ++ .limit_mask = 0x1, ++ .set_bl_intensity = em_x270_set_bl_intensity, ++}; ++ ++static void em_x270_bl_release(struct device * dev) ++{ ++ ++} ++ ++static struct platform_device em_x270_bl = { ++ .name = "corgi-bl", ++ .dev = { ++ .release = em_x270_bl_release, ++ .parent = &pxa_device_fb.dev, ++ .platform_data = &em_x270_bl_machinfo, ++ }, ++ .id = -1, ++}; ++ ++/* ++ * Helper functions to access LCD throuhg SPI interface ++ */ ++static void set_ssp_9bit(void) ++{ ++ int temp; ++ SSCR0 = 0xFF208; ++ SSCR0 = 0xFF288; ++ SSCR1 = 0x40000018; ++ ++ while (SSSR & 0x8) ++ temp = SSDR; ++} ++ ++static void set_ssp_18bit(void) ++{ ++ int temp; ++ SSCR0 = 0x1FF201; ++ SSCR0 = 0x1FF281; ++ SSCR1 = 0x40000018; ++ while (SSSR & 0x8) ++ temp = SSDR; ++} ++ ++static void set_ssp_rcv(void) ++{ ++ int temp; ++ SSCR0 = 0x1FF20F; ++ SSCR0 = 0x1FF28F; ++ SSCR1 = 0x40000018; ++ while (SSSR & 0x8) ++ temp = SSDR; ++} ++ ++static void send_ssp_9bit(unsigned int value) ++{ ++ int temp; ++ SSDR = (value); ++ ++ asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); ++ ++ if (!(SSSR & 0x4)) ++ while ((SSSR & 0xf00) == 0) ++ ; ++ ++ while ((SSSR & 0xf00) != 0) ++ ; ++ while (SSSR & 0x10) ++ ; ++ while (SSSR & 0x8) ++ temp = SSDR; ++} ++ ++static void send_ssp_18bit(unsigned int value) ++{ ++ int temp; ++ SSDR = (value); ++ ++ asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); ++ ++ if (!(SSSR & 0x4)) ++ while ((SSSR & 0xf00) == 0) ++ ; ++ ++ while ((SSSR & 0xf00) != 0) ++ ; ++ while (SSSR & 0x10) ++ ; ++ while (SSSR & 0x8) ++ temp = SSDR; ++} ++ ++static unsigned int rcv_ssp_18bit(void) ++{ ++ SSDR = ((0x04) << 23); ++ asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); ++ if (!(SSSR & 0x4)) ++ while ((SSSR & 0xf00) == 0) ++ ; ++ while ((SSSR & 0xf00) != 0) ++ ; ++ while (SSSR & 0x10) ++ ; ++ return SSDR; ++} ++ ++/* LCD init sequence */ ++int em_x270_lcd_detect(void) ++{ ++ unsigned int data; ++ ++ /* Reset the LCD module */ ++ pxa_gpio_mode(GPIO87_nPCE_2 | GPIO_OUT); ++ GPCR(GPIO87_nPCE_2) |= GPIO_bit(GPIO87_nPCE_2); ++ mdelay(75); ++ GPSR(GPIO87_nPCE_2) |= GPIO_bit(GPIO87_nPCE_2); ++ mdelay(70); ++ ++ /* TD035STEE1 LCD_SSP initialization commands */ ++ set_ssp_9bit(); ++ send_ssp_9bit(0x000); ++ mdelay(5); ++ ++ send_ssp_9bit(0x000); ++ mdelay(5); ++ ++ send_ssp_9bit(0x000); ++ mdelay(5); ++ ++ set_ssp_18bit(); ++ send_ssp_18bit(0x17980); ++ mdelay(5); ++ ++ send_ssp_18bit(0x17F10); ++ mdelay(5); ++ ++ set_ssp_9bit(); ++ send_ssp_9bit(0x011); ++ mdelay(50); ++ ++ send_ssp_9bit(0x029); ++ mdelay(10); ++ ++ set_ssp_rcv(); ++ ++ /* Check for LCD ID, to enable the back-light */ ++ data = rcv_ssp_18bit(); ++ ++ if ((data & 0xFFFF) != TD035STEE1_LCD_ID) ++ return -ENODEV; ++ ++ /* enable backlight */ ++ da9030_set_wled(1, 2); ++ return 0; ++} ++ ++static int em_x270_lcd_init(void) ++{ ++ int ret; ++ pr_debug("%s\n", __FUNCTION__); ++ ret = em_x270_lcd_detect(); ++ if (ret) ++ return ret; ++ ++ /* make sure we keep LCCR4 with PCD=0 */ ++ LCCR4 = 0x0; ++ ++ return platform_device_register(&em_x270_bl); ++} ++ ++static void em_x270_lcd_exit(void) ++{ ++ pr_debug("%s\n", __FUNCTION__); ++ platform_device_unregister(&em_x270_bl); ++} ++ ++late_initcall(em_x270_lcd_init); ++module_exit(em_x270_lcd_exit); ++ ++MODULE_DESCRIPTION("EM-X270 backlight and LCD initialization driver"); ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-pxa/em-x270-pm.c b/arch/arm/mach-pxa/em-x270-pm.c +new file mode 100644 +index 0000000..55ba4cd +--- /dev/null ++++ b/arch/arm/mach-pxa/em-x270-pm.c +@@ -0,0 +1,892 @@ ++/* ++ * Support for CompuLab EM-X270 platform power management ++ * ++ * Copyright (C) 2007 CompuLab, Ltd. ++ * Author: Mike Rapoport <mike@compulab.co.il> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/sysfs.h> ++#include <linux/pm.h> ++#include <linux/da9030.h> ++#include <linux/interrupt.h> ++#include <linux/irq.h> ++#include <linux/delay.h> ++#include <linux/ctype.h> ++ ++#include <linux/apm-emulation.h> ++#include <linux/platform_device.h> ++#include <linux/power_supply.h> ++ ++#include <linux/debugfs.h> ++#include <linux/seq_file.h> ++ ++#include "../../../drivers/i2c/chips/da9030.h" ++ ++#include <asm/arch/pm.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++#include <asm/arch/pwr-i2c.h> ++ ++#define DA9030_ADDR 0x92 ++ ++#define EM_X270_BATCHK_TIME_SUSPEND (10*60) /* 10 min */ ++ ++#define VOLTAGE_MAX_DESIGN 4200000 /* 4.2V in uV */ ++#define VOLTAGE_MIN_DESIGN 3000000 /* 3V in uV */ ++ ++#define REG2VOLT(x) ((((x) * 2650) >> 8) + 2650) ++#define VOLT2REG(x) ((((x) - 2650) << 8) / 2650) ++ ++#define REG2CURR(x) ((((x) * 24000) >> 8) / 15) ++ ++#define VCHARGE_MIN_THRESHOLD VOLT2REG(3200) ++#define VCHARGE_MAX_THRESHOLD VOLT2REG(5500) ++ ++#define VBAT_LOW_THRESHOLD VOLT2REG(3600) ++#define VBAT_CRIT_THRESHOLD VOLT2REG(3400) ++ ++#define VBAT_CHARGE_START VOLT2REG(4100) ++#define VBAT_CHARGE_STOP VOLT2REG(4200) ++#define VBAT_CHARGE_RESTART VOLT2REG(4000) ++ ++#define TBAT_LOW_THRESHOLD 197 /* 0oC */ ++#define TBAT_HIGH_THRESHOLD 78 /* 45oC */ ++#define TBAT_RESUME_THRESHOLD 100 /* 35oC */ ++ ++struct em_x270_charger; ++ ++struct em_x270_charger_ops { ++ void (*get_status)(struct em_x270_charger *charger); ++ void (*set_charge)(struct em_x270_charger *charger, int on); ++ ++ s32 (*da9030_get_reg)(u32 reg); ++ s32 (*da9030_set_reg)(u32 reg, u8 val); ++}; ++ ++struct em_x270_charger { ++ struct device *dev; ++ ++ struct power_supply bat; ++ struct da9030_adc_res adc; ++ struct delayed_work work; ++ ++ int interval; ++ ++ int da9030_status; ++ int da9030_fault; ++ int mA; ++ int mV; ++ int is_on; ++ ++ struct em_x270_charger_ops *ops; ++ ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *debug_file; ++#endif ++}; ++ ++static struct em_x270_charger *the_charger; ++ ++static unsigned short tbat_readings[] = { ++ 300, 244, 200, 178, 163, 152, 144, 137, 131, ++ 126, 122, 118, 114, 111, 108, 105, 103, 101, ++ 98, 96, 94, 93, 91, 89, 88, 86, 85, ++ 83, 82, 81, 79, 78, 77, 76, 75, 74, ++ 73, 72, 71, 70, 69, 68, 67, 67, 66, ++ 65, 64, 63, 63, 62, 61, 60, 60, 59, ++ 58, 58, 57, 57, 56, 55, 55, 54, 53, ++ 53, 52, 52, 51, 51, 50, 50, 49, 49, ++ 48, 48, 47, 47, 46, 46, 45, 45, 44, ++ 44, 43, 43, 42, 42, 41, 41, 41, 40, ++ 40, 39, 39, 38, 38, 38, 37, 37, 36, ++ 36, 35, 35, 35, 34, 34, 34, 33, 33, ++ 32, 32, 32, 31, 31, 30, 30, 30, 29, ++ 29, 29, 28, 28, 28, 27, 27, 26, 26, ++ 26, 25, 25, 25, 24, 24, 24, 23, 23, ++ 23, 22, 22, 21, 21, 21, 20, 20, 20, ++ 19, 19, 19, 18, 18, 18, 17, 17, 17, ++ 16, 16, 16, 15, 15, 14, 14, 14, 13, ++ 13, 13, 12, 12, 12, 11, 11, 11, 10, ++ 10, 10, 9, 9, 8, 8, 8, 7, 7, ++ 7, 6, 6, 5, 5, 5, 4, 4, 3, ++ 3, 3, 2, 2, 1, 1, 1, 0, 0, ++ -1, -1, -1, -2, -2, -3, -3, -4, -4, ++ -5, -5, -6, -6, -6, -7, -7, -8, -9, ++ -9, -10, -10, -11, -11, -12, -12, -13, -14, ++ -14, -15, -16, -16, -17, -18, -18, -19, -20, ++ -21, -21, -22, -23, -24, -25, -26, -27, -28, ++ -30, -31, -32, -34, -35, -37, -39, -41, -44, ++ -47, -50, -56, -64, ++}; ++ ++static inline int usb_host_on(void) ++{ ++ return !pxa_gpio_get_value(21); ++} ++ ++#ifdef CONFIG_DEBUG_FS ++ ++static int debug_show(struct seq_file *s, void *data) ++{ ++ struct em_x270_charger *charger = s->private; ++ ++ seq_printf(s, "charger is %s\n", charger->is_on ? "on" : "off"); ++ if (charger->da9030_status & CHRG_CHARGER_ENABLE) { ++ seq_printf(s, "iset = %dmA, vset = %dmV\n", ++ charger->mA, charger->mV); ++ } ++ ++ seq_printf(s, "vbat_res = %d (%dmV)\n", ++ charger->adc.vbat_res, REG2VOLT(charger->adc.vbat_res)); ++ seq_printf(s, "vbatmin_res = %d (%dmV)\n", ++ charger->adc.vbatmin_res, ++ REG2VOLT(charger->adc.vbatmin_res)); ++ seq_printf(s, "vbatmintxon = %d (%dmV)\n", ++ charger->adc.vbatmintxon, ++ REG2VOLT(charger->adc.vbatmintxon)); ++ seq_printf(s, "ichmax_res = %d (%dmA)\n", ++ charger->adc.ichmax_res, ++ REG2CURR(charger->adc.ichmax_res)); ++ seq_printf(s, "ichmin_res = %d (%dmA)\n", ++ charger->adc.ichmin_res, ++ REG2CURR(charger->adc.ichmin_res)); ++ seq_printf(s, "ichaverage_res = %d (%dmA)\n", ++ charger->adc.ichaverage_res, ++ REG2CURR(charger->adc.ichaverage_res)); ++ seq_printf(s, "vchmax_res = %d (%dmV)\n", ++ charger->adc.vchmax_res, ++ REG2VOLT(charger->adc.vchmax_res)); ++ seq_printf(s, "vchmin_res = %d (%dmV)\n", ++ charger->adc.vchmin_res, ++ REG2VOLT(charger->adc.vchmin_res)); ++ seq_printf(s, "tbat_res = %d (%doC)\n", charger->adc.tbat_res, ++ tbat_readings[charger->adc.tbat_res]); ++ seq_printf(s, "adc_in4_res = %d\n", charger->adc.adc_in4_res); ++ seq_printf(s, "adc_in5_res = %d\n", charger->adc.adc_in5_res); ++ ++ return 0; ++} ++ ++static int debug_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, debug_show, inode->i_private); ++} ++ ++static const struct file_operations debug_fops = { ++ .open = debug_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static struct dentry* em_x270_create_debugfs(struct em_x270_charger *charger) ++{ ++ charger->debug_file = debugfs_create_file("charger", 0666, 0, charger, ++ &debug_fops); ++ return charger->debug_file; ++} ++ ++static void em_x270_remove_debugfs(struct em_x270_charger *charger) ++{ ++ debugfs_remove(charger->debug_file); ++} ++#else ++#define em_x270_create_debugfs(x) NULL ++#define em_x270_remove_debugfs(x) do {} while(0) ++#endif ++ ++/*********************************************************************/ ++/* DA9030 access functions for suspend/resume */ ++#define DA_ADDR 0x49 ++static inline s32 __da9030_get_reg(u32 reg) ++{ ++ pr_info("%s: reg = %d\n", __FUNCTION__, reg); ++ return pxa_pwr_i2c_reg_read(DA_ADDR, reg); ++} ++ ++static inline s32 __da9030_set_reg(u32 reg, u8 val) ++{ ++ pr_info("%s: reg = %d, val = %d\n", __FUNCTION__, reg, val); ++ return pxa_pwr_i2c_reg_write(DA_ADDR, reg, val); ++} ++ ++/*********************************************************************/ ++/* helpers for charger state monnitor. Different version for stready ++ * state and suspended system ++ */ ++static void em_x270_get_charger_status(struct em_x270_charger *charger) ++{ ++ da9030_get_charger(&charger->is_on, &charger->mA, &charger->mV); ++ da9030_read_adc(&charger->adc); ++ charger->da9030_status = da9030_get_status(); ++ charger->da9030_fault = da9030_get_fault_log(); ++} ++ ++static void em_x270_set_charge(struct em_x270_charger *charger, int on) ++{ ++ if (on) { ++ pr_debug("%s: enabling charger\n", __FUNCTION__); ++ da9030_set_thresholds(TBAT_HIGH_THRESHOLD, ++ TBAT_RESUME_THRESHOLD, ++ TBAT_LOW_THRESHOLD, ++ VBAT_LOW_THRESHOLD); ++ da9030_set_reg(CCTR_CONTROL, CCTR_SET_8MIN); ++ da9030_set_charger(1, 1000, 4200); ++ da9030_set_led(3, 1, 0, 0, 0); ++ charger->is_on = 1; ++ } ++ else { ++ /* disable charger */ ++ pr_debug("%s: disabling charger\n", __FUNCTION__); ++ da9030_set_charger(0, 0, 0); ++ da9030_set_led(3, 0, 0, 0, 0); ++ charger->is_on = 0; ++ } ++} ++ ++static void em_x270_get_charger_status_suspend(struct em_x270_charger *charger) ++{ ++ s32 val; ++ ++ val = __da9030_get_reg(CHARGE_CONTROL); ++ charger->is_on = (val & CHRG_CHARGER_ENABLE) ? 1 : 0; ++ charger->mA = ((val >> 3) & 0xf) * 100; ++ charger->mV = (val & 0x7) * 50 + 4000; ++ ++ charger->adc.vbat_res = __da9030_get_reg(VBAT_RES); ++ charger->adc.vchmax_res = __da9030_get_reg(VCHMAX_RES); ++ charger->adc.vchmin_res = __da9030_get_reg(VCHMIN_RES); ++ charger->adc.tbat_res = __da9030_get_reg(TBAT_RES); ++ ++ charger->da9030_status = __da9030_get_reg(STATUS); ++ charger->da9030_fault = __da9030_get_reg(FAULT_LOG); ++} ++ ++static void em_x270_set_charge_suspend(struct em_x270_charger *charger, int on) ++{ ++ if (on) { ++ u8 val = 0; ++ int mA = 1000; ++ int mV = 4200; ++ ++ pr_debug("%s: enabling charger\n", __FUNCTION__); ++ val = CHRG_CHARGER_ENABLE; ++ val |= (mA / 100) << 3; ++ val |= (mV - 4000) / 50; ++ ++ __da9030_set_reg(CCTR_CONTROL, CCTR_SET_8MIN); ++ __da9030_set_reg(VBATMON, VBAT_LOW_THRESHOLD); ++ __da9030_set_reg(CHARGE_CONTROL, val); ++ charger->is_on = 1; ++ } ++ else { ++ /* disable charger */ ++ pr_debug("%s: disabling charger\n", __FUNCTION__); ++ __da9030_set_reg(CHARGE_CONTROL, 0); ++ charger->is_on = 0; ++ } ++} ++ ++static struct em_x270_charger_ops em_x270_charger_ops = { ++ .get_status = em_x270_get_charger_status, ++ .set_charge = em_x270_set_charge, ++ .da9030_get_reg = da9030_get_reg, ++ .da9030_set_reg = da9030_set_reg, ++}; ++ ++static struct em_x270_charger_ops em_x270_charger_ops_suspend = { ++ .get_status = em_x270_get_charger_status_suspend, ++ .set_charge = em_x270_set_charge_suspend, ++ .da9030_get_reg = __da9030_get_reg, ++ .da9030_set_reg = __da9030_set_reg, ++}; ++ ++/*********************************************************************/ ++/* charging state machine */ ++static void em_x270_check_charger_state(struct em_x270_charger *charger) ++{ ++ charger->ops->get_status(charger); ++ ++/* we wake or boot with external power on */ ++ if (!charger->is_on) { ++ if ((charger->da9030_status & STATUS_CHDET) && ++ (!usb_host_on()) && ++ (charger->adc.vbat_res < VBAT_CHARGE_START)) { ++ pr_debug("%s: vbat_res <= 4100\n", __FUNCTION__); ++ charger->ops->set_charge(charger, 1); ++ } ++ } ++ else { ++ if (charger->adc.vbat_res >= VBAT_CHARGE_STOP) { ++ pr_debug("%s: vbat_res >= 4200\n", __FUNCTION__); ++ charger->ops->set_charge(charger, 0); ++ charger->ops->da9030_set_reg(VBATMON, ++ VBAT_CHARGE_RESTART); ++ } ++ else if (charger->adc.vbat_res > VBAT_LOW_THRESHOLD) { ++ /* we are charging and passed LOW_THRESH, ++ so upate DA9030 VBAT threshold ++ */ ++ pr_debug("%s: vbat_res >= %d\n", __FUNCTION__, ++ REG2VOLT(VBAT_LOW_THRESHOLD)); ++ charger->ops->da9030_set_reg(VBATMON, ++ VBAT_LOW_THRESHOLD); ++ } ++ if (charger->adc.vchmax_res > VCHARGE_MAX_THRESHOLD || ++ charger->adc.vchmin_res < VCHARGE_MIN_THRESHOLD || ++ /* Tempreture readings are negative */ ++ charger->adc.tbat_res < TBAT_HIGH_THRESHOLD || ++ charger->adc.tbat_res > TBAT_LOW_THRESHOLD ) { ++ /* disable charger */ ++ pr_info("%s: thresholds fail\n", __FUNCTION__); ++ charger->ops->set_charge(charger, 0); ++ } ++ } ++} ++ ++static void em_x270_charging_monitor(struct work_struct *work) ++{ ++ struct em_x270_charger *charger; ++ ++ charger = container_of(work, struct em_x270_charger, work.work); ++ ++ em_x270_check_charger_state(charger); ++ ++ /* reschedule for the next time */ ++ schedule_delayed_work(&charger->work, charger->interval); ++} ++ ++void em_x270_battery_release(struct device * dev) ++{ ++} ++ ++struct em_x270_battery_thresh { ++ int voltage; ++ int percentage; ++}; ++ ++static struct em_x270_battery_thresh vbat_ranges[] = { ++ { 150, 100}, ++ { 149, 99}, ++ { 148, 98}, ++ { 147, 98}, ++ { 146, 97}, ++ { 145, 96}, ++ { 144, 96}, ++ { 143, 95}, ++ { 142, 94}, ++ { 141, 93}, ++ { 140, 92}, ++ { 139, 91}, ++ { 138, 90}, ++ { 137, 90}, ++ { 136, 89}, ++ { 135, 88}, ++ { 134, 88}, ++ { 133, 87}, ++ { 132, 86}, ++ { 131, 85}, ++ { 130, 83}, ++ { 129, 82}, ++ { 128, 81}, ++ { 127, 81}, ++ { 126, 80}, ++ { 125, 75}, ++ { 124, 74}, ++ { 123, 73}, ++ { 122, 70}, ++ { 121, 66}, ++ { 120, 65}, ++ { 119, 64}, ++ { 118, 64}, ++ { 117, 63}, ++ { 116, 59}, ++ { 115, 58}, ++ { 114, 57}, ++ { 113, 57}, ++ { 112, 56}, ++ { 111, 50}, ++ { 110, 49}, ++ { 109, 49}, ++ { 108, 48}, ++ { 107, 48}, ++ { 106, 33}, ++ { 105, 32}, ++ { 104, 32}, ++ { 103, 32}, ++ { 102, 31}, ++ { 101, 16}, ++ { 100, 15}, ++ { 99, 15}, ++ { 98, 15}, ++ { 97, 10}, ++ { 96, 9}, ++ { 95, 7}, ++ { 94, 3}, ++ { 93, 0}, ++}; ++ ++static enum power_supply_property em_x270_bat_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_HEALTH, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_CURRENT_AVG, ++ POWER_SUPPLY_PROP_CAPACITY, /* in percents! */ ++ POWER_SUPPLY_PROP_TEMP, ++ POWER_SUPPLY_PROP_MANUFACTURER, ++ POWER_SUPPLY_PROP_MODEL_NAME, ++}; ++ ++static void em_x270_bat_check_status(struct em_x270_charger *charger, ++ union power_supply_propval *val) ++{ ++ /* FIXME: below code is very crude approximation of actual ++ states, we need to take into account voltage and current ++ measurements to determine actual charger state */ ++ if (charger->da9030_status & STATUS_CHDET) { ++ if (!usb_host_on()) { ++ if (charger->is_on) { ++ val->intval = POWER_SUPPLY_STATUS_CHARGING; ++ } ++ else { ++ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; ++ } ++ } ++ } ++ else { ++ val->intval = POWER_SUPPLY_STATUS_DISCHARGING; ++ } ++} ++ ++static void em_x270_bat_check_health(struct em_x270_charger *charger, ++ union power_supply_propval *val) ++{ ++ if (charger->da9030_fault & FAULT_LOG_OVER_TEMP) { ++ val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; ++ } ++ else if (charger->da9030_fault & FAULT_LOG_VBAT_OVER) { ++ val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; ++ } ++ else { ++ val->intval = POWER_SUPPLY_HEALTH_GOOD; ++ } ++} ++ ++static int vbat_interpolate(int reg) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(vbat_ranges); i++ ) ++ if (vbat_ranges[i].voltage == reg) { ++ pr_debug("%s: voltage = %d, percentage = %d\n", ++ __FUNCTION__, vbat_ranges[i].voltage, ++ vbat_ranges[i].percentage); ++ return vbat_ranges[i].percentage; ++ } ++ ++ return 0; ++} ++ ++static int em_x270_bat_get_property(struct power_supply *psy, ++ enum power_supply_property psp, ++ union power_supply_propval *val) ++{ ++ u32 reg; ++ struct em_x270_charger *charger; ++ charger = container_of(psy, struct em_x270_charger, bat); ++ ++ switch(psp) { ++ case POWER_SUPPLY_PROP_STATUS: ++ em_x270_bat_check_status(charger, val); ++ break; ++ case POWER_SUPPLY_PROP_HEALTH: ++ em_x270_bat_check_health(charger, val); ++ break; ++ case POWER_SUPPLY_PROP_TECHNOLOGY: ++ val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: ++ val->intval = VOLTAGE_MAX_DESIGN; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: ++ val->intval = VOLTAGE_MIN_DESIGN; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_NOW: ++ reg = charger->adc.vbat_res; ++ /* V = (reg / 256) * 2.65 + 2.65 (V) */ ++ val->intval = ((reg * 2650000) >> 8) + 2650000; ++ break; ++ case POWER_SUPPLY_PROP_CURRENT_AVG: ++ reg = charger->adc.ichaverage_res; ++ val->intval = reg; /* reg */ ++ break; ++ case POWER_SUPPLY_PROP_CAPACITY: ++ reg = charger->adc.vbat_res; ++ val->intval = vbat_interpolate(reg); ++ break; ++ case POWER_SUPPLY_PROP_TEMP: ++ reg = charger->adc.tbat_res; ++ val->intval = tbat_readings[reg]; ++ break; ++ case POWER_SUPPLY_PROP_MANUFACTURER: ++ val->strval = "MaxPower"; ++ pr_debug("%s: MFG = %s\n", __FUNCTION__, val->strval); ++ break; ++ case POWER_SUPPLY_PROP_MODEL_NAME: ++ val->strval = "LP555597P6H-FPS"; ++ pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); ++ break; ++ default: break; ++ } ++ ++ return 0; ++} ++ ++static void em_x270_setup_battery(struct power_supply *bat) ++{ ++ bat->name = "em-x270-battery"; ++ bat->type = POWER_SUPPLY_TYPE_BATTERY; ++ bat->properties = em_x270_bat_props; ++ bat->num_properties = ARRAY_SIZE(em_x270_bat_props); ++ bat->get_property = em_x270_bat_get_property; ++ bat->use_for_apm = 1; ++}; ++ ++static void em_x270_chiover_callback(int event, void *_charger) ++{ ++ /* disable charger */ ++ struct em_x270_charger *charger = _charger; ++/* pr_info("%s\n", __FUNCTION__); */ ++ em_x270_set_charge(charger, 0); ++} ++ ++static void em_x270_tbat_callback(int event, void *_charger) ++{ ++ /* disable charger */ ++ struct em_x270_charger *charger = _charger; ++/* pr_info("%s\n", __FUNCTION__); */ ++ em_x270_set_charge(charger, 0); ++} ++ ++static void em_x270_vbat_callback(int event, void *_charger) ++{ ++ struct em_x270_charger *charger = _charger; ++ da9030_read_adc(&charger->adc); ++ ++ if (!charger->is_on) { ++ if (charger->adc.vbat_res < VBAT_LOW_THRESHOLD) { ++ /* set VBAT threshold for critical */ ++ da9030_set_reg(VBATMON, VBAT_CRIT_THRESHOLD); ++ da9030_set_reg(VBATMON_1, VBAT_CRIT_THRESHOLD); ++ apm_queue_event(APM_LOW_BATTERY); ++ } ++ else if (charger->adc.vbat_res < VBAT_CRIT_THRESHOLD) { ++ /* notify the system of battery critical */ ++ apm_queue_event(APM_CRITICAL_SUSPEND); ++ } ++ } ++} ++ ++static void em_x270_chdet_callback(int event, void *_charger) ++{ ++ struct em_x270_charger *charger = _charger; ++ int status = da9030_get_status(); ++ pr_info("%s\n", __FUNCTION__); ++ ++/* em_x270_check_charger_state(charger); */ ++ ++ /* check if we have "real" charger or our own USB pump */ ++ if (!usb_host_on()) ++ em_x270_set_charge(charger, !!(status & CHRG_CHARGER_ENABLE)); ++} ++ ++static int em_x270_battery_probe(struct platform_device *pdev) ++{ ++ struct em_x270_charger *charger; ++ ++ pr_debug("%s\n", __FUNCTION__); ++ charger = kzalloc(sizeof(*charger), GFP_KERNEL); ++ if (charger == NULL) { ++ return -ENOMEM; ++ } ++ ++ the_charger = charger; ++ ++ charger->dev = &pdev->dev; ++ ++ charger->ops = &em_x270_charger_ops; ++ ++ charger->interval = 10 * HZ; /* 10 seconds between monotor runs */ ++ em_x270_setup_battery(&charger->bat); ++ ++ platform_set_drvdata(pdev, charger); ++ ++ da9030_enable_adc(); ++ ++ INIT_DELAYED_WORK(&charger->work, em_x270_charging_monitor); ++ schedule_delayed_work(&charger->work, charger->interval); ++ ++ charger->debug_file = em_x270_create_debugfs(charger); ++ ++ em_x270_setup_battery(&charger->bat); ++ ++ da9030_register_callback(DA9030_IRQ_CHDET, ++ em_x270_chdet_callback, ++ charger); ++ da9030_register_callback(DA9030_IRQ_VBATMON, ++ em_x270_vbat_callback, ++ charger); ++ ++ /* critical condition events */ ++ da9030_register_callback(DA9030_IRQ_CHIOVER, ++ em_x270_chiover_callback, ++ charger); ++ da9030_register_callback(DA9030_IRQ_TBAT, ++ em_x270_tbat_callback, ++ charger); ++ ++ da9030_set_thresholds(TBAT_HIGH_THRESHOLD, ++ TBAT_RESUME_THRESHOLD, ++ TBAT_LOW_THRESHOLD, ++ VBAT_LOW_THRESHOLD); ++ ++ power_supply_register(&pdev->dev, &charger->bat); ++ ++ return 0; ++} ++ ++static int em_x270_battery_remove(struct platform_device *dev) ++{ ++ struct em_x270_charger *charger = platform_get_drvdata(dev); ++ ++ pr_debug("%s\n", __FUNCTION__); ++ em_x270_remove_debugfs(charger); ++ cancel_delayed_work(&charger->work); ++ power_supply_unregister(&charger->bat); ++ ++ kfree(charger); ++ the_charger = NULL; ++ ++ return 0; ++} ++ ++static int em_x270_battery_suspend(struct platform_device *pdev, ++ pm_message_t state) ++{ ++ pr_info("%s\n", __FUNCTION__); ++ da9030_set_reg(REG_CONTROL_1_97, RC3_BUCK_EN | RC3_LDO6_EN); ++ da9030_set_reg(REG_CONTROL_2_98, 0); ++ da9030_set_reg(REG_CONTROL_2_18,RC2_LDO18_EN); ++ da9030_set_reg(REG_CONTROL_1_17, ++ RC1_LDO16_EN | RC1_LDO15_EN | RC1_BUCK2_EN); ++ da9030_set_reg(WLED_CONTROL, 0); ++ ++ da9030_set_reg(LED_1_CONTROL, 0); ++ da9030_set_reg(LED_4_CONTROL, 0); ++ ++ return 0; ++} ++ ++extern int em_x270_lcd_detect(void); ++static int em_x270_battery_resume(struct platform_device *pdev) ++{ ++ pr_info("%s\n", __FUNCTION__); ++ ++ da9030_set_reg(LED_1_CONTROL, 0xff); ++ da9030_set_reg(LED_4_CONTROL, 0xff); ++ ++ da9030_set_reg(REG_CONTROL_1_97, ++ RC3_BUCK_EN | RC3_LDO1_EN | RC3_LDO2_EN | ++ RC3_LDO3_EN | RC3_LDO6_EN | RC3_LDO7_EN); ++ da9030_set_reg(REG_CONTROL_2_98, ++ RC4_SIMCP_ENABLE | RC4_LDO11_EN | ++ RC4_LDO9_EN | RC4_LDO8_EN); ++ da9030_set_reg(REG_CONTROL_2_18, ++ RC2_SIMCP_EN | RC2_LDO18_EN | RC2_LDO19_EN); ++ da9030_set_reg(REG_CONTROL_1_17, ++ RC1_LDO17_EN| RC1_LDO16_EN | RC1_LDO15_EN | ++ RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); ++ ++ if (em_x270_lcd_detect() != 0) ++ pr_info("%s: LCD resume failed\n", __FUNCTION__); ++ ++ return 0; ++} ++ ++static struct platform_driver em_x270_battery_driver = { ++ .driver = { ++ .name = "em-x270-battery", ++ .owner = THIS_MODULE, ++ }, ++ .probe = em_x270_battery_probe, ++ .remove = em_x270_battery_remove, ++ ++ .suspend_late = em_x270_battery_suspend, ++ .resume_early = em_x270_battery_resume, ++}; ++ ++/**************************************************************************/ ++/* global patform power management */ ++/**************************************************************************/ ++/* suspend/resume button */ ++static irqreturn_t em_x270_suspend_irq(int irq, void *data) ++{ ++ apm_queue_event(APM_USER_SUSPEND); ++ return IRQ_HANDLED; ++} ++ ++static void em_x270_goto_sleep(suspend_state_t state, ++ unsigned long alarm_time, ++ unsigned int alarm_enable) ++{ ++ pr_info("%s\n", __FUNCTION__); ++ ++ the_charger->ops = &em_x270_charger_ops_suspend; ++ ++ RTSR &= RTSR_ALE; ++ RTAR = RCNR + EM_X270_BATCHK_TIME_SUSPEND; ++ ++ pxa_pm_enter(state); ++} ++ ++static int em_x270_enter_suspend(unsigned long alarm_time, ++ unsigned int alarm_enable) ++{ ++ s32 status = 0; ++ s32 event_a, event_b; ++ int ret; ++ int retry = 10; ++ pr_info("%s\n", __FUNCTION__); ++ ++ /* make sure power I2C state is consistent */ ++ PWRICR &= ~ICR_IUE; ++ ++ if ((PEDR & PWER_GPIO1)) { ++ /* button pressed */ ++ /* clear pending event to avoid interrupt*/ ++ PEDR &= ~PWER_GPIO1; ++ GEDR0 &= ~GPIO_bit(1); ++ ++ ret = 0; ++ } ++ else if ((PEDR & PWER_RTC)) { ++ PEDR &= ~PWER_RTC; ++ pr_debug("%s: timer alarm\n", __FUNCTION__); ++ em_x270_check_charger_state(the_charger); ++ ret = 1; ++ } ++ else if ((PEDR & PWER_GPIO0)) { ++ PEDR &= ~PWER_GPIO0; ++ GEDR0 &= ~GPIO_bit(0); ++ ++ /* we woke up because of DA9030 event */ ++ do { ++ status = the_charger->ops->da9030_get_reg(STATUS); ++ udelay(1000); ++ } while (status < 0 && retry--); ++ ++ the_charger->da9030_status = status; ++ event_a = the_charger->ops->da9030_get_reg(EVENT_A); ++ event_b = the_charger->ops->da9030_get_reg(EVENT_B); ++ ++ pr_info("%s: DA9030 wakeup: status: %x, ev_a: %x, ev_b: %x\n", ++ __FUNCTION__, the_charger->da9030_status, ++ event_a, event_b); ++ ++/* if ((the_charger->da9030_status & STATUS_CHDET)) { */ ++ if (event_a & EVENT_A_CHDET) { ++ pr_info("%s: EVENT_A_CHDET\n", __FUNCTION__); ++ em_x270_check_charger_state(the_charger); ++ } ++ else { ++ pr_info("%s: What the hell?\n", __FUNCTION__); ++ } ++ ++ ret = 1; ++ } ++ else { ++ /* wake up is not DA9030, so continue and let battery ++ driver check the charger state */ ++ ret = 0; ++ } ++ ++ /* get back to sleep */ ++ if (ret) ++ em_x270_goto_sleep(PM_SUSPEND_MEM, alarm_time, alarm_enable); ++ ++ return ret; ++} ++ ++static int em_x270_pm_enter(suspend_state_t state) ++{ ++ unsigned long alarm_time = RTAR; ++ unsigned int alarm_status = ((RTSR & RTSR_ALE) != 0); ++ ++ /* pre-suspend */ ++ pr_info("suspending emma\n"); ++ pxa_gpio_mode(38 | GPIO_OUT | GPIO_DFLT_HIGH); ++ ++ em_x270_goto_sleep(state, alarm_time, alarm_status); ++ ++ /* check if we were resumed because of charger events */ ++ while (em_x270_enter_suspend(alarm_time, alarm_status)) ++ {} ++ ++ /* make sure power I2C state is consistent */ ++ PWRICR &= ~ICR_IUE; ++ ++ /* resume */ ++ pr_info("emma is resumed\n"); ++ the_charger->ops = &em_x270_charger_ops; ++ ++ return 0; ++} ++ ++static struct pm_ops em_x270_pm_ops = { ++ .enter = em_x270_pm_enter, ++ .valid = pm_valid_only_mem, ++}; ++ ++static int em_x270_pm_init(void) ++{ ++ int ret; ++ pm_set_ops(&em_x270_pm_ops); ++ ++ set_irq_type(IRQ_GPIO(1), IRQT_RISING); ++ ++ ret = platform_driver_register(&em_x270_battery_driver); ++ if (ret) ++ return ret; ++ ++ ret = request_irq(IRQ_GPIO(1), em_x270_suspend_irq, IRQF_DISABLED, ++ "suspend button", 0); ++ if (ret) { ++ platform_driver_unregister(&em_x270_battery_driver); ++ } ++ ++ return ret; ++} ++ ++static void em_x270_pm_exit(void) ++{ ++ free_irq(IRQ_GPIO(1), em_x270_suspend_irq); ++ platform_driver_unregister(&em_x270_battery_driver); ++} ++ ++/* make sure I2C is already running */ ++late_initcall(em_x270_pm_init); ++module_exit(em_x270_pm_exit); ++ ++MODULE_DESCRIPTION("EM-X270 power manager"); ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c +index 3d0ad50..402d792 100644 +--- a/arch/arm/mach-pxa/em-x270.c ++++ b/arch/arm/mach-pxa/em-x270.c +@@ -18,20 +18,26 @@ + #include <linux/mtd/nand.h> + #include <linux/mtd/partitions.h> + +-#include <asm/mach-types.h> ++#include <linux/i2c.h> ++#include <linux/input.h> + ++#include <asm/mach-types.h> + #include <asm/mach/arch.h> + + #include <asm/arch/pxa-regs.h> + #include <asm/arch/pxafb.h> + #include <asm/arch/ohci.h> + #include <asm/arch/mmc.h> ++#include <asm/arch/pxa27x_keyboard.h> + #include <asm/arch/bitfield.h> + ++#include <asm/arch/udc.h> ++ ++#include <asm/arch/sharpsl.h> ++ + #include "generic.h" + + /* GPIO IRQ usage */ +-#define EM_X270_MMC_PD (105) + #define EM_X270_ETHIRQ IRQ_GPIO(41) + #define EM_X270_MMC_IRQ IRQ_GPIO(13) + +@@ -213,6 +219,68 @@ static struct platform_device em_x270_nand = { + } + }; + ++/* DA9030 */ ++static struct i2c_board_info em_x270_pmic_info = { ++ .driver_name = "da9030", ++ .type = "pmic", ++ .addr = 0x49, ++ .irq = IRQ_GPIO(0), ++}; ++ ++/* Keypad */ ++/* The Demo KeyPad has the following mapping: ++ * (0,0) (1,2) (2,1) ++ * (0,2) (1,1) (2,0) ++ * (0,1) (1,0) (2,2) ++ */ ++static struct pxa27x_keyboard_platform_data em_x270_kbd = { ++ .nr_rows = 3, ++ .nr_cols = 3, ++ .keycodes = { ++ { /* row 0 */ ++ -1, ++ -1, ++ KEY_LEFT, ++ }, ++ { /* row 1 */ ++ KEY_UP, ++ KEY_ENTER, ++ KEY_DOWN ++ }, ++ { /* row 2 */ ++ KEY_RIGHT, ++ -1, ++ -1 ++ }, ++ }, ++ .gpio_modes = { ++ (100 | GPIO_ALT_FN_1_IN), ++ (101 | GPIO_ALT_FN_1_IN), ++ (102 | GPIO_ALT_FN_1_IN), ++ (103 | GPIO_ALT_FN_2_OUT), ++ (104 | GPIO_ALT_FN_2_OUT), ++ (105 | GPIO_ALT_FN_2_OUT), ++ }, ++}; ++ ++static struct platform_device em_x270_pxa_keypad = { ++ .name = "pxa27x-keyboard", ++ .id = -1, ++ .dev = { ++ .platform_data = &em_x270_kbd, ++ }, ++}; ++ ++static struct platform_device em_x270_battery_device = { ++ .name = "em-x270-battery", ++ .id = -1, ++}; ++ ++static struct platform_device em_x270_led_device = { ++ .name = "em-x270-led", ++ .id = -1, ++}; ++ + /* platform devices */ + static struct platform_device *platform_devices[] __initdata = { + &em_x270_dm9k, +@@ -220,6 +288,9 @@ static struct platform_device *platform_devices[] __initdata = { + &em_x270_ts, + &em_x270_rtc, + &em_x270_nand, ++ &em_x270_pxa_keypad, ++ &em_x270_battery_device, ++ &em_x270_led_device, + }; + + +@@ -241,6 +312,33 @@ static struct pxaohci_platform_data em_x270_ohci_platform_data = { + .init = em_x270_ohci_init, + }; + ++/* ++ * USB Client (Gadget/UDC) ++ */ ++static void em_x270_udc_command(int cmd) ++{ ++ switch(cmd) { ++ case PXA2XX_UDC_CMD_CONNECT: ++ UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; ++ break; ++ case PXA2XX_UDC_CMD_DISCONNECT: ++/* UP2OCR = UP2OCR_HXS | UP2OCR_HXOE; */ ++ //UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; ++ break; ++ } ++} ++ ++static int em_x270_udc_detect(void) ++{ ++ return 1; ++} ++ ++static struct pxa2xx_udc_mach_info em_x270_udc_info __initdata = { ++ .udc_is_connected = em_x270_udc_detect, ++ .udc_command = em_x270_udc_command, ++}; ++ ++ + + static int em_x270_mci_init(struct device *dev, + irq_handler_t em_x270_detect_int, +@@ -256,9 +354,6 @@ static int em_x270_mci_init(struct device *dev, + pxa_gpio_mode(GPIO110_MMCDAT2_MD); + pxa_gpio_mode(GPIO111_MMCDAT3_MD); + +- /* EM-X270 uses GPIO13 as SD power enable */ +- pxa_gpio_mode(EM_X270_MMC_PD | GPIO_OUT); +- + err = request_irq(EM_X270_MMC_IRQ, em_x270_detect_int, + IRQF_DISABLED | IRQF_TRIGGER_FALLING, + "MMC card detect", data); +@@ -313,12 +408,19 @@ static struct pxafb_mach_info em_x270_lcd = { + .num_modes = 1, + .cmap_inverse = 0, + .cmap_static = 0, +- .lccr0 = LCCR0_PAS, +- .lccr3 = LCCR3_PixClkDiv(0x01) | LCCR3_Acb(0xff), ++ ++ .lccr0 = LCCR0_Act, ++ .lccr3 = LCCR3_PixFlEdg, + }; + + static void __init em_x270_init(void) + { ++ /* register PMIC */ ++ i2c_register_board_info(1, &em_x270_pmic_info, 1); ++ ++ /* setup DA9030 irq */ ++ set_irq_type(IRQ_GPIO(0), IRQT_FALLING); ++ + /* setup LCD */ + set_pxa_fb_info(&em_x270_lcd); + +@@ -329,6 +431,8 @@ static void __init em_x270_init(void) + pxa_set_mci_info(&em_x270_mci_platform_data); + pxa_set_ohci_info(&em_x270_ohci_platform_data); + ++ pxa_set_udc_info(&em_x270_udc_info); ++ + /* setup STUART GPIOs */ + pxa_gpio_mode(GPIO46_STRXD_MD); + pxa_gpio_mode(GPIO47_STTXD_MD); +@@ -341,9 +445,16 @@ static void __init em_x270_init(void) + + /* Setup interrupt for dm9000 */ + set_irq_type(EM_X270_ETHIRQ, IRQT_RISING); ++ ++ PCFR = 0x6; ++ PSLR = 0xff400000; ++ PMCR = 0x00000005; ++ PWER = 0x80000003; ++ PFER = 0x00000003; ++ PRER = 0x00000000; + } + +-MACHINE_START(EM_X270, "Compulab EM-x270") ++MACHINE_START(EM_X270, "Compulab EM-X270") + .boot_params = 0xa0000100, + .phys_io = 0x40000000, + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, +diff --git a/arch/arm/mach-pxa/pwr-i2c.c b/arch/arm/mach-pxa/pwr-i2c.c +new file mode 100644 +index 0000000..8a501c4 +--- /dev/null ++++ b/arch/arm/mach-pxa/pwr-i2c.c +@@ -0,0 +1,539 @@ ++/* ++ * (C) Copyrihgt 2007 CompuLab, Ltd. ++ * Mike Rapoport <mike@compulab.co.il> ++ * Adaptation of U-Boot I2C driver for PXA. ++ * ++ * (C) Copyright 2000 ++ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it ++ * ++ * (C) Copyright 2000 Sysgo Real-Time Solutions, GmbH <www.elinos.com> ++ * Marius Groeger <mgroeger@sysgo.de> ++ * ++ * (C) Copyright 2003 Pengutronix e.K. ++ * Robert Schwebel <r.schwebel@pengutronix.de> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ * Back ported to the 8xx platform (from the 8260 platform) by ++ * Murray.Jensen@cmst.csiro.au, 27-Jan-01. ++ */ ++ ++/* #define DEBUG */ ++ ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/module.h> ++#include <linux/jiffies.h> ++ ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++#include <asm/arch/pwr-i2c.h> ++ ++#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE) ++#define I2C_ISR_INIT 0x7FF ++ ++/* Shall the current transfer have a start/stop condition? */ ++#define I2C_COND_NORMAL 0 ++#define I2C_COND_START 1 ++#define I2C_COND_STOP 2 ++ ++/* Shall the current transfer be ack/nacked or being waited for it? */ ++#define I2C_ACKNAK_WAITACK 1 ++#define I2C_ACKNAK_SENDACK 2 ++#define I2C_ACKNAK_SENDNAK 4 ++ ++/* Specify who shall transfer the data (master or slave) */ ++#define I2C_READ 0 ++#define I2C_WRITE 1 ++ ++/* All transfers are described by this data structure */ ++struct i2c_msg { ++ u8 condition; ++ u8 acknack; ++ u8 direction; ++ u8 data; ++}; ++ ++/** ++ * pxa_pwr_i2c_transfer: - reset the host controller ++ * ++ */ ++/* static void pxa_pwr_i2c_reset(void) */ ++/* { */ ++/* int i; */ ++ ++/* /\* CKEN |= CKEN_PWRI2C; *\/ */ ++/* /\* PWRICR |= PCFR_PI2C_EN; *\/ */ ++ ++/* /\* /\\* delay 250ms *\\/ *\/ */ ++/* /\* for (i = 0; i < 250; i++) *\/ */ ++/* /\* udelay(1000); *\/ */ ++ ++/* /\* PWRICR &= ~(ICR_MA | ICR_START | ICR_STOP); *\/ */ ++/* /\* PWRICR |= ICR_UR; *\/ */ ++/* /\* PWRISR = 0x7ff; *\/ */ ++ ++/* /\* PWRICR &= ~ICR_UR; *\/ */ ++/* /\* PWRICR = ICR_GCD | ICR_SCLE; *\/ */ ++/* /\* PWRICR |= ICR_IUE; *\/ */ ++/* /\* PWRICR |= 0x8000; *\/ */ ++ ++/* /\* udelay(1000); *\/ */ ++ ++/* return; */ ++ ++/* PWRICR &= ~ICR_IUE; /\* disable unit *\/ */ ++/* PWRICR |= ICR_UR; /\* reset the unit *\/ */ ++/* udelay(100); */ ++/* PWRICR &= ~ICR_IUE; /\* disable unit *\/ */ ++ ++/* CKEN |= CKEN_PWRI2C; */ ++/* PCFR |= PCFR_PI2C_EN; */ ++ ++/* PWRICR = I2C_ICR_INIT; /\* set control register values *\/ */ ++/* PWRISR = I2C_ISR_INIT; /\* set clear interrupt bits *\/ */ ++/* PWRICR |= ICR_IUE; /\* enable unit *\/ */ ++/* udelay(100); */ ++/* } */ ++ ++static void pwr_i2c_abort() ++{ ++ unsigned long timeout = 250000; ++ unsigned long time = 0; ++ ++ while ((time < timeout) && (PWRIBMR & 0x1) == 0) { ++ unsigned long icr = PWRICR; ++ ++ icr &= ~ICR_START; ++ icr |= ICR_ACKNAK | ICR_STOP | ICR_TB; ++ ++ PWRICR = icr; ++ ++ udelay(1000); ++ time += 1000; ++ } ++ ++ PWRICR &= ~(ICR_MA | ICR_START | ICR_STOP); ++} ++ ++static void pxa_pwr_i2c_reset(void) ++{ ++ pr_debug("Resetting I2C Controller Unit\n"); ++ ++ /* abort any transfer currently under way */ ++ pwr_i2c_abort(); ++ ++ /* reset according to 9.8 */ ++ PWRICR = ICR_UR; ++ PWRISR = I2C_ISR_INIT; ++ PWRISR &= ~ICR_UR; ++ ++ /* set control register values */ ++ PWRICR = I2C_ICR_INIT; ++ ++ /* enable unit */ ++ PWRICR |= ICR_IUE; ++ udelay(100); ++ ++/* CKEN |= CKEN_PWRI2C; */ ++/* PCFR |= PCFR_PI2C_EN; */ ++} ++ ++/** ++ * i2c_isr_set_cleared: - wait until certain bits of the I2C status register ++ * are set and cleared ++ * ++ * @return: 1 in case of success, 0 means timeout (no match within 10 ms). ++ */ ++static int pxa_pwr_i2c_isr_set_cleared(unsigned long set_mask, ++ unsigned long cleared_mask) ++{ ++ int timeout = 10000; ++ ++ while (((PWRISR & set_mask) != set_mask) ++ || ((PWRISR & cleared_mask) != 0)) { ++ udelay(10); ++ if (timeout-- < 0) ++ return 0; ++ } ++ ++ return 1; ++} ++ ++/** ++ * pxa_pwr_i2c_transfer: - Transfer one byte over the i2c bus ++ * ++ * This function can tranfer a byte over the i2c bus in both directions. ++ * It is used by the public API functions. ++ * ++ * @return: 0: transfer successful ++ * -EINVAL: message is empty ++ * -ETIMEDOUT: transmit timeout ++ * -E: ACK missing ++ * -ETIMEDOUT: receive timeout ++ * -EINVAL: illegal parameters ++ * -EBUSY: bus is busy and couldn't be aquired ++ */ ++int pxa_pwr_i2c_transfer(struct i2c_msg *msg) ++{ ++ int ret; ++ ++ if (!msg) ++ goto transfer_error_msg_empty; ++ ++ switch (msg->direction) { ++ case I2C_WRITE: ++ /* check if bus is not busy */ ++/* if (!pxa_pwr_i2c_isr_set_cleared(0, (ISR_IBB | ISR_UB))) */ ++/* goto transfer_error_bus_busy; */ ++ ++ /* start transmission */ ++ PWRICR &= ~ICR_START; ++ PWRICR &= ~ICR_STOP; ++ PWRIDBR = msg->data; ++ if (msg->condition == I2C_COND_START) ++ PWRICR |= ICR_START; ++ if (msg->condition == I2C_COND_STOP) ++ PWRICR |= ICR_STOP; ++ if (msg->acknack == I2C_ACKNAK_SENDNAK) ++ PWRICR |= ICR_ACKNAK; ++ if (msg->acknack == I2C_ACKNAK_SENDACK) ++ PWRICR &= ~ICR_ACKNAK; ++ PWRICR &= ~ICR_ALDIE; ++ PWRICR |= ICR_TB; ++ ++ /* transmit register empty? */ ++ if (!pxa_pwr_i2c_isr_set_cleared(ISR_ITE, 0)) ++ goto transfer_error_transmit_timeout; ++ ++ /* clear 'transmit empty' state */ ++ PWRISR |= ISR_ITE; ++ ++ /* wait for ACK from slave */ ++ if (msg->acknack == I2C_ACKNAK_WAITACK) ++ if (!pxa_pwr_i2c_isr_set_cleared(0, ISR_ACKNAK)) ++ goto transfer_error_ack_missing; ++ break; ++ case I2C_READ: ++ /* check if bus is not busy */ ++/* if (!pxa_pwr_i2c_isr_set_cleared(0, ISR_IBB)) */ ++/* goto transfer_error_bus_busy; */ ++ ++ /* start receive */ ++ PWRICR &= ~ICR_START; ++ PWRICR &= ~ICR_STOP; ++ if (msg->condition == I2C_COND_START) ++ PWRICR |= ICR_START; ++ if (msg->condition == I2C_COND_STOP) ++ PWRICR |= ICR_STOP; ++ if (msg->acknack == I2C_ACKNAK_SENDNAK) ++ PWRICR |= ICR_ACKNAK; ++ if (msg->acknack == I2C_ACKNAK_SENDACK) ++ PWRICR &= ~ICR_ACKNAK; ++ PWRICR &= ~ICR_ALDIE; ++ PWRICR |= ICR_TB; ++ ++ /* receive register full? */ ++ if (!pxa_pwr_i2c_isr_set_cleared(ISR_IRF, 0)) ++ goto transfer_error_receive_timeout; ++ ++ msg->data = PWRIDBR; ++ ++ /* clear 'receive empty' state */ ++ PWRISR |= ISR_IRF; ++ ++ break; ++ default: ++ goto transfer_error_illegal_param; ++ ++ } ++ ++ return 0; ++ ++transfer_error_msg_empty: ++ pr_debug("%s: error: 'msg' is empty\n", __FUNCTION__); ++ ret = -1; ++ goto i2c_transfer_finish; ++ ++transfer_error_transmit_timeout: ++ pr_debug("%s: error: transmit timeout\n", __FUNCTION__); ++ ret = -2; ++ goto i2c_transfer_finish; ++ ++transfer_error_ack_missing: ++ pr_debug("%s: error: ACK missing\n", __FUNCTION__); ++ ret = -3; ++ goto i2c_transfer_finish; ++ ++transfer_error_receive_timeout: ++ pr_debug("%s: error: receive timeout\n", __FUNCTION__); ++ ret = -4; ++ goto i2c_transfer_finish; ++ ++transfer_error_illegal_param: ++ pr_debug("%s: error: illegal parameters\n", __FUNCTION__); ++ ret = -5; ++ goto i2c_transfer_finish; ++ ++transfer_error_bus_busy: ++ pr_debug("%s: error: bus is busy\n", __FUNCTION__); ++ ret = -6; ++ goto i2c_transfer_finish; ++ ++i2c_transfer_finish: ++ pr_debug("%s: ISR: 0x%04x\n", __FUNCTION__, ISR); ++ return ret; ++} ++ ++/* ------------------------------------------------------------------------ */ ++/* API Functions */ ++/* ------------------------------------------------------------------------ */ ++/** ++ * i2c_probe: - Test if a chip answers for a given i2c address ++ * ++ * @chip: address of the chip which is searched for ++ * @return: 0 if a chip was found, -1 otherwhise ++ */ ++int pxa_pwr_i2c_probe(u8 chip) ++{ ++ struct i2c_msg msg; ++ int ret; ++ ++ pxa_pwr_i2c_reset(); ++ ++ msg.condition = I2C_COND_START; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = (chip << 1) + 1; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ msg.condition = I2C_COND_STOP; ++ msg.acknack = I2C_ACKNAK_SENDNAK; ++ msg.direction = I2C_READ; ++ msg.data = 0x00; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ return 0; ++} ++ ++/** ++ * i2c_read: - Read multiple bytes from an i2c device ++ * ++ * The higher level routines take into account that this function is only ++ * called with len < page length of the device (see configuration file) ++ * ++ * @chip: address of the chip which is to be read ++ * @addr: i2c data address within the chip ++ * @alen: length of the i2c data address (1..2 bytes) ++ * @buffer: where to write the data ++ * @len: how much byte do we want to read ++ * @return: 0 in case of success ++ */ ++int pxa_pwr_i2c_read(u8 chip, uint addr, int alen, u8 * buffer, int len) ++{ ++ struct i2c_msg msg; ++ u8 addr_bytes[3]; /* lowest...highest byte of data address */ ++ int ret; ++ ++ pr_debug("%s(chip=0x%02x, addr=0x%02x, alen=0x%02x, len=0x%02x)\n", ++ __FUNCTION__, chip, addr, alen, len); ++ ++ pxa_pwr_i2c_reset(); ++ ++ /* dummy chip address write */ ++ pr_debug("%s: dummy chip address write\n", __FUNCTION__); ++ msg.condition = I2C_COND_START; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = (chip << 1); ++ msg.data &= 0xFE; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ /* ++ * send memory address bytes; ++ * alen defines how much bytes we have to send. ++ */ ++ /*addr &= ((1 << CFG_EEPROM_PAGE_WRITE_BITS)-1); */ ++ addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF); ++ addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF); ++ addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF); ++ ++ while (--alen >= 0) { ++ pr_debug("%s: send memory word address byte %1d\n", ++ __FUNCTION__, alen); ++ msg.condition = I2C_COND_NORMAL; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = addr_bytes[alen]; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ } ++ ++ /* start read sequence */ ++ pr_debug("%s: start read sequence\n", __FUNCTION__); ++ msg.condition = I2C_COND_START; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = (chip << 1); ++ msg.data |= 0x01; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ /* read bytes; send NACK at last byte */ ++ while (len--) { ++ if (len == 0) { ++ msg.condition = I2C_COND_STOP; ++ msg.acknack = I2C_ACKNAK_SENDNAK; ++ } else { ++ msg.condition = I2C_COND_NORMAL; ++ msg.acknack = I2C_ACKNAK_SENDACK; ++ } ++ ++ msg.direction = I2C_READ; ++ msg.data = 0x00; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ *buffer = msg.data; ++ pr_debug("%s: reading byte (0x%08x)=0x%02x\n", ++ __FUNCTION__, (unsigned int)buffer, *buffer); ++ buffer++; ++ } ++ ++ pxa_pwr_i2c_reset(); ++ return 0; ++} ++ ++/** ++ * i2c_write: - Write multiple bytes to an i2c device ++ * ++ * The higher level routines take into account that this function is only ++ * called with len < page length of the device (see configuration file) ++ * ++ * @chip: address of the chip which is to be written ++ * @addr: i2c data address within the chip ++ * @alen: length of the i2c data address (1..2 bytes) ++ * @buffer: where to find the data to be written ++ * @len: how much byte do we want to read ++ * @return: 0 in case of success ++ */ ++int pxa_pwr_i2c_write(u8 chip, uint addr, int alen, u8 * buffer, int len) ++{ ++ struct i2c_msg msg; ++ u8 addr_bytes[3]; /* lowest...highest byte of data address */ ++ int ret; ++ ++ pr_debug("%s(chip=0x%02x, addr=0x%02x, alen=0x%02x, len=0x%02x)\n", ++ __FUNCTION__, chip, addr, alen, len); ++ ++ pxa_pwr_i2c_reset(); ++ ++ /* chip address write */ ++ pr_debug("%s: chip address write\n", __FUNCTION__); ++ msg.condition = I2C_COND_START; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = (chip << 1); ++ msg.data &= 0xFE; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ ++ /* ++ * send memory address bytes; ++ * alen defines how much bytes we have to send. ++ */ ++ addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF); ++ addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF); ++ addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF); ++ ++ while (--alen >= 0) { ++ pr_debug("%s: send memory word address\n", __FUNCTION__); ++ msg.condition = I2C_COND_NORMAL; ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = addr_bytes[alen]; ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ } ++ ++ /* write bytes; send NACK at last byte */ ++ while (len--) { ++ pr_debug("%s: writing byte (0x%08x)=0x%02x\n", ++ __FUNCTION__, (unsigned int)buffer, *buffer); ++ ++ if (len == 0) ++ msg.condition = I2C_COND_STOP; ++ else ++ msg.condition = I2C_COND_NORMAL; ++ ++ msg.acknack = I2C_ACKNAK_WAITACK; ++ msg.direction = I2C_WRITE; ++ msg.data = *(buffer++); ++ ++ if ((ret = pxa_pwr_i2c_transfer(&msg))) ++ return ret; ++ } ++ ++ pxa_pwr_i2c_reset(); ++ return 0; ++} ++ ++/** ++ * pxa_pwr_i2c_reg_read: - Read single byte from an i2c device ++ * ++ * @chip: address of the chip which is to be read ++ * @reg: i2c data address within the chip ++ * @return: data in case of success, negative error code otherwise ++ */ ++s32 pxa_pwr_i2c_reg_read(u8 chip, u8 reg) ++{ ++ char buf; ++ int ret; ++ ++ pr_debug("%s(chip=0x%02x, reg=0x%02x)\n", __FUNCTION__, chip, reg); ++ ret = pxa_pwr_i2c_read(chip, reg, 1, &buf, 1); ++ if (ret == 0) ++ ret = buf; ++ ++ return ret; ++} ++ ++/** ++ * pxa_pwr_i2c_reg_write: - Write multiple bytes to an i2c device ++ * ++ * The higher level routines take into account that this function is only ++ * called with len < page length of the device (see configuration file) ++ * ++ * @chip: address of the chip which is to be written ++ * @reg: i2c data address within the chip ++ * @return: 0 in case of success, negative error code otherwise ++ */ ++s32 pxa_pwr_i2c_reg_write(u8 chip, u8 reg, u8 val) ++{ ++ pr_debug("%s(chip=0x%02x, reg=0x%02x, val=0x%02x)\n", ++ __FUNCTION__, chip, reg, val); ++ return pxa_pwr_i2c_write(chip, reg, 1, &val, 1); ++} ++ ++MODULE_DESCRIPTION("PXA Power I2C"); ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c +index 203371a..36b695f 100644 +--- a/arch/arm/mach-pxa/pxa27x.c ++++ b/arch/arm/mach-pxa/pxa27x.c +@@ -243,7 +243,11 @@ void pxa27x_cpu_pm_enter(suspend_state_t state) + case PM_SUSPEND_MEM: + /* set resume return address */ + PSPR = virt_to_phys(pxa_cpu_resume); +- pxa27x_cpu_suspend(PWRMODE_SLEEP); ++#ifdef CONFIG_MACH_EM_X270 ++ pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP); ++#else ++ pxa27x_cpu_suspend(PWRMODE_SLEEP); ++#endif + break; + } + } +diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c +index bae47e1..a16e532 100644 +--- a/arch/arm/mach-pxa/spitz.c ++++ b/arch/arm/mach-pxa/spitz.c +@@ -349,6 +349,32 @@ static struct pxamci_platform_data spitz_mci_platform_data = { + + + /* ++ * USB Client (Gadget/UDC) ++ */ ++static void spitz_udc_command(int cmd) ++{ ++ switch(cmd) { ++ case PXA2XX_UDC_CMD_CONNECT: ++ UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; ++ break; ++ case PXA2XX_UDC_CMD_DISCONNECT: ++ //UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; ++ break; ++ } ++} ++ ++static int spitz_udc_detect(void) ++{ ++ return 1; ++} ++ ++static struct pxa2xx_udc_mach_info spitz_udc_info __initdata = { ++ .udc_is_connected = spitz_udc_detect, ++ .udc_command = spitz_udc_command, ++}; ++ ++ ++/* + * USB Host (OHCI) + */ + static int spitz_ohci_init(struct device *dev) +@@ -499,6 +525,7 @@ static void __init common_init(void) + pxa_gpio_mode(SPITZ_GPIO_HSYNC | GPIO_IN); + + platform_add_devices(devices, ARRAY_SIZE(devices)); ++ pxa_set_udc_info(&spitz_udc_info); + pxa_set_mci_info(&spitz_mci_platform_data); + pxa_set_ohci_info(&spitz_ohci_platform_data); + pxa_set_ficp_info(&spitz_ficp_platform_data); +diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig +index 2e1c24f..f80f2b1 100644 +--- a/drivers/i2c/chips/Kconfig ++++ b/drivers/i2c/chips/Kconfig +@@ -163,4 +163,17 @@ config MENELAUS + and other features that are often used in portable devices like + cell phones and PDAs. + ++config DA9030 ++ tristate "Dialog Semiconductor DA9030 power management chip" ++ depends on EXPERIMENTAL && EMBEDDED ++ help ++ If you say yes here you get support for the Dialog ++ Semiconductor DA9030 power management chip. ++ This includes voltage regulators, lithium ion/polymer battery ++ charging, and other features that are often used in portable ++ devices like PDAs, cell phones and cameras. ++ ++ This driver can also be built as a module. If so, the module ++ will be called da9030. ++ + endmenu +diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile +index ca924e1..69f545c 100644 +--- a/drivers/i2c/chips/Makefile ++++ b/drivers/i2c/chips/Makefile +@@ -15,6 +15,7 @@ obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o + obj-$(CONFIG_TPS65010) += tps65010.o + obj-$(CONFIG_MENELAUS) += menelaus.o + obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o ++obj-$(CONFIG_DA9030) += da9030.o + + ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) + EXTRA_CFLAGS += -DDEBUG +diff --git a/drivers/i2c/chips/da9030.c b/drivers/i2c/chips/da9030.c +new file mode 100644 +index 0000000..9791272 +--- /dev/null ++++ b/drivers/i2c/chips/da9030.c +@@ -0,0 +1,1213 @@ ++/* ++ * Dialog Semiconductor DA9030 power management IC driver ++ * ++ * Copyright (C) 2007 Compulab, Ltd. ++ * Mike Rapoport <mike@compulab.co.il> ++ * ++ * Some parts based on menelaus.c: ++ * Copyright (C) 2004 Texas Instruments, Inc. ++ * Copyright (C) 2005, 2006 Nokia Corporation ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive for ++ * more details. ++ */ ++ ++#include <linux/module.h> ++#include <linux/ctype.h> ++#include <linux/uaccess.h> ++#include <linux/i2c.h> ++#include <linux/irq.h> ++#include <linux/interrupt.h> ++#include <linux/da9030.h> ++#include <linux/kernel_stat.h> ++#include <linux/random.h> ++#include <linux/mutex.h> ++ ++#include <linux/debugfs.h> ++#include <linux/seq_file.h> ++ ++#include "da9030.h" ++ ++#define DRIVER_NAME "da9030" ++ ++static unsigned short normal_i2c[] = { 0x49, I2C_CLIENT_END }; ++ ++I2C_CLIENT_INSMOD; ++ ++struct da9030 { ++ struct mutex lock; ++ struct i2c_client *client; ++ ++ struct work_struct event_work; ++ ++ /* there are 24 interrupts */ ++ void (*callbacks[24])(int event, void *data); ++ void *callbacks_data[24]; ++ ++ struct dentry *debug_file; ++}; ++ ++/* I hardly believe there can be more than 1 such chip in the system, ++ so keeping its global instance won't really hurt */ ++static struct da9030 *the_da9030; ++ ++unsigned char defined_regs[] = { ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, ++ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, ++ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, ++ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, ++ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, ++ 0x50, 0x51, ++ 0x60, 0x61, 0x62, 0x63, ++ 0x80, 0x81, ++ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, ++ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, ++ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, ++}; ++ ++static inline int is_reg_valid(u32 reg) ++{ ++ int i; ++ for (i = 0; i < ARRAY_SIZE(defined_regs); i++) ++ if (reg == defined_regs[i]) ++ return 1; ++ ++ return 0; ++} ++ ++s32 da9030_get_reg(u32 reg) ++{ ++ if (!is_reg_valid(reg)) ++ return -EINVAL; ++ ++ return i2c_smbus_read_byte_data(the_da9030->client, reg); ++} ++EXPORT_SYMBOL(da9030_get_reg); ++ ++s32 da9030_set_reg(u32 reg, u8 val) ++{ ++ if (!is_reg_valid(reg)) ++ return -EINVAL; ++ ++ return i2c_smbus_write_byte_data(the_da9030->client, reg, val); ++} ++EXPORT_SYMBOL(da9030_set_reg); ++ ++static s32 da9030_update_reg_bits(u32 reg, int bits, int shift, int val) ++{ ++ int ret; ++ int new_val; ++ ++ mutex_lock(&the_da9030->lock); ++ ret = da9030_get_reg(reg); ++ if (ret < 0) ++ goto out; ++ ++ new_val = reg & ~(((1 << bits) - 1) << shift); ++ new_val |= (val << shift); ++ ++ ret = da9030_set_reg(reg, new_val); ++ mutex_unlock(&the_da9030->lock); ++ ++out: ++ return ret; ++} ++ ++int da9030_get_status(void) ++{ ++ s32 ret; ++ ++ mutex_lock(&the_da9030->lock); ++ ret = da9030_get_reg(STATUS); ++ mutex_unlock(&the_da9030->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL(da9030_get_status); ++ ++int da9030_get_fault_log(void) ++{ ++ s32 ret; ++ ++ mutex_lock(&the_da9030->lock); ++ ret = da9030_get_reg(FAULT_LOG); ++ mutex_unlock(&the_da9030->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL(da9030_get_fault_log); ++ ++void da9030_read_adc(struct da9030_adc_res *adc) ++{ ++ mutex_lock(&the_da9030->lock); ++ ++ adc->vbat_res = da9030_get_reg(VBAT_RES); ++ adc->vbatmin_res = da9030_get_reg(VBATMIN_RES); ++ adc->vbatmintxon = da9030_get_reg(VBATMINTXON_RES); ++ adc->ichmax_res = da9030_get_reg(ICHMAX_RES); ++ adc->ichmin_res = da9030_get_reg(ICHMIN_RES); ++ adc->ichaverage_res = da9030_get_reg(ICHAVERAGE_RES); ++ adc->vchmax_res = da9030_get_reg(VCHMAX_RES); ++ adc->vchmin_res = da9030_get_reg(VCHMIN_RES); ++ adc->tbat_res = da9030_get_reg(TBAT_RES); ++ adc->adc_in4_res = da9030_get_reg(ADC_IN4_RES); ++ adc->adc_in5_res = da9030_get_reg(ADC_IN5_RES); ++ ++ mutex_unlock(&the_da9030->lock); ++} ++EXPORT_SYMBOL(da9030_read_adc); ++ ++void da9030_enable_adc(void) ++{ ++ /* enable automatic A/D measurements */ ++ mutex_lock(&the_da9030->lock); ++ ++ da9030_set_reg(ADC_MAN_CONTROL, ++ ADC_LDO_INT_ENABLE | ADC_TBATREF_ENABLE); ++ da9030_set_reg(ADC_MAN_CONTROL_1, ++ ADC_LDO_INT_ENABLE | ADC_TBATREF_ENABLE); ++ da9030_set_reg(ADC_AUTO_CONTROL_1, ++ ADC_TBAT_ENABLE | ADC_VBAT_IN_TXON | ADC_VCH_ENABLE | ++ ADC_ICH_ENABLE | ADC_VBAT_ENABLE | ++ ADC_AUTO_SLEEP_ENABLE); ++ da9030_set_reg(ADC_AUTO_CONTROL, ++ ADC_TBAT_ENABLE | ADC_VBAT_IN_TXON | ADC_VCH_ENABLE | ++ ADC_ICH_ENABLE | ADC_VBAT_ENABLE | ++ ADC_AUTO_SLEEP_ENABLE); ++ ++ mutex_unlock(&the_da9030->lock); ++} ++EXPORT_SYMBOL(da9030_enable_adc); ++ ++void da9030_set_wled(int on, unsigned int brightness) ++{ ++ u8 val; ++ ++ mutex_lock(&the_da9030->lock); ++ ++ if (on) ++ val = WLED_CP_ENABLE | (brightness & 0x7); ++ else ++ val = da9030_get_reg(WLED_CONTROL) & ~WLED_CP_ENABLE; ++ ++ da9030_set_reg(WLED_CONTROL, val); ++ ++ mutex_unlock(&the_da9030->lock); ++} ++EXPORT_SYMBOL(da9030_set_wled); ++ ++int da9030_set_charger(int on, unsigned int mA, unsigned int mV) ++{ ++ int ret; ++ u8 val = 0; ++ if (on) { ++ if (mA >= 1500 || mV < 4000 || mV > 4350) ++ return -EINVAL; ++ ++ val = CHRG_CHARGER_ENABLE; ++ val |= (mA / 100) << 3; ++ val |= (mV - 4000) / 50; ++ } ++ ++ mutex_lock(&the_da9030->lock); ++ ret = da9030_set_reg(CHARGE_CONTROL, val); ++ mutex_unlock(&the_da9030->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL(da9030_set_charger); ++ ++void da9030_get_charger(int *on, unsigned int *mA, unsigned int *mV) ++{ ++ s32 val; ++ ++ mutex_lock(&the_da9030->lock); ++ ++ val = da9030_get_reg(CHARGE_CONTROL); ++ ++ mutex_unlock(&the_da9030->lock); ++ ++ if (on) ++ *on = (val & CHRG_CHARGER_ENABLE) ? 1 : 0; ++ ++ if (mA) ++ *mA = ((val >> 3) & 0xf) * 100; ++ ++ if (mV) ++ *mV = (val & 0x7) * 50 + 4000; ++} ++EXPORT_SYMBOL(da9030_get_charger); ++ ++int da9030_set_led(int led, int on, ++ enum da9030_led_rate rate, ++ enum da9030_led_duty_cycle duty, ++ enum da9030_led_pwm_chop pwm_chop) ++{ ++ int reg; ++ int ret; ++ ++ u8 val = 0; ++ ++ if (led > 4) ++ return -EINVAL; ++ ++ reg = LED_1_CONTROL + led; ++ if (on) { ++ val = LED_ENABLE; ++ val |= (rate & 0x3) << 5; ++ val |= (duty & 0x3) << 3; ++ val |= (pwm_chop & 0x7); ++ } ++ ++ mutex_lock(&the_da9030->lock); ++ ret = da9030_set_reg(reg, val); ++ mutex_unlock(&the_da9030->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL(da9030_set_led); ++ ++void da9030_set_thresholds(unsigned int tbathighp, unsigned int tbathighn, ++ unsigned int tbatlow, unsigned int vbatmon) ++{ ++ mutex_lock(&the_da9030->lock); ++ ++ da9030_set_reg(TBATHIGHP, tbathighp); ++ da9030_set_reg(TBATHIGHN, tbathighn); ++ da9030_set_reg(TBATLOW, tbatlow); ++ da9030_set_reg(VBATMONTXON, vbatmon); ++ da9030_set_reg(VBATMON, vbatmon); ++ ++ da9030_set_reg(TBATHIGHP_1, tbathighp); ++ da9030_set_reg(TBATHIGHN_1, tbathighn); ++ da9030_set_reg(TBATLOW_1, tbatlow); ++ da9030_set_reg(VBATMONTXMON_1, vbatmon); ++ da9030_set_reg(VBATMON_1, vbatmon); ++ ++ mutex_unlock(&the_da9030->lock); ++} ++EXPORT_SYMBOL(da9030_set_thresholds); ++ ++struct da9030_vtg_value { ++ u16 vtg; ++ u16 val; ++}; ++ ++struct da9030_vtg_value da9030_vtg_1V8_3V2[] = { ++ {1800, 0x0}, ++ {1900, 0x1}, ++ {2000, 0x2}, ++ {2100, 0x3}, ++ {2200, 0x4}, ++ {2300, 0x5}, ++ {2400, 0x6}, ++ {2500, 0x7}, ++ {2600, 0x8}, ++ {2700, 0x9}, ++ {2800, 0xa}, ++ {2900, 0xb}, ++ {3000, 0xc}, ++ {3100, 0xd}, ++ {3200, 0xe}, ++ {3200, 0xf}, ++}; ++ ++struct da9030_vtg_value da9030_vtg_1V1_2V65[] = { ++ {1100, 0x0}, ++ {1150, 0x1}, ++ {1200, 0x2}, ++ {1250, 0x3}, ++ {1300, 0x4}, ++ {1350, 0x5}, ++ {1400, 0x6}, ++ {1450, 0x7}, ++ {1500, 0x8}, ++ {1550, 0x9}, ++ {1600, 0xa}, ++ {1650, 0xb}, ++ {1700, 0xc}, ++ {1750, 0xd}, ++ {1800, 0xe}, ++ {1850, 0xf}, ++ {1900, 0x10}, ++ {1950, 0x11}, ++ {2000, 0x12}, ++ {2050, 0x13}, ++ {2100, 0x14}, ++ {2150, 0x15}, ++ {2200, 0x16}, ++ {2250, 0x17}, ++ {2300, 0x18}, ++ {2350, 0x19}, ++ {2400, 0x1a}, ++ {2450, 0x1b}, ++ {2500, 0x1c}, ++ {2550, 0x1d}, ++ {2600, 0x1e}, ++ {2650, 0x1f}, ++}; ++ ++struct da9030_vtg_value da9030_vtg_2V76_2V94[] = { ++ {2760, 0x7}, ++ {2790, 0x6}, ++ {2820, 0x5}, ++ {2850, 0x4}, ++ {2850, 0x3}, ++ {2880, 0x1}, ++ {2910, 0x2}, ++ {2940, 0x3}, ++}; ++ ++struct da9030_vtg_value da9030_vtg_0V85_1V625[] = { ++ {850, 0x0}, ++ {875, 0x1}, ++ {900, 0x2}, ++ {925, 0x3}, ++ {950, 0x4}, ++ {975, 0x5}, ++ {1000, 0x6}, ++ {1025, 0x7}, ++ {1050, 0x8}, ++ {1075, 0x9}, ++ {1100, 0xa}, ++ {1125, 0xb}, ++ {1150, 0xc}, ++ {1175, 0xd}, ++ {1200, 0xe}, ++ {1225, 0xf}, ++ {1250, 0x10}, ++ {1275, 0x11}, ++ {1300, 0x12}, ++ {1325, 0x13}, ++ {1350, 0x14}, ++ {1375, 0x15}, ++ {1400, 0x16}, ++ {1425, 0x17}, ++ {1450, 0x18}, ++ {1475, 0x19}, ++ {1500, 0x1a}, ++ {1525, 0x1b}, ++ {1550, 0x1c}, ++ {1575, 0x1d}, ++ {1600, 0x1e}, ++ {1625, 0x1f}, ++}; ++ ++struct ldo_param { ++ u8 reg; ++ u8 shift; ++ u8 bits; ++}; ++ ++struct da9030_ldo { ++ const char *name; ++ ++ struct ldo_param vtg; ++ struct ldo_param sleep; ++ struct ldo_param lock; ++ ++ /* several LDOs have two enable/disable bits */ ++ struct ldo_param enable[2]; ++ ++ struct da9030_vtg_value *values; ++ int values_count; ++}; ++ ++static struct da9030_ldo da9030_ldos[] = { ++ [0] = { ++ .name = "LDO1", ++ .vtg = { ++ .reg = LDO_1, ++ .shift = 0, ++ .bits = 5, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 1, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = LDO_1, ++ .shift = 5, ++ .bits = 2, ++ }, ++ .lock = { ++ .reg = REG_SLEEP_CONTROL1, ++ .shift = 0, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [1] = { ++ .name = "LDO2", ++ .vtg = { ++ .reg = LDO_2_3, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 2, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL1, ++ .shift = 2, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [2] = { ++ .name = "LDO3", ++ .vtg = { ++ .reg = LDO_2_3, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 3, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL1, ++ .shift = 4, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [3] = { ++ .name = "LDO4", ++ .vtg = { ++ .reg = LDO_4_5, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 4, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL1, ++ .shift = 6, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [4] = { ++ .name = "LDO5", ++ .vtg = { ++ .reg = LDO_4_5, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 5, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL2, ++ .shift = 0, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [5] = { ++ .name = "LDO6", ++ .vtg = { ++ .reg = LDO_6_SIMCP, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 6, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [6] = { ++ .name = "LDO7", ++ .vtg = { ++ .reg = LDO_7_8, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_97, ++ .shift = 7, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL2, ++ .shift = 2, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [7] = { ++ .name = "LDO8", ++ .vtg = { ++ .reg = LDO_7_8, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_2_98, ++ .shift = 0, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL2, ++ .shift = 4, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [8] = { ++ .name = "LDO9", ++ .vtg = { ++ .reg = LDO_9_12, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_2_98, ++ .shift = 1, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL2, ++ .shift = 6, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [9] = { ++ .name = "LDO10", ++ .vtg = { ++ .reg = LDO_10_11, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 1, ++ .bits = 1, ++ }, ++ .enable[1] = { ++ .reg = REG_CONTROL_2_98, ++ .shift = 2, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [10] = { ++ .name = "LDO11", ++ .vtg = { ++ .reg = LDO_10_11, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 2, ++ .bits = 1, ++ }, ++ .enable[1] = { ++ .reg = REG_CONTROL_2_98, ++ .shift = 3, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [11] = { ++ .name = "LDO12", ++ .vtg = { ++ .reg = LDO_9_12, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_2_98, ++ .shift = 4, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = REG_SLEEP_CONTROL3, ++ .shift = 0, ++ .bits = 2, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [12] = { ++ .name = "LDO13", ++ .vtg = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 3, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = NULL, ++ .values_count = 0, ++ }, ++ [13] = { ++ .name = "LDO14", ++ .vtg = { ++ .reg = LDO_14_16, ++ .shift = 0, ++ .bits = 3, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, /* FIXME: or 2_98? */ ++ .shift = 4, ++ .bits = 1, ++ }, ++ .enable[1] = { ++ .reg = REG_CONTROL_2_98, /* FIXME: or 2_98? */ ++ .shift = 5, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_2V76_2V94, ++ .values_count = ARRAY_SIZE(da9030_vtg_2V76_2V94), ++ }, ++ [14] = { ++ .name = "LDO15", ++ .vtg = { ++ .reg = LDO_15, ++ .shift = 0, ++ .bits = 5, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 5, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .lock = { ++ .reg = LDO_15, ++ .shift = 5, ++ .bits = 3, ++ }, ++ .values = da9030_vtg_1V1_2V65, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V1_2V65), ++ }, ++ [15] = { ++ .name = "LDO16", ++ .vtg = { ++ .reg = LDO_14_16, ++ .shift = 3, ++ .bits = 5, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 6, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V1_2V65, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V1_2V65), ++ }, ++ [16] = { ++ .name = "LDO17", ++ .vtg = { ++ .reg = LDO_17_SIMCP0, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_1_17, ++ .shift = 7, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [17] = { ++ .name = "LDO18", ++ .vtg = { ++ .reg = LDO_18_19, ++ .shift = 0, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_2_18, ++ .shift = 2, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++ [18] = { ++ .name = "LDO19", ++ .vtg = { ++ .reg = LDO_18_19, ++ .shift = 4, ++ .bits = 4, ++ }, ++ .enable[0] = { ++ .reg = REG_CONTROL_2_18, ++ .shift = 1, ++ .bits = 1, ++ }, ++ .sleep = { ++ .reg = 0, ++ .shift = 0, ++ .bits = 0, ++ }, ++ .values = da9030_vtg_1V8_3V2, ++ .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), ++ }, ++}; ++ ++static int da9030_get_vtg_value(int vtg, const struct da9030_vtg_value *tbl, ++ int n) ++{ ++ int i; ++ ++ for (i = 0; i < n; i++, tbl++) ++ if (tbl->vtg == vtg) ++ return tbl->val; ++ return -EINVAL; ++} ++ ++static int da9030_set_ldo_volt(struct da9030_ldo *ldo, unsigned int mV) ++{ ++ int val; ++ ++ val = da9030_get_vtg_value(mV, ldo->values, ldo->values_count); ++ if (val < 0) ++ return val; ++ ++ return da9030_update_reg_bits(ldo->vtg.reg, ldo->vtg.bits, ++ ldo->vtg.shift, val); ++} ++ ++static int da9030_enable_ldo(struct da9030_ldo *ldo, int enable) ++{ ++ int ret; ++ ++ ret = da9030_update_reg_bits(ldo->enable[0].reg, ldo->enable[1].bits, ++ ldo->enable[0].shift, enable); ++ ++ if (ret < 0) ++ return ret; ++ ++ if (unlikely(ldo->enable[1].reg != 0)) ++ ret = da9030_update_reg_bits(ldo->enable[1].reg, ++ ldo->enable[1].bits, ++ ldo->enable[1].shift, enable); ++ ++ return ret; ++} ++ ++static int da9030_set_ldo_sleep(struct da9030_ldo *ldo, ++ enum da9030_ldo_sleep_mode sleep_mode) ++{ ++ return da9030_update_reg_bits(ldo->sleep.reg, ldo->sleep.bits, ++ ldo->sleep.shift, sleep_mode); ++} ++ ++int da9030_set_ldo(int ldo_num, int on, unsigned int mV, ++ enum da9030_ldo_sleep_mode sleep_mode) ++{ ++ struct da9030_ldo *ldo; ++ int ret; ++ ++ if (ldo_num < 0 || ldo_num > ARRAY_SIZE(da9030_ldos)) ++ return -EINVAL; ++ ++ ldo = &da9030_ldos[ldo_num]; ++ ++ ret = da9030_set_ldo_volt(ldo, mV); ++ if (ret < 0) ++ return ret; ++ ++ ret = da9030_enable_ldo(ldo, on); ++ if (ret < 0) ++ return ret; ++ ++ ret = da9030_set_ldo_sleep(ldo, sleep_mode); ++ if (ret < 0) ++ return ret; ++ ++ return 0; ++} ++EXPORT_SYMBOL(da9030_set_ldo); ++ ++int da9030_set_buck(int buck, int on, unsigned int mV, int flags) ++{ ++ /* FIXME: implement */ ++ return 0; ++} ++EXPORT_SYMBOL(da9030_set_buck); ++ ++static void da9030_disable_irq(unsigned int irq) ++{ ++ int reg, val; ++ ++ if (irq < 8) { ++ reg = IRQ_MASK_A; ++ val = 1 << irq; ++ } else if (irq < 16) { ++ reg = IRQ_MASK_B; ++ val = 1 << (irq - 8); ++ } else { ++ reg = IRQ_MASK_C; ++ val = 1 << (irq - 16); ++ } ++ ++ i2c_smbus_write_byte_data( ++ the_da9030->client, reg, ++ i2c_smbus_read_byte_data(the_da9030->client, reg) | val); ++} ++ ++static void da9030_enable_irq(unsigned int irq) ++{ ++ int reg, val; ++ ++ if (irq < 8) { ++ reg = IRQ_MASK_A; ++ val = 1 << irq; ++ } else if (irq < 16) { ++ reg = IRQ_MASK_B; ++ val = 1 << (irq - 8); ++ } else { ++ reg = IRQ_MASK_C; ++ val = 1 << (irq - 16); ++ } ++ ++ i2c_smbus_write_byte_data( ++ the_da9030->client, reg, ++ i2c_smbus_read_byte_data(the_da9030->client, reg) & ~val); ++} ++ ++int da9030_register_callback(int event, ++ void (*callback)(int event, void *data), ++ void *data) ++{ ++ int ret; ++ ++ if (event < 0 || event > 23) ++ return -EINVAL; ++ ++ mutex_lock(&the_da9030->lock); ++ if (the_da9030->callbacks[event]) ++ ret = -EBUSY; ++ else { ++ the_da9030->callbacks[event] = callback; ++ the_da9030->callbacks_data[event] = data; ++ da9030_enable_irq(event); ++ ret = 0; ++ } ++ mutex_unlock(&the_da9030->lock); ++ ++ return ret; ++} ++EXPORT_SYMBOL(da9030_register_callback); ++ ++void da9030_unregister_callback(int event) ++{ ++ mutex_lock(&the_da9030->lock); ++ ++ da9030_disable_irq(event); ++ the_da9030->callbacks[event] = NULL; ++ the_da9030->callbacks_data[event] = 0; ++ ++ mutex_unlock(&the_da9030->lock); ++} ++EXPORT_SYMBOL(da9030_unregister_callback); ++ ++#ifdef CONFIG_DEBUG_FS ++#define MAX_BUF 256 ++ ++static int da9030_debug_show(struct seq_file *s, void *data) ++{ ++ int i, res = 0; ++ struct da9030 *da9030 = s->private; ++ struct i2c_client *client = da9030->client; ++ ++ seq_printf(s, "DA9030 state: da = %p, cl = %p, s->private = %p\n", ++ da9030, client, s->private); ++ ++ for (i = 0; i < ARRAY_SIZE(defined_regs); i++) { ++ res = i2c_smbus_read_byte_data(client, defined_regs[i]); ++ seq_printf(s, "%02x %x\n", defined_regs[i], res); ++ } ++ return 0; ++} ++ ++static int da9030_debug_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, da9030_debug_show, inode->i_private); ++} ++ ++ssize_t da9030_debug_write(struct file *f, const char __user *buf, size_t len, ++ loff_t *off) ++{ ++ char buffer[MAX_BUF]; ++ int reg, val; ++ char *endp; ++ struct da9030 *da9030 = ((struct seq_file *)f->private_data)->private; ++ struct i2c_client *client = da9030->client; ++ ++ if (len > MAX_BUF) { ++ printk(KERN_INFO "%s: large buffer\n", __FUNCTION__); ++ len = MAX_BUF; ++ } ++ ++ if (copy_from_user(buffer, buf, len)) { ++ printk(KERN_INFO "%s: copy_from_user failed\n", __FUNCTION__); ++ return -EFAULT; ++ } ++ buffer[len] = '\0'; ++ ++ reg = simple_strtoul(buffer, &endp, 0); ++ while (endp && isspace(*endp)) ++ endp++; ++ ++ val = simple_strtoul(endp, 0, 0); ++ ++ i2c_smbus_write_byte_data(client, reg, val); ++ ++ return len; ++} ++ ++static const struct file_operations debug_fops = { ++ .open = da9030_debug_open, ++ .read = seq_read, ++ .write = da9030_debug_write, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static struct dentry *da9030_create_debugfs(struct da9030 *da9030) ++{ ++ da9030->debug_file = debugfs_create_file("da9030", 0666, 0, da9030, ++ &debug_fops); ++ return da9030->debug_file; ++} ++ ++static void da9030_remove_debugfs(struct da9030 *da9030) ++{ ++ debugfs_remove(da9030->debug_file); ++} ++#else ++#define da9030_create_debugfs(x) NULL ++#define da9030_remove_debugfs(x) do {} while (0) ++#endif ++ ++static irqreturn_t da9030_irq(int irq, void *_da9030) ++{ ++ struct da9030 *da9030 = _da9030; ++ ++ (void)schedule_work(&da9030->event_work); ++ ++ return IRQ_HANDLED; ++} ++ ++static void da9030_irq_worker(struct work_struct *work) ++{ ++ struct da9030 *da9030 = container_of(work, struct da9030, event_work); ++ void (*callback)(int event, void *data); ++ u32 pending = 0; ++ u32 mask = 0; ++ int i; ++ ++ while (1) { ++ pending = (i2c_smbus_read_byte_data(da9030->client, ++ EVENT_A)) | ++ ((i2c_smbus_read_byte_data(da9030->client, ++ EVENT_B)) << 8) | ++ ((i2c_smbus_read_byte_data(da9030->client, ++ EVENT_C)) << 16); ++ ++ mask = (i2c_smbus_read_byte_data(da9030->client, ++ IRQ_MASK_A)) | ++ ((i2c_smbus_read_byte_data(da9030->client, ++ IRQ_MASK_B)) << 8) | ++ ((i2c_smbus_read_byte_data(da9030->client, ++ IRQ_MASK_C)) << 16); ++ pending &= ~mask; ++ ++ if (!pending) ++ return; ++ ++ while (pending) { ++ i = __ffs(pending); ++ callback = da9030->callbacks[i]; ++ if (callback) ++ callback(i, da9030->callbacks_data[i]); ++ pending &= ~(1 << i); ++ } ++ } ++} ++ ++static inline void da9030_disable_interrupts(struct da9030 *da9030) ++{ ++ /* clear pending interruts */ ++ (void)i2c_smbus_read_byte_data(da9030->client, EVENT_A); ++ (void)i2c_smbus_read_byte_data(da9030->client, EVENT_B); ++ (void)i2c_smbus_read_byte_data(da9030->client, EVENT_C); ++ ++ /* disable interrupts */ ++ i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_A, 0xff); ++ i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_B, 0xff); ++ i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_C, 0xff); ++} ++ ++static int da9030_probe(struct i2c_client *client) ++{ ++ int ret; ++ struct da9030 *da9030; ++ ++ if (the_da9030) { ++ dev_dbg(&client->dev, "only one %s for now\n", ++ DRIVER_NAME); ++ return -ENODEV; ++ } ++ ++ ret = i2c_smbus_read_byte_data(client, CHIP_ID); ++ ++ dev_info(&client->dev, "initialized chip revision %x\n", ret); ++ ++ da9030 = kzalloc(sizeof(struct da9030), GFP_KERNEL); ++ if (da9030 == NULL) { ++ dev_err(&client->dev, "insufficient memory\n"); ++ return -ENOMEM; ++ } ++ the_da9030 = da9030; ++ da9030->client = client; ++ ++ mutex_init(&the_da9030->lock); ++ ++ da9030_disable_interrupts(da9030); ++ INIT_WORK(&da9030->event_work, da9030_irq_worker); ++ ++ ret = request_irq(client->irq, da9030_irq, ++ IRQF_DISABLED, DRIVER_NAME, da9030); ++ ++ if (ret) { ++ kfree(da9030); ++ dev_err(&client->dev, ++ "failed to allocate irq %d\n", ++ client->irq); ++ return ret; ++ } ++ ++ i2c_set_clientdata(client, da9030); ++ ++ da9030->debug_file = da9030_create_debugfs(da9030); ++ ++ return 0; ++} ++ ++/* static int da9030_detach_adapter(struct i2c_adapter *a) */ ++static int da9030_remove(struct i2c_client *client) ++{ ++ struct da9030 *da9030 = i2c_get_clientdata(client); ++ ++ da9030_remove_debugfs(da9030); ++ ++ free_irq(da9030->client->irq, da9030); ++ kfree(da9030); ++ i2c_set_clientdata(client, NULL); ++ the_da9030 = NULL; ++ ++ return 0; ++} ++ ++static struct i2c_driver da9030_driver = { ++ .driver = { ++ .name = "da9030", ++ .owner = THIS_MODULE, ++ }, ++ ++ .probe = da9030_probe, ++ .remove = da9030_remove, ++}; ++ ++static int da9030_init(void) ++{ ++ i2c_add_driver(&da9030_driver); ++ return 0; ++} ++ ++static void da9030_exit(void) ++{ ++ i2c_del_driver(&da9030_driver); ++} ++ ++/* NOTE: this MUST be initialized before the other parts of the system ++ * that rely on it ... but after the i2c bus on which this relies. ++ * That is, much earlier than on PC-type systems, which don't often use ++ * I2C as a core system bus. ++ */ ++subsys_initcall(da9030_init); ++module_exit(da9030_exit); ++ ++MODULE_DESCRIPTION("DA9030 power manager driver"); ++MODULE_AUTHOR("Mike Rapoport, Compulab"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/i2c/chips/da9030.h b/drivers/i2c/chips/da9030.h +new file mode 100644 +index 0000000..4163156 +--- /dev/null ++++ b/drivers/i2c/chips/da9030.h +@@ -0,0 +1,282 @@ ++/* DA9030 Register definintions */ ++ ++#define CHIP_ID 0x00 ++ ++#define EVENT_A 0x01 ++#define EVENT_A_CHIOVER (1 << 7) ++#define EVENT_A_VBAT_MON_TXON (1 << 6) ++#define EVENT_A_VBAT_MON (1 << 5) ++#define EVENT_A_TBAT (1 << 4) ++#define EVENT_A_CHDET (1 << 3) ++#define EVENT_A_EXTON (1 << 2) ++#define EVENT_A_PWREN1 (1 << 1) ++#define EVENT_A_ONKEY_N (1 << 0) ++ ++#define EVENT_B 0x02 ++#define EVENT_B_WDOG_INT (1 << 7) ++#define EVENT_B_SRP_DETECT (1 << 6) ++#define EVENT_B_SESSION_VALID (1 << 5) ++#define EVENT_B_VBUS_VALID_4_0 (1 << 4) ++#define EVENT_B_VBUS_VALID_4_4 (1 << 3) ++#define EVENT_B_ADC_READY (1 << 2) ++#define EVENT_B_CCTO (1 << 1) ++#define EVENT_B_TCTO (1 << 0) ++ ++#define EVENT_C 0x03 ++#define EVENT_C_ADC_IN5 (1 << 7) ++#define EVENT_C_ADC_IN4 (1 << 6) ++#define EVENT_C_BUCK2 (1 << 5) ++#define EVENT_C_LDO19 (1 << 4) ++#define EVENT_C_LDO18 (1 << 3) ++#define EVENT_C_LDO17 (1 << 2) ++#define EVENT_C_LDO16 (1 << 1) ++#define EVENT_C_LDO15 (1 << 0) ++ ++#define STATUS 0x04 ++#define STATUS_MCLK_DETECT (1 << 7) ++#define STATUS_VBAT_MON_TXON (1 << 6) ++#define STATUS_VBAT_MON (1 << 5) ++#define STATUS_TBAT (1 << 4) ++#define STATUS_CHDET (1 << 3) ++#define STATUS_EXTON (1 << 2) ++#define STATUS_PWREN1 (1 << 1) ++#define STATUS_ONKEY_N (1 << 0) ++ ++#define IRQ_MASK_A 0x05 ++#define IRQ_MASK_A_CHIOVER (1 << 7) ++#define IRQ_MASK_A_VBAT_MON_TXON (1 << 6) ++#define IRQ_MASK_A_VBAT_MON (1 << 5) ++#define IRQ_MASK_A_TBAT (1 << 4) ++#define IRQ_MASK_A_CHDET (1 << 3) ++#define IRQ_MASK_A_EXTON (1 << 2) ++#define IRQ_MASK_A_PWREN1 (1 << 1) ++#define IRQ_MASK_A_ONKEY_N (1 << 0) ++ ++#define IRQ_MASK_B 0x06 ++#define IRQ_MASK_B_WDOG_INT (1 << 7) ++#define IRQ_MASK_B_SRP_DETECT (1 << 6) ++#define IRQ_MASK_B_SESSION_VALID (1 << 5) ++#define IRQ_MASK_B_VBUS_VALID_4_0 (1 << 4) ++#define IRQ_MASK_B_VBUS_VALID_4_4 (1 << 3) ++#define IRQ_MASK_B_ADC_READY (1 << 2) ++#define IRQ_MASK_B_CCTO (1 << 1) ++#define IRQ_MASK_B_TCTO (1 << 0) ++ ++#define IRQ_MASK_C 0x07 ++#define IRQ_MASK_C_ADC_IN5 (1 << 7) ++#define IRQ_MASK_C_ADC_IN4 (1 << 6) ++#define IRQ_MASK_C_BUCK2 (1 << 5) ++#define IRQ_MASK_C_LDO19 (1 << 4) ++#define IRQ_MASK_C_LDO18 (1 << 3) ++#define IRQ_MASK_C_LDO17 (1 << 2) ++#define IRQ_MASK_C_LDO16 (1 << 1) ++#define IRQ_MASK_C_LDO15 (1 << 0) ++ ++#define SYS_CTRL_A 0x08 ++#define SYS_CONTROL_A_SLEEP_N_PIN_ENABLE 0x1 ++#define SYS_CONTROL_A_SHUT_DOWN (1<<1) ++#define SYS_CONTROL_A_HWRES_ENABLE (1<<2) ++#define SYS_CONTROL_A_WDOG_ACTION (1<<3) ++#define SYS_CONTROL_A_WATCHDOG (1<<7) ++ ++#define SYS_CONTROL_B 0x09 ++#define SYS_CLTR_B_SLEEP_13MHZ_EN (1 << 4) ++#define SYS_CLTR_B_AUTO_CLK_SWITCH (1 << 3) ++ ++#define FAULT_LOG 0x0a ++#define FAULT_LOG_OVER_TEMP (1 << 7) ++#define FAULT_LOG_VBAT_OVER (1 << 4) ++ ++#define LDO_10_11 0x10 ++#define LDO_10_11_LDO10_3V (0xc) ++#define LDO_10_11_LDO11_3V2 (0xe << 4) ++ ++#define LDO_15 0x11 ++#define LDO_14_16 0x12 ++#define LDO_18_19 0x13 ++#define LDO_18_19_LDO18_3V2 (0xe) ++ ++#define LDO_17_SIMCP0 0x14 ++#define LDO_17_SIMCP0_LDO17_3V 0x0F ++ ++#define BUCK_2_DVC1 0x15 ++#define BUCK_2_GO (1 << 7) ++#define BUCK_2_SLEEP (1 << 6) ++#define BUCK_2_TRIM_1V5 (0x1a) ++ ++#define BUCK_2_DVC2 0x16 ++ ++#define REG_CONTROL_1_17 0x17 ++#define RC1_LDO17_EN (1 << 7) ++#define RC1_LDO16_EN (1 << 6) ++#define RC1_LDO15_EN (1 << 5) ++#define RC1_LDO14_EN (1 << 4) ++#define RC1_LDO13_EN (1 << 3) ++#define RC1_LDO11_EN (1 << 2) ++#define RC1_LDO10_EN (1 << 1) ++#define RC1_BUCK2_EN (1 << 0) ++ ++#define REG_CONTROL_2_18 0x18 ++#define RC2_SIMCP_EN (1 << 6) ++#define RC2_LDO19_EN (1 << 1) ++#define RC2_LDO18_EN (1 << 0) ++ ++#define REG_CONTROL_3_ ++ ++#define USBPUMP 0x19 ++#define USB_PUMP_EN_USBVEP (1 << 7) ++#define USB_PUMP_EN_USBVE (1 << 6) ++#define USB_PUMP_SPR_DETECT (1 << 5) ++#define USB_PUMP_SESSION_VALID (1 << 4) ++#define USB_PUMP_VBUS_VALID_4_0 (1 << 3) ++#define USB_PUMP_VBUS_VALID_4_4 (1 << 2) ++#define USB_PUMP_USBVEP (1 << 1) ++#define USB_PUMP_USBVE (1 << 0) ++ ++#define SLEEP_CONTROL 0x1a ++#define APP_SLEEP_CTL_PWR_EN (1 << 7) ++#define APP_SLEEP_CTL_SYS_EN (1 << 6) ++#define APP_SLEEP_CTL_BYPASS_LDO19 (1 << 2) ++#define APP_SLEEP_CTL_BYPASS_LDO18 (1 << 1) ++#define APP_SLEEP_CTL_BYPASS_LDO17 (1 << 0) ++ ++#define STARTUP_CONTROL 0x1b ++#define STARTUP_CTL_LDO11_PWR_SYS (1 << 3) ++#define STARTUP_CTL_LDO10_PWR_SYS (1 << 2) ++#define STARTUP_CTL_LDO11_START (1 << 1) ++#define STARTUP_CTL_LDO10_START (1 << 0) ++ ++#define LED_1_CONTROL 0x20 ++#define LED_2_CONTROL 0x21 ++#define LED_3_CONTROL 0x22 ++#define LED_4_CONTROL 0x23 ++#define LEDPC_CONTROL 0x24 ++#define LED_ENABLE (1 << 7) ++ ++#define WLED_CONTROL 0x25 ++#define WLED_CP_ENABLE (1 << 6) ++#define WLED_ISET_10 (3) ++ ++#define MISC_CONTROLA 0x26 ++#define MISC_CONTROLB 0x27 ++#define MISCB_SESSION_VALID_ENABLE (1 << 3) ++#define MISCB_USB_INT_RISING (1 << 2) ++#define MISCB_I2C_ADDRESS (1 << 1) ++#define MISCB_STARTUP_SEQUENCE (1 << 0) ++ ++#define CHARGE_CONTROL 0x28 ++#define CHRG_CHARGER_ENABLE (1 << 7) ++ ++#define CCTR_CONTROL 0x29 ++#define CCTR_SET_8MIN 0x01 ++ ++#define TCTR_CONTROL 0x2a ++#define CHARGE_PULSE 0x2b ++ ++#define ADC_MAN_CONTROL 0x30 ++ ++#define ADC_AUTO_CONTROL 0x31 ++#define ADC_IN5_EN (1 << 7) ++#define ADC_IN4_EN (1 << 6) ++#define ADC_TBAT_ENABLE (1 << 5) ++#define ADC_VBAT_IN_TXON (1 << 4) ++#define ADC_VCH_ENABLE (1 << 3) ++#define ADC_ICH_ENABLE (1 << 2) ++#define ADC_VBAT_ENABLE (1 << 1) ++#define ADC_AUTO_SLEEP_ENABLE (1 << 0) ++ ++#define VBATMON 0x32 ++#define VBATMONTXON 0x33 ++#define TBATHIGHP 0x34 ++#define TBATHIGHN 0x35 ++#define TBATLOW 0x36 ++#define ADC_IN4_MIN 0x37 ++#define ADC_IN4_MAX 0x38 ++#define ADC_IN5_MIN 0x39 ++#define ADC_IN5_MAX 0x3a ++ ++#define VBAT_RES 0x41 ++#define VBATMIN_RES 0x42 ++#define VBATMINTXON 0x43 ++#define ICHMAX_RES 0x44 ++#define ICHMIN_RES 0x45 ++#define ICHAVERAGE_RES 0x46 ++#define VCHMAX_RES 0x47 ++#define VCHMIN_RES 0x48 ++#define TBAT_RES 0x49 ++#define ADC_IN4_RES 0x4a ++#define ADC_IN5_RES 0x4b ++ ++#define LDO_1 0x90 ++#define LDO_1_UNLOCK (0x5 << 5) ++#define LDO_1_TRIM_3V (0x12) ++ ++#define LDO_2_3 0x91 ++#define LDO_2_3_LDO2_3V2 (0xe << 4) ++#define LDO_2_3_LDO3_3V (0xc) ++ ++#define LDO_4_5 0x92 ++#define LDO_6_SIMCP 0x93 ++#define LDO_6_SIMCP_LDO6_3V2 (0xe) ++ ++#define LDO_7_8 0x94 ++#define LDO_9_12 0x95 ++#define BUCK 0x96 ++#define REG_CONTROL_1_97 0x97 ++#define RC3_LDO7_EN (1 << 7) ++#define RC3_LDO6_EN (1 << 6) ++#define RC3_LDO5_EN (1 << 5) ++#define RC3_LDO4_EN (1 << 4) ++#define RC3_LDO3_EN (1 << 3) ++#define RC3_LDO2_EN (1 << 2) ++#define RC3_LDO1_EN (1 << 1) ++#define RC3_BUCK_EN (1 << 0) ++ ++#define REG_CONTROL_2_98 0x98 ++#define RC4_SLEEP (1 << 7) ++#define RC4_SIMCP_ENABLE (1 << 6) ++#define RC4_LDO14_EN (1 << 5) ++#define RC4_LDO12_EN (1 << 4) ++#define RC4_LDO11_EN (1 << 3) ++#define RC4_LDO10_EN (1 << 2) ++#define RC4_LDO9_EN (1 << 1) ++#define RC4_LDO8_EN (1 << 0) ++ ++#define REG_SLEEP_CONTROL1 0x99 ++#define REG_SLEEP_CONTROL2 0x9a ++#define REG_SLEEP_CONTROL3 0x9b ++ ++#define ADC_MAN_CONTROL_1 0xa0 ++#define ADC_DEBOUNCE_VBATMON_TXON (1 << 7) ++#define ADC_DEBOUNCE_VBATMON (1 << 6) ++#define ADC_TBATREF_ENABLE (1 << 5) ++#define ADC_LDO_INT_ENABLE (1 << 4) ++#define ADC_MAN_CONV (1 << 3) ++#define ADC_MUX_VBAT (0) ++ ++#define ADC_AUTO_CONTROL_1 0xa1 ++#define ADC_IN5_EN (1 << 7) ++#define ADC_IN4_EN (1 << 6) ++#define ADC_TBAT_ENABLE (1 << 5) ++#define ADC_VBAT_IN_TXON (1 << 4) ++#define ADC_VCH_ENABLE (1 << 3) ++#define ADC_ICH_ENABLE (1 << 2) ++#define ADC_VBAT_ENABLE (1 << 1) ++#define ADC_AUTO_SLEEP_ENABLE (1 << 0) ++ ++#define VBATMON_1 0xa2 ++#define VBATMONTXMON_1 0xa3 ++#define TBATHIGHP_1 0xa4 ++#define TBATHIGHN_1 0xa5 ++#define TBATLOW_1 0xa6 ++#define MAN_RES 0xb0 ++#define VBAT_RES_1 0xb1 ++#define VBATMIN_RES_1 0xb2 ++#define VBATMINTXON_RES 0xb3 ++#define ICHMAX_RES_1 0xb4 ++#define ICHMIN_RES_1 0xb5 ++#define ICHAVERAGE_RES_1 0xb6 ++#define VCHMAX_RES_1 0xb7 ++#define VCHMIN_RES_1 0xb8 ++#define TBAT_RES_1 0xb9 ++#define ADC_IN4_RES_1 0xba +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index f929fcd..174ea2e 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -126,6 +126,49 @@ config TOUCHSCREEN_HP600 + To compile this driver as a module, choose M here: the + module will be called hp680_ts_input. + ++config TOUCHSCREEN_WM97XX ++ tristate "Support for WM97xx AC97 touchscreen controllers" ++ depends AC97_BUS ++ ++choice ++ prompt "WM97xx codec type" ++ depends TOUCHSCREEN_WM97XX ++ ++config TOUCHSCREEN_WM9705 ++ bool "WM9705 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9705 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9705. ++ ++config TOUCHSCREEN_WM9712 ++ bool "WM9712 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9712 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9712. ++ ++config TOUCHSCREEN_WM9713 ++ bool "WM9713 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9713 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9713. ++ ++endchoice ++ + config TOUCHSCREEN_PENMOUNT + tristate "Penmount serial touchscreen" + select SERIO +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index 5de8933..3a059b1 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -3,6 +3,7 @@ + # + + # Each configuration option enables a list of files. ++wm97xx-ts-objs := wm97xx-core.o + + obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o + obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o +@@ -18,3 +19,16 @@ obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o + obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o ++obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) ++wm97xx-ts-objs += wm9713.o ++endif ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9712),y) ++wm97xx-ts-objs += wm9712.o ++endif ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9705),y) ++wm97xx-ts-objs += wm9705.o ++endif +diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c +new file mode 100644 +index 0000000..1dae63d +--- /dev/null ++++ b/drivers/input/touchscreen/wm9705.c +@@ -0,0 +1,360 @@ ++/* ++ * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9705_VERSION "0.62" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Pen detect comparator threshold. ++ * ++ * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold ++ * i.e. 1 = Vmid/15 threshold ++ * 15 = Vmid/1 threshold ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down events. ++ */ ++static int pdd = 8; ++module_param(pdd, int, 0); ++MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9705 ++ */ ++static void init_wm9705_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2 = WM97XX_RPR; ++ ++ /* ++ * mute VIDEO and AUX as they share X and Y touchscreen ++ * inputs on the WM9705 ++ */ ++ wm97xx_reg_write(wm, AC97_AUX, 0x8000); ++ wm97xx_reg_write(wm, AC97_VIDEO, 0x8000); ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9705_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* polling mode sample settling delay */ ++ if (delay!=4) { ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* WM9705 pdd */ ++ dig2 |= (pdd & 0x000f); ++ dbg("setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 4); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9705_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9705_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9705_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9705 adc in polling mode. ++ */ ++static int wm9705_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Sample the WM9705 touchscreen in polling mode ++ */ ++static int wm9705_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9705 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9705_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9705_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9705_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9705_ID2, ++ .name = "wm9705", ++ .poll_sample = wm9705_poll_sample, ++ .poll_touch = wm9705_poll_touch, ++ .acc_enable = wm9705_acc_enable, ++ .digitiser_ioctl = wm9705_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c +new file mode 100644 +index 0000000..99433e9 +--- /dev/null ++++ b/drivers/input/touchscreen/wm9712.c +@@ -0,0 +1,464 @@ ++/* ++ * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 4th Jul 2005 Initial version. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9712_VERSION "0.61" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 8; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 3; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set five_wire = 1 to use a 5 wire touchscreen. ++ * ++ * NOTE: Five wire mode does not allow for readback of pressure. ++ */ ++static int five_wire; ++module_param(five_wire, int, 0); ++MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 0; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9712 ++ */ ++static void init_wm9712_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0; ++ u16 dig2 = WM97XX_RPR | WM9712_RPU(1); ++ ++ /* WM9712 rpu */ ++ if (rpu) { ++ dig2 &= 0xffc0; ++ dig2 |= WM9712_RPU(rpu); ++ dbg("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9712_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* WM9712 five wire */ ++ if (five_wire) { ++ dig2 |= WM9712_45W; ++ dbg("setting 5-wire touchscreen mode."); ++ } ++ ++ /* polling mode sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 6); ++ if (mask) { ++ u16 reg; ++ /* Set GPIO4 as Mask Pin*/ ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg | WM97XX_GPIO_4); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg | WM97XX_GPIO_4); ++ } ++ ++ /* wait - coord mode */ ++ if(coord) ++ dig2 |= WM9712_WAIT; ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9712_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 dig2 = wm->dig[2]; ++ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9712_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9712_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coord from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, ++ WM97XX_COO | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion and read x */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back y data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9712 touchscreen in polling mode ++ */ ++static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9712_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ ++ if (pil && !five_wire) { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9712 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9712_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9712_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9712_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return 0; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9712_ID2, ++ .name = "wm9712", ++ .poll_sample = wm9712_poll_sample, ++ .poll_touch = wm9712_poll_touch, ++ .acc_enable = wm9712_acc_enable, ++ .digitiser_ioctl = wm9712_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c +new file mode 100644 +index 0000000..42f5f30 +--- /dev/null ++++ b/drivers/input/touchscreen/wm9713.c +@@ -0,0 +1,461 @@ ++/* ++ * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9713_VERSION "0.53" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 8; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 0; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9713 ++ */ ++static void init_wm9713_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2, dig3; ++ ++ /* default values */ ++ dig2 = WM97XX_DELAY(4) | WM97XX_SLT(5); ++ dig3= WM9712_RPU(1); ++ ++ /* rpu */ ++ if (rpu) { ++ dig3 &= 0xffc0; ++ dig3 |= WM9712_RPU(rpu); ++ info("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure */ ++ if (pil == 2) { ++ dig3 |= WM9712_PIL; ++ info("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ info ("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ info ("supplied delay out of range."); ++ delay = 4; ++ info("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ } ++ dig2 &= 0xff0f; ++ dig2 |= WM97XX_DELAY(delay); ++ ++ /* mask */ ++ dig3 |= ((mask & 0x3) << 4); ++ if(coord) ++ dig3 |= WM9713_WAIT; ++ ++ wm->misc = wm97xx_reg_read(wm, 0x5a); ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, 0x0); ++} ++ ++static int wm9713_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 val = 0; ++ ++ switch(cmd){ ++ case WM97XX_DIG_START: ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig_save[0]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9713_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9713_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = 1 << ((adcsel & 0x7fff) + 3); ++ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel |WM9713_POLL); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample =wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSRC_MASK) != ffs(adcsel >> 1) << 12) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSRC_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coordinate from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ if(pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL | WM9713_COO); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9713 touchscreen in polling mode ++ */ ++static int wm9713_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9713_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9713 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9713_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2, dig3; ++ int ret = 0; ++ ++ dig1 = wm->dig[0]; ++ dig2 = wm->dig[1]; ++ dig3 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && ++ (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ dig1 |= WM9713_CTC | WM9713_COO | WM9713_ADCSEL_X | WM9713_ADCSEL_Y; ++ if (pil) ++ dig1 |= WM9713_ADCSEL_PRES; ++ dig2 &= ~(WM97XX_DELAY_MASK | WM97XX_SLT_MASK | WM97XX_CM_RATE_MASK); ++ dig2 |= WM97XX_SLEN | WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | WM97XX_RATE (wm->acc_rate); ++ dig3 |= WM9713_PDEN; ++ } else { ++ dig1 &= ~(WM9713_CTC | WM9713_COO); ++ dig2 &= ~WM97XX_SLEN; ++ dig3 &= ~WM9713_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9713_ID2, ++ .name = "wm9713", ++ .poll_sample = wm9713_poll_sample, ++ .poll_touch = wm9713_poll_touch, ++ .acc_enable = wm9713_acc_enable, ++ .digitiser_ioctl = wm9713_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c +new file mode 100644 +index 0000000..87179d2 +--- /dev/null ++++ b/drivers/input/touchscreen/wm97xx-core.c +@@ -0,0 +1,859 @@ ++/* ++ * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 ++ * and WM9713 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Notes: ++ * ++ * Features: ++ * - supports WM9705, WM9712, WM9713 ++ * - polling mode ++ * - continuous mode (arch-dependent) ++ * - adjustable rpu/dpp settings ++ * - adjustable pressure current ++ * - adjustable sample settle delay ++ * - 4 and 5 wire touchscreens (5 wire is WM9712 only) ++ * - pen down detection ++ * - battery monitor ++ * - sample AUX adc's ++ * - power management ++ * - codec GPIO ++ * - codec event notification ++ * Todo ++ * - Support for async sampling control for noisy LCD's. ++ * ++ * Revision history ++ * 7th May 2003 Initial version. ++ * 6th June 2003 Added non module support and AC97 registration. ++ * 18th June 2003 Added AUX adc sampling. ++ * 23rd June 2003 Did some minimal reformatting, fixed a couple of ++ * codec_mutexing bugs and noted a race to fix. ++ * 24th June 2003 Added power management and fixed race condition. ++ * 10th July 2003 Changed to a misc device. ++ * 31st July 2003 Moved TS_EVENT and TS_CAL to wm97xx.h ++ * 8th Aug 2003 Added option for read() calling wm97xx_sample_touch() ++ * because some ac97_read/ac_97_write call schedule() ++ * 7th Nov 2003 Added Input touch event interface, stanley.cai@intel.com ++ * 13th Nov 2003 Removed h3600 touch interface, added interrupt based ++ * pen down notification and implemented continous mode ++ * on XScale arch. ++ * 16th Nov 2003 Ian Molton <spyro@f2s.com> ++ * Modified so that it suits the new 2.6 driver model. ++ * 25th Jan 2004 Andrew Zabolotny <zap@homelink.ru> ++ * Implemented IRQ-driven pen down detection, implemented ++ * the private API meant to be exposed to platform-specific ++ * drivers, reorganized the driver so that it supports ++ * an arbitrary number of devices. ++ * 1st Feb 2004 Moved continuous mode handling to a separate ++ * architecture-dependent file. For now only PXA ++ * built-in AC97 controller is supported (pxa-ac97-wm97xx.c). ++ * 11th Feb 2004 Reduced CPU usage by keeping a cached copy of both ++ * digitizer registers instead of reading them every time. ++ * A reorganization of the whole code for better ++ * error handling. ++ * 17th Apr 2004 Added BMON support. ++ * 17th Nov 2004 Added codec GPIO, codec event handling (real and virtual ++ * GPIOs) and 2.6 power management. ++ * 29th Nov 2004 Added WM9713 support. ++ * 4th Jul 2005 Moved codec specific code out to seperate files. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added bus interface. ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/proc_fs.h> ++#include <linux/pm.h> ++#include <linux/interrupt.h> ++#include <linux/bitops.h> ++#include <linux/workqueue.h> ++#include <linux/device.h> ++#include <linux/freezer.h> ++#include <linux/wm97xx.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++ ++#include <asm/arch/irqs.h> ++ ++#define TS_NAME "wm97xx" ++#define WM_CORE_VERSION "0.64" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++ ++/* ++ * Touchscreen absolute values ++ * ++ * These parameters are used to help the input layer discard out of ++ * range readings and reduce jitter etc. ++ * ++ * o min, max:- indicate the min and max values your touch screen returns ++ * o fuzz:- use a higher number to reduce jitter ++ * ++ * The default values correspond to Mainstone II in QVGA mode ++ * ++ * Please read ++ * Documentation/input/input-programming.txt for more details. ++ */ ++ ++static int abs_x[3] = {350,3900,5}; ++module_param_array(abs_x, int, NULL, 0); ++MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); ++ ++static int abs_y[3] = {320,3750,40}; ++module_param_array(abs_y, int, NULL, 0); ++MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); ++ ++static int abs_p[3] = {0,150,4}; ++module_param_array(abs_p, int, NULL, 0); ++MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * wm97xx IO access, all IO locking done by AC97 layer ++ */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg) ++{ ++ if (wm->ac97) ++ return wm->ac97->bus->ops->read(wm->ac97, reg); ++ else ++ return -1; ++} ++EXPORT_SYMBOL_GPL(wm97xx_reg_read); ++ ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) ++{ ++ /* cache digitiser registers */ ++ if(reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3) ++ wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; ++ ++ /* cache gpio regs */ ++ if(reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE) ++ wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; ++ ++ /* wm9713 irq reg */ ++ if(reg == 0x5a) ++ wm->misc = val; ++ ++ if (wm->ac97) ++ wm->ac97->bus->ops->write(wm->ac97, reg, val); ++} ++EXPORT_SYMBOL_GPL(wm97xx_reg_write); ++ ++/** ++ * wm97xx_read_aux_adc - Read the aux adc. ++ * @wm: wm97xx device. ++ * @adcsel: codec ADC to be read ++ * ++ * Reads the selected AUX ADC. ++ */ ++ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) ++{ ++ int power_adc = 0, auxval; ++ u16 power = 0; ++ ++ /* get codec */ ++ mutex_lock(&wm->codec_mutex); ++ ++ /* When the touchscreen is not in use, we may have to power up the AUX ADC ++ * before we can use sample the AUX inputs-> ++ */ ++ if (wm->id == WM9713_ID2 && ++ (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { ++ power_adc = 1; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); ++ } ++ ++ /* Prepare the codec for AUX reading */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_AUX_PREPARE); ++ ++ /* Turn polling mode on to read AUX ADC */ ++ wm->pen_probably_down = 1; ++ wm->codec->poll_sample(wm, adcsel, &auxval); ++ ++ if (power_adc) ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); ++ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_RESTORE); ++ ++ wm->pen_probably_down = 0; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return auxval & 0xfff; ++} ++EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); ++ ++/** ++ * wm97xx_get_gpio - Get the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * Get the status of a codec GPIO pin ++ */ ++ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) ++{ ++ u16 status; ++ wm97xx_gpio_status_t ret; ++ ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & gpio) ++ ret = WM97XX_GPIO_HIGH; ++ else ++ ret = WM97XX_GPIO_LOW; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++} ++EXPORT_SYMBOL_GPL(wm97xx_get_gpio); ++ ++/** ++ * wm97xx_set_gpio - Set the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * ++ * Set the status of a codec GPIO pin ++ */ ++ ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & WM97XX_GPIO_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++EXPORT_SYMBOL_GPL(wm97xx_set_gpio); ++ ++/* ++ * Codec GPIO pin configuration, this set's pin direction, polarity, ++ * stickyness and wake up. ++ */ ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (pol == WM97XX_GPIO_POL_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ ++ if (sticky == WM97XX_GPIO_STICKY) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ ++ if (wake == WM97XX_GPIO_WAKE) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ ++ if (dir == WM97XX_GPIO_IN) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++EXPORT_SYMBOL_GPL(wm97xx_config_gpio); ++ ++/* ++ * Handle a pen down interrupt. ++ */ ++static void wm97xx_pen_irq_worker(struct work_struct *w) ++{ ++/* struct wm97xx *wm = (struct wm97xx *) ptr; */ ++ struct wm97xx *wm = container_of(w, struct wm97xx, pen_event_work); ++ ++ /* do we need to enable the touch panel reader */ ++ if (wm->id == WM9705_ID2) { ++ if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) ++ wm->pen_is_down = 1; ++ else ++ wm->pen_is_down = 0; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } else { ++ u16 status, pol; ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (WM97XX_GPIO_13 & pol & status) { ++ wm->pen_is_down = 1; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & ~WM97XX_GPIO_13); ++ } else { ++ wm->pen_is_down = 0; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | WM97XX_GPIO_13); ++ } ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & ~WM97XX_GPIO_13) << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & ~WM97XX_GPIO_13); ++ mutex_unlock(&wm->codec_mutex); ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ ++ if (!wm->pen_is_down && wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->mach_ops->acc_pen_up(wm); ++ enable_irq(wm->pen_irq); ++} ++ ++/* ++ * Codec PENDOWN irq handler ++ * ++ * We have to disable the codec interrupt in the handler because it can ++ * take upto 1ms to clear the interrupt source. The interrupt is then enabled ++ * again in the slow handler when the source has been cleared. ++ */ ++static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id) ++{ ++ struct wm97xx *wm = (struct wm97xx *) dev_id; ++ disable_irq(wm->pen_irq); ++ queue_work(wm->pen_irq_workq, &wm->pen_event_work); ++ return IRQ_HANDLED; ++} ++ ++/* ++ * initialise pen IRQ handler and workqueue ++ */ ++static int wm97xx_init_pen_irq(struct wm97xx *wm) ++{ ++ u16 reg; ++ ++ INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker/* , wm */); ++ if ((wm->pen_irq_workq = ++ create_singlethread_workqueue("kwm97pen")) == NULL) { ++ err("could not create pen irq work queue"); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ ++ wm->pen_irq = IRQ_GPIO(90); ++ if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { ++ err("could not register codec pen down interrupt, will poll for pen down"); ++ destroy_workqueue(wm->pen_irq_workq); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ /* enable PEN down on wm9712/13 */ ++ if (wm->id != WM9705_ID2) { ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg & 0xfffb); ++ reg = wm97xx_reg_read(wm, 0x5a); ++ wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); ++ } ++ ++ return 0; ++} ++ ++/* Private struct for communication between struct wm97xx_tshread ++ * and wm97xx_read_samples */ ++struct ts_state { ++ int sleep_time; ++ int min_sleep_time; ++}; ++ ++static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state) ++{ ++ struct wm97xx_data data; ++ int rc; ++ ++ mutex_lock(&wm->codec_mutex); ++ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ rc = wm->mach_ops->acc_pen_down(wm); ++ else ++ rc = wm->codec->poll_touch(wm, &data); ++ ++ if (rc & RC_PENUP) { ++ if (wm->pen_is_down) { ++ wm->pen_is_down = 0; ++ dbg("pen up"); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, 0); ++ input_sync(wm->input_dev); ++ } else if (!(rc & RC_AGAIN)) { ++ /* We need high frequency updates only while pen is down, ++ * the user never will be able to touch screen faster than ++ * a few times per second... On the other hand, when the ++ * user is actively working with the touchscreen we don't ++ * want to lose the quick response. So we will slowly ++ * increase sleep time after the pen is up and quicky ++ * restore it to ~one task switch when pen is down again. ++ */ ++ if (state->sleep_time < HZ / 10) ++ state->sleep_time++; ++ } ++ ++ } else if (rc & RC_VALID) { ++ dbg("pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n", ++ data.x >> 12, data.x & 0xfff, data.y >> 12, ++ data.y & 0xfff, data.p >> 12, data.p & 0xfff); ++ input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); ++ input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); ++ input_sync(wm->input_dev); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } else if (rc & RC_PENDOWN) { ++ dbg("pen down"); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return rc; ++} ++ ++/* ++* The touchscreen sample reader thread. ++*/ ++static int wm97xx_ts_read(void *data) ++{ ++ int rc; ++ struct ts_state state; ++ struct wm97xx *wm = (struct wm97xx *) data; ++ ++ /* set up thread context */ ++ wm->ts_task = current; ++ daemonize("kwm97xxts"); ++ ++ if (wm->codec == NULL) { ++ wm->ts_task = NULL; ++ printk(KERN_ERR "codec is NULL, bailing\n"); ++ } ++ ++ complete(&wm->ts_init); ++ wm->pen_is_down = 0; ++ state.min_sleep_time = HZ >= 100 ? HZ / 100 : 1; ++ if (state.min_sleep_time < 1) ++ state.min_sleep_time = 1; ++ state.sleep_time = state.min_sleep_time; ++ ++ /* touch reader loop */ ++ while (wm->ts_task) { ++ do { ++ try_to_freeze(); ++ rc = wm97xx_read_samples(wm, &state); ++ } while (rc & RC_AGAIN); ++ if (!wm->pen_is_down && wm->pen_irq) { ++ /* Nice, we don't have to poll for pen down event */ ++ wait_event_interruptible(wm->pen_irq_wait, wm->pen_is_down); ++ } else { ++ set_task_state(current, TASK_INTERRUPTIBLE); ++ schedule_timeout(state.sleep_time); ++ } ++ } ++ complete_and_exit(&wm->ts_exit, 0); ++} ++ ++/** ++ * wm97xx_ts_input_open - Open the touch screen input device. ++ * @idev: Input device to be opened. ++ * ++ * Called by the input sub system to open a wm97xx touchscreen device. ++ * Starts the touchscreen thread and touch digitiser. ++ */ ++static int wm97xx_ts_input_open(struct input_dev *idev) ++{ ++ int ret = 0; ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ /* first time opened ? */ ++ if (wm->ts_use_count++ == 0) { ++ /* start touchscreen thread */ ++ init_completion(&wm->ts_init); ++ init_completion(&wm->ts_exit); ++ ret = kernel_thread(wm97xx_ts_read, wm, CLONE_KERNEL); ++ ++ if (ret >= 0) { ++ wait_for_completion(&wm->ts_init); ++ if (wm->ts_task == NULL) ++ ret = -EINVAL; ++ } else { ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++ } ++ ++ /* start digitiser */ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 1); ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_START); ++ ++ /* init pen down/up irq handling */ ++ if (wm->pen_irq) { ++ wm97xx_init_pen_irq(wm); ++ ++ if (wm->pen_irq == 0) { ++ /* we failed to get an irq for pen down events, ++ * so we resort to polling. kickstart the reader */ ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ } ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++ ++/** ++ * wm97xx_ts_input_close - Close the touch screen input device. ++ * @idev: Input device to be closed. ++ * ++ * Called by the input sub system to close a wm97xx touchscreen device. ++ * Kills the touchscreen thread and stops the touch digitiser. ++ */ ++ ++static void wm97xx_ts_input_close(struct input_dev *idev) ++{ ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ if (--wm->ts_use_count == 0) { ++ /* destroy workqueues and free irqs */ ++ if (wm->pen_irq) { ++ free_irq(wm->pen_irq, wm); ++ destroy_workqueue(wm->pen_irq_workq); ++ } ++ ++ /* kill thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ mutex_unlock(&wm->codec_mutex); ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ wm->pen_is_down = 0; ++ mutex_lock(&wm->codec_mutex); ++ } ++ ++ /* stop digitiser */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_STOP); ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 0); ++ } ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++/* ++ * Bus interface to allow for client drivers codec access ++ * e.g. battery monitor ++ */ ++static int wm97xx_bus_match(struct device *dev, struct device_driver *drv) ++{ ++ return !(strcmp(dev->bus_id,drv->name)); ++} ++ ++/* ++ * The AC97 audio driver will do all the Codec suspend and resume ++ * tasks. This is just for anything machine specific or extra. ++ */ ++static int wm97xx_bus_suspend(struct device *dev, pm_message_t state) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->suspend) ++ ret = dev->driver->suspend(dev, state); ++ ++ return ret; ++} ++ ++static int wm97xx_bus_resume(struct device *dev) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->resume) ++ ret = dev->driver->resume(dev); ++ ++ return ret; ++} ++ ++struct bus_type wm97xx_bus_type = { ++ .name = "wm97xx", ++ .match = wm97xx_bus_match, ++ .suspend = wm97xx_bus_suspend, ++ .resume = wm97xx_bus_resume, ++}; ++EXPORT_SYMBOL_GPL(wm97xx_bus_type); ++ ++static void wm97xx_release(struct device *dev) ++{ ++ kfree(dev); ++} ++ ++static int wm97xx_probe(struct device *dev) ++{ ++ struct wm97xx* wm; ++ int ret = 0, id = 0; ++ ++ if (!(wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL))) ++ return -ENOMEM; ++ mutex_init(&wm->codec_mutex); ++ ++ init_waitqueue_head(&wm->pen_irq_wait); ++ wm->dev = dev; ++ dev->driver_data = wm; ++ wm->ac97 = to_ac97_t(dev); ++ ++ /* check that we have a supported codec */ ++ if ((id = wm97xx_reg_read(wm, AC97_VENDOR_ID1)) != WM97XX_ID1) { ++ err("could not find a wm97xx, found a %x instead\n", id); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); ++ if(wm->id != wm97xx_codec.id) { ++ err("could not find a the selected codec, please build for wm97%2x", wm->id & 0xff); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ if((wm->input_dev = input_allocate_device()) == NULL) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ /* set up touch configuration */ ++ info("detected a wm97%2x codec", wm->id & 0xff); ++ wm->input_dev->name = "wm97xx touchscreen"; ++ wm->input_dev->open = wm97xx_ts_input_open; ++ wm->input_dev->close = wm97xx_ts_input_close; ++ set_bit(EV_ABS, wm->input_dev->evbit); ++ set_bit(ABS_X, wm->input_dev->absbit); ++ set_bit(ABS_Y, wm->input_dev->absbit); ++ set_bit(ABS_PRESSURE, wm->input_dev->absbit); ++ wm->input_dev->absmax[ABS_X] = abs_x[1]; ++ wm->input_dev->absmax[ABS_Y] = abs_y[1]; ++ wm->input_dev->absmax[ABS_PRESSURE] = abs_p[1]; ++ wm->input_dev->absmin[ABS_X] = abs_x[0]; ++ wm->input_dev->absmin[ABS_Y] = abs_y[0]; ++ wm->input_dev->absmin[ABS_PRESSURE] = abs_p[0]; ++ wm->input_dev->absfuzz[ABS_X] = abs_x[2]; ++ wm->input_dev->absfuzz[ABS_Y] = abs_y[2]; ++ wm->input_dev->absfuzz[ABS_PRESSURE] = abs_p[2]; ++ wm->input_dev->private = wm; ++ wm->codec = &wm97xx_codec; ++ if((ret = input_register_device(wm->input_dev)) < 0) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ /* set up physical characteristics */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_PHY_INIT); ++ ++ /* load gpio cache */ ++ wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ ++ /* register our battery device */ ++ if (!(wm->battery_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto batt_err; ++ } ++ wm->battery_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->battery_dev->bus_id,"wm97xx-battery"); ++ wm->battery_dev->driver_data = wm; ++ wm->battery_dev->parent = dev; ++ wm->battery_dev->release = wm97xx_release; ++ if((ret = device_register(wm->battery_dev)) < 0) ++ goto batt_reg_err; ++ ++ /* register our extended touch device (for machine specific extensions) */ ++ if (!(wm->touch_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto touch_err; ++ } ++ wm->touch_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->touch_dev->bus_id,"wm97xx-touchscreen"); ++ wm->touch_dev->driver_data = wm; ++ wm->touch_dev->parent = dev; ++ wm->touch_dev->release = wm97xx_release; ++ if((ret = device_register(wm->touch_dev)) < 0) ++ goto touch_reg_err; ++ ++ return ret; ++ ++touch_reg_err: ++ kfree(wm->touch_dev); ++touch_err: ++ device_unregister(wm->battery_dev); ++batt_reg_err: ++ kfree(wm->battery_dev); ++batt_err: ++ input_unregister_device(wm->input_dev); ++ kfree(wm); ++ return ret; ++} ++ ++static int wm97xx_remove(struct device *dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* Stop touch reader thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ } ++ device_unregister(wm->battery_dev); ++ device_unregister(wm->touch_dev); ++ input_unregister_device(wm->input_dev); ++ ++ kfree(wm); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++int wm97xx_resume(struct device* dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* restore digitiser and gpio's */ ++ if(wm->id == WM9713_ID2) { ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); ++ wm97xx_reg_write(wm, 0x5a, wm->misc); ++ if(wm->ts_use_count) { ++ u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); ++ } ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); ++ ++ return 0; ++} ++ ++#else ++#define wm97xx_resume NULL ++#endif ++ ++/* ++ * Machine specific operations ++ */ ++int wm97xx_register_mach_ops(struct wm97xx *wm, struct wm97xx_mach_ops *mach_ops) ++{ ++ mutex_lock(&wm->codec_mutex); ++ if(wm->mach_ops) { ++ mutex_unlock(&wm->codec_mutex); ++ return -EINVAL; ++ } ++ wm->mach_ops = mach_ops; ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops); ++ ++void wm97xx_unregister_mach_ops(struct wm97xx *wm) ++{ ++ mutex_lock(&wm->codec_mutex); ++ wm->mach_ops = NULL; ++ mutex_unlock(&wm->codec_mutex); ++} ++EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); ++ ++static struct device_driver wm97xx_driver = { ++ .name = "ac97", ++ .bus = &ac97_bus_type, ++ .owner = THIS_MODULE, ++ .probe = wm97xx_probe, ++ .remove = wm97xx_remove, ++ .resume = wm97xx_resume, ++}; ++ ++static int __init wm97xx_init(void) ++{ ++ int ret; ++ ++ info("version %s liam.girdwood@wolfsonmicro.com", WM_CORE_VERSION); ++ if((ret = bus_register(&wm97xx_bus_type)) < 0) ++ return ret; ++ return driver_register(&wm97xx_driver); ++} ++ ++static void __exit wm97xx_exit(void) ++{ ++ driver_unregister(&wm97xx_driver); ++ bus_unregister(&wm97xx_bus_type); ++} ++ ++module_init(wm97xx_init); ++module_exit(wm97xx_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig +index 4468cb3..01b4828 100644 +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -101,6 +101,12 @@ config LEDS_GPIO + outputs. To be useful the particular board must have LEDs + and they must be connected to the GPIO lines. + ++config LEDS_EM_X270 ++ tristate "LED Support for the CompuLab EM-X270" ++ depends on LEDS_CLASS && MACH_EM_X270 ++ help ++ This option enables support for the LEDs on CompuLab EM-X270. ++ + comment "LED Triggers" + + config LEDS_TRIGGERS +diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile +index f8995c9..6d3941e 100644 +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -17,6 +17,7 @@ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o + obj-$(CONFIG_LEDS_H1940) += leds-h1940.o + obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o + obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o ++obj-$(CONFIG_LEDS_EM_X270) += leds-em-x270.o + + # LED Triggers + obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o +diff --git a/drivers/leds/leds-em-x270.c b/drivers/leds/leds-em-x270.c +new file mode 100644 +index 0000000..485e7da +--- /dev/null ++++ b/drivers/leds/leds-em-x270.c +@@ -0,0 +1,99 @@ ++/* ++ * LED Triggers Core ++ * ++ * Copyright 2007 CompuLab, Ltd. ++ * Author: Mike Rapoport <mike@compulab.co.il> ++ * ++ * Based on Corgi leds driver: ++ * Copyright 2005-2006 Openedhand Ltd. ++ * Author: Richard Purdie <rpurdie@openedhand.com> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/leds.h> ++#include <linux/da9030.h> ++ ++static void em_x270_led_orange_set(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ int on = 1; ++ int pwm_chop = 0; ++ ++ pr_info("%s: value = %d\n", __FUNCTION__, value); ++ if (value == LED_OFF) ++ on = 0; ++ else if (value == LED_HALF) ++ pwm_chop = 4; ++ ++ da9030_set_led(3, on, 0, 0, pwm_chop); ++} ++ ++static struct led_classdev em_x270_orange_led = { ++ .name = "em_x270:orange", ++ .default_trigger = "em-x270-battery.0-charging-or-full", ++ .brightness_set = em_x270_led_orange_set, ++}; ++ ++#ifdef CONFIG_PM ++static int em_x270_led_suspend(struct platform_device *dev, pm_message_t state) ++{ ++#ifdef CONFIG_LEDS_TRIGGERS ++ if (em_x270_orange_led.trigger && strcmp(em_x270_orange_led.trigger->name, "em-x270-battery-charging-or-full")) ++#endif ++ led_classdev_suspend(&em_x270_orange_led); ++ return 0; ++} ++ ++static int em_x270_led_resume(struct platform_device *dev) ++{ ++ led_classdev_resume(&em_x270_orange_led); ++ return 0; ++} ++#endif ++ ++static int em_x270_led_probe(struct platform_device *pdev) ++{ ++ return led_classdev_register(&pdev->dev, &em_x270_orange_led); ++} ++ ++static int em_x270_led_remove(struct platform_device *pdev) ++{ ++ led_classdev_unregister(&em_x270_orange_led); ++ return 0; ++} ++ ++static struct platform_driver em_x270_led_driver = { ++ .probe = em_x270_led_probe, ++ .remove = em_x270_led_remove, ++#ifdef CONFIG_PM ++ .suspend = em_x270_led_suspend, ++ .resume = em_x270_led_resume, ++#endif ++ .driver = { ++ .name = "em-x270-led", ++ }, ++}; ++ ++static int __init em_x270_led_init(void) ++{ ++ return platform_driver_register(&em_x270_led_driver); ++} ++ ++static void __exit em_x270_led_exit(void) ++{ ++ platform_driver_unregister(&em_x270_led_driver); ++} ++ ++module_init(em_x270_led_init); ++module_exit(em_x270_led_exit); ++ ++MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>"); ++MODULE_DESCRIPTION("EX-X270 LED driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c +index 58e561e..7050e71 100644 +--- a/drivers/mtd/chips/jedec_probe.c ++++ b/drivers/mtd/chips/jedec_probe.c +@@ -38,7 +38,7 @@ + #define MANUFACTURER_ST 0x0020 + #define MANUFACTURER_TOSHIBA 0x0098 + #define MANUFACTURER_WINBOND 0x00da +- ++#define CONTINUATION_CODE 0x007f + + /* AMD */ + #define AM29DL800BB 0x22C8 +@@ -68,6 +68,10 @@ + #define AT49BV32X 0x00C8 + #define AT49BV32XT 0x00C9 + ++/* Eon */ ++#define EN29SL800BB 0x226B ++#define EN29SL800BT 0x22EA ++ + /* Fujitsu */ + #define MBM29F040C 0x00A4 + #define MBM29LV650UE 0x22D7 +@@ -632,6 +636,40 @@ static const struct amd_flash_info jedec_table[] = { + ERASEINFO(0x02000,8) + } + }, { ++ .mfr_id = 0x1c, ++ .dev_id = EN29SL800BT, ++ .name = "Eon EN29SL800BT", ++ .uaddr = { ++ [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ ++ [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */ ++ }, ++ .DevSize = SIZE_1MiB, ++ .CmdSet = P_ID_AMD_STD, ++ .NumEraseRegions= 4, ++ .regions = { ++ ERASEINFO(0x10000, 15), ++ ERASEINFO(0x08000, 1), ++ ERASEINFO(0x02000, 2), ++ ERASEINFO(0x04000, 1), ++ } ++ }, { ++ .mfr_id = 0x1c, ++ .dev_id = EN29SL800BB, ++ .name = "Eon EN29SL800BB", ++ .uaddr = { ++ [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ ++ [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */ ++ }, ++ .DevSize = SIZE_1MiB, ++ .CmdSet = P_ID_AMD_STD, ++ .NumEraseRegions= 4, ++ .regions = { ++ ERASEINFO(0x04000, 1), ++ ERASEINFO(0x02000, 2), ++ ERASEINFO(0x08000, 1), ++ ERASEINFO(0x10000, 15), ++ } ++ }, { + .mfr_id = MANUFACTURER_FUJITSU, + .dev_id = MBM29F040C, + .name = "Fujitsu MBM29F040C", +@@ -1769,9 +1807,21 @@ static inline u32 jedec_read_mfr(struct map_info *map, __u32 base, + { + map_word result; + unsigned long mask; +- u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type); +- mask = (1 << (cfi->device_type * 8)) -1; +- result = map_read(map, base + ofs); ++ int bank = 0; ++ ++ /* According to JEDEC "Standard Manufacturer's Identification Code" ++ * (http://www.jedec.org/download/search/jep106W.pdf) ++ * several first banks can contain 0x7f instead of actual ID ++ */ ++ do { ++ u32 ofs = cfi_build_cmd_addr(0 + (bank << 8), ++ cfi_interleave(cfi), ++ cfi->device_type); ++ mask = (1 << (cfi->device_type * 8)) -1; ++ result = map_read(map, base + ofs); ++ bank++; ++ } while ((result.x[0] & mask) == CONTINUATION_CODE); ++ + return result.x[0] & mask; + } + +diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c +index 738aa59..88dbbdf 100644 +--- a/drivers/net/dm9000.c ++++ b/drivers/net/dm9000.c +@@ -546,6 +546,7 @@ dm9000_probe(struct platform_device *pdev) + + if (id_val != DM9000_ID) { + printk("%s: wrong id: 0x%08x\n", CARDNAME, id_val); ++ ret = -ENODEV; + goto release; + } + +diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig +index 58c806e..3a16d9c 100644 +--- a/drivers/power/Kconfig ++++ b/drivers/power/Kconfig +@@ -49,4 +49,10 @@ config BATTERY_OLPC + help + Say Y to enable support for the battery on the OLPC laptop. + ++config BATTERY_EM_X270 ++ tristate "EM-X270 battery" ++ depends on DA9030 && MACH_EM_X270 ++ help ++ Say Y here to enable support for battery on EM-X270. ++ + endif # POWER_SUPPLY +diff --git a/drivers/power/Makefile b/drivers/power/Makefile +index 6413ded..dc9585e 100644 +--- a/drivers/power/Makefile ++++ b/drivers/power/Makefile +@@ -20,3 +20,4 @@ obj-$(CONFIG_APM_POWER) += apm_power.o + obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o + obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o + obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o ++obj-$(CONFIG_BATTERY_EM_X270) += em_x270_battery.o +diff --git a/drivers/power/em_x270_battery.c b/drivers/power/em_x270_battery.c +new file mode 100644 +index 0000000..2630c68 +--- /dev/null ++++ b/drivers/power/em_x270_battery.c +@@ -0,0 +1,579 @@ ++/* ++ * Power managemnet implementation for EM-X270 ++ * ++ * Copyright (C) 2007 CompuLab, Ltd. ++ * Author: Mike Rapoport <mike@compulab.co.il> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#define DEBUG ++ ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/pda_power.h> ++#include <linux/apm-emulation.h> ++#include <linux/da9030.h> ++#include <linux/power_supply.h> ++#include <linux/pm.h> ++ ++#include <linux/debugfs.h> ++#include <linux/seq_file.h> ++ ++#include "../i2c/chips/da9030.h" ++ ++#define VOLTAGE_MAX_DESIGN 4200000 /* 4.2V in uV */ ++#define VOLTAGE_MIN_DESIGN 3000000 /* 3V in uV */ ++ ++/* #define VCHARGE_MIN_THRESHOLD 72 /\* 4.5V *\/ */ ++ ++#define VCHARGE_MIN_THRESHOLD 60 /* ?.?V */ ++#define VCHARGE_MAX_THRESHOLD 89 /* 5.5V */ ++#define TBAT_LOW_THRESHOLD 197 /* 0oC */ ++#define TBAT_HIGH_THRESHOLD 78 /* 45oC */ ++#define TBAT_RESUME_THRESHOLD 100 /* 35oC */ ++#define VBAT_LOW_THRESHOLD 82 /* 3.498V */ ++#define VBAT_CRIT_THRESHOLD 62 /* 3.291V */ ++ ++struct da9030_charger { ++ struct device *dev; ++ ++ struct power_supply bat; ++ struct da9030_adc_res adc; ++ struct delayed_work work; ++ ++ int interval; ++ int status; ++ int mA; ++ int mV; ++ ++ int is_charging:1; ++ ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *debug_file; ++#endif ++}; ++ ++static unsigned short tbat_readings[] = { ++ 300, 244, 200, 178, 163, 152, 144, 137, 131, ++ 126, 122, 118, 114, 111, 108, 105, 103, 101, ++ 98, 96, 94, 93, 91, 89, 88, 86, 85, ++ 83, 82, 81, 79, 78, 77, 76, 75, 74, ++ 73, 72, 71, 70, 69, 68, 67, 67, 66, ++ 65, 64, 63, 63, 62, 61, 60, 60, 59, ++ 58, 58, 57, 57, 56, 55, 55, 54, 53, ++ 53, 52, 52, 51, 51, 50, 50, 49, 49, ++ 48, 48, 47, 47, 46, 46, 45, 45, 44, ++ 44, 43, 43, 42, 42, 41, 41, 41, 40, ++ 40, 39, 39, 38, 38, 38, 37, 37, 36, ++ 36, 35, 35, 35, 34, 34, 34, 33, 33, ++ 32, 32, 32, 31, 31, 30, 30, 30, 29, ++ 29, 29, 28, 28, 28, 27, 27, 26, 26, ++ 26, 25, 25, 25, 24, 24, 24, 23, 23, ++ 23, 22, 22, 21, 21, 21, 20, 20, 20, ++ 19, 19, 19, 18, 18, 18, 17, 17, 17, ++ 16, 16, 16, 15, 15, 14, 14, 14, 13, ++ 13, 13, 12, 12, 12, 11, 11, 11, 10, ++ 10, 10, 9, 9, 8, 8, 8, 7, 7, ++ 7, 6, 6, 5, 5, 5, 4, 4, 3, ++ 3, 3, 2, 2, 1, 1, 1, 0, 0, ++ -1, -1, -1, -2, -2, -3, -3, -4, -4, ++ -5, -5, -6, -6, -6, -7, -7, -8, -9, ++ -9, -10, -10, -11, -11, -12, -12, -13, -14, ++ -14, -15, -16, -16, -17, -18, -18, -19, -20, ++ -21, -21, -22, -23, -24, -25, -26, -27, -28, ++ -30, -31, -32, -34, -35, -37, -39, -41, -44, ++ -47, -50, -56, -64, ++}; ++ ++#ifdef CONFIG_DEBUG_FS ++ ++#define REG2VOLT(x) ((((x) * 2650) >> 8) + 2650) ++ ++static int debug_show(struct seq_file *s, void *data) ++{ ++ struct da9030_charger *charger = s->private; ++ ++ seq_printf(s, "charger is %s\n", ++ charger->status & CHRG_CHARGER_ENABLE ? "on" : "off"); ++ if (charger->status & CHRG_CHARGER_ENABLE) { ++ seq_printf(s, "iset = %dmA, vset = %dmV\n", ++ charger->mA, charger->mV); ++ } ++ ++ seq_printf(s, "vbat_res = %d (%dmV)\n", ++ charger->adc.vbat_res, REG2VOLT(charger->adc.vbat_res)); ++ seq_printf(s, "vbatmin_res = %d (%dmV)\n", ++ charger->adc.vbatmin_res, ++ REG2VOLT(charger->adc.vbatmin_res)); ++ seq_printf(s, "vbatmintxon = %d (%dmV)\n", ++ charger->adc.vbatmintxon, ++ REG2VOLT(charger->adc.vbatmintxon)); ++ seq_printf(s, "ichmax_res = %d\n", charger->adc.ichmax_res); ++ seq_printf(s, "ichmin_res = %d\n", charger->adc.ichmin_res); ++ seq_printf(s, "ichaverage_res = %d\n", charger->adc.ichaverage_res); ++ seq_printf(s, "vchmax_res = %d (%dmV)\n", ++ charger->adc.vchmax_res, ++ REG2VOLT(charger->adc.vchmax_res)); ++ seq_printf(s, "vchmin_res = %d (%dmV)\n", ++ charger->adc.vchmin_res, ++ REG2VOLT(charger->adc.vchmin_res)); ++ seq_printf(s, "tbat_res = %d (%doC\n", charger->adc.tbat_res, ++ tbat_readings[charger->adc.tbat_res]); ++ seq_printf(s, "adc_in4_res = %d\n", charger->adc.adc_in4_res); ++ seq_printf(s, "adc_in5_res = %d\n", charger->adc.adc_in5_res); ++ ++ return 0; ++} ++ ++static int debug_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, debug_show, inode->i_private); ++} ++ ++static const struct file_operations debug_fops = { ++ .open = debug_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static struct dentry* da9030_create_debugfs(struct da9030_charger *charger) ++{ ++ charger->debug_file = debugfs_create_file("charger", 0666, 0, charger, ++ &debug_fops); ++ return charger->debug_file; ++} ++ ++static void da9030_remove_debugfs(struct da9030_charger *charger) ++{ ++ debugfs_remove(charger->debug_file); ++} ++#else ++#define da9030_create_debugfs(x) NULL ++#define da9030_remove_debugfs(x) do {} while(0) ++#endif ++ ++static void da9030_set_charge(struct da9030_charger *charger, int on) ++{ ++/* int status = da9030_get_status(); */ ++ if (on) { ++ pr_debug("%s: enabling charger\n", __FUNCTION__); ++ da9030_set_thresholds(TBAT_HIGH_THRESHOLD, ++ TBAT_RESUME_THRESHOLD, ++ TBAT_LOW_THRESHOLD); ++ da9030_set_charger(1, 1000, 4200); ++ charger->is_charging = 1; ++ } ++ else { ++ /* disable charger */ ++ pr_debug("%s: disabling charger\n", __FUNCTION__); ++ da9030_set_charger(0, 0, 0); ++ charger->is_charging = 0; ++ } ++} ++ ++static void da9030_charging_monitor(struct work_struct *work) ++{ ++ struct da9030_charger *charger; ++ int is_on; ++ unsigned int mA, mV; ++ ++ charger = container_of(work, struct da9030_charger, work.work); ++ ++ da9030_get_charger(&is_on, &mA, &mV); ++ da9030_read_adc(&charger->adc); ++ ++ charger->status = da9030_get_status(); ++ charger->mA = mA; ++ charger->mV = mV; ++ ++ /* we wake or boot with external power on */ ++ if (!is_on && (charger->status & STATUS_CHDET)) { ++ da9030_set_charge(charger, 1); ++ return; ++ } ++ ++ if (is_on) { ++/* pr_info("%s: mA = %d, mV = %d\n", __FUNCTION__, mA, mV); */ ++/* pr_info("%s: vchmin_res = %d, vchmax_res = %d\n", */ ++/* __FUNCTION__, charger->adc.vchmin_res, */ ++/* charger->adc.vchmax_res); */ ++/* pr_info("%s: tbat_res = %d\n", */ ++/* __FUNCTION__, charger->adc.tbat_res); */ ++ if (charger->adc.vbat_res > VBAT_LOW_THRESHOLD) { ++ /* update VBAT threshlods ? */ ++ da9030_set_reg(VBATMON, VBAT_LOW_THRESHOLD); ++ } ++ if (charger->adc.vchmax_res > VCHARGE_MAX_THRESHOLD || ++ charger->adc.vchmin_res < VCHARGE_MIN_THRESHOLD || ++ /* Tempreture readings are negative */ ++ charger->adc.tbat_res < TBAT_HIGH_THRESHOLD || ++ charger->adc.tbat_res > TBAT_LOW_THRESHOLD) { ++ /* disable charger */ ++ da9030_set_charge(charger, 0); ++ } ++ } ++ ++ /* reschedule for the next time */ ++ schedule_delayed_work(&charger->work, charger->interval); ++} ++ ++void da9030_battery_release(struct device * dev) ++{ ++} ++ ++static void da9030_external_power_changed(struct power_supply *psy) ++{ ++/* struct da9030_charger *charger; */ ++ ++/* charger = container_of(psy, struct da9030_charger, bat); */ ++/* pr_info("%s:\n", __FUNCTION__); */ ++/* da9030_set_charge(charger); */ ++} ++ ++struct da9030_battery_thresh { ++ int voltage; ++ int percentage; ++}; ++ ++static struct da9030_battery_thresh vbat_ranges[] = { ++ { 150, 100}, ++ { 149, 99}, ++ { 148, 98}, ++ { 147, 98}, ++ { 146, 97}, ++ { 145, 96}, ++ { 144, 96}, ++ { 143, 95}, ++ { 142, 94}, ++ { 141, 93}, ++ { 140, 92}, ++ { 139, 91}, ++ { 138, 90}, ++ { 137, 90}, ++ { 136, 89}, ++ { 135, 88}, ++ { 134, 88}, ++ { 133, 87}, ++ { 132, 86}, ++ { 131, 85}, ++ { 130, 83}, ++ { 129, 82}, ++ { 128, 81}, ++ { 127, 81}, ++ { 126, 80}, ++ { 125, 75}, ++ { 124, 74}, ++ { 123, 73}, ++ { 122, 70}, ++ { 121, 66}, ++ { 120, 65}, ++ { 119, 64}, ++ { 118, 64}, ++ { 117, 63}, ++ { 116, 59}, ++ { 115, 58}, ++ { 114, 57}, ++ { 113, 57}, ++ { 112, 56}, ++ { 111, 50}, ++ { 110, 49}, ++ { 109, 49}, ++ { 108, 48}, ++ { 107, 48}, ++ { 106, 33}, ++ { 105, 32}, ++ { 104, 32}, ++ { 103, 32}, ++ { 102, 31}, ++ { 101, 16}, ++ { 100, 15}, ++ { 99, 15}, ++ { 98, 15}, ++ { 97, 10}, ++ { 96, 9}, ++ { 95, 7}, ++ { 94, 3}, ++ { 93, 0}, ++}; ++ ++static enum power_supply_property da9030_bat_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_HEALTH, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_CURRENT_AVG, ++ POWER_SUPPLY_PROP_CAPACITY, /* in percents! */ ++ POWER_SUPPLY_PROP_TEMP, ++ POWER_SUPPLY_PROP_MANUFACTURER, ++ POWER_SUPPLY_PROP_MODEL_NAME, ++}; ++ ++static void da9030_bat_check_status(union power_supply_propval *val) ++{ ++ int charger_on; ++ int status = da9030_get_status(); ++ ++ da9030_get_charger(&charger_on, 0, 0); ++ ++ /* FIXME: below code is very crude approximation of actual ++ states, we need to take into account voltage and current ++ measurements to determine actual charger state */ ++ if (status & STATUS_CHDET) { ++ if (charger_on) { ++ val->intval = POWER_SUPPLY_STATUS_CHARGING; ++ } ++ else { ++ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; ++ } ++ } ++ else { ++ val->intval = POWER_SUPPLY_STATUS_DISCHARGING; ++ } ++} ++ ++static void da9030_bat_check_health(union power_supply_propval *val) ++{ ++ int fault_log = da9030_get_fault_log(); ++ ++ if (fault_log & FAULT_LOG_OVER_TEMP) { ++ val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; ++ } ++ else if (fault_log & FAULT_LOG_VBAT_OVER) { ++ val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; ++ } ++ else { ++ val->intval = POWER_SUPPLY_HEALTH_GOOD; ++ } ++} ++ ++static int vbat_interpolate(int reg) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(vbat_ranges); i++ ) ++ if (vbat_ranges[i].voltage == reg) { ++ pr_debug("%s: voltage = %d, percentage = %d\n", ++ __FUNCTION__, vbat_ranges[i].voltage, ++ vbat_ranges[i].percentage); ++ return vbat_ranges[i].percentage; ++ } ++ ++ return 0; ++} ++ ++static int da9030_bat_get_property(struct power_supply *psy, ++ enum power_supply_property psp, ++ union power_supply_propval *val) ++{ ++ u32 reg; ++ struct da9030_charger *charger; ++ charger = container_of(psy, struct da9030_charger, bat); ++ ++ switch(psp) { ++ case POWER_SUPPLY_PROP_STATUS: ++ da9030_bat_check_status(val); ++ break; ++ case POWER_SUPPLY_PROP_HEALTH: ++ da9030_bat_check_health(val); ++ break; ++ case POWER_SUPPLY_PROP_TECHNOLOGY: ++ val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: ++ val->intval = VOLTAGE_MAX_DESIGN; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: ++ val->intval = VOLTAGE_MIN_DESIGN; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_NOW: ++ reg = charger->adc.vbat_res; ++ /* V = (reg / 256) * 2.65 + 2.65 (V) */ ++ val->intval = ((reg * 2650000) >> 8) + 2650000; ++ break; ++ case POWER_SUPPLY_PROP_CURRENT_AVG: ++ reg = charger->adc.ichaverage_res; ++ val->intval = reg; /* reg */ ++ break; ++ case POWER_SUPPLY_PROP_CAPACITY: ++ reg = charger->adc.vbat_res; ++ val->intval = vbat_interpolate(reg); ++ break; ++ case POWER_SUPPLY_PROP_TEMP: ++ reg = charger->adc.tbat_res; ++ val->intval = tbat_readings[reg]; ++ break; ++ case POWER_SUPPLY_PROP_MANUFACTURER: ++ val->strval = "MaxPower"; ++ pr_debug("%s: MFG = %s\n", __FUNCTION__, val->strval); ++ break; ++ case POWER_SUPPLY_PROP_MODEL_NAME: ++ val->strval = "LP555597P6H-FPS"; ++ pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); ++ break; ++ default: break; ++ } ++ ++ return 0; ++} ++ ++static void da9030_setup_battery(struct power_supply *bat) ++{ ++ bat->name = "em-x270-battery"; ++ bat->type = POWER_SUPPLY_TYPE_BATTERY; ++ bat->properties = da9030_bat_props; ++ bat->num_properties = ARRAY_SIZE(da9030_bat_props); ++ bat->get_property = da9030_bat_get_property; ++ bat->use_for_apm = 1; ++ bat->external_power_changed = da9030_external_power_changed; ++}; ++ ++static void da9030_chiover_callback(int event, void *_charger) ++{ ++ /* disable charger */ ++ struct da9030_charger *charger = _charger; ++ da9030_set_charge(charger, 0); ++} ++ ++static void da9030_tbat_callback(int event, void *_charger) ++{ ++ /* disable charger */ ++ struct da9030_charger *charger = _charger; ++ da9030_set_charge(charger, 0); ++} ++ ++static void da9030_vbat_callback(int event, void *_charger) ++{ ++ struct da9030_charger *charger = _charger; ++ da9030_read_adc(&charger->adc); ++ ++ if (charger->is_charging) { ++ if (charger->adc.vbat_res < VBAT_LOW_THRESHOLD) { ++ /* set VBAT threshold for critical */ ++ da9030_set_reg(VBATMON, VBAT_CRIT_THRESHOLD); ++ } ++ else if (charger->adc.vbat_res < VBAT_CRIT_THRESHOLD) { ++ /* notify the system of battery critical */ ++ apm_queue_event(APM_CRITICAL_SUSPEND); ++ } ++ } ++} ++ ++static void da9030_ccto_callback(int event, void *_charger) ++{ ++ /* x3 */ ++} ++ ++static void da9030_tcto_callback(int event, void *_charger) ++{ ++ /* x3 */ ++} ++ ++static void da9030_chdet_callback(int event, void *_charger) ++{ ++ struct da9030_charger *charger = _charger; ++ int status = da9030_get_status(); ++ da9030_set_charge(charger, !!(status & CHRG_CHARGER_ENABLE)); ++} ++ ++static int da9030_battery_probe(struct platform_device *pdev) ++{ ++ struct da9030_charger *charger; ++ ++ pr_debug("%s\n", __FUNCTION__); ++ charger = kzalloc(sizeof(*charger), GFP_KERNEL); ++ if (charger == NULL) { ++ return -ENOMEM; ++ } ++ ++ charger->dev = &pdev->dev; ++ ++ charger->interval = 10 * HZ; /* 10 seconds between monotor runs */ ++ da9030_setup_battery(&charger->bat); ++ ++ platform_set_drvdata(pdev, charger); ++ ++ da9030_enable_adc(); ++ ++ INIT_DELAYED_WORK(&charger->work, da9030_charging_monitor); ++ schedule_delayed_work(&charger->work, charger->interval); ++ ++ charger->debug_file = da9030_create_debugfs(charger); ++ ++ da9030_setup_battery(&charger->bat); ++ ++ da9030_register_callback(DA9030_IRQ_CHDET, ++ da9030_chdet_callback, ++ charger); ++ da9030_register_callback(DA9030_IRQ_VBATMON, ++ da9030_vbat_callback, ++ charger); ++ ++ /* critical condition events */ ++ da9030_register_callback(DA9030_IRQ_CHIOVER, ++ da9030_chiover_callback, ++ charger); ++ da9030_register_callback(DA9030_IRQ_TBAT, ++ da9030_tbat_callback, ++ charger); ++ ++ /* timer events */ ++ da9030_register_callback(DA9030_IRQ_TCTO, ++ da9030_tcto_callback, ++ charger); ++ da9030_register_callback(DA9030_IRQ_CCTO, ++ da9030_ccto_callback, ++ charger); ++ ++ power_supply_register(&pdev->dev, &charger->bat); ++ ++ return 0; ++} ++ ++static int da9030_battery_remove(struct platform_device *dev) ++{ ++ struct da9030_charger *charger = platform_get_drvdata(dev); ++ ++ pr_debug("%s\n", __FUNCTION__); ++ da9030_remove_debugfs(charger); ++ cancel_delayed_work(&charger->work); ++ power_supply_unregister(&charger->bat); ++ kfree(charger); ++ return 0; ++} ++ ++static struct platform_driver da9030_battery_driver = { ++ .driver = { ++ .name = "da9030-battery", ++ .owner = THIS_MODULE, ++ }, ++ .probe = da9030_battery_probe, ++ .remove = da9030_battery_remove, ++}; ++ ++static int da9030_battery_init(void) ++{ ++ pr_debug("%s\n", __FUNCTION__); ++ ++ return platform_driver_register(&da9030_battery_driver); ++} ++ ++static void da9030_battery_exit(void) ++{ ++ pr_debug("%s\n", __FUNCTION__); ++ ++ platform_driver_unregister(&da9030_battery_driver); ++} ++ ++module_init(da9030_battery_init); ++module_exit(da9030_battery_exit); ++ ++MODULE_DESCRIPTION("DA9030 charger driver"); ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig +index 767aed5..4c44a7a 100644 +--- a/drivers/usb/gadget/Kconfig ++++ b/drivers/usb/gadget/Kconfig +@@ -195,6 +195,26 @@ config USB_M66592 + default USB_GADGET + select USB_GADGET_SELECTED + ++config USB_GADGET_PXA27X ++ boolean "PXA 27x" ++ depends on ARCH_PXA && PXA27x ++ help ++ Intel's PXA 27x series XScale ARM-5TE processors include ++ an integrated full speed USB 1.1 device controller. ++ ++ It has 23 endpoints, as well as endpoint zero (for control ++ transfers). ++ ++ Say "y" to link the driver statically, or "m" to build a ++ dynamically linked module called "pxa27x_udc" and force all ++ gadget drivers to also be dynamically linked. ++ ++config USB_PXA27X ++ tristate ++ depends on USB_GADGET_PXA27X ++ default USB_GADGET ++ select USB_GADGET_SELECTED ++ + config USB_GADGET_GOKU + boolean "Toshiba TC86C001 'Goku-S'" + depends on PCI +diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile +index 1bc0f03..b8743bf 100644 +--- a/drivers/usb/gadget/Makefile ++++ b/drivers/usb/gadget/Makefile +@@ -9,6 +9,7 @@ obj-$(CONFIG_USB_DUMMY_HCD) += dummy_hcd.o + obj-$(CONFIG_USB_NET2280) += net2280.o + obj-$(CONFIG_USB_AMD5536UDC) += amd5536udc.o + obj-$(CONFIG_USB_PXA2XX) += pxa2xx_udc.o ++obj-$(CONFIG_USB_PXA27X) += pxa27x_udc.o + obj-$(CONFIG_USB_GOKU) += goku_udc.o + obj-$(CONFIG_USB_OMAP) += omap_udc.o + obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o +diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c +index 3aa46cf..d7d5550 100644 +--- a/drivers/usb/gadget/epautoconf.c ++++ b/drivers/usb/gadget/epautoconf.c +@@ -228,14 +228,19 @@ find_ep (struct usb_gadget *gadget, const char *name) + * + * On failure, this returns a null endpoint descriptor. + */ +-struct usb_ep * __devinit usb_ep_autoconfig ( ++struct usb_ep * usb_ep_autoconfig ( + struct usb_gadget *gadget, +- struct usb_endpoint_descriptor *desc ++ struct usb_endpoint_descriptor *desc, ++ struct usb_endpoint_config *epconfig, int numconfigs + ) + { + struct usb_ep *ep; + u8 type; + ++ /* Use device specific ep allocation code if provided */ ++ if (gadget->ops->ep_alloc) ++ return gadget->ops->ep_alloc(gadget, desc, epconfig, numconfigs); ++ + type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; + + /* First, apply chip-specific "best usage" knowledge. +diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c +index 593e235..87aa9fb 100644 +--- a/drivers/usb/gadget/ether.c ++++ b/drivers/usb/gadget/ether.c +@@ -1350,6 +1350,10 @@ static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req) + /* done sending after USB_CDC_GET_ENCAPSULATED_RESPONSE */ + } + ++#ifdef CONFIG_USB_GADGET_PXA27X ++int write_ep0_zlp(void); ++#endif ++ + static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) + { + struct eth_dev *dev = ep->driver_data; +@@ -1360,6 +1364,10 @@ static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) + status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf); + if (status < 0) + ERROR(dev, "%s: rndis parse error %d\n", __FUNCTION__, status); ++ ++#ifdef CONFIG_USB_GADGET_PXA27X ++ write_ep0_zlp(); ++#endif + spin_unlock(&dev->lock); + } + +@@ -2287,7 +2295,8 @@ eth_bind (struct usb_gadget *gadget) + struct eth_dev *dev; + struct net_device *net; + u8 cdc = 1, zlp = 1, rndis = 1; +- struct usb_ep *in_ep, *out_ep, *status_ep = NULL; ++ struct usb_ep *in_ep = NULL , *out_ep = NULL, *status_ep = NULL; ++ struct usb_endpoint_config ep_config[2]; + int status = -ENOMEM; + int gcnum; + +@@ -2386,7 +2395,30 @@ eth_bind (struct usb_gadget *gadget) + + /* all we really need is bulk IN/OUT */ + usb_ep_autoconfig_reset (gadget); +- in_ep = usb_ep_autoconfig (gadget, &fs_source_desc); ++ ++ ep_config[0].config = DEV_CONFIG_VALUE; ++#if defined(DEV_CONFIG_CDC) ++ ep_config[0].interface = data_intf.bInterfaceNumber; ++ ep_config[0].altinterface = data_intf.bAlternateSetting; ++#else /* DEV_CONFIG_SUBSET */ ++ ep_config[0].interface = subset_data_intf.bInterfaceNumber; ++ ep_config[0].altinterface = subset_data_intf.bAlternateSetting; ++#endif ++ ++#ifdef CONFIG_USB_ETH_RNDIS ++ ep_config[1].config = DEV_RNDIS_CONFIG_VALUE; ++#ifdef CONFIG_USB_GADGET_PXA27X ++ ep_config[1].interface = 0; ++#else ++ ep_config[1].interface = rndis_data_intf.bInterfaceNumber; ++#endif ++ ep_config[1].altinterface = rndis_data_intf.bAlternateSetting; ++ ++ in_ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 2); ++#else ++ in_ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 1); ++#endif ++ + if (!in_ep) { + autoconf_fail: + dev_err (&gadget->dev, +@@ -2396,7 +2428,12 @@ autoconf_fail: + } + in_ep->driver_data = in_ep; /* claim */ + +- out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); ++#ifdef CONFIG_USB_ETH_RNDIS ++ out_ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 2); ++#else ++ out_ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 1); ++#endif ++ + if (!out_ep) + goto autoconf_fail; + out_ep->driver_data = out_ep; /* claim */ +@@ -2406,7 +2443,25 @@ autoconf_fail: + * Since some hosts expect one, try to allocate one anyway. + */ + if (cdc || rndis) { +- status_ep = usb_ep_autoconfig (gadget, &fs_status_desc); ++#ifdef DEV_CONFIG_CDC ++ ep_config[0].config = DEV_CONFIG_VALUE; ++ ep_config[0].interface = control_intf.bInterfaceNumber; ++ ep_config[0].altinterface = control_intf.bAlternateSetting; ++#endif ++#ifdef CONFIG_USB_ETH_RNDIS ++ ep_config[1].config = DEV_RNDIS_CONFIG_VALUE; ++ ep_config[1].interface = rndis_control_intf.bInterfaceNumber; ++ ep_config[1].altinterface = rndis_control_intf.bAlternateSetting; ++#endif ++ ++#if defined(DEV_CONFIG_CDC) && defined(CONFIG_USB_ETH_RNDIS) ++ status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[0], 2); ++#elif defined(CONFIG_USB_ETH_RNDIS) ++ status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[1], 1); ++#else ++ status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[0], 1); ++#endif ++ + if (status_ep) { + status_ep->driver_data = status_ep; /* claim */ + } else if (rndis) { +diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c +index 965ad7b..b9cd8c9 100644 +--- a/drivers/usb/gadget/file_storage.c ++++ b/drivers/usb/gadget/file_storage.c +@@ -3841,6 +3841,7 @@ static int __init fsg_bind(struct usb_gadget *gadget) + struct usb_ep *ep; + struct usb_request *req; + char *pathbuf, *p; ++ struct usb_endpoint_config ep_config; + + fsg->gadget = gadget; + set_gadget_data(gadget, fsg); +@@ -3911,21 +3912,25 @@ static int __init fsg_bind(struct usb_gadget *gadget) + } + + /* Find all the endpoints we will use */ ++ ep_config.config = CONFIG_VALUE; ++ ep_config.interface = intf_desc.bInterfaceNumber; ++ ep_config.altinterface = intf_desc.bAlternateSetting; ++ + usb_ep_autoconfig_reset(gadget); +- ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc); ++ ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc, &ep_config, 1); + if (!ep) + goto autoconf_fail; + ep->driver_data = fsg; // claim the endpoint + fsg->bulk_in = ep; + +- ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc); ++ ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc, &ep_config, 1); + if (!ep) + goto autoconf_fail; + ep->driver_data = fsg; // claim the endpoint + fsg->bulk_out = ep; + + if (transport_is_cbi()) { +- ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc); ++ ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc, &ep_config, 1); + if (!ep) + goto autoconf_fail; + ep->driver_data = fsg; // claim the endpoint +diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c +new file mode 100644 +index 0000000..d4270d4 +--- /dev/null ++++ b/drivers/usb/gadget/pxa27x_udc.c +@@ -0,0 +1,2387 @@ ++/* ++ * Handles the Intel 27x USB Device Controller (UDC) ++ * ++ * Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker) ++ * Copyright (C) 2003 Robert Schwebel, Pengutronix ++ * Copyright (C) 2003 Benedikt Spranger, Pengutronix ++ * Copyright (C) 2003 David Brownell ++ * Copyright (C) 2003 Joshua Wise ++ * Copyright (C) 2004 Intel Corporation ++ * Copyright (C) 2005 SDG Systems, LLC (Aric Blumer) ++ * Copyright (C) 2005-2006 Openedhand Ltd. (Richard Purdie) ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ */ ++ ++#undef DEBUG ++//#define DEBUG 1 ++//#define VERBOSE DBG_VERBOSE ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/ioport.h> ++#include <linux/types.h> ++#include <linux/version.h> ++#include <linux/errno.h> ++#include <linux/platform_device.h> ++#include <linux/delay.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/init.h> ++#include <linux/timer.h> ++#include <linux/list.h> ++#include <linux/interrupt.h> ++#include <linux/proc_fs.h> ++#include <linux/mm.h> ++#include <linux/device.h> ++#include <linux/dma-mapping.h> ++ ++#include <asm/byteorder.h> ++#include <asm/dma.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/system.h> ++#include <asm/mach-types.h> ++#include <asm/unaligned.h> ++#include <asm/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++#include <linux/usb/ch9.h> ++#include <linux/usb_gadget.h> ++ ++#include <asm/arch/udc.h> ++ ++/* ++ * This driver handles the USB Device Controller (UDC) in Intel's PXA 27x ++ * series processors. ++ * ++ * Such controller drivers work with a gadget driver. The gadget driver ++ * returns descriptors, implements configuration and data protocols used ++ * by the host to interact with this device, and allocates endpoints to ++ * the different protocol interfaces. The controller driver virtualizes ++ * usb hardware so that the gadget drivers will be more portable. ++ * ++ * This UDC hardware wants to implement a bit too much USB protocol. The ++ * biggest issue is that the endpoints have to be setup before the controller ++ * can be enabled and each endpoint can only have one configuration, interface ++ * and alternative interface number. Once enabled, these cannot be changed ++ * without a controller reset. ++ * ++ * Intel Errata #22 mentions issues when changing alternate interface. ++ * The exact meaning of this remains uncertain as gadget drivers using alternate ++ * interfaces such as CDC-Ethernet appear to work... ++ */ ++ ++#define DRIVER_VERSION "01-01-2006" ++#define DRIVER_DESC "PXA 27x USB Device Controller driver" ++ ++static const char driver_name [] = "pxa27x_udc"; ++ ++static const char ep0name [] = "ep0"; ++ ++ ++#define USE_DMA ++//#undef USE_DMA ++ ++#ifdef CONFIG_PROC_FS ++#define UDC_PROC_FILE ++#endif ++ ++#include "pxa27x_udc.h" ++ ++#ifdef USE_DMA ++static int use_dma = 1; ++module_param(use_dma, bool, 0); ++MODULE_PARM_DESC(use_dma, "true to use dma"); ++ ++static void dma_nodesc_handler(int dmach, void *_ep); ++static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req); ++ ++#define DMASTR " (dma support)" ++ ++#else /* !USE_DMA */ ++#define DMASTR " (pio only)" ++#endif ++ ++#define UDCISR0_IR0 0x3 ++#define UDCISR_INT_MASK (UDC_INT_FIFOERROR | UDC_INT_PACKETCMP) ++#define UDCICR_INT_MASK UDCISR_INT_MASK ++ ++#define UDCCSR_MASK (UDCCSR_FST | UDCCSR_DME) ++ ++static void pxa27x_ep_fifo_flush(struct usb_ep *ep); ++static void nuke(struct pxa27x_ep *, int status); ++static void udc_init_ep(struct pxa27x_udc *dev); ++ ++ ++/* ++ * Endpoint Functions ++ */ ++static void pio_irq_enable(int ep_num) ++{ ++ if (ep_num < 16) ++ UDCICR0 |= 3 << (ep_num * 2); ++ else { ++ ep_num -= 16; ++ UDCICR1 |= 3 << (ep_num * 2); ++ } ++} ++ ++static void pio_irq_disable(int ep_num) ++{ ++ ep_num &= 0xf; ++ if (ep_num < 16) ++ UDCICR0 &= ~(3 << (ep_num * 2)); ++ else { ++ ep_num -= 16; ++ UDCICR1 &= ~(3 << (ep_num * 2)); ++ } ++} ++ ++/* The UDCCR reg contains mask and interrupt status bits, ++ * so using '|=' isn't safe as it may ack an interrupt. ++ */ ++#define UDCCR_MASK_BITS (UDCCR_OEN | UDCCR_UDE) ++ ++static inline void udc_set_mask_UDCCR(int mask) ++{ ++ UDCCR = (UDCCR & UDCCR_MASK_BITS) | (mask & UDCCR_MASK_BITS); ++} ++ ++static inline void udc_clear_mask_UDCCR(int mask) ++{ ++ UDCCR = (UDCCR & UDCCR_MASK_BITS) & ~(mask & UDCCR_MASK_BITS); ++} ++ ++static inline void udc_ack_int_UDCCR(int mask) ++{ ++ /* udccr contains the bits we dont want to change */ ++ __u32 udccr = UDCCR & UDCCR_MASK_BITS; ++ ++ UDCCR = udccr | (mask & ~UDCCR_MASK_BITS); ++} ++ ++/* ++ * Endpoint enable/disable ++ * ++ * Not much to do here as the ep_alloc function sets up most things. Once ++ * enabled, not much of the pxa27x configuration can be changed. ++ * ++ */ ++static int pxa27x_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ struct pxa27x_udc *dev; ++ ++ if (!_ep || !desc || _ep->name == ep0name ++ || desc->bDescriptorType != USB_DT_ENDPOINT ++ || ep->fifo_size < le16_to_cpu(desc->wMaxPacketSize)) { ++ dev_err(ep->dev->dev, "%s, bad ep or descriptor\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* xfer types must match, except that interrupt ~= bulk */ ++ if( ep->ep_type != USB_ENDPOINT_XFER_BULK ++ && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { ++ dev_err(ep->dev->dev, "%s, %s type mismatch\n", __FUNCTION__, _ep->name); ++ return -EINVAL; ++ } ++ ++ /* hardware _could_ do smaller, but driver doesn't */ ++ if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK ++ && le16_to_cpu (desc->wMaxPacketSize) ++ != BULK_FIFO_SIZE) ++ || !desc->wMaxPacketSize) { ++ dev_err(ep->dev->dev, "%s, bad %s maxpacket\n", __FUNCTION__, _ep->name); ++ return -ERANGE; ++ } ++ ++ dev = ep->dev; ++ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) { ++ dev_err(ep->dev->dev, "%s, bogus device state\n", __FUNCTION__); ++ return -ESHUTDOWN; ++ } ++ ++ ep->desc = desc; ++ ep->dma = -1; ++ ep->stopped = 0; ++ ep->pio_irqs = ep->dma_irqs = 0; ++ ep->usb_ep->maxpacket = le16_to_cpu(desc->wMaxPacketSize); ++ ++ /* flush fifo (mostly for OUT buffers) */ ++ pxa27x_ep_fifo_flush(_ep); ++ ++ /* ... reset halt state too, if we could ... */ ++ ++#ifdef USE_DMA ++ /* for (some) bulk and ISO endpoints, try to get a DMA channel and ++ * bind it to the endpoint. otherwise use PIO. ++ */ ++ dev_dbg(ep->dev->dev, "%s: called attributes=%d\n", __FUNCTION__, ep->ep_type); ++ switch (ep->ep_type) { ++ case USB_ENDPOINT_XFER_ISOC: ++ if (le16_to_cpu(desc->wMaxPacketSize) % 32) ++ break; ++ // fall through ++ case USB_ENDPOINT_XFER_BULK: ++ if (!use_dma || !ep->reg_drcmr) ++ break; ++ ep->dma = pxa_request_dma((char *)_ep->name, (le16_to_cpu(desc->wMaxPacketSize) > 64) ++ ? DMA_PRIO_MEDIUM : DMA_PRIO_LOW, dma_nodesc_handler, ep); ++ if (ep->dma >= 0) { ++ *ep->reg_drcmr = DRCMR_MAPVLD | ep->dma; ++ dev_dbg(ep->dev->dev, "%s using dma%d\n", _ep->name, ep->dma); ++ } ++ default: ++ break; ++ } ++#endif ++ DBG(DBG_VERBOSE, "enabled %s\n", _ep->name); ++ return 0; ++} ++ ++static int pxa27x_ep_disable(struct usb_ep *_ep) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ unsigned long flags; ++ ++ if (!_ep || !ep->desc) { ++ dev_err(ep->dev->dev, "%s, %s not enabled\n", __FUNCTION__, ++ _ep ? _ep->name : NULL); ++ return -EINVAL; ++ } ++ local_irq_save(flags); ++ nuke(ep, -ESHUTDOWN); ++ ++#ifdef USE_DMA ++ if (ep->dma >= 0) { ++ *ep->reg_drcmr = 0; ++ pxa_free_dma(ep->dma); ++ ep->dma = -1; ++ } ++#endif ++ ++ /* flush fifo (mostly for IN buffers) */ ++ pxa27x_ep_fifo_flush(_ep); ++ ++ ep->desc = 0; ++ ep->stopped = 1; ++ ++ local_irq_restore(flags); ++ DBG(DBG_VERBOSE, "%s disabled\n", _ep->name); ++ return 0; ++} ++ ++ ++ ++/* for the pxa27x, these can just wrap kmalloc/kfree. gadget drivers ++ * must still pass correctly initialized endpoints, since other controller ++ * drivers may care about how it's currently set up (dma issues etc). ++ */ ++ ++/* ++ * pxa27x_ep_alloc_request - allocate a request data structure ++ */ ++static struct usb_request * ++pxa27x_ep_alloc_request(struct usb_ep *_ep, unsigned gfp_flags) ++{ ++ struct pxa27x_request *req; ++ ++ req = kzalloc(sizeof *req, gfp_flags); ++ if (!req) ++ return 0; ++ ++ INIT_LIST_HEAD(&req->queue); ++ return &req->req; ++} ++ ++ ++/* ++ * pxa27x_ep_free_request - deallocate a request data structure ++ */ ++static void ++pxa27x_ep_free_request(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct pxa27x_request *req; ++ ++ req = container_of(_req, struct pxa27x_request, req); ++ WARN_ON(!list_empty(&req->queue)); ++ kfree(req); ++} ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * done - retire a request; caller blocked irqs ++ */ ++static void done(struct pxa27x_ep *ep, struct pxa27x_request *req, int status) ++{ ++ list_del_init(&req->queue); ++ if (likely (req->req.status == -EINPROGRESS)) ++ req->req.status = status; ++ else ++ status = req->req.status; ++ ++ if (status && status != -ESHUTDOWN) ++ DBG(DBG_VERBOSE, "complete %s req %p stat %d len %u/%u\n", ++ ep->usb_ep->name, &req->req, status, ++ req->req.actual, req->req.length); ++ ++ /* don't modify queue heads during completion callback */ ++ req->req.complete(ep->usb_ep, &req->req); ++} ++ ++ ++static inline void ep0_idle(struct pxa27x_udc *dev) ++{ ++ dev->ep0state = EP0_IDLE; ++} ++ ++static int write_packet(volatile u32 *uddr, struct pxa27x_request *req, unsigned max) ++{ ++ u32 *buf; ++ int length, count, remain; ++ ++ buf = (u32*)(req->req.buf + req->req.actual); ++ prefetch(buf); ++ ++ /* how big will this packet be? */ ++ length = min(req->req.length - req->req.actual, max); ++ req->req.actual += length; ++ ++ remain = length & 0x3; ++ count = length & ~(0x3); ++ ++ //dev_dbg(ep->dev->dev, "Length %d, Remain %d, Count %d\n",length, remain, count); ++ ++ while (likely(count)) { ++ //dev_dbg(ep->dev->dev, "Sending:0x%x\n", *buf); ++ *uddr = *buf++; ++ count -= 4; ++ } ++ ++ if (remain) { ++ volatile u8* reg=(u8*)uddr; ++ char *rd =(u8*)buf; ++ ++ while (remain--) { ++ *reg=*rd++; ++ } ++ } ++ ++ return length; ++} ++ ++/* ++ * write to an IN endpoint fifo, as many packets as possible. ++ * irqs will use this to write the rest later. ++ * caller guarantees at least one packet buffer is ready (or a zlp). ++ */ ++static int ++write_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ unsigned max; ++ ++ max = le16_to_cpu(ep->desc->wMaxPacketSize); ++ do { ++ int count, is_last, is_short; ++ ++ //dev_dbg(ep->dev->dev, "write_fifo7 %x\n", *ep->reg_udccsr); ++ ++ if (*ep->reg_udccsr & UDCCSR_PC) { ++ //dev_dbg(ep->dev->dev, "Transmit Complete\n"); ++ *ep->reg_udccsr = UDCCSR_PC | (*ep->reg_udccsr & UDCCSR_MASK); ++ } ++ ++ if (*ep->reg_udccsr & UDCCSR_TRN) { ++ //dev_dbg(ep->dev->dev, "Clearing Underrun\n"); ++ *ep->reg_udccsr = UDCCSR_TRN | (*ep->reg_udccsr & UDCCSR_MASK); ++ } ++ //dev_dbg(ep->dev->dev, "write_fifo8 %x\n", *ep->reg_udccsr); ++ ++ count = write_packet(ep->reg_udcdr, req, max); ++ ++ /* last packet is usually short (or a zlp) */ ++ if (unlikely (count != max)) ++ is_last = is_short = 1; ++ else { ++ if (likely(req->req.length != req->req.actual) ++ || req->req.zero) ++ is_last = 0; ++ else ++ is_last = 1; ++ /* interrupt/iso maxpacket may not fill the fifo */ ++ is_short = unlikely (max < ep->fifo_size); ++ } ++ ++ //dev_dbg(ep->dev->dev, "write_fifo0 %x\n", *ep->reg_udccsr); ++ ++ dev_dbg(ep->dev->dev, "wrote %s count:%d bytes%s%s %d left %p\n", ++ ep->usb_ep->name, count, ++ is_last ? "/L" : "", is_short ? "/S" : "", ++ req->req.length - req->req.actual, &req->req); ++ ++ /* let loose that packet. maybe try writing another one, ++ * double buffering might work. ++ */ ++ ++ if (is_short) ++ *ep->reg_udccsr = UDCCSR_SP | (*ep->reg_udccsr & UDCCSR_MASK); ++ ++ dev_dbg(ep->dev->dev, "write_fifo0.5 %x\n", *ep->reg_udccsr); ++ ++ /* requests complete when all IN data is in the FIFO */ ++ if (is_last) { ++ done(ep, req, 0); ++ if (list_empty(&ep->queue) || unlikely(ep->dma >= 0)) { ++ pio_irq_disable(ep->pxa_ep_num); ++ //dev_dbg(ep->dev->dev, "write_fifo1 %x\n", *ep->reg_udccsr); ++#ifdef USE_DMA ++ /* unaligned data and zlps couldn't use dma */ ++ if (unlikely(!list_empty(&ep->queue))) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep,req); ++ return 0; ++ } ++#endif ++ } ++ //dev_dbg(ep->dev->dev, "write_fifo2 %x\n", *ep->reg_udccsr); ++ return 1; ++ } ++ ++ // TODO experiment: how robust can fifo mode tweaking be? ++ // double buffering is off in the default fifo mode, which ++ // prevents TFS from being set here. ++ ++ } while (*ep->reg_udccsr & UDCCSR_FS); ++ //dev_dbg(ep->dev->dev, "write_fifo2 %x\n", *ep->reg_udccsr); ++ return 0; ++} ++ ++/* caller asserts req->pending (ep0 irq status nyet cleared); starts ++ * ep0 data stage. these chips want very simple state transitions. ++ */ ++static inline ++void ep0start(struct pxa27x_udc *dev, u32 flags, const char *tag) ++{ ++ UDCCSR0 = flags|UDCCSR0_SA|UDCCSR0_OPC; ++ UDCISR0 = UDCICR_INT(0, UDC_INT_FIFOERROR | UDC_INT_PACKETCMP); ++ dev->req_pending = 0; ++ DBG(DBG_VERY_NOISY, "%s %s, %02x/%02x\n", ++ __FUNCTION__, tag, UDCCSR0, flags); ++} ++ ++static int ++write_ep0_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ unsigned count; ++ int is_short; ++ ++ count = write_packet(&UDCDR0, req, EP0_FIFO_SIZE); ++ ep->dev->stats.write.bytes += count; ++ ++ /* last packet "must be" short (or a zlp) */ ++ is_short = (count != EP0_FIFO_SIZE); ++ ++ DBG(DBG_VERY_NOISY, "ep0in %d bytes %d left %p\n", count, ++ req->req.length - req->req.actual, &req->req); ++ ++ if (unlikely (is_short)) { ++ if (ep->dev->req_pending) ++ ep0start(ep->dev, UDCCSR0_IPR, "short IN"); ++ else ++ UDCCSR0 = UDCCSR0_IPR; ++ ++ count = req->req.length; ++ done(ep, req, 0); ++ ep0_idle(ep->dev); ++#if 0 ++ /* This seems to get rid of lost status irqs in some cases: ++ * host responds quickly, or next request involves config ++ * change automagic, or should have been hidden, or ... ++ * ++ * FIXME get rid of all udelays possible... ++ */ ++ if (count >= EP0_FIFO_SIZE) { ++ count = 100; ++ do { ++ if ((UDCCSR0 & UDCCSR0_OPC) != 0) { ++ /* clear OPC, generate ack */ ++ UDCCSR0 = UDCCSR0_OPC; ++ break; ++ } ++ count--; ++ udelay(1); ++ } while (count); ++ } ++#endif ++ } else if (ep->dev->req_pending) ++ ep0start(ep->dev, 0, "IN"); ++ return is_short; ++} ++ ++ ++/* ++ * read_fifo - unload packet(s) from the fifo we use for usb OUT ++ * transfers and put them into the request. caller should have made ++ * sure there's at least one packet ready. ++ * ++ * returns true if the request completed because of short packet or the ++ * request buffer having filled (and maybe overran till end-of-packet). ++ */ ++static int read_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ for (;;) { ++ u32 *buf; ++ int bufferspace, count, is_short; ++ ++ /* make sure there's a packet in the FIFO.*/ ++ if (unlikely ((*ep->reg_udccsr & UDCCSR_PC) == 0)) ++ break; ++ buf =(u32*) (req->req.buf + req->req.actual); ++ prefetchw(buf); ++ bufferspace = req->req.length - req->req.actual; ++ ++ /* read all bytes from this packet */ ++ if (likely (*ep->reg_udccsr & UDCCSR_BNE)) { ++ count = 0x3ff & *ep->reg_udcbcr; ++ req->req.actual += min(count, bufferspace); ++ } else /* zlp */ ++ count = 0; ++ ++ is_short = (count < ep->usb_ep->maxpacket); ++ dev_dbg(ep->dev->dev, "read %s udccsr:%02x, count:%d bytes%s req %p %d/%d\n", ++ ep->usb_ep->name, *ep->reg_udccsr, count, ++ is_short ? "/S" : "", ++ &req->req, req->req.actual, req->req.length); ++ ++ count = min(count, bufferspace); ++ while (likely (count > 0)) { ++ *buf++ = *ep->reg_udcdr; ++ count -= 4; ++ } ++ dev_dbg(ep->dev->dev, "Buf:0x%p\n", req->req.buf); ++ ++ *ep->reg_udccsr = UDCCSR_PC; ++ /* RPC/RSP/RNE could now reflect the other packet buffer */ ++ ++ /* completion */ ++ if (is_short || req->req.actual == req->req.length) { ++ done(ep, req, 0); ++ if (list_empty(&ep->queue)) ++ pio_irq_disable(ep->pxa_ep_num); ++ return 1; ++ } ++ ++ /* finished that packet. the next one may be waiting... */ ++ } ++ return 0; ++} ++ ++/* ++ * special ep0 version of the above. no UBCR0 or double buffering; status ++ * handshaking is magic. most device protocols don't need control-OUT. ++ * CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other ++ * protocols do use them. ++ */ ++static int read_ep0_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ u32 *buf, word; ++ unsigned bufferspace; ++ ++ buf = (u32*) (req->req.buf + req->req.actual); ++ bufferspace = req->req.length - req->req.actual; ++ ++ while (UDCCSR0 & UDCCSR0_RNE) { ++ word = UDCDR0; ++ ++ if (unlikely (bufferspace == 0)) { ++ /* this happens when the driver's buffer ++ * is smaller than what the host sent. ++ * discard the extra data. ++ */ ++ if (req->req.status != -EOVERFLOW) ++ dev_info(ep->dev->dev, "%s overflow\n", ep->usb_ep->name); ++ req->req.status = -EOVERFLOW; ++ } else { ++ *buf++ = word; ++ req->req.actual += 4; ++ bufferspace -= 4; ++ } ++ } ++ ++ UDCCSR0 = UDCCSR0_OPC ; ++ ++ /* completion */ ++ if (req->req.actual >= req->req.length) ++ return 1; ++ ++ /* finished that packet. the next one may be waiting... */ ++ return 0; ++} ++ ++#ifdef USE_DMA ++ ++#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE) ++static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req) ++{ ++ u32 dcmd = 0; ++ u32 len = req->req.length; ++ u32 buf = req->req.dma; ++ u32 fifo = io_v2p((u32)ep->reg_udcdr); ++ ++ buf += req->req.actual; ++ len -= req->req.actual; ++ ep->dma_con = 0; ++ ++ DMSG("%s: req:0x%p length:%d, actual:%d dma:%d\n", ++ __FUNCTION__, &req->req, req->req.length, ++ req->req.actual,ep->dma); ++ ++ /* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */ ++ DCSR(ep->dma) = DCSR_NODESC; ++ if (buf & 0x3) ++ DALGN |= 1 << ep->dma; ++ else ++ DALGN &= ~(1 << ep->dma); ++ ++ if (ep->dir_in) { ++ DSADR(ep->dma) = buf; ++ DTADR(ep->dma) = fifo; ++ if (len > MAX_IN_DMA) { ++ len= MAX_IN_DMA; ++ ep->dma_con =1 ; ++ } else if (len >= ep->usb_ep->maxpacket) { ++ if ((ep->dma_con = (len % ep->usb_ep->maxpacket) != 0)) ++ len = ep->usb_ep->maxpacket; ++ } ++ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN ++ | DCMD_FLOWTRG | DCMD_INCSRCADDR; ++ } else { ++ DSADR(ep->dma) = fifo; ++ DTADR(ep->dma) = buf; ++ dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN ++ | DCMD_FLOWSRC | DCMD_INCTRGADDR; ++ } ++ *ep->reg_udccsr = UDCCSR_DME; ++ DCMD(ep->dma) = dcmd; ++ DCSR(ep->dma) = DCSR_NODESC | DCSR_EORIRQEN \ ++ | ((ep->dir_in) ? DCSR_STOPIRQEN : 0); ++ *ep->reg_drcmr = ep->dma | DRCMR_MAPVLD; ++ DCSR(ep->dma) |= DCSR_RUN; ++} ++ ++static void cancel_dma(struct pxa27x_ep *ep) ++{ ++ struct pxa27x_request *req; ++ u32 tmp; ++ ++ if (DCSR(ep->dma) == 0 || list_empty(&ep->queue)) ++ return; ++ ++ DMSG("hehe dma:%d,dcsr:0x%x\n", ep->dma, DCSR(ep->dma)); ++ DCSR(ep->dma) = 0; ++ while ((DCSR(ep->dma) & DCSR_STOPSTATE) == 0) ++ cpu_relax(); ++ ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ tmp = DCMD(ep->dma) & DCMD_LENGTH; ++ req->req.actual = req->req.length - tmp; ++ ++ /* the last tx packet may be incomplete, so flush the fifo. ++ * FIXME correct req.actual if we can ++ */ ++ *ep->reg_udccsr = UDCCSR_FEF; ++} ++ ++static void dma_nodesc_handler(int dmach, void *_ep) ++{ ++ struct pxa27x_ep *ep = _ep; ++ struct pxa27x_request *req, *req_next; ++ u32 dcsr, tmp, completed; ++ ++ local_irq_disable(); ++ ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ ++ DMSG("%s, buf:0x%p\n",__FUNCTION__, req->req.buf); ++ ++ ep->dma_irqs++; ++ ep->dev->stats.irqs++; ++ ++ completed = 0; ++ ++ dcsr = DCSR(dmach); ++ DCSR(ep->dma) &= ~DCSR_RUN; ++ ++ if (dcsr & DCSR_BUSERR) { ++ DCSR(dmach) = DCSR_BUSERR; ++ dev_err(ep->dev->dev, "DMA Bus Error\n"); ++ req->req.status = -EIO; ++ completed = 1; ++ } else if (dcsr & DCSR_ENDINTR) { ++ DCSR(dmach) = DCSR_ENDINTR; ++ if (ep->dir_in) { ++ tmp = req->req.length - req->req.actual; ++ /* Last packet is a short one*/ ++ if (tmp < ep->usb_ep->maxpacket) { ++ int count = 0; ++ ++ *ep->reg_udccsr = UDCCSR_SP | \ ++ (*ep->reg_udccsr & UDCCSR_MASK); ++ /*Wait for packet out */ ++ while( (count++ < 10000) && \ ++ !(*ep->reg_udccsr & UDCCSR_FS)); ++ if (count >= 10000) ++ DMSG("Failed to send packet\n"); ++ else ++ DMSG("%s: short packet sent len:%d," ++ "length:%d,actual:%d\n", __FUNCTION__, ++ tmp, req->req.length, req->req.actual); ++ req->req.actual = req->req.length; ++ completed = 1; ++ /* There are still packets to transfer */ ++ } else if ( ep->dma_con) { ++ DMSG("%s: more packets,length:%d,actual:%d\n", ++ __FUNCTION__,req->req.length, ++ req->req.actual); ++ req->req.actual += ep->usb_ep->maxpacket; ++ completed = 0; ++ } else { ++ DMSG("%s: no more packets,length:%d," ++ "actual:%d\n", __FUNCTION__, ++ req->req.length, req->req.actual); ++ req->req.actual = req->req.length; ++ completed = 1; ++ } ++ } else { ++ req->req.actual = req->req.length; ++ completed = 1; ++ } ++ } else if (dcsr & DCSR_EORINTR) { //Only happened in OUT DMA ++ int remain,udccsr ; ++ ++ DCSR(dmach) = DCSR_EORINTR; ++ remain = DCMD(dmach) & DCMD_LENGTH; ++ req->req.actual = req->req.length - remain; ++ ++ udccsr = *ep->reg_udccsr; ++ if (udccsr & UDCCSR_SP) { ++ *ep->reg_udccsr = UDCCSR_PC | (udccsr & UDCCSR_MASK); ++ completed = 1; ++ } ++ DMSG("%s: length:%d actual:%d\n", ++ __FUNCTION__, req->req.length, req->req.actual); ++ } else ++ DMSG("%s: Others dma:%d DCSR:0x%x DCMD:0x%x\n", ++ __FUNCTION__, dmach, DCSR(dmach), DCMD(dmach)); ++ ++ if (likely(completed)) { ++ if (req->queue.next != &ep->queue) { ++ req_next = list_entry(req->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep, req_next); ++ } ++ done(ep, req, 0); ++ } else { ++ kick_dma(ep, req); ++ } ++ ++ local_irq_enable(); ++} ++ ++#endif ++/*-------------------------------------------------------------------------*/ ++ ++static int ++pxa27x_ep_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) ++{ ++ struct pxa27x_virt_ep *virt_ep; ++ struct pxa27x_ep *ep; ++ struct pxa27x_request *req; ++ struct pxa27x_udc *dev; ++ unsigned long flags; ++ ++ virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ ep = virt_ep->pxa_ep; ++ ++ req = container_of(_req, struct pxa27x_request, req); ++ if (unlikely (!_req || !_req->complete || !_req->buf|| ++ !list_empty(&req->queue))) { ++ DMSG("%s, bad params\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ if (unlikely (!_ep || (!ep->desc && _ep->name != ep0name))) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ DMSG("%s, ep point %d is queue\n", __FUNCTION__, ep->ep_num); ++ ++ dev = ep->dev; ++ if (unlikely (!dev->driver ++ || dev->gadget.speed == USB_SPEED_UNKNOWN)) { ++ DMSG("%s, bogus device state\n", __FUNCTION__); ++ return -ESHUTDOWN; ++ } ++ ++ /* iso is always one packet per request, that's the only way ++ * we can report per-packet status. that also helps with dma. ++ */ ++ if (unlikely (ep->ep_type == USB_ENDPOINT_XFER_ISOC ++ && req->req.length > le16_to_cpu ++ (ep->desc->wMaxPacketSize))) ++ return -EMSGSIZE; ++ ++#ifdef USE_DMA ++ // FIXME caller may already have done the dma mapping ++ if (ep->dma >= 0) { ++ _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, ++ (ep->dir_in) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); ++ } ++#endif ++ ++ DBG(DBG_NOISY, "%s queue req %p, len %d buf %p\n", ++ _ep->name, _req, _req->length, _req->buf); ++ ++ local_irq_save(flags); ++ ++ _req->status = -EINPROGRESS; ++ _req->actual = 0; ++ ++ /* kickstart this i/o queue? */ ++ if (list_empty(&ep->queue) && !ep->stopped) { ++ if (ep->desc == 0 /* ep0 */) { ++ unsigned length = _req->length; ++ ++ switch (dev->ep0state) { ++ case EP0_IN_DATA_PHASE: ++ dev->stats.write.ops++; ++ if (write_ep0_fifo(ep, req)) ++ req = 0; ++ break; ++ ++ case EP0_OUT_DATA_PHASE: ++ dev->stats.read.ops++; ++ if (dev->req_pending) ++ ep0start(dev, UDCCSR0_IPR, "OUT"); ++ if (length == 0 || ((UDCCSR0 & UDCCSR0_RNE) != 0 ++ && read_ep0_fifo(ep, req))) { ++ ep0_idle(dev); ++ done(ep, req, 0); ++ req = 0; ++ } ++ break; ++ case EP0_NO_ACTION: ++ ep0_idle(dev); ++ req=0; ++ break; ++ default: ++ DMSG("ep0 i/o, odd state %d\n", dev->ep0state); ++ local_irq_restore (flags); ++ return -EL2HLT; ++ } ++#ifdef USE_DMA ++ /* either start dma or prime pio pump */ ++ } else if (ep->dma >= 0) { ++ kick_dma(ep, req); ++#endif ++ /* can the FIFO can satisfy the request immediately? */ ++ } else if (ep->dir_in && (*ep->reg_udccsr & UDCCSR_FS) != 0 ++ && write_fifo(ep, req)) { ++ req = 0; ++ } else if ((*ep->reg_udccsr & UDCCSR_FS) != 0 ++ && read_fifo(ep, req)) { ++ req = 0; ++ } ++ DMSG("req:%p,ep->desc:%p,ep->dma:%d\n", req, ep->desc, ep->dma); ++ if (likely (req && ep->desc) && ep->dma < 0) ++ pio_irq_enable(ep->pxa_ep_num); ++ } ++ ++ /* pio or dma irq handler advances the queue. */ ++ if (likely (req != 0)) ++ list_add_tail(&req->queue, &ep->queue); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++ ++/* ++ * nuke - dequeue ALL requests ++ */ ++static void nuke(struct pxa27x_ep *ep, int status) ++{ ++ struct pxa27x_request *req; ++ ++ /* called with irqs blocked */ ++#ifdef USE_DMA ++ if (ep->dma >= 0 && !ep->stopped) ++ cancel_dma(ep); ++#endif ++ while (!list_empty(&ep->queue)) { ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ done(ep, req, status); ++ } ++ if (ep->desc) ++ pio_irq_disable(ep->pxa_ep_num); ++} ++ ++ ++/* dequeue JUST ONE request */ ++static int pxa27x_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ struct pxa27x_request *req; ++ unsigned long flags; ++ ++ if (!_ep || _ep->name == ep0name) ++ return -EINVAL; ++ ++ local_irq_save(flags); ++ ++ /* make sure it's actually queued on this endpoint */ ++ list_for_each_entry(req, &ep->queue, queue) { ++ if (&req->req == _req) ++ break; ++ } ++ if (&req->req != _req) { ++ local_irq_restore(flags); ++ return -EINVAL; ++ } ++ ++#ifdef USE_DMA ++ if (ep->dma >= 0 && ep->queue.next == &req->queue && !ep->stopped) { ++ cancel_dma(ep); ++ done(ep, req, -ECONNRESET); ++ /* restart i/o */ ++ if (!list_empty(&ep->queue)) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ kick_dma(ep, req); ++ } ++ } else ++#endif ++ done(ep, req, -ECONNRESET); ++ ++ local_irq_restore(flags); ++ return 0; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static int pxa27x_ep_set_halt(struct usb_ep *_ep, int value) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ unsigned long flags; ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ if (unlikely (!_ep || (!ep->desc && _ep->name != ep0name)) ++ || ep->ep_type == USB_ENDPOINT_XFER_ISOC) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ if (value == 0) { ++ /* this path (reset toggle+halt) is needed to implement ++ * SET_INTERFACE on normal hardware. but it can't be ++ * done from software on the PXA UDC, and the hardware ++ * forgets to do it as part of SET_INTERFACE automagic. ++ */ ++ DMSG("only host can clear %s halt\n", _ep->name); ++ return -EROFS; ++ } ++ ++ local_irq_save(flags); ++ ++ if (ep->dir_in && ((*ep->reg_udccsr & UDCCSR_FS) == 0 ++ || !list_empty(&ep->queue))) { ++ local_irq_restore(flags); ++ return -EAGAIN; ++ } ++ ++ /* FST bit is the same for control, bulk in, bulk out, interrupt in */ ++ *ep->reg_udccsr = UDCCSR_FST|UDCCSR_FEF; ++ ++ /* ep0 needs special care */ ++ if (!ep->desc) { ++ start_watchdog(ep->dev); ++ ep->dev->req_pending = 0; ++ ep->dev->ep0state = EP0_STALL; ++ ++ /* and bulk/intr endpoints like dropping stalls too */ ++ } else { ++ unsigned i; ++ for (i = 0; i < 1000; i += 20) { ++ if (*ep->reg_udccsr & UDCCSR_SST) ++ break; ++ udelay(20); ++ } ++ } ++ local_irq_restore(flags); ++ ++ DBG(DBG_VERBOSE, "%s halt\n", _ep->name); ++ return 0; ++} ++ ++static int pxa27x_ep_fifo_status(struct usb_ep *_ep) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ ++ if (!_ep) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return -ENODEV; ++ } ++ /* pxa can't report unclaimed bytes from IN fifos */ ++ if (ep->dir_in) ++ return -EOPNOTSUPP; ++ if (ep->dev->gadget.speed == USB_SPEED_UNKNOWN ++ || (*ep->reg_udccsr & UDCCSR_FS) == 0) ++ return 0; ++ else ++ return (*ep->reg_udcbcr & 0xfff) + 1; ++} ++ ++static void pxa27x_ep_fifo_flush(struct usb_ep *_ep) ++{ ++ struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ struct pxa27x_ep *ep = virt_ep->pxa_ep; ++ ++ DMSG("pxa27x_ep_fifo_flush\n"); ++ ++ if (!_ep || _ep->name == ep0name || !list_empty(&ep->queue)) { ++ DMSG("%s, bad ep\n", __FUNCTION__); ++ return; ++ } ++ ++ /* toggle and halt bits stay unchanged */ ++ ++ /* for OUT, just read and discard the FIFO contents. */ ++ if (!ep->dir_in) { ++ while (((*ep->reg_udccsr) & UDCCSR_BNE) != 0) ++ (void) *ep->reg_udcdr; ++ return; ++ } ++ ++ /* most IN status is the same, but ISO can't stall */ ++ *ep->reg_udccsr = UDCCSR_PC|UDCCSR_FST|UDCCSR_TRN ++ | (ep->ep_type == USB_ENDPOINT_XFER_ISOC) ++ ? 0 : UDCCSR_SST; ++} ++ ++ ++static struct usb_ep_ops pxa27x_ep_ops = { ++ .enable = pxa27x_ep_enable, ++ .disable = pxa27x_ep_disable, ++ ++ .alloc_request = pxa27x_ep_alloc_request, ++ .free_request = pxa27x_ep_free_request, ++ ++ .queue = pxa27x_ep_queue, ++ .dequeue = pxa27x_ep_dequeue, ++ ++ .set_halt = pxa27x_ep_set_halt, ++ .fifo_status = pxa27x_ep_fifo_status, ++ .fifo_flush = pxa27x_ep_fifo_flush, ++}; ++ ++ ++/* --------------------------------------------------------------------------- ++ * device-scoped parts of the api to the usb controller hardware ++ * --------------------------------------------------------------------------- ++ */ ++ ++static inline unsigned int validate_fifo_size(u8 bmAttributes) ++{ ++ switch (bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { ++ case USB_ENDPOINT_XFER_CONTROL: ++ return EP0_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_ISOC: ++ return ISO_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_BULK: ++ return BULK_FIFO_SIZE; ++ break; ++ case USB_ENDPOINT_XFER_INT: ++ return INT_FIFO_SIZE; ++ break; ++ default: ++ break; ++ } ++} ++ ++static void pxa27x_ep_free(struct usb_gadget *gadget, struct usb_ep *_ep) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ struct pxa27x_virt_ep *virt_ep; ++ int i; ++ ++ virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if (dev->ep[i].usb_ep == &virt_ep->usb_ep) { ++ if (dev->ep[i].desc) { ++ virt_ep->pxa_ep = &dev->ep[i]; ++ pxa27x_ep_disable(&virt_ep->usb_ep); ++ } ++ dev->ep[i].usb_ep = NULL; ++ } ++ } ++ ++ if (!list_empty(&virt_ep->usb_ep.ep_list)) ++ list_del_init(&virt_ep->usb_ep.ep_list); ++ ++ kfree(virt_ep->usb_ep.name); ++ kfree(virt_ep); ++} ++ ++static void pxa27x_ep_freeall(struct usb_gadget *gadget) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ int i; ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if(dev->ep[i].usb_ep) ++ pxa27x_ep_free(gadget, dev->ep[i].usb_ep); ++ } ++} ++ ++#define NAME_SIZE 18 ++ ++static int pxa27x_find_free_ep(struct pxa27x_udc *dev) ++{ ++ int i; ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if(!dev->ep[i].assigned) ++ return i; ++ } ++ return -1; ++} ++ ++/* ++ * Endpoint Allocation/Configuration ++ * ++ * pxa27x endpoint configuration is fixed when the device is enabled. Any pxa ++ * endpoint is only active in one configuration, interface and alternate ++ * interface combination so to support gadget drivers, we map one usb_ep to ++ * one of several pxa ep's. One pxa endpoint is assigned per configuration ++ * combination. ++ */ ++static struct usb_ep* pxa27x_ep_alloc(struct usb_gadget *gadget, struct usb_endpoint_descriptor *desc, ++ struct usb_endpoint_config *epconfig, int configs) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ struct pxa27x_virt_ep *virt_ep; ++ unsigned int i, fifo_size; ++ char *name; ++ ++ if (unlikely(configs < 1)) { ++ dev_err(dev->dev, "%s: Error in config data\n", __FUNCTION__); ++ return NULL; ++ } ++ ++ virt_ep = kmalloc(sizeof(struct pxa27x_virt_ep), GFP_KERNEL); ++ name = kmalloc(NAME_SIZE, GFP_KERNEL); ++ if (!virt_ep || !name) { ++ dev_err(dev->dev, "%s: -ENOMEM\n", __FUNCTION__); ++ kfree(name); ++ kfree(virt_ep); ++ return NULL; ++ } ++ ++ if (!(desc->wMaxPacketSize)) { ++ fifo_size = validate_fifo_size(desc->bmAttributes); ++ desc->wMaxPacketSize = fifo_size; ++ } else { ++ fifo_size = desc->wMaxPacketSize; ++ } ++ ++ DMSG("pxa27x_ep_alloc: bLength: %d, bDescriptorType: %x, bEndpointAddress: %x,\n" ++ " bmAttributes: %x, wMaxPacketSize: %d\n", desc->bLength, ++ desc->bDescriptorType, desc->bEndpointAddress, desc->bmAttributes, ++ desc->wMaxPacketSize); ++ ++ if (!(desc->bEndpointAddress & 0xF)) ++ desc->bEndpointAddress |= dev->ep_num; ++ ++ for (i = 0; i < configs; i++) ++ { ++ struct pxa27x_ep *pxa_ep; ++ int j; ++ ++ DMSG("pxa27x_ep_alloc: config: %d, interface: %d, altinterface: %x,\n", ++ epconfig->config, epconfig->interface, epconfig->altinterface); ++ ++ j = pxa27x_find_free_ep(dev); ++ ++ if (unlikely(j < 0)) { ++ dev_err(dev->dev, "pxa27x_ep_alloc: Failed to find a spare endpoint\n"); ++ pxa27x_ep_free(gadget, &virt_ep->usb_ep); ++ return NULL; ++ } ++ ++ pxa_ep = &dev->ep[j]; ++ ++ if (i == 0) ++ virt_ep->pxa_ep = pxa_ep; ++ ++ pxa_ep->assigned = 1; ++ pxa_ep->ep_num = dev->ep_num; ++ pxa_ep->pxa_ep_num = j; ++ pxa_ep->usb_ep = &virt_ep->usb_ep; ++ pxa_ep->dev = dev; ++ pxa_ep->desc = desc; ++ pxa_ep->pio_irqs = pxa_ep->dma_irqs = 0; ++ pxa_ep->dma = -1; ++ ++ pxa_ep->fifo_size = fifo_size; ++ pxa_ep->dir_in = (desc->bEndpointAddress & USB_DIR_IN) ? 1 : 0; ++ pxa_ep->ep_type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; ++ pxa_ep->stopped = 1; ++ pxa_ep->dma_con = 0; ++ pxa_ep->config = epconfig->config; ++ pxa_ep->interface = epconfig->interface; ++ pxa_ep->aisn = epconfig->altinterface; ++ ++ pxa_ep->reg_udccsr = &UDCCSR0 + j; ++ pxa_ep->reg_udcbcr = &UDCBCR0 + j; ++ pxa_ep->reg_udcdr = &UDCDR0 + j ; ++ pxa_ep->reg_udccr = &UDCCRA - 1 + j; ++#ifdef USE_DMA ++ pxa_ep->reg_drcmr = &DRCMR24 + j; ++#endif ++ ++ /* Configure UDCCR */ ++ *pxa_ep->reg_udccr = ((pxa_ep->config << UDCCONR_CN_S) & UDCCONR_CN) ++ | ((pxa_ep->interface << UDCCONR_IN_S) & UDCCONR_IN) ++ | ((pxa_ep->aisn << UDCCONR_AISN_S) & UDCCONR_AISN) ++ | ((dev->ep_num << UDCCONR_EN_S) & UDCCONR_EN) ++ | ((pxa_ep->ep_type << UDCCONR_ET_S) & UDCCONR_ET) ++ | ((pxa_ep->dir_in) ? UDCCONR_ED : 0) ++ | ((min(pxa_ep->fifo_size, (unsigned)desc->wMaxPacketSize) << UDCCONR_MPS_S ) & UDCCONR_MPS) ++ | UDCCONR_EE; ++// | UDCCONR_DE | UDCCONR_EE; ++ ++ ++ ++#ifdef USE_DMA ++ /* Only BULK use DMA */ ++ if ((pxa_ep->ep_type & USB_ENDPOINT_XFERTYPE_MASK)\ ++ == USB_ENDPOINT_XFER_BULK) ++ *pxa_ep->reg_udccsr = UDCCSR_DME; ++#endif ++ ++ DMSG("UDCCR: 0x%p is 0x%x\n", pxa_ep->reg_udccr,*pxa_ep->reg_udccr); ++ ++ epconfig++; ++ } ++ ++ /* Fill ep name*/ ++ switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { ++ case USB_ENDPOINT_XFER_BULK: ++ sprintf(name, "ep%d%s-bulk", dev->ep_num, ++ ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); ++ break; ++ case USB_ENDPOINT_XFER_INT: ++ sprintf(name, "ep%d%s-intr", dev->ep_num, ++ ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); ++ break; ++ default: ++ sprintf(name, "ep%d%s", dev->ep_num, ++ ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); ++ break; ++ } ++ ++ virt_ep->desc = desc; ++ virt_ep->usb_ep.name = name; ++ virt_ep->usb_ep.ops = &pxa27x_ep_ops; ++ virt_ep->usb_ep.maxpacket = min((ushort)fifo_size, desc->wMaxPacketSize); ++ ++ list_add_tail(&virt_ep->usb_ep.ep_list, &gadget->ep_list); ++ ++ dev->ep_num++; ++ return &virt_ep->usb_ep; ++} ++ ++static int pxa27x_udc_get_frame(struct usb_gadget *_gadget) ++{ ++ return (UDCFNR & 0x7FF); ++} ++ ++static int pxa27x_udc_wakeup(struct usb_gadget *_gadget) ++{ ++ /* host may not have enabled remote wakeup */ ++ if ((UDCCR & UDCCR_DWRE) == 0) ++ return -EHOSTUNREACH; ++ udc_set_mask_UDCCR(UDCCR_UDR); ++ return 0; ++} ++ ++static const struct usb_gadget_ops pxa27x_udc_ops = { ++ .ep_alloc = pxa27x_ep_alloc, ++ .get_frame = pxa27x_udc_get_frame, ++ .wakeup = pxa27x_udc_wakeup, ++ // current versions must always be self-powered ++}; ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++#ifdef UDC_PROC_FILE ++ ++static const char proc_node_name [] = "driver/udc"; ++ ++static int ++udc_proc_read(char *page, char **start, off_t off, int count, ++ int *eof, void *_dev) ++{ ++ char *buf = page; ++ struct pxa27x_udc *dev = _dev; ++ char *next = buf; ++ unsigned size = count; ++ unsigned long flags; ++ int i, t; ++ u32 tmp; ++ ++ if (off != 0) ++ return 0; ++ ++ local_irq_save(flags); ++ ++ /* basic device status */ ++ t = scnprintf(next, size, DRIVER_DESC "\n" ++ "%s version: %s\nGadget driver: %s\n", ++ driver_name, DRIVER_VERSION DMASTR, ++ dev->driver ? dev->driver->driver.name : "(none)"); ++ size -= t; ++ next += t; ++ ++ /* registers for device and ep0 */ ++ t = scnprintf(next, size, ++ "uicr %02X.%02X, usir %02X.%02x, ufnr %02X\n", ++ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); ++ size -= t; ++ next += t; ++ ++ tmp = UDCCR; ++ t = scnprintf(next, size,"udccr %02X =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", tmp, ++ (tmp & UDCCR_OEN) ? " oen":"", ++ (tmp & UDCCR_AALTHNP) ? " aalthnp":"", ++ (tmp & UDCCR_AHNP) ? " rem" : "", ++ (tmp & UDCCR_BHNP) ? " rstir" : "", ++ (tmp & UDCCR_DWRE) ? " dwre" : "", ++ (tmp & UDCCR_SMAC) ? " smac" : "", ++ (tmp & UDCCR_EMCE) ? " emce" : "", ++ (tmp & UDCCR_UDR) ? " udr" : "", ++ (tmp & UDCCR_UDA) ? " uda" : "", ++ (tmp & UDCCR_UDE) ? " ude" : "", ++ (tmp & UDCCR_ACN) >> UDCCR_ACN_S, ++ (tmp & UDCCR_AIN) >> UDCCR_AIN_S, ++ (tmp & UDCCR_AAISN)>> UDCCR_AAISN_S ); ++ ++ size -= t; ++ next += t; ++ ++ tmp = UDCCSR0; ++ t = scnprintf(next, size, ++ "udccsr0 %02X =%s%s%s%s%s%s%s\n", tmp, ++ (tmp & UDCCSR0_SA) ? " sa" : "", ++ (tmp & UDCCSR0_RNE) ? " rne" : "", ++ (tmp & UDCCSR0_FST) ? " fst" : "", ++ (tmp & UDCCSR0_SST) ? " sst" : "", ++ (tmp & UDCCSR0_DME) ? " dme" : "", ++ (tmp & UDCCSR0_IPR) ? " ipr" : "", ++ (tmp & UDCCSR0_OPC) ? " opc" : ""); ++ size -= t; ++ next += t; ++ ++ if (!dev->driver) ++ goto done; ++ ++ t = scnprintf(next, size, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n", ++ dev->stats.write.bytes, dev->stats.write.ops, ++ dev->stats.read.bytes, dev->stats.read.ops, ++ dev->stats.irqs); ++ size -= t; ++ next += t; ++ ++ /* dump endpoint queues */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep [i]; ++ struct pxa27x_request *req; ++ int t; ++ ++ if (i != 0) { ++ const struct usb_endpoint_descriptor *d; ++ ++ d = ep->desc; ++ if (!d) ++ continue; ++ tmp = *dev->ep [i].reg_udccsr; ++ t = scnprintf(next, size, ++ "%d max %d %s udccs %02x udccr:0x%x\n", ++ i, le16_to_cpu (d->wMaxPacketSize), ++ (ep->dma >= 0) ? "dma" : "pio", tmp, ++ *dev->ep[i].reg_udccr); ++ /* TODO translate all five groups of udccs bits! */ ++ ++ } else /* ep0 should only have one transfer queued */ ++ t = scnprintf(next, size, "ep0 max 16 pio irqs %lu\n", ++ ep->pio_irqs); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ ++ if (list_empty(&ep->queue)) { ++ t = scnprintf(next, size, "\t(nothing queued)\n"); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ continue; ++ } ++ list_for_each_entry(req, &ep->queue, queue) { ++#ifdef USE_DMA ++ if (ep->dma >= 0 && req->queue.prev == &ep->queue) ++ t = scnprintf(next, size, "\treq %p len %d/%d " ++ "buf %p (dma%d dcmd %08x)\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf, ++ ep->dma, DCMD(ep->dma) ++ /* low 13 bits == bytes-to-go */); ++ else ++#endif ++ t = scnprintf(next, size, ++ "\treq %p len %d/%d buf %p\n", ++ &req->req, req->req.actual, ++ req->req.length, req->req.buf); ++ if (t <= 0 || t > size) ++ goto done; ++ size -= t; ++ next += t; ++ } ++ } ++ ++done: ++ local_irq_restore(flags); ++ *eof = 1; ++ return count - size; ++} ++ ++#define create_proc_files() \ ++ create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev) ++#define remove_proc_files() \ ++ remove_proc_entry(proc_node_name, NULL) ++ ++#else /* !UDC_PROC_FILE */ ++#define create_proc_files() do {} while (0) ++#define remove_proc_files() do {} while (0) ++ ++#endif /* UDC_PROC_FILE */ ++ ++/* "function" sysfs attribute */ ++static ssize_t show_function(struct device *_dev, struct device_attribute *attr, char *buf) ++{ ++ struct pxa27x_udc *dev = dev_get_drvdata(_dev); ++ ++ if (!dev->driver || !dev->driver->function ++ || strlen(dev->driver->function) > PAGE_SIZE) ++ return 0; ++ return scnprintf(buf, PAGE_SIZE, "%s\n", dev->driver->function); ++} ++static DEVICE_ATTR(function, S_IRUGO, show_function, NULL); ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * udc_disable - disable USB device controller ++ */ ++static void udc_disable(struct pxa27x_udc *dev) ++{ ++ UDCICR0 = UDCICR1 = 0x00000000; ++ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++ ++ /* Disable clock for USB device */ ++ pxa_set_cken(CKEN_USB, 0); ++ ++ ep0_idle(dev); ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ dev->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); ++} ++ ++ ++/* ++ * udc_reinit - initialize software state ++ */ ++static void udc_reinit(struct pxa27x_udc *dev) ++{ ++ u32 i; ++ ++ dev->ep0state = EP0_IDLE; ++ ++ /* basic endpoint records init */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->stopped = 0; ++ ep->pio_irqs = ep->dma_irqs = 0; ++ } ++ dev->configuration = 0; ++ dev->interface = 0; ++ dev->alternate = 0; ++ /* the rest was statically initialized, and is read-only */ ++} ++ ++/* until it's enabled, this UDC should be completely invisible ++ * to any USB host. ++ */ ++static void udc_enable(struct pxa27x_udc *dev) ++{ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++ ++ /* Enable clock for USB device */ ++ pxa_set_cken(CKEN_USB, 1); ++ ++ UDCICR0 = UDCICR1 = 0; ++ ++ ep0_idle(dev); ++ dev->gadget.speed = USB_SPEED_FULL; ++ dev->stats.irqs = 0; ++ ++ udc_set_mask_UDCCR(UDCCR_UDE); ++ udelay(2); ++ if (UDCCR & UDCCR_EMCE) ++ dev_err(dev->dev, "There are error in configuration, udc disabled\n"); ++ ++ /* caller must be able to sleep in order to cope ++ * with startup transients. ++ */ ++ msleep(100); ++ ++ /* enable suspend/resume and reset irqs */ ++ UDCICR1 = UDCICR1_IECC | UDCICR1_IERU | UDCICR1_IESU | UDCICR1_IERS; ++ ++ /* enable ep0 irqs */ ++ UDCICR0 = UDCICR_INT(0,UDCICR_INT_MASK); ++ ++ DMSG("Connecting\n"); ++ /* RPFIXME */ ++ UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE; ++ //dev->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); ++} ++ ++ ++/* when a driver is successfully registered, it will receive ++ * control requests including set_configuration(), which enables ++ * non-control requests. then usb traffic follows until a ++ * disconnect is reported. then a host may connect again, or ++ * the driver might get unbound. ++ */ ++int usb_gadget_register_driver(struct usb_gadget_driver *driver) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ int retval; ++ ++ if (!driver || driver->speed != USB_SPEED_FULL || !driver->bind ++ || !driver->unbind || !driver->disconnect || !driver->setup) ++ return -EINVAL; ++ if (!dev) ++ return -ENODEV; ++ if (dev->driver) ++ return -EBUSY; ++ ++ udc_disable(dev); ++ udc_init_ep(dev); ++ udc_reinit(dev); ++ ++ /* first hook up the driver ... */ ++ dev->driver = driver; ++ dev->gadget.dev.driver = &driver->driver; ++ dev->ep_num = 1; ++ ++ retval = device_add(&dev->gadget.dev); ++ if (retval) { ++ DMSG("device_add error %d\n", retval); ++ goto add_fail; ++ } ++ retval = driver->bind(&dev->gadget); ++ if (retval) { ++ DMSG("bind to driver %s --> error %d\n", ++ driver->driver.name, retval); ++ goto bind_fail; ++ } ++ retval = device_create_file(dev->dev, &dev_attr_function); ++ if (retval) { ++ DMSG("device_create_file failed: %d\n", retval); ++ goto create_file_fail; ++ } ++ ++ /* ... then enable host detection and ep0; and we're ready ++ * for set_configuration as well as eventual disconnect. ++ * NOTE: this shouldn't power up until later. ++ */ ++ DMSG("registered gadget driver '%s'\n", driver->driver.name); ++ udc_enable(dev); ++ dump_state(dev); ++ return 0; ++ ++create_file_fail: ++ driver->unbind(&dev->gadget); ++bind_fail: ++ device_del(&dev->gadget.dev); ++add_fail: ++ dev->driver = 0; ++ dev->gadget.dev.driver = 0; ++ return retval; ++} ++EXPORT_SYMBOL(usb_gadget_register_driver); ++ ++static void ++stop_activity(struct pxa27x_udc *dev, struct usb_gadget_driver *driver) ++{ ++ int i; ++ ++ DMSG("Trace path 1\n"); ++ /* don't disconnect drivers more than once */ ++ if (dev->gadget.speed == USB_SPEED_UNKNOWN) ++ driver = 0; ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ ++ /* prevent new request submissions, kill any outstanding requests */ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->stopped = 1; ++ nuke(ep, -ESHUTDOWN); ++ } ++ del_timer_sync(&dev->timer); ++ ++ /* report disconnect; the driver is already quiesced */ ++ if (driver) ++ driver->disconnect(&dev->gadget); ++ ++ /* re-init driver-visible data structures */ ++ udc_reinit(dev); ++} ++ ++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) ++{ ++ struct pxa27x_udc *dev = the_controller; ++ ++ if (!dev) ++ return -ENODEV; ++ if (!driver || driver != dev->driver) ++ return -EINVAL; ++ ++ local_irq_disable(); ++ udc_disable(dev); ++ stop_activity(dev, driver); ++ local_irq_enable(); ++ ++ driver->unbind(&dev->gadget); ++ pxa27x_ep_freeall(&dev->gadget); ++ dev->driver = 0; ++ ++ device_del(&dev->gadget.dev); ++ device_remove_file(dev->dev, &dev_attr_function); ++ ++ DMSG("unregistered gadget driver '%s'\n", driver->driver.name); ++ dump_state(dev); ++ return 0; ++} ++EXPORT_SYMBOL(usb_gadget_unregister_driver); ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++static inline void clear_ep_state(struct pxa27x_udc *dev) ++{ ++ unsigned i; ++ ++ /* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint ++ * fifos, and pending transactions mustn't be continued in any case. ++ */ ++ for (i = 1; i < UDC_EP_NUM; i++) ++ nuke(&dev->ep[i], -ECONNABORTED); ++} ++ ++static void udc_watchdog(unsigned long _dev) ++{ ++ struct pxa27x_udc *dev = (void *)_dev; ++ ++ local_irq_disable(); ++ if (dev->ep0state == EP0_STALL ++ && (UDCCSR0 & UDCCSR0_FST) == 0 ++ && (UDCCSR0 & UDCCSR0_SST) == 0) { ++ UDCCSR0 = UDCCSR0_FST|UDCCSR0_FTF; ++ DBG(DBG_VERBOSE, "ep0 re-stall\n"); ++ start_watchdog(dev); ++ } ++ local_irq_enable(); ++} ++ ++static void handle_ep0(struct pxa27x_udc *dev) ++{ ++ u32 udccsr0 = UDCCSR0; ++ struct pxa27x_ep *ep = &dev->ep[0]; ++ struct pxa27x_request *req; ++ union { ++ struct usb_ctrlrequest r; ++ u8 raw[8]; ++ u32 word[2]; ++ } u; ++ ++ if (list_empty(&ep->queue)) ++ req = 0; ++ else ++ req = list_entry(ep->queue.next, struct pxa27x_request, queue); ++ ++ /* clear stall status */ ++ if (udccsr0 & UDCCSR0_SST) { ++ nuke(ep, -EPIPE); ++ UDCCSR0 = UDCCSR0_SST; ++ del_timer(&dev->timer); ++ ep0_idle(dev); ++ } ++ ++ /* previous request unfinished? non-error iff back-to-back ... */ ++ if ((udccsr0 & UDCCSR0_SA) != 0 && dev->ep0state != EP0_IDLE) { ++ nuke(ep, 0); ++ del_timer(&dev->timer); ++ ep0_idle(dev); ++ } ++ ++ switch (dev->ep0state) { ++ case EP0_NO_ACTION: ++ dev_info(dev->dev, "%s: Busy\n", __FUNCTION__); ++ /*Fall through */ ++ case EP0_IDLE: ++ /* late-breaking status? */ ++ udccsr0 = UDCCSR0; ++ ++ /* start control request? */ ++ if (likely((udccsr0 & (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE)) ++ == (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE))) { ++ int i; ++ ++ nuke(ep, -EPROTO); ++ /* read SETUP packet */ ++ for (i = 0; i < 2; i++) { ++ if (unlikely(!(UDCCSR0 & UDCCSR0_RNE))) { ++bad_setup: ++ DMSG("SETUP %d!\n", i); ++ goto stall; ++ } ++ u.word [i] = UDCDR0; ++ } ++ if (unlikely((UDCCSR0 & UDCCSR0_RNE) != 0)) ++ goto bad_setup; ++ ++ le16_to_cpus(&u.r.wValue); ++ le16_to_cpus(&u.r.wIndex); ++ le16_to_cpus(&u.r.wLength); ++ ++ DBG(DBG_VERBOSE, "SETUP %02x.%02x v%04x i%04x l%04x\n", ++ u.r.bRequestType, u.r.bRequest, ++ u.r.wValue, u.r.wIndex, u.r.wLength); ++ /* cope with automagic for some standard requests. */ ++ dev->req_std = (u.r.bRequestType & USB_TYPE_MASK) ++ == USB_TYPE_STANDARD; ++ dev->req_config = 0; ++ dev->req_pending = 1; ++#if 0 ++ switch (u.r.bRequest) { ++ /* hardware was supposed to hide this */ ++ case USB_REQ_SET_CONFIGURATION: ++ case USB_REQ_SET_INTERFACE: ++ case USB_REQ_SET_ADDRESS: ++ dev_err(dev->dev, "Should not come here\n"); ++ break; ++ } ++ ++#endif ++ if (u.r.bRequestType & USB_DIR_IN) ++ dev->ep0state = EP0_IN_DATA_PHASE; ++ else ++ dev->ep0state = EP0_OUT_DATA_PHASE; ++ i = dev->driver->setup(&dev->gadget, &u.r); ++ ++ if (i < 0) { ++ /* hardware automagic preventing STALL... */ ++ if (dev->req_config) { ++ /* hardware sometimes neglects to tell ++ * tell us about config change events, ++ * so later ones may fail... ++ */ ++ WARN("config change %02x fail %d?\n", ++ u.r.bRequest, i); ++ return; ++ /* TODO experiment: if has_cfr, ++ * hardware didn't ACK; maybe we ++ * could actually STALL! ++ */ ++ } ++ DBG(DBG_VERBOSE, "protocol STALL, " ++ "%02x err %d\n", UDCCSR0, i); ++stall: ++ /* the watchdog timer helps deal with cases ++ * where udc seems to clear FST wrongly, and ++ * then NAKs instead of STALLing. ++ */ ++ ep0start(dev, UDCCSR0_FST|UDCCSR0_FTF, "stall"); ++ start_watchdog(dev); ++ dev->ep0state = EP0_STALL; ++ ++ /* deferred i/o == no response yet */ ++ } else if (dev->req_pending) { ++ if (likely(dev->ep0state == EP0_IN_DATA_PHASE ++ || dev->req_std || u.r.wLength)) ++ ep0start(dev, 0, "defer"); ++ else ++ ep0start(dev, UDCCSR0_IPR, "defer/IPR"); ++ } ++ ++ /* expect at least one data or status stage irq */ ++ return; ++ ++ } else { ++ /* some random early IRQ: ++ * - we acked FST ++ * - IPR cleared ++ * - OPC got set, without SA (likely status stage) ++ */ ++ UDCCSR0 = udccsr0 & (UDCCSR0_SA|UDCCSR0_OPC); ++ } ++ break; ++ case EP0_IN_DATA_PHASE: /* GET_DESCRIPTOR etc */ ++ if (udccsr0 & UDCCSR0_OPC) { ++ UDCCSR0 = UDCCSR0_OPC|UDCCSR0_FTF; ++ DBG(DBG_VERBOSE, "ep0in premature status\n"); ++ if (req) ++ done(ep, req, 0); ++ ep0_idle(dev); ++ } else /* irq was IPR clearing */ { ++ if (req) { ++ /* this IN packet might finish the request */ ++ (void) write_ep0_fifo(ep, req); ++ } /* else IN token before response was written */ ++ } ++ break; ++ case EP0_OUT_DATA_PHASE: /* SET_DESCRIPTOR etc */ ++ if (udccsr0 & UDCCSR0_OPC) { ++ if (req) { ++ /* this OUT packet might finish the request */ ++ if (read_ep0_fifo(ep, req)) ++ done(ep, req, 0); ++ /* else more OUT packets expected */ ++ } /* else OUT token before read was issued */ ++ } else /* irq was IPR clearing */ { ++ DBG(DBG_VERBOSE, "ep0out premature status\n"); ++ if (req) ++ done(ep, req, 0); ++ ep0_idle(dev); ++ } ++ break; ++ case EP0_STALL: ++ UDCCSR0 = UDCCSR0_FST; ++ break; ++ } ++ UDCISR0 = UDCISR_INT(0, UDCISR_INT_MASK); ++} ++ ++ ++static void handle_ep(struct pxa27x_ep *ep) ++{ ++ struct pxa27x_request *req; ++ int completed; ++ u32 udccsr=0; ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ do { ++ completed = 0; ++ if (likely (!list_empty(&ep->queue))) { ++ req = list_entry(ep->queue.next, ++ struct pxa27x_request, queue); ++ } else ++ req = 0; ++ ++// udccsr = *ep->reg_udccsr; ++ DMSG("%s: req:%p, udcisr0:0x%x udccsr %p:0x%x\n", __FUNCTION__, ++ req, UDCISR0, ep->reg_udccsr, *ep->reg_udccsr); ++ if (unlikely(ep->dir_in)) { ++ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; ++ if (unlikely (udccsr)) ++ *ep->reg_udccsr = udccsr; ++ ++ if (req && likely ((*ep->reg_udccsr & UDCCSR_FS) != 0)) ++ completed = write_fifo(ep, req); ++ ++ } else { ++ udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; ++ if (unlikely(udccsr)) ++ *ep->reg_udccsr = udccsr; ++ ++ /* fifos can hold packets, ready for reading... */ ++ if (likely(req)) { ++ completed = read_fifo(ep, req); ++ } else { ++ pio_irq_disable (ep->pxa_ep_num); ++ //*ep->reg_udccsr = UDCCSR_FEF; ++ DMSG("%s: no req for out data\n", ++ __FUNCTION__); ++ } ++ } ++ ep->pio_irqs++; ++ } while (completed); ++} ++ ++static void pxa27x_update_eps(struct pxa27x_udc *dev) ++{ ++ struct pxa27x_virt_ep *virt_ep; ++ int i; ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if(!dev->ep[i].assigned || !dev->ep[i].usb_ep) ++ continue; ++ virt_ep = container_of(dev->ep[i].usb_ep, struct pxa27x_virt_ep, usb_ep); ++ ++ DMSG("%s, Updating eps %d:%d, %d:%d, %d:%d, %p,%p\n", __FUNCTION__, dev->ep[i].config, dev->configuration ++ ,dev->ep[i].interface, dev->interface, dev->ep[i].aisn, dev->alternate, virt_ep->pxa_ep, &dev->ep[i]); ++ ++ if(dev->ep[i].config == dev->configuration && virt_ep->pxa_ep != &dev->ep[i]) { ++ if ((dev->ep[i].interface == dev->interface && ++ dev->ep[i].aisn == dev->alternate) || virt_ep->pxa_ep->config != dev->configuration) { ++ ++ if (virt_ep->pxa_ep->desc) { ++ DMSG("%s, Changing end point to %d (en/dis)\n", __FUNCTION__, i); ++ pxa27x_ep_disable(&virt_ep->usb_ep); ++ virt_ep->pxa_ep = &dev->ep[i]; ++ pxa27x_ep_enable(&virt_ep->usb_ep, virt_ep->desc); ++ } else { ++ DMSG("%s, Changing end point to %d (no en/dis)\n", __FUNCTION__, i); ++ virt_ep->pxa_ep = &dev->ep[i]; ++ } ++ } ++ } ++ } ++} ++ ++static void pxa27x_change_configuration(struct pxa27x_udc *dev) ++{ ++ struct usb_ctrlrequest req ; ++ ++ pxa27x_update_eps(dev); ++ ++ req.bRequestType = 0; ++ req.bRequest = USB_REQ_SET_CONFIGURATION; ++ req.wValue = dev->configuration; ++ req.wIndex = 0; ++ req.wLength = 0; ++ ++ dev->ep0state = EP0_NO_ACTION; ++ dev->driver->setup(&dev->gadget, &req); ++} ++ ++static void pxa27x_change_interface(struct pxa27x_udc *dev) ++{ ++ struct usb_ctrlrequest req; ++ ++ pxa27x_update_eps(dev); ++ ++ req.bRequestType = USB_RECIP_INTERFACE; ++ req.bRequest = USB_REQ_SET_INTERFACE; ++ req.wValue = dev->alternate; ++ req.wIndex = dev->interface; ++ req.wLength = 0; ++ ++ dev->ep0state = EP0_NO_ACTION; ++ dev->driver->setup(&dev->gadget, &req); ++} ++ ++/* ++ * pxa27x_udc_irq - interrupt handler ++ * ++ * avoid delays in ep0 processing. the control handshaking isn't always ++ * under software control (pxa250c0 and the pxa255 are better), and delays ++ * could cause usb protocol errors. ++ */ ++static irqreturn_t pxa27x_udc_irq(int irq, void *_dev) ++{ ++ struct pxa27x_udc *dev = _dev; ++ int handled; ++ ++ dev->stats.irqs++; ++ ++ DBG(DBG_VERBOSE, "Interrupt, UDCISR0:0x%08x, UDCISR1:0x%08x, " ++ "UDCCR:0x%08x\n", UDCISR0, UDCISR1, UDCCR); ++ do { ++ u32 udcir = UDCISR1 & 0xF8000000; ++ ++ handled = 0; ++ ++ /* SUSpend Interrupt Request */ ++ if (unlikely(udcir & UDCISR1_IRSU)) { ++ UDCISR1 = UDCISR1_IRSU; ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB suspend\n"); ++ if (dev->gadget.speed != USB_SPEED_UNKNOWN ++ && dev->driver ++ && dev->driver->suspend) ++ dev->driver->suspend(&dev->gadget); ++ ep0_idle(dev); ++ } ++ ++ /* RESume Interrupt Request */ ++ if (unlikely(udcir & UDCISR1_IRRU)) { ++ UDCISR1 = UDCISR1_IRRU; ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB resume\n"); ++ ++ if (dev->gadget.speed != USB_SPEED_UNKNOWN ++ && dev->driver ++ && dev->driver->resume) ++ dev->driver->resume(&dev->gadget); ++ } ++ ++ if (unlikely(udcir & UDCISR1_IRCC)) { ++ unsigned config, interface, alternate; ++ ++ handled = 1; ++ DBG(DBG_VERBOSE, "USB SET_CONFIGURATION or " ++ "SET_INTERFACE command received\n"); ++ ++ config = (UDCCR & UDCCR_ACN) >> UDCCR_ACN_S; ++ ++ if (dev->configuration != config) { ++ dev->configuration = config; ++ pxa27x_change_configuration(dev) ; ++ } ++ ++ interface = (UDCCR & UDCCR_AIN) >> UDCCR_AIN_S; ++ alternate = (UDCCR & UDCCR_AAISN) >> UDCCR_AAISN_S; ++ ++ if ((dev->interface != interface) || (dev->alternate != alternate)) { ++ dev->interface = interface; ++ dev->alternate = alternate; ++ pxa27x_change_interface(dev); ++ } ++ ++ UDCCR |= UDCCR_SMAC; ++ ++ UDCISR1 = UDCISR1_IRCC; ++ DMSG("%s: con:%d,inter:%d,alt:%d\n", ++ __FUNCTION__, config,interface, alternate); ++ } ++ ++ /* ReSeT Interrupt Request - USB reset */ ++ if (unlikely(udcir & UDCISR1_IRRS)) { ++ UDCISR1 = UDCISR1_IRRS; ++ handled = 1; ++ ++ if ((UDCCR & UDCCR_UDA) == 0) { ++ DBG(DBG_VERBOSE, "USB reset start\n"); ++ ++ /* reset driver and endpoints, ++ * in case that's not yet done ++ */ ++ stop_activity(dev, dev->driver); ++ } ++ INFO("USB reset\n"); ++ dev->gadget.speed = USB_SPEED_FULL; ++ memset(&dev->stats, 0, sizeof dev->stats); ++ ++ } else { ++ u32 udcisr0 = UDCISR0 ; ++ u32 udcisr1 = UDCISR1 & 0xFFFF; ++ int i; ++ ++ if (unlikely (!udcisr0 && !udcisr1)) ++ continue; ++ ++ DBG(DBG_VERY_NOISY, "irq %02x.%02x\n", udcisr1,udcisr0); ++ ++ /* control traffic */ ++ if (udcisr0 & UDCISR0_IR0) { ++ dev->ep[0].pio_irqs++; ++ handle_ep0(dev); ++ handled = 1; ++ } ++ ++ udcisr0 >>= 2; ++ /* endpoint data transfers */ ++ for (i = 1; udcisr0!=0 && i < 16; udcisr0>>=2,i++) { ++ UDCISR0 = UDCISR_INT(i, UDCISR_INT_MASK); ++ ++ if (udcisr0 & UDC_INT_FIFOERROR) ++ dev_err(dev->dev, " Endpoint %d Fifo error\n", i); ++ if (udcisr0 & UDC_INT_PACKETCMP) { ++ handle_ep(&dev->ep[i]); ++ handled = 1; ++ } ++ ++ } ++ ++ for (i = 0; udcisr1!=0 && i < 8; udcisr1 >>= 2, i++) { ++ UDCISR1 = UDCISR_INT(i, UDCISR_INT_MASK); ++ ++ if (udcisr1 & UDC_INT_FIFOERROR) { ++ dev_err(dev->dev, "Endpoint %d fifo error\n", (i+16)); ++ } ++ ++ if (udcisr1 & UDC_INT_PACKETCMP) { ++ handle_ep(&dev->ep[i+16]); ++ handled = 1; ++ } ++ } ++ } ++ ++ /* we could also ask for 1 msec SOF (SIR) interrupts */ ++ ++ } while (handled); ++ return IRQ_HANDLED; ++} ++ ++int write_ep0_zlp(void) ++{ ++ UDCCSR0 = UDCCSR0_IPR; ++ return 0; ++} ++EXPORT_SYMBOL(write_ep0_zlp); ++ ++static void udc_init_ep(struct pxa27x_udc *dev) ++{ ++ int i; ++ ++ INIT_LIST_HEAD(&dev->gadget.ep_list); ++ INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); ++ ++ for (i = 0; i < UDC_EP_NUM; i++) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ++ ep->dma = -1; ++ if (i != 0) { ++ memset(ep, 0, sizeof(*ep)); ++ } ++ INIT_LIST_HEAD(&ep->queue); ++ } ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static void nop_release(struct device *dev) ++{ ++ DMSG("%s %s\n", __FUNCTION__, dev->bus_id); ++} ++ ++/* this uses load-time allocation and initialization (instead of ++ * doing it at run-time) to save code, eliminate fault paths, and ++ * be more obviously correct. ++ */ ++ ++static struct pxa27x_udc memory = { ++ .gadget = { ++ .ops = &pxa27x_udc_ops, ++ .ep0 = &memory.virt_ep0.usb_ep, ++ .name = driver_name, ++ .dev = { ++ .bus_id = "gadget", ++ .release = nop_release, ++ }, ++ }, ++ ++ /* control endpoint */ ++ .virt_ep0 = { ++ .pxa_ep = &memory.ep[0], ++ .usb_ep = { ++ .name = ep0name, ++ .ops = &pxa27x_ep_ops, ++ .maxpacket = EP0_FIFO_SIZE, ++ }, ++ }, ++ ++ .ep[0] = { ++ .usb_ep = &memory.virt_ep0.usb_ep, ++ .dev = &memory, ++ .reg_udccsr = &UDCCSR0, ++ .reg_udcdr = &UDCDR0, ++ }, ++}; ++ ++static int __init pxa27x_udc_probe(struct platform_device *_dev) ++{ ++ struct pxa27x_udc *dev = &memory; ++ int retval; ++ ++ /* other non-static parts of init */ ++ dev->dev = &_dev->dev; ++ dev->mach = _dev->dev.platform_data; ++ ++ /* RPFIXME */ ++ UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE; ++ ++ init_timer(&dev->timer); ++ dev->timer.function = udc_watchdog; ++ dev->timer.data = (unsigned long) dev; ++ ++ device_initialize(&dev->gadget.dev); ++ dev->gadget.dev.parent = &_dev->dev; ++ dev->gadget.dev.dma_mask = _dev->dev.dma_mask; ++ ++ the_controller = dev; ++ platform_set_drvdata(_dev, dev); ++ ++ udc_disable(dev); ++ udc_init_ep(dev); ++ udc_reinit(dev); ++ ++ /* irq setup after old hardware state is cleaned up */ ++ retval = request_irq(IRQ_USB, pxa27x_udc_irq, ++ SA_INTERRUPT, driver_name, dev); ++ if (retval != 0) { ++ dev_err(dev->dev, "%s: can't get irq %i, err %d\n", ++ driver_name, IRQ_USB, retval); ++ return -EBUSY; ++ } ++ dev->got_irq = 1; ++ ++ create_proc_files(); ++ ++ return 0; ++} ++ ++static int pxa27x_udc_remove(struct platform_device *_dev) ++{ ++ struct pxa27x_udc *dev = platform_get_drvdata(_dev); ++ ++ udc_disable(dev); ++ remove_proc_files(); ++ usb_gadget_unregister_driver(dev->driver); ++ ++ pxa27x_ep_freeall(&dev->gadget); ++ ++ if (dev->got_irq) { ++ free_irq(IRQ_USB, dev); ++ dev->got_irq = 0; ++ } ++ platform_set_drvdata(_dev, 0); ++ the_controller = 0; ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static void pxa27x_udc_shutdown(struct platform_device *_dev) ++{ ++ struct pxa27x_udc *dev = platform_get_drvdata(_dev); ++ ++ udc_disable(dev); ++} ++ ++static int pxa27x_udc_suspend(struct platform_device *_dev, pm_message_t state) ++{ ++ int i; ++ struct pxa27x_udc *dev = platform_get_drvdata(_dev); ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ ++ dev->udccsr0 = UDCCSR0; ++ for(i=1; (i<UDC_EP_NUM); i++) { ++ if (dev->ep[i].assigned) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ ep->udccsr_value = *ep->reg_udccsr; ++ ep->udccr_value = *ep->reg_udccr; ++ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", ++ i, *ep->reg_udccsr, *ep->reg_udccr); ++ } ++ } ++ ++ udc_clear_mask_UDCCR(UDCCR_UDE); ++ pxa_set_cken(CKEN_USB, 0); ++ ++ return 0; ++} ++ ++static int pxa27x_udc_resume(struct platform_device *_dev) ++{ ++ int i; ++ struct pxa27x_udc *dev = platform_get_drvdata(_dev); ++ ++ DMSG("%s is called\n", __FUNCTION__); ++ UDCCSR0 = dev->udccsr0 & (UDCCSR0_FST | UDCCSR0_DME); ++ for (i=1; i < UDC_EP_NUM; i++) { ++ if (dev->ep[i].assigned) { ++ struct pxa27x_ep *ep = &dev->ep[i]; ++ *ep->reg_udccsr = ep->udccsr_value; ++ *ep->reg_udccr = ep->udccr_value; ++ DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", ++ i, *ep->reg_udccsr, *ep->reg_udccr); ++ } ++ } ++ ++ udc_enable(dev); ++ ++ /* OTGPH bit is set when sleep mode is entered. ++ * it indicates that OTG pad is retaining its state. ++ * Upon exit from sleep mode and before clearing OTGPH, ++ * Software must configure the USB OTG pad, UDC, and UHC ++ * to the state they were in before entering sleep mode.*/ ++ PSSR |= PSSR_OTGPH; ++ ++ return 0; ++} ++#endif ++ ++/*-------------------------------------------------------------------------*/ ++ ++static struct platform_driver udc_driver = { ++ .driver = { ++ .name = "pxa2xx-udc", ++ }, ++ .probe = pxa27x_udc_probe, ++ .remove = pxa27x_udc_remove, ++#ifdef CONFIG_PM ++ .shutdown = pxa27x_udc_shutdown, ++ .suspend = pxa27x_udc_suspend, ++ .resume = pxa27x_udc_resume ++#endif ++}; ++ ++static int __init udc_init(void) ++{ ++ printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); ++ return platform_driver_register(&udc_driver); ++} ++module_init(udc_init); ++ ++static void __exit udc_exit(void) ++{ ++ platform_driver_unregister(&udc_driver); ++} ++module_exit(udc_exit); ++ ++MODULE_DESCRIPTION(DRIVER_DESC); ++MODULE_AUTHOR("Frank Becker, Robert Schwebel, David Brownell"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/usb/gadget/pxa27x_udc.h b/drivers/usb/gadget/pxa27x_udc.h +new file mode 100644 +index 0000000..d4377cf +--- /dev/null ++++ b/drivers/usb/gadget/pxa27x_udc.h +@@ -0,0 +1,298 @@ ++/* ++ * linux/drivers/usb/gadget/pxa27x_udc.h ++ * Intel PXA27x on-chip full speed USB device controller ++ * ++ * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix ++ * Copyright (C) 2003 David Brownell ++ * Copyright (C) 2004 Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#ifndef __LINUX_USB_GADGET_PXA27X_H ++#define __LINUX_USB_GADGET_PXA27X_H ++ ++#include <linux/types.h> ++ ++struct pxa27x_udc; ++ ++struct pxa27x_ep { ++ struct pxa27x_udc *dev; ++ struct usb_ep *usb_ep; ++ const struct usb_endpoint_descriptor *desc; ++ ++ struct list_head queue; ++ unsigned long pio_irqs; ++ unsigned long dma_irqs; ++ ++ unsigned pxa_ep_num; ++ int dma; ++ unsigned fifo_size; ++ unsigned ep_type; ++ ++ unsigned stopped : 1; ++ unsigned dma_con : 1; ++ unsigned dir_in : 1; ++ unsigned assigned : 1; ++ ++ unsigned ep_num; ++ unsigned config; ++ unsigned interface; ++ unsigned aisn; ++ /* UDCCSR = UDC Control/Status Register for this EP ++ * UBCR = UDC Byte Count Remaining (contents of OUT fifo) ++ * UDCDR = UDC Endpoint Data Register (the fifo) ++ * UDCCR = UDC Endpoint Configuration Registers ++ * DRCM = DMA Request Channel Map ++ */ ++ volatile u32 *reg_udccsr; ++ volatile u32 *reg_udcbcr; ++ volatile u32 *reg_udcdr; ++ volatile u32 *reg_udccr; ++#ifdef USE_DMA ++ volatile u32 *reg_drcmr; ++#define drcmr(n) .reg_drcmr = & DRCMR ## n , ++#else ++#define drcmr(n) ++#endif ++ ++#ifdef CONFIG_PM ++ unsigned udccsr_value; ++ unsigned udccr_value; ++#endif ++}; ++ ++struct pxa27x_virt_ep { ++ struct usb_ep usb_ep; ++ const struct usb_endpoint_descriptor *desc; ++ struct pxa27x_ep *pxa_ep; ++}; ++ ++struct pxa27x_request { ++ struct usb_request req; ++ struct list_head queue; ++}; ++ ++enum ep0_state { ++ EP0_IDLE, ++ EP0_IN_DATA_PHASE, ++ EP0_OUT_DATA_PHASE, ++// EP0_END_XFER, ++ EP0_STALL, ++ EP0_NO_ACTION ++}; ++ ++#define EP0_FIFO_SIZE ((unsigned)16) ++#define BULK_FIFO_SIZE ((unsigned)64) ++#define ISO_FIFO_SIZE ((unsigned)256) ++#define INT_FIFO_SIZE ((unsigned)8) ++ ++struct udc_stats { ++ struct ep0stats { ++ unsigned long ops; ++ unsigned long bytes; ++ } read, write; ++ unsigned long irqs; ++}; ++ ++#define UDC_EP_NUM 24 ++ ++ ++struct pxa27x_udc { ++ struct usb_gadget gadget; ++ struct usb_gadget_driver *driver; ++ ++ enum ep0_state ep0state; ++ struct udc_stats stats; ++ unsigned got_irq : 1, ++ has_cfr : 1, ++ req_pending : 1, ++ req_std : 1, ++ req_config : 1; ++ ++#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) ++ struct timer_list timer; ++ ++ struct device *dev; ++ struct pxa2xx_udc_mach_info *mach; ++ u64 dma_mask; ++ struct pxa27x_virt_ep virt_ep0; ++ struct pxa27x_ep ep[UDC_EP_NUM]; ++ unsigned int ep_num; ++ ++ unsigned configuration, ++ interface, ++ alternate; ++#ifdef CONFIG_PM ++ unsigned udccsr0; ++#endif ++}; ++ ++static struct pxa27x_udc *the_controller; ++ ++#if 0 ++/*-------------------------------------------------------------------------*/ ++ ++ ++/* one GPIO should be used to detect host disconnect */ ++static inline int is_usb_connected(void) ++{ ++ if (!the_controller->mach->udc_is_connected) ++ return 1; ++ return the_controller->mach->udc_is_connected(); ++} ++ ++/* one GPIO should force the host to see this device (or not) */ ++static inline void make_usb_disappear(void) ++{ ++ if (!the_controller->mach->udc_command) ++ return; ++ the_controller->mach->udc_command(PXA27X_UDC_CMD_DISCONNECT); ++} ++ ++static inline void let_usb_appear(void) ++{ ++ if (!the_controller->mach->udc_command) ++ return; ++ the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); ++} ++#endif ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * Debugging support vanishes in non-debug builds. DBG_NORMAL should be ++ * mostly silent during normal use/testing, with no timing side-effects. ++ */ ++#define DBG_NORMAL 1 /* error paths, device state transitions */ ++#define DBG_VERBOSE 2 /* add some success path trace info */ ++#define DBG_NOISY 3 /* ... even more: request level */ ++#define DBG_VERY_NOISY 4 /* ... even more: packet level */ ++ ++#ifdef DEBUG ++static const char *state_name[] = { ++ "EP0_IDLE", ++ "EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE", ++ "EP0_END_XFER", "EP0_STALL" ++}; ++ ++#define DMSG(stuff...) printk(KERN_ERR "udc: " stuff) ++ ++#ifdef VERBOSE ++# define UDC_DEBUG DBG_VERBOSE ++#else ++# define UDC_DEBUG DBG_NORMAL ++#endif ++ ++static void __attribute__ ((__unused__)) ++dump_udccr(const char *label) ++{ ++ u32 udccr = UDCCR; ++ DMSG("%s 0x%08x =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", ++ label, udccr, ++ (udccr & UDCCR_OEN) ? " oen":"", ++ (udccr & UDCCR_AALTHNP) ? " aalthnp":"", ++ (udccr & UDCCR_AHNP) ? " rem" : "", ++ (udccr & UDCCR_BHNP) ? " rstir" : "", ++ (udccr & UDCCR_DWRE) ? " dwre" : "", ++ (udccr & UDCCR_SMAC) ? " smac" : "", ++ (udccr & UDCCR_EMCE) ? " emce" : "", ++ (udccr & UDCCR_UDR) ? " udr" : "", ++ (udccr & UDCCR_UDA) ? " uda" : "", ++ (udccr & UDCCR_UDE) ? " ude" : "", ++ (udccr & UDCCR_ACN) >> UDCCR_ACN_S, ++ (udccr & UDCCR_AIN) >> UDCCR_AIN_S, ++ (udccr & UDCCR_AAISN)>> UDCCR_AAISN_S ); ++} ++ ++static void __attribute__ ((__unused__)) ++dump_udccsr0(const char *label) ++{ ++ u32 udccsr0 = UDCCSR0; ++ ++ DMSG("%s %s 0x%08x =%s%s%s%s%s%s%s\n", ++ label, state_name[the_controller->ep0state], udccsr0, ++ (udccsr0 & UDCCSR0_SA) ? " sa" : "", ++ (udccsr0 & UDCCSR0_RNE) ? " rne" : "", ++ (udccsr0 & UDCCSR0_FST) ? " fst" : "", ++ (udccsr0 & UDCCSR0_SST) ? " sst" : "", ++ (udccsr0 & UDCCSR0_DME) ? " dme" : "", ++ (udccsr0 & UDCCSR0_IPR) ? " ipr" : "", ++ (udccsr0 & UDCCSR0_OPC) ? " opr" : ""); ++} ++ ++static void __attribute__ ((__unused__)) ++dump_state(struct pxa27x_udc *dev) ++{ ++ unsigned i; ++ ++ DMSG("%s, udcicr %02X.%02X, udcsir %02X.%02x, udcfnr %02X\n", ++ state_name[dev->ep0state], ++ UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); ++ dump_udccr("udccr"); ++ ++ if (!dev->driver) { ++ DMSG("no gadget driver bound\n"); ++ return; ++ } else ++ DMSG("ep0 driver '%s'\n", dev->driver->driver.name); ++ ++ ++ dump_udccsr0 ("udccsr0"); ++ DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", ++ dev->stats.write.bytes, dev->stats.write.ops, ++ dev->stats.read.bytes, dev->stats.read.ops); ++ ++ for (i = 1; i < UDC_EP_NUM; i++) { ++ if (dev->ep[i].assigned) ++ DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccsr); ++ } ++} ++ ++#if 0 ++static void dump_regs(u8 ep) ++{ ++ DMSG("EP:%d UDCCSR:0x%08x UDCBCR:0x%08x\n UDCCR:0x%08x\n", ++ ep,UDCCSN(ep), UDCBCN(ep), UDCCN(ep)); ++} ++static void dump_req (struct pxa27x_request *req) ++{ ++ struct usb_request *r = &req->req; ++ ++ DMSG("%s: buf:0x%08x length:%d dma:0x%08x actual:%d\n", ++ __FUNCTION__, (unsigned)r->buf, r->length, ++ r->dma, r->actual); ++} ++#endif ++ ++#else ++ ++#define DMSG(stuff...) do{}while(0) ++ ++#define dump_udccr(x) do{}while(0) ++#define dump_udccsr0(x) do{}while(0) ++#define dump_state(x) do{}while(0) ++ ++#define UDC_DEBUG ((unsigned)4) ++ ++#endif ++ ++#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0) ++ ++#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff) ++#define INFO(stuff...) printk(KERN_INFO "udc: " stuff) ++ ++ ++#endif /* __LINUX_USB_GADGET_PXA27X_H */ +diff --git a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h +index 0e5d0e6..9483a49 100644 +--- a/drivers/usb/gadget/pxa2xx_udc.h ++++ b/drivers/usb/gadget/pxa2xx_udc.h +@@ -206,7 +206,8 @@ dump_state(struct pxa2xx_udc *dev) + unsigned i; + + DMSG("%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X\n", +- is_usb_connected() ? "host " : "disconnected", ++ //is_usb_connected() ? "host " : "disconnected", ++ "host ", + state_name[dev->ep0state], + UICR1, UICR0, USIR1, USIR0, UFNRH, UFNRL); + dump_udccr("udccr"); +@@ -223,8 +224,8 @@ dump_state(struct pxa2xx_udc *dev) + } else + DMSG("ep0 driver '%s'\n", dev->driver->driver.name); + +- if (!is_usb_connected()) +- return; ++ //if (!is_usb_connected()) ++ // return; + + dump_udccs0 ("udccs0"); + DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", +diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c +index ce4d2e0..5dac23f 100644 +--- a/drivers/usb/gadget/serial.c ++++ b/drivers/usb/gadget/serial.c +@@ -1356,6 +1356,7 @@ static int __init gs_bind(struct usb_gadget *gadget) + struct usb_ep *ep; + struct gs_dev *dev; + int gcnum; ++ struct usb_endpoint_config ep_config[2]; + + /* Some controllers can't support CDC ACM: + * - sh doesn't support multiple interfaces or configs; +@@ -1376,22 +1377,33 @@ static int __init gs_bind(struct usb_gadget *gadget) + __constant_cpu_to_le16(GS_VERSION_NUM|0x0099); + } + ++ ep_config[0].config = GS_BULK_CONFIG_ID; ++ ep_config[0].interface = gs_bulk_interface_desc.bInterfaceNumber; ++ ep_config[0].altinterface = gs_bulk_interface_desc.bAlternateSetting; ++ ep_config[1].config = GS_ACM_CONFIG_ID; ++ ep_config[1].interface = gs_data_interface_desc.bInterfaceNumber; ++ ep_config[1].altinterface = gs_data_interface_desc.bAlternateSetting; ++ + usb_ep_autoconfig_reset(gadget); + +- ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); ++ ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc, &ep_config[0], 2); + if (!ep) + goto autoconf_fail; + EP_IN_NAME = ep->name; + ep->driver_data = ep; /* claim the endpoint */ + +- ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); ++ ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc, &ep_config[0], 2); + if (!ep) + goto autoconf_fail; + EP_OUT_NAME = ep->name; + ep->driver_data = ep; /* claim the endpoint */ + + if (use_acm) { +- ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); ++ ep_config[0].config = GS_ACM_CONFIG_ID; ++ ep_config[0].interface = gs_control_interface_desc.bInterfaceNumber; ++ ep_config[0].altinterface = gs_control_interface_desc.bAlternateSetting; ++ ++ ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc, &ep_config[0], 1); + if (!ep) { + printk(KERN_ERR "gs_bind: cannot run ACM on %s\n", gadget->name); + goto autoconf_fail; +diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c +index fcfe869..1e40d46 100644 +--- a/drivers/usb/gadget/zero.c ++++ b/drivers/usb/gadget/zero.c +@@ -1142,6 +1142,7 @@ zero_bind (struct usb_gadget *gadget) + struct zero_dev *dev; + struct usb_ep *ep; + int gcnum; ++ struct usb_endpoint_config ep_config[2]; + + /* FIXME this can't yet work right with SH ... it has only + * one configuration, numbered one. +@@ -1154,7 +1155,15 @@ zero_bind (struct usb_gadget *gadget) + * but there may also be important quirks to address. + */ + usb_ep_autoconfig_reset (gadget); +- ep = usb_ep_autoconfig (gadget, &fs_source_desc); ++ ++ ep_config[0].config = CONFIG_SOURCE_SINK; ++ ep_config[0].interface = source_sink_intf.bInterfaceNumber; ++ ep_config[0].altinterface = source_sink_intf.bAlternateSetting; ++ ep_config[1].config = CONFIG_LOOPBACK; ++ ep_config[1].interface = loopback_intf.bInterfaceNumber; ++ ep_config[1].altinterface = loopback_intf.bAlternateSetting; ++ ++ ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 2); + if (!ep) { + autoconf_fail: + printk (KERN_ERR "%s: can't autoconfigure on %s\n", +@@ -1164,7 +1173,7 @@ autoconf_fail: + EP_IN_NAME = ep->name; + ep->driver_data = ep; /* claim */ + +- ep = usb_ep_autoconfig (gadget, &fs_sink_desc); ++ ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 2); + if (!ep) + goto autoconf_fail; + EP_OUT_NAME = ep->name; +diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig +index 2580f5f..12e4b91 100644 +--- a/drivers/video/backlight/Kconfig ++++ b/drivers/video/backlight/Kconfig +@@ -40,7 +40,7 @@ config BACKLIGHT_CLASS_DEVICE + + config BACKLIGHT_CORGI + tristate "Sharp Corgi Backlight Driver (SL Series)" +- depends on BACKLIGHT_CLASS_DEVICE && PXA_SHARPSL ++ depends on BACKLIGHT_CLASS_DEVICE && (PXA_SHARPSL || MACH_EM_X270) + default y + help + If you have a Sharp Zaurus SL-C7xx, SL-Cxx00 or SL-6000x say y to enable the +diff --git a/include/asm-arm/arch-pxa/pwr-i2c.h b/include/asm-arm/arch-pxa/pwr-i2c.h +new file mode 100644 +index 0000000..6bad486 +--- /dev/null ++++ b/include/asm-arm/arch-pxa/pwr-i2c.h +@@ -0,0 +1,61 @@ ++/* ++ * (C) Copyright 2007 CompuLab, Ltd ++ * Mike Rapoport <mike@compulab.co.il> ++ * ++ * Simple Power I2C interface for PXA processors. ++ * Based on U-Boot PXA I2C driver. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ */ ++ ++#ifndef __PXA_PWR_I2C_H__ ++#define __PXA_PWR_I2C_H__ ++ ++/* ++ * Configuration items. ++ */ ++#define I2C_RXTX_LEN 128 /* maximum tx/rx buffer length */ ++ ++/* ++ * Probe the given I2C chip address. Returns 0 if a chip responded, ++ * not 0 on failure. ++ */ ++extern int pxa_pwr_i2c_probe(u8 chip); ++ ++/* ++ * Read/Write interface: ++ * chip: I2C chip address, range 0..127 ++ * addr: Memory (register) address within the chip ++ * alen: Number of bytes to use for addr (typically 1, 2 for larger ++ * memories, 0 for register type devices with only one ++ * register) ++ * buffer: Where to read/write the data ++ * len: How many bytes to read/write ++ * ++ * Returns: 0 on success, not 0 on failure ++ */ ++extern int pxa_pwr_i2c_read(u8 chip, uint addr, int alen, u8 *buffer, int len); ++extern int pxa_pwr_i2c_write(u8 chip, uint addr, int alen, ++ u8 *buffer, int len); ++ ++/* ++ * Utility routines to read/write registers. ++ */ ++extern s32 pxa_pwr_i2c_reg_read (u8 chip, u8 reg); ++extern s32 pxa_pwr_i2c_reg_write(u8 chip, u8 reg, u8 val); ++ ++#endif /* __PXA_PWR_I2C_H___ */ +diff --git a/include/linux/da9030.h b/include/linux/da9030.h +new file mode 100644 +index 0000000..6eb89e2 +--- /dev/null ++++ b/include/linux/da9030.h +@@ -0,0 +1,118 @@ ++#ifndef _DA9030_H ++#define _DA9030_H ++ ++/* DA9030 has 24 possible interrupts */ ++#define DA9030_IRQ_COUNT 24 ++ ++/* EVENT A */ ++#define DA9030_IRQ_ONKEY_EN 0 ++#define DA9030_IRQ_PWREN1 1 ++#define DA9030_IRQ_EXTON 2 ++#define DA9030_IRQ_CHDET 3 ++#define DA9030_IRQ_TBAT 4 ++#define DA9030_IRQ_VBATMON 5 ++#define DA9030_IRQ_VBATMONTXON 6 ++#define DA9030_IRQ_CHIOVER 7 ++ ++/* EVENT B */ ++#define DA9030_IRQ_TCTO 8 ++#define DA9030_IRQ_CCTO 9 ++#define DA9030_IRQ_ADC_READY 10 ++#define DA9030_IRQ_VBUS_4_4 11 ++#define DA9030_IRQ_VBUS_4_0 12 ++#define DA9030_IRQ_SESSION_VALID 13 ++#define DA9030_IRQ_SRP_DETECT 14 ++#define DA9030_IRQ_WDOG_INTR 15 ++ ++/* EVENT C */ ++#define DA9030_IRQ_LDO15 16 ++#define DA9030_IRQ_LDO16 17 ++#define DA9030_IRQ_LDO17 18 ++#define DA9030_IRQ_LDO18 19 ++#define DA9030_IRQ_LDO19 20 ++#define DA9030_IRQ_BUCK2 21 ++#define DA9030_IRQ_ADC_IN4 22 ++#define DA9030_IRQ_ADC_IN5 23 ++ ++enum da9030_ldo_sleep_mode { ++ DA9030_LDO_SLEEP_KEEP = 0x0, ++ DA9030_LDO_SLEEP_SHUT_DOWN = 0x1, ++ DA9030_LDO_SLEEP_POWER_UP = 0x2, ++ DA9030_LDO_SLEEP_HIGH_Z = 0x3, ++}; ++ ++enum da9030_led_rate { ++ DA9030_LED_RATE_ON = 0x0, ++ DA9030_LED_RATE_0_52 = 0x1, ++ DA9030_LED_RATE_1_05 = 0x2, ++ DA9030_LED_RATE_2_1 = 0x3, ++}; ++ ++enum da9030_led_duty_cycle { ++ DA9030_LED_DUTY_1_16 = 0x0, ++ DA9030_LED_DUTY_1_8 = 0x1, ++ DA9030_LED_DUTY_1_4 = 0x2, ++ DA9030_LED_DUTY_1_2 = 0x3, ++}; ++ ++enum da9030_led_pwm_chop { ++ DA9030_LED_PWM_8_8 = 0x0, ++ DA9030_LED_PWM_7_8 = 0x1, ++ DA9030_LED_PWM_6_8 = 0x2, ++ DA9030_LED_PWM_5_8 = 0x3, ++ DA9030_LED_PWM_4_8 = 0x4, ++ DA9030_LED_PWM_3_8 = 0x5, ++ DA9030_LED_PWM_2_8 = 0x6, ++ DA9030_LED_PWM_1_8 = 0x7, ++}; ++ ++struct da9030_adc_res { ++ int vbat_res; ++ int vbatmin_res; ++ int vbatmintxon; ++ int ichmax_res; ++ int ichmin_res; ++ int ichaverage_res; ++ int vchmax_res; ++ int vchmin_res; ++ int tbat_res; ++ int adc_in4_res; ++ int adc_in5_res; ++}; ++ ++extern int da9030_get_status(void); ++extern int da9030_get_fault_log(void); ++ ++extern void da9030_enable_adc(void); ++extern void da9030_read_adc(struct da9030_adc_res *adc); ++ ++extern void da9030_set_wled(int on, unsigned int brightness); ++ ++extern int da9030_set_led(int led, int on, ++ enum da9030_led_rate rate, ++ enum da9030_led_duty_cycle duty, ++ enum da9030_led_pwm_chop pwm_chop); ++ ++extern int da9030_set_charger(int on, unsigned int mA, unsigned int mV); ++extern void da9030_get_charger(int *on, unsigned int *mA, unsigned int *mV); ++ ++extern int da9030_set_ldo(int ldo, int on, unsigned int mV, ++ enum da9030_ldo_sleep_mode sleep_mode); ++extern int da9030_set_buck(int buck, int on, unsigned int mV, int flags); ++ ++extern void da9030_set_thresholds(unsigned int tbathighp, ++ unsigned int tbathighn, ++ unsigned int tbatlow, ++ unsigned int vbatmon); ++ ++extern int da9030_register_callback(int event, ++ void (*callback)(int event, void *data), ++ void *data); ++extern void da9030_unregister_callback(int event); ++ ++/* Keep these for now, although they are unsafe. When I'll see what ++ other methods are needed from DA9030, I'll remove these */ ++extern s32 da9030_get_reg(u32 reg); ++extern s32 da9030_set_reg(u32 reg, u8 val); ++ ++#endif +diff --git a/include/linux/usb_gadget.h b/include/linux/usb_gadget.h +index 4f59b2a..792c568 100644 +--- a/include/linux/usb_gadget.h ++++ b/include/linux/usb_gadget.h +@@ -397,10 +397,28 @@ usb_ep_fifo_flush (struct usb_ep *ep) + + struct usb_gadget; + ++/** ++ * struct usb_endpoint_config - possible configurations of a given endpoint ++ * @config: the configuration number ++ * @interface: the interface number ++ * @altinterface: the altinterface number ++ * ++ * Used as an array to pass information about the possible configurations ++ * of a given endpoint to the bus controller. ++ */ ++struct usb_endpoint_config { ++ u8 config; ++ u8 interface; ++ u8 altinterface; ++}; ++ + /* the rest of the api to the controller hardware: device operations, + * which don't involve endpoints (or i/o). + */ + struct usb_gadget_ops { ++ struct usb_ep* (*ep_alloc)(struct usb_gadget *, ++ struct usb_endpoint_descriptor *, ++ struct usb_endpoint_config *, int); + int (*get_frame)(struct usb_gadget *); + int (*wakeup)(struct usb_gadget *); + int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered); +@@ -824,7 +842,10 @@ int usb_gadget_config_buf(const struct usb_config_descriptor *config, + /* utility wrapping a simple endpoint selection policy */ + + extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *, +- struct usb_endpoint_descriptor *) __devinit; ++ struct usb_endpoint_descriptor *, ++ struct usb_endpoint_config *, ++ int numconfigs ++); + + extern void usb_ep_autoconfig_reset (struct usb_gadget *) __devinit; + +diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h +new file mode 100644 +index 0000000..354e533 +--- /dev/null ++++ b/include/linux/wm97xx.h +@@ -0,0 +1,291 @@ ++ ++/* ++ * Register bits and API for Wolfson WM97xx series of codecs ++ */ ++ ++#ifndef _LINUX_WM97XX_H ++#define _LINUX_WM97XX_H ++ ++#include <sound/driver.h> ++#include <sound/core.h> ++#include <sound/pcm.h> ++#include <sound/ac97_codec.h> ++#include <sound/initval.h> ++#include <linux/types.h> ++#include <linux/list.h> ++#include <linux/input.h> /* Input device layer */ ++ ++/* ++ * WM97xx AC97 Touchscreen registers ++ */ ++#define AC97_WM97XX_DIGITISER1 0x76 ++#define AC97_WM97XX_DIGITISER2 0x78 ++#define AC97_WM97XX_DIGITISER_RD 0x7a ++#define AC97_WM9713_DIG1 0x74 ++#define AC97_WM9713_DIG2 AC97_WM97XX_DIGITISER1 ++#define AC97_WM9713_DIG3 AC97_WM97XX_DIGITISER2 ++ ++/* ++ * WM97xx register bits ++ */ ++#define WM97XX_POLL 0x8000 /* initiate a polling measurement */ ++#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ ++#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ ++#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ ++#define WM97XX_ADCSEL_MASK 0x7000 ++#define WM97XX_COO 0x0800 /* enable coordinate mode */ ++#define WM97XX_CTC 0x0400 /* enable continuous mode */ ++#define WM97XX_CM_RATE_93 0x0000 /* 93.75Hz continuous rate */ ++#define WM97XX_CM_RATE_187 0x0100 /* 187.5Hz continuous rate */ ++#define WM97XX_CM_RATE_375 0x0200 /* 375Hz continuous rate */ ++#define WM97XX_CM_RATE_750 0x0300 /* 750Hz continuous rate */ ++#define WM97XX_CM_RATE_8K 0x00f0 /* 8kHz continuous rate */ ++#define WM97XX_CM_RATE_12K 0x01f0 /* 12kHz continuous rate */ ++#define WM97XX_CM_RATE_24K 0x02f0 /* 24kHz continuous rate */ ++#define WM97XX_CM_RATE_48K 0x03f0 /* 48kHz continuous rate */ ++#define WM97XX_CM_RATE_MASK 0x03f0 ++#define WM97XX_RATE(i) (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0)) ++#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ ++#define WM97XX_DELAY_MASK 0x00f0 ++#define WM97XX_SLEN 0x0008 /* slot read back enable */ ++#define WM97XX_SLT(i) ((i - 5) & 0x7) /* touchpanel slot selection (5-11) */ ++#define WM97XX_SLT_MASK 0x0007 ++#define WM97XX_PRP_DETW 0x4000 /* pen detect on, digitiser off, wake up */ ++#define WM97XX_PRP_DET 0x8000 /* pen detect on, digitiser off, no wake up */ ++#define WM97XX_PRP_DET_DIG 0xc000 /* pen detect on, digitiser on */ ++#define WM97XX_RPR 0x2000 /* wake up on pen down */ ++#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ ++#define WM97XX_ADCSRC_MASK 0x7000 /* ADC source mask */ ++ ++#define WM97XX_AUX_ID1 0x8001 ++#define WM97XX_AUX_ID2 0x8002 ++#define WM97XX_AUX_ID3 0x8003 ++#define WM97XX_AUX_ID4 0x8004 ++ ++ ++/* WM9712 Bits */ ++#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ ++#define WM9712_PDEN 0x0800 /* measure only when pen down */ ++#define WM9712_WAIT 0x0200 /* wait until adc is read before next sample */ ++#define WM9712_PIL 0x0100 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9712_MASK_HI 0x0040 /* hi on mask pin (47) stops conversions */ ++#define WM9712_MASK_EDGE 0x0080 /* rising/falling edge on pin delays sample */ ++#define WM9712_MASK_SYNC 0x00c0 /* rising/falling edge on mask initiates sample */ ++#define WM9712_RPU(i) (i&0x3f) /* internal pull up on pen detect (64k / rpu) */ ++#define WM9712_PD(i) (0x1 << i) /* power management */ ++ ++/* WM9712 Registers */ ++#define AC97_WM9712_POWER 0x24 ++#define AC97_WM9712_REV 0x58 ++ ++/* WM9705 Bits */ ++#define WM9705_PDEN 0x1000 /* measure only when pen is down */ ++#define WM9705_PINV 0x0800 /* inverts sense of pen down output */ ++#define WM9705_BSEN 0x0400 /* BUSY flag enable, pin47 is 1 when busy */ ++#define WM9705_BINV 0x0200 /* invert BUSY (pin47) output */ ++#define WM9705_WAIT 0x0100 /* wait until adc is read before next sample */ ++#define WM9705_PIL 0x0080 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9705_PHIZ 0x0040 /* set PHONE and PCBEEP inputs to high impedance */ ++#define WM9705_MASK_HI 0x0010 /* hi on mask stops conversions */ ++#define WM9705_MASK_EDGE 0x0020 /* rising/falling edge on pin delays sample */ ++#define WM9705_MASK_SYNC 0x0030 /* rising/falling edge on mask initiates sample */ ++#define WM9705_PDD(i) (i & 0x000f) /* pen detect comparator threshold */ ++ ++ ++/* WM9713 Bits */ ++#define WM9713_PDPOL 0x0400 /* Pen down polarity */ ++#define WM9713_POLL 0x0200 /* initiate a polling measurement */ ++#define WM9713_CTC 0x0100 /* enable continuous mode */ ++#define WM9713_ADCSEL_X 0x0002 /* X measurement */ ++#define WM9713_ADCSEL_Y 0x0004 /* Y measurement */ ++#define WM9713_ADCSEL_PRES 0x0008 /* Pressure measurement */ ++#define WM9713_COO 0x0001 /* enable coordinate mode */ ++#define WM9713_PDEN 0x0800 /* measure only when pen down */ ++#define WM9713_ADCSEL_MASK 0x00fe /* ADC selection mask */ ++#define WM9713_WAIT 0x0200 /* coordinate wait */ ++ ++/* AUX ADC ID's */ ++#define TS_COMP1 0x0 ++#define TS_COMP2 0x1 ++#define TS_BMON 0x2 ++#define TS_WIPER 0x3 ++ ++/* ID numbers */ ++#define WM97XX_ID1 0x574d ++#define WM9712_ID2 0x4c12 ++#define WM9705_ID2 0x4c05 ++#define WM9713_ID2 0x4c13 ++ ++/* Codec GPIO's */ ++#define WM97XX_MAX_GPIO 16 ++#define WM97XX_GPIO_1 (1 << 1) ++#define WM97XX_GPIO_2 (1 << 2) ++#define WM97XX_GPIO_3 (1 << 3) ++#define WM97XX_GPIO_4 (1 << 4) ++#define WM97XX_GPIO_5 (1 << 5) ++#define WM97XX_GPIO_6 (1 << 6) ++#define WM97XX_GPIO_7 (1 << 7) ++#define WM97XX_GPIO_8 (1 << 8) ++#define WM97XX_GPIO_9 (1 << 9) ++#define WM97XX_GPIO_10 (1 << 10) ++#define WM97XX_GPIO_11 (1 << 11) ++#define WM97XX_GPIO_12 (1 << 12) ++#define WM97XX_GPIO_13 (1 << 13) ++#define WM97XX_GPIO_14 (1 << 14) ++#define WM97XX_GPIO_15 (1 << 15) ++ ++ ++#define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ ++ ++ ++/*---------------- Return codes from sample reading functions ---------------*/ ++ ++/* More data is available; call the sample gathering function again */ ++#define RC_AGAIN 0x00000001 ++/* The returned sample is valid */ ++#define RC_VALID 0x00000002 ++/* The pen is up (the first RC_VALID without RC_PENUP means pen is down) */ ++#define RC_PENUP 0x00000004 ++/* The pen is down (RC_VALID implies RC_PENDOWN, but sometimes it is helpful ++ to tell the handler that the pen is down but we don't know yet his coords, ++ so the handler should not sleep or wait for pendown irq) */ ++#define RC_PENDOWN 0x00000008 ++ ++/* The wm97xx driver provides a private API for writing platform-specific ++ * drivers. ++ */ ++ ++/* The structure used to return arch specific sampled data into */ ++struct wm97xx_data { ++ int x; ++ int y; ++ int p; ++}; ++ ++/* Codec GPIO status ++ */ ++typedef enum { ++ WM97XX_GPIO_HIGH, ++ WM97XX_GPIO_LOW ++} wm97xx_gpio_status_t; ++ ++/* Codec GPIO direction ++ */ ++typedef enum { ++ WM97XX_GPIO_IN, ++ WM97XX_GPIO_OUT ++} wm97xx_gpio_dir_t; ++ ++/* Codec GPIO polarity ++ */ ++typedef enum { ++ WM97XX_GPIO_POL_HIGH, ++ WM97XX_GPIO_POL_LOW ++} wm97xx_gpio_pol_t; ++ ++/* Codec GPIO sticky ++ */ ++typedef enum { ++ WM97XX_GPIO_STICKY, ++ WM97XX_GPIO_NOTSTICKY ++} wm97xx_gpio_sticky_t; ++ ++/* Codec GPIO wake ++ */ ++typedef enum { ++ WM97XX_GPIO_WAKE, ++ WM97XX_GPIO_NOWAKE ++} wm97xx_gpio_wake_t; ++ ++ ++/* ++ * Digitiser ioctl commands ++ */ ++#define WM97XX_DIG_START 0x1 ++#define WM97XX_DIG_STOP 0x2 ++#define WM97XX_PHY_INIT 0x3 ++#define WM97XX_AUX_PREPARE 0x4 ++#define WM97XX_DIG_RESTORE 0x5 ++ ++struct wm97xx; ++extern struct wm97xx_codec_drv wm97xx_codec; ++ ++/* ++ * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs ++ */ ++struct wm97xx_codec_drv { ++ u16 id; ++ char *name; ++ int (*poll_sample) (struct wm97xx *, int adcsel, int *sample); /* read 1 sample */ ++ int (*poll_touch) (struct wm97xx *, struct wm97xx_data *); /* read X,Y,[P] in poll */ ++ int (*digitiser_ioctl) (struct wm97xx *, int cmd); ++ int (*acc_enable) (struct wm97xx *, int enable); ++}; ++ ++ ++/* Machine specific and accelerated touch operations */ ++struct wm97xx_mach_ops { ++ ++ /* accelerated touch readback - coords are transmited on AC97 link */ ++ int acc_enabled; ++ void (*acc_pen_up) (struct wm97xx *); ++ int (*acc_pen_down) (struct wm97xx *); ++ int (*acc_startup) (struct wm97xx *); ++ void (*acc_shutdown) (struct wm97xx *); ++ ++ /* pre and post sample - can be used to minimise any analog noise */ ++ void (*pre_sample) (int); /* function to run before sampling */ ++ void (*post_sample) (int); /* function to run after sampling */ ++}; ++ ++struct wm97xx { ++ u16 dig[3], id, gpio[6], misc; /* Cached codec registers */ ++ u16 dig_save[3]; /* saved during aux reading */ ++ struct wm97xx_codec_drv *codec; /* attached codec driver*/ ++ struct input_dev* input_dev; /* touchscreen input device */ ++ struct snd_ac97 *ac97; /* ALSA codec access */ ++ struct device *dev; /* ALSA device */ ++ struct device *battery_dev; ++ struct device *touch_dev; ++ struct wm97xx_mach_ops *mach_ops; ++ struct mutex codec_mutex; ++ struct completion ts_init; ++ struct completion ts_exit; ++ struct task_struct *ts_task; ++ unsigned int pen_irq; /* Pen IRQ number in use */ ++ wait_queue_head_t pen_irq_wait; /* Pen IRQ wait queue */ ++ struct workqueue_struct *pen_irq_workq; ++ struct work_struct pen_event_work; ++ u16 acc_slot; /* AC97 slot used for acc touch data */ ++ u16 acc_rate; /* acc touch data rate */ ++ unsigned int ts_use_count; ++ unsigned pen_is_down:1; /* Pen is down */ ++ unsigned aux_waiting:1; /* aux measurement waiting */ ++ unsigned pen_probably_down:1; /* used in polling mode */ ++}; ++ ++/* Codec GPIO access (not supported on WM9705) ++ * This can be used to set/get codec GPIO and Virtual GPIO status. ++ */ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio); ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status); ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, ++ wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake); ++ ++/* codec AC97 IO access */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg); ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val); ++ ++/* aux adc readback */ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel); ++ ++/* machine ops */ ++int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *); ++void wm97xx_unregister_mach_ops(struct wm97xx *); ++ ++extern struct bus_type wm97xx_bus_type; ++#endif +diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig +index a83e229..89b5730 100644 +--- a/sound/soc/pxa/Kconfig ++++ b/sound/soc/pxa/Kconfig +@@ -53,3 +53,12 @@ config SND_PXA2XX_SOC_TOSA + help + Say Y if you want to add support for SoC audio on Sharp + Zaurus SL-C6000x models (Tosa). ++ ++config SND_PXA2XX_SOC_EM_X270 ++ tristate "SoC Audio support for CompuLab EM-x270" ++ depends on SND_PXA2XX_SOC && MACH_EM_X270 ++ select SND_PXA2XX_SOC_AC97 ++ select SND_SOC_WM9712 ++ help ++ Say Y if you want to add support for SoC audio on ++ CompuLab EM-x270. +diff --git a/sound/soc/pxa/Makefile b/sound/soc/pxa/Makefile +index 78e0d6b..32375ac 100644 +--- a/sound/soc/pxa/Makefile ++++ b/sound/soc/pxa/Makefile +@@ -12,9 +12,11 @@ snd-soc-corgi-objs := corgi.o + snd-soc-poodle-objs := poodle.o + snd-soc-tosa-objs := tosa.o + snd-soc-spitz-objs := spitz.o ++snd-soc-em-x270-objs := em-x270.o + + obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o + obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o + obj-$(CONFIG_SND_PXA2XX_SOC_TOSA) += snd-soc-tosa.o + obj-$(CONFIG_SND_PXA2XX_SOC_SPITZ) += snd-soc-spitz.o ++obj-$(CONFIG_SND_PXA2XX_SOC_EM_X270) += snd-soc-em-x270.o + +diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c +new file mode 100644 +index 0000000..9e891d0 +--- /dev/null ++++ b/sound/soc/pxa/em-x270.c +@@ -0,0 +1,137 @@ ++/* ++ * em-x270.c -- SoC audio for EM-X270 ++ * ++ * Copyright 2007 CompuLab, Ltd. ++ * ++ * Author: Mike Rapoport <mike@compulab.co.il> ++ * ++ * Copied from tosa.c: ++ * Copyright 2005 Wolfson Microelectronics PLC. ++ * Copyright 2005 Openedhand Ltd. ++ * ++ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com> ++ * Richard Purdie <richard@openedhand.com> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/device.h> ++ ++#include <sound/driver.h> ++#include <sound/core.h> ++#include <sound/pcm.h> ++#include <sound/soc.h> ++#include <sound/soc-dapm.h> ++ ++#include <asm/mach-types.h> ++#include <asm/arch/pxa-regs.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/audio.h> ++ ++#include "../codecs/wm9712.h" ++#include "pxa2xx-pcm.h" ++#include "pxa2xx-ac97.h" ++ ++static struct snd_soc_machine em_x270; ++ ++#define EM_X270_HP 0 ++#define EM_X270_MIC_INT 1 ++#define EM_X270_HEADSET 2 ++#define EM_X270_HP_OFF 3 ++#define EM_X270_SPK_ON 0 ++#define EM_X270_SPK_OFF 1 ++ ++ ++static struct snd_soc_ops em_x270_ops = { ++}; ++ ++static const struct snd_kcontrol_new em_x270_controls[] = { ++}; ++ ++static int em_x270_ac97_init(struct snd_soc_codec *codec) ++{ ++ int i, err; ++ ++ /* add em_x270 specific controls */ ++ for (i = 0; i < ARRAY_SIZE(em_x270_controls); i++) { ++ err = snd_ctl_add(codec->card, ++ snd_soc_cnew(&em_x270_controls[i],codec, NULL)); ++ if (err < 0) ++ return err; ++ } ++ ++ snd_soc_dapm_sync_endpoints(codec); ++ return 0; ++} ++ ++static struct snd_soc_dai_link em_x270_dai[] = { ++ { ++ .name = "AC97", ++ .stream_name = "AC97 HiFi", ++ .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], ++ .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], ++ .init = em_x270_ac97_init, ++ .ops = &em_x270_ops, ++ }, ++ { ++ .name = "AC97 Aux", ++ .stream_name = "AC97 Aux", ++ .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], ++ .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], ++ .ops = &em_x270_ops, ++ }, ++}; ++ ++static struct snd_soc_machine em_x270 = { ++ .name = "EM-X270", ++ .dai_link = em_x270_dai, ++ .num_links = ARRAY_SIZE(em_x270_dai), ++}; ++ ++static struct snd_soc_device em_x270_snd_devdata = { ++ .machine = &em_x270, ++ .platform = &pxa2xx_soc_platform, ++ .codec_dev = &soc_codec_dev_wm9712, ++}; ++ ++static struct platform_device *em_x270_snd_device; ++ ++static int __init em_x270_init(void) ++{ ++ int ret; ++ ++ if (!machine_is_em_x270()) ++ return -ENODEV; ++ ++ em_x270_snd_device = platform_device_alloc("soc-audio", -1); ++ if (!em_x270_snd_device) ++ return -ENOMEM; ++ ++ platform_set_drvdata(em_x270_snd_device, &em_x270_snd_devdata); ++ em_x270_snd_devdata.dev = &em_x270_snd_device->dev; ++ ret = platform_device_add(em_x270_snd_device); ++ ++ if (ret) ++ platform_device_put(em_x270_snd_device); ++ ++ return ret; ++} ++ ++static void __exit em_x270_exit(void) ++{ ++ platform_device_unregister(em_x270_snd_device); ++} ++ ++module_init(em_x270_init); ++module_exit(em_x270_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Mike Rapoport"); ++MODULE_DESCRIPTION("ALSA SoC EM-X270"); ++MODULE_LICENSE("GPL"); diff --git a/packages/linux/em-x270_2.6.23.bb b/packages/linux/em-x270_2.6.23.bb new file mode 100644 index 0000000000..a9d6ee7905 --- /dev/null +++ b/packages/linux/em-x270_2.6.23.bb @@ -0,0 +1,29 @@ +require linux.inc + +SECTION = "kernel" +DESCRIPTION = "Linux kernel for the Compulab EM-X270 system" +LICENSE = "GPL" +DEPENDS = "uboot-utils" +PR = "r0" + +KERNEL_IMAGETYPE = "uImage" + +SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2 \ + file://em-x270.patch;patch=1 \ + file://defconfig \ + " + +S = "${WORKDIR}/linux-${PV}" + +COMPATIBLE_HOST = 'arm.*-linux' +COMPATIBLE_MACHINE = "em-x270" + +inherit kernel +inherit package + +ARCH = "arm" + +FILES_kernel-image = "" + +S = "${WORKDIR}/linux-${PV}" + diff --git a/packages/linux/linux-2.6.22/bd-neon/.mtn2git_empty b/packages/linux/linux-2.6.22/bd-neon/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux-2.6.22/bd-neon/.mtn2git_empty diff --git a/packages/linux/linux-2.6.22/bd-neon/defconfig b/packages/linux/linux-2.6.22/bd-neon/defconfig new file mode 100644 index 0000000000..9bd82a5e2d --- /dev/null +++ b/packages/linux/linux-2.6.22/bd-neon/defconfig @@ -0,0 +1,1326 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.19.2 +# Thu May 24 16:14:49 2007 +# +CONFIG_ARM=y +# CONFIG_GENERIC_TIME is not set +CONFIG_MMU=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_MTD_XIP=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +# CONFIG_SWAP is not set +# CONFIG_SYSVIPC is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_RELAY is not set +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +CONFIG_BLOCK=y +# CONFIG_BLK_DEV_IO_TRACE is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_PNX4008 is not set +CONFIG_ARCH_PXA=y +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_OMAP is not set + +# +# Intel PXA2xx Implementations +# +# CONFIG_ARCH_LUBBOCK is not set +# CONFIG_MACH_LOGICPD_PXA270 is not set +# CONFIG_MACH_MAINSTONE is not set +# CONFIG_MACH_ARGON is not set +CONFIG_MACH_NEON=y +# CONFIG_ARCH_PXA_IDP is not set +# CONFIG_PXA_SHARPSL is not set +# CONFIG_MACH_TRIZEPS4 is not set +CONFIG_PXA25x=y + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_XSCALE=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5T=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +CONFIG_XSCALE_PMU=y + +# +# Bus support +# + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +# CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +CONFIG_OABI_COMPAT=y +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="" +# CONFIG_XIP_KERNEL is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +# CONFIG_PM is not set +# CONFIG_APM is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_IPV6 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +CONFIG_IEEE80211=y +CONFIG_IEEE80211_DEBUG=y +CONFIG_IEEE80211_CRYPT_WEP=y +CONFIG_IEEE80211_CRYPT_CCMP=y +CONFIG_IEEE80211_CRYPT_TKIP=y +CONFIG_IEEE80211_SOFTMAC=y +CONFIG_IEEE80211_SOFTMAC_DEBUG=y +CONFIG_WIRELESS_EXT=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +# CONFIG_STANDALONE is not set +# CONFIG_PREVENT_FIRMWARE_BUILD is not set +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +CONFIG_CONNECTOR=y +# CONFIG_PROC_EVENTS is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLOCK is not set +CONFIG_MTD_BLOCK_RO=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_XIP is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x0 +CONFIG_MTD_PHYSMAP_LEN=0x2000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=4 +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_SHARP_SL is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +CONFIG_BLK_DEV_INITRD=y +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# ATA/ATAPI/MFM/RLL support +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set + +# +# SCSI low-level drivers +# +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Serial ATA (prod) and Parallel ATA (experimental) drivers +# +# CONFIG_ATA is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# + +# +# I2O device support +# + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_SMC91X=y +# CONFIG_DM9000 is not set +# CONFIG_SMC911X is not set + +# +# Ethernet (1000 Mbit) +# + +# +# Ethernet (10000 Mbit) +# + +# +# Token Ring devices +# + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +CONFIG_NET_WIRELESS_RTNETLINK=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +# CONFIG_USB_ZD1201 is not set +# CONFIG_HOSTAP is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +# CONFIG_JOYSTICK_ANALOG is not set +# CONFIG_JOYSTICK_A3D is not set +# CONFIG_JOYSTICK_ADI is not set +# CONFIG_JOYSTICK_COBRA is not set +# CONFIG_JOYSTICK_GF2K is not set +# CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set +# CONFIG_JOYSTICK_INTERACT is not set +# CONFIG_JOYSTICK_SIDEWINDER is not set +# CONFIG_JOYSTICK_TMDC is not set +# CONFIG_JOYSTICK_IFORCE is not set +# CONFIG_JOYSTICK_WARRIOR is not set +# CONFIG_JOYSTICK_MAGELLAN is not set +# CONFIG_JOYSTICK_SPACEORB is not set +# CONFIG_JOYSTICK_SPACEBALL is not set +# CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDJOY is not set +# CONFIG_JOYSTICK_JOYDUMP is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_PXA_GPIO=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_PXA=y +CONFIG_SERIAL_PXA_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_SA1100_WATCHDOG=y +# CONFIG_SA1100_WATCHDOG_TICK is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_RAW_DRIVER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +CONFIG_BD_GENTIMER=y +# CONFIG_TIFM_CORE is not set + +# +# LED devices +# +# CONFIG_NEW_LEDS is not set + +# +# LED drivers +# + +# +# LED Triggers +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +# CONFIG_USB_DABUSB is not set + +# +# Graphics support +# +CONFIG_FIRMWARE_EDID=y +CONFIG_FB=y +# CONFIG_FB_CFB_FILLRECT is not set +# CONFIG_FB_CFB_COPYAREA is not set +# CONFIG_FB_CFB_IMAGEBLIT is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_PXA is not set +# CONFIG_FB_MBX is not set +CONFIG_FB_SM501=y +CONFIG_FB_SM501MEM=y +CONFIG_FB_SM501YUV=y +CONFIG_FB_SM501ALPHA=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SND_DEBUG=y +# CONFIG_SND_DEBUG_DETECT is not set +# CONFIG_SND_PCM_XRUN_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_AC97_CODEC=y +CONFIG_SND_AC97_BUS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# +CONFIG_SND_PXA2XX_PCM=y +CONFIG_SND_PXA2XX_AC97=y + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# Multimedia Capabilities Port drivers +# +CONFIG_UCB1400_TS=y +# CONFIG_UCB1400_TS_FIVE_WIRE is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_SM501=y +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +CONFIG_USB_PRINTER=y + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +CONFIG_USB_LIBUSUAL=y + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_TOUCHSCREEN is not set +# CONFIG_USB_YEALINK is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +CONFIG_USB_PEGASUS=y +CONFIG_USB_RTL8150=y +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_MON is not set + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_AIRPRIME is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_CP2101 is not set +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_FUNSOFT is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +CONFIG_USB_SERIAL_KEYSPAN=m +# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_HP4X is not set +# CONFIG_USB_SERIAL_SAFE is not set +# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OPTION is not set +# CONFIG_USB_SERIAL_OMNINET is not set +CONFIG_USB_EZUSB=y +CONFIG_AT91SAM7X=m +CONFIG_AT91SAM7X_SERIAL=m +CONFIG_AT91SAM7X_FLASH=m +CONFIG_AT91SAM7X_FRAM=m +CONFIG_AT91SAM7X_ETHER=m + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_NET2280 is not set +CONFIG_USB_GADGET_PXA2XX=y +CONFIG_USB_PXA2XX=y +CONFIG_USB_PXA2XX_SMALL=y +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +# CONFIG_USB_ZERO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FILE_STORAGE is not set +CONFIG_USB_G_SERIAL=y +# CONFIG_USB_MIDI_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=y +CONFIG_MMC_PXA=y +# CONFIG_MMC_TIFM_SD is not set + +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +# CONFIG_RTC_CLASS is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_NFSD is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +CONFIG_NLS_UTF8=y + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=y + +# +# Kernel hacking +# +CONFIG_PRINTK_TIME=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_RWSEMS=y +CONFIG_DEBUG_SPINLOCK_SLEEP=y +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_FS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +CONFIG_FRAME_POINTER=y +CONFIG_FORCED_INLINING=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_WAITQ=y +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_MANAGER=y +# CONFIG_CRYPTO_HMAC is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_MD4 is not set +# CONFIG_CRYPTO_MD5 is not set +# CONFIG_CRYPTO_SHA1 is not set +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_TGR192 is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_CBC is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_SERPENT is not set +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_ARC4=y +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_DEFLATE is not set +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_TEST is not set + +# +# Hardware crypto devices +# + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_PLIST=y diff --git a/packages/linux/linux-bfin/.mtn2git_empty b/packages/linux/linux-bfin/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux-bfin/.mtn2git_empty diff --git a/packages/linux/linux-bfin/adzs-bf548-ezlite/.mtn2git_empty b/packages/linux/linux-bfin/adzs-bf548-ezlite/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux-bfin/adzs-bf548-ezlite/.mtn2git_empty diff --git a/packages/linux/linux-bfin/adzs-bf548-ezlite/defconfig b/packages/linux/linux-bfin/adzs-bf548-ezlite/defconfig new file mode 100644 index 0000000000..43efcb02d5 --- /dev/null +++ b/packages/linux/linux-bfin/adzs-bf548-ezlite/defconfig @@ -0,0 +1,1989 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.22.10 +# Tue Oct 16 11:16:52 2007 +# +# CONFIG_MMU is not set +# CONFIG_FPU is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +CONFIG_BLACKFIN=y +CONFIG_ZONE_DMA=y +CONFIG_BFIN=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_GENERIC_FIND_NEXT_BIT=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +# CONFIG_GENERIC_TIME is not set +CONFIG_GENERIC_GPIO=y +CONFIG_FORCE_MAX_ZONEORDER=14 +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_IRQCHIP_DEMUX_GPIO=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=n +CONFIG_SYSVIPC=y +# CONFIG_IPC_NS is not set +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +# CONFIG_TASKSTATS is not set +# CONFIG_UTS_NS is not set +# CONFIG_AUDIT is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_SYSFS_DEPRECATED=y +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +# CONFIG_ELF_CORE is not set +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_EVENTFD=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +CONFIG_BIG_ORDER_ALLOC_NOFAIL_MAGIC=3 +CONFIG_NP2=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_RT_MUTEXES=y +CONFIG_TINY_SHMEM=y +CONFIG_BASE_SMALL=0 + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +CONFIG_BLOCK=y +CONFIG_LBD=y +# CONFIG_BLK_DEV_IO_TRACE is not set +CONFIG_LSF=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_BKL=y + +# +# Blackfin Processor Options +# + +# +# Processor and Board Settings +# +# CONFIG_BF522 is not set +# CONFIG_BF525 is not set +# CONFIG_BF527 is not set +# CONFIG_BF531 is not set +# CONFIG_BF532 is not set +# CONFIG_BF533 is not set +# CONFIG_BF534 is not set +# CONFIG_BF536 is not set +# CONFIG_BF537 is not set +# CONFIG_BF542 is not set +# CONFIG_BF544 is not set +CONFIG_BF548=y +# CONFIG_BF549 is not set +# CONFIG_BF561 is not set +# CONFIG_BF_REV_0_0 is not set +# CONFIG_BF_REV_0_1 is not set +# CONFIG_BF_REV_0_2 is not set +# CONFIG_BF_REV_0_3 is not set +# CONFIG_BF_REV_0_4 is not set +# CONFIG_BF_REV_0_5 is not set +CONFIG_BF_REV_ANY=y +# CONFIG_BF_REV_NONE is not set +CONFIG_BF54x=y +CONFIG_BFIN_SINGLE_CORE=y +# CONFIG_BFIN527_EZKIT is not set +# CONFIG_BFIN533_EZKIT is not set +# CONFIG_BFIN533_STAMP is not set +# CONFIG_BFIN537_STAMP is not set +# CONFIG_BFIN533_BLUETECHNIX_CM is not set +# CONFIG_BFIN537_BLUETECHNIX_CM is not set +CONFIG_BFIN548_EZKIT=y +# CONFIG_BFIN561_BLUETECHNIX_CM is not set +# CONFIG_BFIN561_EZKIT is not set +# CONFIG_BFIN561_TEPLA is not set +# CONFIG_PNAV10 is not set +# CONFIG_GENERIC_BOARD is not set +CONFIG_IRQ_PLL_WAKEUP=7 +CONFIG_IRQ_RTC=8 +CONFIG_IRQ_SPORT0_RX=9 +CONFIG_IRQ_SPORT0_TX=9 +CONFIG_IRQ_SPORT1_RX=9 +CONFIG_IRQ_SPORT1_TX=9 +CONFIG_IRQ_UART0_RX=10 +CONFIG_IRQ_UART0_TX=10 +CONFIG_IRQ_UART1_RX=10 +CONFIG_IRQ_UART1_TX=10 +CONFIG_IRQ_CNT=8 +CONFIG_IRQ_USB_INT0=11 +CONFIG_IRQ_USB_INT1=11 +CONFIG_IRQ_USB_INT2=11 +CONFIG_IRQ_USB_DMA=11 +CONFIG_IRQ_TIMER0=11 +CONFIG_IRQ_TIMER1=11 +CONFIG_IRQ_TIMER2=11 +CONFIG_IRQ_TIMER3=11 +CONFIG_IRQ_TIMER4=11 +CONFIG_IRQ_TIMER5=11 +CONFIG_IRQ_TIMER6=11 +CONFIG_IRQ_TIMER7=11 +CONFIG_IRQ_TIMER8=11 +CONFIG_IRQ_TIMER9=11 +CONFIG_IRQ_TIMER10=11 + +# +# BF548 Specific Configuration +# +# CONFIG_DEB_DMA_URGENT is not set + +# +# Interrupt Priority Assignment +# + +# +# Priority +# +CONFIG_IRQ_DMAC0_ERR=7 +CONFIG_IRQ_EPPI0_ERR=7 +CONFIG_IRQ_SPORT0_ERR=7 +CONFIG_IRQ_SPORT1_ERR=7 +CONFIG_IRQ_SPI0_ERR=7 +CONFIG_IRQ_UART0_ERR=7 +CONFIG_IRQ_EPPI0=8 +CONFIG_IRQ_SPI0=10 +CONFIG_IRQ_PINT0=12 +CONFIG_IRQ_PINT1=12 +CONFIG_IRQ_MDMAS0=13 +CONFIG_IRQ_MDMAS1=13 +CONFIG_IRQ_WATCHDOG=13 +CONFIG_IRQ_DMAC1_ERR=7 +CONFIG_IRQ_SPORT2_ERR=7 +CONFIG_IRQ_SPORT3_ERR=7 +CONFIG_IRQ_MXVR_DATA=7 +CONFIG_IRQ_SPI1_ERR=7 +CONFIG_IRQ_SPI2_ERR=7 +CONFIG_IRQ_UART1_ERR=7 +CONFIG_IRQ_UART2_ERR=7 +CONFIG_IRQ_CAN0_ERR=7 +CONFIG_IRQ_SPORT2_RX=9 +CONFIG_IRQ_SPORT2_TX=9 +CONFIG_IRQ_SPORT3_RX=9 +CONFIG_IRQ_SPORT3_TX=9 +CONFIG_IRQ_EPPI1=9 +CONFIG_IRQ_EPPI2=9 +CONFIG_IRQ_SPI1=10 +CONFIG_IRQ_SPI2=10 +CONFIG_IRQ_ATAPI_RX=10 +CONFIG_IRQ_ATAPI_TX=10 +CONFIG_IRQ_TWI0=11 +CONFIG_IRQ_TWI1=11 +CONFIG_IRQ_CAN0_RX=11 +CONFIG_IRQ_CAN0_TX=11 +CONFIG_IRQ_MDMAS2=13 +CONFIG_IRQ_MDMAS3=13 +CONFIG_IRQ_MXVR_ERR=11 +CONFIG_IRQ_MXVR_MSG=11 +CONFIG_IRQ_MXVR_PKT=11 +CONFIG_IRQ_EPPI1_ERR=7 +CONFIG_IRQ_EPPI2_ERR=7 +CONFIG_IRQ_UART3_ERR=7 +CONFIG_IRQ_HOST_ERR=7 +CONFIG_IRQ_PIXC_ERR=7 +CONFIG_IRQ_NFC_ERR=7 +CONFIG_IRQ_ATAPI_ERR=7 +CONFIG_IRQ_CAN1_ERR=7 +CONFIG_IRQ_HS_DMA_ERR=7 +CONFIG_IRQ_PIXC_IN0=8 +CONFIG_IRQ_PIXC_IN1=8 +CONFIG_IRQ_PIXC_OUT=8 +CONFIG_IRQ_SDH=8 +CONFIG_IRQ_KEY=8 +CONFIG_IRQ_CAN1_RX=11 +CONFIG_IRQ_CAN1_TX=11 +CONFIG_IRQ_SDH_MASK0=11 +CONFIG_IRQ_SDH_MASK1=11 +CONFIG_IRQ_OTPSEC=11 +CONFIG_IRQ_PINT2=11 +CONFIG_IRQ_PINT3=11 + +# +# Pin Interrupt to Port Assignment +# + +# +# Assignment +# +CONFIG_PINTx_REASSIGN=y +CONFIG_PINT0_ASSIGN=0x00000101 +CONFIG_PINT1_ASSIGN=0x01010000 +CONFIG_PINT2_ASSIGN=0x07000101 +CONFIG_PINT3_ASSIGN=0x02020303 + +# +# Board customizations +# +# CONFIG_CMDLINE_BOOL is not set + +# +# Clock/PLL Setup +# +CONFIG_CLKIN_HZ=25000000 +# CONFIG_BFIN_KERNEL_CLOCK is not set +CONFIG_MIN_VCO_HZ=50000000 +CONFIG_MAX_SCLK_HZ=133000000 +CONFIG_MIN_SCLK_HZ=27000000 + +# +# Kernel Timer/Scheduler +# +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +CONFIG_HZ_300=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=300 + +# +# Memory Setup +# +CONFIG_MEM_SIZE=64 +CONFIG_MEM_ADD_WIDTH=10 +CONFIG_BOOT_LOAD=0x1000 +CONFIG_BFIN_SCRATCH_REG_RETN=y +# CONFIG_BFIN_SCRATCH_REG_RETE is not set +# CONFIG_BFIN_SCRATCH_REG_CYCLES is not set + +# +# Blackfin Kernel Optimizations +# + +# +# Memory Optimizations +# +CONFIG_I_ENTRY_L1=y +CONFIG_EXCPT_IRQ_SYSC_L1=y +CONFIG_DO_IRQ_L1=y +CONFIG_CORE_TIMER_IRQ_L1=y +CONFIG_IDLE_L1=y +# CONFIG_SCHEDULE_L1 is not set +CONFIG_ARITHMETIC_OPS_L1=y +CONFIG_ACCESS_OK_L1=y +# CONFIG_MEMSET_L1 is not set +# CONFIG_MEMCPY_L1 is not set +# CONFIG_SYS_BFIN_SPINLOCK_L1 is not set +# CONFIG_IP_CHECKSUM_L1 is not set +CONFIG_CACHELINE_ALIGNED_L1=y +# CONFIG_SYSCALL_TAB_L1 is not set +# CONFIG_CPLB_SWITCH_TAB_L1 is not set +CONFIG_RAMKERNEL=y +# CONFIG_ROMKERNEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_LARGE_ALLOCS=y +CONFIG_BFIN_DMA_5XX=y +# CONFIG_DMA_UNCACHED_2M is not set +CONFIG_DMA_UNCACHED_1M=y +# CONFIG_DMA_UNCACHED_NONE is not set + +# +# Cache Support +# +CONFIG_BFIN_ICACHE=y +CONFIG_BFIN_DCACHE=y +# CONFIG_BFIN_DCACHE_BANKA is not set +# CONFIG_BFIN_ICACHE_LOCK is not set +# CONFIG_BFIN_WB is not set +CONFIG_BFIN_WT=y +CONFIG_L1_MAX_PIECE=16 + +# +# Asynchonous Memory Configuration +# + +# +# EBIU_AMGCTL Global Control +# +CONFIG_C_AMCKEN=y +# CONFIG_C_AMBEN is not set +# CONFIG_C_AMBEN_B0 is not set +# CONFIG_C_AMBEN_B0_B1 is not set +# CONFIG_C_AMBEN_B0_B1_B2 is not set +CONFIG_C_AMBEN_ALL=y + +# +# EBIU_AMBCTL Control +# +CONFIG_BANK_0=0x7BB0 +CONFIG_BANK_1=0x5554 +CONFIG_BANK_2=0x7BB0 +CONFIG_BANK_3=0x99B3 + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +# CONFIG_PCI is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF_FDPIC=y +CONFIG_BINFMT_FLAT=y +CONFIG_BINFMT_ZFLAT=y +CONFIG_BINFMT_SHARED_FLAT=y +CONFIG_BINFMT_MISC=m + +# +# Power management options +# +# CONFIG_PM is not set + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_USER=m +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +# CONFIG_IP_PNP_BOOTP is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +CONFIG_INET_DIAG=y +CONFIG_INET_TCP_DIAG=y +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IP_VS is not set +CONFIG_IPV6=m +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=y +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=m +# CONFIG_IPV6_TUNNEL is not set +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_NETLABEL is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NF_CONNTRACK_ENABLED=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CT_ACCT=y +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_GRE=m +CONFIG_NF_CT_PROTO_SCTP=m +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PROTO_GRE=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +# CONFIG_IP_NF_TARGET_TTL is not set +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_ULOG=m +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +# CONFIG_DECNET is not set +CONFIG_LLC=m +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set +CONFIG_NET_SCH_FIFO=y +CONFIG_NET_CLS_ROUTE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIVHCI is not set +# CONFIG_AF_RXRPC is not set + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=m +# CONFIG_MAC80211_LEDS is not set +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set +# CONFIG_RFKILL is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +# CONFIG_FW_LOADER is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_CFI_STAA is not set +# CONFIG_MTD_MW320D is not set +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_RAM=y +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x20000000 +CONFIG_MTD_PHYSMAP_LEN=0x400000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_BF5xx is not set +# CONFIG_MTD_UCLINUX is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_BFIN is not set +CONFIG_MTD_NAND_IDS=y +CONFIG_MTD_NAND_BF5XX=y +CONFIG_MTD_NAND_BF5XX_HWECC=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +# CONFIG_PNPACPI is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# Misc devices +# +# CONFIG_IDE is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set + +# +# SCSI low-level drivers +# +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +CONFIG_ATA=y +# CONFIG_ATA_NONSTANDARD is not set +# CONFIG_PATA_PLATFORM is not set +CONFIG_PATA_BF54X=y +CONFIG_PATA_BF54X_DMA=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_SMC91X is not set +CONFIG_SMSC911X=y +# CONFIG_DM9000 is not set +CONFIG_NETDEV_1000=y +CONFIG_NETDEV_10000=y + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +CONFIG_WLAN_80211=y +# CONFIG_LIBERTAS is not set +# CONFIG_HERMES is not set +# CONFIG_USB_ZD1201 is not set +# CONFIG_HOSTAP is not set +# CONFIG_ZD1211RW is not set + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET_MII is not set +# CONFIG_USB_USBNET is not set +# CONFIG_WAN is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set +CONFIG_SLHC=m +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_INPUT_POLLDEV is not set + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=m +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_BFIN is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=m +CONFIG_TOUCHSCREEN_AD7877=m +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_TOUCHSCREEN_PENMOUNT=m +CONFIG_TOUCHSCREEN_TOUCHRIGHT=m +CONFIG_TOUCHSCREEN_TOUCHWIN=m +CONFIG_TOUCHSCREEN_UCB1400=m +CONFIG_TOUCHSCREEN_USB_COMPOSITE=m +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_ATI_REMOTE is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_UINPUT is not set +# CONFIG_BF53X_PFBUTTONS is not set +# CONFIG_TWI_KEYPAD is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +# CONFIG_AD9960 is not set +# CONFIG_SPI_ADC_BF533 is not set +# CONFIG_BF5xx_PFLAGS is not set +# CONFIG_BF5xx_PPIFCD is not set +# CONFIG_BF5xx_TIMERS is not set +# CONFIG_BF5xx_PPI is not set +# CONFIG_BFIN_SPORT is not set +# CONFIG_BFIN_TIMER_LATENCY is not set +# CONFIG_TWI_LCD is not set +# CONFIG_AD5304 is not set +# CONFIG_BF5xx_TEA5764 is not set +# CONFIG_BF5xx_FBDMA is not set +# CONFIG_VT is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_BFIN=y +CONFIG_SERIAL_BFIN_CONSOLE=y +# CONFIG_SERIAL_BFIN_DMA is not set +CONFIG_SERIAL_BFIN_PIO=y +# CONFIG_SERIAL_BFIN_UART0 is not set +CONFIG_SERIAL_BFIN_UART1=y +# CONFIG_BFIN_UART1_CTSRTS is not set +# CONFIG_SERIAL_BFIN_UART2 is not set +# CONFIG_SERIAL_BFIN_UART3 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_BFIN_SPORT is not set +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set + +# +# CAN, the car bus and industrial fieldbus +# +# CONFIG_CAN4LINUX is not set + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_BFIN_WDT=y + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_HW_RANDOM=y +# CONFIG_GEN_RTC is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y + +# +# I2C Algorithms +# +# CONFIG_I2C_ALGOBIT is not set +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_BLACKFIN_GPIO is not set +CONFIG_I2C_BLACKFIN_TWI=y +CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50 +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Miscellaneous I2C Chip support +# +# CONFIG_SENSORS_DS1337 is not set +# CONFIG_SENSORS_DS1374 is not set +# CONFIG_SENSORS_AD5252 is not set +# CONFIG_SENSORS_EEPROM is not set +# CONFIG_SENSORS_PCF8574 is not set +# CONFIG_SENSORS_PCF8575 is not set +# CONFIG_SENSORS_PCA9543 is not set +# CONFIG_SENSORS_PCA9539 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_SENSORS_MAX6875 is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# SPI support +# +CONFIG_SPI=y +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_BFIN=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ASB100 is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_FSCHER is not set +# CONFIG_SENSORS_FSCPOS is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +CONFIG_V4L_USB_DRIVERS=y +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_EM28XX is not set +# CONFIG_VIDEO_USBVISION is not set +# CONFIG_USB_VICAM is not set +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_KONICAWC is not set +# CONFIG_USB_QUICKCAM_MESSENGER is not set +# CONFIG_USB_ET61X251 is not set +# CONFIG_VIDEO_OVCAMCHIP is not set +# CONFIG_USB_W9968CF is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_SN9C102 is not set +# CONFIG_USB_STV680 is not set +# CONFIG_USB_ZC0301 is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_ZR364XX is not set +# CONFIG_VIDEO_BLACKFIN_CAM is not set +# CONFIG_VIDEO_BLACKFIN_MT9M001 is not set + +# +# CMOS Camera Sensor Selection +# +CONFIG_RADIO_ADAPTERS=y +# CONFIG_USB_DSBR is not set +CONFIG_DVB_CORE=m +CONFIG_DVB_CORE_ATTACH=y +CONFIG_DVB_CAPTURE_DRIVERS=y + +# +# Supported USB Adapters +# +# CONFIG_DVB_USB is not set +# CONFIG_DVB_TTUSB_BUDGET is not set +# CONFIG_DVB_TTUSB_DEC is not set +# CONFIG_DVB_CINERGYT2 is not set + +# +# Supported FlexCopII (B2C2) Adapters +# +# CONFIG_DVB_B2C2_FLEXCOP is not set + +# +# Supported DVB Frontends +# + +# +# Customise DVB Frontends +# +# CONFIG_DVB_FE_CUSTOMISE is not set + +# +# DVB-S (satellite) frontends +# +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_TDA10086 is not set + +# +# DVB-T (terrestrial) frontends +# +# CONFIG_DVB_SP8870 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set + +# +# DVB-C (cable) frontends +# +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_STV0297 is not set + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LGDT330X is not set + +# +# Tuners/PLL support +# +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TDA827X is not set +# CONFIG_DVB_TUNER_QT1010 is not set +# CONFIG_DVB_TUNER_MT2060 is not set + +# +# Miscellaneous devices +# +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_TUA6100 is not set +CONFIG_DAB=y +CONFIG_USB_DABUSB=m + +# +# Graphics support +# +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_LCD_CLASS_DEVICE=m + +# +# Display device support +# +CONFIG_DISPLAY_SUPPORT=m + +# +# Display hardware drivers +# +# CONFIG_VGASTATE is not set +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +# CONFIG_FB_DDC is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_SYS_FOPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_BFIN_7171 is not set +# CONFIG_FB_BFIN_7393 is not set +CONFIG_FB_BF54X_LQ043=y +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_LOGO is not set + +# +# Sound +# +# CONFIG_SOUND is not set +CONFIG_AC97_BUS=m + +# +# HID Devices +# +CONFIG_HID=m +# CONFIG_HID_DEBUG is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=m +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_ISP116X_HCD=m +# CONFIG_USB_ISP1362_HCD is not set +CONFIG_USB_ISP1760_HCD=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_BF54x_HCD=m +# CONFIG_USB_MUSB_HDRC is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_AIRPRIME=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP2101=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_FUNSOFT=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_HP4X=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +# CONFIG_USB_SERIAL_OPTION is not set +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_DEBUG=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_FSL_USB2 is not set +CONFIG_USB_GADGET_NET2272=y +CONFIG_USB_NET2272=m +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y + +# +# MMC/SD Host Controller Drivers +# +# CONFIG_SDH_BFIN is not set +# CONFIG_SPI_MMC is not set + +# +# LED devices +# +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=m + +# +# LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_HEARTBEAT=m + +# +# InfiniBand support +# + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# + +# +# Real Time Clock +# +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_BFIN=y + +# +# DMA Engine support +# +CONFIG_DMA_ENGINE=y + +# +# DMA Clients +# +CONFIG_NET_DMA=y + +# +# DMA Devices +# + +# +# PBX support +# +# CONFIG_PBX is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +# CONFIG_EXT2_FS_POSIX_ACL is not set +# CONFIG_EXT2_FS_SECURITY is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_YAFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_JFFS2_CMODE_NONE is not set +CONFIG_JFFS2_CMODE_PRIORITY=y +# CONFIG_JFFS2_CMODE_SIZE is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V2_ACL=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_SUNRPC_BIND34=y +CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_RPCSEC_GSS_SPKM3 is not set +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +CONFIG_CIFS_STATS=y +# CONFIG_CIFS_STATS2 is not set +# CONFIG_CIFS_WEAK_PW_HASH is not set +CONFIG_CIFS_XATTR=y +# CONFIG_CIFS_POSIX is not set +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_EXPERIMENTAL is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Distributed Lock Manager +# +# CONFIG_DLM is not set + +# +# Profiling support +# +# CONFIG_PROFILING is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_KERNEL is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +CONFIG_DEBUG_MMRS=y +CONFIG_DEBUG_HUNT_FOR_ZERO=y +CONFIG_DEBUG_BFIN_HWTRACE_ON=y +CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y +# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set +# CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set +CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0 +# CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set +# CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set +CONFIG_EARLY_PRINTK=y +CONFIG_CPLB_INFO=y +CONFIG_ACCESS_CHECK=y + +# +# Security options +# +# CONFIG_KEYS is not set +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=m +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +# CONFIG_CRYPTO_SHA256 is not set +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_PCBC=m +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_SERPENT is not set +CONFIG_CRYPTO_AES=m +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_ARC4=m +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Hardware crypto devices +# + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=m +# CONFIG_CRC16 is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/linux-bfin_svn.bb b/packages/linux/linux-bfin_svn.bb new file mode 100644 index 0000000000..ee5b04910f --- /dev/null +++ b/packages/linux/linux-bfin_svn.bb @@ -0,0 +1,15 @@ +require linux.inc + +PV = "2.6.22.10+svnr${SRCREV}" + +SRC_URI = "svn://sources.blackfin.uclinux.org/linux-kernel/;module=trunk \ + file://defconfig \ + " + +S = "${WORKDIR}/trunk" + +do_configure_prepend() { + rm localversion.adi || true +} + + diff --git a/packages/linux/linux-handhelds-2.6.inc b/packages/linux/linux-handhelds-2.6.inc index e1c8fbf189..d2256b5f27 100644 --- a/packages/linux/linux-handhelds-2.6.inc +++ b/packages/linux/linux-handhelds-2.6.inc @@ -3,7 +3,7 @@ DESCRIPTION = "handhelds.org Linux kernel 2.6 for PocketPCs and other consumer h LICENSE = "GPL" COMPATIBLE_HOST = "arm.*-linux" -COMPATIBLE_MACHINE ?= '(asus620|asus730|aximx50|aximx50v|h1910|h2200|h3600|h3800|h3900|h4000|h5000|htcalpine|htcapache|htcblueangel|htchermes|htchimalaya|htcsable|htcuniversal|htcwallaby|hx4700|looxc550|jornada56x|magician|rx1950|rx3000)' +COMPATIBLE_MACHINE ?= '(asus620|asus730|aximx50|aximx50v|h1910|h2200|h3600|h3800|h3900|h4000|h5000|htcalpine|htcapache|htcblueangel|htchermes|htchimalaya|htcsable|htcuniversal|htcwallaby|hx4700|ghi270|looxc550|jornada56x|magician|rx1950|rx3000)' # SRC_URI *must* be overriden in includer, but this is a good reference SRC_URI ?= "${HANDHELDS_CVS};module=linux/kernel26;tag=${@'K' + bb.data.getVar('PV',d,1).replace('.', '-')} \ diff --git a/packages/linux/linux-handhelds-2.6/ghi270/.mtn2git_empty b/packages/linux/linux-handhelds-2.6/ghi270/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux-handhelds-2.6/ghi270/.mtn2git_empty diff --git a/packages/linux/linux-handhelds-2.6_2.6.21-hh11.bb b/packages/linux/linux-handhelds-2.6_2.6.21-hh11.bb new file mode 100644 index 0000000000..7e3f93c92e --- /dev/null +++ b/packages/linux/linux-handhelds-2.6_2.6.21-hh11.bb @@ -0,0 +1,13 @@ +SECTION = "kernel" +DESCRIPTION = "handhelds.org Linux kernel 2.6 for PocketPCs and other consumer handheld devices." +LICENSE = "GPL" +PR = "r1" + +DEFAULT_PREFERENCE = "-1" + +SRC_URI = "${HANDHELDS_CVS};module=linux/kernel26;tag=${@'K' + bb.data.getVar('PV',d,1).replace('.', '-')} \ + file://defconfig" + +SRC_URI_append_ghi270 = " file://ghi270-hh11.patch;patch=1" + +require linux-handhelds-2.6.inc diff --git a/packages/linux/linux-openmoko-devel/defconfig-2.6.23-rc9 b/packages/linux/linux-openmoko-devel/defconfig-2.6.23.1 index c2b7151295..2419f90981 100644 --- a/packages/linux/linux-openmoko-devel/defconfig-2.6.23-rc9 +++ b/packages/linux/linux-openmoko-devel/defconfig-2.6.23.1 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.23-rc9 -# Sun Oct 7 15:39:12 2007 +# Tue Oct 9 15:27:11 2007 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -199,6 +199,7 @@ CONFIG_ARCH_S3C2440=y CONFIG_SMDK2440_CPU2440=y CONFIG_MACH_HXD8=y CONFIG_MACH_NEO1973_GTA02=y +CONFIG_CPU_S3C2442=y # # S3C2442 Machines @@ -1735,8 +1736,8 @@ CONFIG_FORCED_INLINING=y CONFIG_DEBUG_ERRORS=y CONFIG_DEBUG_LL=y # CONFIG_DEBUG_ICEDCC is not set -# CONFIG_DEBUG_S3C_PORT is not set -CONFIG_DEBUG_S3C_UART=0 +CONFIG_DEBUG_S3C_PORT=y +CONFIG_DEBUG_S3C_UART=2 # # Security options diff --git a/packages/linux/linux-openmoko-devel/hack-gta02-cpu.patch b/packages/linux/linux-openmoko-devel/hack-gta02-cpu.patch new file mode 100644 index 0000000000..ef4e939640 --- /dev/null +++ b/packages/linux/linux-openmoko-devel/hack-gta02-cpu.patch @@ -0,0 +1,21 @@ +Index: linux-2.6.22/arch/arm/mach-s3c2440/Kconfig +=================================================================== +--- linux-2.6.22.orig/arch/arm/mach-s3c2440/Kconfig ++++ linux-2.6.22/arch/arm/mach-s3c2440/Kconfig +@@ -69,14 +69,14 @@ + + config MACH_HXD8 + bool "FIC HXD8" +- select CPU_S3C2440 ++ select CPU_S3C2442 + select SENSORS_PCF50606 + help + Say Y here if you are using the FIC Neo1973 GSM Phone + + config MACH_NEO1973_GTA02 + bool "FIC Neo1973 GSM Phone (GTA02 Hardware)" +- select CPU_S3C2440 ++ select CPU_S3C2442 + select SENSORS_PCF50633 + help + Say Y here if you are using the FIC Neo1973 GSM Phone diff --git a/packages/linux/linux-openmoko-devel/printascii-2.6.23.patch b/packages/linux/linux-openmoko-devel/printascii-2.6.23.patch new file mode 100644 index 0000000000..4818ac6bfc --- /dev/null +++ b/packages/linux/linux-openmoko-devel/printascii-2.6.23.patch @@ -0,0 +1,21 @@ +Index: linux-2.6.22/kernel/printk.c +=================================================================== +--- linux-2.6.22.orig/kernel/printk.c ++++ linux-2.6.22/kernel/printk.c +@@ -519,6 +519,8 @@ + /* cpu currently holding logbuf_lock */ + static volatile unsigned int printk_cpu = UINT_MAX; + ++extern void printascii(const char *); ++ + asmlinkage int vprintk(const char *fmt, va_list args) + { + unsigned long flags; +@@ -541,6 +543,7 @@ + + /* Emit the output into the temporary buffer */ + printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args); ++ printascii(printk_buf); + + /* + * Copy the output into log_buf. If the caller didn't provide diff --git a/packages/linux/linux-openmoko-devel_svn+2.6.23-rc9.bb b/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb index 004a3db9c7..e1686eada9 100644 --- a/packages/linux/linux-openmoko-devel_svn+2.6.23-rc9.bb +++ b/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb @@ -1,11 +1,16 @@ require linux.inc DESCRIPTION = "Linux 2.6.x (development) kernel for FIC SmartPhones shipping w/ OpenMoko" -VANILLA_VERSION = "2.6.22" -KERNEL_VERSION = "2.6.23-rc9" -KERNEL_RELEASE = "2.6.23-rc9" -PV = "${VANILLA_VERSION}+${KERNEL_RELEASE}-moko11+svnr${SRCREV}" -PR = "r3" +VANILLA_VERSION = "2.6.23" +#KERNEL_VERSION = "2.6.23-rc9" +KERNEL_RELEASE = "2.6.23.1" + +# If you use a rc, you will need to use this: +#PV = "${VANILLA_VERSION}+${KERNEL_RELEASE}-moko11+svnr${SRCREV}" + +KERNEL_VERSION = "${KERNEL_RELEASE}" +PV = "${KERNEL_RELEASE}+svnr${SRCREV}" +PR = "r1" KERNEL_IMAGETYPE = "uImage" UBOOT_ENTRYPOINT = "30008000" @@ -14,15 +19,16 @@ UBOOT_ENTRYPOINT = "30008000" # source and patches # SRCREV_FORMAT = "patches" -SRCREV = "3101" +SRCREV = "3140" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${VANILLA_VERSION}.tar.bz2 \ - ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/testing/patch-${KERNEL_VERSION}.bz2 \ + ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${KERNEL_VERSION}.bz2;patch=1 \ svn://svn.openmoko.org/branches/src/target/kernel/2.6.23.x;module=patches;proto=http;name=patches \ file://squashfs-2.6.23.patch;patch=1 \ file://fix-EVIOCGRAB-semantics-2.6.22.5.patch;patch=1 \ -# file://printascii.patch;patch=1 \ - file://defconfig-2.6.23-rc9 \ +# file://printascii-2.6.23.patch;patch=1 \ + file://hack-gta02-cpu.patch;patch=1 \ + file://defconfig-2.6.23.1 \ file://logo_linux_clut224.ppm" S = "${WORKDIR}/linux-${VANILLA_VERSION}" @@ -51,7 +57,6 @@ module_autoload_snd-soc-neo1973-wm8753 = "snd-soc-neo1973-wm8753" module_autoload_s3cmci = "s3cmci" do_prepatch() { - cd ${S} && patch -p1 < ${WORKDIR}/patch-${KERNEL_VERSION} mv ${WORKDIR}/patches ${S}/patches && cd ${S} && quilt push -av mv patches patches.openmoko mv .pc .pc.old diff --git a/packages/linux/linux-openmoko.inc b/packages/linux/linux-openmoko.inc index d6b464c301..e6e41cfc08 100644 --- a/packages/linux/linux-openmoko.inc +++ b/packages/linux/linux-openmoko.inc @@ -83,13 +83,13 @@ do_configure() { # do_deploy() { install -d ${DEPLOY_DIR_IMAGE} - install -m 0644 arch/${ARCH}/boot/${KERNEL_IMAGETYPE} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${PV}-${PR}-${MACHINE}.bin - tar -cvzf ${DEPLOY_DIR_IMAGE}/modules-${KERNEL_RELEASE}-${PR}-${MACHINE}.tgz -C ${D} lib + install -m 0644 arch/${ARCH}/boot/${KERNEL_IMAGETYPE} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${PV}-${PR}-${MACHINE_CLASS}.bin + tar -cvzf ${DEPLOY_DIR_IMAGE}/modules-${KERNEL_RELEASE}-${PR}-${MACHINE_CLASS}.tgz -C ${D} lib ${OBJCOPY} -O binary -R .note -R .comment -S vmlinux linux.bin rm -f linux.bin.gz gzip -9 linux.bin - ${STAGING_BINDIR_NATIVE}/uboot-mkimage -A arm -O linux -T kernel -C gzip -a 30008000 -e 30008000 -n "OpenMoko Kernel Image Neo1973(GTA01)" -d linux.bin.gz ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE}.bin - ln -sf ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE}.bin ${DEPLOY_DIR_IMAGE}/uImage-${MACHINE}-latest.bin + ${STAGING_BINDIR_NATIVE}/uboot-mkimage -A arm -O linux -T kernel -C gzip -a 30008000 -e 30008000 -n "OpenMoko Kernel Image Neo1973(GTA01/2)" -d linux.bin.gz ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE_CLASS}.bin + ln -sf ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE_CLASS}.bin ${DEPLOY_DIR_IMAGE}/uImage-${MACHINE_CLASS}-latest.bin rm -f linux.bin.gz } diff --git a/packages/linux/linux.inc b/packages/linux/linux.inc index 2c267fb7eb..6568049113 100644 --- a/packages/linux/linux.inc +++ b/packages/linux/linux.inc @@ -106,6 +106,10 @@ do_install_prepend() { if test -e arch/${ARCH}/boot/images/uImage ; then ln -f arch/${ARCH}/boot/images/uImage arch/${ARCH}/boot/uImage fi + + if test -e arch/${ARCH}/kernel/vmlinux.lds ; then + ln -f arch/${ARCH}/kernel/vmlinux.lds arch/${ARCH}/boot/vmlinux + fi } UBOOT_ENTRYPOINT ?= "20008000" diff --git a/packages/linux/linux_2.6.22.bb b/packages/linux/linux_2.6.22.bb index a3694156d6..03d945adbf 100644 --- a/packages/linux/linux_2.6.22.bb +++ b/packages/linux/linux_2.6.22.bb @@ -3,8 +3,9 @@ require linux.inc # Mark archs/machines that this kernel supports DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_cm-x270 = "-1" +DEFAULT_PREFERENCE_bd-neon = "0" -PR = "r3" +PR = "r4" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.22.tar.bz2 \ file://defconfig \ @@ -24,6 +25,8 @@ CMDLINE_cm-x270 = "console=${CMX270_CONSOLE_SERIAL_PORT},38400 monitor=8 bpp=16 FILES_kernel-image_cm-x270 = "" +SRC_URI_append_bd-neon = " http://www.boundarydevices.com/boundary-2.6.22-2007-07-22.patch.bz2;patch=1" + python do_compulab_image() { import os import os.path diff --git a/packages/mathomatic/mathomatic_unstable.bb b/packages/mathomatic/mathomatic_unstable.bb index 9e327680b2..e717866b4e 100644 --- a/packages/mathomatic/mathomatic_unstable.bb +++ b/packages/mathomatic/mathomatic_unstable.bb @@ -2,3 +2,6 @@ require mathomatic.inc SRC_URI = "http://www.panix.com/~gesslein/am.tgz" S = "${WORKDIR}/mathomatic-12.4.2" + +# source snapshot changes every day +BROKEN = "1" diff --git a/packages/meta/foonas-packages.bb b/packages/meta/foonas-packages.bb index edadb63a1c..2bd8437f13 100644 --- a/packages/meta/foonas-packages.bb +++ b/packages/meta/foonas-packages.bb @@ -1,6 +1,6 @@ DESCRIPTION = "Packages that are compatible with FooNAS" LICENSE = "MIT" -PR = "r1" +PR = "r2" CONFLICTS = "db3" PROVIDES += "${FOONAS_IMAGENAME}-packages" @@ -8,6 +8,8 @@ EXCLUDE_FROM_WORLD = "1" INHIBIT_DEFAULT_DEPS = "1" ALLOW_EMPTY = "1" +inherit meta + FOONAS_PACKAGES = "\ adns \ alsa-lib \ diff --git a/packages/meta/meta-toolchain-openmoko.bb b/packages/meta/meta-toolchain-openmoko.bb new file mode 100644 index 0000000000..4e29180d28 --- /dev/null +++ b/packages/meta/meta-toolchain-openmoko.bb @@ -0,0 +1,5 @@ +TOOLCHAIN_TARGET_TASK = "task-toolchain-openmoko-sdk" +RDEPENDS = "${TOOLCHAIN_TARGET_TASK}" + +require meta-toolchain.bb + diff --git a/packages/meta/meta-toolchain.bb b/packages/meta/meta-toolchain.bb index a734005819..58a5fb622b 100644 --- a/packages/meta/meta-toolchain.bb +++ b/packages/meta/meta-toolchain.bb @@ -100,6 +100,9 @@ do_populate_sdk() { done done + # add missing link to libgcc_s.so.1 + # libgcc-dev should be responsible for that, but it's not getting built + ln -sf libgcc_s.so.1 ${SDK_OUTPUT}/${prefix}/${TARGET_SYS}/lib/libgcc_s.so # remove unwanted executables rm -rf ${SDK_OUTPUT}/${prefix}/sbin ${SDK_OUTPUT}/${prefix}/etc @@ -108,17 +111,20 @@ do_populate_sdk() { rm -f ${SDK_OUTPUT}/${prefix}/${TARGET_SYS}/lib/*.la # fix pkgconfig data files - cd ${SDK_OUTPUT}/${prefix}/${TARGET_SYS}/lib/pkgconfig - for f in *.pc ; do - sed -i 's%=/usr%=${prefix}/${TARGET_SYS}%g' "$f" - done - for f in *.pc ; do - sed -i 's%${STAGING_DIR}%/usr/local/${TARGET_ARCH}/oe%g' "$f" - done - - mkdir -p ${SDK_DEPLOY} + if [ -e ${SDK_OUTPUT}/${prefix}/${TARGET_SYS}/lib/pkgconfig ]; then + cd ${SDK_OUTPUT}/${prefix}/${TARGET_SYS}/lib/pkgconfig + for f in *.pc ; do + sed -i 's%=/usr%=${prefix}/${TARGET_SYS}%g' "$f" + done + for f in *.pc ; do + sed -i 's%${STAGING_DIR}%/usr/local/${TARGET_ARCH}/oe%g' "$f" + done + fi + + # package it up + mkdir -p ${SDK_DEPLOY} cd ${SDK_OUTPUT} - fakeroot tar cfj ${SDK_DEPLOY}/${DISTRO}-${DISTRO_VERSION}-${TARGET_ARCH}-toolchain.tar.bz2 . + fakeroot tar cfj ${SDK_DEPLOY}/${DISTRO}-${DISTRO_VERSION}-${TARGET_ARCH}-${TARGET_OS}-toolchain.tar.bz2 . } do_populate_sdk[nostamp] = "1" diff --git a/packages/meta/openprotium-packages.bb b/packages/meta/openprotium-packages.bb index 9a1d928a77..afff86639a 100644 --- a/packages/meta/openprotium-packages.bb +++ b/packages/meta/openprotium-packages.bb @@ -5,7 +5,7 @@ DESCRIPTION = "Packages that are compatible with the Openprotium on the iomega Storcenter" HOMEPAGE = "http://www.openprotium.org" LICENSE = "MIT" -PR = "r2" +PR = "r3" CONFLICTS = "db3" PROVIDES += "${OPENPROTIUM_IMAGENAME}-packages" @@ -13,6 +13,8 @@ EXCLUDE_FROM_WORLD = "1" INHIBIT_DEFAULT_DEPS = "1" ALLOW_EMPTY = "1" +inherit meta + # The list of packages to build for the slugos DISTRO. # KEEP IN ALPHABETICAL ORDER # Do *not* simply comment out a line. That will break. Instead diff --git a/packages/meta/slugos-native-packages.bb b/packages/meta/slugos-native-packages.bb index 4505c9979c..1e60e8c8af 100644 --- a/packages/meta/slugos-native-packages.bb +++ b/packages/meta/slugos-native-packages.bb @@ -1,13 +1,15 @@ # Only list packages which will not build 'cross' in here. DESCRIPTION = "Packages that are to be compiled natively for the SlugOS firmware" LICENSE = "MIT" -PR = "r1" +PR = "r2" INHIBIT_DEFAULT_DEPS = "1" EXCLUDE_FROM_WORLD = "1" ALLOW_EMPTY = "1" PACKAGES = "${PN}" +inherit meta + SLUGOS_NATIVE_PACKAGES = "\ apache \ php-native \ diff --git a/packages/meta/slugos-native.bb b/packages/meta/slugos-native.bb index 281310a2dd..9dae7e8df3 100644 --- a/packages/meta/slugos-native.bb +++ b/packages/meta/slugos-native.bb @@ -5,13 +5,18 @@ # DESCRIPTION = "Packages that are required for the SlugOS native build environment" LICENSE = "MIT" -PR = "r5" +PR = "r7" INHIBIT_DEFAULT_DEPS = "1" EXCLUDE_FROM_WORLD = "1" ALLOW_EMPTY = "1" PACKAGES = "${PN}" +inherit meta + +do_package_write_ipk() { +} + # Run-time only (RDEPENDS) stuff - no package explicitly provides # these targets. SLUGOS_NATIVE_RT_prepend_linux = "\ diff --git a/packages/meta/slugos-packages.bb b/packages/meta/slugos-packages.bb index 6b34fc187a..7960be85eb 100644 --- a/packages/meta/slugos-packages.bb +++ b/packages/meta/slugos-packages.bb @@ -5,7 +5,7 @@ DESCRIPTION = "Packages that are compatible with the SlugOS firmware" HOMEPAGE = "http://www.nslu2-linux.org" LICENSE = "MIT" -PR = "r36" +PR = "r40" CONFLICTS = "db3" COMPATIBLE_MACHINE = "nslu2" @@ -49,6 +49,9 @@ SLUGOS_PACKAGES = "\ coreutils \ cron \ ctorrent \ + ctrlproxy \ + cups \ + curl \ cvs \ cyrus-imapd \ cyrus-sasl \ @@ -79,6 +82,7 @@ SLUGOS_PACKAGES = "\ gdbm \ glib-2.0 \ gnu-config \ + gphoto2 \ grep \ groff \ gspcav1 \ @@ -114,6 +118,7 @@ SLUGOS_PACKAGES = "\ libxml2 \ linphone \ litestream \ + logrotate \ lrzsz \ lsof \ lvm2 \ @@ -144,7 +149,6 @@ SLUGOS_PACKAGES = "\ net-tools \ netcat \ netpbm \ - nfs-utils \ nmap \ ntfs-3g \ ntp \ @@ -173,6 +177,7 @@ SLUGOS_PACKAGES = "\ rng-tools \ rsync \ samba \ + sane-backends \ screen \ sed \ setpwc \ @@ -186,7 +191,6 @@ SLUGOS_PACKAGES = "\ sudo \ sysfsutils \ tar \ - task-mokogateway-everything \ thttpd \ tiff \ timezones \ @@ -207,7 +211,9 @@ SLUGOS_PACKAGES = "\ wireless-tools \ wireshark \ wpa-supplicant \ - wview-sim wview-vpro wview-wxt510 \ + wview-sim wview-sim-mysql \ + wview-vpro wview-vpro-mysql \ + wview-wxt510 wview-wxt510-mysql \ xinetd \ yeaphone \ yp-tools ypbind ypserv \ @@ -219,23 +225,19 @@ SLUGOS_PACKAGES = "\ # Packages currently broken on all platforms SLUGOS_BROKEN_PACKAGES = "\ bwmon \ - ctrlproxy \ dsniff \ fetchmail \ - libgphoto2 gphoto2 sane-backends \\ lirc-modules lirc \ - logrotate \ madfu \ + portmap nfs-utils \ openldap \ pvrusb2-mci \ pwc \ qc-usb-messenger \ syslog-ng \ + openocd task-mokogateway-everything \ task-native-sdk \ - unionfs-modules \ - unionfs-utils \ - wview-sim-mysql wview-vpro-mysql \ - wview-wxt510-mysql \ + unionfs-modules unionfs-utils \ zd1211 \ " @@ -250,3 +252,8 @@ DEPENDS = "\ ${SLUGOS_EXTRA_PACKAGES} \ package-index \ " + +inherit meta + +do_package_write_ipk() { +} diff --git a/packages/meta/unslung-binary-kernel-packages.bb b/packages/meta/unslung-binary-kernel-packages.bb index 30fb513627..eb95b847fd 100644 --- a/packages/meta/unslung-binary-kernel-packages.bb +++ b/packages/meta/unslung-binary-kernel-packages.bb @@ -1,11 +1,13 @@ DESCRIPTION = "Packages that are compatible with the Unslung binary kernel firmware" LICENSE = "MIT" -PR = "r1" +PR = "r2" COMPATIBLE_MACHINE = "nslu2" ALLOW_EMPTY = "1" PACKAGES = "${PN}" +inherit meta + UNSLUNG_PACKAGES = "\ " diff --git a/packages/meta/unslung-packages.bb b/packages/meta/unslung-packages.bb index 707787224e..ca194979e7 100644 --- a/packages/meta/unslung-packages.bb +++ b/packages/meta/unslung-packages.bb @@ -1,11 +1,13 @@ DESCRIPTION = "Packages that are compatible with the Unslung firmware" LICENSE = "MIT" -PR = "r4" +PR = "r5" COMPATIBLE_MACHINE = "nslu2" ALLOW_EMPTY = "1" PACKAGES = "${PN}" +inherit meta + UNSLUNG_PACKAGES = "\ " diff --git a/packages/mono/README b/packages/mono/README index c3043faee3..eb2fed051f 100644 --- a/packages/mono/README +++ b/packages/mono/README @@ -23,17 +23,11 @@ then proceeds to overlay the native binaries in the install directory. ================================ mono.bbclass -Has a helper function for the list that maps file patterns to package -names and assemblies (see below). Also has a function mono_do_clilibs -and inserts that function into PACKAGEFUNCS. This function calls -mono_find_provides_and_requires which finds out (through calls to -monodis --assembly and monodis --assemblyref) which assemblies are +Has a function mono_do_clilibs and inserts that function into PACKAGEFUNCS. +This function calls mono_find_provides_and_requires which finds out (through +calls to monodis --assembly and monodis --assemblyref) which assemblies are provided and required by a particular package. mono_do_clilibs then puts the information about provided assemblies into ${STAGING_DIR}/clilibs/${packagename}.list and information about the required packages into ${PKGDEST}/{packagename}.clilibdeps where it -will later be picked up by the modified read_shlibdeps. - - - - +will later be picked up by read_shlibdeps. diff --git a/packages/mono/collect-paths.py b/packages/mono/collect-paths.py deleted file mode 100644 index a49b76e5aa..0000000000 --- a/packages/mono/collect-paths.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python - -## This utility takes the debian directory from an unpacked debian mono source tree -## (e.g. apt-get source mono), parses the *.install files and generates python source -## for a list of dictionaries that describe the individual packages and their contents -## The output will look like -##debian_mono_file_table = [ -## { 'name': 'libmono-peapi1.0-cil', -## 'patterns': [ -## '/usr/lib/mono/gac/PEAPI/1.0.*/', -## '/usr/lib/mono/1.0/PEAPI.dll' -## ], -## 'assemblies': [ -## ('PEAPI', '1.0.*') -## ] -## }, -## { 'name': 'mono-mjs', -## 'patterns': [ -## '/usr/bin/mjs', -## '/usr/lib/mono/1.0/mjs.exe*' -## ] -## }, -##.... - - -import os, sys, re - -def collect_paths(dir): - paths = {} - - os.chdir(dir) - for filename in os.listdir("."): - if filename.endswith(".install"): - fp = file(filename, "r") - lines = fp.readlines() - fp.close() - - contents = [] - for line in lines: - lineparts = line.strip().split() - if lineparts[0].startswith("debian/tmp"): - pattern = lineparts[0][ len("debian/tmp"): ] - if len(lineparts) == 2: - if not pattern.startswith(lineparts[1]): - print >>sys.stderr, "Warning: Apparently I don't fully understand the format in file %s" % filename - elif len(lineparts) > 2: - print >>sys.stderr, "Warning: Apparently I don't fully understand the format in file %s" % filename - - contents.append( pattern ) - else: - print >>sys.stderr, "Note: Ignoring %s in %s" % (lineparts, filename) - - paths[ filename[ :-len(".install") ] ] = contents - - return paths - -def collect_packages(paths): - gac_re = re.compile(r'/usr/lib/mono/gac/(?P<assembly>[^/]+)/(?P<version>[^/]+)/?') - - # These packages should be populated first (e.g. because their files will otherwise end up - # in other packages) - PACKAGES_FIRST = ("mono-jit", "mono-gac", "mono-mjs", "mono-gmcs", "mono-utils", "mono-doc") - # These should be populated last (because their spec is very broad) - PACKAGES_LAST = ("mono-mcs", "libmono-system1.0-cil", "libmono-system2.0-cil", "libmono1.0-cil", "libmono2.0-cil") - first = [] - last = [] - packages = paths.keys() - for packagename in PACKAGES_FIRST + PACKAGES_LAST: - if packagename in packages: - packages.remove(packagename) - if packagename in PACKAGES_FIRST: - first.append(packagename) - else: - last.append(packagename) - packagenames = first + packages + last - - packages = [] - for name in packagenames: - patterns = paths[ name ] - package = { "name": name, - "patterns": patterns} - - provided_assemblies = [] - for pattern in patterns: - match = gac_re.match(pattern) - if match: - provided_assemblies.append( (match.group("assembly"), match.group("version")) ) - if pattern == "/usr/lib/mono/1.0/mscorlib.dll*": - provided_assemblies.append( ("mscorlib", "1.0.*" ) ) - elif pattern == "/usr/lib/mono/2.0/mscorlib.dll*": - provided_assemblies.append( ("mscorlib", "2.0.*" ) ) - - if len(provided_assemblies) > 0: - package["assemblies"] = provided_assemblies - - packages.append(package) - - return packages - -if __name__ == "__main__": - packages = collect_packages( collect_paths(".") ) - - if False: # Human-friendly - for package in packages: - print "Package: %s" % package["name"] - if package.has_key("provided_assemblies"): - print "Provides: \t%s" % ( "\n\t\t".join( [" ".join(e) for e in package["assemblies"] ] ) ) - print "Patterns: \t\t%s" % ( "\n\t\t\t".join(package["patterns"]) ) - print - else: - print "# This is a generated file, please do not edit directly" - print "# Use collect-paths.py instead. -- Henryk <henryk@openmoko.org>" - print "debian_mono_file_table = [" - print ",\n".join( - [ - "\t{\t%s\n\t}" % ",\n\t\t".join( - [ - "%r: %r" % (key, value) - for key, value in package.items() - if not isinstance(value, (list,tuple)) - ] + [ - "%r: [\n\t\t\t\t%s\n\t\t\t]" % (key, ",\n\t\t\t\t".join( [ - "%r"%(e,) for e in value - ]) - ) - for key, value in package.items() - if isinstance(value, (list,tuple)) - ] - - ) - for package in packages - ] - ) - print "]" - diff --git a/packages/mono/files/configure-svnr87352.patch b/packages/mono/files/configure-svnr87352.patch new file mode 100644 index 0000000000..021554f35e --- /dev/null +++ b/packages/mono/files/configure-svnr87352.patch @@ -0,0 +1,21 @@ +--- mono/configure.in.orig 2007-10-11 21:05:59.000000000 +0200 ++++ mono/configure.in 2007-10-11 23:44:23.000000000 +0200 +@@ -1148,6 +1148,8 @@ + ], [ + AC_MSG_RESULT(no) + with_tls=pthread ++ ], [ ++ AC_MSG_RESULT(yes) + ]) + fi + +@@ -1250,6 +1252,9 @@ + ], [ + with_sigaltstack=no + AC_MSG_RESULT(no) ++ ], [ ++ AC_MSG_RESULT(yes) ++ AC_DEFINE(HAVE_WORKING_SIGALTSTACK) + ]) + fi + diff --git a/packages/mono/mono-mcs-intermediate.inc b/packages/mono/mono-mcs-intermediate.inc new file mode 100644 index 0000000000..db74b96ee3 --- /dev/null +++ b/packages/mono/mono-mcs-intermediate.inc @@ -0,0 +1,60 @@ +# This is a straw-man recipe for step 1 in the two-step build of +# mono. Because it's impossible to build the mcs directory +# in cross-compile mode, this recipe will do a native build, +# then tar the resulting install tree for usage by the mono +# package in step 2. +# See http://www.mono-project.com/Mono:ARM + +PR = "r0" +DEPENDS = "mono-native glib-2.0-native perl-native" + +PARALLEL_MAKE = "" + +SRC_URI += "file://mono-fix-libdir-path.patch;patch=1" + +# Inherit native to set up compiler and paths ... +inherit native +# ... but override the target prefix +prefix = "/usr" +exec_prefix = "/usr" +sysconfdir = "/etc" +# TODO: Where does the mono package get +# these paths from? Use the same source. + +do_fix_libtool_name() { + # inherit native will make that all native tools that are being + # built are prefixed with something like "i686-linux-", + # including libtool. Fix up some hardcoded libtool names: + for i in "${S}"/runtime/*-wrapper.in; do + sed -e "s/libtool/${BUILD_SYS}-libtool/" -i "${i}" + done +} +addtask fix_libtool_name after do_patch before do_configure + +do_stage() { + true +} + +do_install() { + oe_runmake 'DESTDIR=${D}' install +} + +do_package() { + true +} + +do_populate_staging() { + cd ${D} + rm -f ${WORKDIR}/mono-mcs-${PV}.tar.gz + tar -cvzf ${WORKDIR}/mono-mcs-${PV}.tar.gz . + install -d ${STAGING_DIR}/share/mono-mcs + cp ${WORKDIR}/mono-mcs-${PV}.tar.gz ${STAGING_DIR}/share/mono-mcs/ +} + +do_package_write_ipk() { + true +} + +do_package_write() { + true +} diff --git a/packages/mono/mono-mcs-intermediate_1.2.5.1.bb b/packages/mono/mono-mcs-intermediate_1.2.5.1.bb index 813da24ddf..f2dbe048d7 100644 --- a/packages/mono/mono-mcs-intermediate_1.2.5.1.bb +++ b/packages/mono/mono-mcs-intermediate_1.2.5.1.bb @@ -6,56 +6,4 @@ # See http://www.mono-project.com/Mono:ARM require mono_1.2.5.inc -PR = "r0" -DEPENDS = "mono-native glib-2.0-native perl-native" - -PARALLEL_MAKE = "" - -SRC_URI += "file://mono-fix-libdir-path.patch;patch=1" - -# Inherit native to set up compiler and paths ... -inherit native -# ... but override the target prefix -prefix = "/usr" -exec_prefix = "/usr" -sysconfdir = "/etc" -# TODO: Where does the mono package get -# these paths from? Use the same source. - -do_fix_libtool_name() { - # inherit native will make that all native tools that are being - # built are prefixed with something like "i686-linux-", - # including libtool. Fix up some hardcoded libtool names: - for i in "${S}"/runtime/*-wrapper.in; do - sed -e "s/libtool/${BUILD_SYS}-libtool/" -i "${i}" - done -} -addtask fix_libtool_name after do_patch before do_configure - -do_stage() { - true -} - -do_install() { - oe_runmake 'DESTDIR=${D}' install -} - -do_package() { - true -} - -do_populate_staging() { - cd ${D} - rm -f ${WORKDIR}/mono-mcs-${PV}.tar.gz - tar -cvzf ${WORKDIR}/mono-mcs-${PV}.tar.gz . - install -d ${STAGING_DIR}/share/mono-mcs - cp ${WORKDIR}/mono-mcs-${PV}.tar.gz ${STAGING_DIR}/share/mono-mcs/ -} - -do_package_write_ipk() { - true -} - -do_package_write() { - true -} +require mono-mcs-intermediate.inc diff --git a/packages/mono/mono-mcs-intermediate_svn.bb b/packages/mono/mono-mcs-intermediate_svn.bb new file mode 100644 index 0000000000..f5dbedd612 --- /dev/null +++ b/packages/mono/mono-mcs-intermediate_svn.bb @@ -0,0 +1,12 @@ +# This is a straw-man recipe for step 1 in the two-step build of +# mono. Because it's impossible to build the mcs directory +# in cross-compile mode, this recipe will do a native build, +# then tar the resulting install tree for usage by the mono +# package in step 2. +# See http://www.mono-project.com/Mono:ARM + +require mono_svn.inc +require mono-mcs-intermediate.inc + +DEFAULT_PREFERENCE = "-1" +EXTRA_OECONF_append = " --without-tls " diff --git a/packages/mono/mono_files.py b/packages/mono/mono_files.py deleted file mode 100644 index 6e673743c3..0000000000 --- a/packages/mono/mono_files.py +++ /dev/null @@ -1,605 +0,0 @@ -# This is a generated file, please do not edit directly -# Use collect-paths.py instead. -- Henryk <henryk@openmoko.org> -debian_mono_file_table = [ - { 'name': 'mono-jit', - 'patterns': [ - '/usr/bin/mono' - ] - }, - { 'name': 'mono-gac', - 'patterns': [ - '/usr/bin/gacutil', - '/usr/lib/mono/1.0/gacutil.exe' - ] - }, - { 'name': 'mono-mjs', - 'patterns': [ - '/usr/bin/mjs', - '/usr/lib/mono/1.0/mjs.exe*' - ] - }, - { 'name': 'mono-gmcs', - 'patterns': [ - '/usr/bin/gmcs', - '/usr/bin/wsdl2', - '/usr/bin/monop2', - '/usr/bin/ilasm2', - '/usr/bin/resgen2', - '/usr/bin/mono-api-info2', - '/usr/bin/mono-service2', - '/usr/bin/mkbundle2', - '/usr/bin/xbuild', - '/usr/bin/sgen', - '/usr/bin/al2', - '/usr/bin/httpcfg', - '/usr/lib/mono/2.0/*.exe*', - '/usr/lib/mono/2.0/xbuild.rsp', - '/usr/lib/mono/2.0/MSBuild/', - '/usr/lib/mono/2.0/Microsoft.Build.xsd', - '/usr/lib/mono/2.0/Microsoft.CSharp.targets', - '/usr/lib/mono/2.0/Microsoft.Common.tasks', - '/usr/lib/mono/2.0/Microsoft.Common.targets', - '/usr/lib/mono/2.0/Microsoft.VisualBasic.targets' - ] - }, - { 'name': 'mono-utils', - 'patterns': [ - '/usr/bin/pedump', - '/usr/bin/monodis', - '/usr/bin/monograph', - '/usr/bin/mono-find-provides', - '/usr/bin/mono-find-requires' - ] - }, - { 'name': 'libmono-peapi1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/PEAPI/1.0.*/', - '/usr/lib/mono/1.0/PEAPI.dll' - ], - 'assemblies': [ - ('PEAPI', '1.0.*') - ] - }, - { 'name': 'libmono-cairo1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Cairo/1.0.*/', - '/usr/lib/mono/1.0/Mono.Cairo.dll', - '/usr/lib/pkgconfig/mono-cairo.pc' - ], - 'assemblies': [ - ('Mono.Cairo', '1.0.*') - ] - }, - { 'name': 'libmono-system-web2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Web/2.0.*/', - '/usr/lib/mono/gac/System.Web.Services/2.0.*/', - '/usr/lib/mono/2.0/System.Web.dll', - '/usr/lib/mono/2.0/System.Web.Services.dll' - ], - 'assemblies': [ - ('System.Web', '2.0.*'), - ('System.Web.Services', '2.0.*') - ] - }, - { 'name': 'libmono-accessibility2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Accessibility/2.0.*/', - '/usr/lib/mono/2.0/Accessibility.dll' - ], - 'assemblies': [ - ('Accessibility', '2.0.*') - ] - }, - { 'name': 'libmono-microsoft7.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Microsoft.JScript/7.0.*/', - '/usr/lib/mono/gac/Microsoft.VisualC/7.0.*/', - '/usr/lib/mono/gac/Microsoft.Vsa/7.0.*/', - '/usr/lib/mono/1.0/Microsoft.JScript.dll', - '/usr/lib/mono/1.0/Microsoft.VisualC.dll', - '/usr/lib/mono/1.0/Microsoft.Vsa.dll' - ], - 'assemblies': [ - ('Microsoft.JScript', '7.0.*'), - ('Microsoft.VisualC', '7.0.*'), - ('Microsoft.Vsa', '7.0.*') - ] - }, - { 'name': 'libmono-winforms2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Windows.Forms/2.0.*/', - '/usr/lib/mono/gac/System.Drawing.Design/2.0.*/', - '/usr/lib/mono/gac/System.Design/2.0.*/', - '/usr/lib/mono/2.0/System.Windows.Forms.dll', - '/usr/lib/mono/2.0/System.Drawing.Design.dll', - '/usr/lib/mono/2.0/System.Design.dll' - ], - 'assemblies': [ - ('System.Windows.Forms', '2.0.*'), - ('System.Drawing.Design', '2.0.*'), - ('System.Design', '2.0.*') - ] - }, - { 'name': 'libmono-ldap1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Novell.Directory.Ldap/1.0.*/', - '/usr/lib/mono/1.0/Novell.Directory.Ldap.dll' - ], - 'assemblies': [ - ('Novell.Directory.Ldap', '1.0.*') - ] - }, - { 'name': 'libmono-sharpzip2.84-cil', - 'patterns': [ - '/usr/lib/mono/gac/ICSharpCode.SharpZipLib/2.84.*/', - '/usr/lib/mono/2.0/ICSharpCode.SharpZipLib.dll' - ], - 'assemblies': [ - ('ICSharpCode.SharpZipLib', '2.84.*') - ] - }, - { 'name': 'libmono-system-data2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Data/2.0.*/', - '/usr/lib/mono/2.0/System.Data.dll' - ], - 'assemblies': [ - ('System.Data', '2.0.*') - ] - }, - { 'name': 'libmono-corlib2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/I18N*/2.0.*/', - '/usr/lib/mono/2.0/I18N*.dll', - '/usr/lib/mono/2.0/mscorlib.dll*' - ], - 'assemblies': [ - ('I18N*', '2.0.*'), - ('mscorlib', '2.0.*') - ] - }, - { 'name': 'libmono-winforms1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Windows.Forms/1.0.*/', - '/usr/lib/mono/gac/System.Drawing.Design/1.0.*/', - '/usr/lib/mono/gac/System.Design/1.0.*/', - '/usr/lib/mono/1.0/System.Windows.Forms.dll', - '/usr/lib/mono/1.0/System.Drawing.Design.dll', - '/usr/lib/mono/1.0/System.Design.dll' - ], - 'assemblies': [ - ('System.Windows.Forms', '1.0.*'), - ('System.Drawing.Design', '1.0.*'), - ('System.Design', '1.0.*') - ] - }, - { 'name': 'libmono-microsoft8.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Microsoft.JScript/8.0.*/', - '/usr/lib/mono/gac/Microsoft.VisualC/8.0.*/', - '/usr/lib/mono/gac/Microsoft.Vsa/8.0.*/', - '/usr/lib/mono/2.0/Microsoft.JScript.dll', - '/usr/lib/mono/2.0/Microsoft.VisualC.dll', - '/usr/lib/mono/2.0/Microsoft.Vsa.dll' - ], - 'assemblies': [ - ('Microsoft.JScript', '8.0.*'), - ('Microsoft.VisualC', '8.0.*'), - ('Microsoft.Vsa', '8.0.*') - ] - }, - { 'name': 'libmono-corlib1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/I18N*/1.0.*/', - '/usr/lib/mono/1.0/I18N*.dll', - '/usr/lib/mono/1.0/mscorlib.dll*' - ], - 'assemblies': [ - ('I18N*', '1.0.*'), - ('mscorlib', '1.0.*') - ] - }, - { 'name': 'libmono-system-web1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Web/1.0.*/', - '/usr/lib/mono/gac/System.Web.Services/1.0.*/', - '/usr/lib/mono/1.0/System.Web.dll', - '/usr/lib/mono/1.0/System.Web.Services.dll' - ], - 'assemblies': [ - ('System.Web', '1.0.*'), - ('System.Web.Services', '1.0.*') - ] - }, - { 'name': 'libmono-system-runtime2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Runtime.*/2.0.*/', - '/usr/lib/mono/2.0/System.Runtime.*.dll' - ], - 'assemblies': [ - ('System.Runtime.*', '2.0.*') - ] - }, - { 'name': 'libmono-cscompmgd8.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/cscompmgd/8.0.*/', - '/usr/lib/mono/2.0/cscompmgd.dll' - ], - 'assemblies': [ - ('cscompmgd', '8.0.*') - ] - }, - { 'name': 'libmono-cscompmgd7.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/cscompmgd/7.0.*/', - '/usr/lib/mono/1.0/cscompmgd.dll' - ], - 'assemblies': [ - ('cscompmgd', '7.0.*') - ] - }, - { 'name': 'libmono-firebirdsql1.7-cil', - 'patterns': [ - '/usr/lib/mono/gac/FirebirdSql.Data.Firebird/1.7.*/', - '/usr/lib/mono/1.0/FirebirdSql.Data.Firebird.dll' - ], - 'assemblies': [ - ('FirebirdSql.Data.Firebird', '1.7.*') - ] - }, - { 'name': 'mono-jay', - 'patterns': [ - '/usr/bin/jay' - ] - }, - { 'name': 'libmono-data-tds1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Data.Tds/1.0.*/', - '/usr/lib/mono/1.0/Mono.Data.Tds.dll' - ], - 'assemblies': [ - ('Mono.Data.Tds', '1.0.*') - ] - }, - { 'name': 'libmono-sqlite1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Data.Sqlite/1.0.*/', - '/usr/lib/mono/gac/Mono.Data.SqliteClient/1.0.*/', - '/usr/lib/mono/1.0/Mono.Data.Sqlite.dll', - '/usr/lib/mono/1.0/Mono.Data.SqliteClient.dll' - ], - 'assemblies': [ - ('Mono.Data.Sqlite', '1.0.*'), - ('Mono.Data.SqliteClient', '1.0.*') - ] - }, - { 'name': 'libmono-relaxng1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Commons.Xml.Relaxng/1.0.*/', - '/usr/lib/mono/1.0/Commons.Xml.Relaxng.dll' - ], - 'assemblies': [ - ('Commons.Xml.Relaxng', '1.0.*') - ] - }, - { 'name': 'libmono-dev', - 'patterns': [ - '/usr/lib/libmono*.a', - '/usr/lib/libMono*.a', - '/usr/lib/libmono*.so', - '/usr/lib/libMonoSupportW.a', - '/usr/lib/pkgconfig/mono.pc', - '/usr/lib/pkgconfig/dotnet.pc', - '/usr/include/' - ] - }, - { 'name': 'libmono-accessibility1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Accessibility/1.0.*/', - '/usr/lib/mono/1.0/Accessibility.dll' - ], - 'assemblies': [ - ('Accessibility', '1.0.*') - ] - }, - { 'name': 'mono-common', - 'patterns': [ - '/etc/mono', - '/usr/share/mono-1.0/mono/cil/cil-opcodes.xml' - ] - }, - { 'name': 'libmono-oracle1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Data.OracleClient/1.0.*/', - '/usr/lib/mono/1.0/System.Data.OracleClient.dll' - ], - 'assemblies': [ - ('System.Data.OracleClient', '1.0.*') - ] - }, - { 'name': 'libmono-system-data1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Data/1.0.*/', - '/usr/lib/mono/1.0/System.Data.dll' - ], - 'assemblies': [ - ('System.Data', '1.0.*') - ] - }, - { 'name': 'libmono-bytefx0.7.6.2-cil', - 'patterns': [ - '/usr/lib/mono/gac/ByteFX.Data/0.7.6.2*/', - '/usr/lib/mono/2.0/ByteFX.Data.dll' - ], - 'assemblies': [ - ('ByteFX.Data', '0.7.6.2*') - ] - }, - { 'name': 'libmono0', - 'patterns': [ - '/usr/lib/libmono*.so.*', - '/usr/lib/libMonoPosixHelper.so', - '/usr/lib/libMonoSupportW.so' - ] - }, - { 'name': 'libmono-sharpzip0.6-cil', - 'patterns': [ - '/usr/lib/mono/gac/ICSharpCode.SharpZipLib/0.6.*/', - '/usr/lib/mono/compat-1.0/ICSharpCode.SharpZipLib.dll' - ], - 'assemblies': [ - ('ICSharpCode.SharpZipLib', '0.6.*') - ] - }, - { 'name': 'libmono-data-tds2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Data.Tds/2.0.*/', - '/usr/lib/mono/2.0/Mono.Data.Tds.dll' - ], - 'assemblies': [ - ('Mono.Data.Tds', '2.0.*') - ] - }, - { 'name': 'libmono-system-messaging1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Messaging/1.0.*/', - '/usr/lib/mono/1.0/System.Messaging.dll' - ], - 'assemblies': [ - ('System.Messaging', '1.0.*') - ] - }, - { 'name': 'libmono-npgsql1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Npgsql/1.0.*/', - '/usr/lib/mono/1.0/Npgsql.dll' - ], - 'assemblies': [ - ('Npgsql', '1.0.*') - ] - }, - { 'name': 'libmono-security2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Security/2.0.*/', - '/usr/lib/mono/2.0/Mono.Security.dll' - ], - 'assemblies': [ - ('Mono.Security', '2.0.*') - ] - }, - { 'name': 'libmono-security1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Security/1.0.*/', - '/usr/lib/mono/1.0/Mono.Security.dll' - ], - 'assemblies': [ - ('Mono.Security', '1.0.*') - ] - }, - { 'name': 'libmono-bytefx0.7.6.1-cil', - 'patterns': [ - '/usr/lib/mono/gac/ByteFX.Data/0.7.6.1*/', - '/usr/lib/mono/1.0/ByteFX.Data.dll' - ], - 'assemblies': [ - ('ByteFX.Data', '0.7.6.1*') - ] - }, - { 'name': 'libmono-microsoft-build2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Microsoft.Build.*/2.0.*/', - '/usr/lib/mono/2.0/Microsoft.Build.*.dll' - ], - 'assemblies': [ - ('Microsoft.Build.*', '2.0.*') - ] - }, - { 'name': 'libmono-system-ldap1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.DirectoryServices/1.0.*/', - '/usr/lib/mono/1.0/System.DirectoryServices.dll' - ], - 'assemblies': [ - ('System.DirectoryServices', '1.0.*') - ] - }, - { 'name': 'libmono-relaxng2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Commons.Xml.Relaxng/2.0.*/', - '/usr/lib/mono/2.0/Commons.Xml.Relaxng.dll' - ], - 'assemblies': [ - ('Commons.Xml.Relaxng', '2.0.*') - ] - }, - { 'name': 'libmono-system-ldap2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.DirectoryServices/2.0.*/', - '/usr/lib/mono/2.0/System.DirectoryServices.dll' - ], - 'assemblies': [ - ('System.DirectoryServices', '2.0.*') - ] - }, - { 'name': 'libmono-system-messaging2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Messaging/2.0.*/', - '/usr/lib/mono/2.0/System.Messaging.dll' - ], - 'assemblies': [ - ('System.Messaging', '2.0.*') - ] - }, - { 'name': 'libmono-sharpzip0.84-cil', - 'patterns': [ - '/usr/lib/mono/gac/ICSharpCode.SharpZipLib/0.84.*/', - '/usr/lib/mono/1.0/ICSharpCode.SharpZipLib.dll' - ], - 'assemblies': [ - ('ICSharpCode.SharpZipLib', '0.84.*') - ] - }, - { 'name': 'libmono-sqlite2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Data.Sqlite/2.0.*/', - '/usr/lib/mono/gac/Mono.Data.SqliteClient/2.0.*/', - '/usr/lib/mono/2.0/Mono.Data.Sqlite.dll', - '/usr/lib/mono/2.0/Mono.Data.SqliteClient.dll' - ], - 'assemblies': [ - ('Mono.Data.Sqlite', '2.0.*'), - ('Mono.Data.SqliteClient', '2.0.*') - ] - }, - { 'name': 'libmono-ldap2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Novell.Directory.Ldap/2.0.*/', - '/usr/lib/mono/2.0/Novell.Directory.Ldap.dll' - ], - 'assemblies': [ - ('Novell.Directory.Ldap', '2.0.*') - ] - }, - { 'name': 'libmono-npgsql2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Npgsql/2.0.*/', - '/usr/lib/mono/2.0/Npgsql.dll' - ], - 'assemblies': [ - ('Npgsql', '2.0.*') - ] - }, - { 'name': 'libmono-system-runtime1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Runtime.*/1.0.*/', - '/usr/lib/mono/1.0/System.Runtime.*.dll' - ], - 'assemblies': [ - ('System.Runtime.*', '1.0.*') - ] - }, - { 'name': 'libmono-oracle2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System.Data.OracleClient/2.0.*/', - '/usr/lib/mono/2.0/System.Data.OracleClient.dll' - ], - 'assemblies': [ - ('System.Data.OracleClient', '2.0.*') - ] - }, - { 'name': 'libmono-c5-1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.C5/1.0.*/', - '/usr/lib/mono/2.0/Mono.C5.dll' - ], - 'assemblies': [ - ('Mono.C5', '1.0.*') - ] - }, - { 'name': 'libmono-sharpzip2.6-cil', - 'patterns': [ - '/usr/lib/mono/gac/ICSharpCode.SharpZipLib/2.6.*/', - '/usr/lib/mono/compat-2.0/ICSharpCode.SharpZipLib.dll' - ], - 'assemblies': [ - ('ICSharpCode.SharpZipLib', '2.6.*') - ] - }, - { 'name': 'libmono-cairo2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.Cairo/2.0.*/', - '/usr/lib/mono/2.0/Mono.Cairo.dll' - ], - 'assemblies': [ - ('Mono.Cairo', '2.0.*') - ] - }, - { 'name': 'libmono-peapi2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/PEAPI/2.0.*/', - '/usr/lib/mono/2.0/PEAPI.dll' - ], - 'assemblies': [ - ('PEAPI', '2.0.*') - ] - }, - { 'name': 'mono-mcs', - 'patterns': [ - '/usr/bin/', - '/usr/lib/mono/1.0/*.exe*' - ] - }, - { 'name': 'libmono-system1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System*/1.0.*/', - '/usr/lib/mono/gac/CustomMarshalers/1.0.*/', - '/usr/lib/mono/1.0/System*.dll', - '/usr/lib/mono/1.0/CustomMarshalers.dll*' - ], - 'assemblies': [ - ('System*', '1.0.*'), - ('CustomMarshalers', '1.0.*') - ] - }, - { 'name': 'libmono-system2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/System*/2.0.*/', - '/usr/lib/mono/gac/CustomMarshalers/2.0.*/', - '/usr/lib/mono/2.0/System*.dll', - '/usr/lib/mono/2.0/CustomMarshalers.dll*' - ], - 'assemblies': [ - ('System*', '2.0.*'), - ('CustomMarshalers', '2.0.*') - ] - }, - { 'name': 'libmono1.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.*/1.0.*/', - '/usr/lib/mono/gac/OpenSystem.C/1.0.*', - '/usr/lib/mono/gac/mono-service/1.0.*/', - '/usr/lib/mono/1.0/Mono.*.dll', - '/usr/lib/mono/1.0/OpenSystem.C.dll' - ], - 'assemblies': [ - ('Mono.*', '1.0.*'), - ('OpenSystem.C', '1.0.*'), - ('mono-service', '1.0.*') - ] - }, - { 'name': 'libmono2.0-cil', - 'patterns': [ - '/usr/lib/mono/gac/Mono.*/2.0.*/', - '/usr/lib/mono/gac/OpenSystem.C/2.0.*', - '/usr/lib/mono/gac/mono-service/2.0.*/', - '/usr/lib/mono/2.0/Mono.*.dll', - '/usr/lib/mono/2.0/OpenSystem.C.dll' - ], - 'assemblies': [ - ('Mono.*', '2.0.*'), - ('OpenSystem.C', '2.0.*'), - ('mono-service', '2.0.*') - ] - } -] diff --git a/packages/mono/mono_svn.bb b/packages/mono/mono_svn.bb new file mode 100644 index 0000000000..6644efb4e3 --- /dev/null +++ b/packages/mono/mono_svn.bb @@ -0,0 +1,95 @@ +require mono_svn.inc + +DEPENDS = "mono-native mono-mcs-intermediate glib-2.0 perl-native" + +PR = "r0" +DEFAULT_PREFERENCE = "-1" + +SRC_URI += "file://configure-svnr87352.patch;patch=1" + +# Per http://www.mono-project.com/Mono:ARM +EXTRA_OECONF += " --disable-mcs-build " +# Instead, get the mcs tree from a different build (see mono-mcs-intermediate) + +do_install_prepend() { + install -d ${D} + pushd ${D} + tar -xzf ${STAGING_DIR}/share/mono-mcs/mono-mcs-${PV}.tar.gz + popd +} + +do_install_append() { + # mono-mcs-intermediate builds and installs jay (a Yacc for Java and C#), + # however, jay is not being cross-compiled and thus only + # available for the buildhost architecture, so remove it + # entirely + pushd ${D} + rm -rf ./usr/share/man/man1/jay.1 ./usr/share/jay \ + ./usr/share/jay/README.jay \ + ./usr/bin/jay + popd + + # Not packaged with the default rules and apparently + # not used for anything + rm -rf ${D}${datadir}/mono-1.0/mono/cil/cil-opcodes.xml +} + +inherit mono + +# Import file definitions from Debian +require mono_1.2.5.1-files.inc + +# Add some packages +PACKAGES_append = " mono-doc mono mono-runtime" + +FILES_mono-doc_append = " /usr/share/libgc-mono/ " + +FILES_mono = "" +ALLOW_EMPTY_mono = "1" +RDEPENDS_mono = "mono-common mono-jit" + +FILES_mono-runtime = "" +ALLOW_EMPTY_mono-runtime = "1" +RDEPENDS_mono-runtime = "mono-jit mono-gac" + +RDEPENDS_mono-jit = "mono-common" + +FILES_libmono-dev =+ " /usr/lib/libmono.la /usr/lib/libmono-profiler-cov.la /usr/lib/libmono-profiler-aot.la \ + /usr/lib/libMonoPosixHelper.la /usr/lib/libMonoSupportW.la" +FILES_libmono-dbg =+ " /usr/lib/.debug/libmono*.so.* /usr/lib/.debug/libikvm-native.so \ + /usr/lib/.debug/libMonoPosixHelper.so /usr/lib/.debug/libMonoSupportW.so" + +# Packages not included in Debian +PACKAGES_prepend = "libnunit2.2-cil-dbg libnunit2.2-cil-dev libnunit2.2-cil \ + libmono-cecil0.6-cil-dbg libmono-cecil0.6-cil-dev libmono-cecil0.6-cil \ + libmono-cecil-mdb0.2-cil-dbg libmono-cecil-mdb0.2-cil \ + libmono-db2-1.0-cil-dbg libmono-db2-1.0-cil-dev libmono-db2-1.0-cil \ + libmono-mozilla0.1-cil-dbg libmono-mozilla0.1-cil \ + libmono-system-web-extensions1.0-cil-dbg libmono-system-web-extensions1.0-cil" + +FILES_libnunit2.2-cil = "/usr/lib/mono/gac/nunit.*/2.2.* /usr/lib/mono/1.0/nunit.*.dll" +FILES_libnunit2.2-cil-dev = "/usr/lib/pkgconfig/mono-nunit.pc" +FILES_libnunit2.2-cil-dbg = "/usr/lib/mono/gac/nunit*/2.2.*/nunit.*.dll.mdb" + +FILES_libmono-cecil0.6-cil = "/usr/lib/mono/gac/Mono.Cecil*/0.6.*" +FILES_libmono-cecil0.6-cil-dbg = "/usr/lib/mono/gac/Mono.Cecil*/0.6.*/Mono.Cecil*.dll.mdb" +FILES_libmono-cecil0.6-cil-dev = "/usr/lib/pkgconfig/cecil.pc" + +FILES_libmono-cecil-mdb0.2-cil = "/usr/lib/mono/gac/Mono.Cecil.Mdb/0.2.*" +FILES_libmono-cecil-mdb0.2-cil-dbg = "/usr/lib/mono/gac/Mono.Cecil.Mdb/0.2.*/Mono.Cecil*.dll.mdb" + +FILES_libmono-db2-1.0-cil = "/usr/lib/mono/gac/IBM.Data.DB2/1.0* /usr/lib/mono/1.0/IBM.Data.DB2.dll" +FILES_libmono-db2-1.0-cil-dbg = "/usr/lib/mono/gac/IBM.Data.DB2/1.0*/IBM.Data.DB2.dll.mdb" + +FILES_libmono-system2.0-cil-dbg_append = " /usr/lib/mono/gac/System.Core/3.5.*/*.mdb " +FILES_libmono-system2.0-cil_append = " /usr/lib/mono/gac/System.Core/3.5.* " + +FILES_libmono-mozilla0.1-cil-dbg = "/usr/lib/mono/gac/Mono.Mozilla/0.1.0.0*/Mono.Mozilla.dll.mdb" +FILES_libmono-mozilla0.1-cil = "/usr/lib/mono/gac/Mono.Mozilla/0.1.0.0*/Mono.Mozilla.dll" + +FILES_libmono-system-web-extensions1.0-cil-dbg = "/usr/lib/mono/gac/System.Web.Extensions*/1.0*/*.mdb" +FILES_libmono-system-web-extensions1.0-cil = "/usr/lib/mono/gac/System.Web.Extensions*/1.0*/*.dll" + +# Move .pc files +FILES_libmono-cairo1.0-cil-dev = "/usr/lib/pkgconfig/mono-cairo.pc" +PACKAGES =+ " libmono-cairo1.0-cil-dev " diff --git a/packages/mono/mono_svn.inc b/packages/mono/mono_svn.inc new file mode 100644 index 0000000000..be007e4b9e --- /dev/null +++ b/packages/mono/mono_svn.inc @@ -0,0 +1,15 @@ +DESCRIPTION = "Mono Programming Language" +SECTION = "devel/mono" +LICENSE = "GPL LGPL X11" + +SRCREV = "87352" +SRC_URI = "svn://anonsvn.mono-project.com/source/trunk/;module=mcs;rev=${SRCREV} \ + svn://anonsvn.mono-project.com/source/trunk/;module=mono;rev=${SRCREV} " + +PV = "1.2.5.1+svnr${SRCREV}" +S = "${WORKDIR}/mono" + +inherit autotools +EXTRA_OECONF_arm = "--without-tls" +EXTRA_OECONF_mipsel = "--without-tls" + diff --git a/packages/mozilla/minimo_cvs.bb b/packages/mozilla/minimo_cvs.bb index 990068b41e..5f1ae3e996 100644 --- a/packages/mozilla/minimo_cvs.bb +++ b/packages/mozilla/minimo_cvs.bb @@ -35,7 +35,7 @@ export ac_cv_prog_HOST_CC="${BUILD_CC}" export ac_cv_prog_HOST_CFLAGS="${BUILD_CFLAGS}" export ac_cv_prog_HOST_CXX="${BUILD_CXX}" export ac_cv_prog_HOST_CXXFLAGS="${BUILD_CXXFLAGS}" -export HOST_LIBIDL_CONFIG = "libIDL-config-2" +export HOST_LIBIDL_CONFIG = "${STAGING_DIR}/${BUILD_SYS}/bin/libIDL-config-2" mozdir="${libdir}/mozilla-minimo" diff --git a/packages/musicpd/mpd-alsa_svn.bb b/packages/musicpd/mpd-alsa_svn.bb index 2a9c9ed729..f86ae6a337 100644 --- a/packages/musicpd/mpd-alsa_svn.bb +++ b/packages/musicpd/mpd-alsa_svn.bb @@ -4,7 +4,8 @@ SECTION = "console/multimedia" LICENSE = "GPLv2" DEPENDS = "libvorbis libogg libid3tag libao-alsa zlib libmad flac audiofile virtual/libiconv faad2" RDEPENDS = "libao-alsa" -PR = "r1" +PV = "0.11.5+svnr${SRCREV}" +PR = "r2" SRC_URI = "svn://svn.musicpd.org/mpd;module=trunk;proto=https \ file://mpd/mpd.init" diff --git a/packages/netbase/netbase/ghi270/.mtn2git_empty b/packages/netbase/netbase/ghi270/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/netbase/netbase/ghi270/.mtn2git_empty diff --git a/packages/nonworking/gutenprint/gutenprint_5.0.0.bb b/packages/nonworking/gutenprint/gutenprint_5.0.0.bb deleted file mode 100644 index 5a0de7797f..0000000000 --- a/packages/nonworking/gutenprint/gutenprint_5.0.0.bb +++ /dev/null @@ -1,22 +0,0 @@ - - - -DEPENDS = "glib-2.0 gtk+ cups" - -inherit autotools pkgconfig - -SRC_URI = "${SOURCEFORGE_MIRROR}/gimp-print/${P}.tar.bz2" - -EXTRA_OECONF = "\ - --disable-gtktest \ - --disable-libgutenprintui \ - --enable-libgutenprintui2 \ - --enable-translated-cups-ppds \ - --disable-gimptest \ - " - -do_configure() { - oe_runconf -} - - diff --git a/packages/openmoko2/neod_svn.bb b/packages/openmoko2/neod_svn.bb index 6e6c3b6019..f68d2e4919 100644 --- a/packages/openmoko2/neod_svn.bb +++ b/packages/openmoko2/neod_svn.bb @@ -1,8 +1,9 @@ DESCRIPTION = "Simple Neo1973 Daemon for Button Handling and Power Management" SECTION = "openmoko/daemons" -DEPENDS = "gconf gtk+ pulseaudio" +DEPENDS = "gtk+ pulseaudio" +RDEPENDS = "gpe-scap xrandr alsa-utils-amixer apm" PV = "0.1.0+svn${SVNREV}" -PR = "r1" +PR = "r4" inherit openmoko2 gconf diff --git a/packages/openmoko2/openmoko-appmanager2_svn.bb b/packages/openmoko2/openmoko-appmanager2_svn.bb index 8faf5fd1f9..24b21c668b 100644 --- a/packages/openmoko2/openmoko-appmanager2_svn.bb +++ b/packages/openmoko2/openmoko-appmanager2_svn.bb @@ -1,7 +1,10 @@ DESCRIPTION = "The OpenMoko Application Manager" SECTION = "openmoko/applications" -DEPENDS = "libmokoui2 libmokojournal2 startup-notification dbus-glib libice libsm" +DEPENDS = "libmokoui2 libmokojournal2 startup-notification dbus-glib libice libsm ipkg" PV = "0.1.0+svn${SVNREV}" PR = "r0" inherit openmoko2 + +FILES_${PN} += "/usr/share/openmoko-appmanager" + diff --git a/packages/openmoko2/openmoko-common2_svn.bb b/packages/openmoko2/openmoko-common2_svn.bb index 0cf7f763cb..018f9a8e74 100644 --- a/packages/openmoko2/openmoko-common2_svn.bb +++ b/packages/openmoko2/openmoko-common2_svn.bb @@ -1,21 +1,19 @@ DESCRIPTION = "Common files for the OpenMoko distribution" SECTION = "openmoko/base" PV = "0.0+svnr${SRCREV}" -PR = "r3" +PR = "r5" inherit openmoko2 SRC_URI = "${OPENMOKO_MIRROR}/src/target/${OPENMOKO_RELEASE}/artwork;module=pixmaps;proto=http" S = "${WORKDIR}" +ALLOW_EMPTY = "1" + dirs = "pixmaps" do_install() { - find ${WORKDIR} -name ".svn" | xargs rm -rf - install -d ${D}${datadir} - for i in ${dirs}; do - cp -fpPR ${S}/$i ${D}${datadir} - done + : } PACKAGE_ARCH = "all" diff --git a/packages/openmoko2/openmoko-mediaplayer2_svn.bb b/packages/openmoko2/openmoko-mediaplayer2_svn.bb index e353bcbaa7..42a71b1472 100644 --- a/packages/openmoko2/openmoko-mediaplayer2_svn.bb +++ b/packages/openmoko2/openmoko-mediaplayer2_svn.bb @@ -1,9 +1,9 @@ DESCRIPTION = "A media player for OpenMoko" SECTION = "openmoko/tools" -DEPENDS = "libmokoui2 expat gstreamer libspiff" +DEPENDS = "libmokoui2 expat gstreamer libspiff curl" RDEPENDS = "gst-meta-audio" PV = "0.1.0+svn${SVNREV}" -PR = "r1" +PR = "r2" inherit openmoko2 diff --git a/packages/openmoko2/openmoko-session2.bb b/packages/openmoko2/openmoko-session2.bb index b1f9dae38d..65cb7f1ca6 100644 --- a/packages/openmoko2/openmoko-session2.bb +++ b/packages/openmoko2/openmoko-session2.bb @@ -4,7 +4,7 @@ SECTION = "x11" RDEPENDS = "matchbox-common matchbox-applet-startup-monitor matchbox-panel-2" RDEPENDS += "openmoko-common2 openmoko-today2 openmoko-dialer2" RCONFLICTS = "openmoko-session" -PR = "r33" +PR = "r34" SRC_URI = "file://etc" S = ${WORKDIR} @@ -29,6 +29,9 @@ gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --dire gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct --type int --set /desktop/poky/peripherals/mouse/drag_threshold 8 gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct --type int --set /desktop/openmoko/neod/power_management 2 +gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct -t string --set /system/gstreamer/0.10/default/audiosink pulsesink +gconftool-2 --config-source=xml::$D${sysconfdir}/gconf/gconf.xml.defaults --direct -t string --set /system/gstreamer/0.10/default/audiosrc pulsesrc + } PACKAGE_ARCH = "all" diff --git a/packages/openmoko2/openmoko-sound-system2_0.1.0.bb b/packages/openmoko2/openmoko-sound-system2_0.1.0.bb index 57b72af4b6..e77561c3a1 100644 --- a/packages/openmoko2/openmoko-sound-system2_0.1.0.bb +++ b/packages/openmoko2/openmoko-sound-system2_0.1.0.bb @@ -9,10 +9,11 @@ RDEPENDS = "\ pulseaudio-module-simple-protocol-tcp \ pulseaudio-module-native-protocol-unix \ pulseaudio-module-cli-protocol-unix \ + gst-plugin-pulse \ " RREPLACES = "openmoko-sound-system" RPROVIDES = "openmoko-sound-system" -PR = "r2" +PR = "r3" inherit openmoko-base update-rc.d diff --git a/packages/openssh/files/sftp-server-nolibcrypto.patch b/packages/openssh/files/sftp-server-nolibcrypto.patch new file mode 100644 index 0000000000..1b00bff663 --- /dev/null +++ b/packages/openssh/files/sftp-server-nolibcrypto.patch @@ -0,0 +1,13 @@ +Index: openssh-4.6p1/Makefile.in +=================================================================== +--- openssh-4.6p1.orig/Makefile.in 2007-10-16 11:27:24.000000000 +0100 ++++ openssh-4.6p1/Makefile.in 2007-10-16 11:27:46.000000000 +0100 +@@ -160,7 +160,7 @@ + $(LD) -o $@ ssh-keyscan.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) + + sftp-server$(EXEEXT): $(LIBCOMPAT) libssh.a sftp.o sftp-common.o sftp-server.o +- $(LD) -o $@ sftp-server.o sftp-common.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) ++ $(LD) -o $@ sftp-server.o sftp-common.o $(LDFLAGS) -lssh -lopenbsd-compat + + sftp$(EXEEXT): $(LIBCOMPAT) libssh.a sftp.o sftp-client.o sftp-common.o sftp-glob.o progressmeter.o + $(LD) -o $@ progressmeter.o sftp.o sftp-client.o sftp-common.o sftp-glob.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(LIBEDIT) diff --git a/packages/openssh/openssh_4.6p1.bb b/packages/openssh/openssh_4.6p1.bb index b38e7ec595..c1c84d9dc1 100644 --- a/packages/openssh/openssh_4.6p1.bb +++ b/packages/openssh/openssh_4.6p1.bb @@ -14,9 +14,10 @@ It is intended as a replacement for rlogin, rsh and rcp, and can be \ used to provide applications with a secure communication channel." HOMEPAGE = "http://www.openssh.org/" LICENSE = "BSD" -PR = "r2" +PR = "r3" SRC_URI = "ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar.gz \ + file://sftp-server-nolibcrypto.patch;patch=1 \ file://sshd_config \ file://ssh_config \ file://init" @@ -56,13 +57,14 @@ do_install_append() { rmdir ${D}/var/run/sshd ${D}/var/run ${D}/var } -PACKAGES =+ " openssh-scp openssh-ssh openssh-sshd openssh-sftp openssh-misc" +PACKAGES =+ " openssh-scp openssh-ssh openssh-sshd openssh-sftp openssh-misc openssh-sftp-server" FILES_openssh-dbg +=${bindir}/.debug ${libdir}exec/.debug" FILES_openssh-scp = "${bindir}/scp.${PN}" FILES_openssh-ssh = "${bindir}/ssh.${PN} ${bindir}/slogin /${sysconfdir}/ssh/ssh_config" FILES_openssh-sshd = "${sbindir}/sshd /${sysconfdir}/init.d/sshd ${bindir}/ssh-keygen" FILES_openssh-sshd += " /${sysconfdir}/ssh/moduli /${sysconfdir}/ssh/sshd_config" -FILES_openssh-sftp = "${bindir}/sftp ${libdir}exec/sftp-server" +FILES_openssh-sftp = "${bindir}/sftp" +FILES_openssh-sftp-server = "${libdir}exec/sftp-server" FILES_openssh-misc = "${bindir}/ssh* ${libdir}exec/ssh*" RDEPENDS_openssh += " openssh-scp openssh-ssh openssh-sshd" diff --git a/packages/opie-usermanager/opie-usermanager.inc b/packages/opie-usermanager/opie-usermanager.inc deleted file mode 100644 index 63bd0bba67..0000000000 --- a/packages/opie-usermanager/opie-usermanager.inc +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "User/Group manager for Opie" -SECTION = "opie/settings" -PRIORITY = "optional" -LICENSE = "GPL" -APPNAME = "usermanager" - - -S = "${WORKDIR}/${APPNAME}" - -inherit opie - -# FILES plugins/application/libusermanager.so* bin/usermanager apps/Settings/usermanager.desktop pics/usermanager/* -do_install() { - install -d ${D}${palmtopdir}/pics/${APPNAME}/ - install -m 0644 ${WORKDIR}/pics/${APPNAME}/*.png ${D}${palmtopdir}/pics/${APPNAME}/ -} - diff --git a/packages/opie-usermanager/opie-usermanager_1.2.2.bb b/packages/opie-usermanager/opie-usermanager_1.2.2.bb deleted file mode 100644 index 2233f1349f..0000000000 --- a/packages/opie-usermanager/opie-usermanager_1.2.2.bb +++ /dev/null @@ -1,7 +0,0 @@ -require ${PN}.inc - - - -SRC_URI = "${HANDHELDS_CVS};tag=${TAG};module=opie/noncore/settings/usermanager \ - ${HANDHELDS_CVS};tag=${TAG};module=opie/pics \ - ${HANDHELDS_CVS};tag=${TAG};module=opie/apps" diff --git a/packages/opie-usermanager/opie-usermanager_1.2.3.bb b/packages/opie-usermanager/opie-usermanager_1.2.3.bb deleted file mode 100644 index eb173e6532..0000000000 --- a/packages/opie-usermanager/opie-usermanager_1.2.3.bb +++ /dev/null @@ -1,6 +0,0 @@ -require ${PN}.inc - - -SRC_URI = "${HANDHELDS_CVS};tag=${TAG};module=opie/noncore/settings/usermanager \ - ${HANDHELDS_CVS};tag=${TAG};module=opie/pics \ - ${HANDHELDS_CVS};tag=${TAG};module=opie/apps" diff --git a/packages/opie-usermanager/opie-usermanager_cvs.bb b/packages/opie-usermanager/opie-usermanager_cvs.bb deleted file mode 100644 index 1f481f7461..0000000000 --- a/packages/opie-usermanager/opie-usermanager_cvs.bb +++ /dev/null @@ -1,7 +0,0 @@ -require ${PN}.inc - -PV = "${OPIE_CVS_PV}" - -SRC_URI = "${HANDHELDS_CVS};module=opie/noncore/settings/usermanager \ - ${HANDHELDS_CVS};module=opie/pics \ - ${HANDHELDS_CVS};module=opie/apps" diff --git a/packages/python/python-2.5-manifest.inc b/packages/python/python-2.5-manifest.inc index 3d46d47bd0..e80da80d87 100644 --- a/packages/python/python-2.5-manifest.inc +++ b/packages/python/python-2.5-manifest.inc @@ -50,7 +50,7 @@ FILES_python-datetime="${libdir}/python2.5/_strptime.* ${libdir}/python2.5/calen DESCRIPTION_python-core="Python Interpreter and core modules (needed!)" PR_python-core="ml3" RDEPENDS_python-core="" -FILES_python-core="/usr/lib/python2.5/__future__.* /usr/lib/python2.5/copy.* /usr/lib/python2.5/copy_reg.* /usr/lib/python2.5/ConfigParser.* /usr/lib/python2.5/getopt.* /usr/lib/python2.5/linecache.* /usr/lib/python2.5/new.* /usr/lib/python2.5/os.* /usr/lib/python2.5/posixpath.* /usr/lib/python2.5/warnings.* /usr/lib/python2.5/site.* /usr/lib/python2.5/stat.* /usr/lib/python2.5/UserDict.* /usr/lib/python2.5/UserList.* /usr/lib/python2.5/UserString.* /usr/lib/python2.5/lib-dynload/binascii.so /usr/lib/python2.5/lib-dynload/struct.so /usr/lib/python2.5/lib-dynload/time.so /usr/lib/python2.5/lib-dynload/xreadlines.so /usr/lib/python2.5/types.* /usr/bin/python* " +FILES_python-core="${libdir}/python2.5/__future__.* ${libdir}/python2.5/copy.* ${libdir}/python2.5/copy_reg.* ${libdir}/python2.5/ConfigParser.* ${libdir}/python2.5/getopt.* ${libdir}/python2.5/linecache.* ${libdir}/python2.5/new.* ${libdir}/python2.5/os.* ${libdir}/python2.5/posixpath.* ${libdir}/python2.5/warnings.* ${libdir}/python2.5/site.* ${libdir}/python2.5/stat.* ${libdir}/python2.5/UserDict.* ${libdir}/python2.5/UserList.* ${libdir}/python2.5/UserString.* ${libdir}/python2.5/lib-dynload/binascii.so ${libdir}/python2.5/lib-dynload/struct.so ${libdir}/python2.5/lib-dynload/time.so ${libdir}/python2.5/lib-dynload/xreadlines.so ${libdir}/python2.5/types.* ${bindir}/python* " DESCRIPTION_python-io="Python Low-Level I/O" PR_python-io="ml1" @@ -95,7 +95,7 @@ FILES_python-image="${libdir}/python2.5/colorsys.* ${libdir}/python2.5/imghdr.* DESCRIPTION_python-core-dbg="Python core module debug information" PR_python-core-dbg="ml1" RDEPENDS_python-core-dbg="python-core" -FILES_python-core-dbg="/usr/lib/python2.5/lib-dynload/.debug /usr/bin/.debug /usr/lib/.debug " +FILES_python-core-dbg="${libdir}/python2.5/lib-dynload/.debug ${bindir}/.debug ${libdir}/.debug " DESCRIPTION_python-resource="Python Resource Control Interface" PR_python-resource="ml1" @@ -105,7 +105,7 @@ FILES_python-resource="${libdir}/python2.5/lib-dynload/resource.so " DESCRIPTION_python-devel="Python Development Package" PR_python-devel="ml1" RDEPENDS_python-devel="python-core" -FILES_python-devel="/usr/include /usr/lib/python2.5/config " +FILES_python-devel="${includedir} ${libdir}/python2.5/config " DESCRIPTION_python-math="Python Math Support" PR_python-math="ml1" @@ -165,7 +165,7 @@ FILES_python-curses="${libdir}/python2.5/curses ${libdir}/python2.5/lib-dynload/ DESCRIPTION_python-smtpd="Python Simple Mail Transport Daemon" PR_python-smtpd="ml1" RDEPENDS_python-smtpd="python-core python-netserver python-email python-mime" -FILES_python-smtpd="/usr/bin/smtpd.* " +FILES_python-smtpd="${bindir}/smtpd.* " DESCRIPTION_python-html="Python HTML Processing" PR_python-html="ml1" @@ -185,7 +185,7 @@ FILES_python-subprocess="${libdir}/python2.5/subprocess.* " DESCRIPTION_python-pydoc="Python Interactive Help Support" PR_python-pydoc="ml1" RDEPENDS_python-pydoc="python-core python-lang python-stringold python-re" -FILES_python-pydoc="/usr/bin/pydoc /usr/lib/python2.5/pydoc.* " +FILES_python-pydoc="${bindir}/pydoc ${libdir}/python2.5/pydoc.* " DESCRIPTION_python-logging="Python Logging Support" PR_python-logging="ml1" @@ -280,7 +280,7 @@ FILES_python-crypt="${libdir}/python2.5/lib-dynload/crypt.so ${libdir}/python2.5 DESCRIPTION_python-idle="Python Integrated Development Environment" PR_python-idle="ml1" RDEPENDS_python-idle="python-core python-tkinter" -FILES_python-idle="/usr/bin/idle /usr/lib/python2.5/idlelib " +FILES_python-idle="${bindir}/idle ${libdir}/python2.5/idlelib " DESCRIPTION_python-lang="Python Low-Level Language Support" PR_python-lang="ml1" diff --git a/packages/python/python-pygtk_2.10.4.bb b/packages/python/python-pygtk_2.10.4.bb index e1f77984d1..e90b86bf1c 100644 --- a/packages/python/python-pygtk_2.10.4.bb +++ b/packages/python/python-pygtk_2.10.4.bb @@ -5,7 +5,7 @@ DEPENDS = "gtk+ libglade python-pycairo python-pygobject" RDEPENDS = "python-shell python-pycairo python-pygobject" SRCNAME = "pygtk" LICENSE = "LGPL" -PR = "ml2" +PR = "ml3" SRC_URI = "ftp://ftp.gnome.org/pub/gnome/sources/pygtk/2.10/${SRCNAME}-${PV}.tar.bz2 \ file://fix-gtkunixprint.patch;patch=1 \ @@ -31,7 +31,6 @@ do_configure_prepend() { } require fix-path.inc -PACKAGES =+ "${PN}-dev" FILES_${PN}-dev += "${libdir}/pygtk/2.0 ${bindir}/pygtk-*" FILES_${PN}-dbg += "${libdir}/python2.4/site-packages/gtk-2.0/*/.debug" FILES_${PN}-dbg += "${libdir}/python2.4/site-packages/gtk-2.0/.debug" diff --git a/packages/tasks/task-openmoko.bb b/packages/tasks/task-openmoko.bb index 3b48b674c7..da6c1ef36e 100644 --- a/packages/tasks/task-openmoko.bb +++ b/packages/tasks/task-openmoko.bb @@ -2,7 +2,7 @@ DESCRIPTION = "OpenMoko: Tasks for the OpenMoko Linux Distribution" SECTION = "openmoko/base" LICENSE = "MIT" PROVIDES = "task-openmoko-everything" -PR = "r65" +PR = "r66" inherit task @@ -135,6 +135,8 @@ RDEPENDS_task-openmoko-pim = "\ openmoko-contacts2 \ openmoko-dates2 \ openmoko-feedreader2 \ + openmoko-browser2 \ + openmoko-appmanager2 \ openmoko-tasks2 \ openmoko-mediaplayer2 \ # openmoko-messages \ diff --git a/packages/tasks/task-sdk.bb b/packages/tasks/task-sdk.bb index 2c2bac1289..79e9fefc2a 100644 --- a/packages/tasks/task-sdk.bb +++ b/packages/tasks/task-sdk.bb @@ -1,5 +1,5 @@ DESCRIPTION = "SDK packages" -PR = "r7" +PR = "r8" LICENSE = "MIT" ALLOW_EMPTY = "1" @@ -7,8 +7,16 @@ PACKAGES = "\ task-sdk-bare \ " +DEPENDS = "virtual/libc" + +LIBC_linux = "glibc" +LIBC_linux-uclibc = "uclibc" +LIBC_linux-gnueabi = "glibc" +LIBC_linux-uclibcgnueabi = "uclibc" + + RDEPENDS_task-sdk-bare = "\ - glibc \ - glibc-dev \ + ${LIBC} \ + ${LIBC}-dev \ libgcc \ " diff --git a/packages/tasks/task-toolchain-openmoko-sdk.bb b/packages/tasks/task-toolchain-openmoko-sdk.bb new file mode 100644 index 0000000000..062b05519b --- /dev/null +++ b/packages/tasks/task-toolchain-openmoko-sdk.bb @@ -0,0 +1,28 @@ +DESCRIPTION = "Packages for a standalone OpenMoko SDK or external toolchain" +PR = "r1" +LICENSE = "MIT" +ALLOW_EMPTY = "1" + +PACKAGES = "${PN}" + +RDEPENDS_${PN} = "\ + glibc \ + glibc-dbg \ + glibc-dev \ + glibc-utils \ + libsegfault \ + glibc-thread-db \ + glibc-localedata-i18n \ + glibc-gconv-ibm850 \ + glibc-gconv-cp1252 \ + glibc-gconv-iso8859-1 \ + glibc-gconv-iso8859-15 \ + locale-base-en-gb \ + libgcc \ + libstdc++ \ + \ + libmokogsmd2-dev \ + libmokoui2-dev \ + libmokopanelui2-dev \ + libmokojournal2-dev \ +" diff --git a/packages/ttf-fonts/ttf-liberation_0.2.bb b/packages/ttf-fonts/ttf-liberation_0.2.bb index b3c96000fe..94b4012d3e 100644 --- a/packages/ttf-fonts/ttf-liberation_0.2.bb +++ b/packages/ttf-fonts/ttf-liberation_0.2.bb @@ -4,7 +4,7 @@ HOMEPAGE = "https://www.redhat.com/promo/fonts/" require ttf.inc -SRC_URI = "https://www.redhat.com/f/fonts/liberation-fonts-ttf-3.tar.gz" +SRC_URI = "http://www.redhat.com/f/fonts/liberation-fonts-ttf-3.tar.gz" S = "${WORKDIR}/liberation-fonts-${PV}" PACKAGES = "ttf-liberation-mono ttf-liberation-sans ttf-liberation-serif" diff --git a/packages/uboot/u-boot-mkimage-openmoko-native/makefile-no-dirafter.patch b/packages/uboot/files/makefile-no-dirafter.patch index 2ed26c3127..2ed26c3127 100644 --- a/packages/uboot/u-boot-mkimage-openmoko-native/makefile-no-dirafter.patch +++ b/packages/uboot/files/makefile-no-dirafter.patch diff --git a/packages/uboot/uboot-openmoko_1.2.0+gitf34024d4a328e6edd906456da98d2c537155c4f7+svn2943.bb b/packages/uboot/uboot-openmoko_1.2.0+gitf34024d4a328e6edd906456da98d2c537155c4f7+svn2943.bb index 2a09c76f09..1cee1edf37 100644 --- a/packages/uboot/uboot-openmoko_1.2.0+gitf34024d4a328e6edd906456da98d2c537155c4f7+svn2943.bb +++ b/packages/uboot/uboot-openmoko_1.2.0+gitf34024d4a328e6edd906456da98d2c537155c4f7+svn2943.bb @@ -19,6 +19,7 @@ SRC_URI = "\ svn://svn.openmoko.org/trunk/src/target/u-boot;module=patches;rev=${UBOOT_OPENMOKO_REV};proto=http \ file://uboot-eabi-fix-HACK.patch \ file://uboot-20070311-tools_makefile_ln_sf.patch;patch=1 \ + file://makefile-no-dirafter.patch;patch=1 \ " EXTRA_OEMAKE = "CROSS_COMPILE=${TARGET_PREFIX}" diff --git a/packages/uboot/uboot-openmoko_svn.bb b/packages/uboot/uboot-openmoko_svn.bb index 3669b409da..a13b3df461 100644 --- a/packages/uboot/uboot-openmoko_svn.bb +++ b/packages/uboot/uboot-openmoko_svn.bb @@ -5,11 +5,11 @@ SECTION = "bootloader" PRIORITY = "optional" PROVIDES = "virtual/bootloader" PV = "1.2.0+git${SRCDATE}+svnr${SRCREV}" -PR = "r1" +PR = "r2" SRCREV_FORMAT = "patches" -UBOOT_MACHINES = "gta01bv2 gta01bv3 gta01bv4 smdk2440 hxd8 qt2410 gta02v1 gta02v2" +UBOOT_MACHINES = "gta01bv2 gta01bv3 gta01bv4 smdk2440 hxd8 qt2410 gta02v1 gta02v2 gta02v3 gta02v4" DEFAULT_PREFERENCE = "-1" @@ -18,6 +18,7 @@ SRC_URI = "\ svn://svn.openmoko.org/trunk/src/target/u-boot;module=patches;proto=http;name=patches \ file://uboot-eabi-fix-HACK.patch \ file://uboot-20070311-tools_makefile_ln_sf.patch;patch=1 \ + file://makefile-no-dirafter.patch;patch=1 \ " S = "${WORKDIR}/git" diff --git a/packages/uclibc/elf2flt_svn.bb b/packages/uclibc/elf2flt_svn.bb index ef142baf06..0fac49d468 100644 --- a/packages/uclibc/elf2flt_svn.bb +++ b/packages/uclibc/elf2flt_svn.bb @@ -9,7 +9,7 @@ SRC_URI = "svn://sources.blackfin.uclinux.org/toolchain/trunk;module=${PN}" S = "${WORKDIR}/${PN}" -EXTRA_OECONF = " --with-libbfd=${CROSS_DIR}/${TARGET_SYS}/lib/libbfd.a \ - --with-libiberty=${CROSS_DIR}/${TARGET_SYS}/lib/libiberty.a \ - --with-bfd-include-dir=${CROSS_DIR}/${TARGET_SYS}/include \ +EXTRA_OECONF = " --with-libbfd=${STAGING_DIR}/${TARGET_SYS}/lib/libbfd.a \ + --with-libiberty=${STAGING_DIR}/${TARGET_SYS}/lib/libiberty.a \ + --with-bfd-include-dir=${STAGING_DIR}/${TARGET_SYS}/include \ " diff --git a/packages/uicmoc/uicmoc4-native_4.3.1.bb b/packages/uicmoc/uicmoc4-native_4.3.1.bb index d2ddec77e3..df39a494b2 100644 --- a/packages/uicmoc/uicmoc4-native_4.3.1.bb +++ b/packages/uicmoc/uicmoc4-native_4.3.1.bb @@ -26,6 +26,7 @@ EXTRA_OECONF = "-prefix ${STAGING_DIR}/${BUILD_SYS}/qt4 \ EXTRA_OEMAKE = " " do_configure() { + sed -i 's:^QT += xml qt3support$:QT += xml qt3support network:' "${S}"/src/tools/uic3/uic3.pro echo yes | ./configure ${EXTRA_OECONF} || die "Configuring qt failed. EXTRA_OECONF was ${EXTRA_OECONF}" } diff --git a/packages/usbpath/.mtn2git_empty b/packages/usbpath/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/usbpath/.mtn2git_empty diff --git a/packages/usbpath/usbpath-native_svn.bb b/packages/usbpath/usbpath-native_svn.bb new file mode 100644 index 0000000000..3b5ef7bdcd --- /dev/null +++ b/packages/usbpath/usbpath-native_svn.bb @@ -0,0 +1,8 @@ +require usbpath_svn.bb +inherit native +DEPENDS = "libusb-native" + +do_stage () { + autotools_stage_all +} + diff --git a/packages/usbpath/usbpath_svn.bb b/packages/usbpath/usbpath_svn.bb new file mode 100644 index 0000000000..0a06477b9a --- /dev/null +++ b/packages/usbpath/usbpath_svn.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "Convert the physical locations of a USB device to/from its number" +AUTHOR = "Werner Almesberger <werner@openmoko.org>" +SECTION = "console/utils" +LICENSE = "GPL" +DEPENDS = "libusb" + +PV = "0.0+svnr${SRCREV}" + +SRC_URI = "svn://svn.openmoko.org/trunk/src/host;module=usbpath;proto=http" + +S = "${WORKDIR}/usbpath" + +inherit autotools + +do_stage () { + autotools_stage_all +} + diff --git a/packages/vlc/vlc-gpe_0.8.4.bb b/packages/vlc/vlc-gpe_0.8.4.bb index cd3ab47e2b..1bded75984 100644 --- a/packages/vlc/vlc-gpe_0.8.4.bb +++ b/packages/vlc/vlc-gpe_0.8.4.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://www.videolan.org" LICENSE = "GPL" PRIORITY = "optional" SECTION = "gpe" -PR = "r2" +PR = "r3" DEPENDS = "gtk+ freetype gnutls tremor faad2 ffmpeg flac liba52 libid3tag libmad mpeg2dec" @@ -11,8 +11,8 @@ SRC_URI = "http://download.videolan.org/pub/videolan/vlc/${PV}/vlc-${PV}.tar.gz file://pda-interface.patch;patch=1" S = "${WORKDIR}/vlc-${PV}" -export GTK2_CFLAGS = "`pkg-config --cflags gtk+-2.0 gthread-2.0`" -export GTK2_LIBS = "`pkg-config --libs gtk+-2.0 gthread-2.0`" +export GTK2_CFLAGS = "`${STAGING_BINDIR_NATIVE}/pkg-config --cflags gtk+-2.0 gthread-2.0`" +export GTK2_LIBS = "`${STAGING_BINDIR_NATIVE}/pkg-config --libs gtk+-2.0 gthread-2.0`" export vlc_WORKAROUNDLDFLAGS = "lib/libvlc.a" LDFLAGS_append = " -L${STAGING_LIBDIR} -lpostproc" diff --git a/packages/xserver-common/files/ghi270/.mtn2git_empty b/packages/xserver-common/files/ghi270/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/xserver-common/files/ghi270/.mtn2git_empty diff --git a/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/Xserver b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/Xserver index 489010a414..f7fe52d84e 100644 --- a/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/Xserver +++ b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/Xserver @@ -91,9 +91,9 @@ case `module_id` in modprobe mbxfb ARGS="$ARGS -br -fb /dev/fb1" ;; "GTA01" | "GTA02") - ARGS="$ARGS -dpi 285 -screen 480x640 -hide-cursor -root-ppm /usr/share/pixmaps/xsplash.ppm" ;; + ARGS="$ARGS -dpi 285 -screen 480x640 -hide-cursor -root-ppm /usr/share/pixmaps/xsplash-vga.ppm" ;; "Motorola Ezx Platform") - ARGS="$ARGS -dpi 170 -screen 240x320 -hide-cursor -root-ppm /usr/share/pixmaps/xsplash.ppm" ;; + ARGS="$ARGS -dpi 170 -screen 240x320 -hide-cursor -root-ppm /usr/share/pixmaps/xsplash-qvga.ppm" ;; "Nokia N800") ARGS="$ARGS -br -dpi 225 -screen 800x480x16 -mouse tslib" ;; *) diff --git a/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-qvga.ppm b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-qvga.ppm Binary files differnew file mode 100644 index 0000000000..88df5e5476 --- /dev/null +++ b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-qvga.ppm diff --git a/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-vga.ppm b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-vga.ppm Binary files differnew file mode 100644 index 0000000000..90eb056056 --- /dev/null +++ b/packages/xserver-kdrive-common/xserver-kdrive-common/openmoko/xsplash-vga.ppm diff --git a/packages/xserver-kdrive-common/xserver-kdrive-common_0.1.bb b/packages/xserver-kdrive-common/xserver-kdrive-common_0.1.bb index 9329cd2e52..e85e4f0ce9 100644 --- a/packages/xserver-kdrive-common/xserver-kdrive-common_0.1.bb +++ b/packages/xserver-kdrive-common/xserver-kdrive-common_0.1.bb @@ -2,7 +2,7 @@ DESCRIPTION = "Common X11 scripts" LICENSE = "GPL" SECTION = "x11" RDEPENDS_${PN} = "xmodmap libxrandr xdpyinfo xtscal xinit" -PR = "r18" +PR = "r20" SRC_URI = "\ file://Xdefaults \ @@ -15,6 +15,11 @@ SRC_URI = "\ file://90xXWindowManager \ " +SRC_URI_append_openmoko = "\ + file://xsplash-vga.ppm \ + file://xsplash-qvga.ppm \ +" + etcFiles = "\ Xdefaults \ Xinit \ @@ -29,8 +34,6 @@ sessionFiles = "\ S = "${WORKDIR}" -PACKAGE_ARCH = "all" - do_install() { install -d ${D}/${sysconfdir}/X11/Xsession.d for i in ${etcFiles}; do @@ -39,4 +42,14 @@ do_install() { for i in ${sessionFiles}; do install -m 0755 ${WORKDIR}/$i ${D}/${sysconfdir}/X11/Xsession.d/ done + + # branding-foo. yes, /usr/share/pixmaps is hardcoded here, since it's + # also hardcoded in the Xserver script... + if [ "x${DISTRO}" = "xopenmoko" ]; then + install -d ${D}/usr/share/pixmaps + install -m 0755 ${WORKDIR}/*.ppm ${D}/usr/share/pixmaps + fi } + +PACKAGE_ARCH = "all" + |