diff --git a/config/functions b/config/functions index 8ba7129c93..fba0f2defc 100644 --- a/config/functions +++ b/config/functions @@ -358,7 +358,6 @@ fi config_message="$config_message\n $dashes$dashes" config_message="$config_message\n - XBMC version:\t\t\t $MEDIACENTER" - config_message="$config_message\n - XBMC PVR/DVB support:\t\t $PVR" config_message="$config_message\n - XBMC nonfree support:\t\t $NONFREE_SUPPORT" config_message="$config_message\n - XBMC DVDCSS support:\t\t\t $DVDCSS_SUPPORT" diff --git a/config/options b/config/options index 04cb2be9ee..f1ad3221ba 100644 --- a/config/options +++ b/config/options @@ -9,9 +9,6 @@ else PROJECT="$PROJECT" fi -# you are a noob: 'Yes' is not 'yes' :) -PVR=`echo $PVR | tr A-Z a-z` - # determines TARGET_ARCH, if not forced by user (i386 / x86_64 / arm) # default is i386 if [ -z "$ARCH" ]; then diff --git a/packages/3rdparty/multimedia/vdr-control/patches/vdr-control-0.0.2a-95_vdr-crash-fix.patch b/packages/3rdparty/multimedia/vdr-control/patches/vdr-control-0.0.2a-95_vdr-crash-fix.patch new file mode 100644 index 0000000000..9ae0c7a052 --- /dev/null +++ b/packages/3rdparty/multimedia/vdr-control/patches/vdr-control-0.0.2a-95_vdr-crash-fix.patch @@ -0,0 +1,28 @@ +diff -Nru control-0.0.2a-kw3/control.c control-0.0.2a-kw3_0/control.c +--- control-0.0.2a-kw3/control.c 2008-09-26 16:19:29.000000000 +0200 ++++ control-0.0.2a-kw3_0/control.c 2012-08-04 12:17:08.000000000 +0200 +@@ -32,6 +32,7 @@ + class cPluginControl : public cPlugin { + private: + // Add any member variables or functions you may need here. ++ cCtrlState* _pState; + cCtrlGateways* _pReceivers; + cCtrlGateway* _pTerminal; + +@@ -67,6 +68,7 @@ + cPluginControl::~cPluginControl() + { + // Clean up after yourself! ++ delete(_pState); + delete(_pReceivers); + delete(_pTerminal); + } +@@ -120,7 +122,7 @@ + // Start any background activities the plugin shall perform. + + if (glParPort || glParTerminal && *glParTerminal) +- new cCtrlState(); ++ _pState = new cCtrlState(); + + if (glParPort) { + _pReceivers = new cCtrlGateways(); diff --git a/packages/addons/driver/hdhomerun/changelog.txt b/packages/addons/driver/hdhomerun/changelog.txt index 47d1ad8101..fc64fd9c6d 100644 --- a/packages/addons/driver/hdhomerun/changelog.txt +++ b/packages/addons/driver/hdhomerun/changelog.txt @@ -1,3 +1,6 @@ +2.1.3 +- bump addon version for new kernel + 2.1.2 - dvbhdhomerun upgraded to 0.0.10 diff --git a/packages/addons/driver/hdhomerun/meta b/packages/addons/driver/hdhomerun/meta index bc9d4b032c..0574213db7 100644 --- a/packages/addons/driver/hdhomerun/meta +++ b/packages/addons/driver/hdhomerun/meta @@ -20,7 +20,7 @@ PKG_NAME="hdhomerun" PKG_VERSION="2.0" -PKG_REV="2" +PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.silicondust.com/products/hdhomerun/dvbt/" diff --git a/packages/addons/service/multimedia/hts-tvheadend/addon b/packages/addons/service/multimedia/hts-tvheadend/addon index 1275f495fb..839093f68d 100755 --- a/packages/addons/service/multimedia/hts-tvheadend/addon +++ b/packages/addons/service/multimedia/hts-tvheadend/addon @@ -28,4 +28,4 @@ mkdir -p $ADDON_BUILD/$PKG_ADDON_ID cp -PR $PKG_DIR/config/dvr-config $ADDON_BUILD/$PKG_ADDON_ID/dvr-config mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin - cp -P $PKG_BUILD/build.linux/tvheadend $ADDON_BUILD/$PKG_ADDON_ID/bin/tvheadend + cp -P $PKG_BUILD/build.linux/tvheadend.bundle $ADDON_BUILD/$PKG_ADDON_ID/bin/tvheadend diff --git a/packages/addons/service/multimedia/hts-tvheadend/build b/packages/addons/service/multimedia/hts-tvheadend/build index 17499cc211..881643a2e7 100755 --- a/packages/addons/service/multimedia/hts-tvheadend/build +++ b/packages/addons/service/multimedia/hts-tvheadend/build @@ -34,7 +34,7 @@ cd $PKG_BUILD --arch=$TARGET_ARCH \ --cpu=$TARGET_CPU \ --cc=$TARGET_CC \ - --enable-bundle \ --release make +make build.linux/tvheadend.bundle diff --git a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt index 3be7fbace0..d0888f1041 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt +++ b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt @@ -1,5 +1,4 @@ -2.1.4 -- update to hts-tvheadend-7630970 +2.1.5 - add an option to wait for more than 1 adapters to appear 2.1.3 diff --git a/packages/addons/service/multimedia/hts-tvheadend/meta b/packages/addons/service/multimedia/hts-tvheadend/meta index 50305002b1..b20e70d607 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/meta +++ b/packages/addons/service/multimedia/hts-tvheadend/meta @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="hts-tvheadend" -PKG_VERSION="7630970" -PKG_REV="4" +PKG_VERSION="78213a0" +PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.lonelycoder.com/hts/tvheadend_overview.html" diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch new file mode 100644 index 0000000000..e8c6050515 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch @@ -0,0 +1,55 @@ +diff -Naur hts-tvheadend-c88a646/src/linuxtv_muxes.h hts-tvheadend-c88a646.patch/src/linuxtv_muxes.h +--- hts-tvheadend-c88a646/src/linuxtv_muxes.h 2011-09-26 20:18:12.000000000 +0200 ++++ hts-tvheadend-c88a646.patch/src/linuxtv_muxes.h 2011-10-18 13:40:37.768853992 +0200 +@@ -12001,6 +12001,39 @@ + { .freq = 573000000, .symrate = 5217000, .fec = 0, .constellation = 5}, + }; + ++static const struct mux muxes_DVBC_ch_GA_Weissenstein[] = { ++ { .freq = 450000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 506000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 514000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 522000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 530000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 538000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 554000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 562000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 570000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 578000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 586000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 594000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 602000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 610000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 618000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 626000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 634000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 642000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 650000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 658000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 666000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 674000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 682000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 690000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 698000000, .symrate = 6900000, .fec = 0, .constellation = 3}, ++ { .freq = 698000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 706000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 714000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 722000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 730000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++}; ++ + static const struct mux muxes_DVBC_ch_Rega_Sense[] = { + { .freq = 434000000, .symrate = 6900000, .fec = 0, .constellation = 3}, + { .freq = 714000000, .symrate = 6900000, .fec = 0, .constellation = 3}, +@@ -12881,6 +12914,11 @@ + + static const struct network networks_DVBC_ch[] = { + { ++ .name = "GA-Weissenstein", ++ .muxes = muxes_DVBC_ch_GA_Weissenstein, ++ .nmuxes = sizeof(muxes_DVBC_ch_GA_Weissenstein) / sizeof(struct mux), ++ }, ++ { + .name = "Rega-Sense", + .muxes = muxes_DVBC_ch_Rega_Sense, + .nmuxes = sizeof(muxes_DVBC_ch_Rega_Sense) / sizeof(struct mux), diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-0f3c6f7-091-cwc-connection-attempt.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-091-cwc-connection-attempt.patch similarity index 100% rename from packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-0f3c6f7-091-cwc-connection-attempt.patch rename to packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-091-cwc-connection-attempt.patch diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch new file mode 100644 index 0000000000..17358b08b3 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch @@ -0,0 +1,146 @@ +From 3b407aa2053b1db3316873acd05c64319676eb34 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= +Date: Fri, 30 Sep 2011 12:56:01 +0200 +Subject: [PATCH 1/2] Deliver raw teletext to clients that are able to display + it (e.g. XBMC) + +--- + src/parsers.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/tsdemux.c | 7 +++---- + 2 files changed, 58 insertions(+), 4 deletions(-) + +diff --git a/src/parsers.c b/src/parsers.c +index 9b7337d..68c7996 100644 +--- a/src/parsers.c ++++ b/src/parsers.c +@@ -102,6 +102,9 @@ static void parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data + static void parse_subtitles(service_t *t, elementary_stream_t *st, + const uint8_t *data, int len, int start); + ++static void parse_teletext(service_t *t, elementary_stream_t *st, ++ const uint8_t *data, int len, int start); ++ + static int parse_mpa(service_t *t, elementary_stream_t *st, size_t len, + uint32_t next_startcode, int sc_offset); + +@@ -158,6 +161,10 @@ static int parse_pes_header(service_t *t, elementary_stream_t *st, + parse_aac(t, st, data, len, start); + break; + ++ case SCT_TELETEXT: ++ parse_teletext(t, st, data, len, start); ++ break; ++ + default: + break; + } +@@ -1232,6 +1239,54 @@ static int parse_pes_header(service_t *t, elementary_stream_t *st, + } + } + ++/** ++ * Teletext parser ++ */ ++static void ++parse_teletext(service_t *t, elementary_stream_t *st, const uint8_t *data, ++ int len, int start) ++{ ++ th_pkt_t *pkt; ++ int psize, hlen; ++ const uint8_t *buf; ++ const uint8_t *d; ++ if(start) { ++ st->es_parser_state = 1; ++ st->es_buf.sb_err = 0; ++ st->es_parser_ptr = 0; ++ sbuf_reset(&st->es_buf); ++ } ++ ++ if(st->es_parser_state == 0) ++ return; ++ ++ sbuf_append(&st->es_buf, data, len); ++ ++ if(st->es_buf.sb_ptr < 6) ++ return; ++ d = st->es_buf.sb_data; ++ ++ psize = d[4] << 8 | d[5]; ++ ++ if(st->es_buf.sb_ptr != psize + 6) ++ return; ++ ++ st->es_parser_state = 0; ++ ++ hlen = parse_pes_header(t, st, d + 6, st->es_buf.sb_ptr - 6); ++ if(hlen < 0) ++ return; ++ ++ psize -= hlen; ++ buf = d + 6 + hlen; ++ ++ if(psize >= 46) { ++ ++ pkt = pkt_alloc(buf, psize, st->es_curpts, st->es_curdts); ++ pkt->pkt_commercial = t->s_tt_commercial_advice; ++ parser_deliver(t, st, pkt); ++ } ++} + + /** + * +diff --git a/src/tsdemux.c b/src/tsdemux.c +index 897fe1d..5fdaf8b 100644 +--- a/src/tsdemux.c ++++ b/src/tsdemux.c +@@ -110,11 +110,10 @@ + got_section, st); + break; + +- case SCT_TELETEXT: +- teletext_input(t, st, tsb); +- break; +- + default: ++ if(st->es_type == SCT_TELETEXT) ++ teletext_input(t, st, tsb); ++ + if(off > 188) + break; + +-- +1.7.5.4 + + +From a8026cd5b412c5096b0904f060ad5ffccdb883cf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= +Date: Thu, 17 Nov 2011 08:25:31 +0100 +Subject: [PATCH 2/2] Disable teletext recording to prevent issues with other + elementary streams. Temporary until a better solution + is found. + +--- + src/plumbing/globalheaders.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/src/plumbing/globalheaders.c b/src/plumbing/globalheaders.c +index 703591b..7f183d4 100644 +--- a/src/plumbing/globalheaders.c ++++ b/src/plumbing/globalheaders.c +@@ -202,6 +202,12 @@ + pkt->pkt_componentindex); + assert(ssc != NULL); + ++ if(ssc->ssc_type == SCT_TELETEXT) { ++ free(sm); ++ ssc->ssc_disabled = 1; ++ break; ++ } ++ + pkt = convertpkt(ssc, pkt); + + apply_header(ssc, pkt); +-- +1.7.5.4 + + diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch new file mode 100644 index 0000000000..67810ef2d8 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch @@ -0,0 +1,257 @@ +From bb048589ab4e09e69b2fba3f639e8287ea9cc7c3 Mon Sep 17 00:00:00 2001 +From: Tadej Novak +Date: Thu, 26 Jan 2012 18:39:09 +0100 +Subject: [PATCH 1/2] IPTV Radio support + +Added service type for IPTV and IPTV radio for easier access in +some software (like XBMC). +--- + src/iptv_input.c | 6 ++++++ + src/service.c | 9 +++++++-- + src/service.h | 2 ++ + src/webui/extjs.c | 10 +++++++++- + src/webui/static/app/iptv.js | 11 +++++++++-- + 5 files changed, 33 insertions(+), 5 deletions(-) + +diff --git a/src/iptv_input.c b/src/iptv_input.c +index 0bfc311..361a151 100644 +--- a/src/iptv_input.c ++++ b/src/iptv_input.c +@@ -428,6 +428,7 @@ + inet_ntop(AF_INET6, &t->s_iptv_group6, abuf6, sizeof(abuf6)); + htsmsg_add_str(m, "group", abuf6); + } ++ htsmsg_add_u32(m, "radio", t->s_servicetype == ST_IPTV_RADIO); + if(t->s_ch != NULL) { + htsmsg_add_str(m, "channelname", t->s_ch->ch_name); + htsmsg_add_u32(m, "mapped", 1); +@@ -591,6 +592,11 @@ + if(!htsmsg_get_u32(c, "port", &u32)) + t->s_iptv_port = u32; + ++ if(!htsmsg_get_u32(c, "radio", &u32) && u32) ++ t->s_servicetype = ST_IPTV_RADIO; ++ else ++ t->s_servicetype = ST_IPTV; ++ + pthread_mutex_lock(&t->s_stream_mutex); + service_make_nicename(t); + psi_load_service_settings(c, t); +diff --git a/src/service.c b/src/service.c +index 1a405d1..6899e2e 100644 +--- a/src/service.c ++++ b/src/service.c +@@ -732,6 +732,8 @@ + { "HDTV", ST_HDTV }, + { "SDTV-AC", ST_AC_SDTV }, + { "HDTV-AC", ST_AC_HDTV }, ++ { "IPTV", ST_IPTV }, ++ { "IPTV Radio", ST_IPTV_RADIO }, + }; + + const char * +@@ -750,7 +752,8 @@ + t->s_servicetype == ST_SDTV || + t->s_servicetype == ST_HDTV || + t->s_servicetype == ST_AC_SDTV || +- t->s_servicetype == ST_AC_HDTV; ++ t->s_servicetype == ST_AC_HDTV || ++ t->s_servicetype == ST_IPTV; + } + + /** +@@ -759,7 +762,9 @@ + int + service_is_radio(service_t *t) + { +- return t->s_servicetype == ST_RADIO; ++ return ++ t->s_servicetype == ST_RADIO || ++ t->s_servicetype == ST_IPTV_RADIO; + } + + /** +diff --git a/src/service.h b/src/service.h +index 2185e42..186278d 100644 +--- a/src/service.h ++++ b/src/service.h +@@ -318,6 +318,8 @@ typedef void (pid_section_callback_t)(struct service *t, + ST_HDTV = 0x11, /* HDTV (MPEG2) */ + ST_AC_SDTV = 0x16, /* Advanced codec SDTV */ + ST_AC_HDTV = 0x19, /* Advanced codec HDTV */ ++ ST_IPTV = 0x30, /* IPTV */ ++ ST_IPTV_RADIO = 0x31, /* Radio over IPTV */ + } s_servicetype; + + +diff --git a/src/webui/extjs.c b/src/webui/extjs.c +index 3ed9f8b..4596005 100644 +--- a/src/webui/extjs.c ++++ b/src/webui/extjs.c +@@ -1313,7 +1313,14 @@ + } + save = 1; + } +- ++ if(!htsmsg_get_u32(c, "radio", &u32)) { ++ if(u32) ++ t->s_servicetype = ST_IPTV_RADIO; ++ else ++ t->s_servicetype = ST_IPTV; ++ save = 1; ++ } ++ + + save |= tvh_str_update(&t->s_iptv_iface, htsmsg_get_str(c, "interface")); + if(save) +@@ -1347,6 +1354,7 @@ + } + + htsmsg_add_u32(r, "port", t->s_iptv_port); ++ htsmsg_add_u32(r, "radio", t->s_servicetype == ST_IPTV_RADIO); + htsmsg_add_u32(r, "enabled", t->s_enabled); + return r; + } +diff --git a/src/webui/static/app/iptv.js b/src/webui/static/app/iptv.js +index acdbfc0..b29e0b9 100644 +--- a/src/webui/static/app/iptv.js ++++ b/src/webui/static/app/iptv.js +@@ -11,6 +11,12 @@ tvheadend.iptv = function(adapterId) { + width: 45 + }); + ++ var radioColumn = new Ext.grid.CheckColumn({ ++ header: "Radio", ++ dataIndex: 'radio', ++ width: 45 ++ }); ++ + var actions = new Ext.ux.grid.RowActions({ + header:'', + dataIndex: 'actions', +@@ -82,6 +88,7 @@ tvheadend.iptv = function(adapterId) { + maxValue: 65535 + }) + }, ++ radioColumn, + { + header: "Service ID", + dataIndex: 'sid', +@@ -105,7 +112,7 @@ tvheadend.iptv = function(adapterId) { + cm.defaultSortable = true; + + var rec = Ext.data.Record.create([ +- 'id', 'enabled', 'channelname', 'interface', 'group', 'port', ++ 'id', 'enabled', 'channelname', 'interface', 'group', 'port', 'radio', + 'sid', 'pmt', 'pcr' + ]); + +@@ -246,7 +253,7 @@ tvheadend.iptv = function(adapterId) { + stripeRows: true, + title: 'IPTV', + iconCls: 'iptv', +- plugins: [enabledColumn, actions], ++ plugins: [enabledColumn, radioColumn, actions], + store: store, + clicksToEdit: 2, + cm: cm, +-- +1.7.5.4 + + +From 18473dd11d983aecb6db6e49b454a5d6bb1a329f Mon Sep 17 00:00:00 2001 +From: Tadej Novak +Date: Mon, 30 Jan 2012 16:55:25 +0100 +Subject: [PATCH 2/2] Use the same service type for all radio types + +Tvheadend now uses same radio type ST_RADIO for DVB and IPTV radios. +Otherwise IPTV streams have ST_IPTV type. +--- + src/iptv_input.c | 4 ++-- + src/service.c | 5 +---- + src/service.h | 1 - + src/webui/extjs.c | 4 ++-- + 4 files changed, 5 insertions(+), 9 deletions(-) + +diff --git a/src/iptv_input.c b/src/iptv_input.c +index 361a151..aeb0ab2 100644 +--- a/src/iptv_input.c ++++ b/src/iptv_input.c +@@ -428,7 +428,7 @@ + inet_ntop(AF_INET6, &t->s_iptv_group6, abuf6, sizeof(abuf6)); + htsmsg_add_str(m, "group", abuf6); + } +- htsmsg_add_u32(m, "radio", t->s_servicetype == ST_IPTV_RADIO); ++ htsmsg_add_u32(m, "radio", t->s_servicetype == ST_RADIO); + if(t->s_ch != NULL) { + htsmsg_add_str(m, "channelname", t->s_ch->ch_name); + htsmsg_add_u32(m, "mapped", 1); +@@ -593,7 +593,7 @@ + t->s_iptv_port = u32; + + if(!htsmsg_get_u32(c, "radio", &u32) && u32) +- t->s_servicetype = ST_IPTV_RADIO; ++ t->s_servicetype = ST_RADIO; + else + t->s_servicetype = ST_IPTV; + +diff --git a/src/service.c b/src/service.c +index 6899e2e..015cd46 100644 +--- a/src/service.c ++++ b/src/service.c +@@ -733,7 +733,6 @@ + { "SDTV-AC", ST_AC_SDTV }, + { "HDTV-AC", ST_AC_HDTV }, + { "IPTV", ST_IPTV }, +- { "IPTV Radio", ST_IPTV_RADIO }, + }; + + const char * +@@ -762,9 +761,7 @@ + int + service_is_radio(service_t *t) + { +- return +- t->s_servicetype == ST_RADIO || +- t->s_servicetype == ST_IPTV_RADIO; ++ return t->s_servicetype == ST_RADIO; + } + + /** +diff --git a/src/service.h b/src/service.h +index 186278d..40d1174 100644 +--- a/src/service.h ++++ b/src/service.h +@@ -319,7 +319,6 @@ typedef void (pid_section_callback_t)(struct service *t, + ST_AC_SDTV = 0x16, /* Advanced codec SDTV */ + ST_AC_HDTV = 0x19, /* Advanced codec HDTV */ + ST_IPTV = 0x30, /* IPTV */ +- ST_IPTV_RADIO = 0x31, /* Radio over IPTV */ + } s_servicetype; + + +diff --git a/src/webui/extjs.c b/src/webui/extjs.c +index 4596005..4487deb 100644 +--- a/src/webui/extjs.c ++++ b/src/webui/extjs.c +@@ -1315,7 +1315,7 @@ + } + if(!htsmsg_get_u32(c, "radio", &u32)) { + if(u32) +- t->s_servicetype = ST_IPTV_RADIO; ++ t->s_servicetype = ST_RADIO; + else + t->s_servicetype = ST_IPTV; + save = 1; +@@ -1354,7 +1354,7 @@ + } + + htsmsg_add_u32(r, "port", t->s_iptv_port); +- htsmsg_add_u32(r, "radio", t->s_servicetype == ST_IPTV_RADIO); ++ htsmsg_add_u32(r, "radio", t->s_servicetype == ST_RADIO); + htsmsg_add_u32(r, "enabled", t->s_enabled); + return r; + } +-- +1.7.5.4 + diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch new file mode 100644 index 0000000000..0403fa1951 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch @@ -0,0 +1,18 @@ +Author: Adam Sutton +Date: Sun Jul 29 20:37:00 2012 +0100 + + Fix false trigger of uninit var, detected using gcc v4.7.1 (compiling openelec tvh add-on), reported by seo. + +diff --git a/src/htsp.c b/src/htsp.c +index b9fc3e1..ae5bd51 100644 +--- a/src/htsp.c ++++ b/src/htsp.c +@@ -1160,7 +1160,7 @@ htsp_read_message(htsp_connection_t *htsp, htsmsg_t **mp, int timeout) + static int + htsp_read_loop(htsp_connection_t *htsp) + { +- htsmsg_t *m, *reply; ++ htsmsg_t *m = NULL, *reply; + int r, i; + const char *method; + diff --git a/packages/addons/service/softcam/oscam/addon b/packages/addons/service/softcam/oscam/addon index aeea0fff59..5c1d47b448 100755 --- a/packages/addons/service/softcam/oscam/addon +++ b/packages/addons/service/softcam/oscam/addon @@ -23,6 +23,9 @@ . config/options $1 +mkdir -p $ADDON_BUILD/$PKG_ADDON_ID + cp -PR $PKG_DIR/config/settings.xml $ADDON_BUILD/$PKG_ADDON_ID/settings-default.xml + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin cp -P $PKG_BUILD/build/oscam $ADDON_BUILD/$PKG_ADDON_ID/bin cp -PR $PKG_DIR/config/oscam.conf $ADDON_BUILD/$PKG_ADDON_ID/oscam-default.conf diff --git a/packages/addons/service/softcam/oscam/changelog.txt b/packages/addons/service/softcam/oscam/changelog.txt index 94d205df14..c911ff2eac 100644 --- a/packages/addons/service/softcam/oscam/changelog.txt +++ b/packages/addons/service/softcam/oscam/changelog.txt @@ -1,3 +1,6 @@ +2.1.7 +- add option to restart on suspend / resume + 2.1.6 - update to oscam-7168 diff --git a/packages/addons/service/softcam/oscam/config/settings.xml b/packages/addons/service/softcam/oscam/config/settings.xml new file mode 100644 index 0000000000..464b4519ec --- /dev/null +++ b/packages/addons/service/softcam/oscam/config/settings.xml @@ -0,0 +1,4 @@ + + + + diff --git a/packages/addons/service/softcam/oscam/meta b/packages/addons/service/softcam/oscam/meta index 9024d4bf15..acde24e322 100644 --- a/packages/addons/service/softcam/oscam/meta +++ b/packages/addons/service/softcam/oscam/meta @@ -21,7 +21,7 @@ PKG_NAME="oscam" PKG_VERSION="7168" -PKG_REV="6" +PKG_REV="7" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://streamboard.gmc.to/wiki/index.php/OSCam/en" diff --git a/packages/addons/service/softcam/oscam/source/bin/oscam.start b/packages/addons/service/softcam/oscam/source/bin/oscam.start index 2f6f3904a3..c46241aad8 100755 --- a/packages/addons/service/softcam/oscam/source/bin/oscam.start +++ b/packages/addons/service/softcam/oscam/source/bin/oscam.start @@ -35,6 +35,7 @@ if [ ! "$(pidof oscam)" ]; then ADDON_HOME="$HOME/.xbmc/userdata/addon_data/service.softcam.oscam" ADDON_LOG_DIR="$ADDON_HOME/log" + ADDON_SETTINGS="$ADDON_HOME/settings.xml" ADDON_CONF_DIR="$ADDON_HOME/config" ADDON_CONF="$ADDON_CONF_DIR/oscam.conf" ADDON_CONF_AC="$ADDON_CONF_DIR/oscam.ac" @@ -71,6 +72,10 @@ if [ ! "$(pidof oscam)" ]; then touch $ADDON_CONF_TIERS touch $ADDON_CONF_USER + if [ ! -f "$ADDON_SETTINGS" ]; then + cp $ADDON_DIR/settings-default.xml $ADDON_SETTINGS + fi + # Restart process if it terminates. if [ -f "$LOCKDIR/$LOCKFILE" ] ; then rm -rf "$LOCKDIR/$LOCKFILE" diff --git a/packages/addons/service/softcam/oscam/source/resources/language/English/strings.xml b/packages/addons/service/softcam/oscam/source/resources/language/English/strings.xml new file mode 100644 index 0000000000..d388c262c1 --- /dev/null +++ b/packages/addons/service/softcam/oscam/source/resources/language/English/strings.xml @@ -0,0 +1,5 @@ + + + General + Restart on suspend / resume + diff --git a/packages/addons/service/softcam/oscam/source/resources/settings.xml b/packages/addons/service/softcam/oscam/source/resources/settings.xml new file mode 100644 index 0000000000..41355ffc6b --- /dev/null +++ b/packages/addons/service/softcam/oscam/source/resources/settings.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/mediacenter/xbmc-rpi/sleep.d/99_reload_skin b/packages/addons/service/softcam/oscam/source/sleep.d/oscam.power old mode 100755 new mode 100644 similarity index 60% rename from packages/mediacenter/xbmc-rpi/sleep.d/99_reload_skin rename to packages/addons/service/softcam/oscam/source/sleep.d/oscam.power index eb3a3dce07..c2db86d947 --- a/packages/mediacenter/xbmc-rpi/sleep.d/99_reload_skin +++ b/packages/addons/service/softcam/oscam/source/sleep.d/oscam.power @@ -22,10 +22,30 @@ . /etc/profile -case "$1" in - thaw|resume) - xbmc-send --host=127.0.0.1 -a "ReloadSkin()" & - ;; - *) exit $NA - ;; -esac +ADDON_HOME="$HOME/.xbmc/userdata/addon_data/service.softcam.oscam" +ADDON_SETTINGS="$ADDON_HOME/settings.xml" +RESTART_ON_RESUME=`grep RESTART_ON_RESUME $ADDON_SETTINGS | awk '{print $3}' | sed -e "s,value=,," -e "s,\",,g"` + +LOCKFILE="/var/lock/oscam.sleep" + +if [ "$RESTART_ON_RESUME" == "true" ] ; then + case "$1" in + hibernate|suspend) + if [ "$(pidof oscam)" ];then + progress "Shutting down oscam for suspending..." + oscam.stop + touch $LOCKFILE + fi + ;; + + thaw|resume) + progress "Restarting oscam for wakeup..." + if [ -f "$LOCKFILE" ] ; then + rm -rf "$LOCKFILE" + oscam.start + fi + ;; + *) exit $NA + ;; + esac +fi diff --git a/packages/databases/mysql/meta b/packages/databases/mysql/meta index b3541251a3..ea7076e863 100644 --- a/packages/databases/mysql/meta +++ b/packages/databases/mysql/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="mysql" -PKG_VERSION="5.1.63" +PKG_VERSION="5.1.65" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPL" diff --git a/packages/databases/mysql/patches/mysql-5.1.63-010_crosscompiling.patch b/packages/databases/mysql/patches/mysql-5.1.65-010_crosscompiling.patch similarity index 100% rename from packages/databases/mysql/patches/mysql-5.1.63-010_crosscompiling.patch rename to packages/databases/mysql/patches/mysql-5.1.65-010_crosscompiling.patch diff --git a/packages/debug/gdb/meta b/packages/debug/gdb/meta index d411673cb9..f8a6f27f33 100644 --- a/packages/debug/gdb/meta +++ b/packages/debug/gdb/meta @@ -19,13 +19,13 @@ ################################################################################ PKG_NAME="gdb" -PKG_VERSION="7.4.50.20120716" +PKG_VERSION="7.5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/gdb/" -#PKG_URL="http://ftp.gnu.org/gnu/gdb/$PKG_NAME-$PKG_VERSION.tar.bz2" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" +PKG_URL="http://ftp.gnu.org/gnu/gdb/$PKG_NAME-$PKG_VERSION.tar.bz2" +#PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="zlib ncurses expat" PKG_BUILD_DEPENDS="toolchain zlib ncurses expat" PKG_PRIORITY="optional" diff --git a/packages/graphics/bcm2835-driver/meta b/packages/graphics/bcm2835-driver/meta index dccbbb7947..14fca005e8 100644 --- a/packages/graphics/bcm2835-driver/meta +++ b/packages/graphics/bcm2835-driver/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bcm2835-driver" -PKG_VERSION="cb9513f" +PKG_VERSION="790681a" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="nonfree" diff --git a/packages/graphics/glew/meta b/packages/graphics/glew/meta index 286065b2c7..47b37702d5 100644 --- a/packages/graphics/glew/meta +++ b/packages/graphics/glew/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="glew" -PKG_VERSION="1.8.0" +PKG_VERSION="1.9.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD" diff --git a/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch b/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch deleted file mode 100644 index 4fac7bebbf..0000000000 --- a/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -Naur glew-1.7.0/config/Makefile.linux glew-1.7.0.patch/config/Makefile.linux ---- glew-1.7.0/config/Makefile.linux 2011-08-25 16:17:55.000000000 +0200 -+++ glew-1.7.0.patch/config/Makefile.linux 2012-01-27 18:52:20.764675791 +0100 -@@ -1,15 +1,7 @@ - NAME = $(GLEW_NAME) --CC = cc --LD = cc - PICFLAG = -fPIC - M_ARCH ?= $(shell uname -m) --ifeq (x86_64,${M_ARCH}) --LDFLAGS.EXTRA = -L/usr/X11R6/lib64 --LIBDIR = $(GLEW_DEST)/lib64 --else --LDFLAGS.EXTRA = -L/usr/X11R6/lib - LIBDIR = $(GLEW_DEST)/lib --endif - LDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11 - LDFLAGS.STATIC = -Wl,-Bstatic - LDFLAGS.DYNAMIC = -Wl,-Bdynamic -diff -Naur glew-1.7.0/Makefile glew-1.7.0.patch/Makefile ---- glew-1.7.0/Makefile 2012-01-27 18:50:02.004347735 +0100 -+++ glew-1.7.0.patch/Makefile 2012-01-27 18:50:27.970848891 +0100 -@@ -56,7 +56,7 @@ - - AR = ar - INSTALL = install --STRIP = strip -+STRIP ?= strip - RM = rm -f - LN = ln -sf - ifeq ($(MAKECMDGOALS), debug) diff --git a/packages/linux/patches/linux-3.2.28-214-hdtv-hvr930c.patch b/packages/linux/patches/linux-3.2.28-214-hdtv-hvr930c.patch new file mode 100644 index 0000000000..e84c2495ee --- /dev/null +++ b/packages/linux/patches/linux-3.2.28-214-hdtv-hvr930c.patch @@ -0,0 +1,389 @@ +From 8ab3362665a699bd54fc489ff7fb6372678b94c1 Mon Sep 17 00:00:00 2001 +From: Holger Nelson +Date: Wed, 28 Dec 2011 18:55:41 -0300 +Subject: [PATCH] [media] em28xx: Reworked probe code to get rid of some hacks + +Reworked device probing to get rid of hacks to guess the maximum size of +dvb iso transfer packets. The new code also selects the first alternate +config which supports the largest possible iso transfers for dvb. + +[mchehab@redhat.com: Fix a few checkpatch.pl CodingStyle compliants] +Signed-off-by: Holger Nelson +Signed-off-by: Mauro Carvalho Chehab +--- + drivers/media/video/em28xx/em28xx-audio.c | 2 +- + drivers/media/video/em28xx/em28xx-cards.c | 148 ++++++++++++++--------------- + drivers/media/video/em28xx/em28xx-core.c | 59 +----------- + drivers/media/video/em28xx/em28xx-dvb.c | 4 +- + drivers/media/video/em28xx/em28xx-reg.h | 5 + + drivers/media/video/em28xx/em28xx.h | 2 + + 6 files changed, 84 insertions(+), 136 deletions(-) + +diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c +index cff0768..e2a7b77 100644 +--- a/drivers/media/video/em28xx/em28xx-audio.c ++++ b/drivers/media/video/em28xx/em28xx-audio.c +@@ -193,7 +193,7 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) + + urb->dev = dev->udev; + urb->context = dev; +- urb->pipe = usb_rcvisocpipe(dev->udev, 0x83); ++ urb->pipe = usb_rcvisocpipe(dev->udev, EM28XX_EP_AUDIO); + urb->transfer_flags = URB_ISO_ASAP; + urb->transfer_buffer = dev->adev.transfer_buffer[i]; + urb->interval = 1; +diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c +index b95e661..0adaf84 100644 +--- a/drivers/media/video/em28xx/em28xx-cards.c ++++ b/drivers/media/video/em28xx/em28xx-cards.c +@@ -3111,12 +3111,11 @@ unregister_dev: + static int em28xx_usb_probe(struct usb_interface *interface, + const struct usb_device_id *id) + { +- const struct usb_endpoint_descriptor *endpoint; + struct usb_device *udev; + struct em28xx *dev = NULL; + int retval; +- bool is_audio_only = false, has_audio = false; +- int i, nr, isoc_pipe; ++ bool has_audio = false, has_video = false, has_dvb = false; ++ int i, nr; + const int ifnum = interface->altsetting[0].desc.bInterfaceNumber; + char *speed; + char descr[255] = ""; +@@ -3148,54 +3147,65 @@ static int em28xx_usb_probe(struct usb_interface *interface, + goto err; + } + ++ /* allocate memory for our device state and initialize it */ ++ dev = kzalloc(sizeof(*dev), GFP_KERNEL); ++ if (dev == NULL) { ++ em28xx_err(DRIVER_NAME ": out of memory!\n"); ++ retval = -ENOMEM; ++ goto err; ++ } ++ ++ /* compute alternate max packet sizes */ ++ dev->alt_max_pkt_size = kmalloc(sizeof(dev->alt_max_pkt_size[0]) * ++ interface->num_altsetting, GFP_KERNEL); ++ if (dev->alt_max_pkt_size == NULL) { ++ em28xx_errdev("out of memory!\n"); ++ kfree(dev); ++ retval = -ENOMEM; ++ goto err; ++ } ++ + /* Get endpoints */ + for (i = 0; i < interface->num_altsetting; i++) { + int ep; + + for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) { +- struct usb_host_endpoint *e; +- e = &interface->altsetting[i].endpoint[ep]; +- +- if (e->desc.bEndpointAddress == 0x83) +- has_audio = true; ++ const struct usb_endpoint_descriptor *e; ++ int sizedescr, size; ++ ++ e = &interface->altsetting[i].endpoint[ep].desc; ++ ++ sizedescr = le16_to_cpu(e->wMaxPacketSize); ++ size = sizedescr & 0x7ff; ++ ++ if (udev->speed == USB_SPEED_HIGH) ++ size = size * hb_mult(sizedescr); ++ ++ if (usb_endpoint_xfer_isoc(e) && ++ usb_endpoint_dir_in(e)) { ++ switch (e->bEndpointAddress) { ++ case EM28XX_EP_AUDIO: ++ has_audio = true; ++ break; ++ case EM28XX_EP_ANALOG: ++ has_video = true; ++ dev->alt_max_pkt_size[i] = size; ++ break; ++ case EM28XX_EP_DIGITAL: ++ has_dvb = true; ++ if (size > dev->dvb_max_pkt_size) { ++ dev->dvb_max_pkt_size = size; ++ dev->dvb_alt = i; ++ } ++ break; ++ } ++ } + } + } + +- endpoint = &interface->cur_altsetting->endpoint[0].desc; +- +- /* check if the device has the iso in endpoint at the correct place */ +- if (usb_endpoint_xfer_isoc(endpoint) +- && +- (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) { +- /* It's a newer em2874/em2875 device */ +- isoc_pipe = 0; +- } else { +- int check_interface = 1; +- isoc_pipe = 1; +- endpoint = &interface->cur_altsetting->endpoint[1].desc; +- if (!usb_endpoint_xfer_isoc(endpoint)) +- check_interface = 0; +- +- if (usb_endpoint_dir_out(endpoint)) +- check_interface = 0; +- +- if (!check_interface) { +- if (has_audio) { +- is_audio_only = true; +- } else { +- em28xx_err(DRIVER_NAME " video device (%04x:%04x): " +- "interface %i, class %i found.\n", +- le16_to_cpu(udev->descriptor.idVendor), +- le16_to_cpu(udev->descriptor.idProduct), +- ifnum, +- interface->altsetting[0].desc.bInterfaceClass); +- em28xx_err(DRIVER_NAME " This is an anciliary " +- "interface not used by the driver\n"); +- +- retval = -ENODEV; +- goto err; +- } +- } ++ if (!(has_audio || has_video || has_dvb)) { ++ retval = -ENODEV; ++ goto err_free; + } + + switch (udev->speed) { +@@ -3221,6 +3231,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, + strlcat(descr, " ", sizeof(descr)); + strlcat(descr, udev->product, sizeof(descr)); + } ++ + if (*descr) + strlcat(descr, " ", sizeof(descr)); + +@@ -3237,6 +3248,14 @@ static int em28xx_usb_probe(struct usb_interface *interface, + printk(KERN_INFO DRIVER_NAME + ": Audio Vendor Class interface %i found\n", + ifnum); ++ if (has_video) ++ printk(KERN_INFO DRIVER_NAME ++ ": Video interface %i found\n", ++ ifnum); ++ if (has_dvb) ++ printk(KERN_INFO DRIVER_NAME ++ ": DVB interface %i found\n", ++ ifnum); + + /* + * Make sure we have 480 Mbps of bandwidth, otherwise things like +@@ -3248,22 +3267,14 @@ static int em28xx_usb_probe(struct usb_interface *interface, + printk(DRIVER_NAME ": Device must be connected to a high-speed" + " USB 2.0 port.\n"); + retval = -ENODEV; +- goto err; +- } +- +- /* allocate memory for our device state and initialize it */ +- dev = kzalloc(sizeof(*dev), GFP_KERNEL); +- if (dev == NULL) { +- em28xx_err(DRIVER_NAME ": out of memory!\n"); +- retval = -ENOMEM; +- goto err; ++ goto err_free; + } + + snprintf(dev->name, sizeof(dev->name), "em28xx #%d", nr); + dev->devno = nr; + dev->model = id->driver_info; + dev->alt = -1; +- dev->is_audio_only = is_audio_only; ++ dev->is_audio_only = has_audio && !(has_video || has_dvb); + dev->has_alsa_audio = has_audio; + dev->audio_ifnum = ifnum; + +@@ -3276,26 +3287,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, + } + } + +- /* compute alternate max packet sizes */ + dev->num_alt = interface->num_altsetting; +- dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL); +- +- if (dev->alt_max_pkt_size == NULL) { +- em28xx_errdev("out of memory!\n"); +- kfree(dev); +- retval = -ENOMEM; +- goto err; +- } +- +- for (i = 0; i < dev->num_alt ; i++) { +- u16 tmp = le16_to_cpu(interface->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize); +- unsigned int size = tmp & 0x7ff; +- +- if (udev->speed == USB_SPEED_HIGH) +- size = size * hb_mult(tmp); +- +- dev->alt_max_pkt_size[i] = size; +- } + + if ((card[nr] >= 0) && (card[nr] < em28xx_bcount)) + dev->model = card[nr]; +@@ -3308,10 +3300,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, + mutex_lock(&dev->lock); + retval = em28xx_init_dev(&dev, udev, interface, nr); + if (retval) { +- mutex_unlock(&dev->lock); +- kfree(dev->alt_max_pkt_size); +- kfree(dev); +- goto err; ++ goto unlock_and_free; + } + + request_modules(dev); +@@ -3330,6 +3319,13 @@ static int em28xx_usb_probe(struct usb_interface *interface, + + return 0; + ++unlock_and_free: ++ mutex_unlock(&dev->lock); ++ ++err_free: ++ kfree(dev->alt_max_pkt_size); ++ kfree(dev); ++ + err: + clear_bit(nr, &em28xx_devused); + +diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c +index 2982a06..0aacc96 100644 +--- a/drivers/media/video/em28xx/em28xx-core.c ++++ b/drivers/media/video/em28xx/em28xx-core.c +@@ -1070,7 +1070,8 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, + should also be using 'desc.bInterval' + */ + pipe = usb_rcvisocpipe(dev->udev, +- dev->mode == EM28XX_ANALOG_MODE ? 0x82 : 0x84); ++ dev->mode == EM28XX_ANALOG_MODE ? ++ EM28XX_EP_ANALOG : EM28XX_EP_DIGITAL); + + usb_fill_int_urb(urb, dev->udev, pipe, + dev->isoc_ctl.transfer_buffer[i], sb_size, +@@ -1108,62 +1109,6 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, + } + EXPORT_SYMBOL_GPL(em28xx_init_isoc); + +-/* Determine the packet size for the DVB stream for the given device +- (underlying value programmed into the eeprom) */ +-int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev) +-{ +- unsigned int chip_cfg2; +- unsigned int packet_size; +- +- switch (dev->chip_id) { +- case CHIP_ID_EM2710: +- case CHIP_ID_EM2750: +- case CHIP_ID_EM2800: +- case CHIP_ID_EM2820: +- case CHIP_ID_EM2840: +- case CHIP_ID_EM2860: +- /* No DVB support */ +- return -EINVAL; +- case CHIP_ID_EM2870: +- case CHIP_ID_EM2883: +- /* TS max packet size stored in bits 1-0 of R01 */ +- chip_cfg2 = em28xx_read_reg(dev, EM28XX_R01_CHIPCFG2); +- switch (chip_cfg2 & EM28XX_CHIPCFG2_TS_PACKETSIZE_MASK) { +- case EM28XX_CHIPCFG2_TS_PACKETSIZE_188: +- packet_size = 188; +- break; +- case EM28XX_CHIPCFG2_TS_PACKETSIZE_376: +- packet_size = 376; +- break; +- case EM28XX_CHIPCFG2_TS_PACKETSIZE_564: +- packet_size = 564; +- break; +- case EM28XX_CHIPCFG2_TS_PACKETSIZE_752: +- packet_size = 752; +- break; +- } +- break; +- case CHIP_ID_EM2874: +- /* +- * FIXME: for now assumes 564 like it was before, but the +- * em2874 code should be added to return the proper value +- */ +- packet_size = 564; +- break; +- case CHIP_ID_EM2884: +- case CHIP_ID_EM28174: +- default: +- /* +- * FIXME: same as em2874. 564 was enough for 22 Mbit DVB-T +- * but not enough for 44 Mbit DVB-C. +- */ +- packet_size = 752; +- } +- +- return packet_size; +-} +-EXPORT_SYMBOL_GPL(em28xx_isoc_dvb_max_packetsize); +- + /* + * em28xx_wake_i2c() + * configure i2c attached devices +diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c +index ac55de9..9449423 100644 +--- a/drivers/media/video/em28xx/em28xx-dvb.c ++++ b/drivers/media/video/em28xx/em28xx-dvb.c +@@ -164,12 +164,12 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb) + struct em28xx *dev = dvb->adapter.priv; + int max_dvb_packet_size; + +- usb_set_interface(dev->udev, 0, 1); ++ usb_set_interface(dev->udev, 0, dev->dvb_alt); + rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); + if (rc < 0) + return rc; + +- max_dvb_packet_size = em28xx_isoc_dvb_max_packetsize(dev); ++ max_dvb_packet_size = dev->dvb_max_pkt_size; + if (max_dvb_packet_size < 0) + return max_dvb_packet_size; + dprintk(1, "Using %d buffers each with %d bytes\n", +diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h +index 66f7923..2f62685 100644 +--- a/drivers/media/video/em28xx/em28xx-reg.h ++++ b/drivers/media/video/em28xx/em28xx-reg.h +@@ -12,6 +12,11 @@ + #define EM_GPO_2 (1 << 2) + #define EM_GPO_3 (1 << 3) + ++/* em28xx endpoints */ ++#define EM28XX_EP_ANALOG 0x82 ++#define EM28XX_EP_AUDIO 0x83 ++#define EM28XX_EP_DIGITAL 0x84 ++ + /* em2800 registers */ + #define EM2800_R08_AUDIOSRC 0x08 + +diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h +index 2dbb12c..7c3ebe2 100644 +--- a/drivers/media/video/em28xx/em28xx.h ++++ b/drivers/media/video/em28xx/em28xx.h +@@ -598,6 +598,8 @@ struct em28xx { + int max_pkt_size; /* max packet size of isoc transaction */ + int num_alt; /* Number of alternative settings */ + unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ ++ int dvb_alt; /* alternate for DVB */ ++ unsigned int dvb_max_pkt_size; /* wMaxPacketSize for DVB */ + struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ + char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc + transfer */ +-- +1.7.6.5 + + diff --git a/packages/linux/patches/linux-3.2.28-601-RPi_support-f23da7f.patch b/packages/linux/patches/linux-3.2.28-601-RPi_support-78f82bc.patch similarity index 76% rename from packages/linux/patches/linux-3.2.28-601-RPi_support-f23da7f.patch rename to packages/linux/patches/linux-3.2.28-601-RPi_support-78f82bc.patch index 5c3f10d942..b5c991e8ac 100644 --- a/packages/linux/patches/linux-3.2.28-601-RPi_support-f23da7f.patch +++ b/packages/linux/patches/linux-3.2.28-601-RPi_support-78f82bc.patch @@ -1,13 +1,83 @@ -diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig ---- linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig 2012-07-15 20:28:26.407092434 +0200 -@@ -0,0 +1,494 @@ +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 987c72d..5285fbf 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -955,6 +955,22 @@ config PLAT_SPEAR + help + Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx). + ++config ARCH_BCM2708 ++ bool "Broadcom BCM2708 family" ++ select CPU_V6 ++ select ARM_AMBA ++ select HAVE_CLK ++ select HAVE_SCHED_CLOCK ++ select NEED_MACH_MEMORY_H ++ select CLKDEV_LOOKUP ++ select GENERIC_CLOCKEVENTS ++ select ARM_ERRATA_411920 ++ select MACH_BCM2708 ++ select VC4 ++ select FIQ ++ help ++ This enables support for Broadcom BCM2708 boards. ++ + config ARCH_VT8500 + bool "VIA/WonderMedia 85xx" + select CPU_ARM926T +@@ -1098,6 +1114,7 @@ source "arch/arm/plat-versatile/Kconfig" + source "arch/arm/mach-vt8500/Kconfig" + + source "arch/arm/mach-w90x900/Kconfig" ++source "arch/arm/mach-bcm2708/Kconfig" + + # Definitions to make life easier + config ARCH_ACORN +diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug +index c5213e7..5e58b8f 100644 +--- a/arch/arm/Kconfig.debug ++++ b/arch/arm/Kconfig.debug +@@ -247,6 +247,14 @@ choice + their output to the standard serial port on the RealView + PB1176 platform. + ++ config DEBUG_BCM2708_UART0 ++ bool "Broadcom BCM2708 UART0 (PL011)" ++ depends on MACH_BCM2708 ++ help ++ Say Y here if you want the debug print routines to direct ++ their output to UART 0. The port must have been initialised ++ by the boot-loader before use. ++ + endchoice + + config EARLY_PRINTK +diff --git a/arch/arm/Makefile b/arch/arm/Makefile +index dfcf3b0..1b18ede 100644 +--- a/arch/arm/Makefile ++++ b/arch/arm/Makefile +@@ -198,6 +198,7 @@ machine-$(CONFIG_MACH_SPEAR310) := spear3xx + machine-$(CONFIG_MACH_SPEAR320) := spear3xx + machine-$(CONFIG_MACH_SPEAR600) := spear6xx + machine-$(CONFIG_ARCH_ZYNQ) := zynq ++machine-$(CONFIG_ARCH_BCM2708) := bcm2708 + + # Platform directory name. This list is sorted alphanumerically + # by CONFIG_* macro name. +diff --git a/arch/arm/configs/bcmrpi_cutdown_defconfig b/arch/arm/configs/bcmrpi_cutdown_defconfig +new file mode 100644 +index 0000000..3b8bd74 +--- /dev/null ++++ b/arch/arm/configs/bcmrpi_cutdown_defconfig +@@ -0,0 +1,546 @@ +CONFIG_EXPERIMENTAL=y ++CONFIG_LOCALVERSION="-cutdown" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y ++CONFIG_SCHED_AUTOGROUP=y +# CONFIG_UID16 is not set +# CONFIG_KALLSYMS is not set +CONFIG_EMBEDDED=y @@ -22,6 +92,7 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +CONFIG_ARCH_BCM2708=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y ++CONFIG_PREEMPT=y +CONFIG_AEABI=y +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 @@ -45,7 +116,7 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_DIAG is not set -+# CONFIG_IPV6 is not set ++CONFIG_IPV6_PRIVACY=y +CONFIG_NET_PKTGEN=m +CONFIG_IRDA=m +CONFIG_IRLAN=m @@ -86,6 +157,7 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +CONFIG_NFC=m +CONFIG_NFC_PN533=m +CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m @@ -99,12 +171,43 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_NETDEVICES=y ++CONFIG_NETCONSOLE=m +CONFIG_TUN=m +CONFIG_PHYLIB=m +CONFIG_MDIO_BITBANG=m -+CONFIG_NET_ETHERNET=y -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set ++CONFIG_PPP=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_SLIP=m ++CONFIG_SLIP_COMPRESSED=y ++CONFIG_USB_CATC=m ++CONFIG_USB_KAWETH=m ++CONFIG_USB_PEGASUS=m ++CONFIG_USB_RTL8150=m ++CONFIG_USB_USBNET=y ++CONFIG_USB_NET_AX8817X=m ++CONFIG_USB_NET_CDCETHER=m ++CONFIG_USB_NET_CDC_EEM=m ++CONFIG_USB_NET_DM9601=m ++CONFIG_USB_NET_SMSC75XX=m ++CONFIG_USB_NET_SMSC95XX=y ++CONFIG_USB_NET_GL620A=m ++CONFIG_USB_NET_NET1080=m ++CONFIG_USB_NET_PLUSB=m ++CONFIG_USB_NET_MCS7830=m ++CONFIG_USB_NET_CDC_SUBSET=m ++CONFIG_USB_ALI_M5632=y ++CONFIG_USB_AN2720=y ++CONFIG_USB_KC2190=y ++# CONFIG_USB_NET_ZAURUS is not set ++CONFIG_USB_NET_CX82310_ETH=m ++CONFIG_USB_NET_KALMIA=m ++CONFIG_USB_NET_INT51X1=m ++CONFIG_USB_IPHETH=m ++CONFIG_USB_SIERRA_NET=m ++CONFIG_USB_VL600=m +CONFIG_LIBERTAS_THINFIRM=m +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_AT76C50X_USB=m @@ -137,40 +240,6 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_WIMAX_I2400M_USB=m -+CONFIG_USB_CATC=m -+CONFIG_USB_KAWETH=m -+CONFIG_USB_PEGASUS=m -+CONFIG_USB_RTL8150=m -+CONFIG_USB_USBNET=y -+CONFIG_USB_NET_AX8817X=m -+CONFIG_USB_NET_CDCETHER=m -+CONFIG_USB_NET_CDC_EEM=m -+CONFIG_USB_NET_DM9601=m -+CONFIG_USB_NET_SMSC75XX=m -+CONFIG_USB_NET_SMSC95XX=y -+CONFIG_USB_NET_GL620A=m -+CONFIG_USB_NET_NET1080=m -+CONFIG_USB_NET_PLUSB=m -+CONFIG_USB_NET_MCS7830=m -+CONFIG_USB_NET_CDC_SUBSET=m -+CONFIG_USB_ALI_M5632=y -+CONFIG_USB_AN2720=y -+CONFIG_USB_KC2190=y -+# CONFIG_USB_NET_ZAURUS is not set -+CONFIG_USB_NET_CX82310_ETH=m -+CONFIG_USB_NET_KALMIA=m -+CONFIG_USB_NET_INT51X1=m -+CONFIG_USB_IPHETH=m -+CONFIG_USB_SIERRA_NET=m -+CONFIG_USB_VL600=m -+CONFIG_PPP=m -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_SLIP=m -+CONFIG_SLIP_COMPRESSED=y -+CONFIG_NETCONSOLE=m +CONFIG_INPUT_POLLDEV=m +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_JOYDEV=m @@ -179,7 +248,6 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_AD714X=m -+CONFIG_INPUT_ATI_REMOTE=m +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_POWERMATE=m @@ -205,7 +273,58 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +# CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_BCM2708_WDT=m -+# CONFIG_MFD_SUPPORT is not set ++CONFIG_MEDIA_SUPPORT=m ++CONFIG_VIDEO_DEV=m ++CONFIG_USB_VIDEO_CLASS=m ++CONFIG_USB_M5602=m ++CONFIG_USB_STV06XX=m ++CONFIG_USB_GL860=m ++CONFIG_USB_GSPCA_BENQ=m ++CONFIG_USB_GSPCA_CONEX=m ++CONFIG_USB_GSPCA_CPIA1=m ++CONFIG_USB_GSPCA_ETOMS=m ++CONFIG_USB_GSPCA_FINEPIX=m ++CONFIG_USB_GSPCA_JEILINJ=m ++CONFIG_USB_GSPCA_KINECT=m ++CONFIG_USB_GSPCA_KONICA=m ++CONFIG_USB_GSPCA_MARS=m ++CONFIG_USB_GSPCA_MR97310A=m ++CONFIG_USB_GSPCA_NW80X=m ++CONFIG_USB_GSPCA_OV519=m ++CONFIG_USB_GSPCA_OV534=m ++CONFIG_USB_GSPCA_OV534_9=m ++CONFIG_USB_GSPCA_PAC207=m ++CONFIG_USB_GSPCA_PAC7302=m ++CONFIG_USB_GSPCA_PAC7311=m ++CONFIG_USB_GSPCA_SE401=m ++CONFIG_USB_GSPCA_SN9C2028=m ++CONFIG_USB_GSPCA_SN9C20X=m ++CONFIG_USB_GSPCA_SONIXB=m ++CONFIG_USB_GSPCA_SONIXJ=m ++CONFIG_USB_GSPCA_SPCA500=m ++CONFIG_USB_GSPCA_SPCA501=m ++CONFIG_USB_GSPCA_SPCA505=m ++CONFIG_USB_GSPCA_SPCA506=m ++CONFIG_USB_GSPCA_SPCA508=m ++CONFIG_USB_GSPCA_SPCA561=m ++CONFIG_USB_GSPCA_SPCA1528=m ++CONFIG_USB_GSPCA_SQ905=m ++CONFIG_USB_GSPCA_SQ905C=m ++CONFIG_USB_GSPCA_SQ930X=m ++CONFIG_USB_GSPCA_STK014=m ++CONFIG_USB_GSPCA_STV0680=m ++CONFIG_USB_GSPCA_SUNPLUS=m ++CONFIG_USB_GSPCA_T613=m ++CONFIG_USB_GSPCA_TV8532=m ++CONFIG_USB_GSPCA_VC032X=m ++CONFIG_USB_GSPCA_VICAM=m ++CONFIG_USB_GSPCA_XIRLINK_CIT=m ++CONFIG_USB_GSPCA_ZC3XX=m ++CONFIG_VIDEO_HDPVR=m ++CONFIG_USB_PWC=m ++CONFIG_USB_ZR364XX=m ++CONFIG_USB_STKWEBCAM=m ++CONFIG_USB_S2255=m +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FRAMEBUFFER_CONSOLE=y @@ -475,6 +594,7 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m +# CONFIG_SCHED_DEBUG is not set ++# CONFIG_DEBUG_PREEMPT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_FTRACE is not set +# CONFIG_ARM_UNWIND is not set @@ -496,10 +616,13 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_cutdown_defconfig linux-rpi-boot +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_defconfig ---- linux-3.2.23/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_defconfig 2012-07-15 20:28:26.377091869 +0200 -@@ -0,0 +1,530 @@ +diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig +new file mode 100644 +index 0000000..5ed9c30 +--- /dev/null ++++ b/arch/arm/configs/bcmrpi_defconfig +@@ -0,0 +1,907 @@ ++# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -507,6 +630,10 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_FHANDLE=y ++CONFIG_TASKSTATS=y ++CONFIG_TASK_DELAY_ACCT=y ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_AUDIT=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y @@ -517,6 +644,7 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_BLK_CGROUP=y +CONFIG_NAMESPACES=y +CONFIG_SCHED_AUTOGROUP=y ++CONFIG_RELAY=y +CONFIG_EMBEDDED=y +# CONFIG_COMPAT_BRK is not set +CONFIG_SLAB=y @@ -533,7 +661,9 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_ARCH_BCM2708=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y ++CONFIG_PREEMPT=y +CONFIG_AEABI=y ++CONFIG_UACCESS_WITH_MEMCPY=y +CONFIG_SECCOMP=y +CONFIG_CC_STACKPROTECTOR=y +CONFIG_ZBOOT_ROM_TEXT=0x0 @@ -550,19 +680,235 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y ++CONFIG_IP_ADVANCED_ROUTER=y ++CONFIG_IP_MULTIPLE_TABLES=y ++CONFIG_IP_ROUTE_MULTIPATH=y ++CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_RARP=y ++CONFIG_NET_IPIP=m +CONFIG_SYN_COOKIES=y -+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -+# CONFIG_INET_XFRM_MODE_TUNNEL is not set -+# CONFIG_INET_XFRM_MODE_BEET is not set -+# CONFIG_INET_LRO is not set -+# CONFIG_INET_DIAG is not set -+# CONFIG_IPV6 is not set ++CONFIG_INET_AH=m ++CONFIG_INET_ESP=m ++CONFIG_INET_IPCOMP=m ++CONFIG_INET_XFRM_MODE_TRANSPORT=m ++CONFIG_INET_XFRM_MODE_TUNNEL=m ++CONFIG_INET_XFRM_MODE_BEET=m ++CONFIG_INET_LRO=m ++CONFIG_INET_DIAG=m ++CONFIG_IPV6_PRIVACY=y ++CONFIG_INET6_AH=m ++CONFIG_INET6_ESP=m ++CONFIG_INET6_IPCOMP=m ++CONFIG_IPV6_MULTIPLE_TABLES=y ++CONFIG_NETFILTER=y ++CONFIG_NF_CONNTRACK=m ++CONFIG_NF_CONNTRACK_ZONES=y ++CONFIG_NF_CONNTRACK_EVENTS=y ++CONFIG_NF_CONNTRACK_TIMESTAMP=y ++CONFIG_NF_CT_PROTO_DCCP=m ++CONFIG_NF_CT_PROTO_SCTP=m ++CONFIG_NF_CT_PROTO_UDPLITE=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_SNMP=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_TPROXY=m ++CONFIG_NETFILTER_XT_SET=m ++CONFIG_NETFILTER_XT_TARGET_AUDIT=m ++CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m ++CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m ++CONFIG_NETFILTER_XT_TARGET_CONNMARK=m ++CONFIG_NETFILTER_XT_TARGET_CT=m ++CONFIG_NETFILTER_XT_TARGET_DSCP=m ++CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m ++CONFIG_NETFILTER_XT_TARGET_LED=m ++CONFIG_NETFILTER_XT_TARGET_MARK=m ++CONFIG_NETFILTER_XT_TARGET_NFLOG=m ++CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m ++CONFIG_NETFILTER_XT_TARGET_NOTRACK=m ++CONFIG_NETFILTER_XT_TARGET_TEE=m ++CONFIG_NETFILTER_XT_TARGET_TPROXY=m ++CONFIG_NETFILTER_XT_TARGET_TRACE=m ++CONFIG_NETFILTER_XT_TARGET_TCPMSS=m ++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m ++CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m ++CONFIG_NETFILTER_XT_MATCH_CLUSTER=m ++CONFIG_NETFILTER_XT_MATCH_COMMENT=m ++CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m ++CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m ++CONFIG_NETFILTER_XT_MATCH_CONNMARK=m ++CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m ++CONFIG_NETFILTER_XT_MATCH_CPU=m ++CONFIG_NETFILTER_XT_MATCH_DCCP=m ++CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m ++CONFIG_NETFILTER_XT_MATCH_DSCP=m ++CONFIG_NETFILTER_XT_MATCH_ESP=m ++CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m ++CONFIG_NETFILTER_XT_MATCH_HELPER=m ++CONFIG_NETFILTER_XT_MATCH_IPRANGE=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_MULTIPORT=m ++CONFIG_NETFILTER_XT_MATCH_OSF=m ++CONFIG_NETFILTER_XT_MATCH_OWNER=m ++CONFIG_NETFILTER_XT_MATCH_POLICY=m ++CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m ++CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m ++CONFIG_NETFILTER_XT_MATCH_QUOTA=m ++CONFIG_NETFILTER_XT_MATCH_RATEEST=m ++CONFIG_NETFILTER_XT_MATCH_REALM=m ++CONFIG_NETFILTER_XT_MATCH_RECENT=m ++CONFIG_NETFILTER_XT_MATCH_SCTP=m ++CONFIG_NETFILTER_XT_MATCH_SOCKET=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_TIME=m ++CONFIG_NETFILTER_XT_MATCH_U32=m ++CONFIG_IP_SET=m ++CONFIG_IP_SET_BITMAP_IP=m ++CONFIG_IP_SET_BITMAP_IPMAC=m ++CONFIG_IP_SET_BITMAP_PORT=m ++CONFIG_IP_SET_HASH_IP=m ++CONFIG_IP_SET_HASH_IPPORT=m ++CONFIG_IP_SET_HASH_IPPORTIP=m ++CONFIG_IP_SET_HASH_IPPORTNET=m ++CONFIG_IP_SET_HASH_NET=m ++CONFIG_IP_SET_HASH_NETPORT=m ++CONFIG_IP_SET_HASH_NETIFACE=m ++CONFIG_IP_SET_LIST_SET=m ++CONFIG_NF_CONNTRACK_IPV4=m ++CONFIG_IP_NF_IPTABLES=m ++CONFIG_IP_NF_MATCH_AH=m ++CONFIG_IP_NF_MATCH_ECN=m ++CONFIG_IP_NF_MATCH_TTL=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_IP_NF_TARGET_MASQUERADE=m ++CONFIG_IP_NF_TARGET_NETMAP=m ++CONFIG_IP_NF_TARGET_REDIRECT=m ++CONFIG_IP_NF_MANGLE=m ++CONFIG_IP_NF_TARGET_ECN=m ++CONFIG_IP_NF_TARGET_TTL=m ++CONFIG_IP_NF_RAW=m ++CONFIG_IP_NF_ARPTABLES=m ++CONFIG_IP_NF_ARPFILTER=m ++CONFIG_IP_NF_ARP_MANGLE=m ++CONFIG_NF_CONNTRACK_IPV6=m ++CONFIG_IP6_NF_IPTABLES=m ++CONFIG_IP6_NF_MATCH_AH=m ++CONFIG_IP6_NF_MATCH_EUI64=m ++CONFIG_IP6_NF_MATCH_FRAG=m ++CONFIG_IP6_NF_MATCH_OPTS=m ++CONFIG_IP6_NF_MATCH_HL=m ++CONFIG_IP6_NF_MATCH_IPV6HEADER=m ++CONFIG_IP6_NF_MATCH_MH=m ++CONFIG_IP6_NF_MATCH_RT=m ++CONFIG_IP6_NF_TARGET_HL=m ++CONFIG_IP6_NF_TARGET_LOG=m ++CONFIG_IP6_NF_FILTER=m ++CONFIG_IP6_NF_TARGET_REJECT=m ++CONFIG_IP6_NF_MANGLE=m ++CONFIG_IP6_NF_RAW=m ++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_IP6=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_BRIDGE_EBT_NFLOG=m ++CONFIG_BRIDGE=m ++CONFIG_VLAN_8021Q=m ++CONFIG_VLAN_8021Q_GVRP=y ++CONFIG_NET_SCHED=y ++CONFIG_NET_SCH_CBQ=m ++CONFIG_NET_SCH_HTB=m ++CONFIG_NET_SCH_HFSC=m ++CONFIG_NET_SCH_PRIO=m ++CONFIG_NET_SCH_MULTIQ=m ++CONFIG_NET_SCH_RED=m ++CONFIG_NET_SCH_SFB=m ++CONFIG_NET_SCH_SFQ=m ++CONFIG_NET_SCH_TEQL=m ++CONFIG_NET_SCH_TBF=m ++CONFIG_NET_SCH_GRED=m ++CONFIG_NET_SCH_DSMARK=m ++CONFIG_NET_SCH_NETEM=m ++CONFIG_NET_SCH_DRR=m ++CONFIG_NET_SCH_MQPRIO=m ++CONFIG_NET_SCH_CHOKE=m ++CONFIG_NET_SCH_QFQ=m ++CONFIG_NET_CLS_BASIC=m ++CONFIG_NET_CLS_TCINDEX=m ++CONFIG_NET_CLS_ROUTE4=m ++CONFIG_NET_CLS_FW=m ++CONFIG_NET_CLS_U32=m ++CONFIG_CLS_U32_MARK=y ++CONFIG_NET_CLS_RSVP=m ++CONFIG_NET_CLS_RSVP6=m ++CONFIG_NET_CLS_FLOW=m ++CONFIG_NET_CLS_CGROUP=m ++CONFIG_NET_EMATCH=y ++CONFIG_NET_EMATCH_CMP=m ++CONFIG_NET_EMATCH_NBYTE=m ++CONFIG_NET_EMATCH_U32=m ++CONFIG_NET_EMATCH_META=m ++CONFIG_NET_EMATCH_TEXT=m ++CONFIG_NET_CLS_ACT=y ++CONFIG_NET_ACT_POLICE=m ++CONFIG_NET_ACT_GACT=m ++CONFIG_GACT_PROB=y ++CONFIG_NET_ACT_MIRRED=m ++CONFIG_NET_ACT_IPT=m ++CONFIG_NET_ACT_NAT=m ++CONFIG_NET_ACT_PEDIT=m ++CONFIG_NET_ACT_SIMP=m ++CONFIG_NET_ACT_SKBEDIT=m ++CONFIG_NET_ACT_CSUM=m +CONFIG_NET_PKTGEN=m ++CONFIG_HAMRADIO=y ++CONFIG_AX25=m ++CONFIG_NETROM=m ++CONFIG_ROSE=m ++CONFIG_MKISS=m ++CONFIG_6PACK=m ++CONFIG_BPQETHER=m ++CONFIG_BAYCOM_SER_FDX=m ++CONFIG_BAYCOM_SER_HDX=m ++CONFIG_YAM=m +CONFIG_IRDA=m +CONFIG_IRLAN=m ++CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y +CONFIG_IRDA_CACHE_LAST_LSAP=y @@ -599,9 +945,11 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_NET_9P=m +CONFIG_NFC=m +CONFIG_NFC_PN533=m -+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_CRYPTOLOOP=m ++CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_CDROM_PKTCDVD=m @@ -609,49 +957,39 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_SCSI=y +# CONFIG_SCSI_PROC_FS is not set +CONFIG_BLK_DEV_SD=y ++CONFIG_CHR_DEV_ST=m ++CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_MD=y ++CONFIG_BLK_DEV_DM=m ++CONFIG_DM_CRYPT=m ++CONFIG_DM_SNAPSHOT=m ++CONFIG_DM_MIRROR=m ++CONFIG_DM_RAID=m ++CONFIG_DM_LOG_USERSPACE=m ++CONFIG_DM_ZERO=m ++CONFIG_DM_DELAY=m +CONFIG_NETDEVICES=y ++CONFIG_BONDING=m ++CONFIG_MACVLAN=m ++CONFIG_NETCONSOLE=m +CONFIG_TUN=m +CONFIG_PHYLIB=m +CONFIG_MDIO_BITBANG=m -+CONFIG_NET_ETHERNET=y -+# CONFIG_NETDEV_1000 is not set -+# CONFIG_NETDEV_10000 is not set -+CONFIG_LIBERTAS_THINFIRM=m -+CONFIG_LIBERTAS_THINFIRM_USB=m -+CONFIG_AT76C50X_USB=m -+CONFIG_USB_ZD1201=m -+CONFIG_USB_NET_RNDIS_WLAN=m -+CONFIG_RTL8187=m -+CONFIG_MAC80211_HWSIM=m -+CONFIG_ATH_COMMON=m -+CONFIG_ATH9K=m -+CONFIG_ATH9K_HTC=m -+CONFIG_CARL9170=m -+CONFIG_B43=m -+CONFIG_B43LEGACY=m -+CONFIG_HOSTAP=m -+CONFIG_IWM=m -+CONFIG_LIBERTAS=m -+CONFIG_LIBERTAS_USB=m -+CONFIG_LIBERTAS_SDIO=m -+CONFIG_P54_COMMON=m -+CONFIG_P54_USB=m -+CONFIG_RT2X00=m -+CONFIG_RT2500USB=m -+CONFIG_RT73USB=m -+CONFIG_RT2800USB=m -+CONFIG_RT2800USB_RT53XX=y -+CONFIG_RTL8192CU=m -+CONFIG_WL1251=m -+CONFIG_WL12XX_MENU=m -+CONFIG_ZD1211RW=m -+CONFIG_MWIFIEX=m -+CONFIG_MWIFIEX_SDIO=m -+CONFIG_WIMAX_I2400M_USB=m ++CONFIG_PPP=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_MPPE=m ++CONFIG_PPP_MULTILINK=y ++CONFIG_PPPOE=m ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_SLIP=m ++CONFIG_SLIP_COMPRESSED=y ++CONFIG_SLIP_SMART=y +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m @@ -678,14 +1016,39 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m -+CONFIG_PPP=m -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_SLIP=m -+CONFIG_SLIP_COMPRESSED=y -+CONFIG_NETCONSOLE=m ++CONFIG_LIBERTAS_THINFIRM=m ++CONFIG_LIBERTAS_THINFIRM_USB=m ++CONFIG_AT76C50X_USB=m ++CONFIG_USB_ZD1201=m ++CONFIG_USB_NET_RNDIS_WLAN=m ++CONFIG_RTL8187=m ++CONFIG_MAC80211_HWSIM=m ++CONFIG_ATH_COMMON=m ++CONFIG_ATH9K=m ++CONFIG_ATH9K_HTC=m ++CONFIG_CARL9170=m ++CONFIG_B43=m ++CONFIG_B43_PHY_N=y ++CONFIG_B43LEGACY=m ++CONFIG_HOSTAP=m ++CONFIG_IWM=m ++CONFIG_LIBERTAS=m ++CONFIG_LIBERTAS_USB=m ++CONFIG_LIBERTAS_SDIO=m ++CONFIG_P54_COMMON=m ++CONFIG_P54_USB=m ++CONFIG_RT2X00=m ++CONFIG_RT2500USB=m ++CONFIG_RT73USB=m ++CONFIG_RT2800USB=m ++CONFIG_RT2800USB_RT53XX=y ++CONFIG_WL1251=m ++CONFIG_WL12XX_MENU=m ++CONFIG_ZD1211RW=m ++CONFIG_MWIFIEX=m ++CONFIG_MWIFIEX_SDIO=m ++CONFIG_RTL8192CU=m ++CONFIG_WIMAX_I2400M_USB=m +CONFIG_INPUT_POLLDEV=m +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_JOYDEV=m @@ -694,7 +1057,6 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_AD714X=m -+CONFIG_INPUT_ATI_REMOTE=m +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_POWERMATE=m @@ -714,13 +1076,143 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y ++CONFIG_TTY_PRINTK=y +# CONFIG_HW_RANDOM is not set +CONFIG_RAW_DRIVER=y ++CONFIG_I2C=y ++CONFIG_I2C_CHARDEV=m ++CONFIG_I2C_BCM2708=m ++CONFIG_SPI=y ++CONFIG_SPI_BCM2708=m ++CONFIG_SPI_SPIDEV=m +CONFIG_GPIO_SYSFS=y ++CONFIG_W1=m ++CONFIG_W1_MASTER_DS2490=m ++CONFIG_W1_MASTER_DS2482=m ++CONFIG_W1_MASTER_DS1WM=m ++CONFIG_W1_MASTER_GPIO=m ++CONFIG_W1_SLAVE_THERM=m ++CONFIG_W1_SLAVE_SMEM=m ++CONFIG_W1_SLAVE_DS2408=m ++CONFIG_W1_SLAVE_DS2423=m ++CONFIG_W1_SLAVE_DS2431=m ++CONFIG_W1_SLAVE_DS2433=m ++CONFIG_W1_SLAVE_DS2760=m ++CONFIG_W1_SLAVE_DS2780=m ++CONFIG_W1_SLAVE_BQ27000=m +# CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_BCM2708_WDT=m -+# CONFIG_MFD_SUPPORT is not set ++CONFIG_MEDIA_SUPPORT=m ++CONFIG_VIDEO_DEV=m ++CONFIG_DVB_CORE=m ++CONFIG_RC_ATI_REMOTE=m ++CONFIG_IR_IMON=m ++CONFIG_IR_MCEUSB=m ++CONFIG_IR_REDRAT3=m ++CONFIG_IR_STREAMZAP=m ++CONFIG_RC_LOOPBACK=m ++CONFIG_MEDIA_ATTACH=y ++CONFIG_USB_VIDEO_CLASS=m ++CONFIG_USB_M5602=m ++CONFIG_USB_STV06XX=m ++CONFIG_USB_GL860=m ++CONFIG_USB_GSPCA_BENQ=m ++CONFIG_USB_GSPCA_CONEX=m ++CONFIG_USB_GSPCA_CPIA1=m ++CONFIG_USB_GSPCA_ETOMS=m ++CONFIG_USB_GSPCA_FINEPIX=m ++CONFIG_USB_GSPCA_JEILINJ=m ++CONFIG_USB_GSPCA_KINECT=m ++CONFIG_USB_GSPCA_KONICA=m ++CONFIG_USB_GSPCA_MARS=m ++CONFIG_USB_GSPCA_MR97310A=m ++CONFIG_USB_GSPCA_NW80X=m ++CONFIG_USB_GSPCA_OV519=m ++CONFIG_USB_GSPCA_OV534=m ++CONFIG_USB_GSPCA_OV534_9=m ++CONFIG_USB_GSPCA_PAC207=m ++CONFIG_USB_GSPCA_PAC7302=m ++CONFIG_USB_GSPCA_PAC7311=m ++CONFIG_USB_GSPCA_SE401=m ++CONFIG_USB_GSPCA_SN9C2028=m ++CONFIG_USB_GSPCA_SN9C20X=m ++CONFIG_USB_GSPCA_SONIXB=m ++CONFIG_USB_GSPCA_SONIXJ=m ++CONFIG_USB_GSPCA_SPCA500=m ++CONFIG_USB_GSPCA_SPCA501=m ++CONFIG_USB_GSPCA_SPCA505=m ++CONFIG_USB_GSPCA_SPCA506=m ++CONFIG_USB_GSPCA_SPCA508=m ++CONFIG_USB_GSPCA_SPCA561=m ++CONFIG_USB_GSPCA_SPCA1528=m ++CONFIG_USB_GSPCA_SQ905=m ++CONFIG_USB_GSPCA_SQ905C=m ++CONFIG_USB_GSPCA_SQ930X=m ++CONFIG_USB_GSPCA_STK014=m ++CONFIG_USB_GSPCA_STV0680=m ++CONFIG_USB_GSPCA_SUNPLUS=m ++CONFIG_USB_GSPCA_T613=m ++CONFIG_USB_GSPCA_TV8532=m ++CONFIG_USB_GSPCA_VC032X=m ++CONFIG_USB_GSPCA_VICAM=m ++CONFIG_USB_GSPCA_XIRLINK_CIT=m ++CONFIG_USB_GSPCA_ZC3XX=m ++CONFIG_VIDEO_PVRUSB2=m ++CONFIG_VIDEO_HDPVR=m ++CONFIG_VIDEO_EM28XX=m ++CONFIG_VIDEO_EM28XX_ALSA=m ++CONFIG_VIDEO_EM28XX_DVB=m ++CONFIG_VIDEO_TLG2300=m ++CONFIG_VIDEO_CX231XX=m ++CONFIG_VIDEO_CX231XX_ALSA=m ++CONFIG_VIDEO_CX231XX_DVB=m ++CONFIG_VIDEO_USBVISION=m ++CONFIG_USB_ET61X251=m ++CONFIG_USB_SN9C102=m ++CONFIG_USB_PWC=m ++CONFIG_USB_ZR364XX=m ++CONFIG_USB_STKWEBCAM=m ++CONFIG_USB_S2255=m ++CONFIG_USB_DSBR=m ++CONFIG_RADIO_SI470X=y ++CONFIG_USB_SI470X=m ++CONFIG_USB_MR800=m ++CONFIG_DVB_USB=m ++CONFIG_DVB_USB_A800=m ++CONFIG_DVB_USB_DIBUSB_MB=m ++CONFIG_DVB_USB_DIBUSB_MC=m ++CONFIG_DVB_USB_DIB0700=m ++CONFIG_DVB_USB_UMT_010=m ++CONFIG_DVB_USB_CXUSB=m ++CONFIG_DVB_USB_M920X=m ++CONFIG_DVB_USB_GL861=m ++CONFIG_DVB_USB_AU6610=m ++CONFIG_DVB_USB_DIGITV=m ++CONFIG_DVB_USB_VP7045=m ++CONFIG_DVB_USB_VP702X=m ++CONFIG_DVB_USB_GP8PSK=m ++CONFIG_DVB_USB_NOVA_T_USB2=m ++CONFIG_DVB_USB_TTUSB2=m ++CONFIG_DVB_USB_DTT200U=m ++CONFIG_DVB_USB_OPERA1=m ++CONFIG_DVB_USB_AF9005=m ++CONFIG_DVB_USB_AF9005_REMOTE=m ++CONFIG_DVB_USB_DW2102=m ++CONFIG_DVB_USB_CINERGY_T2=m ++CONFIG_DVB_USB_ANYSEE=m ++CONFIG_DVB_USB_DTV5100=m ++CONFIG_DVB_USB_AF9015=m ++CONFIG_DVB_USB_CE6230=m ++CONFIG_DVB_USB_FRIIO=m ++CONFIG_DVB_USB_EC168=m ++CONFIG_DVB_USB_AZ6027=m ++CONFIG_DVB_USB_LME2510=m ++CONFIG_DVB_USB_TECHNISAT_USB2=m ++CONFIG_SMS_SIANO_MDTV=m ++CONFIG_SMS_USB_DRV=m ++CONFIG_DVB_B2C2_FLEXCOP=m ++CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FRAMEBUFFER_CONSOLE=y @@ -893,9 +1385,16 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_DRV_DS1307=m +CONFIG_UIO=m +CONFIG_UIO_PDRV=m +CONFIG_UIO_PDRV_GENIRQ=m ++CONFIG_STAGING=y ++CONFIG_W35UND=m ++CONFIG_PRISM2_USB=m ++CONFIG_R8712U=m ++CONFIG_ZRAM=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y @@ -936,6 +1435,9 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_CONFIGFS_FS=y ++CONFIG_ECRYPT_FS=m ++CONFIG_HFS_FS=m ++CONFIG_HFSPLUS_FS=m +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_LZO=y @@ -946,6 +1448,9 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_NFS_V4=y +CONFIG_ROOT_NFS=y +CONFIG_NFS_FSCACHE=y ++CONFIG_NFSD=m ++CONFIG_NFSD_V3_ACL=y ++CONFIG_NFSD_V4=y +CONFIG_CIFS=m +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_XATTR=y @@ -993,28 +1498,23 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m -+CONFIG_NLS_UTF8=m +CONFIG_PRINTK_TIME=y ++CONFIG_DEBUG_FS=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_TIMER_STATS=y -+CONFIG_DEBUG_STACK_USAGE=y -+CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_PREEMPT is not set +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_BOOT_PRINTK_DELAY=y +CONFIG_LATENCYTOP=y +CONFIG_SYSCTL_SYSCALL_CHECK=y -+CONFIG_IRQSOFF_TRACER=y -+CONFIG_SCHED_TRACER=y -+CONFIG_STACK_TRACER=y -+CONFIG_BLK_DEV_IO_TRACE=y -+CONFIG_FUNCTION_PROFILER=y ++# CONFIG_KPROBE_EVENT is not set +CONFIG_KGDB=y +CONFIG_KGDB_KDB=y +CONFIG_KDB_KEYBOARD=y +CONFIG_STRICT_DEVMEM=y -+CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_XTS=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_MD5=y @@ -1025,14 +1525,15 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_defconfig linux-rpi-bootc-3.2.23 +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_DES=y -+CONFIG_CRYPTO_DEFLATE=m +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_emergency_defconfig linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_emergency_defconfig ---- linux-3.2.23/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/configs/bcmrpi_emergency_defconfig 2012-07-15 20:28:26.408092453 +0200 +diff --git a/arch/arm/configs/bcmrpi_emergency_defconfig b/arch/arm/configs/bcmrpi_emergency_defconfig +new file mode 100644 +index 0000000..3b40c49 +--- /dev/null ++++ b/arch/arm/configs/bcmrpi_emergency_defconfig @@ -0,0 +1,532 @@ +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set @@ -1566,61 +2067,109 @@ diff -Naur linux-3.2.23/arch/arm/configs/bcmrpi_emergency_defconfig linux-rpi-bo +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Naur linux-3.2.23/arch/arm/Kconfig linux-rpi-bootc-3.2.23/arch/arm/Kconfig ---- linux-3.2.23/arch/arm/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/Kconfig 2012-07-15 20:28:26.140087409 +0200 -@@ -955,6 +955,21 @@ - help - Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx). +diff --git a/arch/arm/include/asm/fiq.h b/arch/arm/include/asm/fiq.h +index d493d0b..f1a131b 100644 +--- a/arch/arm/include/asm/fiq.h ++++ b/arch/arm/include/asm/fiq.h +@@ -42,6 +42,7 @@ extern void disable_fiq(int fiq); + /* helpers defined in fiqasm.S: */ + extern void __set_fiq_regs(unsigned long const *regs); + extern void __get_fiq_regs(unsigned long *regs); ++extern void __FIQ_Branch(unsigned long *regs); -+config ARCH_BCM2708 -+ bool "Broadcom BCM2708 family" + static inline void set_fiq_regs(struct pt_regs const *regs) + { +diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c +index 4c164ec..3841bde 100644 +--- a/arch/arm/kernel/fiq.c ++++ b/arch/arm/kernel/fiq.c +@@ -135,6 +135,7 @@ void disable_fiq(int fiq) + EXPORT_SYMBOL(set_fiq_handler); + EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */ + EXPORT_SYMBOL(__get_fiq_regs); /* defined in fiqasm.S */ ++EXPORT_SYMBOL(__FIQ_Branch); /* defined in fiqasm.S */ + EXPORT_SYMBOL(claim_fiq); + EXPORT_SYMBOL(release_fiq); + EXPORT_SYMBOL(enable_fiq); +diff --git a/arch/arm/kernel/fiqasm.S b/arch/arm/kernel/fiqasm.S +index 207f9d6..5233d54 100644 +--- a/arch/arm/kernel/fiqasm.S ++++ b/arch/arm/kernel/fiqasm.S +@@ -47,3 +47,7 @@ ENTRY(__get_fiq_regs) + mov r0, r0 @ avoid hazard prior to ARMv4 + mov pc, lr + ENDPROC(__get_fiq_regs) ++ ++ENTRY(__FIQ_Branch) ++ mov pc, r8 ++ENDPROC(__FIQ_Branch) +diff --git a/arch/arm/mach-bcm2708/Kconfig b/arch/arm/mach-bcm2708/Kconfig +new file mode 100644 +index 0000000..5593167 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/Kconfig +@@ -0,0 +1,32 @@ ++menu "Broadcom BCM2708 Implementations" ++ depends on ARCH_BCM2708 ++ ++config MACH_BCM2708 ++ bool "Broadcom BCM2708 Development Platform" + select CPU_V6 -+ select ARM_AMBA -+ select HAVE_CLK -+ select HAVE_SCHED_CLOCK -+ select NEED_MACH_MEMORY_H -+ select CLKDEV_LOOKUP -+ select GENERIC_CLOCKEVENTS -+ select ARM_ERRATA_411920 -+ select MACH_BCM2708 -+ select VC4 + help -+ This enables support for Broadcom BCM2708 boards. ++ Include support for the Broadcom(R) BCM2708 platform. + - config ARCH_VT8500 - bool "VIA/WonderMedia 85xx" - select CPU_ARM926T -@@ -1098,6 +1113,7 @@ - source "arch/arm/mach-vt8500/Kconfig" - - source "arch/arm/mach-w90x900/Kconfig" -+source "arch/arm/mach-bcm2708/Kconfig" - - # Definitions to make life easier - config ARCH_ACORN -diff -Naur linux-3.2.23/arch/arm/Kconfig.debug linux-rpi-bootc-3.2.23/arch/arm/Kconfig.debug ---- linux-3.2.23/arch/arm/Kconfig.debug 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/Kconfig.debug 2012-07-15 20:28:25.899082875 +0200 -@@ -247,6 +247,14 @@ - their output to the standard serial port on the RealView - PB1176 platform. - -+ config DEBUG_BCM2708_UART0 -+ bool "Broadcom BCM2708 UART0 (PL011)" -+ depends on MACH_BCM2708 -+ help -+ Say Y here if you want the debug print routines to direct -+ their output to UART 0. The port must have been initialised -+ by the boot-loader before use. ++config BCM2708_GPIO ++ bool "BCM2708 gpio support" ++ depends on MACH_BCM2708 ++ select ARCH_REQUIRE_GPIOLIB ++ default y ++ help ++ Include support for the Broadcom(R) BCM2708 gpio. + - endchoice - - config EARLY_PRINTK -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/armctrl.c ---- linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/armctrl.c 2012-07-15 20:28:26.133087278 +0200 -@@ -0,0 +1,399 @@ ++config BCM2708_VCMEM ++ bool "Videocore Memory" ++ depends on MACH_BCM2708 ++ default y ++ help ++ Helper for videocore memory access and total size allocation. ++ ++config BCM2708_NOL2CACHE ++ bool "Videocore L2 cache disable" ++ depends on MACH_BCM2708 ++ default n ++ help ++ Do not allow ARM to use GPU's L2 cache. Requires disable_l2cache in config.txt. ++ ++endmenu +diff --git a/arch/arm/mach-bcm2708/Makefile b/arch/arm/mach-bcm2708/Makefile +new file mode 100644 +index 0000000..164ecb2 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/Makefile +@@ -0,0 +1,8 @@ ++# ++# Makefile for the linux kernel. ++# ++ ++obj-$(CONFIG_MACH_BCM2708) += clock.o bcm2708.o armctrl.o vcio.o power.o dma.o ++obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o ++obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o ++ +diff --git a/arch/arm/mach-bcm2708/Makefile.boot b/arch/arm/mach-bcm2708/Makefile.boot +new file mode 100644 +index 0000000..67039c3 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/Makefile.boot +@@ -0,0 +1,3 @@ ++ zreladdr-y := 0x00008000 ++params_phys-y := 0x00000100 ++initrd_phys-y := 0x00800000 +diff --git a/arch/arm/mach-bcm2708/armctrl.c b/arch/arm/mach-bcm2708/armctrl.c +new file mode 100644 +index 0000000..cdaa761 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/armctrl.c +@@ -0,0 +1,416 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.c + * @@ -1682,12 +2231,20 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c linux-rpi-bootc-3.2.23/a + IO_ADDRESS(ARM_IRQ_DIBL3), + 0 + }; ++ ++ if(d->irq >= FIQ_START) ++ { ++ writel(0, __io(IO_ADDRESS(ARM_IRQ_FAST))); ++ } ++ else ++ { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) -+ unsigned int data = (unsigned int)irq_get_chip_data(d->irq); ++ unsigned int data = (unsigned int)irq_get_chip_data(d->irq); +#else -+ unsigned int data = (unsigned int)get_irq_chip_data(irq); ++ unsigned int data = (unsigned int)get_irq_chip_data(irq); +#endif -+ writel(1 << (data & 0x1f), __io(disables[(data >> 5) & 0x3])); ++ writel(1 << (data & 0x1f), __io(disables[(data >> 5) & 0x3])); ++ } +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) @@ -1702,12 +2259,21 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c linux-rpi-bootc-3.2.23/a + IO_ADDRESS(ARM_IRQ_ENBL3), + 0 + }; ++ ++ if(d->irq >= FIQ_START) ++ { ++ unsigned int data = (unsigned int)irq_get_chip_data(d->irq) - FIQ_START; ++ writel(0x80 | data, __io(IO_ADDRESS(ARM_IRQ_FAST))); ++ } ++ else ++ { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) -+ unsigned int data = (unsigned int)irq_get_chip_data(d->irq); ++ unsigned int data = (unsigned int)irq_get_chip_data(d->irq); +#else -+ unsigned int data = (unsigned int)get_irq_chip_data(irq); ++ unsigned int data = (unsigned int)get_irq_chip_data(irq); +#endif -+ writel(1 << (data & 0x1f), __io(enables[(data >> 5) & 0x3])); ++ writel(1 << (data & 0x1f), __io(enables[(data >> 5) & 0x3])); ++ } +} + +#if defined(CONFIG_PM) @@ -2002,7 +2568,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c linux-rpi-bootc-3.2.23/a + + for (irq = 0; irq < NR_IRQS; irq++) { + unsigned int data = irq; -+ if (irq >= INTERRUPT_JPEG) ++ if (irq >= INTERRUPT_JPEG && irq <= INTERRUPT_ARASANSDIO) + data = remap_irqs[irq - INTERRUPT_JPEG]; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) @@ -2020,9 +2586,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.c linux-rpi-bootc-3.2.23/a + armctrl_pm_register(base, irq_start, resume_sources); + return 0; +} -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/armctrl.h ---- linux-3.2.23/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/armctrl.h 2012-07-15 20:28:26.130087221 +0200 +diff --git a/arch/arm/mach-bcm2708/armctrl.h b/arch/arm/mach-bcm2708/armctrl.h +new file mode 100644 +index 0000000..0aa916e +--- /dev/null ++++ b/arch/arm/mach-bcm2708/armctrl.h @@ -0,0 +1,27 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.h @@ -2051,10 +2619,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/armctrl.h linux-rpi-bootc-3.2.23/a + u32 armctrl_sources, u32 resume_sources); + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708.c ---- linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708.c 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,769 @@ +diff --git a/arch/arm/mach-bcm2708/bcm2708.c b/arch/arm/mach-bcm2708/bcm2708.c +new file mode 100644 +index 0000000..6f63532 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/bcm2708.c +@@ -0,0 +1,814 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.c + * @@ -2089,6 +2659,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a +#include +#include +#include ++#include + +#include +#include @@ -2126,6 +2697,9 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a + */ +#define DMA_MASK_BITS_COMMON 32 + ++// use GPIO 4 for the one-wire GPIO pin, if enabled ++#define W1_GPIO 4 ++ +static DEFINE_CLOCK_DATA(cd); + +/* command line parameters */ @@ -2348,6 +2922,19 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a +}; +#endif /* CONFIG_MMC_BCM2708 */ + ++#if defined(CONFIG_W1_MASTER_GPIO) || defined(CONFIG_W1_MASTER_GPIO_MODULE) ++static struct w1_gpio_platform_data w1_gpio_pdata = { ++ .pin = W1_GPIO, ++ .is_open_drain = 0, ++}; ++ ++static struct platform_device w1_device = { ++ .name = "w1-gpio", ++ .id = -1, ++ .dev.platform_data = &w1_gpio_pdata, ++}; ++#endif ++ +static u64 fb_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON); + +static struct platform_device bcm2708_fb_device = { @@ -2389,12 +2976,32 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a + .flags = IORESOURCE_MEM, + }, + [1] = { -+ .start = IRQ_USB, -+ .end = IRQ_USB, ++ .start = MPHI_BASE, ++ .end = MPHI_BASE + SZ_4K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [2] = { ++ .start = IRQ_HOSTPORT, ++ .end = IRQ_HOSTPORT, + .flags = IORESOURCE_IRQ, + }, +}; + ++extern bool fiq_fix_enable; ++ ++static struct resource bcm2708_usb_resources_no_fiq_fix[] = { ++ [0] = { ++ .start = USB_BASE, ++ .end = USB_BASE + SZ_128K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = IRQ_USB, ++ .end = IRQ_USB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ +static u64 usb_dmamask = DMA_BIT_MASK(DMA_MASK_BITS_COMMON); + +static struct platform_device bcm2708_usb_device = { @@ -2649,11 +3256,19 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a +#ifdef CONFIG_BCM2708_GPIO + bcm_register_device(&bcm2708_gpio_device); +#endif ++#if defined(CONFIG_W1_MASTER_GPIO) || defined(CONFIG_W1_MASTER_GPIO_MODULE) ++ platform_device_register(&w1_device); ++#endif + bcm_register_device(&bcm2708_systemtimer_device); +#ifdef CONFIG_MMC_BCM2708 + bcm_register_device(&bcm2708_mci_device); +#endif + bcm_register_device(&bcm2708_fb_device); ++ if (!fiq_fix_enable) ++ { ++ bcm2708_usb_device.resource = bcm2708_usb_resources_no_fiq_fix; ++ bcm2708_usb_device.num_resources = ARRAY_SIZE(bcm2708_usb_resources_no_fiq_fix); ++ } + bcm_register_device(&bcm2708_usb_device); + bcm_register_device(&bcm2708_uart1_device); + bcm_register_device(&bcm2708_powerman_device); @@ -2687,7 +3302,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a +#endif +} + -+#define TIMER_PERIOD 10000 /* HZ in microsecs */ ++#define TIMER_PERIOD DIV_ROUND_CLOSEST(STC_FREQ_HZ, HZ) + +static void timer_set_mode(enum clock_event_mode mode, + struct clock_event_device *clk) @@ -2824,349 +3439,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.c linux-rpi-bootc-3.2.23/a + &bcm2708_timer,.init_machine = + bcm2708_init, MACHINE_END module_param(boardrev, uint, 0644); +module_param(serial, uint, 0644); -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708_gpio.c ---- linux-3.2.23/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708_gpio.c 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,336 @@ -+/* -+ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c -+ * -+ * Copyright (C) 2010 Broadcom -+ * -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define BCM_GPIO_DRIVER_NAME "bcm2708_gpio" -+#define DRIVER_NAME BCM_GPIO_DRIVER_NAME -+#define BCM_GPIO_USE_IRQ 1 -+ -+#define GPIOFSEL(x) (0x00+(x)*4) -+#define GPIOSET(x) (0x1c+(x)*4) -+#define GPIOCLR(x) (0x28+(x)*4) -+#define GPIOLEV(x) (0x34+(x)*4) -+#define GPIOEDS(x) (0x40+(x)*4) -+#define GPIOREN(x) (0x4c+(x)*4) -+#define GPIOFEN(x) (0x58+(x)*4) -+#define GPIOHEN(x) (0x64+(x)*4) -+#define GPIOLEN(x) (0x70+(x)*4) -+#define GPIOAREN(x) (0x7c+(x)*4) -+#define GPIOAFEN(x) (0x88+(x)*4) -+#define GPIOUD(x) (0x94+(x)*4) -+#define GPIOUDCLK(x) (0x98+(x)*4) -+ -+enum { GPIO_FSEL_INPUT, GPIO_FSEL_OUTPUT, -+ GPIO_FSEL_ALT5, GPIO_FSEL_ALT_4, -+ GPIO_FSEL_ALT0, GPIO_FSEL_ALT1, -+ GPIO_FSEL_ALT2, GPIO_FSEL_ALT3, }; -+ -+ /* Each of the two spinlocks protects a different set of hardware -+ * regiters and data structurs. This decouples the code of the IRQ from -+ * the GPIO code. This also makes the case of a GPIO routine call from -+ * the IRQ code simpler. -+ */ -+static DEFINE_SPINLOCK(lock); /* GPIO registers */ -+ -+ -+struct bcm2708_gpio { -+ struct list_head list; -+ void __iomem *base; -+ struct gpio_chip gc; -+ unsigned long rising; -+ unsigned long falling; -+}; -+ -+static int bcm2708_set_function(struct gpio_chip *gc, unsigned offset, int function) -+{ -+ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); -+ unsigned long flags; -+ unsigned gpiodir; -+ unsigned gpio_bank = offset/10; -+ unsigned gpio_field_offset = (offset - 10*gpio_bank) * 3; -+ -+//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_set_function %p (%d,%d)\n", gc, offset, function); -+ if (offset >= BCM_NR_GPIOS) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&lock, flags); -+ -+ gpiodir = readl(gpio->base + GPIOFSEL(gpio_bank)); -+ gpiodir &= ~(7 << gpio_field_offset); -+ gpiodir |= function << gpio_field_offset; -+ writel(gpiodir, gpio->base + GPIOFSEL(gpio_bank)); -+ spin_unlock_irqrestore(&lock, flags); -+ gpiodir = readl(gpio->base + GPIOFSEL(gpio_bank)); -+ -+ return 0; -+} -+ -+ -+static int bcm2708_gpio_dir_in(struct gpio_chip *gc, unsigned offset) -+{ -+ return bcm2708_set_function(gc, offset, GPIO_FSEL_INPUT); -+} -+ -+static void bcm2708_gpio_set(struct gpio_chip *gc, unsigned offset, int value); -+static int bcm2708_gpio_dir_out(struct gpio_chip *gc, unsigned offset, int value) -+{ -+ int ret; -+ ret = bcm2708_set_function(gc, offset, GPIO_FSEL_OUTPUT); -+ if (ret >= 0) -+ bcm2708_gpio_set(gc, offset, value); -+ return ret; -+} -+ -+static int bcm2708_gpio_get(struct gpio_chip *gc, unsigned offset) -+{ -+ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); -+ unsigned gpio_bank = offset/32; -+ unsigned gpio_field_offset = (offset - 32*gpio_bank); -+ unsigned lev; -+ -+ if (offset >= BCM_NR_GPIOS) -+ return 0; -+ lev = readl(gpio->base + GPIOLEV(gpio_bank)); -+//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_get %p (%d)=%d\n", gc, offset, 0x1 & (lev>>gpio_field_offset)); -+ return 0x1 & (lev>>gpio_field_offset); -+} -+ -+static void bcm2708_gpio_set(struct gpio_chip *gc, unsigned offset, int value) -+{ -+ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); -+ unsigned gpio_bank = offset/32; -+ unsigned gpio_field_offset = (offset - 32*gpio_bank); -+//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_set %p (%d=%d)\n", gc, offset, value); -+ if (offset >= BCM_NR_GPIOS) -+ return; -+ if (value) -+ writel(1<base + GPIOSET(gpio_bank)); -+ else -+ writel(1<base + GPIOCLR(gpio_bank)); -+} -+ -+/************************************************************************************************************************* -+ * bcm2708 GPIO IRQ -+ */ -+ -+ -+#if BCM_GPIO_USE_IRQ -+ -+#define IRQ_TO_GPIO(x) irq_to_gpio(x) -+ -+static int bcm2708_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) { -+ return gpio_to_irq(gpio); -+} -+ -+ -+static int bcm2708_gpio_irq_set_type(struct irq_data *d, unsigned type) { -+ unsigned irq = d->irq; -+ struct bcm2708_gpio *gpio=irq_get_chip_data(irq); -+ -+ if (type & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) -+ return -EINVAL; -+ -+ if (type & IRQ_TYPE_EDGE_RISING) { -+ gpio->rising |= (1 << IRQ_TO_GPIO(irq)); -+ } else { -+ gpio->rising &= ~(1 << IRQ_TO_GPIO(irq)); -+ } -+ -+ if (type & IRQ_TYPE_EDGE_FALLING) { -+ gpio->falling |= (1 << IRQ_TO_GPIO(irq)); -+ } else { -+ gpio->falling &= ~(1 << IRQ_TO_GPIO(irq)); -+ } -+ return 0; -+} -+ -+static void bcm2708_gpio_irq_mask(struct irq_data *d) { -+ unsigned irq = d->irq; -+ struct bcm2708_gpio *gpio=irq_get_chip_data(irq); -+ unsigned gn = IRQ_TO_GPIO(irq); -+ unsigned gb = gn/32; -+ unsigned long rising=readl(gpio->base + GPIOREN(gb)); -+ unsigned long falling=readl(gpio->base + GPIOFEN(gb)); -+ -+ writel(rising & ~(1 << gn), gpio->base + GPIOREN(gb)); -+ writel(falling & ~(1 << gn), gpio->base + GPIOFEN(gb)); -+} -+ -+static void bcm2708_gpio_irq_unmask(struct irq_data *d) { -+ unsigned irq = d->irq; -+ struct bcm2708_gpio *gpio=irq_get_chip_data(irq); -+ unsigned gn = IRQ_TO_GPIO(irq); -+ unsigned gb = gn/32; -+ unsigned long rising=readl(gpio->base + GPIOREN(gb)); -+ unsigned long falling=readl(gpio->base + GPIOFEN(gb)); -+ -+ gn=gn%32; -+ -+ writel(1 << gn, gpio->base + GPIOEDS(gb)); -+ -+ if(gpio->rising & (1 << gn)) { -+ writel(rising | (1 << gn), gpio->base + GPIOREN(gb)); -+ } else { -+ writel(rising & ~(1 << gn), gpio->base + GPIOREN(gb)); -+ } -+ -+ if(gpio->falling & (1 << gn)) { -+ writel(falling | (1 << gn), gpio->base + GPIOFEN(gb)); -+ } else { -+ writel(falling & ~(1 << gn), gpio->base + GPIOFEN(gb)); -+ } -+} -+ -+static struct irq_chip bcm2708_irqchip = { -+ .name = "GPIO", -+ .irq_enable = bcm2708_gpio_irq_unmask, -+ .irq_disable = bcm2708_gpio_irq_mask, -+ .irq_unmask = bcm2708_gpio_irq_unmask, -+ .irq_mask = bcm2708_gpio_irq_mask, -+ .irq_set_type = bcm2708_gpio_irq_set_type, -+}; -+ -+static irqreturn_t bcm2708_gpio_interrupt(int irq, void *dev_id) { -+ unsigned long edsr; -+ unsigned bank; -+ int i; -+ unsigned gpio; -+ for(bank=0; bank<=1; bank++) { -+ edsr=readl(__io_address(GPIO_BASE)+GPIOEDS(bank)); -+ for_each_set_bit(i, &edsr, 32) { -+ gpio=i+bank*32; -+ generic_handle_irq(gpio_to_irq(gpio)); -+ } -+ writel(0xffffffff, __io_address(GPIO_BASE)+GPIOEDS(bank)); -+ } -+ return IRQ_HANDLED; -+} -+ -+static struct irqaction bcm2708_gpio_irq = { -+ .name = "BCM2708 GPIO catchall handler", -+ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -+ .handler = bcm2708_gpio_interrupt, -+}; -+ -+ -+static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb) { -+ unsigned irq; -+ -+ ucb->gc.to_irq=bcm2708_gpio_to_irq; -+ -+ for (irq=GPIO_IRQ_START; irq<(GPIO_IRQ_START+GPIO_IRQS); irq++) { -+ irq_set_chip_data(irq, ucb); -+ irq_set_chip(irq, &bcm2708_irqchip); -+ set_irq_flags(irq, IRQF_VALID); -+ } -+ setup_irq(IRQ_GPIO3, &bcm2708_gpio_irq); -+} -+ -+#else -+ -+static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb) { -+} -+ -+#endif /* #if BCM_GPIO_USE_IRQ ******************************************************************************************************************/ -+ -+static int bcm2708_gpio_probe(struct platform_device *dev) -+{ -+ struct bcm2708_gpio *ucb; -+ struct resource *res; -+ int err = 0; -+ -+ printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_probe %p\n", dev); -+ -+ ucb = kzalloc(sizeof(*ucb), GFP_KERNEL); -+ if (NULL == ucb) { -+ printk(KERN_ERR DRIVER_NAME ": failed to allocate " -+ "mailbox memory\n"); -+ err = -ENOMEM; -+ goto err; -+ } -+ -+ res = platform_get_resource(dev, IORESOURCE_MEM, 0); -+ -+ platform_set_drvdata(dev, ucb); -+ ucb->base = __io_address(GPIO_BASE); -+ -+ ucb->gc.label = "bcm2708_gpio"; -+ ucb->gc.base = 0; -+ ucb->gc.ngpio = BCM_NR_GPIOS; -+ ucb->gc.owner = THIS_MODULE; -+ -+ ucb->gc.direction_input = bcm2708_gpio_dir_in; -+ ucb->gc.direction_output = bcm2708_gpio_dir_out; -+ ucb->gc.get = bcm2708_gpio_get; -+ ucb->gc.set = bcm2708_gpio_set; -+ ucb->gc.can_sleep = 0; -+ -+ bcm2708_gpio_irq_init(ucb); -+ -+ err = gpiochip_add(&ucb->gc); -+ if (err) -+ goto err; -+ -+err: -+ return err; -+ -+} -+ -+static int bcm2708_gpio_remove(struct platform_device *dev) -+{ -+ int err = 0; -+ struct bcm2708_gpio *ucb = platform_get_drvdata(dev); -+ -+ printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_remove %p\n", dev); -+ -+ err = gpiochip_remove(&ucb->gc); -+ -+ platform_set_drvdata(dev, NULL); -+ kfree(ucb); -+ -+ return err; -+} -+ -+static struct platform_driver bcm2708_gpio_driver = { -+ .probe = bcm2708_gpio_probe, -+ .remove = bcm2708_gpio_remove, -+ .driver = { -+ .name = "bcm2708_gpio" -+ }, -+}; -+ -+static int __init bcm2708_gpio_init(void) -+{ -+ return platform_driver_register(&bcm2708_gpio_driver); -+} -+ -+static void __exit bcm2708_gpio_exit(void) -+{ -+ platform_driver_unregister(&bcm2708_gpio_driver); -+} -+ -+module_init(bcm2708_gpio_init); -+module_exit(bcm2708_gpio_exit); -+ -+MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver"); -+MODULE_LICENSE("GPL"); -+ -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708.h ---- linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/bcm2708.h 2012-07-15 20:28:26.133087278 +0200 +diff --git a/arch/arm/mach-bcm2708/bcm2708.h b/arch/arm/mach-bcm2708/bcm2708.h +new file mode 100644 +index 0000000..dfe8700 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/bcm2708.h @@ -0,0 +1,51 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.h @@ -3219,9 +3496,356 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/bcm2708.h linux-rpi-bootc-3.2.23/a +} + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/clock.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/clock.c ---- linux-3.2.23/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/clock.c 2012-07-15 20:28:26.130087221 +0200 +diff --git a/arch/arm/mach-bcm2708/bcm2708_gpio.c b/arch/arm/mach-bcm2708/bcm2708_gpio.c +new file mode 100644 +index 0000000..6c81d9d +--- /dev/null ++++ b/arch/arm/mach-bcm2708/bcm2708_gpio.c +@@ -0,0 +1,339 @@ ++/* ++ * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c ++ * ++ * Copyright (C) 2010 Broadcom ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define BCM_GPIO_DRIVER_NAME "bcm2708_gpio" ++#define DRIVER_NAME BCM_GPIO_DRIVER_NAME ++#define BCM_GPIO_USE_IRQ 1 ++ ++#define GPIOFSEL(x) (0x00+(x)*4) ++#define GPIOSET(x) (0x1c+(x)*4) ++#define GPIOCLR(x) (0x28+(x)*4) ++#define GPIOLEV(x) (0x34+(x)*4) ++#define GPIOEDS(x) (0x40+(x)*4) ++#define GPIOREN(x) (0x4c+(x)*4) ++#define GPIOFEN(x) (0x58+(x)*4) ++#define GPIOHEN(x) (0x64+(x)*4) ++#define GPIOLEN(x) (0x70+(x)*4) ++#define GPIOAREN(x) (0x7c+(x)*4) ++#define GPIOAFEN(x) (0x88+(x)*4) ++#define GPIOUD(x) (0x94+(x)*4) ++#define GPIOUDCLK(x) (0x98+(x)*4) ++ ++enum { GPIO_FSEL_INPUT, GPIO_FSEL_OUTPUT, ++ GPIO_FSEL_ALT5, GPIO_FSEL_ALT_4, ++ GPIO_FSEL_ALT0, GPIO_FSEL_ALT1, ++ GPIO_FSEL_ALT2, GPIO_FSEL_ALT3, ++}; ++ ++ /* Each of the two spinlocks protects a different set of hardware ++ * regiters and data structurs. This decouples the code of the IRQ from ++ * the GPIO code. This also makes the case of a GPIO routine call from ++ * the IRQ code simpler. ++ */ ++static DEFINE_SPINLOCK(lock); /* GPIO registers */ ++ ++struct bcm2708_gpio { ++ struct list_head list; ++ void __iomem *base; ++ struct gpio_chip gc; ++ unsigned long rising; ++ unsigned long falling; ++}; ++ ++static int bcm2708_set_function(struct gpio_chip *gc, unsigned offset, ++ int function) ++{ ++ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); ++ unsigned long flags; ++ unsigned gpiodir; ++ unsigned gpio_bank = offset / 10; ++ unsigned gpio_field_offset = (offset - 10 * gpio_bank) * 3; ++ ++//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_set_function %p (%d,%d)\n", gc, offset, function); ++ if (offset >= BCM_NR_GPIOS) ++ return -EINVAL; ++ ++ spin_lock_irqsave(&lock, flags); ++ ++ gpiodir = readl(gpio->base + GPIOFSEL(gpio_bank)); ++ gpiodir &= ~(7 << gpio_field_offset); ++ gpiodir |= function << gpio_field_offset; ++ writel(gpiodir, gpio->base + GPIOFSEL(gpio_bank)); ++ spin_unlock_irqrestore(&lock, flags); ++ gpiodir = readl(gpio->base + GPIOFSEL(gpio_bank)); ++ ++ return 0; ++} ++ ++static int bcm2708_gpio_dir_in(struct gpio_chip *gc, unsigned offset) ++{ ++ return bcm2708_set_function(gc, offset, GPIO_FSEL_INPUT); ++} ++ ++static void bcm2708_gpio_set(struct gpio_chip *gc, unsigned offset, int value); ++static int bcm2708_gpio_dir_out(struct gpio_chip *gc, unsigned offset, ++ int value) ++{ ++ int ret; ++ ret = bcm2708_set_function(gc, offset, GPIO_FSEL_OUTPUT); ++ if (ret >= 0) ++ bcm2708_gpio_set(gc, offset, value); ++ return ret; ++} ++ ++static int bcm2708_gpio_get(struct gpio_chip *gc, unsigned offset) ++{ ++ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); ++ unsigned gpio_bank = offset / 32; ++ unsigned gpio_field_offset = (offset - 32 * gpio_bank); ++ unsigned lev; ++ ++ if (offset >= BCM_NR_GPIOS) ++ return 0; ++ lev = readl(gpio->base + GPIOLEV(gpio_bank)); ++//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_get %p (%d)=%d\n", gc, offset, 0x1 & (lev>>gpio_field_offset)); ++ return 0x1 & (lev >> gpio_field_offset); ++} ++ ++static void bcm2708_gpio_set(struct gpio_chip *gc, unsigned offset, int value) ++{ ++ struct bcm2708_gpio *gpio = container_of(gc, struct bcm2708_gpio, gc); ++ unsigned gpio_bank = offset / 32; ++ unsigned gpio_field_offset = (offset - 32 * gpio_bank); ++//printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_set %p (%d=%d)\n", gc, offset, value); ++ if (offset >= BCM_NR_GPIOS) ++ return; ++ if (value) ++ writel(1 << gpio_field_offset, gpio->base + GPIOSET(gpio_bank)); ++ else ++ writel(1 << gpio_field_offset, gpio->base + GPIOCLR(gpio_bank)); ++} ++ ++/************************************************************************************************************************* ++ * bcm2708 GPIO IRQ ++ */ ++ ++#if BCM_GPIO_USE_IRQ ++ ++#define IRQ_TO_GPIO(x) irq_to_gpio(x) ++ ++static int bcm2708_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) ++{ ++ return gpio_to_irq(gpio); ++} ++ ++static int bcm2708_gpio_irq_set_type(struct irq_data *d, unsigned type) ++{ ++ unsigned irq = d->irq; ++ struct bcm2708_gpio *gpio = irq_get_chip_data(irq); ++ ++ if (type & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) ++ return -EINVAL; ++ ++ if (type & IRQ_TYPE_EDGE_RISING) { ++ gpio->rising |= (1 << IRQ_TO_GPIO(irq)); ++ } else { ++ gpio->rising &= ~(1 << IRQ_TO_GPIO(irq)); ++ } ++ ++ if (type & IRQ_TYPE_EDGE_FALLING) { ++ gpio->falling |= (1 << IRQ_TO_GPIO(irq)); ++ } else { ++ gpio->falling &= ~(1 << IRQ_TO_GPIO(irq)); ++ } ++ return 0; ++} ++ ++static void bcm2708_gpio_irq_mask(struct irq_data *d) ++{ ++ unsigned irq = d->irq; ++ struct bcm2708_gpio *gpio = irq_get_chip_data(irq); ++ unsigned gn = IRQ_TO_GPIO(irq); ++ unsigned gb = gn / 32; ++ unsigned long rising = readl(gpio->base + GPIOREN(gb)); ++ unsigned long falling = readl(gpio->base + GPIOFEN(gb)); ++ ++ writel(rising & ~(1 << gn), gpio->base + GPIOREN(gb)); ++ writel(falling & ~(1 << gn), gpio->base + GPIOFEN(gb)); ++} ++ ++static void bcm2708_gpio_irq_unmask(struct irq_data *d) ++{ ++ unsigned irq = d->irq; ++ struct bcm2708_gpio *gpio = irq_get_chip_data(irq); ++ unsigned gn = IRQ_TO_GPIO(irq); ++ unsigned gb = gn / 32; ++ unsigned long rising = readl(gpio->base + GPIOREN(gb)); ++ unsigned long falling = readl(gpio->base + GPIOFEN(gb)); ++ ++ gn = gn % 32; ++ ++ writel(1 << gn, gpio->base + GPIOEDS(gb)); ++ ++ if (gpio->rising & (1 << gn)) { ++ writel(rising | (1 << gn), gpio->base + GPIOREN(gb)); ++ } else { ++ writel(rising & ~(1 << gn), gpio->base + GPIOREN(gb)); ++ } ++ ++ if (gpio->falling & (1 << gn)) { ++ writel(falling | (1 << gn), gpio->base + GPIOFEN(gb)); ++ } else { ++ writel(falling & ~(1 << gn), gpio->base + GPIOFEN(gb)); ++ } ++} ++ ++static struct irq_chip bcm2708_irqchip = { ++ .name = "GPIO", ++ .irq_enable = bcm2708_gpio_irq_unmask, ++ .irq_disable = bcm2708_gpio_irq_mask, ++ .irq_unmask = bcm2708_gpio_irq_unmask, ++ .irq_mask = bcm2708_gpio_irq_mask, ++ .irq_set_type = bcm2708_gpio_irq_set_type, ++}; ++ ++static irqreturn_t bcm2708_gpio_interrupt(int irq, void *dev_id) ++{ ++ unsigned long edsr; ++ unsigned bank; ++ int i; ++ unsigned gpio; ++ for (bank = 0; bank <= 1; bank++) { ++ edsr = readl(__io_address(GPIO_BASE) + GPIOEDS(bank)); ++ for_each_set_bit(i, &edsr, 32) { ++ gpio = i + bank * 32; ++ generic_handle_irq(gpio_to_irq(gpio)); ++ } ++ writel(0xffffffff, __io_address(GPIO_BASE) + GPIOEDS(bank)); ++ } ++ return IRQ_HANDLED; ++} ++ ++static struct irqaction bcm2708_gpio_irq = { ++ .name = "BCM2708 GPIO catchall handler", ++ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, ++ .handler = bcm2708_gpio_interrupt, ++}; ++ ++static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb) ++{ ++ unsigned irq; ++ ++ ucb->gc.to_irq = bcm2708_gpio_to_irq; ++ ++ for (irq = GPIO_IRQ_START; irq < (GPIO_IRQ_START + GPIO_IRQS); irq++) { ++ irq_set_chip_data(irq, ucb); ++ irq_set_chip(irq, &bcm2708_irqchip); ++ set_irq_flags(irq, IRQF_VALID); ++ } ++ setup_irq(IRQ_GPIO3, &bcm2708_gpio_irq); ++} ++ ++#else ++ ++static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb) ++{ ++} ++ ++#endif /* #if BCM_GPIO_USE_IRQ ***************************************************************************************************************** */ ++ ++static int bcm2708_gpio_probe(struct platform_device *dev) ++{ ++ struct bcm2708_gpio *ucb; ++ struct resource *res; ++ int err = 0; ++ ++ printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_probe %p\n", dev); ++ ++ ucb = kzalloc(sizeof(*ucb), GFP_KERNEL); ++ if (NULL == ucb) { ++ printk(KERN_ERR DRIVER_NAME ": failed to allocate " ++ "mailbox memory\n"); ++ err = -ENOMEM; ++ goto err; ++ } ++ ++ res = platform_get_resource(dev, IORESOURCE_MEM, 0); ++ ++ platform_set_drvdata(dev, ucb); ++ ucb->base = __io_address(GPIO_BASE); ++ ++ ucb->gc.label = "bcm2708_gpio"; ++ ucb->gc.base = 0; ++ ucb->gc.ngpio = BCM_NR_GPIOS; ++ ucb->gc.owner = THIS_MODULE; ++ ++ ucb->gc.direction_input = bcm2708_gpio_dir_in; ++ ucb->gc.direction_output = bcm2708_gpio_dir_out; ++ ucb->gc.get = bcm2708_gpio_get; ++ ucb->gc.set = bcm2708_gpio_set; ++ ucb->gc.can_sleep = 0; ++ ++ bcm2708_gpio_irq_init(ucb); ++ ++ err = gpiochip_add(&ucb->gc); ++ if (err) ++ goto err; ++ ++err: ++ return err; ++ ++} ++ ++static int bcm2708_gpio_remove(struct platform_device *dev) ++{ ++ int err = 0; ++ struct bcm2708_gpio *ucb = platform_get_drvdata(dev); ++ ++ printk(KERN_ERR DRIVER_NAME ": bcm2708_gpio_remove %p\n", dev); ++ ++ err = gpiochip_remove(&ucb->gc); ++ ++ platform_set_drvdata(dev, NULL); ++ kfree(ucb); ++ ++ return err; ++} ++ ++static struct platform_driver bcm2708_gpio_driver = { ++ .probe = bcm2708_gpio_probe, ++ .remove = bcm2708_gpio_remove, ++ .driver = { ++ .name = "bcm2708_gpio"}, ++}; ++ ++static int __init bcm2708_gpio_init(void) ++{ ++ return platform_driver_register(&bcm2708_gpio_driver); ++} ++ ++static void __exit bcm2708_gpio_exit(void) ++{ ++ platform_driver_unregister(&bcm2708_gpio_driver); ++} ++ ++module_init(bcm2708_gpio_init); ++module_exit(bcm2708_gpio_exit); ++ ++MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver"); ++MODULE_LICENSE("GPL"); +diff --git a/arch/arm/mach-bcm2708/clock.c b/arch/arm/mach-bcm2708/clock.c +new file mode 100644 +index 0000000..4fc556e +--- /dev/null ++++ b/arch/arm/mach-bcm2708/clock.c @@ -0,0 +1,61 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.c @@ -3284,9 +3908,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/clock.c linux-rpi-bootc-3.2.23/arc + return -EIO; +} +EXPORT_SYMBOL(clk_set_rate); -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/clock.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/clock.h ---- linux-3.2.23/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/clock.h 2012-07-15 20:28:26.131087240 +0200 +diff --git a/arch/arm/mach-bcm2708/clock.h b/arch/arm/mach-bcm2708/clock.h +new file mode 100644 +index 0000000..5f9d725 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/clock.h @@ -0,0 +1,24 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.h @@ -3312,9 +3938,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/clock.h linux-rpi-bootc-3.2.23/arc +struct clk { + unsigned long rate; +}; -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/dma.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/dma.c ---- linux-3.2.23/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/dma.c 2012-07-15 20:28:26.133087278 +0200 +diff --git a/arch/arm/mach-bcm2708/dma.c b/arch/arm/mach-bcm2708/dma.c +new file mode 100644 +index 0000000..0b7a4f6 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/dma.c @@ -0,0 +1,397 @@ +/* + * linux/arch/arm/mach-bcm2708/dma.c @@ -3713,9 +4341,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/dma.c linux-rpi-bootc-3.2.23/arch/ +MODULE_LICENSE("GPL"); + +MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM"); -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_control.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_control.h 2012-07-15 20:28:26.131087240 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/arm_control.h b/arch/arm/mach-bcm2708/include/mach/arm_control.h +new file mode 100644 +index 0000000..a82bb92 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/arm_control.h @@ -0,0 +1,419 @@ +/* + * linux/arch/arm/mach-bcm2708/arm_control.h @@ -4136,9 +4766,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-r +#define AJBTDO HW_REGISTER_RW(AJB_BASE+0x0c) + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_power.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_power.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/arm_power.h b/arch/arm/mach-bcm2708/include/mach/arm_power.h +new file mode 100644 +index 0000000..aae9136 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/arm_power.h @@ -0,0 +1,60 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h @@ -4200,9 +4832,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-rpi +}; + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/clkdev.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/clkdev.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/clkdev.h b/arch/arm/mach-bcm2708/include/mach/clkdev.h +new file mode 100644 +index 0000000..04b37a8 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/clkdev.h @@ -0,0 +1,7 @@ +#ifndef __ASM_MACH_CLKDEV_H +#define __ASM_MACH_CLKDEV_H @@ -4211,9 +4845,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-rpi-bo +#define __clk_put(clk) do { } while (0) + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/debug-macro.S ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/debug-macro.S b/arch/arm/mach-bcm2708/include/mach/debug-macro.S +new file mode 100644 +index 0000000..2d0dc1c +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/debug-macro.S @@ -0,0 +1,22 @@ +/* arch/arm/mach-bcm2708/include/mach/debug-macro.S + * @@ -4237,9 +4873,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-r + .endm + +#include -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/dma.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/dma.h 2012-07-15 20:28:26.131087240 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/dma.h b/arch/arm/mach-bcm2708/include/mach/dma.h +new file mode 100644 +index 0000000..25e06d7 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/dma.h @@ -0,0 +1,84 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/dma.h @@ -4325,9 +4963,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/dma.h linux-rpi-bootc + + +#endif /* _MACH_BCM2708_DMA_H */ -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/entry-macro.S ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/entry-macro.S b/arch/arm/mach-bcm2708/include/mach/entry-macro.S +new file mode 100644 +index 0000000..79b62d9 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/entry-macro.S @@ -0,0 +1,69 @@ +/* + * arch/arm/mach-bcm2708/include/mach/entry-macro.S @@ -4398,9 +5038,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-r +1020: @ EQ will be set if no irqs pending + + .endm -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/frc.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/frc.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/frc.h b/arch/arm/mach-bcm2708/include/mach/frc.h +new file mode 100644 +index 0000000..dd51e07 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/frc.h @@ -0,0 +1,38 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -4440,10 +5082,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/frc.h linux-rpi-bootc +extern unsigned long long frc_clock_ticks63(void); + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/gpio.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/gpio.h 2012-07-15 20:28:26.133087278 +0200 -@@ -0,0 +1,47 @@ +diff --git a/arch/arm/mach-bcm2708/include/mach/gpio.h b/arch/arm/mach-bcm2708/include/mach/gpio.h +new file mode 100644 +index 0000000..0b82f26 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/gpio.h +@@ -0,0 +1,48 @@ +/* + * arch/arm/mach-bcm2708/include/mach/gpio.h + * @@ -4491,9 +5135,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/gpio.h linux-rpi-boot +#endif /* CONFIG_GPIOLIB */ + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/hardware.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/hardware.h 2012-07-15 20:28:26.132087259 +0200 ++ +diff --git a/arch/arm/mach-bcm2708/include/mach/hardware.h b/arch/arm/mach-bcm2708/include/mach/hardware.h +new file mode 100644 +index 0000000..c2954e8 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/hardware.h @@ -0,0 +1,28 @@ +/* + * arch/arm/mach-bcm2708/include/mach/hardware.h @@ -4523,9 +5170,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/hardware.h linux-rpi- +#include + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/io.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/io.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/io.h b/arch/arm/mach-bcm2708/include/mach/io.h +new file mode 100644 +index 0000000..e8c7fca +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/io.h @@ -0,0 +1,28 @@ +/* + * arch/arm/mach-bcm2708/include/mach/io.h @@ -4555,10 +5204,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/io.h linux-rpi-bootc- +#define __mem_pci(a) (a) + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/irqs.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/irqs.h 2012-07-15 20:28:26.131087240 +0200 -@@ -0,0 +1,196 @@ +diff --git a/arch/arm/mach-bcm2708/include/mach/irqs.h b/arch/arm/mach-bcm2708/include/mach/irqs.h +new file mode 100644 +index 0000000..9aaedf1 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/irqs.h +@@ -0,0 +1,199 @@ +/* + * arch/arm/mach-bcm2708/include/mach/irqs.h + * @@ -4667,97 +5318,102 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/irqs.h linux-rpi-boot +#define IRQ_PENDING1 (IRQ_ARMCTRL_START + INTERRUPT_PENDING1) +#define IRQ_PENDING2 (IRQ_ARMCTRL_START + INTERRUPT_PENDING2) + ++#define FIQ_START HARD_IRQS ++ +/* + * FIQ interrupts definitions are the same as the INT definitions. + */ -+#define FIQ_TIMER0 INT_TIMER0 -+#define FIQ_TIMER1 INT_TIMER1 -+#define FIQ_TIMER2 INT_TIMER2 -+#define FIQ_TIMER3 INT_TIMER3 -+#define FIQ_CODEC0 INT_CODEC0 -+#define FIQ_CODEC1 INT_CODEC1 -+#define FIQ_CODEC2 INT_CODEC2 -+#define FIQ_JPEG INT_JPEG -+#define FIQ_ISP INT_ISP -+#define FIQ_USB INT_USB -+#define FIQ_3D INT_3D -+#define FIQ_TRANSPOSER INT_TRANSPOSER -+#define FIQ_MULTICORESYNC0 INT_MULTICORESYNC0 -+#define FIQ_MULTICORESYNC1 INT_MULTICORESYNC1 -+#define FIQ_MULTICORESYNC2 INT_MULTICORESYNC2 -+#define FIQ_MULTICORESYNC3 INT_MULTICORESYNC3 -+#define FIQ_DMA0 INT_DMA0 -+#define FIQ_DMA1 INT_DMA1 -+#define FIQ_DMA2 INT_DMA2 -+#define FIQ_DMA3 INT_DMA3 -+#define FIQ_DMA4 INT_DMA4 -+#define FIQ_DMA5 INT_DMA5 -+#define FIQ_DMA6 INT_DMA6 -+#define FIQ_DMA7 INT_DMA7 -+#define FIQ_DMA8 INT_DMA8 -+#define FIQ_DMA9 INT_DMA9 -+#define FIQ_DMA10 INT_DMA10 -+#define FIQ_DMA11 INT_DMA11 -+#define FIQ_DMA12 INT_DMA12 -+#define FIQ_AUX INT_AUX -+#define FIQ_ARM INT_ARM -+#define FIQ_VPUDMA INT_VPUDMA -+#define FIQ_HOSTPORT INT_HOSTPORT -+#define FIQ_VIDEOSCALER INT_VIDEOSCALER -+#define FIQ_CCP2TX INT_CCP2TX -+#define FIQ_SDC INT_SDC -+#define FIQ_DSI0 INT_DSI0 -+#define FIQ_AVE INT_AVE -+#define FIQ_CAM0 INT_CAM0 -+#define FIQ_CAM1 INT_CAM1 -+#define FIQ_HDMI0 INT_HDMI0 -+#define FIQ_HDMI1 INT_HDMI1 -+#define FIQ_PIXELVALVE1 INT_PIXELVALVE1 -+#define FIQ_I2CSPISLV INT_I2CSPISLV -+#define FIQ_DSI1 INT_DSI1 -+#define FIQ_PWA0 INT_PWA0 -+#define FIQ_PWA1 INT_PWA1 -+#define FIQ_CPR INT_CPR -+#define FIQ_SMI INT_SMI -+#define FIQ_GPIO0 INT_GPIO0 -+#define FIQ_GPIO1 INT_GPIO1 -+#define FIQ_GPIO2 INT_GPIO2 -+#define FIQ_GPIO3 INT_GPIO3 -+#define FIQ_I2C INT_I2C -+#define FIQ_SPI INT_SPI -+#define FIQ_I2SPCM INT_I2SPCM -+#define FIQ_SDIO INT_SDIO -+#define FIQ_UART INT_UART -+#define FIQ_SLIMBUS INT_SLIMBUS -+#define FIQ_VEC INT_VEC -+#define FIQ_CPG INT_CPG -+#define FIQ_RNG INT_RNG -+#define FIQ_ARASANSDIO INT_ARASANSDIO -+#define FIQ_AVSPMON INT_AVSPMON ++#define FIQ_TIMER0 (FIQ_START+INTERRUPT_TIMER0) ++#define FIQ_TIMER1 (FIQ_START+INTERRUPT_TIMER1) ++#define FIQ_TIMER2 (FIQ_START+INTERRUPT_TIMER2) ++#define FIQ_TIMER3 (FIQ_START+INTERRUPT_TIMER3) ++#define FIQ_CODEC0 (FIQ_START+INTERRUPT_CODEC0) ++#define FIQ_CODEC1 (FIQ_START+INTERRUPT_CODEC1) ++#define FIQ_CODEC2 (FIQ_START+INTERRUPT_CODEC2) ++#define FIQ_JPEG (FIQ_START+INTERRUPT_JPEG) ++#define FIQ_ISP (FIQ_START+INTERRUPT_ISP) ++#define FIQ_USB (FIQ_START+INTERRUPT_USB) ++#define FIQ_3D (FIQ_START+INTERRUPT_3D) ++#define FIQ_TRANSPOSER (FIQ_START+INTERRUPT_TRANSPOSER) ++#define FIQ_MULTICORESYNC0 (FIQ_START+INTERRUPT_MULTICORESYNC0) ++#define FIQ_MULTICORESYNC1 (FIQ_START+INTERRUPT_MULTICORESYNC1) ++#define FIQ_MULTICORESYNC2 (FIQ_START+INTERRUPT_MULTICORESYNC2) ++#define FIQ_MULTICORESYNC3 (FIQ_START+INTERRUPT_MULTICORESYNC3) ++#define FIQ_DMA0 (FIQ_START+INTERRUPT_DMA0) ++#define FIQ_DMA1 (FIQ_START+INTERRUPT_DMA1) ++#define FIQ_DMA2 (FIQ_START+INTERRUPT_DMA2) ++#define FIQ_DMA3 (FIQ_START+INTERRUPT_DMA3) ++#define FIQ_DMA4 (FIQ_START+INTERRUPT_DMA4) ++#define FIQ_DMA5 (FIQ_START+INTERRUPT_DMA5) ++#define FIQ_DMA6 (FIQ_START+INTERRUPT_DMA6) ++#define FIQ_DMA7 (FIQ_START+INTERRUPT_DMA7) ++#define FIQ_DMA8 (FIQ_START+INTERRUPT_DMA8) ++#define FIQ_DMA9 (FIQ_START+INTERRUPT_DMA9) ++#define FIQ_DMA10 (FIQ_START+INTERRUPT_DMA10) ++#define FIQ_DMA11 (FIQ_START+INTERRUPT_DMA11) ++#define FIQ_DMA12 (FIQ_START+INTERRUPT_DMA12) ++#define FIQ_AUX (FIQ_START+INTERRUPT_AUX) ++#define FIQ_ARM (FIQ_START+INTERRUPT_ARM) ++#define FIQ_VPUDMA (FIQ_START+INTERRUPT_VPUDMA) ++#define FIQ_HOSTPORT (FIQ_START+INTERRUPT_HOSTPORT) ++#define FIQ_VIDEOSCALER (FIQ_START+INTERRUPT_VIDEOSCALER) ++#define FIQ_CCP2TX (FIQ_START+INTERRUPT_CCP2TX) ++#define FIQ_SDC (FIQ_START+INTERRUPT_SDC) ++#define FIQ_DSI0 (FIQ_START+INTERRUPT_DSI0) ++#define FIQ_AVE (FIQ_START+INTERRUPT_AVE) ++#define FIQ_CAM0 (FIQ_START+INTERRUPT_CAM0) ++#define FIQ_CAM1 (FIQ_START+INTERRUPT_CAM1) ++#define FIQ_HDMI0 (FIQ_START+INTERRUPT_HDMI0) ++#define FIQ_HDMI1 (FIQ_START+INTERRUPT_HDMI1) ++#define FIQ_PIXELVALVE1 (FIQ_START+INTERRUPT_PIXELVALVE1) ++#define FIQ_I2CSPISLV (FIQ_START+INTERRUPT_I2CSPISLV) ++#define FIQ_DSI1 (FIQ_START+INTERRUPT_DSI1) ++#define FIQ_PWA0 (FIQ_START+INTERRUPT_PWA0) ++#define FIQ_PWA1 (FIQ_START+INTERRUPT_PWA1) ++#define FIQ_CPR (FIQ_START+INTERRUPT_CPR) ++#define FIQ_SMI (FIQ_START+INTERRUPT_SMI) ++#define FIQ_GPIO0 (FIQ_START+INTERRUPT_GPIO0) ++#define FIQ_GPIO1 (FIQ_START+INTERRUPT_GPIO1) ++#define FIQ_GPIO2 (FIQ_START+INTERRUPT_GPIO2) ++#define FIQ_GPIO3 (FIQ_START+INTERRUPT_GPIO3) ++#define FIQ_I2C (FIQ_START+INTERRUPT_I2C) ++#define FIQ_SPI (FIQ_START+INTERRUPT_SPI) ++#define FIQ_I2SPCM (FIQ_START+INTERRUPT_I2SPCM) ++#define FIQ_SDIO (FIQ_START+INTERRUPT_SDIO) ++#define FIQ_UART (FIQ_START+INTERRUPT_UART) ++#define FIQ_SLIMBUS (FIQ_START+INTERRUPT_SLIMBUS) ++#define FIQ_VEC (FIQ_START+INTERRUPT_VEC) ++#define FIQ_CPG (FIQ_START+INTERRUPT_CPG) ++#define FIQ_RNG (FIQ_START+INTERRUPT_RNG) ++#define FIQ_ARASANSDIO (FIQ_START+INTERRUPT_ARASANSDIO) ++#define FIQ_AVSPMON (FIQ_START+INTERRUPT_AVSPMON) + -+#define FIQ_ARM_TIMER INT_ARM_TIMER -+#define FIQ_ARM_MAILBOX INT_ARM_MAILBOX -+#define FIQ_ARM_DOORBELL_0 INT_ARM_DOORBELL_0 -+#define FIQ_ARM_DOORBELL_1 INT_ARM_DOORBELL_1 -+#define FIQ_VPU0_HALTED INT_VPU0_HALTED -+#define FIQ_VPU1_HALTED INT_VPU1_HALTED -+#define FIQ_ILLEGAL_TYPE0 INT_ILLEGAL_TYPE0 -+#define FIQ_ILLEGAL_TYPE1 INT_ILLEGAL_TYPE1 -+#define FIQ_PENDING1 INT_PENDING1 -+#define FIQ_PENDING2 INT_PENDING2 ++#define FIQ_ARM_TIMER (FIQ_START+INTERRUPT_ARM_TIMER) ++#define FIQ_ARM_MAILBOX (FIQ_START+INTERRUPT_ARM_MAILBOX) ++#define FIQ_ARM_DOORBELL_0 (FIQ_START+INTERRUPT_ARM_DOORBELL_0) ++#define FIQ_ARM_DOORBELL_1 (FIQ_START+INTERRUPT_ARM_DOORBELL_1) ++#define FIQ_VPU0_HALTED (FIQ_START+INTERRUPT_VPU0_HALTED) ++#define FIQ_VPU1_HALTED (FIQ_START+INTERRUPT_VPU1_HALTED) ++#define FIQ_ILLEGAL_TYPE0 (FIQ_START+INTERRUPT_ILLEGAL_TYPE0) ++#define FIQ_ILLEGAL_TYPE1 (FIQ_START+INTERRUPT_ILLEGAL_TYPE1) ++#define FIQ_PENDING1 (FIQ_START+INTERRUPT_PENDING1) ++#define FIQ_PENDING2 (FIQ_START+INTERRUPT_PENDING2) ++ ++#define GPIO_IRQ_START (HARD_IRQS + FIQ_IRQS) + +#define HARD_IRQS (64 + 21) -+#define GPIO_IRQ_START HARD_IRQS ++#define FIQ_IRQS (64 + 21) ++#define GPIO_IRQS (32*5) + -+#define GPIO_IRQS 32*5 -+ -+#define NR_IRQS HARD_IRQS+GPIO_IRQS ++#define NR_IRQS HARD_IRQS+FIQ_IRQS+GPIO_IRQS + + +#endif /* _BCM2708_IRQS_H_ */ -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/memory.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/memory.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/memory.h b/arch/arm/mach-bcm2708/include/mach/memory.h +new file mode 100644 +index 0000000..5d47513 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/memory.h @@ -0,0 +1,64 @@ +/* + * arch/arm/mach-bcm2708/include/mach/memory.h @@ -4823,10 +5479,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/memory.h linux-rpi-bo +#define CONSISTENT_DMA_SIZE 0x00200000 + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h 2012-07-15 20:28:26.132087259 +0200 -@@ -0,0 +1,224 @@ +diff --git a/arch/arm/mach-bcm2708/include/mach/platform.h b/arch/arm/mach-bcm2708/include/mach/platform.h +new file mode 100644 +index 0000000..9c5d334 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/platform.h +@@ -0,0 +1,225 @@ +/* + * arch/arm/mach-bcm2708/include/mach/platform.h + * @@ -4885,7 +5543,9 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi- + */ + +#define BCM2708_PERI_BASE 0x20000000 ++#define IC0_BASE (BCM2708_PERI_BASE + 0x2000) +#define ST_BASE (BCM2708_PERI_BASE + 0x3000) /* System Timer */ ++#define MPHI_BASE (BCM2708_PERI_BASE + 0x6000) /* Message -based Parallel Host Interface */ +#define DMA_BASE (BCM2708_PERI_BASE + 0x7000) /* DMA controller */ +#define ARM_BASE (BCM2708_PERI_BASE + 0xB000) /* BCM2708 ARM control block */ +#define PM_BASE (BCM2708_PERI_BASE + 0x100000) /* Power Management, Reset controller and Watchdog registers */ @@ -5032,10 +5692,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi- +#define PM_RSTC_WRCFG_CLR 0xffffffcf +#define PM_RSTC_WRCFG_SET 0x00000030 +#define PM_RSTC_WRCFG_FULL_RESET 0x00000020 -+#define PM_RSTC_RESET 0x00000102 -+ -+/* AMBA UART clock */ -+#define UART0_CLOCK 3000000 ++#define PM_RSTC_RESET 0x00000102 + +#define PM_RSTS_HADPOR_SET 0x00001000 +#define PM_RSTS_HADSRH_SET 0x00000400 @@ -5048,12 +5705,16 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/platform.h linux-rpi- +#define PM_RSTS_HADDRF_SET 0x00000002 +#define PM_RSTS_HADDRQ_SET 0x00000001 + ++#define UART0_CLOCK 3000000 ++ +#endif + +/* END */ -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/power.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/power.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/power.h b/arch/arm/mach-bcm2708/include/mach/power.h +new file mode 100644 +index 0000000..52b3b02 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/power.h @@ -0,0 +1,26 @@ +/* + * linux/arch/arm/mach-bcm2708/power.h @@ -5081,9 +5742,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/power.h linux-rpi-boo +extern int bcm_power_close(BCM_POWER_HANDLE_T handle); + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/system.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/system.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/system.h b/arch/arm/mach-bcm2708/include/mach/system.h +new file mode 100644 +index 0000000..bc9d458 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/system.h @@ -0,0 +1,53 @@ +/* + * arch/arm/mach-bcm2708/include/mach/system.h @@ -5138,9 +5801,11 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/system.h linux-rpi-bo +} + +#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/timex.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/timex.h 2012-07-15 20:28:26.132087259 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/timex.h b/arch/arm/mach-bcm2708/include/mach/timex.h +new file mode 100644 +index 0000000..64a660c +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/timex.h @@ -0,0 +1,23 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -5165,10 +5830,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/timex.h linux-rpi-boo + */ + +#define CLOCK_TICK_RATE (1000000) -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/uncompress.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/uncompress.h 2012-07-15 20:28:26.131087240 +0200 -@@ -0,0 +1,84 @@ +diff --git a/arch/arm/mach-bcm2708/include/mach/uncompress.h b/arch/arm/mach-bcm2708/include/mach/uncompress.h +new file mode 100644 +index 0000000..5c43412 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/uncompress.h +@@ -0,0 +1,85 @@ +/* + * arch/arm/mach-bcn2708/include/mach/uncompress.h + * @@ -5253,55 +5920,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-rp + * nothing to do + */ +#define arch_decomp_wdog() -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vcio.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vcio.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vcio.h 2012-07-15 20:28:26.131087240 +0200 -@@ -0,0 +1,42 @@ -+/* -+ * arch/arm/mach-bcm2708/include/mach/vcio.h -+ * -+ * Copyright (C) 2010 Broadcom -+ * -+ * 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 _MACH_BCM2708_VCIO_H -+#define _MACH_BCM2708_VCIO_H + -+/* Routines to handle I/O via the VideoCore "ARM control" registers -+ * (semaphores, doorbells, mailboxes) -+ */ -+ -+#define BCM_VCIO_DRIVER_NAME "bcm2708_vcio" -+ -+/* Constants shared with the ARM identifying separate mailbox channels */ -+#define MBOX_CHAN_POWER 0 /* for use by the power management interface */ -+#define MBOX_CHAN_FB 1 /* for use by the frame buffer */ -+#define MBOX_CHAN_VUART 2 /* for use by the virtual UART */ -+#define MBOX_CHAN_VCHIQ 3 /* for use by the VCHIQ interface */ -+#define MBOX_CHAN_LEDS 4 /* for use by the leds interface */ -+#define MBOX_CHAN_BUTTONS 5 /* for use by the buttons interface */ -+#define MBOX_CHAN_TOUCH 6 /* for use by the touchscreen interface */ -+#define MBOX_CHAN_COUNT 7 -+ -+extern int /*rc*/ bcm_mailbox_read(unsigned chan, uint32_t *data28); -+extern int /*rc*/ bcm_mailbox_write(unsigned chan, uint32_t data28); -+ -+#endif -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vc_mem.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2012-07-15 20:28:26.131087240 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/vc_mem.h b/arch/arm/mach-bcm2708/include/mach/vc_mem.h +new file mode 100644 +index 0000000..9d41c3a +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/vc_mem.h @@ -0,0 +1,35 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. @@ -5338,9 +5962,60 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-rpi-bo + +#endif /* VC_MEM_H */ + -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vmalloc.h ---- linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2012-07-15 20:28:26.131087240 +0200 +diff --git a/arch/arm/mach-bcm2708/include/mach/vcio.h b/arch/arm/mach-bcm2708/include/mach/vcio.h +new file mode 100644 +index 0000000..ace4ea4 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/vcio.h +@@ -0,0 +1,43 @@ ++/* ++ * arch/arm/mach-bcm2708/include/mach/vcio.h ++ * ++ * Copyright (C) 2010 Broadcom ++ * ++ * 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 _MACH_BCM2708_VCIO_H ++#define _MACH_BCM2708_VCIO_H ++ ++/* Routines to handle I/O via the VideoCore "ARM control" registers ++ * (semaphores, doorbells, mailboxes) ++ */ ++ ++#define BCM_VCIO_DRIVER_NAME "bcm2708_vcio" ++ ++/* Constants shared with the ARM identifying separate mailbox channels */ ++#define MBOX_CHAN_POWER 0 /* for use by the power management interface */ ++#define MBOX_CHAN_FB 1 /* for use by the frame buffer */ ++#define MBOX_CHAN_VUART 2 /* for use by the virtual UART */ ++#define MBOX_CHAN_VCHIQ 3 /* for use by the VCHIQ interface */ ++#define MBOX_CHAN_LEDS 4 /* for use by the leds interface */ ++#define MBOX_CHAN_BUTTONS 5 /* for use by the buttons interface */ ++#define MBOX_CHAN_TOUCH 6 /* for use by the touchscreen interface */ ++#define MBOX_CHAN_PROPERTY 8 /* for use by the property channel */ ++#define MBOX_CHAN_COUNT 9 ++ ++extern int /*rc*/ bcm_mailbox_read(unsigned chan, uint32_t *data28); ++extern int /*rc*/ bcm_mailbox_write(unsigned chan, uint32_t data28); ++ ++#endif +diff --git a/arch/arm/mach-bcm2708/include/mach/vmalloc.h b/arch/arm/mach-bcm2708/include/mach/vmalloc.h +new file mode 100644 +index 0000000..502c617 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/include/mach/vmalloc.h @@ -0,0 +1,20 @@ +/* + * arch/arm/mach-bcm2708/include/mach/vmalloc.h @@ -5361,65 +6036,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-rpi-b + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ -+#define VMALLOC_END (0xd8000000) -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/Kconfig linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Kconfig ---- linux-3.2.23/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Kconfig 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,32 @@ -+menu "Broadcom BCM2708 Implementations" -+ depends on ARCH_BCM2708 -+ -+config MACH_BCM2708 -+ bool "Broadcom BCM2708 Development Platform" -+ select CPU_V6 -+ help -+ Include support for the Broadcom(R) BCM2708 platform. -+ -+config BCM2708_GPIO -+ bool "BCM2708 gpio support" -+ depends on MACH_BCM2708 -+ select ARCH_REQUIRE_GPIOLIB -+ default y -+ help -+ Include support for the Broadcom(R) BCM2708 gpio. -+ -+config BCM2708_VCMEM -+ bool "Videocore Memory" -+ depends on MACH_BCM2708 -+ default y -+ help -+ Helper for videocore memory access and total size allocation. -+ -+config BCM2708_NOL2CACHE -+ bool "Videocore L2 cache disable" -+ depends on MACH_BCM2708 -+ default n -+ help -+ Do not allow ARM to use GPU's L2 cache. Requires disable_l2cache in config.txt. -+ -+endmenu -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/Makefile linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Makefile ---- linux-3.2.23/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Makefile 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,8 @@ -+# -+# Makefile for the linux kernel. -+# -+ -+obj-$(CONFIG_MACH_BCM2708) += clock.o bcm2708.o armctrl.o vcio.o power.o dma.o -+obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o -+obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o -+ -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/Makefile.boot linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Makefile.boot ---- linux-3.2.23/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/Makefile.boot 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,3 @@ -+ zreladdr-y := 0x00008000 -+params_phys-y := 0x00000100 -+initrd_phys-y := 0x00800000 -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/power.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/power.c ---- linux-3.2.23/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/power.c 2012-07-15 20:28:26.133087278 +0200 ++#define VMALLOC_END (0xe8000000) +diff --git a/arch/arm/mach-bcm2708/power.c b/arch/arm/mach-bcm2708/power.c +new file mode 100644 +index 0000000..256bf1a +--- /dev/null ++++ b/arch/arm/mach-bcm2708/power.c @@ -0,0 +1,194 @@ +/* + * linux/arch/arm/mach-bcm2708/power.c @@ -5615,318 +6237,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/power.c linux-rpi-bootc-3.2.23/arc +MODULE_AUTHOR("Phil Elwell"); +MODULE_DESCRIPTION("Interface to BCM2708 power management"); +MODULE_LICENSE("GPL"); -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vcio.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/vcio.c ---- linux-3.2.23/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/vcio.c 2012-07-15 20:28:26.130087221 +0200 -@@ -0,0 +1,304 @@ -+/* -+ * linux/arch/arm/mach-bcm2708/vcio.c -+ * -+ * Copyright (C) 2010 Broadcom -+ * -+ * 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. -+ * -+ * This device provides a shared mechanism for writing to the mailboxes, -+ * semaphores, doorbells etc. that are shared between the ARM and the -+ * VideoCore processor -+ */ -+ -+#if defined(CONFIG_SERIAL_BCM_MBOX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) -+#define SUPPORT_SYSRQ -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+ -+#define DRIVER_NAME BCM_VCIO_DRIVER_NAME -+ -+/* ---------------------------------------------------------------------- -+ * Mailbox -+ * -------------------------------------------------------------------- */ -+ -+/* offsets from a mail box base address */ -+#define MAIL_WRT 0x00 /* write - and next 4 words */ -+#define MAIL_RD 0x00 /* read - and next 4 words */ -+#define MAIL_POL 0x10 /* read without popping the fifo */ -+#define MAIL_SND 0x14 /* sender ID (bottom two bits) */ -+#define MAIL_STA 0x18 /* status */ -+#define MAIL_CNF 0x1C /* configuration */ -+ -+#define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf)) -+#define MBOX_MSG_LSB(chan, data28) (((data28) << 4) | ((chan) & 0xf)) -+#define MBOX_CHAN(msg) ((msg) & 0xf) -+#define MBOX_DATA28(msg) ((msg) & ~0xf) -+#define MBOX_DATA28_LSB(msg) (((uint32_t)msg) >> 4) -+ -+#define MBOX_MAGIC 0xd0d0c0de -+ -+struct vc_mailbox { -+ struct device *dev; /* parent device */ -+ void __iomem *status; -+ void __iomem *config; -+ void __iomem *read; -+ void __iomem *write; -+ uint32_t msg[MBOX_CHAN_COUNT]; -+ struct semaphore sema[MBOX_CHAN_COUNT]; -+ uint32_t magic; -+}; -+ -+static void mbox_init(struct vc_mailbox *mbox_out, struct device *dev, -+ uint32_t addr_mbox) -+{ -+ int i; -+ -+ mbox_out->dev = dev; -+ mbox_out->status = __io_address(addr_mbox + MAIL_STA); -+ mbox_out->config = __io_address(addr_mbox + MAIL_CNF); -+ mbox_out->read = __io_address(addr_mbox + MAIL_RD); -+ /* Write to the other mailbox */ -+ mbox_out->write = -+ __io_address((addr_mbox ^ ARM_0_MAIL0_WRT ^ ARM_0_MAIL1_WRT) + -+ MAIL_WRT); -+ -+ for (i = 0; i < MBOX_CHAN_COUNT; i++) { -+ mbox_out->msg[i] = 0; -+ sema_init(&mbox_out->sema[i], 0); -+ } -+ -+ /* Enable the interrupt on data reception */ -+ writel(ARM_MC_IHAVEDATAIRQEN, mbox_out->config); -+ -+ mbox_out->magic = MBOX_MAGIC; -+} -+ -+static int mbox_write(struct vc_mailbox *mbox, unsigned chan, uint32_t data28) -+{ -+ int rc; -+ -+ if (mbox->magic != MBOX_MAGIC) -+ rc = -EINVAL; -+ else { -+ /* wait for the mailbox FIFO to have some space in it */ -+ while (0 != (readl(mbox->status) & ARM_MS_FULL)) -+ cpu_relax(); -+ -+ writel(MBOX_MSG(chan, data28), mbox->write); -+ rc = 0; -+ } -+ return rc; -+} -+ -+static int mbox_read(struct vc_mailbox *mbox, unsigned chan, uint32_t *data28) -+{ -+ int rc; -+ -+ if (mbox->magic != MBOX_MAGIC) -+ rc = -EINVAL; -+ else { -+ down(&mbox->sema[chan]); -+ *data28 = MBOX_DATA28(mbox->msg[chan]); -+ mbox->msg[chan] = 0; -+ rc = 0; -+ } -+ return rc; -+} -+ -+static irqreturn_t mbox_irq(int irq, void *dev_id) -+{ -+ /* wait for the mailbox FIFO to have some data in it */ -+ struct vc_mailbox *mbox = (struct vc_mailbox *) dev_id; -+ int status = readl(mbox->status); -+ int ret = IRQ_NONE; -+ -+ while (!(status & ARM_MS_EMPTY)) { -+ uint32_t msg = readl(mbox->read); -+ int chan = MBOX_CHAN(msg); -+ if (chan < MBOX_CHAN_COUNT) { -+ if (mbox->msg[chan]) { -+ /* Overflow */ -+ printk(KERN_ERR DRIVER_NAME -+ ": mbox chan %d overflow - drop %08x\n", -+ chan, msg); -+ } else { -+ mbox->msg[chan] = (msg | 0xf); -+ up(&mbox->sema[chan]); -+ } -+ } else { -+ printk(KERN_ERR DRIVER_NAME -+ ": invalid channel selector (msg %08x)\n", msg); -+ } -+ ret = IRQ_HANDLED; -+ status = readl(mbox->status); -+ } -+ return ret; -+} -+ -+static struct irqaction mbox_irqaction = { -+ .name = "ARM Mailbox IRQ", -+ .flags = IRQF_DISABLED | IRQF_IRQPOLL, -+ .handler = mbox_irq, -+}; -+ -+/* ---------------------------------------------------------------------- -+ * Mailbox Methods -+ * -------------------------------------------------------------------- */ -+ -+static struct device *mbox_dev; /* we assume there's only one! */ -+ -+static int dev_mbox_write(struct device *dev, unsigned chan, uint32_t data28) -+{ -+ int rc; -+ -+ struct vc_mailbox *mailbox = dev_get_drvdata(dev); -+ device_lock(dev); -+ rc = mbox_write(mailbox, chan, data28); -+ device_unlock(dev); -+ -+ return rc; -+} -+ -+static int dev_mbox_read(struct device *dev, unsigned chan, uint32_t *data28) -+{ -+ int rc; -+ -+ struct vc_mailbox *mailbox = dev_get_drvdata(dev); -+ device_lock(dev); -+ rc = mbox_read(mailbox, chan, data28); -+ device_unlock(dev); -+ -+ return rc; -+} -+ -+extern int bcm_mailbox_write(unsigned chan, uint32_t data28) -+{ -+ if (mbox_dev) -+ return dev_mbox_write(mbox_dev, chan, data28); -+ else -+ return -ENODEV; -+} -+EXPORT_SYMBOL_GPL(bcm_mailbox_write); -+ -+extern int bcm_mailbox_read(unsigned chan, uint32_t *data28) -+{ -+ if (mbox_dev) -+ return dev_mbox_read(mbox_dev, chan, data28); -+ else -+ return -ENODEV; -+} -+EXPORT_SYMBOL_GPL(bcm_mailbox_read); -+ -+static void dev_mbox_register(const char *dev_name, struct device *dev) -+{ -+ mbox_dev = dev; -+} -+ -+/* ---------------------------------------------------------------------- -+ * Platform Device for Mailbox -+ * -------------------------------------------------------------------- */ -+ -+static int bcm_vcio_probe(struct platform_device *pdev) -+{ -+ int ret = 0; -+ struct vc_mailbox *mailbox; -+ -+ mailbox = kzalloc(sizeof(*mailbox), GFP_KERNEL); -+ if (NULL == mailbox) { -+ printk(KERN_ERR DRIVER_NAME ": failed to allocate " -+ "mailbox memory\n"); -+ ret = -ENOMEM; -+ } else { -+ struct resource *res; -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ if (res == NULL) { -+ printk(KERN_ERR DRIVER_NAME ": failed to obtain memory " -+ "resource\n"); -+ ret = -ENODEV; -+ kfree(mailbox); -+ } else { -+ /* should be based on the registers from res really */ -+ mbox_init(mailbox, &pdev->dev, ARM_0_MAIL0_RD); -+ -+ platform_set_drvdata(pdev, mailbox); -+ dev_mbox_register(DRIVER_NAME, &pdev->dev); -+ -+ mbox_irqaction.dev_id = mailbox; -+ setup_irq(IRQ_ARM_MAILBOX, &mbox_irqaction); -+ printk(KERN_INFO DRIVER_NAME ": mailbox at %p\n", -+ __io_address(ARM_0_MAIL0_RD)); -+ } -+ } -+ return ret; -+} -+ -+static int bcm_vcio_remove(struct platform_device *pdev) -+{ -+ struct vc_mailbox *mailbox = platform_get_drvdata(pdev); -+ -+ platform_set_drvdata(pdev, NULL); -+ kfree(mailbox); -+ -+ return 0; -+} -+ -+static struct platform_driver bcm_mbox_driver = { -+ .probe = bcm_vcio_probe, -+ .remove = bcm_vcio_remove, -+ -+ .driver = { -+ .name = DRIVER_NAME, -+ .owner = THIS_MODULE, -+ }, -+}; -+ -+static int __init bcm_mbox_init(void) -+{ -+ int ret; -+ -+ printk(KERN_INFO "mailbox: Broadcom VideoCore Mailbox driver\n"); -+ -+ ret = platform_driver_register(&bcm_mbox_driver); -+ if (ret != 0) { -+ printk(KERN_ERR DRIVER_NAME ": failed to register " -+ "on platform\n"); -+ } -+ -+ return ret; -+} -+ -+static void __exit bcm_mbox_exit(void) -+{ -+ platform_driver_unregister(&bcm_mbox_driver); -+} -+ -+arch_initcall(bcm_mbox_init); /* Initialize early */ -+module_exit(bcm_mbox_exit); -+ -+MODULE_AUTHOR("Gray Girling"); -+MODULE_DESCRIPTION("ARM I/O to VideoCore processor"); -+MODULE_LICENSE("GPL"); -+MODULE_ALIAS("platform:bcm-mbox"); -diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/vc_mem.c ---- linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/arch/arm/mach-bcm2708/vc_mem.c 2012-07-15 20:28:26.133087278 +0200 -@@ -0,0 +1,466 @@ +diff --git a/arch/arm/mach-bcm2708/vc_mem.c b/arch/arm/mach-bcm2708/vc_mem.c +new file mode 100644 +index 0000000..775c213 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/vc_mem.c +@@ -0,0 +1,510 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. +* @@ -5950,6 +6266,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar +#include +#include +#include ++#include + +#ifdef CONFIG_ARCH_KONA +#include @@ -5959,12 +6276,12 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar +#endif + +#include "mach/vc_mem.h" -+//#include "interface/vchiq_arm/vchiq_connected.h" ++#include + +#define DRIVER_NAME "vc-mem" + +// Uncomment to enable debug logging -+//#define ENABLE_DBG ++#define ENABLE_DBG + +#if defined(ENABLE_DBG) +#define LOG_DBG( fmt, ... ) printk( KERN_INFO fmt "\n", ##__VA_ARGS__ ) @@ -5996,23 +6313,8 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar + * bootloader (and/or kernel). When that happens, the values of these variables + * would be calculated and assigned in the init function. + */ -+#ifdef CONFIG_ARCH_KONA -+ -+#include -+unsigned long mm_vc_mem_phys_addr = VC_EMI; -+ -+#elif CONFIG_ARCH_BCM2708 -+ +// in the 2835 VC in mapped above ARM, but ARM has full access to VC space +unsigned long mm_vc_mem_phys_addr = 0x00000000; -+ -+#else -+ -+#include -+unsigned long mm_vc_mem_phys_addr = MM_ADDR_IO_VC_EMI; -+ -+#endif -+ +unsigned int mm_vc_mem_size = 0; +unsigned int mm_vc_mem_base = 0; + @@ -6054,6 +6356,64 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar + return 0; +} + ++ ++/* tag part of the message */ ++struct vc_msg_tag { ++ uint32_t tag_id; /* the message id */ ++ uint32_t buffer_size; /* size of the buffer (which in this case is always 8 bytes) */ ++ uint32_t data_size; /* amount of data being sent or received */ ++ uint32_t base; /* the address of memory base */ ++ uint32_t size; /* the size of memory in bytes */ ++}; ++ ++struct vc_set_msg { ++ uint32_t msg_size; /* simply, sizeof(struct vc_msg) */ ++ uint32_t request_code; /* holds various information like the success and number of bytes returned (refer to mailboxes wiki) */ ++ struct vc_msg_tag tag[2]; /* the array of tag structures above to make */ ++ uint32_t end_tag; /* an end identifier, should be set to NULL */ ++}; ++ ++#define VCMSG_GET_ARM_MEMORY 0x00010005 ++#define VCMSG_GET_VC_MEMORY 0x00010006 ++ ++static void vc_mem_update(void) ++{ ++ uint32_t success; ++ dma_addr_t vc_mem; /* the memory address accessed from videocore */ ++ struct vc_set_msg *get_mem; /* the memory address accessed from driver */ ++ ++ /* allocate some memory for the messages to use throughout the lifetime of the driver, use the larger of the two message structures */ ++ get_mem = (struct vc_set_msg *)dma_alloc_coherent(NULL, PAGE_ALIGN(sizeof(struct vc_set_msg)), &vc_mem, GFP_ATOMIC); ++ /* clear any garbage */ ++ memset(get_mem, 0, sizeof(struct vc_set_msg)); ++ /* create the message */ ++ get_mem->msg_size = sizeof(struct vc_set_msg); ++ get_mem->tag[0].tag_id = VCMSG_GET_VC_MEMORY; ++ get_mem->tag[0].buffer_size = 8; ++ get_mem->tag[0].data_size = 0; ++ get_mem->tag[1].tag_id = VCMSG_GET_ARM_MEMORY; ++ get_mem->tag[1].buffer_size = 8; ++ get_mem->tag[1].data_size = 0; ++ ++ /* send the message */ ++ wmb(); ++ bcm_mailbox_write(MBOX_CHAN_PROPERTY,(uint32_t)vc_mem); ++ bcm_mailbox_read(MBOX_CHAN_PROPERTY, &success); ++ rmb(); ++ ++ LOG_DBG("%s: resp %x, vcbase=%x vcsize=%x armbase=%x armsize=%x", __func__, get_mem->request_code, ++ get_mem->tag[0].base, get_mem->tag[0].size, get_mem->tag[1].base, get_mem->tag[1].size); ++ ++ /* check we're all good */ ++ if (get_mem->request_code & 0x80000000) { ++ mm_vc_mem_base = get_mem->tag[0].base; ++ mm_vc_mem_size = get_mem->tag[0].size+get_mem->tag[1].size; ++ mm_vc_mem_phys_addr = get_mem->tag[1].base; ++ } ++ dma_free_coherent(NULL, PAGE_ALIGN(sizeof(struct vc_set_msg)), (void *)get_mem, vc_mem); ++} ++ ++ +/**************************************************************************** +* +* vc_mem_get_size @@ -6063,7 +6423,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar +static void +vc_mem_get_size(void) +{ -+ mm_vc_mem_size = 256 * 1024 * 1024; // Static for now ++ vc_mem_update(); +} + +/**************************************************************************** @@ -6075,7 +6435,7 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar +static void +vc_mem_get_base(void) +{ -+ mm_vc_mem_base = 128 * 1024 * 1024; // Static for now ++ vc_mem_update(); +} + +/**************************************************************************** @@ -6393,21 +6753,334 @@ diff -Naur linux-3.2.23/arch/arm/mach-bcm2708/vc_mem.c linux-rpi-bootc-3.2.23/ar +module_exit(vc_mem_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Naur linux-3.2.23/arch/arm/Makefile linux-rpi-bootc-3.2.23/arch/arm/Makefile ---- linux-3.2.23/arch/arm/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/Makefile 2012-07-15 20:28:25.861082159 +0200 -@@ -198,6 +198,7 @@ - machine-$(CONFIG_MACH_SPEAR320) := spear3xx - machine-$(CONFIG_MACH_SPEAR600) := spear6xx - machine-$(CONFIG_ARCH_ZYNQ) := zynq -+machine-$(CONFIG_ARCH_BCM2708) := bcm2708 +diff --git a/arch/arm/mach-bcm2708/vcio.c b/arch/arm/mach-bcm2708/vcio.c +new file mode 100644 +index 0000000..3874051 +--- /dev/null ++++ b/arch/arm/mach-bcm2708/vcio.c +@@ -0,0 +1,304 @@ ++/* ++ * linux/arch/arm/mach-bcm2708/vcio.c ++ * ++ * Copyright (C) 2010 Broadcom ++ * ++ * 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. ++ * ++ * This device provides a shared mechanism for writing to the mailboxes, ++ * semaphores, doorbells etc. that are shared between the ARM and the ++ * VideoCore processor ++ */ ++ ++#if defined(CONFIG_SERIAL_BCM_MBOX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) ++#define SUPPORT_SYSRQ ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#define DRIVER_NAME BCM_VCIO_DRIVER_NAME ++ ++/* ---------------------------------------------------------------------- ++ * Mailbox ++ * -------------------------------------------------------------------- */ ++ ++/* offsets from a mail box base address */ ++#define MAIL_WRT 0x00 /* write - and next 4 words */ ++#define MAIL_RD 0x00 /* read - and next 4 words */ ++#define MAIL_POL 0x10 /* read without popping the fifo */ ++#define MAIL_SND 0x14 /* sender ID (bottom two bits) */ ++#define MAIL_STA 0x18 /* status */ ++#define MAIL_CNF 0x1C /* configuration */ ++ ++#define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf)) ++#define MBOX_MSG_LSB(chan, data28) (((data28) << 4) | ((chan) & 0xf)) ++#define MBOX_CHAN(msg) ((msg) & 0xf) ++#define MBOX_DATA28(msg) ((msg) & ~0xf) ++#define MBOX_DATA28_LSB(msg) (((uint32_t)msg) >> 4) ++ ++#define MBOX_MAGIC 0xd0d0c0de ++ ++struct vc_mailbox { ++ struct device *dev; /* parent device */ ++ void __iomem *status; ++ void __iomem *config; ++ void __iomem *read; ++ void __iomem *write; ++ uint32_t msg[MBOX_CHAN_COUNT]; ++ struct semaphore sema[MBOX_CHAN_COUNT]; ++ uint32_t magic; ++}; ++ ++static void mbox_init(struct vc_mailbox *mbox_out, struct device *dev, ++ uint32_t addr_mbox) ++{ ++ int i; ++ ++ mbox_out->dev = dev; ++ mbox_out->status = __io_address(addr_mbox + MAIL_STA); ++ mbox_out->config = __io_address(addr_mbox + MAIL_CNF); ++ mbox_out->read = __io_address(addr_mbox + MAIL_RD); ++ /* Write to the other mailbox */ ++ mbox_out->write = ++ __io_address((addr_mbox ^ ARM_0_MAIL0_WRT ^ ARM_0_MAIL1_WRT) + ++ MAIL_WRT); ++ ++ for (i = 0; i < MBOX_CHAN_COUNT; i++) { ++ mbox_out->msg[i] = 0; ++ sema_init(&mbox_out->sema[i], 0); ++ } ++ ++ /* Enable the interrupt on data reception */ ++ writel(ARM_MC_IHAVEDATAIRQEN, mbox_out->config); ++ ++ mbox_out->magic = MBOX_MAGIC; ++} ++ ++static int mbox_write(struct vc_mailbox *mbox, unsigned chan, uint32_t data28) ++{ ++ int rc; ++ ++ if (mbox->magic != MBOX_MAGIC) ++ rc = -EINVAL; ++ else { ++ /* wait for the mailbox FIFO to have some space in it */ ++ while (0 != (readl(mbox->status) & ARM_MS_FULL)) ++ cpu_relax(); ++ ++ writel(MBOX_MSG(chan, data28), mbox->write); ++ rc = 0; ++ } ++ return rc; ++} ++ ++static int mbox_read(struct vc_mailbox *mbox, unsigned chan, uint32_t *data28) ++{ ++ int rc; ++ ++ if (mbox->magic != MBOX_MAGIC) ++ rc = -EINVAL; ++ else { ++ down(&mbox->sema[chan]); ++ *data28 = MBOX_DATA28(mbox->msg[chan]); ++ mbox->msg[chan] = 0; ++ rc = 0; ++ } ++ return rc; ++} ++ ++static irqreturn_t mbox_irq(int irq, void *dev_id) ++{ ++ /* wait for the mailbox FIFO to have some data in it */ ++ struct vc_mailbox *mbox = (struct vc_mailbox *) dev_id; ++ int status = readl(mbox->status); ++ int ret = IRQ_NONE; ++ ++ while (!(status & ARM_MS_EMPTY)) { ++ uint32_t msg = readl(mbox->read); ++ int chan = MBOX_CHAN(msg); ++ if (chan < MBOX_CHAN_COUNT) { ++ if (mbox->msg[chan]) { ++ /* Overflow */ ++ printk(KERN_ERR DRIVER_NAME ++ ": mbox chan %d overflow - drop %08x\n", ++ chan, msg); ++ } else { ++ mbox->msg[chan] = (msg | 0xf); ++ up(&mbox->sema[chan]); ++ } ++ } else { ++ printk(KERN_ERR DRIVER_NAME ++ ": invalid channel selector (msg %08x)\n", msg); ++ } ++ ret = IRQ_HANDLED; ++ status = readl(mbox->status); ++ } ++ return ret; ++} ++ ++static struct irqaction mbox_irqaction = { ++ .name = "ARM Mailbox IRQ", ++ .flags = IRQF_DISABLED | IRQF_IRQPOLL, ++ .handler = mbox_irq, ++}; ++ ++/* ---------------------------------------------------------------------- ++ * Mailbox Methods ++ * -------------------------------------------------------------------- */ ++ ++static struct device *mbox_dev; /* we assume there's only one! */ ++ ++static int dev_mbox_write(struct device *dev, unsigned chan, uint32_t data28) ++{ ++ int rc; ++ ++ struct vc_mailbox *mailbox = dev_get_drvdata(dev); ++ device_lock(dev); ++ rc = mbox_write(mailbox, chan, data28); ++ device_unlock(dev); ++ ++ return rc; ++} ++ ++static int dev_mbox_read(struct device *dev, unsigned chan, uint32_t *data28) ++{ ++ int rc; ++ ++ struct vc_mailbox *mailbox = dev_get_drvdata(dev); ++ device_lock(dev); ++ rc = mbox_read(mailbox, chan, data28); ++ device_unlock(dev); ++ ++ return rc; ++} ++ ++extern int bcm_mailbox_write(unsigned chan, uint32_t data28) ++{ ++ if (mbox_dev) ++ return dev_mbox_write(mbox_dev, chan, data28); ++ else ++ return -ENODEV; ++} ++EXPORT_SYMBOL_GPL(bcm_mailbox_write); ++ ++extern int bcm_mailbox_read(unsigned chan, uint32_t *data28) ++{ ++ if (mbox_dev) ++ return dev_mbox_read(mbox_dev, chan, data28); ++ else ++ return -ENODEV; ++} ++EXPORT_SYMBOL_GPL(bcm_mailbox_read); ++ ++static void dev_mbox_register(const char *dev_name, struct device *dev) ++{ ++ mbox_dev = dev; ++} ++ ++/* ---------------------------------------------------------------------- ++ * Platform Device for Mailbox ++ * -------------------------------------------------------------------- */ ++ ++static int bcm_vcio_probe(struct platform_device *pdev) ++{ ++ int ret = 0; ++ struct vc_mailbox *mailbox; ++ ++ mailbox = kzalloc(sizeof(*mailbox), GFP_KERNEL); ++ if (NULL == mailbox) { ++ printk(KERN_ERR DRIVER_NAME ": failed to allocate " ++ "mailbox memory\n"); ++ ret = -ENOMEM; ++ } else { ++ struct resource *res; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (res == NULL) { ++ printk(KERN_ERR DRIVER_NAME ": failed to obtain memory " ++ "resource\n"); ++ ret = -ENODEV; ++ kfree(mailbox); ++ } else { ++ /* should be based on the registers from res really */ ++ mbox_init(mailbox, &pdev->dev, ARM_0_MAIL0_RD); ++ ++ platform_set_drvdata(pdev, mailbox); ++ dev_mbox_register(DRIVER_NAME, &pdev->dev); ++ ++ mbox_irqaction.dev_id = mailbox; ++ setup_irq(IRQ_ARM_MAILBOX, &mbox_irqaction); ++ printk(KERN_INFO DRIVER_NAME ": mailbox at %p\n", ++ __io_address(ARM_0_MAIL0_RD)); ++ } ++ } ++ return ret; ++} ++ ++static int bcm_vcio_remove(struct platform_device *pdev) ++{ ++ struct vc_mailbox *mailbox = platform_get_drvdata(pdev); ++ ++ platform_set_drvdata(pdev, NULL); ++ kfree(mailbox); ++ ++ return 0; ++} ++ ++static struct platform_driver bcm_mbox_driver = { ++ .probe = bcm_vcio_probe, ++ .remove = bcm_vcio_remove, ++ ++ .driver = { ++ .name = DRIVER_NAME, ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init bcm_mbox_init(void) ++{ ++ int ret; ++ ++ printk(KERN_INFO "mailbox: Broadcom VideoCore Mailbox driver\n"); ++ ++ ret = platform_driver_register(&bcm_mbox_driver); ++ if (ret != 0) { ++ printk(KERN_ERR DRIVER_NAME ": failed to register " ++ "on platform\n"); ++ } ++ ++ return ret; ++} ++ ++static void __exit bcm_mbox_exit(void) ++{ ++ platform_driver_unregister(&bcm_mbox_driver); ++} ++ ++arch_initcall(bcm_mbox_init); /* Initialize early */ ++module_exit(bcm_mbox_exit); ++ ++MODULE_AUTHOR("Gray Girling"); ++MODULE_DESCRIPTION("ARM I/O to VideoCore processor"); ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:bcm-mbox"); +diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig +index 67f75a0..2c9ec3c 100644 +--- a/arch/arm/mm/Kconfig ++++ b/arch/arm/mm/Kconfig +@@ -390,7 +390,7 @@ config CPU_PJ4 - # Platform directory name. This list is sorted alphanumerically - # by CONFIG_* macro name. -diff -Naur linux-3.2.23/arch/arm/mm/alignment.c linux-rpi-bootc-3.2.23/arch/arm/mm/alignment.c ---- linux-3.2.23/arch/arm/mm/alignment.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/mm/alignment.c 2012-07-15 20:28:26.129087202 +0200 -@@ -855,9 +855,11 @@ + # ARMv6 + config CPU_V6 +- bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX ++ bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX || MACH_BCM2708 + select CPU_32v6 + select CPU_ABRT_EV6 + select CPU_PABRT_V6 +diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c +index c335c76..118b667 100644 +--- a/arch/arm/mm/alignment.c ++++ b/arch/arm/mm/alignment.c +@@ -855,9 +855,11 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) case 0x08000000: /* ldm or stm, or thumb-2 32bit instruction */ if (thumb2_32b) handler = do_alignment_t32_to_handler(&instr, regs, &offset); @@ -6421,22 +7094,11 @@ diff -Naur linux-3.2.23/arch/arm/mm/alignment.c linux-rpi-bootc-3.2.23/arch/arm/ default: goto bad; -diff -Naur linux-3.2.23/arch/arm/mm/Kconfig linux-rpi-bootc-3.2.23/arch/arm/mm/Kconfig ---- linux-3.2.23/arch/arm/mm/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/mm/Kconfig 2012-07-15 20:28:26.120087033 +0200 -@@ -390,7 +390,7 @@ - - # ARMv6 - config CPU_V6 -- bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX -+ bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX || MACH_BCM2708 - select CPU_32v6 - select CPU_ABRT_EV6 - select CPU_PABRT_V6 -diff -Naur linux-3.2.23/arch/arm/mm/proc-v6.S linux-rpi-bootc-3.2.23/arch/arm/mm/proc-v6.S ---- linux-3.2.23/arch/arm/mm/proc-v6.S 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/arch/arm/mm/proc-v6.S 2012-07-15 20:28:26.128087183 +0200 -@@ -70,10 +70,19 @@ +diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S +index d061d2f..436dc2c 100644 +--- a/arch/arm/mm/proc-v6.S ++++ b/arch/arm/mm/proc-v6.S +@@ -70,10 +70,19 @@ ENTRY(cpu_v6_reset) * * IRQs are already disabled. */ @@ -6459,10 +7121,43 @@ diff -Naur linux-3.2.23/arch/arm/mm/proc-v6.S linux-rpi-bootc-3.2.23/arch/arm/mm mov pc, lr ENTRY(cpu_v6_dcache_clean_area) -diff -Naur linux-3.2.23/drivers/i2c/busses/i2c-bcm2708.c linux-rpi-bootc-3.2.23/drivers/i2c/busses/i2c-bcm2708.c ---- linux-3.2.23/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/i2c/busses/i2c-bcm2708.c 2012-07-15 20:29:11.415939334 +0200 -@@ -0,0 +1,379 @@ +diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig +index a3afac4..cbc62ff 100644 +--- a/drivers/i2c/busses/Kconfig ++++ b/drivers/i2c/busses/Kconfig +@@ -308,6 +308,14 @@ config I2C_AU1550 + This driver can also be built as a module. If so, the module + will be called i2c-au1550. + ++config I2C_BCM2708 ++ tristate "BCM2708 BSC" ++ depends on MACH_BCM2708 ++ help ++ Enabling this option will add BSC (Broadcom Serial Controller) ++ support for the BCM2708. BSC is a Broadcom proprietary bus compatible ++ with I2C/TWI/SMBus. ++ + config I2C_BLACKFIN_TWI + tristate "Blackfin TWI I2C support" + depends on BLACKFIN +diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile +index fba6da6..4022671 100644 +--- a/drivers/i2c/busses/Makefile ++++ b/drivers/i2c/busses/Makefile +@@ -30,6 +30,7 @@ obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o + # Embedded system I2C/SMBus host controller drivers + obj-$(CONFIG_I2C_AT91) += i2c-at91.o + obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o ++obj-$(CONFIG_I2C_BCM2708) += i2c-bcm2708.o + obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o + obj-$(CONFIG_I2C_CPM) += i2c-cpm.o + obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o +diff --git a/drivers/i2c/busses/i2c-bcm2708.c b/drivers/i2c/busses/i2c-bcm2708.c +new file mode 100644 +index 0000000..70e8d29 +--- /dev/null ++++ b/drivers/i2c/busses/i2c-bcm2708.c +@@ -0,0 +1,396 @@ +/* + * Driver for Broadcom BCM2708 BSC Controllers + * @@ -6836,62 +7531,94 @@ diff -Naur linux-3.2.23/drivers/i2c/busses/i2c-bcm2708.c linux-rpi-bootc-3.2.23/ + .probe = bcm2708_i2c_probe, + .remove = __devexit_p(bcm2708_i2c_remove), +}; -+module_platform_driver(bcm2708_i2c_driver); ++ ++// module_platform_driver(bcm2708_i2c_driver); ++ ++ ++static int __init bcm2708_i2c_init(void) ++{ ++ return platform_driver_register(&bcm2708_i2c_driver); ++} ++ ++static void __exit bcm2708_i2c_exit(void) ++{ ++ platform_driver_unregister(&bcm2708_i2c_driver); ++} ++ ++module_init(bcm2708_i2c_init); ++module_exit(bcm2708_i2c_exit); ++ ++ + +MODULE_DESCRIPTION("BSC controller driver for Broadcom BCM2708"); +MODULE_AUTHOR("Chris Boot "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Naur linux-3.2.23/drivers/i2c/busses/Kconfig linux-rpi-bootc-3.2.23/drivers/i2c/busses/Kconfig ---- linux-3.2.23/drivers/i2c/busses/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/i2c/busses/Kconfig 2012-07-15 20:29:12.757964595 +0200 -@@ -308,6 +308,14 @@ - This driver can also be built as a module. If so, the module - will be called i2c-au1550. - -+config I2C_BCM2708 -+ tristate "BCM2708 BSC" -+ depends on MACH_BCM2708 -+ help -+ Enabling this option will add BSC (Broadcom Serial Controller) -+ support for the BCM2708. BSC is a Broadcom proprietary bus compatible -+ with I2C/TWI/SMBus. -+ - config I2C_BLACKFIN_TWI - tristate "Blackfin TWI I2C support" - depends on BLACKFIN -diff -Naur linux-3.2.23/drivers/i2c/busses/Makefile linux-rpi-bootc-3.2.23/drivers/i2c/busses/Makefile ---- linux-3.2.23/drivers/i2c/busses/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/i2c/busses/Makefile 2012-07-15 20:29:11.329937716 +0200 -@@ -30,6 +30,7 @@ - # Embedded system I2C/SMBus host controller drivers - obj-$(CONFIG_I2C_AT91) += i2c-at91.o - obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o -+obj-$(CONFIG_I2C_BCM2708) += i2c-bcm2708.o - obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o - obj-$(CONFIG_I2C_CPM) += i2c-cpm.o - obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o -diff -Naur linux-3.2.23/drivers/misc/Kconfig linux-rpi-bootc-3.2.23/drivers/misc/Kconfig ---- linux-3.2.23/drivers/misc/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/misc/Kconfig 2012-07-15 20:29:13.403976727 +0200 -@@ -508,5 +508,6 @@ +diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig +index 5664696..b4679ec 100644 +--- a/drivers/misc/Kconfig ++++ b/drivers/misc/Kconfig +@@ -508,5 +508,6 @@ source "drivers/misc/ti-st/Kconfig" source "drivers/misc/lis3lv02d/Kconfig" source "drivers/misc/carma/Kconfig" source "drivers/misc/altera-stapl/Kconfig" +source "drivers/misc/vc04_services/Kconfig" endif # MISC_DEVICES -diff -Naur linux-3.2.23/drivers/misc/Makefile linux-rpi-bootc-3.2.23/drivers/misc/Makefile ---- linux-3.2.23/drivers/misc/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/misc/Makefile 2012-07-15 20:29:13.129971586 +0200 -@@ -48,3 +48,4 @@ +diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile +index b26495a..a06b534 100644 +--- a/drivers/misc/Makefile ++++ b/drivers/misc/Makefile +@@ -48,3 +48,4 @@ obj-y += lis3lv02d/ obj-y += carma/ obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ +obj-y += vc04_services/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/connections/connection.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2012-07-15 20:29:13.762983497 +0200 +diff --git a/drivers/misc/vc04_services/Kconfig b/drivers/misc/vc04_services/Kconfig +new file mode 100644 +index 0000000..d97a1e2 +--- /dev/null ++++ b/drivers/misc/vc04_services/Kconfig +@@ -0,0 +1,7 @@ ++config BCM2708_VCHIQ ++ tristate "Videocore VCHIQ" ++ depends on MACH_BCM2708 ++ default y ++ help ++ Helper for communication for VideoCore. ++ +diff --git a/drivers/misc/vc04_services/Makefile b/drivers/misc/vc04_services/Makefile +new file mode 100644 +index 0000000..ee53af7 +--- /dev/null ++++ b/drivers/misc/vc04_services/Makefile +@@ -0,0 +1,21 @@ ++obj-$(CONFIG_BCM2708_VCHIQ) += vchiq.o ++ ++vchiq-objs := \ ++ interface/vchiq_arm/vchiq_core.o \ ++ interface/vchiq_arm/vchiq_shim.o \ ++ interface/vchiq_arm/vchiq_util.o \ ++ interface/vchiq_arm/vchiq_arm.o \ ++ interface/vchiq_arm/vchiq_kern_lib.o \ ++ interface/vchiq_arm/vchiq_2835_arm.o \ ++ interface/vcos/linuxkernel/vcos_linuxkernel.o \ ++ interface/vcos/linuxkernel/vcos_thread_map.o \ ++ interface/vcos/linuxkernel/vcos_linuxkernel_cfg.o \ ++ interface/vcos/generic/vcos_generic_event_flags.o \ ++ interface/vcos/generic/vcos_logcat.o \ ++ interface/vcos/generic/vcos_mem_from_malloc.o \ ++ interface/vcos/generic/vcos_cmd.o ++ ++EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000 -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel ++ ++ ++ +diff --git a/drivers/misc/vc04_services/interface/vchi/connections/connection.h b/drivers/misc/vc04_services/interface/vchi/connections/connection.h +new file mode 100644 +index 0000000..2fe5742 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/connections/connection.h @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -7202,9 +7929,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/connections/co +#endif /* CONNECTION_H_ */ + +/****************************** End of file **********************************/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2012-07-15 20:29:13.752983309 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h b/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h +new file mode 100644 +index 0000000..7701b15 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -7392,443 +8121,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/message_driver +#endif // _VCHI_MESSAGE_H_ + +/****************************** End of file ***********************************/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2012-07-15 20:29:13.752983309 +0200 -@@ -0,0 +1,214 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. -+ * -+ * 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 -+ */ -+ -+/*============================================================================= -+Contains the #defines for the number of servers / clients etc, these can be -+over-ridden from the platform makefile if needed -+=============================================================================*/ -+ -+#ifndef VCHI_CFG_H_ -+#define VCHI_CFG_H_ -+ -+/**************************************************************************************** -+ * Defines in this first section are part of the VCHI API and may be examined by VCHI -+ * services. -+ ***************************************************************************************/ -+ -+/* Required alignment of base addresses for bulk transfer, if unaligned transfers are not enabled */ -+/* Really determined by the message driver, and should be available from a run-time call. */ -+#ifndef VCHI_BULK_ALIGN -+# if __VCCOREVER__ >= 0x04000000 -+# define VCHI_BULK_ALIGN 32 // Allows for the need to do cache cleans -+# else -+# define VCHI_BULK_ALIGN 16 -+# endif -+#endif -+ -+/* Required length multiple for bulk transfers, if unaligned transfers are not enabled */ -+/* May be less than or greater than VCHI_BULK_ALIGN */ -+/* Really determined by the message driver, and should be available from a run-time call. */ -+#ifndef VCHI_BULK_GRANULARITY -+# if __VCCOREVER__ >= 0x04000000 -+# define VCHI_BULK_GRANULARITY 32 // Allows for the need to do cache cleans -+# else -+# define VCHI_BULK_GRANULARITY 16 -+# endif -+#endif -+ -+/* The largest possible message to be queued with vchi_msg_queue. */ -+#ifndef VCHI_MAX_MSG_SIZE -+# if defined VCHI_LOCAL_HOST_PORT -+# define VCHI_MAX_MSG_SIZE 16384 // makes file transfers fast, but should they be using bulk? -+# else -+# define VCHI_MAX_MSG_SIZE 4096 // NOTE: THIS MUST BE LARGER THAN OR EQUAL TO THE SIZE OF THE KHRONOS MERGE BUFFER!! -+# endif -+#endif -+ -+/****************************************************************************************** -+ * Defines below are system configuration options, and should not be used by VCHI services. -+ *****************************************************************************************/ -+ -+/* How many connections can we support? A localhost implementation uses 2 connections, -+ * 1 for host-app, 1 for VMCS, and these are hooked together by a loopback MPHI VCFW -+ * driver. */ -+#ifndef VCHI_MAX_NUM_CONNECTIONS -+# define VCHI_MAX_NUM_CONNECTIONS 3 -+#endif -+ -+/* How many services can we open per connection? Extending this doesn't cost processing time, just a small -+ * amount of static memory. */ -+#ifndef VCHI_MAX_SERVICES_PER_CONNECTION -+# define VCHI_MAX_SERVICES_PER_CONNECTION 36 -+#endif -+ -+/* Adjust if using a message driver that supports more logical TX channels */ -+#ifndef VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION -+# define VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION 9 // 1 MPHI + 8 CCP2 logical channels -+#endif -+ -+/* Adjust if using a message driver that supports more logical RX channels */ -+#ifndef VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION -+# define VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION 1 // 1 MPHI -+#endif -+ -+/* How many receive slots do we use. This times VCHI_MAX_MSG_SIZE gives the effective -+ * receive queue space, less message headers. */ -+#ifndef VCHI_NUM_READ_SLOTS -+# if defined(VCHI_LOCAL_HOST_PORT) -+# define VCHI_NUM_READ_SLOTS 4 -+# else -+# define VCHI_NUM_READ_SLOTS 48 -+# endif -+#endif -+ -+/* Do we utilise overrun facility for receive message slots? Can aid peer transmit -+ * performance. Only define on VideoCore end, talking to host. -+ */ -+//#define VCHI_MSG_RX_OVERRUN -+ -+/* How many transmit slots do we use. Generally don't need many, as the hardware driver -+ * underneath VCHI will usually have its own buffering. */ -+#ifndef VCHI_NUM_WRITE_SLOTS -+# define VCHI_NUM_WRITE_SLOTS 4 -+#endif -+ -+/* If a service has held or queued received messages in VCHI_XOFF_THRESHOLD or more slots, -+ * then it's taking up too much buffer space, and the peer service will be told to stop -+ * transmitting with an XOFF message. For this to be effective, the VCHI_NUM_READ_SLOTS -+ * needs to be considerably bigger than VCHI_NUM_WRITE_SLOTS, or the transmit latency -+ * is too high. */ -+#ifndef VCHI_XOFF_THRESHOLD -+# define VCHI_XOFF_THRESHOLD (VCHI_NUM_READ_SLOTS / 2) -+#endif -+ -+/* After we've sent an XOFF, the peer will be told to resume transmission once the local -+ * service has dequeued/released enough messages that it's now occupying -+ * VCHI_XON_THRESHOLD slots or fewer. */ -+#ifndef VCHI_XON_THRESHOLD -+# define VCHI_XON_THRESHOLD (VCHI_NUM_READ_SLOTS / 4) -+#endif -+ -+/* A size below which a bulk transfer omits the handshake completely and always goes -+ * via the message channel, if bulk auxiliary is being sent on that service. (The user -+ * can guarantee this by enabling unaligned transmits). -+ * Not API. */ -+#ifndef VCHI_MIN_BULK_SIZE -+# define VCHI_MIN_BULK_SIZE ( VCHI_MAX_MSG_SIZE / 2 < 4096 ? VCHI_MAX_MSG_SIZE / 2 : 4096 ) -+#endif -+ -+/* Maximum size of bulk transmission chunks, for each interface type. A trade-off between -+ * speed and latency; the smaller the chunk size the better change of messages and other -+ * bulk transmissions getting in when big bulk transfers are happening. Set to 0 to not -+ * break transmissions into chunks. -+ */ -+#ifndef VCHI_MAX_BULK_CHUNK_SIZE_MPHI -+# define VCHI_MAX_BULK_CHUNK_SIZE_MPHI (16 * 1024) -+#endif -+ -+/* NB Chunked CCP2 transmissions violate the letter of the CCP2 spec by using "JPEG8" mode -+ * with multiple-line frames. Only use if the receiver can cope. */ -+#ifndef VCHI_MAX_BULK_CHUNK_SIZE_CCP2 -+# define VCHI_MAX_BULK_CHUNK_SIZE_CCP2 0 -+#endif -+ -+/* How many TX messages can we have pending in our transmit slots. Once exhausted, -+ * vchi_msg_queue will be blocked. */ -+#ifndef VCHI_TX_MSG_QUEUE_SIZE -+# define VCHI_TX_MSG_QUEUE_SIZE 256 -+#endif -+ -+/* How many RX messages can we have parsed in the receive slots. Once exhausted, parsing -+ * will be suspended until older messages are dequeued/released. */ -+#ifndef VCHI_RX_MSG_QUEUE_SIZE -+# define VCHI_RX_MSG_QUEUE_SIZE 256 -+#endif -+ -+/* Really should be able to cope if we run out of received message descriptors, by -+ * suspending parsing as the comment above says, but we don't. This sweeps the issue -+ * under the carpet. */ -+#if VCHI_RX_MSG_QUEUE_SIZE < (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS -+# undef VCHI_RX_MSG_QUEUE_SIZE -+# define VCHI_RX_MSG_QUEUE_SIZE (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS -+#endif -+ -+/* How many bulk transmits can we have pending. Once exhausted, vchi_bulk_queue_transmit -+ * will be blocked. */ -+#ifndef VCHI_TX_BULK_QUEUE_SIZE -+# define VCHI_TX_BULK_QUEUE_SIZE 64 -+#endif -+ -+/* How many bulk receives can we have pending. Once exhausted, vchi_bulk_queue_receive -+ * will be blocked. */ -+#ifndef VCHI_RX_BULK_QUEUE_SIZE -+# define VCHI_RX_BULK_QUEUE_SIZE 64 -+#endif -+ -+/* A limit on how many outstanding bulk requests we expect the peer to give us. If -+ * the peer asks for more than this, VCHI will fail and assert. The number is determined -+ * by the peer's hardware - it's the number of outstanding requests that can be queued -+ * on all bulk channels. VC3's MPHI peripheral allows 16. */ -+#ifndef VCHI_MAX_PEER_BULK_REQUESTS -+# define VCHI_MAX_PEER_BULK_REQUESTS 32 -+#endif -+ -+/* Define VCHI_CCP2TX_MANUAL_POWER if the host tells us when to turn the CCP2 -+ * transmitter on and off. -+ */ -+/*#define VCHI_CCP2TX_MANUAL_POWER*/ -+ -+#ifndef VCHI_CCP2TX_MANUAL_POWER -+ -+/* Timeout (in milliseconds) for putting the CCP2TX interface into IDLE state. Set -+ * negative for no IDLE. -+ */ -+# ifndef VCHI_CCP2TX_IDLE_TIMEOUT -+# define VCHI_CCP2TX_IDLE_TIMEOUT 5 -+# endif -+ -+/* Timeout (in milliseconds) for putting the CCP2TX interface into OFF state. Set -+ * negative for no OFF. -+ */ -+# ifndef VCHI_CCP2TX_OFF_TIMEOUT -+# define VCHI_CCP2TX_OFF_TIMEOUT 1000 -+# endif -+ -+#endif /* VCHI_CCP2TX_MANUAL_POWER */ -+ -+#endif /* VCHI_CFG_H_ */ -+ -+/****************************** End of file **********************************/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2012-07-15 20:29:13.751983290 +0200 -@@ -0,0 +1,56 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. -+ * -+ * 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 VCHI_CFG_INTERNAL_H_ -+#define VCHI_CFG_INTERNAL_H_ -+ -+/**************************************************************************************** -+ * Control optimisation attempts. -+ ***************************************************************************************/ -+ -+// Don't use lots of short-term locks - use great long ones, reducing the overall locks-per-second -+#define VCHI_COARSE_LOCKING -+ -+// Avoid lock then unlock on exit from blocking queue operations (msg tx, bulk rx/tx) -+// (only relevant if VCHI_COARSE_LOCKING) -+#define VCHI_ELIDE_BLOCK_EXIT_LOCK -+ -+// Avoid lock on non-blocking peek -+// (only relevant if VCHI_COARSE_LOCKING) -+#define VCHI_AVOID_PEEK_LOCK -+ -+// Use one slot-handler thread per connection, rather than 1 thread dealing with all connections in rotation. -+#define VCHI_MULTIPLE_HANDLER_THREADS -+ -+// Put free descriptors onto the head of the free queue, rather than the tail, so that we don't thrash -+// our way through the pool of descriptors. -+#define VCHI_PUSH_FREE_DESCRIPTORS_ONTO_HEAD -+ -+// Don't issue a MSG_AVAILABLE callback for every single message. Possibly only safe if VCHI_COARSE_LOCKING. -+#define VCHI_FEWER_MSG_AVAILABLE_CALLBACKS -+ -+// Don't use message descriptors for TX messages that don't need them -+#define VCHI_MINIMISE_TX_MSG_DESCRIPTORS -+ -+// Nano-locks for multiqueue -+//#define VCHI_MQUEUE_NANOLOCKS -+ -+// Lock-free(er) dequeuing -+//#define VCHI_RX_NANOLOCKS -+ -+#endif /*VCHI_CFG_INTERNAL_H_*/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_common.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2012-07-15 20:29:13.751983290 +0200 -@@ -0,0 +1,152 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. -+ * -+ * 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 -+ */ -+ -+/*============================================================================= -+Contains global defs used by submodules within vchi. -+=============================================================================*/ -+ -+#ifndef VCHI_COMMON_H_ -+#define VCHI_COMMON_H_ -+ -+ -+//flags used when sending messages (must be bitmapped) -+typedef enum -+{ -+ VCHI_FLAGS_NONE = 0x0, -+ VCHI_FLAGS_BLOCK_UNTIL_OP_COMPLETE = 0x1, // waits for message to be received, or sent (NB. not the same as being seen on other side) -+ VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE = 0x2, // run a callback when message sent -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED = 0x4, // return once the transfer is in a queue ready to go -+ VCHI_FLAGS_ALLOW_PARTIAL = 0x8, -+ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ = 0x10, -+ VCHI_FLAGS_CALLBACK_WHEN_DATA_READ = 0x20, -+ -+ VCHI_FLAGS_ALIGN_SLOT = 0x000080, // internal use only -+ VCHI_FLAGS_BULK_AUX_QUEUED = 0x010000, // internal use only -+ VCHI_FLAGS_BULK_AUX_COMPLETE = 0x020000, // internal use only -+ VCHI_FLAGS_BULK_DATA_QUEUED = 0x040000, // internal use only -+ VCHI_FLAGS_BULK_DATA_COMPLETE = 0x080000, // internal use only -+ VCHI_FLAGS_INTERNAL = 0xFF0000 -+} VCHI_FLAGS_T; -+ -+// constants for vchi_crc_control() -+typedef enum { -+ VCHI_CRC_NOTHING = -1, -+ VCHI_CRC_PER_SERVICE = 0, -+ VCHI_CRC_EVERYTHING = 1, -+} VCHI_CRC_CONTROL_T; -+ -+//callback reasons when an event occurs on a service -+typedef enum -+{ -+ VCHI_CALLBACK_REASON_MIN, -+ -+ //This indicates that there is data available -+ //handle is the msg id that was transmitted with the data -+ // When a message is received and there was no FULL message available previously, send callback -+ // Tasks get kicked by the callback, reset their event and try and read from the fifo until it fails -+ VCHI_CALLBACK_MSG_AVAILABLE, -+ VCHI_CALLBACK_MSG_SENT, -+ VCHI_CALLBACK_MSG_SPACE_AVAILABLE, // XXX not yet implemented -+ -+ // This indicates that a transfer from the other side has completed -+ VCHI_CALLBACK_BULK_RECEIVED, -+ //This indicates that data queued up to be sent has now gone -+ //handle is the msg id that was used when sending the data -+ VCHI_CALLBACK_BULK_SENT, -+ VCHI_CALLBACK_BULK_RX_SPACE_AVAILABLE, // XXX not yet implemented -+ VCHI_CALLBACK_BULK_TX_SPACE_AVAILABLE, // XXX not yet implemented -+ -+ VCHI_CALLBACK_SERVICE_CLOSED, -+ -+ // this side has sent XOFF to peer due to lack of data consumption by service -+ // (suggests the service may need to take some recovery action if it has -+ // been deliberately holding off consuming data) -+ VCHI_CALLBACK_SENT_XOFF, -+ VCHI_CALLBACK_SENT_XON, -+ -+ // indicates that a bulk transfer has finished reading the source buffer -+ VCHI_CALLBACK_BULK_DATA_READ, -+ -+ // power notification events (currently host side only) -+ VCHI_CALLBACK_PEER_OFF, -+ VCHI_CALLBACK_PEER_SUSPENDED, -+ VCHI_CALLBACK_PEER_ON, -+ VCHI_CALLBACK_PEER_RESUMED, -+ VCHI_CALLBACK_FORCED_POWER_OFF, -+ -+#ifdef USE_VCHIQ_ARM -+ // some extra notifications provided by vchiq_arm -+ VCHI_CALLBACK_SERVICE_OPENED, -+ VCHI_CALLBACK_BULK_RECEIVE_ABORTED, -+ VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, -+#endif -+ -+ VCHI_CALLBACK_REASON_MAX -+} VCHI_CALLBACK_REASON_T; -+ -+//Calback used by all services / bulk transfers -+typedef void (*VCHI_CALLBACK_T)( void *callback_param, //my service local param -+ VCHI_CALLBACK_REASON_T reason, -+ void *handle ); //for transmitting msg's only -+ -+ -+ -+/* -+ * Define vector struct for scatter-gather (vector) operations -+ * Vectors can be nested - if a vector element has negative length, then -+ * the data pointer is treated as pointing to another vector array, with -+ * '-vec_len' elements. Thus to append a header onto an existing vector, -+ * you can do this: -+ * -+ * void foo(const VCHI_MSG_VECTOR_T *v, int n) -+ * { -+ * VCHI_MSG_VECTOR_T nv[2]; -+ * nv[0].vec_base = my_header; -+ * nv[0].vec_len = sizeof my_header; -+ * nv[1].vec_base = v; -+ * nv[1].vec_len = -n; -+ * ... -+ * -+ */ -+typedef struct vchi_msg_vector { -+ const void *vec_base; -+ int32_t vec_len; -+} VCHI_MSG_VECTOR_T; -+ -+// Opaque type for a connection API -+typedef struct opaque_vchi_connection_api_t VCHI_CONNECTION_API_T; -+ -+// Opaque type for a message driver -+typedef struct opaque_vchi_message_driver_t VCHI_MESSAGE_DRIVER_T; -+ -+ -+// Iterator structure for reading ahead through received message queue. Allocated by client, -+// initialised by vchi_msg_look_ahead. Fields are for internal VCHI use only. -+// Iterates over messages in queue at the instant of the call to vchi_msg_lookahead - -+// will not proceed to messages received since. Behaviour is undefined if an iterator -+// is used again after messages for that service are removed/dequeued by any -+// means other than vchi_msg_iter_... calls on the iterator itself. -+typedef struct { -+ struct opaque_vchi_service_t *service; -+ void *last; -+ void *next; -+ void *remove; -+} VCHI_MSG_ITER_T; -+ -+ -+#endif // VCHI_COMMON_H_ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi.h 2012-07-15 20:29:13.751983290 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchi/vchi.h b/drivers/misc/vc04_services/interface/vchi/vchi.h +new file mode 100644 +index 0000000..e441d8c +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/vchi.h @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -8177,9 +8474,451 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi.h linux-r +#endif /* VCHI_H_ */ + +/****************************** End of file **********************************/ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_mh.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2012-07-15 20:29:13.750983271 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h b/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h +new file mode 100644 +index 0000000..a66e489 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h +@@ -0,0 +1,214 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. ++ * ++ * 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 ++ */ ++ ++/*============================================================================= ++Contains the #defines for the number of servers / clients etc, these can be ++over-ridden from the platform makefile if needed ++=============================================================================*/ ++ ++#ifndef VCHI_CFG_H_ ++#define VCHI_CFG_H_ ++ ++/**************************************************************************************** ++ * Defines in this first section are part of the VCHI API and may be examined by VCHI ++ * services. ++ ***************************************************************************************/ ++ ++/* Required alignment of base addresses for bulk transfer, if unaligned transfers are not enabled */ ++/* Really determined by the message driver, and should be available from a run-time call. */ ++#ifndef VCHI_BULK_ALIGN ++# if __VCCOREVER__ >= 0x04000000 ++# define VCHI_BULK_ALIGN 32 // Allows for the need to do cache cleans ++# else ++# define VCHI_BULK_ALIGN 16 ++# endif ++#endif ++ ++/* Required length multiple for bulk transfers, if unaligned transfers are not enabled */ ++/* May be less than or greater than VCHI_BULK_ALIGN */ ++/* Really determined by the message driver, and should be available from a run-time call. */ ++#ifndef VCHI_BULK_GRANULARITY ++# if __VCCOREVER__ >= 0x04000000 ++# define VCHI_BULK_GRANULARITY 32 // Allows for the need to do cache cleans ++# else ++# define VCHI_BULK_GRANULARITY 16 ++# endif ++#endif ++ ++/* The largest possible message to be queued with vchi_msg_queue. */ ++#ifndef VCHI_MAX_MSG_SIZE ++# if defined VCHI_LOCAL_HOST_PORT ++# define VCHI_MAX_MSG_SIZE 16384 // makes file transfers fast, but should they be using bulk? ++# else ++# define VCHI_MAX_MSG_SIZE 4096 // NOTE: THIS MUST BE LARGER THAN OR EQUAL TO THE SIZE OF THE KHRONOS MERGE BUFFER!! ++# endif ++#endif ++ ++/****************************************************************************************** ++ * Defines below are system configuration options, and should not be used by VCHI services. ++ *****************************************************************************************/ ++ ++/* How many connections can we support? A localhost implementation uses 2 connections, ++ * 1 for host-app, 1 for VMCS, and these are hooked together by a loopback MPHI VCFW ++ * driver. */ ++#ifndef VCHI_MAX_NUM_CONNECTIONS ++# define VCHI_MAX_NUM_CONNECTIONS 3 ++#endif ++ ++/* How many services can we open per connection? Extending this doesn't cost processing time, just a small ++ * amount of static memory. */ ++#ifndef VCHI_MAX_SERVICES_PER_CONNECTION ++# define VCHI_MAX_SERVICES_PER_CONNECTION 36 ++#endif ++ ++/* Adjust if using a message driver that supports more logical TX channels */ ++#ifndef VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION ++# define VCHI_MAX_BULK_TX_CHANNELS_PER_CONNECTION 9 // 1 MPHI + 8 CCP2 logical channels ++#endif ++ ++/* Adjust if using a message driver that supports more logical RX channels */ ++#ifndef VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION ++# define VCHI_MAX_BULK_RX_CHANNELS_PER_CONNECTION 1 // 1 MPHI ++#endif ++ ++/* How many receive slots do we use. This times VCHI_MAX_MSG_SIZE gives the effective ++ * receive queue space, less message headers. */ ++#ifndef VCHI_NUM_READ_SLOTS ++# if defined(VCHI_LOCAL_HOST_PORT) ++# define VCHI_NUM_READ_SLOTS 4 ++# else ++# define VCHI_NUM_READ_SLOTS 48 ++# endif ++#endif ++ ++/* Do we utilise overrun facility for receive message slots? Can aid peer transmit ++ * performance. Only define on VideoCore end, talking to host. ++ */ ++//#define VCHI_MSG_RX_OVERRUN ++ ++/* How many transmit slots do we use. Generally don't need many, as the hardware driver ++ * underneath VCHI will usually have its own buffering. */ ++#ifndef VCHI_NUM_WRITE_SLOTS ++# define VCHI_NUM_WRITE_SLOTS 4 ++#endif ++ ++/* If a service has held or queued received messages in VCHI_XOFF_THRESHOLD or more slots, ++ * then it's taking up too much buffer space, and the peer service will be told to stop ++ * transmitting with an XOFF message. For this to be effective, the VCHI_NUM_READ_SLOTS ++ * needs to be considerably bigger than VCHI_NUM_WRITE_SLOTS, or the transmit latency ++ * is too high. */ ++#ifndef VCHI_XOFF_THRESHOLD ++# define VCHI_XOFF_THRESHOLD (VCHI_NUM_READ_SLOTS / 2) ++#endif ++ ++/* After we've sent an XOFF, the peer will be told to resume transmission once the local ++ * service has dequeued/released enough messages that it's now occupying ++ * VCHI_XON_THRESHOLD slots or fewer. */ ++#ifndef VCHI_XON_THRESHOLD ++# define VCHI_XON_THRESHOLD (VCHI_NUM_READ_SLOTS / 4) ++#endif ++ ++/* A size below which a bulk transfer omits the handshake completely and always goes ++ * via the message channel, if bulk auxiliary is being sent on that service. (The user ++ * can guarantee this by enabling unaligned transmits). ++ * Not API. */ ++#ifndef VCHI_MIN_BULK_SIZE ++# define VCHI_MIN_BULK_SIZE ( VCHI_MAX_MSG_SIZE / 2 < 4096 ? VCHI_MAX_MSG_SIZE / 2 : 4096 ) ++#endif ++ ++/* Maximum size of bulk transmission chunks, for each interface type. A trade-off between ++ * speed and latency; the smaller the chunk size the better change of messages and other ++ * bulk transmissions getting in when big bulk transfers are happening. Set to 0 to not ++ * break transmissions into chunks. ++ */ ++#ifndef VCHI_MAX_BULK_CHUNK_SIZE_MPHI ++# define VCHI_MAX_BULK_CHUNK_SIZE_MPHI (16 * 1024) ++#endif ++ ++/* NB Chunked CCP2 transmissions violate the letter of the CCP2 spec by using "JPEG8" mode ++ * with multiple-line frames. Only use if the receiver can cope. */ ++#ifndef VCHI_MAX_BULK_CHUNK_SIZE_CCP2 ++# define VCHI_MAX_BULK_CHUNK_SIZE_CCP2 0 ++#endif ++ ++/* How many TX messages can we have pending in our transmit slots. Once exhausted, ++ * vchi_msg_queue will be blocked. */ ++#ifndef VCHI_TX_MSG_QUEUE_SIZE ++# define VCHI_TX_MSG_QUEUE_SIZE 256 ++#endif ++ ++/* How many RX messages can we have parsed in the receive slots. Once exhausted, parsing ++ * will be suspended until older messages are dequeued/released. */ ++#ifndef VCHI_RX_MSG_QUEUE_SIZE ++# define VCHI_RX_MSG_QUEUE_SIZE 256 ++#endif ++ ++/* Really should be able to cope if we run out of received message descriptors, by ++ * suspending parsing as the comment above says, but we don't. This sweeps the issue ++ * under the carpet. */ ++#if VCHI_RX_MSG_QUEUE_SIZE < (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS ++# undef VCHI_RX_MSG_QUEUE_SIZE ++# define VCHI_RX_MSG_QUEUE_SIZE (VCHI_MAX_MSG_SIZE/16 + 1) * VCHI_NUM_READ_SLOTS ++#endif ++ ++/* How many bulk transmits can we have pending. Once exhausted, vchi_bulk_queue_transmit ++ * will be blocked. */ ++#ifndef VCHI_TX_BULK_QUEUE_SIZE ++# define VCHI_TX_BULK_QUEUE_SIZE 64 ++#endif ++ ++/* How many bulk receives can we have pending. Once exhausted, vchi_bulk_queue_receive ++ * will be blocked. */ ++#ifndef VCHI_RX_BULK_QUEUE_SIZE ++# define VCHI_RX_BULK_QUEUE_SIZE 64 ++#endif ++ ++/* A limit on how many outstanding bulk requests we expect the peer to give us. If ++ * the peer asks for more than this, VCHI will fail and assert. The number is determined ++ * by the peer's hardware - it's the number of outstanding requests that can be queued ++ * on all bulk channels. VC3's MPHI peripheral allows 16. */ ++#ifndef VCHI_MAX_PEER_BULK_REQUESTS ++# define VCHI_MAX_PEER_BULK_REQUESTS 32 ++#endif ++ ++/* Define VCHI_CCP2TX_MANUAL_POWER if the host tells us when to turn the CCP2 ++ * transmitter on and off. ++ */ ++/*#define VCHI_CCP2TX_MANUAL_POWER*/ ++ ++#ifndef VCHI_CCP2TX_MANUAL_POWER ++ ++/* Timeout (in milliseconds) for putting the CCP2TX interface into IDLE state. Set ++ * negative for no IDLE. ++ */ ++# ifndef VCHI_CCP2TX_IDLE_TIMEOUT ++# define VCHI_CCP2TX_IDLE_TIMEOUT 5 ++# endif ++ ++/* Timeout (in milliseconds) for putting the CCP2TX interface into OFF state. Set ++ * negative for no OFF. ++ */ ++# ifndef VCHI_CCP2TX_OFF_TIMEOUT ++# define VCHI_CCP2TX_OFF_TIMEOUT 1000 ++# endif ++ ++#endif /* VCHI_CCP2TX_MANUAL_POWER */ ++ ++#endif /* VCHI_CFG_H_ */ ++ ++/****************************** End of file **********************************/ +diff --git a/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h b/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h +new file mode 100644 +index 0000000..958cc55 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h +@@ -0,0 +1,56 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. ++ * ++ * 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 VCHI_CFG_INTERNAL_H_ ++#define VCHI_CFG_INTERNAL_H_ ++ ++/**************************************************************************************** ++ * Control optimisation attempts. ++ ***************************************************************************************/ ++ ++// Don't use lots of short-term locks - use great long ones, reducing the overall locks-per-second ++#define VCHI_COARSE_LOCKING ++ ++// Avoid lock then unlock on exit from blocking queue operations (msg tx, bulk rx/tx) ++// (only relevant if VCHI_COARSE_LOCKING) ++#define VCHI_ELIDE_BLOCK_EXIT_LOCK ++ ++// Avoid lock on non-blocking peek ++// (only relevant if VCHI_COARSE_LOCKING) ++#define VCHI_AVOID_PEEK_LOCK ++ ++// Use one slot-handler thread per connection, rather than 1 thread dealing with all connections in rotation. ++#define VCHI_MULTIPLE_HANDLER_THREADS ++ ++// Put free descriptors onto the head of the free queue, rather than the tail, so that we don't thrash ++// our way through the pool of descriptors. ++#define VCHI_PUSH_FREE_DESCRIPTORS_ONTO_HEAD ++ ++// Don't issue a MSG_AVAILABLE callback for every single message. Possibly only safe if VCHI_COARSE_LOCKING. ++#define VCHI_FEWER_MSG_AVAILABLE_CALLBACKS ++ ++// Don't use message descriptors for TX messages that don't need them ++#define VCHI_MINIMISE_TX_MSG_DESCRIPTORS ++ ++// Nano-locks for multiqueue ++//#define VCHI_MQUEUE_NANOLOCKS ++ ++// Lock-free(er) dequeuing ++//#define VCHI_RX_NANOLOCKS ++ ++#endif /*VCHI_CFG_INTERNAL_H_*/ +diff --git a/drivers/misc/vc04_services/interface/vchi/vchi_common.h b/drivers/misc/vc04_services/interface/vchi/vchi_common.h +new file mode 100644 +index 0000000..4057878 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/vchi_common.h +@@ -0,0 +1,152 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. ++ * ++ * 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 ++ */ ++ ++/*============================================================================= ++Contains global defs used by submodules within vchi. ++=============================================================================*/ ++ ++#ifndef VCHI_COMMON_H_ ++#define VCHI_COMMON_H_ ++ ++ ++//flags used when sending messages (must be bitmapped) ++typedef enum ++{ ++ VCHI_FLAGS_NONE = 0x0, ++ VCHI_FLAGS_BLOCK_UNTIL_OP_COMPLETE = 0x1, // waits for message to be received, or sent (NB. not the same as being seen on other side) ++ VCHI_FLAGS_CALLBACK_WHEN_OP_COMPLETE = 0x2, // run a callback when message sent ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED = 0x4, // return once the transfer is in a queue ready to go ++ VCHI_FLAGS_ALLOW_PARTIAL = 0x8, ++ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ = 0x10, ++ VCHI_FLAGS_CALLBACK_WHEN_DATA_READ = 0x20, ++ ++ VCHI_FLAGS_ALIGN_SLOT = 0x000080, // internal use only ++ VCHI_FLAGS_BULK_AUX_QUEUED = 0x010000, // internal use only ++ VCHI_FLAGS_BULK_AUX_COMPLETE = 0x020000, // internal use only ++ VCHI_FLAGS_BULK_DATA_QUEUED = 0x040000, // internal use only ++ VCHI_FLAGS_BULK_DATA_COMPLETE = 0x080000, // internal use only ++ VCHI_FLAGS_INTERNAL = 0xFF0000 ++} VCHI_FLAGS_T; ++ ++// constants for vchi_crc_control() ++typedef enum { ++ VCHI_CRC_NOTHING = -1, ++ VCHI_CRC_PER_SERVICE = 0, ++ VCHI_CRC_EVERYTHING = 1, ++} VCHI_CRC_CONTROL_T; ++ ++//callback reasons when an event occurs on a service ++typedef enum ++{ ++ VCHI_CALLBACK_REASON_MIN, ++ ++ //This indicates that there is data available ++ //handle is the msg id that was transmitted with the data ++ // When a message is received and there was no FULL message available previously, send callback ++ // Tasks get kicked by the callback, reset their event and try and read from the fifo until it fails ++ VCHI_CALLBACK_MSG_AVAILABLE, ++ VCHI_CALLBACK_MSG_SENT, ++ VCHI_CALLBACK_MSG_SPACE_AVAILABLE, // XXX not yet implemented ++ ++ // This indicates that a transfer from the other side has completed ++ VCHI_CALLBACK_BULK_RECEIVED, ++ //This indicates that data queued up to be sent has now gone ++ //handle is the msg id that was used when sending the data ++ VCHI_CALLBACK_BULK_SENT, ++ VCHI_CALLBACK_BULK_RX_SPACE_AVAILABLE, // XXX not yet implemented ++ VCHI_CALLBACK_BULK_TX_SPACE_AVAILABLE, // XXX not yet implemented ++ ++ VCHI_CALLBACK_SERVICE_CLOSED, ++ ++ // this side has sent XOFF to peer due to lack of data consumption by service ++ // (suggests the service may need to take some recovery action if it has ++ // been deliberately holding off consuming data) ++ VCHI_CALLBACK_SENT_XOFF, ++ VCHI_CALLBACK_SENT_XON, ++ ++ // indicates that a bulk transfer has finished reading the source buffer ++ VCHI_CALLBACK_BULK_DATA_READ, ++ ++ // power notification events (currently host side only) ++ VCHI_CALLBACK_PEER_OFF, ++ VCHI_CALLBACK_PEER_SUSPENDED, ++ VCHI_CALLBACK_PEER_ON, ++ VCHI_CALLBACK_PEER_RESUMED, ++ VCHI_CALLBACK_FORCED_POWER_OFF, ++ ++#ifdef USE_VCHIQ_ARM ++ // some extra notifications provided by vchiq_arm ++ VCHI_CALLBACK_SERVICE_OPENED, ++ VCHI_CALLBACK_BULK_RECEIVE_ABORTED, ++ VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, ++#endif ++ ++ VCHI_CALLBACK_REASON_MAX ++} VCHI_CALLBACK_REASON_T; ++ ++//Calback used by all services / bulk transfers ++typedef void (*VCHI_CALLBACK_T)( void *callback_param, //my service local param ++ VCHI_CALLBACK_REASON_T reason, ++ void *handle ); //for transmitting msg's only ++ ++ ++ ++/* ++ * Define vector struct for scatter-gather (vector) operations ++ * Vectors can be nested - if a vector element has negative length, then ++ * the data pointer is treated as pointing to another vector array, with ++ * '-vec_len' elements. Thus to append a header onto an existing vector, ++ * you can do this: ++ * ++ * void foo(const VCHI_MSG_VECTOR_T *v, int n) ++ * { ++ * VCHI_MSG_VECTOR_T nv[2]; ++ * nv[0].vec_base = my_header; ++ * nv[0].vec_len = sizeof my_header; ++ * nv[1].vec_base = v; ++ * nv[1].vec_len = -n; ++ * ... ++ * ++ */ ++typedef struct vchi_msg_vector { ++ const void *vec_base; ++ int32_t vec_len; ++} VCHI_MSG_VECTOR_T; ++ ++// Opaque type for a connection API ++typedef struct opaque_vchi_connection_api_t VCHI_CONNECTION_API_T; ++ ++// Opaque type for a message driver ++typedef struct opaque_vchi_message_driver_t VCHI_MESSAGE_DRIVER_T; ++ ++ ++// Iterator structure for reading ahead through received message queue. Allocated by client, ++// initialised by vchi_msg_look_ahead. Fields are for internal VCHI use only. ++// Iterates over messages in queue at the instant of the call to vchi_msg_lookahead - ++// will not proceed to messages received since. Behaviour is undefined if an iterator ++// is used again after messages for that service are removed/dequeued by any ++// means other than vchi_msg_iter_... calls on the iterator itself. ++typedef struct { ++ struct opaque_vchi_service_t *service; ++ void *last; ++ void *next; ++ void *remove; ++} VCHI_MSG_ITER_T; ++ ++ ++#endif // VCHI_COMMON_H_ +diff --git a/drivers/misc/vc04_services/interface/vchi/vchi_mh.h b/drivers/misc/vc04_services/interface/vchi/vchi_mh.h +new file mode 100644 +index 0000000..9bcf12e +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchi/vchi_mh.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -8208,9 +8947,77 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linu +#define VCHI_MEM_HANDLE_INVALID 0 + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2012-07-15 20:29:13.666981713 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h +new file mode 100644 +index 0000000..49d3087 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h +@@ -0,0 +1,27 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom. All rights reserved. ++ * ++ * 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 VCHIQ_VCHIQ_H ++#define VCHIQ_VCHIQ_H ++ ++#include "vchiq_if.h" ++#include "vchiq_util.h" ++#include "interface/vcos/vcos.h" ++ ++#endif ++ +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h +new file mode 100644 +index 0000000..959405e +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h +@@ -0,0 +1,27 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. ++ * ++ * 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 VCHIQ_2835_H ++#define VCHIQ_2835_H ++ ++#include "vchiq_pagelist.h" ++ ++#define VCHIQ_PLATFORM_FRAGMENTS_OFFSET_IDX 0 ++#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1 ++ ++#endif /* VCHIQ_2835_H */ +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +new file mode 100644 +index 0000000..35f6afe +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -8724,40 +9531,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_283 + kfree(pagelist); +} + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2012-07-15 20:29:13.734982971 +0200 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. -+ * -+ * 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 VCHIQ_2835_H -+#define VCHIQ_2835_H -+ -+#include "vchiq_pagelist.h" -+ -+#define VCHIQ_PLATFORM_FRAGMENTS_OFFSET_IDX 0 -+#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1 -+ -+#endif /* VCHIQ_2835_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2012-07-15 20:29:13.723982762 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c +new file mode 100644 +index 0000000..49a53ce +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -0,0 +1,1912 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -10671,9 +11449,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm +module_exit(vchiq_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2012-07-15 20:29:13.674981835 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h +new file mode 100644 +index 0000000..24b42ff +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -10793,9 +11573,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm + + +#endif /* VCHIQ_ARM_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2012-07-15 20:29:13.725982798 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h +new file mode 100644 +index 0000000..cd51d99 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -10840,9 +11622,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg +#endif + +#endif /* VCHIQ_CFG_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2012-07-15 20:29:13.750983271 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c +new file mode 100644 +index 0000000..62e3006 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c @@ -0,0 +1,101 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -10945,9 +11729,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_con +} + +EXPORT_SYMBOL( vchiq_add_connected_callback ); -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2012-07-15 20:29:13.733982952 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h +new file mode 100644 +index 0000000..88cfa58 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h @@ -0,0 +1,32 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -10981,9 +11767,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_con + +#endif /* VCHIQ_CONNECTED_H */ + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2012-07-15 20:29:13.749983252 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c +new file mode 100644 +index 0000000..749e7d4 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -0,0 +1,2717 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -13702,9 +14490,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cor + } + return status; +} -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2012-07-15 20:29:13.724982778 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h +new file mode 100644 +index 0000000..37884bd +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -14212,40 +15002,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cor +vchiq_platform_conn_state_changed(VCHIQ_STATE_T* state, VCHIQ_CONNSTATE_T oldstate, VCHIQ_CONNSTATE_T newstate); + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2012-07-15 20:29:13.724982778 +0200 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom. All rights reserved. -+ * -+ * 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 VCHIQ_VCHIQ_H -+#define VCHIQ_VCHIQ_H -+ -+#include "vchiq_if.h" -+#include "vchiq_util.h" -+#include "interface/vcos/vcos.h" -+ -+#endif -+ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2012-07-15 20:29:13.725982798 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h +new file mode 100644 +index 0000000..42d471b +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -14402,9 +15163,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if. +extern VCHIQ_STATUS_T vchiq_dump_phys_mem( VCHIQ_SERVICE_HANDLE_T service, void *ptr, size_t num_bytes ); + +#endif /* VCHIQ_IF_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2012-07-15 20:29:13.742983121 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h +new file mode 100644 +index 0000000..06298bf +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -14511,9 +15274,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioc +#define VCHIQ_IOC_MAX 15 + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2012-07-15 20:29:13.734982971 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c +new file mode 100644 +index 0000000..e1768e4 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c @@ -0,0 +1,297 @@ +/***************************************************************************** +* Copyright 2001 - 2011 Broadcom Corporation. All rights reserved. @@ -14812,9 +15577,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ker +EXPORT_SYMBOL(vchiq_open_service); +EXPORT_SYMBOL(vchiq_add_service_params); +EXPORT_SYMBOL(vchiq_open_service_params); -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c 2012-07-15 20:29:13.726982820 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c +new file mode 100644 +index 0000000..f1a8f42 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib.c @@ -0,0 +1,1628 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -16444,9 +17211,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_lib + free_msgbufs = buf; + vcos_mutex_unlock(&vchiq_lib_mutex); +} -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2012-07-15 20:29:13.733982952 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h +new file mode 100644 +index 0000000..a465b91 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h @@ -0,0 +1,45 @@ +/***************************************************************************** +* Copyright 2001 - 2010 Broadcom Corporation. All rights reserved. @@ -16493,9 +17262,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_mem +VCHIQ_STATUS_T vchiq_memdrv_initialise(void); + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2012-07-15 20:29:13.723982762 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h +new file mode 100644 +index 0000000..e8d4e30 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -16540,9 +17311,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pag +} FRAGMENTS_T; + +#endif /* VCHIQ_PAGELIST_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2012-07-15 20:29:13.724982778 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c +new file mode 100644 +index 0000000..88cd86f +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c @@ -0,0 +1,1001 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -17545,9 +18318,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shi +EXPORT_SYMBOL(vchi_service_use); +EXPORT_SYMBOL(vchi_service_release); +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2012-07-15 20:29:13.750983271 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c +new file mode 100644 +index 0000000..20b67c3 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -17646,9 +18421,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_uti + + return header; +} -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2012-07-15 20:29:13.674981835 +0200 +diff --git a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h +new file mode 100644 +index 0000000..6e0c84b +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010-2011 Broadcom Corporation. All rights reserved. @@ -17697,9 +18474,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_uti + +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c 2012-07-15 20:29:13.594980335 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c b/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c +new file mode 100644 +index 0000000..447d577 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_cmd.c @@ -0,0 +1,681 @@ +/***************************************************************************** +* Copyright 2009 - 2011 Broadcom Corporation. All rights reserved. @@ -18382,9 +19161,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_c + return VCOS_SUCCESS; +} + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h 2012-07-15 20:29:13.587980204 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h +new file mode 100644 +index 0000000..ce7816957 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_common.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -18473,9 +19254,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_c +VCOSPRE_ void VCOSPOST_ vcos_timer_init(void); +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h 2012-07-15 20:29:13.595980354 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h +new file mode 100644 +index 0000000..154b200 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_blockpool.h @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -18748,9 +19531,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif +#endif /* VCOS_GENERIC_BLOCKPOOL_H */ + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c 2012-07-15 20:29:13.594980335 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c +new file mode 100644 +index 0000000..3948a57 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.c @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19063,9 +19848,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +} + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h 2012-07-15 20:29:13.597980392 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h +new file mode 100644 +index 0000000..8776ebe +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_event_flags.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19185,9 +19972,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h 2012-07-15 20:29:13.596980373 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h +new file mode 100644 +index 0000000..370562d +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_named_sem.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19281,9 +20070,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h 2012-07-15 20:29:13.595980354 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h +new file mode 100644 +index 0000000..bf7945c +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_quickslow_mutex.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19371,9 +20162,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h 2012-07-15 20:29:13.595980354 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h +new file mode 100644 +index 0000000..27563ea +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_reentrant_mtx.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19461,9 +20254,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h 2012-07-15 20:29:13.571979902 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h +new file mode 100644 +index 0000000..22c059a +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_generic_tls.h @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19620,9 +20415,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_g +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h 2012-07-15 20:29:13.596980373 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h +new file mode 100644 +index 0000000..fd0e198 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_joinable_thread_from_plain.h @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19838,9 +20635,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_j +} +#endif +#endif /* VCOS_JOINABLE_THREAD_FROM_PLAIN_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h 2012-07-15 20:29:13.596980373 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h +new file mode 100644 +index 0000000..ec9e07b +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_latch_from_sem.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -19901,9 +20700,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_l + +#endif /* VCOS_INLINE_BODIES */ + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c 2012-07-15 20:29:13.593980317 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c b/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c +new file mode 100644 +index 0000000..8b05179 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_logcat.c @@ -0,0 +1,560 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20465,9 +21266,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_l + } +} + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c 2012-07-15 20:29:13.582980110 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c +new file mode 100644 +index 0000000..dd0574a +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20553,9 +21356,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_m + _vcos_platform_free(h->ptr); +} + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h 2012-07-15 20:29:13.571979902 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h +new file mode 100644 +index 0000000..8e2a18e +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mem_from_malloc.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20622,9 +21427,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_m +#endif /* VCOS_INLINE_BODIES */ + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h 2012-07-15 20:29:13.596980373 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h +new file mode 100644 +index 0000000..a6a52b4 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_mutexes_are_reentrant.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20705,9 +21512,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_m + + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h 2012-07-15 20:29:13.588980223 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h b/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h +new file mode 100644 +index 0000000..655dc25 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/generic/vcos_thread_reaper.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20755,9 +21564,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/generic/vcos_t +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h 2012-07-15 20:29:13.465977909 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h b/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h +new file mode 100644 +index 0000000..1db1ecb +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/stdint.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -20790,9 +21601,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/st +#include /* includes integer types */ + +#endif /* _VCOS_PLATFORM_LINUX_STDINT_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c 2012-07-15 20:29:13.472978040 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c +new file mode 100644 +index 0000000..0385540 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel.c @@ -0,0 +1,627 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -21421,9 +22234,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc +EXPORT_SYMBOL( vcos_verify_bkpts_enabled ); + +EXPORT_SYMBOL( vcos_strdup ); -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c 2012-07-15 20:29:13.471978021 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c +new file mode 100644 +index 0000000..e3f0840 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_cfg.c @@ -0,0 +1,332 @@ +/***************************************************************************** +* Copyright 2009 - 2010 Broadcom Corporation. All rights reserved. @@ -21757,9 +22572,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc + +EXPORT_SYMBOL_GPL( vcos_cfg_get_proc_entry ); + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c 2012-07-15 20:29:13.472978040 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c +new file mode 100644 +index 0000000..4a9cedf +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_linuxkernel_misc.c @@ -0,0 +1,111 @@ +/***************************************************************************** +* Copyright 2009 - 2010 Broadcom Corporation. All rights reserved. @@ -21872,9 +22689,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc + +// END ######################################################################### +// ############################################################################# -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c 2012-07-15 20:29:13.471978021 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c +new file mode 100644 +index 0000000..6ffd755 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_mod_init.c @@ -0,0 +1,64 @@ +/***************************************************************************** +* Copyright 2006 - 2008 Broadcom Corporation. All rights reserved. @@ -21940,9 +22759,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc +MODULE_LICENSE( "GPL" ); +MODULE_VERSION( "1.0" ); + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h 2012-07-15 20:29:13.470978002 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h +new file mode 100644 +index 0000000..381688e +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform.h @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -22451,9 +23272,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc + +#endif /* VCOS_PLATFORM_H */ + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h 2012-07-15 20:29:13.483978247 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h +new file mode 100644 +index 0000000..5f82aaf +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_platform_types.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -22514,9 +23337,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc +#define PRIx64 "llx" + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c 2012-07-15 20:29:13.484978266 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c +new file mode 100644 +index 0000000..2d62589 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.c @@ -0,0 +1,129 @@ +/***************************************************************************** +* Copyright 2009 - 2010 Broadcom Corporation. All rights reserved. @@ -22647,9 +23472,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc + + return *vcos_thread_storage; +} -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h 2012-07-15 20:29:13.483978247 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h +new file mode 100644 +index 0000000..62963c1 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/linuxkernel/vcos_thread_map.h @@ -0,0 +1,39 @@ +/***************************************************************************** +* Copyright 2009 - 2010 Broadcom Corporation. All rights reserved. @@ -22690,9 +23517,229 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/linuxkernel/vc +VCOS_THREAD_T *vcos_kthread_current(void); + +#endif /*VCOS_THREAD_MAP_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_assert.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_assert.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_assert.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_assert.h 2012-07-15 20:29:13.598980411 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos.h b/drivers/misc/vc04_services/interface/vcos/vcos.h +new file mode 100644 +index 0000000..e37d795 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos.h +@@ -0,0 +1,212 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom. All rights reserved. ++ * ++ * 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 ++ */ ++ ++/*============================================================================= ++VideoCore OS Abstraction Layer - public header file ++=============================================================================*/ ++ ++/** ++ * \mainpage OS Abstraction Layer ++ * ++ * \section intro Introduction ++ * ++ * This abstraction layer is here to allow the underlying OS to be easily changed (e.g. from ++ * Nucleus to ThreadX) and to aid in porting host applications to new targets. ++ * ++ * \subsection error Error handling ++ * ++ * Wherever possible, VCOS functions assert internally and return void. The only exceptions ++ * are creation functions (which might fail due to lack of resources) and functions that ++ * might timeout or fail due to lack of space. Errors that might be reported by the underlying ++ * OS API (e.g. invalid mutex) are treated as a programming error, and are merely asserted on. ++ * ++ * \section thread_synch Threads and synchronisation ++ * ++ * \subsection thread Threads ++ * ++ * The thread API is somewhat different to that found in Nucleus. In particular, threads ++ * cannot just be destroyed at arbitrary times and nor can they merely exit. This is so ++ * that the same API can be implemented across all interesting platforms without too much ++ * difficulty. See vcos_thread.h for details. Thread attributes are configured via ++ * the VCOS_THREAD_ATTR_T structure, found in vcos_thread_attr.h. ++ * ++ * \subsection sema Semaphores ++ * ++ * Counted semaphores (c.f. Nucleus NU_SEMAPHORE) are created with VCOS_SEMAPHORE_T. ++ * Under ThreadX on VideoCore, semaphores are implemented using VideoCore spinlocks, and ++ * so are quite a lot faster than ordinary ThreadX semaphores. See vcos_semaphore.h. ++ * ++ * \subsection mtx Mutexes ++ * ++ * Mutexes are used for locking. Attempts to take a mutex twice, or to unlock it ++ * in a different thread to the one in which it was locked should be expected to fail. ++ * Mutexes are not re-entrant (see vcos_reentrant_mutex.h for a slightly slower ++ * re-entrant mutex). ++ * ++ * \subsection evflags Event flags ++ * ++ * Event flags (the ThreadX name - also known as event groups under Nucleus) provide ++ * 32 flags which can be waited on by multiple clients, and signalled by multiple clients. ++ * A timeout can be specified. See vcos_event_flags.h. An alternative to this is the ++ * VCOS_EVENT_T (see vcos_event.h) which is akin to the Win32 auto-reset event, or a ++ * saturating counted semaphore. ++ * ++ * \subsection event Events ++ * ++ * A VCOS_EVENT_T is a bit like a saturating semaphore. No matter how many times it ++ * is signalled, the waiter will only wake up once. See vcos_event.h. You might think this ++ * is useful if you suspect that the cost of reading the semaphore count (perhaps via a ++ * system call) is expensive on your platform. ++ * ++ * \subsection tls Thread local storage ++ * ++ * Thread local storage is supported using vcos_tls.h. This is emulated on Nucleus ++ * and ThreadX. ++ * ++ * \section int Interrupts ++ * ++ * The legacy LISR/HISR scheme found in Nucleus is supported via the legacy ISR API, ++ * which is also supported on ThreadX. New code should avoid this, and old code should ++ * be migrated away from it, since it is slow. See vcos_legacy_isr.h. ++ * ++ * Registering an interrupt handler, and disabling/restoring interrupts, is handled ++ * using the functions in vcos_isr.h. ++ * ++ */ ++ ++/** ++ * \file vcos.h ++ * ++ * This is the top level header file. Clients include this. It pulls in the platform-specific ++ * header file (vcos_platform.h) together with header files defining the expected APIs, such ++ * as vcos_mutex.h, vcos_semaphore.h, etc. It is also possible to include these header files ++ * directly. ++ * ++ */ ++ ++#ifndef VCOS_H ++#define VCOS_H ++ ++#include "interface/vcos/vcos_assert.h" ++#include "vcos_types.h" ++#include "vcos_platform.h" ++ ++#ifndef VCOS_INIT_H ++#include "interface/vcos/vcos_init.h" ++#endif ++ ++#ifndef VCOS_SEMAPHORE_H ++#include "interface/vcos/vcos_semaphore.h" ++#endif ++ ++#ifndef VCOS_THREAD_H ++#include "interface/vcos/vcos_thread.h" ++#endif ++ ++#ifndef VCOS_MUTEX_H ++#include "interface/vcos/vcos_mutex.h" ++#endif ++ ++#ifndef VCOS_MEM_H ++#include "interface/vcos/vcos_mem.h" ++#endif ++ ++#ifndef VCOS_LOGGING_H ++#include "interface/vcos/vcos_logging.h" ++#endif ++ ++#ifndef VCOS_STRING_H ++#include "interface/vcos/vcos_string.h" ++#endif ++ ++#ifndef VCOS_EVENT_H ++#include "interface/vcos/vcos_event.h" ++#endif ++ ++#ifndef VCOS_THREAD_ATTR_H ++#include "interface/vcos/vcos_thread_attr.h" ++#endif ++ ++#ifndef VCOS_TLS_H ++#include "interface/vcos/vcos_tls.h" ++#endif ++ ++#ifndef VCOS_REENTRANT_MUTEX_H ++#include "interface/vcos/vcos_reentrant_mutex.h" ++#endif ++ ++#ifndef VCOS_NAMED_SEMAPHORE_H ++#include "interface/vcos/vcos_named_semaphore.h" ++#endif ++ ++#ifndef VCOS_QUICKSLOW_MUTEX_H ++#include "interface/vcos/vcos_quickslow_mutex.h" ++#endif ++ ++/* Headers with predicates */ ++ ++#if VCOS_HAVE_EVENT_FLAGS ++#include "interface/vcos/vcos_event_flags.h" ++#endif ++ ++#if VCOS_HAVE_QUEUE ++#include "interface/vcos/vcos_queue.h" ++#endif ++ ++#if VCOS_HAVE_LEGACY_ISR ++#include "interface/vcos/vcos_legacy_isr.h" ++#endif ++ ++#if VCOS_HAVE_TIMER ++#include "interface/vcos/vcos_timer.h" ++#endif ++ ++#if VCOS_HAVE_MEMPOOL ++#include "interface/vcos/vcos_mempool.h" ++#endif ++ ++#if VCOS_HAVE_ISR ++#include "interface/vcos/vcos_isr.h" ++#endif ++ ++#if VCOS_HAVE_ATOMIC_FLAGS ++#include "interface/vcos/vcos_atomic_flags.h" ++#endif ++ ++#if VCOS_HAVE_ONCE ++#include "interface/vcos/vcos_once.h" ++#endif ++ ++#if VCOS_HAVE_BLOCK_POOL ++#include "interface/vcos/vcos_blockpool.h" ++#endif ++ ++#if VCOS_HAVE_FILE ++#include "interface/vcos/vcos_file.h" ++#endif ++ ++#if VCOS_HAVE_CFG ++#include "interface/vcos/vcos_cfg.h" ++#endif ++ ++#if VCOS_HAVE_CMD ++#include "interface/vcos/vcos_cmd.h" ++#endif ++ ++#endif /* VCOS_H */ ++ +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_assert.h b/drivers/misc/vc04_services/interface/vcos/vcos_assert.h +new file mode 100644 +index 0000000..1e72dff +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_assert.h @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -22974,9 +24021,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_assert.h +#endif + +#endif /* VCOS_ASSERT_H */ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h 2012-07-15 20:29:13.597980392 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h b/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h +new file mode 100644 +index 0000000..317abf3 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_atomic_flags.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23061,9 +24110,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_atomic_fl +#endif + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h 2012-07-15 20:29:13.463977871 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h b/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h +new file mode 100644 +index 0000000..f3817f6 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_build_info.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23088,9 +24139,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_build_inf +const char *vcos_get_build_time( void ); +const char *vcos_get_build_date( void ); + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h 2012-07-15 20:29:13.462977852 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h b/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h +new file mode 100644 +index 0000000..4423051 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h @@ -0,0 +1,113 @@ +/***************************************************************************** +* Copyright 2009 - 2011 Broadcom Corporation. All rights reserved. @@ -23205,9 +24258,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cfg.h lin +#endif +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h 2012-07-15 20:29:13.502978604 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h b/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h +new file mode 100644 +index 0000000..29d5315 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h @@ -0,0 +1,98 @@ +/***************************************************************************** +* Copyright 2009 - 2011 Broadcom Corporation. All rights reserved. @@ -23307,9 +24362,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_cmd.h lin + +#endif /* VCOS_CMD_H */ + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h 2012-07-15 20:29:13.600980449 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h b/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h +new file mode 100644 +index 0000000..a270de8 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23351,9 +24408,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_ctype.h l + +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h 2012-07-15 20:29:13.598980411 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h b/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h +new file mode 100644 +index 0000000..0a683c0b +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23435,9 +24494,125 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_dlfcn.h l +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h 2012-07-15 20:29:13.493978435 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_event.h b/drivers/misc/vc04_services/interface/vcos/vcos_event.h +new file mode 100644 +index 0000000..38612f9 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_event.h +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom. All rights reserved. ++ * ++ * 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 ++ */ ++ ++/*============================================================================= ++VideoCore OS Abstraction Layer - public header file for events ++=============================================================================*/ ++ ++#ifndef VCOS_EVENT_H ++#define VCOS_EVENT_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "interface/vcos/vcos_types.h" ++#include "vcos_platform.h" ++ ++/** ++ * \file ++ * ++ * An event is akin to the Win32 auto-reset event. ++ * ++ * ++ * Signalling an event will wake up one waiting thread only. Once one ++ * thread has been woken the event atomically returns to the unsignalled ++ * state. ++ * ++ * If no threads are waiting on the event when it is signalled it remains ++ * signalled. ++ * ++ * This is almost, but not quite, completely unlike the "event flags" ++ * object based on Nucleus event groups and ThreadX event flags. ++ * ++ * In particular, it should be similar in speed to a semaphore, unlike ++ * the event flags. ++ */ ++ ++/** ++ * Create an event instance. ++ * ++ * @param event Filled in with constructed event. ++ * @param name Name of the event (for debugging) ++ * ++ * @return VCOS_SUCCESS on success, or error code. ++ */ ++VCOS_INLINE_DECL ++VCOS_STATUS_T vcos_event_create(VCOS_EVENT_T *event, const char *name); ++ ++#ifndef vcos_event_signal ++ ++/** ++ * Signal the event. The event will return to being unsignalled ++ * after exactly one waiting thread has been woken up. If no ++ * threads are waiting it remains signalled. ++ * ++ * @param event The event to signal ++ */ ++VCOS_INLINE_DECL ++void vcos_event_signal(VCOS_EVENT_T *event); ++ ++/** ++ * Wait for the event. ++ * ++ * @param event The event to wait for ++ * @return VCOS_SUCCESS on success, VCOS_EAGAIN if the wait was interrupted. ++ */ ++VCOS_INLINE_DECL ++VCOS_STATUS_T vcos_event_wait(VCOS_EVENT_T *event); ++ ++/** ++ * Try event, but don't block. ++ * ++ * @param event The event to try ++ * @return VCOS_SUCCESS on success, VCOS_EAGAIN if the event is not currently signalled ++ */ ++VCOS_INLINE_DECL ++VCOS_STATUS_T vcos_event_try(VCOS_EVENT_T *event); ++ ++#endif ++ ++/* ++ * Destroy an event. ++ */ ++VCOS_INLINE_DECL ++void vcos_event_delete(VCOS_EVENT_T *event); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif ++ ++ +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h b/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h +new file mode 100644 +index 0000000..9eee410 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_event_flags.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23548,337 +24723,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event_fla + +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_event.h 2012-07-15 20:29:13.501978585 +0200 -@@ -0,0 +1,108 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom. All rights reserved. -+ * -+ * 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 -+ */ -+ -+/*============================================================================= -+VideoCore OS Abstraction Layer - public header file for events -+=============================================================================*/ -+ -+#ifndef VCOS_EVENT_H -+#define VCOS_EVENT_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "interface/vcos/vcos_types.h" -+#include "vcos_platform.h" -+ -+/** -+ * \file -+ * -+ * An event is akin to the Win32 auto-reset event. -+ * -+ * -+ * Signalling an event will wake up one waiting thread only. Once one -+ * thread has been woken the event atomically returns to the unsignalled -+ * state. -+ * -+ * If no threads are waiting on the event when it is signalled it remains -+ * signalled. -+ * -+ * This is almost, but not quite, completely unlike the "event flags" -+ * object based on Nucleus event groups and ThreadX event flags. -+ * -+ * In particular, it should be similar in speed to a semaphore, unlike -+ * the event flags. -+ */ -+ -+/** -+ * Create an event instance. -+ * -+ * @param event Filled in with constructed event. -+ * @param name Name of the event (for debugging) -+ * -+ * @return VCOS_SUCCESS on success, or error code. -+ */ -+VCOS_INLINE_DECL -+VCOS_STATUS_T vcos_event_create(VCOS_EVENT_T *event, const char *name); -+ -+#ifndef vcos_event_signal -+ -+/** -+ * Signal the event. The event will return to being unsignalled -+ * after exactly one waiting thread has been woken up. If no -+ * threads are waiting it remains signalled. -+ * -+ * @param event The event to signal -+ */ -+VCOS_INLINE_DECL -+void vcos_event_signal(VCOS_EVENT_T *event); -+ -+/** -+ * Wait for the event. -+ * -+ * @param event The event to wait for -+ * @return VCOS_SUCCESS on success, VCOS_EAGAIN if the wait was interrupted. -+ */ -+VCOS_INLINE_DECL -+VCOS_STATUS_T vcos_event_wait(VCOS_EVENT_T *event); -+ -+/** -+ * Try event, but don't block. -+ * -+ * @param event The event to try -+ * @return VCOS_SUCCESS on success, VCOS_EAGAIN if the event is not currently signalled -+ */ -+VCOS_INLINE_DECL -+VCOS_STATUS_T vcos_event_try(VCOS_EVENT_T *event); -+ -+#endif -+ -+/* -+ * Destroy an event. -+ */ -+VCOS_INLINE_DECL -+void vcos_event_delete(VCOS_EVENT_T *event); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -+ -+ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos.h 2012-07-15 20:29:13.554979584 +0200 -@@ -0,0 +1,212 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom. All rights reserved. -+ * -+ * 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 -+ */ -+ -+/*============================================================================= -+VideoCore OS Abstraction Layer - public header file -+=============================================================================*/ -+ -+/** -+ * \mainpage OS Abstraction Layer -+ * -+ * \section intro Introduction -+ * -+ * This abstraction layer is here to allow the underlying OS to be easily changed (e.g. from -+ * Nucleus to ThreadX) and to aid in porting host applications to new targets. -+ * -+ * \subsection error Error handling -+ * -+ * Wherever possible, VCOS functions assert internally and return void. The only exceptions -+ * are creation functions (which might fail due to lack of resources) and functions that -+ * might timeout or fail due to lack of space. Errors that might be reported by the underlying -+ * OS API (e.g. invalid mutex) are treated as a programming error, and are merely asserted on. -+ * -+ * \section thread_synch Threads and synchronisation -+ * -+ * \subsection thread Threads -+ * -+ * The thread API is somewhat different to that found in Nucleus. In particular, threads -+ * cannot just be destroyed at arbitrary times and nor can they merely exit. This is so -+ * that the same API can be implemented across all interesting platforms without too much -+ * difficulty. See vcos_thread.h for details. Thread attributes are configured via -+ * the VCOS_THREAD_ATTR_T structure, found in vcos_thread_attr.h. -+ * -+ * \subsection sema Semaphores -+ * -+ * Counted semaphores (c.f. Nucleus NU_SEMAPHORE) are created with VCOS_SEMAPHORE_T. -+ * Under ThreadX on VideoCore, semaphores are implemented using VideoCore spinlocks, and -+ * so are quite a lot faster than ordinary ThreadX semaphores. See vcos_semaphore.h. -+ * -+ * \subsection mtx Mutexes -+ * -+ * Mutexes are used for locking. Attempts to take a mutex twice, or to unlock it -+ * in a different thread to the one in which it was locked should be expected to fail. -+ * Mutexes are not re-entrant (see vcos_reentrant_mutex.h for a slightly slower -+ * re-entrant mutex). -+ * -+ * \subsection evflags Event flags -+ * -+ * Event flags (the ThreadX name - also known as event groups under Nucleus) provide -+ * 32 flags which can be waited on by multiple clients, and signalled by multiple clients. -+ * A timeout can be specified. See vcos_event_flags.h. An alternative to this is the -+ * VCOS_EVENT_T (see vcos_event.h) which is akin to the Win32 auto-reset event, or a -+ * saturating counted semaphore. -+ * -+ * \subsection event Events -+ * -+ * A VCOS_EVENT_T is a bit like a saturating semaphore. No matter how many times it -+ * is signalled, the waiter will only wake up once. See vcos_event.h. You might think this -+ * is useful if you suspect that the cost of reading the semaphore count (perhaps via a -+ * system call) is expensive on your platform. -+ * -+ * \subsection tls Thread local storage -+ * -+ * Thread local storage is supported using vcos_tls.h. This is emulated on Nucleus -+ * and ThreadX. -+ * -+ * \section int Interrupts -+ * -+ * The legacy LISR/HISR scheme found in Nucleus is supported via the legacy ISR API, -+ * which is also supported on ThreadX. New code should avoid this, and old code should -+ * be migrated away from it, since it is slow. See vcos_legacy_isr.h. -+ * -+ * Registering an interrupt handler, and disabling/restoring interrupts, is handled -+ * using the functions in vcos_isr.h. -+ * -+ */ -+ -+/** -+ * \file vcos.h -+ * -+ * This is the top level header file. Clients include this. It pulls in the platform-specific -+ * header file (vcos_platform.h) together with header files defining the expected APIs, such -+ * as vcos_mutex.h, vcos_semaphore.h, etc. It is also possible to include these header files -+ * directly. -+ * -+ */ -+ -+#ifndef VCOS_H -+#define VCOS_H -+ -+#include "interface/vcos/vcos_assert.h" -+#include "vcos_types.h" -+#include "vcos_platform.h" -+ -+#ifndef VCOS_INIT_H -+#include "interface/vcos/vcos_init.h" -+#endif -+ -+#ifndef VCOS_SEMAPHORE_H -+#include "interface/vcos/vcos_semaphore.h" -+#endif -+ -+#ifndef VCOS_THREAD_H -+#include "interface/vcos/vcos_thread.h" -+#endif -+ -+#ifndef VCOS_MUTEX_H -+#include "interface/vcos/vcos_mutex.h" -+#endif -+ -+#ifndef VCOS_MEM_H -+#include "interface/vcos/vcos_mem.h" -+#endif -+ -+#ifndef VCOS_LOGGING_H -+#include "interface/vcos/vcos_logging.h" -+#endif -+ -+#ifndef VCOS_STRING_H -+#include "interface/vcos/vcos_string.h" -+#endif -+ -+#ifndef VCOS_EVENT_H -+#include "interface/vcos/vcos_event.h" -+#endif -+ -+#ifndef VCOS_THREAD_ATTR_H -+#include "interface/vcos/vcos_thread_attr.h" -+#endif -+ -+#ifndef VCOS_TLS_H -+#include "interface/vcos/vcos_tls.h" -+#endif -+ -+#ifndef VCOS_REENTRANT_MUTEX_H -+#include "interface/vcos/vcos_reentrant_mutex.h" -+#endif -+ -+#ifndef VCOS_NAMED_SEMAPHORE_H -+#include "interface/vcos/vcos_named_semaphore.h" -+#endif -+ -+#ifndef VCOS_QUICKSLOW_MUTEX_H -+#include "interface/vcos/vcos_quickslow_mutex.h" -+#endif -+ -+/* Headers with predicates */ -+ -+#if VCOS_HAVE_EVENT_FLAGS -+#include "interface/vcos/vcos_event_flags.h" -+#endif -+ -+#if VCOS_HAVE_QUEUE -+#include "interface/vcos/vcos_queue.h" -+#endif -+ -+#if VCOS_HAVE_LEGACY_ISR -+#include "interface/vcos/vcos_legacy_isr.h" -+#endif -+ -+#if VCOS_HAVE_TIMER -+#include "interface/vcos/vcos_timer.h" -+#endif -+ -+#if VCOS_HAVE_MEMPOOL -+#include "interface/vcos/vcos_mempool.h" -+#endif -+ -+#if VCOS_HAVE_ISR -+#include "interface/vcos/vcos_isr.h" -+#endif -+ -+#if VCOS_HAVE_ATOMIC_FLAGS -+#include "interface/vcos/vcos_atomic_flags.h" -+#endif -+ -+#if VCOS_HAVE_ONCE -+#include "interface/vcos/vcos_once.h" -+#endif -+ -+#if VCOS_HAVE_BLOCK_POOL -+#include "interface/vcos/vcos_blockpool.h" -+#endif -+ -+#if VCOS_HAVE_FILE -+#include "interface/vcos/vcos_file.h" -+#endif -+ -+#if VCOS_HAVE_CFG -+#include "interface/vcos/vcos_cfg.h" -+#endif -+ -+#if VCOS_HAVE_CMD -+#include "interface/vcos/vcos_cmd.h" -+#endif -+ -+#endif /* VCOS_H */ -+ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_init.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_init.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_init.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_init.h 2012-07-15 20:29:13.607980580 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_init.h b/drivers/misc/vc04_services/interface/vcos/vcos_init.h +new file mode 100644 +index 0000000..9fc5eca +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_init.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -23934,9 +24783,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_init.h li +} +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_logging.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_logging.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_logging.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_logging.h 2012-07-15 20:29:13.516978868 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_logging.h b/drivers/misc/vc04_services/interface/vcos/vcos_logging.h +new file mode 100644 +index 0000000..9702822 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_logging.h @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24228,9 +25079,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_logging.h +#endif /* VCOS_LOGGING_H */ + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h 2012-07-15 20:29:13.599980430 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h b/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h +new file mode 100644 +index 0000000..9473cec +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_thread.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24350,9 +25203,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_lowlevel_ +#endif +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mem.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mem.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mem.h 2012-07-15 20:29:13.599980430 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_mem.h b/drivers/misc/vc04_services/interface/vcos/vcos_mem.h +new file mode 100644 +index 0000000..af16208 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_mem.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24446,9 +25301,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mem.h lin +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h 2012-07-15 20:29:13.600980449 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h b/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h +new file mode 100644 +index 0000000..f0ef70b +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24618,9 +25475,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_msgqueue. +#endif + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h 2012-07-15 20:29:13.501978585 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h b/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h +new file mode 100644 +index 0000000..14387a8 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24725,9 +25584,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_mutex.h l +} +#endif +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_once.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_once.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_once.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_once.h 2012-07-15 20:29:13.597980392 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_once.h b/drivers/misc/vc04_services/interface/vcos/vcos_once.h +new file mode 100644 +index 0000000..0533c10 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_once.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24782,9 +25643,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_once.h li +#endif +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h 2012-07-15 20:29:13.597980392 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h b/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h +new file mode 100644 +index 0000000..2760dd7 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_semaphore.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24912,9 +25775,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_semaphore +#endif +#endif + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h 2012-07-15 20:29:13.609980618 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h b/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h +new file mode 100644 +index 0000000..3c7669d +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -24950,9 +25815,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdbool.h +#endif /* __cplusplus */ + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h 2012-07-15 20:29:13.600980449 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h b/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h +new file mode 100644 +index 0000000..c9a3e02 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -25157,9 +26024,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_stdint.h +#endif /* VCOS_STDINT_H */ + + -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_string.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_string.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_string.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_string.h 2012-07-15 20:29:13.598980411 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_string.h b/drivers/misc/vc04_services/interface/vcos/vcos_string.h +new file mode 100644 +index 0000000..c3d875f +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_string.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -25245,100 +26114,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_string.h +} +#endif +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h 2012-07-15 20:29:13.554979584 +0200 -@@ -0,0 +1,87 @@ -+/* -+ * Copyright (c) 2010-2011 Broadcom. All rights reserved. -+ * -+ * 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 -+ */ -+ -+/*============================================================================= -+VideoCore OS Abstraction Layer - thread attributes -+=============================================================================*/ -+ -+#ifndef VCOS_THREAD_ATTR_H -+#define VCOS_THREAD_ATTR_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/** -+ * \file -+ * -+ * Attributes for thread creation. -+ * -+ */ -+ -+/** Initialize thread attribute struct. This call does not allocate memory, -+ * and so cannot fail. -+ * -+ */ -+VCOSPRE_ void VCOSPOST_ vcos_thread_attr_init(VCOS_THREAD_ATTR_T *attrs); -+ -+/** Set the stack address and size. If not set, a stack will be allocated automatically. -+ * -+ * This can only be set on some platforms. It will always be possible to set the stack -+ * address on VideoCore, but on host platforms, support may well not be available. -+ */ -+#if VCOS_CAN_SET_STACK_ADDR -+VCOS_INLINE_DECL -+void vcos_thread_attr_setstack(VCOS_THREAD_ATTR_T *attrs, void *addr, VCOS_UNSIGNED sz); -+#endif -+ -+/** Set the stack size. If not set, a default size will be used. Attempting to call this after having -+ * set the stack location with vcos_thread_attr_setstack() will result in undefined behaviour. -+ */ -+VCOS_INLINE_DECL -+void vcos_thread_attr_setstacksize(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED sz); -+ -+/** Set the task priority. If not set, a default value will be used. -+ */ -+VCOS_INLINE_DECL -+void vcos_thread_attr_setpriority(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED pri); -+ -+/** Set the task cpu affinity. If not set, the default will be used. -+ */ -+VCOS_INLINE_DECL -+void vcos_thread_attr_setaffinity(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED aff); -+ -+/** Set the timeslice. If not set the default will be used. -+ */ -+VCOS_INLINE_DECL -+void vcos_thread_attr_settimeslice(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED ts); -+ -+/** The thread entry function takes (argc,argv), as per Nucleus, with -+ * argc being 0. This may be withdrawn in a future release and should not -+ * be used in new code. -+ */ -+VCOS_INLINE_DECL -+void _vcos_thread_attr_setlegacyapi(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED legacy); -+ -+VCOS_INLINE_DECL -+void vcos_thread_attr_setautostart(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED autostart); -+ -+#ifdef __cplusplus -+} -+#endif -+#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread.h 2012-07-15 20:29:13.599980430 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_thread.h b/drivers/misc/vc04_services/interface/vcos/vcos_thread.h +new file mode 100644 +index 0000000..ee34648 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_thread.h @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -25610,9 +26390,104 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_thread.h +} +#endif +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_timer.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_timer.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_timer.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_timer.h 2012-07-15 20:29:13.599980430 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h b/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h +new file mode 100644 +index 0000000..375dd01 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_thread_attr.h +@@ -0,0 +1,87 @@ ++/* ++ * Copyright (c) 2010-2011 Broadcom. All rights reserved. ++ * ++ * 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 ++ */ ++ ++/*============================================================================= ++VideoCore OS Abstraction Layer - thread attributes ++=============================================================================*/ ++ ++#ifndef VCOS_THREAD_ATTR_H ++#define VCOS_THREAD_ATTR_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \file ++ * ++ * Attributes for thread creation. ++ * ++ */ ++ ++/** Initialize thread attribute struct. This call does not allocate memory, ++ * and so cannot fail. ++ * ++ */ ++VCOSPRE_ void VCOSPOST_ vcos_thread_attr_init(VCOS_THREAD_ATTR_T *attrs); ++ ++/** Set the stack address and size. If not set, a stack will be allocated automatically. ++ * ++ * This can only be set on some platforms. It will always be possible to set the stack ++ * address on VideoCore, but on host platforms, support may well not be available. ++ */ ++#if VCOS_CAN_SET_STACK_ADDR ++VCOS_INLINE_DECL ++void vcos_thread_attr_setstack(VCOS_THREAD_ATTR_T *attrs, void *addr, VCOS_UNSIGNED sz); ++#endif ++ ++/** Set the stack size. If not set, a default size will be used. Attempting to call this after having ++ * set the stack location with vcos_thread_attr_setstack() will result in undefined behaviour. ++ */ ++VCOS_INLINE_DECL ++void vcos_thread_attr_setstacksize(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED sz); ++ ++/** Set the task priority. If not set, a default value will be used. ++ */ ++VCOS_INLINE_DECL ++void vcos_thread_attr_setpriority(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED pri); ++ ++/** Set the task cpu affinity. If not set, the default will be used. ++ */ ++VCOS_INLINE_DECL ++void vcos_thread_attr_setaffinity(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED aff); ++ ++/** Set the timeslice. If not set the default will be used. ++ */ ++VCOS_INLINE_DECL ++void vcos_thread_attr_settimeslice(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED ts); ++ ++/** The thread entry function takes (argc,argv), as per Nucleus, with ++ * argc being 0. This may be withdrawn in a future release and should not ++ * be used in new code. ++ */ ++VCOS_INLINE_DECL ++void _vcos_thread_attr_setlegacyapi(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED legacy); ++ ++VCOS_INLINE_DECL ++void vcos_thread_attr_setautostart(VCOS_THREAD_ATTR_T *attrs, VCOS_UNSIGNED autostart); ++ ++#ifdef __cplusplus ++} ++#endif ++#endif +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_timer.h b/drivers/misc/vc04_services/interface/vcos/vcos_timer.h +new file mode 100644 +index 0000000..1612334 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_timer.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -25720,9 +26595,11 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_timer.h l +} +#endif +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_types.h linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_types.h ---- linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_types.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_types.h 2012-07-15 20:29:13.497978511 +0200 +diff --git a/drivers/misc/vc04_services/interface/vcos/vcos_types.h b/drivers/misc/vc04_services/interface/vcos/vcos_types.h +new file mode 100644 +index 0000000..25de671 +--- /dev/null ++++ b/drivers/misc/vc04_services/interface/vcos/vcos_types.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2010-2011 Broadcom. All rights reserved. @@ -25935,46 +26812,24 @@ diff -Naur linux-3.2.23/drivers/misc/vc04_services/interface/vcos/vcos_types.h l +typedef vcos_fourcc_t FOURCC_T; + +#endif -diff -Naur linux-3.2.23/drivers/misc/vc04_services/Kconfig linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/Kconfig ---- linux-3.2.23/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/Kconfig 2012-07-15 20:29:13.762983497 +0200 -@@ -0,0 +1,7 @@ -+config BCM2708_VCHIQ -+ tristate "Videocore VCHIQ" -+ depends on MACH_BCM2708 -+ default y -+ help -+ Helper for communication for VideoCore. -+ -diff -Naur linux-3.2.23/drivers/misc/vc04_services/Makefile linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/Makefile ---- linux-3.2.23/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/misc/vc04_services/Makefile 2012-07-15 20:29:13.762983497 +0200 -@@ -0,0 +1,21 @@ -+obj-$(CONFIG_BCM2708_VCHIQ) += vchiq.o -+ -+vchiq-objs := \ -+ interface/vchiq_arm/vchiq_core.o \ -+ interface/vchiq_arm/vchiq_shim.o \ -+ interface/vchiq_arm/vchiq_util.o \ -+ interface/vchiq_arm/vchiq_arm.o \ -+ interface/vchiq_arm/vchiq_kern_lib.o \ -+ interface/vchiq_arm/vchiq_2835_arm.o \ -+ interface/vcos/linuxkernel/vcos_linuxkernel.o \ -+ interface/vcos/linuxkernel/vcos_thread_map.o \ -+ interface/vcos/linuxkernel/vcos_linuxkernel_cfg.o \ -+ interface/vcos/generic/vcos_generic_event_flags.o \ -+ interface/vcos/generic/vcos_logcat.o \ -+ interface/vcos/generic/vcos_mem_from_malloc.o \ -+ interface/vcos/generic/vcos_cmd.o -+ -+EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000 -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -+ -+ -+ -diff -Naur linux-3.2.23/drivers/mmc/core/core.c linux-rpi-bootc-3.2.23/drivers/mmc/core/core.c ---- linux-3.2.23/drivers/mmc/core/core.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/core/core.c 2012-07-15 20:29:21.657132039 +0200 -@@ -514,10 +514,14 @@ +diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c +index 34416d4..13cde4a 100644 +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -1075,7 +1075,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, + brq->data.blocks = 1; + } + +- if (brq->data.blocks > 1 || do_rel_wr) { ++ if (brq->data.blocks > 1 || do_rel_wr || card->host->caps2 & MMC_CAP2_FORCE_MULTIBLOCK) { + /* SPI multiblock writes terminate using a special + * token, not a STOP_TRANSMISSION request. + */ +diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c +index 411a994..ad08933 100644 +--- a/drivers/mmc/core/core.c ++++ b/drivers/mmc/core/core.c +@@ -514,10 +514,14 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) if (data->flags & MMC_DATA_WRITE) /* @@ -25992,9 +26847,78 @@ diff -Naur linux-3.2.23/drivers/mmc/core/core.c linux-rpi-bootc-3.2.23/drivers/m else limit_us = 100000; -diff -Naur linux-3.2.23/drivers/mmc/host/bcm2708_mci.c linux-rpi-bootc-3.2.23/drivers/mmc/host/bcm2708_mci.c ---- linux-3.2.23/drivers/mmc/host/bcm2708_mci.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/bcm2708_mci.c 2012-07-15 20:29:21.578130550 +0200 +diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig +index cf444b0..f8feea6 100644 +--- a/drivers/mmc/host/Kconfig ++++ b/drivers/mmc/host/Kconfig +@@ -229,6 +229,27 @@ config MMC_SDHCI_S3C_DMA + + YMMV. + ++config MMC_SDHCI_BCM2708 ++ tristate "SDHCI support on BCM2708" ++ depends on MMC_SDHCI && MACH_BCM2708 ++ select MMC_SDHCI_IO_ACCESSORS ++ help ++ This selects the Secure Digital Host Controller Interface (SDHCI) ++ often referrered to as the eMMC block. ++ ++ If you have a controller with this interface, say Y or M here. ++ ++ If unsure, say N. ++ ++config MMC_SDHCI_BCM2708_DMA ++ bool "DMA support on BCM2708 Arasan controller" ++ depends on MMC_SDHCI_BCM2708 && EXPERIMENTAL ++ help ++ Enable DMA support on the Arasan SDHCI controller in Broadcom 2708 ++ based chips. ++ ++ If unsure, say N. ++ + config MMC_OMAP + tristate "TI OMAP Multimedia Card Interface support" + depends on ARCH_OMAP +@@ -296,6 +317,14 @@ config MMC_ATMELMCI + If unsure, say N. + + endchoice ++config MMC_BCM2708 ++ tristate "BCM2708 Multimedia Card Interface support" ++ help ++ This selects the BCM2708 Multimedia Card Interface driver. If ++ you have a BCM2708 platform with a Multimedia Card ++ slot, say Y or M here. ++ ++ If unsure, say N. + + config MMC_ATMELMCI_DMA + bool "Atmel MCI DMA support" +diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile +index b4b83f3..eeb683c 100644 +--- a/drivers/mmc/host/Makefile ++++ b/drivers/mmc/host/Makefile +@@ -13,6 +13,7 @@ obj-$(CONFIG_MMC_SDHCI_PXAV3) += sdhci-pxav3.o + obj-$(CONFIG_MMC_SDHCI_PXAV2) += sdhci-pxav2.o + obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o + obj-$(CONFIG_MMC_SDHCI_SPEAR) += sdhci-spear.o ++obj-$(CONFIG_MMC_SDHCI_BCM2708) += sdhci-bcm2708.o + obj-$(CONFIG_MMC_WBSD) += wbsd.o + obj-$(CONFIG_MMC_AU1X) += au1xmmc.o + obj-$(CONFIG_MMC_OMAP) += omap.o +@@ -36,6 +37,7 @@ tmio_mmc_core-$(subst m,y,$(CONFIG_MMC_SDHI)) += tmio_mmc_dma.o + obj-$(CONFIG_MMC_SDHI) += sh_mobile_sdhi.o + obj-$(CONFIG_MMC_CB710) += cb710-mmc.o + obj-$(CONFIG_MMC_VIA_SDMMC) += via-sdmmc.o ++obj-$(CONFIG_MMC_BCM2708) += bcm2708_mci.o + obj-$(CONFIG_SDH_BFIN) += bfin_sdh.o + obj-$(CONFIG_MMC_DW) += dw_mmc.o + obj-$(CONFIG_MMC_SH_MMCIF) += sh_mmcif.o +diff --git a/drivers/mmc/host/bcm2708_mci.c b/drivers/mmc/host/bcm2708_mci.c +new file mode 100644 +index 0000000..3c7de96 +--- /dev/null ++++ b/drivers/mmc/host/bcm2708_mci.c @@ -0,0 +1,889 @@ +/* + * linux/drivers/mmc/host/bcm2708_mci.c - Broadcom BCM2708 MCI driver @@ -26885,9 +27809,11 @@ diff -Naur linux-3.2.23/drivers/mmc/host/bcm2708_mci.c linux-rpi-bootc-3.2.23/dr +MODULE_DESCRIPTION("BCM2708 Multimedia Card Interface driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm2708_mci"); -diff -Naur linux-3.2.23/drivers/mmc/host/bcm2708_mci.h linux-rpi-bootc-3.2.23/drivers/mmc/host/bcm2708_mci.h ---- linux-3.2.23/drivers/mmc/host/bcm2708_mci.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/bcm2708_mci.h 2012-07-15 20:29:21.556130136 +0200 +diff --git a/drivers/mmc/host/bcm2708_mci.h b/drivers/mmc/host/bcm2708_mci.h +new file mode 100644 +index 0000000..b2851d9 +--- /dev/null ++++ b/drivers/mmc/host/bcm2708_mci.h @@ -0,0 +1,101 @@ +/* + * linux/drivers/mmc/host/bcm2708_mci.c - Broadcom BCM2708 MCI driver @@ -26990,75 +27916,12 @@ diff -Naur linux-3.2.23/drivers/mmc/host/bcm2708_mci.h linux-rpi-bootc-3.2.23/dr + kunmap_atomic(buffer, KM_BIO_SRC_IRQ); +// local_irq_restore(*flags); +} -diff -Naur linux-3.2.23/drivers/mmc/host/Kconfig linux-rpi-bootc-3.2.23/drivers/mmc/host/Kconfig ---- linux-3.2.23/drivers/mmc/host/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/Kconfig 2012-07-15 20:29:21.572130435 +0200 -@@ -229,6 +229,27 @@ - - YMMV. - -+config MMC_SDHCI_BCM2708 -+ tristate "SDHCI support on BCM2708" -+ depends on MMC_SDHCI && MACH_BCM2708 -+ select MMC_SDHCI_IO_ACCESSORS -+ help -+ This selects the Secure Digital Host Controller Interface (SDHCI) -+ often referrered to as the eMMC block. -+ -+ If you have a controller with this interface, say Y or M here. -+ -+ If unsure, say N. -+ -+config MMC_SDHCI_BCM2708_DMA -+ bool "DMA support on BCM2708 Arasan controller" -+ depends on MMC_SDHCI_BCM2708 && EXPERIMENTAL -+ help -+ Enable DMA support on the Arasan SDHCI controller in Broadcom 2708 -+ based chips. -+ -+ If unsure, say N. -+ - config MMC_OMAP - tristate "TI OMAP Multimedia Card Interface support" - depends on ARCH_OMAP -@@ -296,6 +317,14 @@ - If unsure, say N. - - endchoice -+config MMC_BCM2708 -+ tristate "BCM2708 Multimedia Card Interface support" -+ help -+ This selects the BCM2708 Multimedia Card Interface driver. If -+ you have a BCM2708 platform with a Multimedia Card -+ slot, say Y or M here. -+ -+ If unsure, say N. - - config MMC_ATMELMCI_DMA - bool "Atmel MCI DMA support" -diff -Naur linux-3.2.23/drivers/mmc/host/Makefile linux-rpi-bootc-3.2.23/drivers/mmc/host/Makefile ---- linux-3.2.23/drivers/mmc/host/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/Makefile 2012-07-15 20:29:21.525129552 +0200 -@@ -13,6 +13,7 @@ - obj-$(CONFIG_MMC_SDHCI_PXAV2) += sdhci-pxav2.o - obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o - obj-$(CONFIG_MMC_SDHCI_SPEAR) += sdhci-spear.o -+obj-$(CONFIG_MMC_SDHCI_BCM2708) += sdhci-bcm2708.o - obj-$(CONFIG_MMC_WBSD) += wbsd.o - obj-$(CONFIG_MMC_AU1X) += au1xmmc.o - obj-$(CONFIG_MMC_OMAP) += omap.o -@@ -36,6 +37,7 @@ - obj-$(CONFIG_MMC_SDHI) += sh_mobile_sdhi.o - obj-$(CONFIG_MMC_CB710) += cb710-mmc.o - obj-$(CONFIG_MMC_VIA_SDMMC) += via-sdmmc.o -+obj-$(CONFIG_MMC_BCM2708) += bcm2708_mci.o - obj-$(CONFIG_SDH_BFIN) += bfin_sdh.o - obj-$(CONFIG_MMC_DW) += dw_mmc.o - obj-$(CONFIG_MMC_SH_MMCIF) += sh_mmcif.o -diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci-bcm2708.c ---- linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci-bcm2708.c 2012-07-15 20:29:21.576130512 +0200 -@@ -0,0 +1,1477 @@ +diff --git a/drivers/mmc/host/sdhci-bcm2708.c b/drivers/mmc/host/sdhci-bcm2708.c +new file mode 100644 +index 0000000..2703103 +--- /dev/null ++++ b/drivers/mmc/host/sdhci-bcm2708.c +@@ -0,0 +1,1532 @@ +/* + * sdhci-bcm2708.c Support for SDHCI device on BCM2708 + * Copyright (c) 2010 Broadcom @@ -27087,7 +27950,9 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ +#include +#include +#include ++#include +#include ++#include + +#include +#include @@ -27111,7 +27976,6 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ +#undef CONFIG_MMC_SDHCI_BCM2708_DMA +#define CONFIG_MMC_SDHCI_BCM2708_DMA y + -+#define USE_SYNC_AFTER_DMA +#ifdef CONFIG_MMC_SDHCI_BCM2708_DMA +/* #define CHECK_DMA_USE */ +#endif @@ -27139,6 +28003,8 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ +#define POWER_LAZY_OFF 1 +#define POWER_ON 2 + ++#define REG_EXRDFIFO_EN 0x80 ++#define REG_EXRDFIFO_CFG 0x84 + +/*****************************************************************************\ + * * @@ -27196,6 +28062,9 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + +static bool allow_highspeed = 1; +static int emmc_clock_freq = BCM2708_EMMC_CLOCK_FREQ; ++static bool sync_after_dma = 1; ++static bool missing_status = 1; ++bool enable_llm = 1; + +#if 0 +static void hptime_test(void) @@ -27292,7 +28161,12 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + +static void sdhci_bcm2708_raw_writel(struct sdhci_host *host, u32 val, int reg) +{ ++ u32 ier; ++ +#if USE_SPACED_WRITES_2CLK ++ static bool timeout_disabled = false; ++ unsigned int ns_2clk = 0; ++ + /* The Arasan has a bugette whereby it may lose the content of + * successive writes to registers that are within two SD-card clock + * cycles of each other (a clock domain crossing problem). @@ -27304,7 +28178,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + /* host->clock is the clock freq in Hz */ + static hptime_t last_write_hpt; + hptime_t now = hptime(); -+ unsigned int ns_2clk = 2000000000/host->clock; ++ ns_2clk = 2000000000/host->clock; + + if (now == last_write_hpt || now == last_write_hpt+1) { + /* we can't guarantee any significant time has @@ -27320,6 +28194,27 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + } + last_write_hpt = now; + } ++#if USE_SOFTWARE_TIMEOUTS ++ /* The Arasan is clocked for timeouts using the SD clock which is too ++ * fast for ERASE commands and causes issues. So we disable timeouts ++ * for ERASE */ ++ if (host->cmd != NULL && host->cmd->opcode == MMC_ERASE && ++ reg == (SDHCI_COMMAND & ~3)) { ++ mod_timer(&host->timer, ++ jiffies + SOFTWARE_ERASE_TIMEOUT_SEC * HZ); ++ ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE); ++ ier &= ~SDHCI_INT_DATA_TIMEOUT; ++ writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE); ++ timeout_disabled = true; ++ ndelay(ns_2clk); ++ } else if (timeout_disabled) { ++ ier = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE); ++ ier |= SDHCI_INT_DATA_TIMEOUT; ++ writel(ier, host->ioaddr + SDHCI_SIGNAL_ENABLE); ++ timeout_disabled = false; ++ ndelay(ns_2clk); ++ } ++#endif + writel(val, host->ioaddr + reg); +#else + void __iomem * regaddr = host->ioaddr + reg; @@ -27682,11 +28577,11 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ +sdhci_bcm2708_platdma_reset(struct sdhci_host *host, struct mmc_data *data) +{ + struct sdhci_bcm2708_priv *host_priv = SDHCI_HOST_PRIV(host); -+ unsigned long flags; ++// unsigned long flags; + + BUG_ON(NULL == host); + -+ spin_lock_irqsave(&host->lock, flags); ++// spin_lock_irqsave(&host->lock, flags); + + if (host_priv->dma_wanted) { + if (NULL == data) { @@ -27766,7 +28661,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ +#endif + } + -+ spin_unlock_irqrestore(&host->lock, flags); ++// spin_unlock_irqrestore(&host->lock, flags); +} + + @@ -27779,11 +28674,11 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + int sg_len; + int sg_ix; + int sg_todo; -+ unsigned long flags; ++// unsigned long flags; + + BUG_ON(NULL == host); + -+ spin_lock_irqsave(&host->lock, flags); ++// spin_lock_irqsave(&host->lock, flags); + data = host->data; + +#ifdef CHECK_DMA_USE @@ -27808,7 +28703,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + + if (NULL == data) { + DBG("PDMA unused completion - status 0x%X\n", dma_cs); -+ spin_unlock_irqrestore(&host->lock, flags); ++// spin_unlock_irqrestore(&host->lock, flags); + return; + } + sg = data->sg; @@ -27865,34 +28760,34 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + SDHCI_INT_SPACE_AVAIL); + } + } else { -+#ifdef USE_SYNC_AFTER_DMA -+ /* On the Arasan controller the stop command (which will be -+ scheduled after this completes) does not seem to work -+ properly if we allow it to be issued when we are -+ transferring data to/from the SD card. -+ We get CRC and DEND errors unless we wait for -+ the SD controller to finish reading/writing to the card. */ -+ u32 state_mask; -+ int timeout=5000; ++ if (sync_after_dma) { ++ /* On the Arasan controller the stop command (which will be ++ scheduled after this completes) does not seem to work ++ properly if we allow it to be issued when we are ++ transferring data to/from the SD card. ++ We get CRC and DEND errors unless we wait for ++ the SD controller to finish reading/writing to the card. */ ++ u32 state_mask; ++ int timeout=30*5000; + -+ DBG("PDMA over - sync card\n"); -+ if (data->flags & MMC_DATA_READ) -+ state_mask = SDHCI_DOING_READ; -+ else -+ state_mask = SDHCI_DOING_WRITE; ++ DBG("PDMA over - sync card\n"); ++ if (data->flags & MMC_DATA_READ) ++ state_mask = SDHCI_DOING_READ; ++ else ++ state_mask = SDHCI_DOING_WRITE; + -+ while (0 != (sdhci_bcm2708_raw_readl(host, SDHCI_PRESENT_STATE) -+ & state_mask) && --timeout > 0) -+ { -+ udelay(30); -+ continue; ++ while (0 != (sdhci_bcm2708_raw_readl(host, SDHCI_PRESENT_STATE) ++ & state_mask) && --timeout > 0) ++ { ++ udelay(1); ++ continue; ++ } ++ if (timeout <= 0) ++ printk(KERN_ERR"%s: final %s to SD card still " ++ "running\n", ++ mmc_hostname(host->mmc), ++ data->flags & MMC_DATA_READ? "read": "write"); + } -+ if (timeout <= 0) -+ printk(KERN_ERR"%s: final %s to SD card still " -+ "running\n", -+ mmc_hostname(host->mmc), -+ data->flags & MMC_DATA_READ? "read": "write"); -+#endif + if (host_priv->complete) { + (*host_priv->complete)(host); + DBG("PDMA %s complete\n", @@ -27901,7 +28796,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + SDHCI_INT_SPACE_AVAIL); + } + } -+ spin_unlock_irqrestore(&host->lock, flags); ++// spin_unlock_irqrestore(&host->lock, flags); +} + +static irqreturn_t sdhci_bcm2708_dma_irq(int irq, void *dev_id) @@ -27910,12 +28805,11 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + struct sdhci_host *host = dev_id; + struct sdhci_bcm2708_priv *host_priv = SDHCI_HOST_PRIV(host); + u32 dma_cs; /* control and status register */ -+ unsigned long flags; + + BUG_ON(NULL == dev_id); + BUG_ON(NULL == host_priv->dma_chan_base); + -+ spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock(host); + + dma_cs = readl(host_priv->dma_chan_base + BCM2708_DMA_CS); + @@ -27956,8 +28850,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + + result = IRQ_HANDLED; + } -+ -+ spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock(host); + + return result; +} @@ -28000,10 +28893,12 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + int on = simple_strtol(buf, NULL, 0); + if (on) { + host->flags |= SDHCI_USE_PLATDMA; ++ sdhci_bcm2708_writel(host, 1, REG_EXRDFIFO_EN); + printk(KERN_INFO "%s: DMA enabled\n", + mmc_hostname(host->mmc)); + } else { + host->flags &= ~(SDHCI_USE_PLATDMA | SDHCI_REQ_USE_DMA); ++ sdhci_bcm2708_writel(host, 0, REG_EXRDFIFO_EN); + printk(KERN_INFO "%s: DMA disabled\n", + mmc_hostname(host->mmc)); + } @@ -28300,7 +29195,6 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + .spurious_crc_acmd51 = sdhci_bcm2708_quirk_spurious_crc, + .voltage_broken = sdhci_bcm2708_quirk_voltage_broken, + .uhs_broken = sdhci_bcm2708_uhs_broken, -+ .missing_status = sdhci_bcm2708_missing_status, +}; + +/*****************************************************************************\ @@ -28339,16 +29233,24 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + ret = PTR_ERR(host); + goto err; + } ++ if (missing_status) { ++ sdhci_bcm2708_ops.missing_status = sdhci_bcm2708_missing_status; ++ } ++ ++ printk("sdhci: %s low-latency mode\n",enable_llm?"Enable":"Disable"); + + host->hw_name = "BCM2708_Arasan"; + host->ops = &sdhci_bcm2708_ops; + host->irq = platform_get_irq(pdev, 0); ++ host->second_irq = 0; + + host->quirks = SDHCI_QUIRK_BROKEN_CARD_DETECTION | + SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | + SDHCI_QUIRK_BROKEN_TIMEOUT_VAL | + SDHCI_QUIRK_MISSING_CAPS | -+ SDHCI_QUIRK_NO_HISPD_BIT; ++ SDHCI_QUIRK_NO_HISPD_BIT | ++ (sync_after_dma ? 0:SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12); ++ + +#ifdef CONFIG_MMC_SDHCI_BCM2708_DMA + host->flags = SDHCI_USE_PLATDMA; @@ -28406,12 +29308,13 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + } + host_priv->dma_chan = ret; + -+ ret = request_irq(host_priv->dma_irq, sdhci_bcm2708_dma_irq, -+ IRQF_SHARED, DRIVER_NAME " (dma)", host); ++ ret = request_irq(host_priv->dma_irq, sdhci_bcm2708_dma_irq,0,//IRQF_SHARED, ++ DRIVER_NAME " (dma)", host); + if (ret) { + dev_err(&pdev->dev, "cannot set DMA IRQ\n"); + goto err_add_dma_irq; + } ++ host->second_irq = host_priv->dma_irq; + DBG("DMA CBs %p handle %08X DMA%d %p DMA IRQ %d\n", + host_priv->cb_base, (unsigned)host_priv->cb_handle, + host_priv->dma_chan, host_priv->dma_chan_base, @@ -28419,6 +29322,9 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + + if (allow_highspeed) + host->mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; ++ ++ /* single block writes cause data loss with some SD cards! */ ++ host->mmc->caps2 |= MMC_CAP2_FORCE_MULTIBLOCK; +#endif + + ret = sdhci_add_host(host); @@ -28430,6 +29336,12 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + ret = device_create_file(&pdev->dev, &dev_attr_dma_wait); + ret = device_create_file(&pdev->dev, &dev_attr_status); + ++#ifdef CONFIG_MMC_SDHCI_BCM2708_DMA ++ /* enable extension fifo for paced DMA transfers */ ++ sdhci_bcm2708_writel(host, 1, REG_EXRDFIFO_EN); ++ sdhci_bcm2708_writel(host, 4, REG_EXRDFIFO_CFG); ++#endif ++ + printk(KERN_INFO "%s: BCM2708 SDHC host at 0x%08llx DMA %d IRQ %d\n", + mmc_hostname(host->mmc), (unsigned long long)iomem->start, + host_priv->dma_chan, host_priv->dma_irq); @@ -28526,6 +29438,9 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + +module_param(allow_highspeed, bool, 0444); +module_param(emmc_clock_freq, int, 0444); ++module_param(sync_after_dma, bool, 0444); ++module_param(missing_status, bool, 0444); ++module_param(enable_llm, bool, 0444); + +MODULE_DESCRIPTION("Secure Digital Host Controller Interface platform driver"); +MODULE_AUTHOR("Broadcom "); @@ -28534,11 +29449,15 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci-bcm2708.c linux-rpi-bootc-3.2.23/ + +MODULE_PARM_DESC(allow_highspeed, "Allow high speed transfers modes"); +MODULE_PARM_DESC(emmc_clock_freq, "Specify the speed of emmc clock"); ++MODULE_PARM_DESC(sync_after_dma, "Block in driver until dma complete"); ++MODULE_PARM_DESC(missing_status, "Use the missing status quirk"); ++MODULE_PARM_DESC(enable_llm, "Enable low-latency mode"); + + -diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci.c ---- linux-3.2.23/drivers/mmc/host/sdhci.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci.c 2012-07-15 20:29:21.558130173 +0200 +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 6ce32a7..0562295 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c @@ -27,6 +27,7 @@ #include @@ -28547,7 +29466,127 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ #include "sdhci.h" -@@ -296,7 +297,7 @@ +@@ -120,6 +121,91 @@ static void sdhci_dumpregs(struct sdhci_host *host) + * Low level functions * + * * + \*****************************************************************************/ ++extern bool enable_llm; ++static int sdhci_locked=0; ++void sdhci_spin_lock(struct sdhci_host *host) ++{ ++ spin_lock(&host->lock); ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ disable_irq_nosync(host->irq); ++ if(host->second_irq) ++ disable_irq_nosync(host->second_irq); ++ local_irq_enable(); ++ } ++#endif ++} ++ ++void sdhci_spin_unlock(struct sdhci_host *host) ++{ ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ local_irq_disable(); ++ enable_irq(host->irq); ++ if(host->second_irq) ++ enable_irq(host->second_irq); ++ } ++#endif ++ spin_unlock(&host->lock); ++} ++ ++void sdhci_spin_lock_irqsave(struct sdhci_host *host,unsigned long *flags) ++{ ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ while(sdhci_locked) ++ { ++ preempt_schedule(); ++ } ++ spin_lock_irqsave(&host->lock,*flags); ++ disable_irq(host->irq); ++ if(host->second_irq) ++ disable_irq(host->second_irq); ++ local_irq_enable(); ++ } ++ else ++#endif ++ spin_lock_irqsave(&host->lock,*flags); ++} ++ ++void sdhci_spin_unlock_irqrestore(struct sdhci_host *host,unsigned long flags) ++{ ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ local_irq_disable(); ++ enable_irq(host->irq); ++ if(host->second_irq) ++ enable_irq(host->second_irq); ++ } ++#endif ++ spin_unlock_irqrestore(&host->lock,flags); ++} ++ ++static void sdhci_spin_enable_schedule(struct sdhci_host *host) ++{ ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ sdhci_locked = 1; ++ preempt_enable(); ++ } ++#endif ++} ++ ++static void sdhci_spin_disable_schedule(struct sdhci_host *host) ++{ ++#ifdef CONFIG_PREEMPT ++ if(enable_llm) ++ { ++ preempt_disable(); ++ sdhci_locked = 0; ++ } ++#endif ++} + + static void sdhci_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set) + { +@@ -206,7 +292,9 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask) + return; + } + timeout--; ++ sdhci_spin_enable_schedule(host); + mdelay(1); ++ sdhci_spin_disable_schedule(host); + } + + if (host->ops->platform_reset_exit) +@@ -269,7 +357,7 @@ static void sdhci_led_control(struct led_classdev *led, + struct sdhci_host *host = container_of(led, struct sdhci_host, led); + unsigned long flags; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + if (host->runtime_suspended) + goto out; +@@ -279,7 +367,7 @@ static void sdhci_led_control(struct led_classdev *led, + else + sdhci_activate_led(host); + out: +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + #endif + +@@ -296,7 +384,7 @@ static void sdhci_read_block_pio(struct sdhci_host *host) u32 uninitialized_var(scratch); u8 *buf; @@ -28556,7 +29595,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ blksize = host->data->blksz; chunk = 0; -@@ -341,7 +342,7 @@ +@@ -341,7 +429,7 @@ static void sdhci_write_block_pio(struct sdhci_host *host) u32 scratch; u8 *buf; @@ -28565,7 +29604,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ blksize = host->data->blksz; chunk = 0; -@@ -380,19 +381,28 @@ +@@ -380,19 +468,28 @@ static void sdhci_write_block_pio(struct sdhci_host *host) local_irq_restore(flags); } @@ -28597,7 +29636,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ /* * Some controllers (JMicron JMB38x) mess up the buffer bits -@@ -403,7 +413,7 @@ +@@ -403,7 +500,7 @@ static void sdhci_transfer_pio(struct sdhci_host *host) (host->data->blocks == 1)) mask = ~0; @@ -28606,7 +29645,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ if (host->quirks & SDHCI_QUIRK_PIO_NEEDS_DELAY) udelay(100); -@@ -415,9 +425,11 @@ +@@ -415,9 +512,11 @@ static void sdhci_transfer_pio(struct sdhci_host *host) host->blocks--; if (host->blocks == 0) break; @@ -28619,7 +29658,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ } static char *sdhci_kmap_atomic(struct scatterlist *sg, unsigned long *flags) -@@ -690,7 +702,9 @@ +@@ -690,7 +789,9 @@ static void sdhci_set_transfer_irqs(struct sdhci_host *host) u32 pio_irqs = SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL; u32 dma_irqs = SDHCI_INT_DMA_END | SDHCI_INT_ADMA_ERROR; @@ -28630,7 +29669,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ sdhci_clear_set_irqs(host, pio_irqs, dma_irqs); else sdhci_clear_set_irqs(host, dma_irqs, pio_irqs); -@@ -722,44 +736,25 @@ +@@ -722,44 +823,25 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) host->data_early = 0; host->data->bytes_xfered = 0; @@ -28683,7 +29722,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ int broken, i; struct scatterlist *sg; -@@ -818,7 +813,8 @@ +@@ -818,7 +900,8 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) */ WARN_ON(1); host->flags &= ~SDHCI_REQ_USE_DMA; @@ -28693,7 +29732,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ WARN_ON(sg_cnt != 1); sdhci_writel(host, sg_dma_address(data->sg), SDHCI_DMA_ADDRESS); -@@ -834,11 +830,13 @@ +@@ -834,11 +917,13 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) if (host->version >= SDHCI_SPEC_200) { ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); ctrl &= ~SDHCI_CTRL_DMA_MASK; @@ -28712,7 +29751,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); } -@@ -890,7 +888,8 @@ +@@ -890,7 +975,8 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, if (data->flags & MMC_DATA_READ) mode |= SDHCI_TRNS_READ; @@ -28722,7 +29761,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ mode |= SDHCI_TRNS_DMA; sdhci_writew(host, mode, SDHCI_TRANSFER_MODE); -@@ -906,13 +905,16 @@ +@@ -906,13 +992,16 @@ static void sdhci_finish_data(struct sdhci_host *host) host->data = NULL; if (host->flags & SDHCI_REQ_USE_DMA) { @@ -28743,7 +29782,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ } /* -@@ -965,6 +967,12 @@ +@@ -965,6 +1054,12 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY)) mask |= SDHCI_DATA_INHIBIT; @@ -28756,9 +29795,13 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ /* We shouldn't wait for data inihibit for stop commands, even though they might use busy signaling */ if (host->mrq->data && (cmd == host->mrq->data->stop)) -@@ -982,10 +990,16 @@ +@@ -980,12 +1075,20 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) + return; + } timeout--; ++ sdhci_spin_enable_schedule(host); mdelay(1); ++ sdhci_spin_disable_schedule(host); } + DBG("send cmd %d - wait 0x%X irq 0x%x\n", cmd->opcode, mask, + sdhci_readl(host, SDHCI_INT_STATUS)); @@ -28773,7 +29816,17 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ sdhci_prepare_data(host, cmd); -@@ -1218,6 +1232,35 @@ +@@ -1150,7 +1253,9 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) + return; + } + timeout--; ++ sdhci_spin_enable_schedule(host); + mdelay(1); ++ sdhci_spin_disable_schedule(host); + } + + clk |= SDHCI_CLOCK_CARD_EN; +@@ -1218,6 +1323,35 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power) mdelay(10); } @@ -28809,15 +29862,47 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ /*****************************************************************************\ * * * MMC callbacks * -@@ -1298,6 +1341,7 @@ +@@ -1234,7 +1368,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) + + sdhci_runtime_pm_get(host); + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + WARN_ON(host->mrq != NULL); + +@@ -1276,9 +1410,9 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) + */ + if ((host->flags & SDHCI_NEEDS_RETUNING) && + !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + sdhci_execute_tuning(mmc); +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + /* Restore original mmc_request structure */ + host->mrq = mrq; +@@ -1291,15 +1425,16 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) + } + + mmiowb(); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) { unsigned long flags; u8 ctrl; + int rc; - spin_lock_irqsave(&host->lock, flags); +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); -@@ -1356,7 +1400,7 @@ + if (host->flags & SDHCI_DEVICE_DEAD) + goto out; +@@ -1356,7 +1491,7 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) else ctrl &= ~SDHCI_CTRL_HISPD; @@ -28826,10 +29911,22 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ u16 clk, ctrl_2; unsigned int clock; -@@ -1445,6 +1489,12 @@ +@@ -1364,7 +1499,8 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) + if ((ios->timing == MMC_TIMING_UHS_SDR50) || + (ios->timing == MMC_TIMING_UHS_SDR104) || + (ios->timing == MMC_TIMING_UHS_DDR50) || +- (ios->timing == MMC_TIMING_UHS_SDR25)) ++ (ios->timing == MMC_TIMING_UHS_SDR25) || ++ (ios->timing == MMC_TIMING_UHS_SDR12)) + ctrl |= SDHCI_CTRL_HISPD; + + ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); +@@ -1444,7 +1580,13 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) + out: mmiowb(); - spin_unlock_irqrestore(&host->lock, flags); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + if (ios->power_mode == MMC_POWER_OFF) { + do @@ -28839,7 +29936,55 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ } static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) -@@ -1888,6 +1938,8 @@ +@@ -1461,7 +1603,7 @@ static int sdhci_check_ro(struct sdhci_host *host) + unsigned long flags; + int is_readonly; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + if (host->flags & SDHCI_DEVICE_DEAD) + is_readonly = 0; +@@ -1471,7 +1613,7 @@ static int sdhci_check_ro(struct sdhci_host *host) + is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE) + & SDHCI_WRITE_PROTECT); + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + /* This quirk needs to be replaced by a callback-function later */ + return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ? +@@ -1544,9 +1686,9 @@ static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable) + struct sdhci_host *host = mmc_priv(mmc); + unsigned long flags; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + sdhci_enable_sdio_irq_nolock(host, enable); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host, +@@ -1849,7 +1991,7 @@ static void sdhci_do_enable_preset_value(struct sdhci_host *host, bool enable) + if (host->version < SDHCI_SPEC_300) + return; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); + +@@ -1867,7 +2009,7 @@ static void sdhci_do_enable_preset_value(struct sdhci_host *host, bool enable) + host->flags &= ~SDHCI_PV_ENABLED; + } + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable) +@@ -1888,6 +2030,8 @@ static const struct mmc_host_ops sdhci_ops = { .start_signal_voltage_switch = sdhci_start_signal_voltage_switch, .execute_tuning = sdhci_execute_tuning, .enable_preset_value = sdhci_enable_preset_value, @@ -28848,7 +29993,56 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ }; /*****************************************************************************\ -@@ -2000,7 +2052,7 @@ +@@ -1903,7 +2047,7 @@ static void sdhci_tasklet_card(unsigned long param) + + host = (struct sdhci_host*)param; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + /* Check host->mrq first in case we are runtime suspended */ + if (host->mrq && +@@ -1920,7 +2064,7 @@ static void sdhci_tasklet_card(unsigned long param) + tasklet_schedule(&host->finish_tasklet); + } + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + mmc_detect_change(host->mmc, msecs_to_jiffies(200)); + } +@@ -1933,14 +2077,14 @@ static void sdhci_tasklet_finish(unsigned long param) + + host = (struct sdhci_host*)param; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + /* + * If this tasklet gets rescheduled while running, it will + * be run again afterwards but without any active request. + */ + if (!host->mrq) { +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + return; + } + +@@ -1983,7 +2127,7 @@ static void sdhci_tasklet_finish(unsigned long param) + #endif + + mmiowb(); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + mmc_request_done(host->mmc, mrq); + sdhci_runtime_pm_put(host); +@@ -1996,11 +2140,11 @@ static void sdhci_timeout_timer(unsigned long data) + + host = (struct sdhci_host*)data; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); if (host->mrq) { pr_err("%s: Timeout waiting for hardware " @@ -28857,7 +30051,30 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ sdhci_dumpregs(host); if (host->data) { -@@ -2045,10 +2097,13 @@ +@@ -2017,7 +2161,7 @@ static void sdhci_timeout_timer(unsigned long data) + } + + mmiowb(); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + static void sdhci_tuning_timer(unsigned long data) +@@ -2027,11 +2171,11 @@ static void sdhci_tuning_timer(unsigned long data) + + host = (struct sdhci_host *)data; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + host->flags |= SDHCI_NEEDS_RETUNING; + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + /*****************************************************************************\ +@@ -2045,10 +2189,13 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask) BUG_ON(intmask == 0); if (!host->cmd) { @@ -28875,7 +30092,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ return; } -@@ -2118,6 +2173,19 @@ +@@ -2118,6 +2265,19 @@ static void sdhci_show_adma_error(struct sdhci_host *host) static void sdhci_show_adma_error(struct sdhci_host *host) { } #endif @@ -28895,7 +30112,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) { BUG_ON(intmask == 0); -@@ -2144,34 +2212,57 @@ +@@ -2144,34 +2304,57 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) return; } } @@ -28968,7 +30185,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ /* * We currently don't do anything fancy with DMA -@@ -2200,18 +2291,8 @@ +@@ -2200,18 +2383,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS); } @@ -28989,7 +30206,20 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ } } -@@ -2266,6 +2347,22 @@ +@@ -2222,10 +2395,10 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) + u32 intmask; + int cardint = 0; + +- spin_lock(&host->lock); ++ sdhci_spin_lock(host); + + if (host->runtime_suspended) { +- spin_unlock(&host->lock); ++ sdhci_spin_unlock(host); + pr_warning("%s: got irq while runtime suspended\n", + mmc_hostname(host->mmc)); + return IRQ_HANDLED; +@@ -2266,6 +2439,22 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) tasklet_schedule(&host->card_tasklet); } @@ -29012,7 +30242,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ if (intmask & SDHCI_INT_CMD_MASK) { sdhci_writel(host, intmask & SDHCI_INT_CMD_MASK, SDHCI_INT_STATUS); -@@ -2280,7 +2377,13 @@ +@@ -2280,7 +2469,13 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK); @@ -29027,7 +30257,16 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ if (intmask & SDHCI_INT_BUS_POWER) { pr_err("%s: Card is consuming too much power!\n", -@@ -2363,7 +2466,8 @@ +@@ -2307,7 +2502,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) + + mmiowb(); + out: +- spin_unlock(&host->lock); ++ sdhci_spin_unlock(host); + + /* + * We have to delay this as it calls back into the driver. +@@ -2363,7 +2558,8 @@ int sdhci_resume_host(struct sdhci_host *host) return ret; } @@ -29037,7 +30276,45 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ if (host->ops->enable_dma) host->ops->enable_dma(host); } -@@ -2570,14 +2674,16 @@ +@@ -2426,15 +2622,15 @@ int sdhci_runtime_suspend_host(struct sdhci_host *host) + host->flags &= ~SDHCI_NEEDS_RETUNING; + } + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK); +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + synchronize_irq(host->irq); + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + host->runtime_suspended = true; +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + return ret; + } +@@ -2466,7 +2662,7 @@ int sdhci_runtime_resume_host(struct sdhci_host *host) + (host->tuning_mode == SDHCI_TUNING_MODE_1)) + host->flags |= SDHCI_NEEDS_RETUNING; + +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + host->runtime_suspended = false; + +@@ -2477,7 +2673,7 @@ int sdhci_runtime_resume_host(struct sdhci_host *host) + /* Enable Card Detection */ + sdhci_enable_card_detection(host); + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + + return ret; + } +@@ -2570,14 +2766,16 @@ int sdhci_add_host(struct sdhci_host *host) host->flags &= ~SDHCI_USE_ADMA; } @@ -29056,7 +30333,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ } } } -@@ -2688,7 +2794,7 @@ +@@ -2688,7 +2886,7 @@ int sdhci_add_host(struct sdhci_host *host) /* Auto-CMD23 stuff only works in ADMA or PIO. */ if ((host->version >= SDHCI_SPEC_300) && ((host->flags & SDHCI_USE_ADMA) || @@ -29065,12 +30342,12 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ host->flags |= SDHCI_AUTO_CMD23; DBG("%s: Auto-CMD23 available\n", mmc_hostname(mmc)); } else { -@@ -2821,6 +2927,12 @@ +@@ -2821,6 +3019,12 @@ int sdhci_add_host(struct sdhci_host *host) mmc->caps |= MMC_CAP_MAX_CURRENT_200; } + if(host->ops->voltage_broken) { -+ ocr_avail |= MMC_VDD_29_30 | MMC_VDD_30_31; ++ ocr_avail |= MMC_VDD_32_33 | MMC_VDD_33_34; + // Cannot support UHS modes is we are stuck at 3.3V; + mmc->caps &= ~(MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_DDR50); + } @@ -29078,7 +30355,16 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ mmc->ocr_avail = ocr_avail; mmc->ocr_avail_sdio = ocr_avail; if (host->ocr_avail_sdio) -@@ -2953,6 +3065,7 @@ +@@ -2915,7 +3119,7 @@ int sdhci_add_host(struct sdhci_host *host) + host->tuning_timer.function = sdhci_tuning_timer; + } + +- ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED, ++ ret = request_irq(host->irq, sdhci_irq, 0,//IRQF_SHARED, + mmc_hostname(mmc), host); + if (ret) + goto untasklet; +@@ -2953,6 +3157,7 @@ int sdhci_add_host(struct sdhci_host *host) pr_info("%s: SDHCI controller on %s [%s] using %s\n", mmc_hostname(mmc), host->hw_name, dev_name(mmc_dev(mmc)), @@ -29086,10 +30372,29 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.c linux-rpi-bootc-3.2.23/drivers/ (host->flags & SDHCI_USE_ADMA) ? "ADMA" : (host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); -diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.h linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci.h ---- linux-3.2.23/drivers/mmc/host/sdhci.h 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/mmc/host/sdhci.h 2012-07-15 20:29:21.559130191 +0200 -@@ -273,6 +273,25 @@ +@@ -2979,7 +3184,7 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) + unsigned long flags; + + if (dead) { +- spin_lock_irqsave(&host->lock, flags); ++ sdhci_spin_lock_irqsave(host, &flags); + + host->flags |= SDHCI_DEVICE_DEAD; + +@@ -2991,7 +3196,7 @@ void sdhci_remove_host(struct sdhci_host *host, int dead) + tasklet_schedule(&host->finish_tasklet); + } + +- spin_unlock_irqrestore(&host->lock, flags); ++ sdhci_spin_unlock_irqrestore(host, flags); + } + + sdhci_disable_card_detection(host); +diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h +index a04d4d0..c08882b 100644 +--- a/drivers/mmc/host/sdhci.h ++++ b/drivers/mmc/host/sdhci.h +@@ -273,6 +273,25 @@ struct sdhci_ops { void (*platform_reset_enter)(struct sdhci_host *host, u8 mask); void (*platform_reset_exit)(struct sdhci_host *host, u8 mask); int (*set_uhs_signaling)(struct sdhci_host *host, unsigned int uhs); @@ -29115,7 +30420,7 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.h linux-rpi-bootc-3.2.23/drivers/ void (*hw_reset)(struct sdhci_host *host); }; -@@ -379,6 +398,29 @@ +@@ -379,9 +398,38 @@ extern int sdhci_resume_host(struct sdhci_host *host); extern void sdhci_enable_irq_wakeups(struct sdhci_host *host); #endif @@ -29145,9 +30450,19 @@ diff -Naur linux-3.2.23/drivers/mmc/host/sdhci.h linux-rpi-bootc-3.2.23/drivers/ #ifdef CONFIG_PM_RUNTIME extern int sdhci_runtime_suspend_host(struct sdhci_host *host); extern int sdhci_runtime_resume_host(struct sdhci_host *host); -diff -Naur linux-3.2.23/drivers/net/usb/smsc95xx.c linux-rpi-bootc-3.2.23/drivers/net/usb/smsc95xx.c ---- linux-3.2.23/drivers/net/usb/smsc95xx.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/net/usb/smsc95xx.c 2012-07-15 20:29:39.445466746 +0200 + #endif + ++extern void sdhci_spin_lock_irqsave(struct sdhci_host *host,unsigned long *flags); ++extern void sdhci_spin_unlock_irqrestore(struct sdhci_host *host,unsigned long flags); ++extern void sdhci_spin_lock(struct sdhci_host *host); ++extern void sdhci_spin_unlock(struct sdhci_host *host); ++ ++ + #endif /* __SDHCI_HW_H */ +diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c +index 55b3218..5d2fec2 100644 +--- a/drivers/net/usb/smsc95xx.c ++++ b/drivers/net/usb/smsc95xx.c @@ -46,6 +46,7 @@ #define SMSC95XX_INTERNAL_PHY_ID (1) #define SMSC95XX_TX_OVERHEAD (8) @@ -29156,7 +30471,7 @@ diff -Naur linux-3.2.23/drivers/net/usb/smsc95xx.c linux-rpi-bootc-3.2.23/driver struct smsc95xx_priv { u32 mac_cr; -@@ -63,6 +64,10 @@ +@@ -63,6 +64,10 @@ static int turbo_mode = true; module_param(turbo_mode, bool, 0644); MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); @@ -29167,7 +30482,7 @@ diff -Naur linux-3.2.23/drivers/net/usb/smsc95xx.c linux-rpi-bootc-3.2.23/driver static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data) { u32 *buf = kmalloc(4, GFP_KERNEL); -@@ -600,8 +605,59 @@ +@@ -600,8 +605,59 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); } @@ -29227,7 +30542,7 @@ diff -Naur linux-3.2.23/drivers/net/usb/smsc95xx.c linux-rpi-bootc-3.2.23/driver /* try reading mac address from EEPROM */ if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, dev->net->dev_addr) == 0) { -@@ -1016,6 +1072,7 @@ +@@ -1016,6 +1072,7 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) dev->net->ethtool_ops = &smsc95xx_ethtool_ops; dev->net->flags |= IFF_MULTICAST; dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM; @@ -29235,10 +30550,506 @@ diff -Naur linux-3.2.23/drivers/net/usb/smsc95xx.c linux-rpi-bootc-3.2.23/driver return 0; } -diff -Naur linux-3.2.23/drivers/spi/Kconfig linux-rpi-bootc-3.2.23/drivers/spi/Kconfig ---- linux-3.2.23/drivers/spi/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/spi/Kconfig 2012-07-15 20:29:50.559675875 +0200 -@@ -74,6 +74,14 @@ +diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig +index abd3b71..f561d69 100644 +diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile +index 0a304b0..a042951 100644 +diff --git a/drivers/net/wireless/rtl8192cu/Kconfig b/drivers/net/wireless/rtl8192cu/Kconfig +new file mode 100755 +index 0000000..bee5ed6 +diff --git a/drivers/net/wireless/rtl8192cu/Makefile b/drivers/net/wireless/rtl8192cu/Makefile +new file mode 100755 +index 0000000..1b4e841 +diff --git a/drivers/net/wireless/rtl8192cu/clean b/drivers/net/wireless/rtl8192cu/clean +new file mode 100755 +index 0000000..34686a0 +\ No newline at end of file +diff --git a/drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c b/drivers/net/wireless/rtl8192cu/core/efuse/rtw_efuse.c +new file mode 100755 +index 0000000..4908d6e +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c b/drivers/net/wireless/rtl8192cu/core/rtw_br_ext.c +new file mode 100755 +index 0000000..1fcdf1e +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_cmd.c b/drivers/net/wireless/rtl8192cu/core/rtw_cmd.c +new file mode 100755 +index 0000000..513e8ab +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_debug.c b/drivers/net/wireless/rtl8192cu/core/rtw_debug.c +new file mode 100755 +index 0000000..96e5bd1 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c b/drivers/net/wireless/rtl8192cu/core/rtw_eeprom.c +new file mode 100755 +index 0000000..4a0832b +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c b/drivers/net/wireless/rtl8192cu/core/rtw_ieee80211.c +new file mode 100755 +index 0000000..2b85af9 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_io.c b/drivers/net/wireless/rtl8192cu/core/rtw_io.c +new file mode 100755 +index 0000000..2efe719 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_query.c +new file mode 100755 +index 0000000..156640c +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_rtl.c +new file mode 100755 +index 0000000..87348a2 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c b/drivers/net/wireless/rtl8192cu/core/rtw_ioctl_set.c +new file mode 100755 +index 0000000..946d875 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_iol.c b/drivers/net/wireless/rtl8192cu/core/rtw_iol.c +new file mode 100755 +index 0000000..ce3d1a9 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_mlme.c b/drivers/net/wireless/rtl8192cu/core/rtw_mlme.c +new file mode 100755 +index 0000000..647d67a +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8192cu/core/rtw_mlme_ext.c +new file mode 100755 +index 0000000..7aaf136 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_mp.c b/drivers/net/wireless/rtl8192cu/core/rtw_mp.c +new file mode 100755 +index 0000000..0cdc094 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c b/drivers/net/wireless/rtl8192cu/core/rtw_mp_ioctl.c +new file mode 100755 +index 0000000..a851568 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_p2p.c b/drivers/net/wireless/rtl8192cu/core/rtw_p2p.c +new file mode 100755 +index 0000000..bdfcdf1 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8192cu/core/rtw_pwrctrl.c +new file mode 100755 +index 0000000..92b3cb8 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_recv.c b/drivers/net/wireless/rtl8192cu/core/rtw_recv.c +new file mode 100755 +index 0000000..0d5143b +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_rf.c b/drivers/net/wireless/rtl8192cu/core/rtw_rf.c +new file mode 100755 +index 0000000..665c7e5 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_security.c b/drivers/net/wireless/rtl8192cu/core/rtw_security.c +new file mode 100755 +index 0000000..58601b6 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8192cu/core/rtw_sta_mgt.c +new file mode 100755 +index 0000000..70b25c9 +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8192cu/core/rtw_wlan_util.c +new file mode 100755 +index 0000000..539b74f +diff --git a/drivers/net/wireless/rtl8192cu/core/rtw_xmit.c b/drivers/net/wireless/rtl8192cu/core/rtw_xmit.c +new file mode 100755 +index 0000000..178a5b7 +diff --git a/drivers/net/wireless/rtl8192cu/hal/hal_init.c b/drivers/net/wireless/rtl8192cu/hal/hal_init.c +new file mode 100755 +index 0000000..edef678 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_cmd.c +new file mode 100755 +index 0000000..6c53f89 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_dm.c +new file mode 100755 +index 0000000..1adeae2 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_hal_init.c +new file mode 100755 +index 0000000..e3e2ae9 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_mp.c +new file mode 100755 +index 0000000..28a8cc3 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_phycfg.c +new file mode 100755 +index 0000000..d8394df +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rf6052.c +new file mode 100755 +index 0000000..d17c23f +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_rxdesc.c +new file mode 100755 +index 0000000..5aa6e61 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/rtl8192c_sreset.c +new file mode 100755 +index 0000000..3f9adb5 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg.c +new file mode 100755 +index 0000000..23969fc +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/Hal8192CUHWImg_wowlan.c +new file mode 100755 +index 0000000..27a31ce +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_led.c +new file mode 100755 +index 0000000..6665648 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_recv.c +new file mode 100755 +index 0000000..4285d60 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/rtl8192cu_xmit.c +new file mode 100755 +index 0000000..c276b51 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_halinit.c +new file mode 100755 +index 0000000..47be445 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_ce.c +new file mode 100755 +index 0000000..4d01b3c +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_linux.c +new file mode 100755 +index 0000000..d6f3376 +diff --git a/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c b/drivers/net/wireless/rtl8192cu/hal/rtl8192c/usb/usb_ops_xp.c +new file mode 100755 +index 0000000..82adeff +diff --git a/drivers/net/wireless/rtl8192cu/ifcfg-wlan0 b/drivers/net/wireless/rtl8192cu/ifcfg-wlan0 +new file mode 100755 +index 0000000..20dcbec +\ No newline at end of file +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192CEHWImg.h +new file mode 100755 +index 0000000..e7c6869 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyCfg.h +new file mode 100755 +index 0000000..2e76d2a +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192CPhyReg.h +new file mode 100755 +index 0000000..5f2d451 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg.h +new file mode 100755 +index 0000000..2aced69 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h b/drivers/net/wireless/rtl8192cu/include/Hal8192CUHWImg_wowlan.h +new file mode 100755 +index 0000000..ec52f45 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DEHWImg.h +new file mode 100755 +index 0000000..d99403c +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DETestHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DETestHWImg.h +new file mode 100755 +index 0000000..0cb96e5 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyCfg.h +new file mode 100755 +index 0000000..8e14417 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DPhyReg.h +new file mode 100755 +index 0000000..bff455f +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg.h +new file mode 100755 +index 0000000..f43e9d1 +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DUHWImg_wowlan.h +new file mode 100755 +index 0000000..75aafee +diff --git a/drivers/net/wireless/rtl8192cu/include/Hal8192DUTestHWImg.h b/drivers/net/wireless/rtl8192cu/include/Hal8192DUTestHWImg.h +new file mode 100755 +index 0000000..3ce7a3d +diff --git a/drivers/net/wireless/rtl8192cu/include/autoconf.h b/drivers/net/wireless/rtl8192cu/include/autoconf.h +new file mode 100755 +index 0000000..4a50f8b +diff --git a/drivers/net/wireless/rtl8192cu/include/basic_types.h b/drivers/net/wireless/rtl8192cu/include/basic_types.h +new file mode 100755 +index 0000000..f880224 +diff --git a/drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h b/drivers/net/wireless/rtl8192cu/include/byteorder/big_endian.h +new file mode 100755 +index 0000000..eca68a6 +diff --git a/drivers/net/wireless/rtl8192cu/include/byteorder/generic.h b/drivers/net/wireless/rtl8192cu/include/byteorder/generic.h +new file mode 100755 +index 0000000..246ba89 +diff --git a/drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h b/drivers/net/wireless/rtl8192cu/include/byteorder/little_endian.h +new file mode 100755 +index 0000000..433045e +diff --git a/drivers/net/wireless/rtl8192cu/include/byteorder/swab.h b/drivers/net/wireless/rtl8192cu/include/byteorder/swab.h +new file mode 100755 +index 0000000..117c84d +diff --git a/drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h b/drivers/net/wireless/rtl8192cu/include/byteorder/swabb.h +new file mode 100755 +index 0000000..1735349 +diff --git a/drivers/net/wireless/rtl8192cu/include/circ_buf.h b/drivers/net/wireless/rtl8192cu/include/circ_buf.h +new file mode 100755 +index 0000000..1bd4704 +diff --git a/drivers/net/wireless/rtl8192cu/include/cmd_osdep.h b/drivers/net/wireless/rtl8192cu/include/cmd_osdep.h +new file mode 100755 +index 0000000..077efa7 +diff --git a/drivers/net/wireless/rtl8192cu/include/drv_conf.h b/drivers/net/wireless/rtl8192cu/include/drv_conf.h +new file mode 100755 +index 0000000..a2b6cc4 +diff --git a/drivers/net/wireless/rtl8192cu/include/drv_types.h b/drivers/net/wireless/rtl8192cu/include/drv_types.h +new file mode 100755 +index 0000000..95e20cc +diff --git a/drivers/net/wireless/rtl8192cu/include/drv_types_ce.h b/drivers/net/wireless/rtl8192cu/include/drv_types_ce.h +new file mode 100755 +index 0000000..be0459d +diff --git a/drivers/net/wireless/rtl8192cu/include/drv_types_linux.h b/drivers/net/wireless/rtl8192cu/include/drv_types_linux.h +new file mode 100755 +index 0000000..db1c585 +diff --git a/drivers/net/wireless/rtl8192cu/include/drv_types_xp.h b/drivers/net/wireless/rtl8192cu/include/drv_types_xp.h +new file mode 100755 +index 0000000..2d51b1d +diff --git a/drivers/net/wireless/rtl8192cu/include/ethernet.h b/drivers/net/wireless/rtl8192cu/include/ethernet.h +new file mode 100755 +index 0000000..36e29c0 +diff --git a/drivers/net/wireless/rtl8192cu/include/farray.h b/drivers/net/wireless/rtl8192cu/include/farray.h +new file mode 100755 +index 0000000..79d2a42 +diff --git a/drivers/net/wireless/rtl8192cu/include/h2clbk.h b/drivers/net/wireless/rtl8192cu/include/h2clbk.h +new file mode 100755 +index 0000000..359c9e7 +diff --git a/drivers/net/wireless/rtl8192cu/include/hal_init.h b/drivers/net/wireless/rtl8192cu/include/hal_init.h +new file mode 100755 +index 0000000..ec48f83 +diff --git a/drivers/net/wireless/rtl8192cu/include/ieee80211.h b/drivers/net/wireless/rtl8192cu/include/ieee80211.h +new file mode 100755 +index 0000000..5c17a28 +diff --git a/drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h b/drivers/net/wireless/rtl8192cu/include/ieee80211_ext.h +new file mode 100755 +index 0000000..0a966fa +diff --git a/drivers/net/wireless/rtl8192cu/include/if_ether.h b/drivers/net/wireless/rtl8192cu/include/if_ether.h +new file mode 100755 +index 0000000..045c067 +diff --git a/drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h b/drivers/net/wireless/rtl8192cu/include/ioctl_cfg80211.h +new file mode 100755 +index 0000000..823e4a1 +diff --git a/drivers/net/wireless/rtl8192cu/include/ip.h b/drivers/net/wireless/rtl8192cu/include/ip.h +new file mode 100755 +index 0000000..5846347 +diff --git a/drivers/net/wireless/rtl8192cu/include/mlme_osdep.h b/drivers/net/wireless/rtl8192cu/include/mlme_osdep.h +new file mode 100755 +index 0000000..1583053 +diff --git a/drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h b/drivers/net/wireless/rtl8192cu/include/mp_custom_oid.h +new file mode 100755 +index 0000000..5f86738 +diff --git a/drivers/net/wireless/rtl8192cu/include/nic_spec.h b/drivers/net/wireless/rtl8192cu/include/nic_spec.h +new file mode 100755 +index 0000000..18e7b2c +diff --git a/drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h b/drivers/net/wireless/rtl8192cu/include/osdep_ce_service.h +new file mode 100755 +index 0000000..5f7c3e6 +diff --git a/drivers/net/wireless/rtl8192cu/include/osdep_intf.h b/drivers/net/wireless/rtl8192cu/include/osdep_intf.h +new file mode 100755 +index 0000000..86b3f1f +diff --git a/drivers/net/wireless/rtl8192cu/include/osdep_service.h b/drivers/net/wireless/rtl8192cu/include/osdep_service.h +new file mode 100755 +index 0000000..2802187 +diff --git a/drivers/net/wireless/rtl8192cu/include/pci_hal.h b/drivers/net/wireless/rtl8192cu/include/pci_hal.h +new file mode 100755 +index 0000000..1ee0ee2 +diff --git a/drivers/net/wireless/rtl8192cu/include/pci_ops.h b/drivers/net/wireless/rtl8192cu/include/pci_ops.h +new file mode 100755 +index 0000000..dd63f5f +diff --git a/drivers/net/wireless/rtl8192cu/include/pci_osintf.h b/drivers/net/wireless/rtl8192cu/include/pci_osintf.h +new file mode 100755 +index 0000000..09715af +diff --git a/drivers/net/wireless/rtl8192cu/include/recv_osdep.h b/drivers/net/wireless/rtl8192cu/include/recv_osdep.h +new file mode 100755 +index 0000000..536ed31 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_cmd.h +new file mode 100755 +index 0000000..57ecadf +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_dm.h +new file mode 100755 +index 0000000..a13b5ff +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_event.h +new file mode 100755 +index 0000000..a43f99f +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_hal.h +new file mode 100755 +index 0000000..cddd998 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_led.h +new file mode 100755 +index 0000000..4ddd9c8 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_recv.h +new file mode 100755 +index 0000000..70a6d10 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_rf.h +new file mode 100755 +index 0000000..76c8a78 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_spec.h +new file mode 100755 +index 0000000..1e97b01 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_sreset.h +new file mode 100755 +index 0000000..bd521c4 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h b/drivers/net/wireless/rtl8192cu/include/rtl8192c_xmit.h +new file mode 100755 +index 0000000..f4428af +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_cmd.h +new file mode 100755 +index 0000000..f07a2bd +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_dm.h +new file mode 100755 +index 0000000..994d3e5 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_hal.h +new file mode 100755 +index 0000000..52be16b +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_led.h +new file mode 100755 +index 0000000..95e20ac +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_recv.h +new file mode 100755 +index 0000000..f7b62bd +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_rf.h +new file mode 100755 +index 0000000..eea18b9 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_spec.h +new file mode 100755 +index 0000000..2d05559 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h b/drivers/net/wireless/rtl8192cu/include/rtl8192d_xmit.h +new file mode 100755 +index 0000000..2b1580f +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_android.h b/drivers/net/wireless/rtl8192cu/include/rtw_android.h +new file mode 100755 +index 0000000..e1a0432 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h b/drivers/net/wireless/rtl8192cu/include/rtw_br_ext.h +new file mode 100755 +index 0000000..9da3fdd +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h b/drivers/net/wireless/rtl8192cu/include/rtw_byteorder.h +new file mode 100755 +index 0000000..1313a25 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_cmd.h b/drivers/net/wireless/rtl8192cu/include/rtw_cmd.h +new file mode 100755 +index 0000000..0556d0b +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_debug.h b/drivers/net/wireless/rtl8192cu/include/rtw_debug.h +new file mode 100755 +index 0000000..7dc750b +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h b/drivers/net/wireless/rtl8192cu/include/rtw_eeprom.h +new file mode 100755 +index 0000000..9d31998 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_efuse.h b/drivers/net/wireless/rtl8192cu/include/rtw_efuse.h +new file mode 100755 +index 0000000..66be910 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_event.h b/drivers/net/wireless/rtl8192cu/include/rtw_event.h +new file mode 100755 +index 0000000..dd9f097 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_ht.h b/drivers/net/wireless/rtl8192cu/include/rtw_ht.h +new file mode 100755 +index 0000000..4dcad2b +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_io.h b/drivers/net/wireless/rtl8192cu/include/rtw_io.h +new file mode 100755 +index 0000000..b1f57c1 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl.h +new file mode 100755 +index 0000000..e6d34f0 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_query.h +new file mode 100755 +index 0000000..e9ad16f1 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_rtl.h +new file mode 100755 +index 0000000..1ea8f21 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h b/drivers/net/wireless/rtl8192cu/include/rtw_ioctl_set.h +new file mode 100755 +index 0000000..577af51 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_iol.h b/drivers/net/wireless/rtl8192cu/include/rtw_iol.h +new file mode 100755 +index 0000000..2750eb3 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_led.h b/drivers/net/wireless/rtl8192cu/include/rtw_led.h +new file mode 100755 +index 0000000..bef37df +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_mlme.h b/drivers/net/wireless/rtl8192cu/include/rtw_mlme.h +new file mode 100755 +index 0000000..05af290 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8192cu/include/rtw_mlme_ext.h +new file mode 100755 +index 0000000..d9a203f +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_mp.h b/drivers/net/wireless/rtl8192cu/include/rtw_mp.h +new file mode 100755 +index 0000000..a468714 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h b/drivers/net/wireless/rtl8192cu/include/rtw_mp_ioctl.h +new file mode 100755 +index 0000000..e16df40 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h b/drivers/net/wireless/rtl8192cu/include/rtw_mp_phy_regdef.h +new file mode 100755 +index 0000000..4906005 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_p2p.h b/drivers/net/wireless/rtl8192cu/include/rtw_p2p.h +new file mode 100755 +index 0000000..02edc6d +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h b/drivers/net/wireless/rtl8192cu/include/rtw_pwrctrl.h +new file mode 100755 +index 0000000..2b00beb +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_qos.h b/drivers/net/wireless/rtl8192cu/include/rtw_qos.h +new file mode 100755 +index 0000000..e35b77f +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_recv.h b/drivers/net/wireless/rtl8192cu/include/rtw_recv.h +new file mode 100755 +index 0000000..4208108 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_rf.h b/drivers/net/wireless/rtl8192cu/include/rtw_rf.h +new file mode 100755 +index 0000000..7414c1b6 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_security.h b/drivers/net/wireless/rtl8192cu/include/rtw_security.h +new file mode 100755 +index 0000000..02ef9b0 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_version.h b/drivers/net/wireless/rtl8192cu/include/rtw_version.h +new file mode 100644 +index 0000000..1a26560 +diff --git a/drivers/net/wireless/rtl8192cu/include/rtw_xmit.h b/drivers/net/wireless/rtl8192cu/include/rtw_xmit.h +new file mode 100755 +index 0000000..ef0c262 +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_hal.h b/drivers/net/wireless/rtl8192cu/include/sdio_hal.h +new file mode 100755 +index 0000000..51139bb +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_ops.h b/drivers/net/wireless/rtl8192cu/include/sdio_ops.h +new file mode 100755 +index 0000000..b1e9b63 +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_ops_ce.h b/drivers/net/wireless/rtl8192cu/include/sdio_ops_ce.h +new file mode 100755 +index 0000000..6b0c1a2 +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_ops_linux.h b/drivers/net/wireless/rtl8192cu/include/sdio_ops_linux.h +new file mode 100755 +index 0000000..c58ab08 +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_ops_xp.h b/drivers/net/wireless/rtl8192cu/include/sdio_ops_xp.h +new file mode 100755 +index 0000000..3569611 +diff --git a/drivers/net/wireless/rtl8192cu/include/sdio_osintf.h b/drivers/net/wireless/rtl8192cu/include/sdio_osintf.h +new file mode 100755 +index 0000000..099262b +diff --git a/drivers/net/wireless/rtl8192cu/include/sta_info.h b/drivers/net/wireless/rtl8192cu/include/sta_info.h +new file mode 100755 +index 0000000..8f01f21 +diff --git a/drivers/net/wireless/rtl8192cu/include/usb_hal.h b/drivers/net/wireless/rtl8192cu/include/usb_hal.h +new file mode 100755 +index 0000000..9cd21f3 +diff --git a/drivers/net/wireless/rtl8192cu/include/usb_ops.h b/drivers/net/wireless/rtl8192cu/include/usb_ops.h +new file mode 100755 +index 0000000..3868bc0 +diff --git a/drivers/net/wireless/rtl8192cu/include/usb_osintf.h b/drivers/net/wireless/rtl8192cu/include/usb_osintf.h +new file mode 100755 +index 0000000..8642aa2 +diff --git a/drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h b/drivers/net/wireless/rtl8192cu/include/usb_vendor_req.h +new file mode 100755 +index 0000000..72864de +diff --git a/drivers/net/wireless/rtl8192cu/include/wifi.h b/drivers/net/wireless/rtl8192cu/include/wifi.h +new file mode 100755 +index 0000000..5ae1275 +diff --git a/drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h b/drivers/net/wireless/rtl8192cu/include/wlan_bssdef.h +new file mode 100755 +index 0000000..fe555c6 +diff --git a/drivers/net/wireless/rtl8192cu/include/xmit_osdep.h b/drivers/net/wireless/rtl8192cu/include/xmit_osdep.h +new file mode 100755 +index 0000000..7d28d43 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_cfg80211.c +new file mode 100755 +index 0000000..b58e5c0 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/ioctl_linux.c +new file mode 100755 +index 0000000..7330160 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/mlme_linux.c +new file mode 100755 +index 0000000..0175ea2 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/os_intfs.c +new file mode 100755 +index 0000000..61e4120 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/pci_intf.c +new file mode 100755 +index 0000000..0848297 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/recv_linux.c +new file mode 100755 +index 0000000..4a76c3f +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/rtw_android.c +new file mode 100755 +index 0000000..aceaaa7 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/sdio_intf.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/sdio_intf.c +new file mode 100755 +index 0000000..52faefc +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/usb_intf.c +new file mode 100755 +index 0000000..942ea08 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c b/drivers/net/wireless/rtl8192cu/os_dep/linux/xmit_linux.c +new file mode 100755 +index 0000000..02eec93 +diff --git a/drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c b/drivers/net/wireless/rtl8192cu/os_dep/osdep_service.c +new file mode 100755 +index 0000000..6e11379 +diff --git a/drivers/net/wireless/rtl8192cu/wlan0dhcp b/drivers/net/wireless/rtl8192cu/wlan0dhcp +new file mode 100755 +index 0000000..6043382 +diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig +index 7587796..4153631 100644 +--- a/drivers/spi/Kconfig ++++ b/drivers/spi/Kconfig +@@ -74,6 +74,14 @@ config SPI_ATMEL This selects a driver for the Atmel SPI Controller, present on many AT32 (AVR32) and AT91 (ARM) chips. @@ -29253,10 +31064,11 @@ diff -Naur linux-3.2.23/drivers/spi/Kconfig linux-rpi-bootc-3.2.23/drivers/spi/K config SPI_BFIN tristate "SPI controller driver for ADI Blackfin5xx" depends on BLACKFIN -diff -Naur linux-3.2.23/drivers/spi/Makefile linux-rpi-bootc-3.2.23/drivers/spi/Makefile ---- linux-3.2.23/drivers/spi/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/spi/Makefile 2012-07-15 20:29:50.511674973 +0200 -@@ -14,6 +14,7 @@ +diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile +index 61c3261..2ff2985 100644 +--- a/drivers/spi/Makefile ++++ b/drivers/spi/Makefile +@@ -14,6 +14,7 @@ obj-$(CONFIG_SPI_ALTERA) += spi-altera.o obj-$(CONFIG_SPI_ATMEL) += spi-atmel.o obj-$(CONFIG_SPI_ATH79) += spi-ath79.o obj-$(CONFIG_SPI_AU1550) += spi-au1550.o @@ -29264,10 +31076,12 @@ diff -Naur linux-3.2.23/drivers/spi/Makefile linux-rpi-bootc-3.2.23/drivers/spi/ obj-$(CONFIG_SPI_BFIN) += spi-bfin5xx.o obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o -diff -Naur linux-3.2.23/drivers/spi/spi-bcm2708.c linux-rpi-bootc-3.2.23/drivers/spi/spi-bcm2708.c ---- linux-3.2.23/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/spi/spi-bcm2708.c 2012-07-15 20:29:50.590676460 +0200 -@@ -0,0 +1,579 @@ +diff --git a/drivers/spi/spi-bcm2708.c b/drivers/spi/spi-bcm2708.c +new file mode 100644 +index 0000000..ef8fef0 +--- /dev/null ++++ b/drivers/spi/spi-bcm2708.c +@@ -0,0 +1,594 @@ +/* + * Driver for Broadcom BCM2708 SPI Controllers + * @@ -29841,16 +31655,44 @@ diff -Naur linux-3.2.23/drivers/spi/spi-bcm2708.c linux-rpi-bootc-3.2.23/drivers + .probe = bcm2708_spi_probe, + .remove = __devexit_p(bcm2708_spi_remove), +}; -+module_platform_driver(bcm2708_spi_driver); ++ ++ ++static int __init bcm2708_spi_init(void) ++{ ++ return platform_driver_probe(&bcm2708_spi_driver, bcm2708_spi_probe); ++} ++module_init(bcm2708_spi_init); ++ ++static void __exit bcm2708_spi_exit(void) ++{ ++ platform_driver_unregister(&bcm2708_spi_driver); ++} ++module_exit(bcm2708_spi_exit); ++ ++ ++//module_platform_driver(bcm2708_spi_driver); + +MODULE_DESCRIPTION("SPI controller driver for Broadcom BCM2708"); +MODULE_AUTHOR("Chris Boot "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Naur linux-3.2.23/drivers/usb/core/generic.c linux-rpi-bootc-3.2.23/drivers/usb/core/generic.c ---- linux-3.2.23/drivers/usb/core/generic.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/core/generic.c 2012-07-15 20:29:20.586111884 +0200 -@@ -149,6 +149,7 @@ +diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile +index 75eca76..a6b7e41 100644 +--- a/drivers/usb/Makefile ++++ b/drivers/usb/Makefile +@@ -23,6 +23,7 @@ obj-$(CONFIG_USB_U132_HCD) += host/ + obj-$(CONFIG_USB_R8A66597_HCD) += host/ + obj-$(CONFIG_USB_HWA_HCD) += host/ + obj-$(CONFIG_USB_ISP1760_HCD) += host/ ++obj-$(CONFIG_USB_DWCOTG) += host/ + obj-$(CONFIG_USB_IMX21_HCD) += host/ + obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ + +diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c +index 69ecd3c..0431b4e 100644 +--- a/drivers/usb/core/generic.c ++++ b/drivers/usb/core/generic.c +@@ -149,6 +149,7 @@ int usb_choose_configuration(struct usb_device *udev) dev_warn(&udev->dev, "no configuration chosen from %d choice%s\n", num_configs, plural(num_configs)); @@ -29858,10 +31700,19 @@ diff -Naur linux-3.2.23/drivers/usb/core/generic.c linux-rpi-bootc-3.2.23/driver } return i; } -diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/usb/core/hub.c ---- linux-3.2.23/drivers/usb/core/hub.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/core/hub.c 2012-07-15 20:29:20.587111902 +0200 -@@ -1075,6 +1075,8 @@ +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index 52340cc..e00d65f 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -24,7 +24,6 @@ + #include + #include + #include +-#include + + #include + #include +@@ -1076,6 +1075,8 @@ static int hub_configure(struct usb_hub *hub, INIT_WORK(&hub->tt.clear_work, hub_tt_work); switch (hdev->descriptor.bDeviceProtocol) { case 0: @@ -29870,7 +31721,7 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us break; case 1: dev_dbg(hub_dev, "Single TT\n"); -@@ -1091,6 +1093,7 @@ +@@ -1092,6 +1093,7 @@ static int hub_configure(struct usb_hub *hub, hub->tt.hub = hdev; break; case 3: @@ -29878,7 +31729,7 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us /* USB 3.0 hubs don't have a TT */ break; default: -@@ -1720,6 +1723,12 @@ +@@ -1721,6 +1723,12 @@ static inline void announce_device(struct usb_device *udev) { } #endif #ifdef CONFIG_USB_OTG @@ -29891,7 +31742,7 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us #include "otg_whitelist.h" #endif -@@ -1774,9 +1783,15 @@ +@@ -1775,9 +1783,15 @@ static int usb_enumerate_device_otg(struct usb_device *udev) dev_info(&udev->dev, "can't set HNP mode: %d\n", err); @@ -29908,7 +31759,7 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us } } -@@ -1785,12 +1800,27 @@ +@@ -1786,12 +1800,27 @@ static int usb_enumerate_device_otg(struct usb_device *udev) /* Maybe it can talk to us, though we can't talk to it. * (Includes HNP test device.) */ @@ -29939,7 +31790,34 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us goto fail; } fail: -@@ -2981,7 +3011,9 @@ +@@ -1898,14 +1927,6 @@ int usb_new_device(struct usb_device *udev) + /* Tell the world! */ + announce_device(udev); + +- if (udev->serial) +- add_device_randomness(udev->serial, strlen(udev->serial)); +- if (udev->product) +- add_device_randomness(udev->product, strlen(udev->product)); +- if (udev->manufacturer) +- add_device_randomness(udev->manufacturer, +- strlen(udev->manufacturer)); +- + device_enable_async_suspend(&udev->dev); + /* Register the device. The device driver is responsible + * for configuring the device and invoking the add-device +@@ -2442,9 +2463,9 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) + status = 0; + } else { + /* device has up to 10 msec to fully suspend */ +- dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", ++ /*dev_dbg(&udev->dev, "usb %ssuspend, wakeup %d\n", + (PMSG_IS_AUTO(msg) ? "auto-" : ""), +- udev->do_remote_wakeup); ++ udev->do_remote_wakeup);*/ + usb_set_device_state(udev, USB_STATE_SUSPENDED); + msleep(10); + } +@@ -2994,7 +3015,9 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, buf->bMaxPacketSize0 = 0; r = usb_control_msg(udev, usb_rcvaddr0pipe(), USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, @@ -29950,7 +31828,7 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us buf, GET_DESCRIPTOR_BUFSIZE, initial_descriptor_timeout); switch (buf->bMaxPacketSize0) { -@@ -3427,8 +3459,10 @@ +@@ -3440,8 +3463,10 @@ loop: release_devnum(udev); hub_free_dev(udev); usb_put_dev(udev); @@ -29963,10 +31841,11 @@ diff -Naur linux-3.2.23/drivers/usb/core/hub.c linux-rpi-bootc-3.2.23/drivers/us } if (hub->hdev->parent || !hcd->driver->port_handed_over || -diff -Naur linux-3.2.23/drivers/usb/core/message.c linux-rpi-bootc-3.2.23/drivers/usb/core/message.c ---- linux-3.2.23/drivers/usb/core/message.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/core/message.c 2012-07-15 20:29:20.581111790 +0200 -@@ -1838,6 +1838,85 @@ +diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c +index ef116a5..113b44e 100644 +--- a/drivers/usb/core/message.c ++++ b/drivers/usb/core/message.c +@@ -1838,6 +1838,85 @@ free_interfaces: if (cp->string == NULL && !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) cp->string = usb_cache_string(dev, cp->desc.iConfiguration); @@ -30052,9 +31931,10 @@ diff -Naur linux-3.2.23/drivers/usb/core/message.c linux-rpi-bootc-3.2.23/driver /* Now that all the interfaces are set up, register them * to trigger binding of drivers to interfaces. probe() -diff -Naur linux-3.2.23/drivers/usb/core/otg_whitelist.h linux-rpi-bootc-3.2.23/drivers/usb/core/otg_whitelist.h ---- linux-3.2.23/drivers/usb/core/otg_whitelist.h 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/core/otg_whitelist.h 2012-07-15 20:29:20.586111884 +0200 +diff --git a/drivers/usb/core/otg_whitelist.h b/drivers/usb/core/otg_whitelist.h +index e8cdce5..3a0da17 100644 +--- a/drivers/usb/core/otg_whitelist.h ++++ b/drivers/usb/core/otg_whitelist.h @@ -19,33 +19,82 @@ static struct usb_device_id whitelist_table [] = { @@ -30144,20 +32024,14 @@ diff -Naur linux-3.2.23/drivers/usb/core/otg_whitelist.h linux-rpi-bootc-3.2.23/ static int is_targeted(struct usb_device *dev) { struct usb_device_id *id = whitelist_table; -@@ -55,58 +104,83 @@ +@@ -55,58 +104,83 @@ static int is_targeted(struct usb_device *dev) return 1; /* HNP test device is _never_ targeted (see OTG spec 6.6.6) */ - if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a && - le16_to_cpu(dev->descriptor.idProduct) == 0xbadd)) - return 0; -+ if (dev->descriptor.idVendor == 0x1a0a && -+ dev->descriptor.idProduct == 0xbadd) { -+ return 0; -+ } else if (!enable_whitelist) { -+ return 1; -+ } else { - +- - /* NOTE: can't use usb_match_id() since interface caches - * aren't set up yet. this is cut/paste from that code. - */ @@ -30191,6 +32065,13 @@ diff -Naur linux-3.2.23/drivers/usb/core/otg_whitelist.h linux-rpi-bootc-3.2.23/ - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && - (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) - continue; ++ if (dev->descriptor.idVendor == 0x1a0a && ++ dev->descriptor.idProduct == 0xbadd) { ++ return 0; ++ } else if (!enable_whitelist) { ++ return 1; ++ } else { ++ +#ifdef DEBUG + dev_dbg(&dev->dev, "device V:%04x P:%04x DC:%04x SC:%04x PR:%04x \n", + dev->descriptor.idVendor, @@ -30270,10 +32151,28 @@ diff -Naur linux-3.2.23/drivers/usb/core/otg_whitelist.h linux-rpi-bootc-3.2.23/ #endif } -diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23/drivers/usb/gadget/file_storage.c ---- linux-3.2.23/drivers/usb/gadget/file_storage.c 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/gadget/file_storage.c 2012-07-15 20:29:20.327107010 +0200 -@@ -573,8 +573,37 @@ +diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig +index 23a4473..12d27d2 100644 +--- a/drivers/usb/gadget/Kconfig ++++ b/drivers/usb/gadget/Kconfig +@@ -552,6 +552,12 @@ config USB_GADGET_SUPERSPEED + depends on USB_GADGET + depends on USB_GADGET_DUALSPEED + ++config USB_DWC_OTG_LPM ++ boolean "Enable LPM support" ++ depends on USB && EXPERIMENTAL ++ help ++ Enables LPM support. ++ + # + # USB Gadget Drivers + # +diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c +index db2d607..5090ae6 100644 +--- a/drivers/usb/gadget/file_storage.c ++++ b/drivers/usb/gadget/file_storage.c +@@ -573,8 +573,37 @@ config_desc = { .iConfiguration = FSG_STRING_CONFIG, .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, .bMaxPower = CONFIG_USB_GADGET_VBUS_DRAW / 2, @@ -30311,7 +32210,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 static struct usb_qualifier_descriptor dev_qualifier = { -@@ -984,13 +1013,29 @@ +@@ -984,13 +1013,29 @@ get_config: break; case USB_DT_BOS: @@ -30342,7 +32241,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 break; /* One config, two speeds */ -@@ -2640,6 +2685,9 @@ +@@ -2640,6 +2685,9 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) fsg_set_halt(fsg, fsg->bulk_out); halt_bulk_in_endpoint(fsg); } @@ -30352,7 +32251,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 return -EINVAL; } -@@ -2991,7 +3039,8 @@ +@@ -2991,7 +3039,8 @@ static void handle_exception(struct fsg_dev *fsg) * bulk endpoint, clear the halt now. (The SuperH UDC * requires this.) */ if (test_and_clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags)) @@ -30362,7 +32261,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 if (transport_is_bbb()) { if (fsg->ep0_req_tag == exception_req_tag) -@@ -3065,6 +3114,9 @@ +@@ -3065,6 +3114,9 @@ static int fsg_main_thread(void *fsg_) * that expects a __user pointer and it will work okay. */ set_fs(get_ds()); @@ -30372,7 +32271,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 /* The main loop */ while (fsg->state != FSG_STATE_TERMINATED) { if (exception_in_progress(fsg) || signal_pending(current)) { -@@ -3212,6 +3264,13 @@ +@@ -3212,6 +3264,13 @@ static int __init check_parameters(struct fsg_dev *fsg) gcnum = usb_gadget_controller_number(fsg->gadget); if (gcnum >= 0) mod_data.release = 0x0300 + gcnum; @@ -30386,7 +32285,7 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 else { WARNING(fsg, "controller '%s' not recognized\n", fsg->gadget->name); -@@ -3473,6 +3532,13 @@ +@@ -3473,6 +3532,13 @@ static int __init fsg_bind(struct usb_gadget *gadget) rc = -ENOMEM; @@ -30400,31 +32299,652 @@ diff -Naur linux-3.2.23/drivers/usb/gadget/file_storage.c linux-rpi-bootc-3.2.23 /* Allocate the request and buffer for endpoint 0 */ fsg->ep0req = req = usb_ep_alloc_request(fsg->ep0, GFP_KERNEL); if (!req) -diff -Naur linux-3.2.23/drivers/usb/gadget/Kconfig linux-rpi-bootc-3.2.23/drivers/usb/gadget/Kconfig ---- linux-3.2.23/drivers/usb/gadget/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/gadget/Kconfig 2012-07-15 20:29:20.412108609 +0200 -@@ -552,6 +552,12 @@ - depends on USB_GADGET - depends on USB_GADGET_DUALSPEED +diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig +index 060e0e2..c03ee48 100644 +--- a/drivers/usb/host/Kconfig ++++ b/drivers/usb/host/Kconfig +@@ -556,6 +556,19 @@ config USB_HWA_HCD + To compile this driver a module, choose M here: the module + will be called "hwa-hc". -+config USB_DWC_OTG_LPM -+ boolean "Enable LPM support" -+ depends on USB && EXPERIMENTAL ++config USB_DWCOTG ++ tristate "Synopsis DWC host support" ++ depends on USB + help -+ Enables LPM support. ++ The Synopsis DWC controller is a dual-role ++ host/peripheral/OTG ("On The Go") USB controllers. + - # - # USB Gadget Drivers - # -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,506 @@ ++ Enable this option to support this IP in host controller mode. ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ modules built will be called dwc_otg and dwc_common_port. ++ + config USB_IMX21_HCD + tristate "i.MX21 HCD support" + depends on USB && ARM && ARCH_MXC +diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile +index 7ca290f..802dda6 100644 +--- a/drivers/usb/host/Makefile ++++ b/drivers/usb/host/Makefile +@@ -33,6 +33,8 @@ obj-$(CONFIG_USB_U132_HCD) += u132-hcd.o + obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o + obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o + obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o ++ ++obj-$(CONFIG_USB_DWCOTG) += dwc_otg/ dwc_common_port/ + obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o + obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o + obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o +diff --git a/drivers/usb/host/dwc_common_port/Makefile b/drivers/usb/host/dwc_common_port/Makefile +new file mode 100644 +index 0000000..203c7ea +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/Makefile +@@ -0,0 +1,58 @@ ++# ++# Makefile for DWC_common library ++# ++ ++ifneq ($(KERNELRELEASE),) ++ ++EXTRA_CFLAGS += -DDWC_LINUX ++#EXTRA_CFLAGS += -DDEBUG ++#EXTRA_CFLAGS += -DDWC_DEBUG_REGS ++#EXTRA_CFLAGS += -DDWC_DEBUG_MEMORY ++ ++EXTRA_CFLAGS += -DDWC_LIBMODULE ++EXTRA_CFLAGS += -DDWC_CCLIB ++#EXTRA_CFLAGS += -DDWC_CRYPTOLIB ++EXTRA_CFLAGS += -DDWC_NOTIFYLIB ++EXTRA_CFLAGS += -DDWC_UTFLIB ++ ++obj-$(CONFIG_USB_DWCOTG) += dwc_common_port_lib.o ++dwc_common_port_lib-objs := dwc_cc.o dwc_modpow.o dwc_dh.o \ ++ dwc_crypto.o dwc_notifier.o \ ++ dwc_common_linux.o dwc_mem.o ++ ++kernrelwd := $(subst ., ,$(KERNELRELEASE)) ++kernrel3 := $(word 1,$(kernrelwd)).$(word 2,$(kernrelwd)).$(word 3,$(kernrelwd)) ++ ++ifneq ($(kernrel3),2.6.20) ++# grayg - I only know that we use EXTRA_CFLAGS in 2.6.31 actually ++EXTRA_CFLAGS += $(CPPFLAGS) ++endif ++ ++else ++ ++ifeq ($(KDIR),) ++$(error Must give "KDIR=/path/to/kernel/source" on command line or in environment) ++endif ++ ++ifeq ($(ARCH),) ++$(error Must give "ARCH=" on command line or in environment. Also, if \ ++ cross-compiling, must give "CROSS_COMPILE=/path/to/compiler/plus/tool-prefix-") ++endif ++ ++ifeq ($(DOXYGEN),) ++DOXYGEN := doxygen ++endif ++ ++default: ++ $(MAKE) -C$(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules ++ ++docs: $(wildcard *.[hc]) doc/doxygen.cfg ++ $(DOXYGEN) doc/doxygen.cfg ++ ++tags: $(wildcard *.[hc]) ++ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) ++ ++endif ++ ++clean: ++ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ +diff --git a/drivers/usb/host/dwc_common_port/Makefile.fbsd b/drivers/usb/host/dwc_common_port/Makefile.fbsd +new file mode 100644 +index 0000000..45db991 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/Makefile.fbsd +@@ -0,0 +1,17 @@ ++CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include ++CFLAGS += -DDWC_FREEBSD ++CFLAGS += -DDEBUG ++#CFLAGS += -DDWC_DEBUG_REGS ++#CFLAGS += -DDWC_DEBUG_MEMORY ++ ++#CFLAGS += -DDWC_LIBMODULE ++#CFLAGS += -DDWC_CCLIB ++#CFLAGS += -DDWC_CRYPTOLIB ++#CFLAGS += -DDWC_NOTIFYLIB ++#CFLAGS += -DDWC_UTFLIB ++ ++KMOD = dwc_common_port_lib ++SRCS = dwc_cc.c dwc_modpow.c dwc_dh.c dwc_crypto.c dwc_notifier.c \ ++ dwc_common_fbsd.c dwc_mem.c ++ ++.include +diff --git a/drivers/usb/host/dwc_common_port/Makefile.linux b/drivers/usb/host/dwc_common_port/Makefile.linux +new file mode 100644 +index 0000000..961df3f +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/Makefile.linux +@@ -0,0 +1,49 @@ ++# ++# Makefile for DWC_common library ++# ++ifneq ($(KERNELRELEASE),) ++ ++EXTRA_CFLAGS += -DDWC_LINUX ++#EXTRA_CFLAGS += -DDEBUG ++#EXTRA_CFLAGS += -DDWC_DEBUG_REGS ++#EXTRA_CFLAGS += -DDWC_DEBUG_MEMORY ++ ++EXTRA_CFLAGS += -DDWC_LIBMODULE ++EXTRA_CFLAGS += -DDWC_CCLIB ++EXTRA_CFLAGS += -DDWC_CRYPTOLIB ++EXTRA_CFLAGS += -DDWC_NOTIFYLIB ++EXTRA_CFLAGS += -DDWC_UTFLIB ++ ++obj-m := dwc_common_port_lib.o ++dwc_common_port_lib-objs := dwc_cc.o dwc_modpow.o dwc_dh.o \ ++ dwc_crypto.o dwc_notifier.o \ ++ dwc_common_linux.o dwc_mem.o ++ ++else ++ ++ifeq ($(KDIR),) ++$(error Must give "KDIR=/path/to/kernel/source" on command line or in environment) ++endif ++ ++ifeq ($(ARCH),) ++$(error Must give "ARCH=" on command line or in environment. Also, if \ ++ cross-compiling, must give "CROSS_COMPILE=/path/to/compiler/plus/tool-prefix-") ++endif ++ ++ifeq ($(DOXYGEN),) ++DOXYGEN := doxygen ++endif ++ ++default: ++ $(MAKE) -C$(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules ++ ++docs: $(wildcard *.[hc]) doc/doxygen.cfg ++ $(DOXYGEN) doc/doxygen.cfg ++ ++tags: $(wildcard *.[hc]) ++ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) ++ ++endif ++ ++clean: ++ rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ +diff --git a/drivers/usb/host/dwc_common_port/changes.txt b/drivers/usb/host/dwc_common_port/changes.txt +new file mode 100644 +index 0000000..6740702 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/changes.txt +@@ -0,0 +1,174 @@ ++ ++dwc_read_reg32() and friends now take an additional parameter, a pointer to an ++IO context struct. The IO context struct should live in an os-dependent struct ++in your driver. As an example, the dwc_usb3 driver has an os-dependent struct ++named 'os_dep' embedded in the main device struct. So there these calls look ++like this: ++ ++ dwc_read_reg32(&usb3_dev->os_dep.ioctx, &pcd->dev_global_regs->dcfg); ++ ++ dwc_write_reg32(&usb3_dev->os_dep.ioctx, ++ &pcd->dev_global_regs->dcfg, 0); ++ ++Note that for the existing Linux driver ports, it is not necessary to actually ++define the 'ioctx' member in the os-dependent struct. Since Linux does not ++require an IO context, its macros for dwc_read_reg32() and friends do not ++use the context pointer, so it is optimized away by the compiler. But it is ++necessary to add the pointer parameter to all of the call sites, to be ready ++for any future ports (such as FreeBSD) which do require an IO context. ++ ++ ++Similarly, dwc_alloc(), dwc_alloc_atomic(), dwc_strdup(), and dwc_free() now ++take an additional parameter, a pointer to a memory context. Examples: ++ ++ addr = dwc_alloc(&usb3_dev->os_dep.memctx, size); ++ ++ dwc_free(&usb3_dev->os_dep.memctx, addr); ++ ++Again, for the Linux ports, it is not necessary to actually define the memctx ++member, but it is necessary to add the pointer parameter to all of the call ++sites. ++ ++ ++Same for dwc_dma_alloc() and dwc_dma_free(). Examples: ++ ++ virt_addr = dwc_dma_alloc(&usb3_dev->os_dep.dmactx, size, &phys_addr); ++ ++ dwc_dma_free(&usb3_dev->os_dep.dmactx, size, virt_addr, phys_addr); ++ ++ ++Same for dwc_mutex_alloc() and dwc_mutex_free(). Examples: ++ ++ mutex = dwc_mutex_alloc(&usb3_dev->os_dep.mtxctx); ++ ++ dwc_mutex_free(&usb3_dev->os_dep.mtxctx, mutex); ++ ++ ++Same for dwc_spinlock_alloc() and dwc_spinlock_free(). Examples: ++ ++ lock = dwc_spinlock_alloc(&usb3_dev->osdep.splctx); ++ ++ dwc_spinlock_free(&usb3_dev->osdep.splctx, lock); ++ ++ ++Same for dwc_timer_alloc(). Example: ++ ++ timer = dwc_timer_alloc(&usb3_dev->os_dep.tmrctx, "dwc_usb3_tmr1", ++ cb_func, cb_data); ++ ++ ++Same for dwc_waitq_alloc(). Example: ++ ++ waitq = dwc_waitq_alloc(&usb3_dev->os_dep.wtqctx); ++ ++ ++Same for dwc_thread_run(). Example: ++ ++ thread = dwc_thread_run(&usb3_dev->os_dep.thdctx, func, ++ "dwc_usb3_thd1", data); ++ ++ ++Same for dwc_workq_alloc(). Example: ++ ++ workq = dwc_workq_alloc(&usb3_dev->osdep.wkqctx, "dwc_usb3_wkq1"); ++ ++ ++Same for dwc_task_alloc(). Example: ++ ++ task = dwc_task_alloc(&usb3_dev->os_dep.tskctx, "dwc_usb3_tsk1", ++ cb_func, cb_data); ++ ++ ++In addition to the context pointer additions, a few core functions have had ++other changes made to their parameters: ++ ++The 'flags' parameter to dwc_spinlock_irqsave() and dwc_spinunlock_irqrestore() ++has been changed from a uint64_t to a dwc_irqflags_t. ++ ++dwc_thread_should_stop() now takes a 'dwc_thread_t *' parameter, because the ++FreeBSD equivalent of that function requires it. ++ ++And, in addition to the context pointer, dwc_task_alloc() also adds a ++'char *name' parameter, to be consistent with dwc_thread_run() and ++dwc_workq_alloc(), and because the FreeBSD equivalent of that function ++requires a unique name. ++ ++ ++Here is a complete list of the core functions that now take a pointer to a ++context as their first parameter: ++ ++ dwc_read_reg32 ++ dwc_read_reg64 ++ dwc_write_reg32 ++ dwc_write_reg64 ++ dwc_modify_reg32 ++ dwc_modify_reg64 ++ dwc_alloc ++ dwc_alloc_atomic ++ dwc_strdup ++ dwc_free ++ dwc_dma_alloc ++ dwc_dma_free ++ dwc_mutex_alloc ++ dwc_mutex_free ++ dwc_spinlock_alloc ++ dwc_spinlock_free ++ dwc_timer_alloc ++ dwc_waitq_alloc ++ dwc_thread_run ++ dwc_workq_alloc ++ dwc_task_alloc Also adds a 'char *name' as its 2nd parameter ++ ++And here are the core functions that have other changes to their parameters: ++ ++ dwc_spinlock_irqsave 'flags' param is now a 'dwc_irqflags_t *' ++ dwc_spinunlock_irqrestore 'flags' param is now a 'dwc_irqflags_t' ++ dwc_thread_should_stop Adds a 'dwc_thread_t *' parameter ++ ++ ++ ++The changes to the core functions also require some of the other library ++functions to change: ++ ++ dwc_cc_if_alloc() and dwc_cc_if_free() now take a 'void *memctx' ++ (for memory allocation) as the 1st param and a 'void *mtxctx' ++ (for mutex allocation) as the 2nd param. ++ ++ dwc_cc_clear(), dwc_cc_add(), dwc_cc_change(), dwc_cc_remove(), ++ dwc_cc_data_for_save(), and dwc_cc_restore_from_data() now take a ++ 'void *memctx' as the 1st param. ++ ++ dwc_dh_modpow(), dwc_dh_pk(), and dwc_dh_derive_keys() now take a ++ 'void *memctx' as the 1st param. ++ ++ dwc_modpow() now takes a 'void *memctx' as the 1st param. ++ ++ dwc_alloc_notification_manager() now takes a 'void *memctx' as the ++ 1st param and a 'void *wkqctx' (for work queue allocation) as the 2nd ++ param, and also now returns an integer value that is non-zero if ++ allocation of its data structures or work queue fails. ++ ++ dwc_register_notifier() now takes a 'void *memctx' as the 1st param. ++ ++ dwc_memory_debug_start() now takes a 'void *mem_ctx' as the first ++ param, and also now returns an integer value that is non-zero if ++ allocation of its data structures fails. ++ ++ ++ ++Other miscellaneous changes: ++ ++The DEBUG_MEMORY and DEBUG_REGS #define's have been renamed to ++DWC_DEBUG_MEMORY and DWC_DEBUG_REGS. ++ ++The following #define's have been added to allow selectively compiling library ++features: ++ ++ DWC_CCLIB ++ DWC_CRYPTOLIB ++ DWC_NOTIFYLIB ++ DWC_UTFLIB ++ ++A DWC_LIBMODULE #define has also been added. If this is not defined, then the ++module code in dwc_common_linux.c is not compiled in. This allows linking the ++library code directly into a driver module, instead of as a standalone module. +diff --git a/drivers/usb/host/dwc_common_port/doc/doxygen.cfg b/drivers/usb/host/dwc_common_port/doc/doxygen.cfg +new file mode 100644 +index 0000000..605b9da +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/doc/doxygen.cfg +@@ -0,0 +1,270 @@ ++# Doxyfile 1.4.5 ++ ++#--------------------------------------------------------------------------- ++# Project related configuration options ++#--------------------------------------------------------------------------- ++PROJECT_NAME = "Synopsys DWC Portability and Common Library for UWB" ++PROJECT_NUMBER = ++OUTPUT_DIRECTORY = doc ++CREATE_SUBDIRS = NO ++OUTPUT_LANGUAGE = English ++BRIEF_MEMBER_DESC = YES ++REPEAT_BRIEF = YES ++ABBREVIATE_BRIEF = "The $name class" \ ++ "The $name widget" \ ++ "The $name file" \ ++ is \ ++ provides \ ++ specifies \ ++ contains \ ++ represents \ ++ a \ ++ an \ ++ the ++ALWAYS_DETAILED_SEC = YES ++INLINE_INHERITED_MEMB = NO ++FULL_PATH_NAMES = NO ++STRIP_FROM_PATH = .. ++STRIP_FROM_INC_PATH = ++SHORT_NAMES = NO ++JAVADOC_AUTOBRIEF = YES ++MULTILINE_CPP_IS_BRIEF = NO ++DETAILS_AT_TOP = YES ++INHERIT_DOCS = YES ++SEPARATE_MEMBER_PAGES = NO ++TAB_SIZE = 8 ++ALIASES = ++OPTIMIZE_OUTPUT_FOR_C = YES ++OPTIMIZE_OUTPUT_JAVA = NO ++BUILTIN_STL_SUPPORT = NO ++DISTRIBUTE_GROUP_DOC = NO ++SUBGROUPING = NO ++#--------------------------------------------------------------------------- ++# Build related configuration options ++#--------------------------------------------------------------------------- ++EXTRACT_ALL = NO ++EXTRACT_PRIVATE = NO ++EXTRACT_STATIC = YES ++EXTRACT_LOCAL_CLASSES = NO ++EXTRACT_LOCAL_METHODS = NO ++HIDE_UNDOC_MEMBERS = NO ++HIDE_UNDOC_CLASSES = NO ++HIDE_FRIEND_COMPOUNDS = NO ++HIDE_IN_BODY_DOCS = NO ++INTERNAL_DOCS = NO ++CASE_SENSE_NAMES = YES ++HIDE_SCOPE_NAMES = NO ++SHOW_INCLUDE_FILES = NO ++INLINE_INFO = YES ++SORT_MEMBER_DOCS = NO ++SORT_BRIEF_DOCS = NO ++SORT_BY_SCOPE_NAME = NO ++GENERATE_TODOLIST = YES ++GENERATE_TESTLIST = YES ++GENERATE_BUGLIST = YES ++GENERATE_DEPRECATEDLIST= YES ++ENABLED_SECTIONS = ++MAX_INITIALIZER_LINES = 30 ++SHOW_USED_FILES = YES ++SHOW_DIRECTORIES = YES ++FILE_VERSION_FILTER = ++#--------------------------------------------------------------------------- ++# configuration options related to warning and progress messages ++#--------------------------------------------------------------------------- ++QUIET = YES ++WARNINGS = YES ++WARN_IF_UNDOCUMENTED = NO ++WARN_IF_DOC_ERROR = YES ++WARN_NO_PARAMDOC = YES ++WARN_FORMAT = "$file:$line: $text" ++WARN_LOGFILE = ++#--------------------------------------------------------------------------- ++# configuration options related to the input files ++#--------------------------------------------------------------------------- ++INPUT = . ++FILE_PATTERNS = *.c \ ++ *.cc \ ++ *.cxx \ ++ *.cpp \ ++ *.c++ \ ++ *.d \ ++ *.java \ ++ *.ii \ ++ *.ixx \ ++ *.ipp \ ++ *.i++ \ ++ *.inl \ ++ *.h \ ++ *.hh \ ++ *.hxx \ ++ *.hpp \ ++ *.h++ \ ++ *.idl \ ++ *.odl \ ++ *.cs \ ++ *.php \ ++ *.php3 \ ++ *.inc \ ++ *.m \ ++ *.mm \ ++ *.dox \ ++ *.py \ ++ *.C \ ++ *.CC \ ++ *.C++ \ ++ *.II \ ++ *.I++ \ ++ *.H \ ++ *.HH \ ++ *.H++ \ ++ *.CS \ ++ *.PHP \ ++ *.PHP3 \ ++ *.M \ ++ *.MM \ ++ *.PY ++RECURSIVE = NO ++EXCLUDE = ++EXCLUDE_SYMLINKS = NO ++EXCLUDE_PATTERNS = ++EXAMPLE_PATH = ++EXAMPLE_PATTERNS = * ++EXAMPLE_RECURSIVE = NO ++IMAGE_PATH = ++INPUT_FILTER = ++FILTER_PATTERNS = ++FILTER_SOURCE_FILES = NO ++#--------------------------------------------------------------------------- ++# configuration options related to source browsing ++#--------------------------------------------------------------------------- ++SOURCE_BROWSER = NO ++INLINE_SOURCES = NO ++STRIP_CODE_COMMENTS = YES ++REFERENCED_BY_RELATION = YES ++REFERENCES_RELATION = YES ++USE_HTAGS = NO ++VERBATIM_HEADERS = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the alphabetical class index ++#--------------------------------------------------------------------------- ++ALPHABETICAL_INDEX = NO ++COLS_IN_ALPHA_INDEX = 5 ++IGNORE_PREFIX = ++#--------------------------------------------------------------------------- ++# configuration options related to the HTML output ++#--------------------------------------------------------------------------- ++GENERATE_HTML = YES ++HTML_OUTPUT = html ++HTML_FILE_EXTENSION = .html ++HTML_HEADER = ++HTML_FOOTER = ++HTML_STYLESHEET = ++HTML_ALIGN_MEMBERS = YES ++GENERATE_HTMLHELP = NO ++CHM_FILE = ++HHC_LOCATION = ++GENERATE_CHI = NO ++BINARY_TOC = NO ++TOC_EXPAND = NO ++DISABLE_INDEX = NO ++ENUM_VALUES_PER_LINE = 4 ++GENERATE_TREEVIEW = YES ++TREEVIEW_WIDTH = 250 ++#--------------------------------------------------------------------------- ++# configuration options related to the LaTeX output ++#--------------------------------------------------------------------------- ++GENERATE_LATEX = NO ++LATEX_OUTPUT = latex ++LATEX_CMD_NAME = latex ++MAKEINDEX_CMD_NAME = makeindex ++COMPACT_LATEX = NO ++PAPER_TYPE = a4wide ++EXTRA_PACKAGES = ++LATEX_HEADER = ++PDF_HYPERLINKS = NO ++USE_PDFLATEX = NO ++LATEX_BATCHMODE = NO ++LATEX_HIDE_INDICES = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the RTF output ++#--------------------------------------------------------------------------- ++GENERATE_RTF = NO ++RTF_OUTPUT = rtf ++COMPACT_RTF = NO ++RTF_HYPERLINKS = NO ++RTF_STYLESHEET_FILE = ++RTF_EXTENSIONS_FILE = ++#--------------------------------------------------------------------------- ++# configuration options related to the man page output ++#--------------------------------------------------------------------------- ++GENERATE_MAN = NO ++MAN_OUTPUT = man ++MAN_EXTENSION = .3 ++MAN_LINKS = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the XML output ++#--------------------------------------------------------------------------- ++GENERATE_XML = NO ++XML_OUTPUT = xml ++XML_SCHEMA = ++XML_DTD = ++XML_PROGRAMLISTING = YES ++#--------------------------------------------------------------------------- ++# configuration options for the AutoGen Definitions output ++#--------------------------------------------------------------------------- ++GENERATE_AUTOGEN_DEF = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the Perl module output ++#--------------------------------------------------------------------------- ++GENERATE_PERLMOD = NO ++PERLMOD_LATEX = NO ++PERLMOD_PRETTY = YES ++PERLMOD_MAKEVAR_PREFIX = ++#--------------------------------------------------------------------------- ++# Configuration options related to the preprocessor ++#--------------------------------------------------------------------------- ++ENABLE_PREPROCESSING = YES ++MACRO_EXPANSION = NO ++EXPAND_ONLY_PREDEF = NO ++SEARCH_INCLUDES = YES ++INCLUDE_PATH = ++INCLUDE_FILE_PATTERNS = ++PREDEFINED = DEBUG DEBUG_MEMORY ++EXPAND_AS_DEFINED = ++SKIP_FUNCTION_MACROS = YES ++#--------------------------------------------------------------------------- ++# Configuration::additions related to external references ++#--------------------------------------------------------------------------- ++TAGFILES = ++GENERATE_TAGFILE = ++ALLEXTERNALS = NO ++EXTERNAL_GROUPS = YES ++PERL_PATH = /usr/bin/perl ++#--------------------------------------------------------------------------- ++# Configuration options related to the dot tool ++#--------------------------------------------------------------------------- ++CLASS_DIAGRAMS = YES ++HIDE_UNDOC_RELATIONS = YES ++HAVE_DOT = NO ++CLASS_GRAPH = YES ++COLLABORATION_GRAPH = YES ++GROUP_GRAPHS = YES ++UML_LOOK = NO ++TEMPLATE_RELATIONS = NO ++INCLUDE_GRAPH = NO ++INCLUDED_BY_GRAPH = YES ++CALL_GRAPH = NO ++GRAPHICAL_HIERARCHY = YES ++DIRECTORY_GRAPH = YES ++DOT_IMAGE_FORMAT = png ++DOT_PATH = ++DOTFILE_DIRS = ++MAX_DOT_GRAPH_DEPTH = 1000 ++DOT_TRANSPARENT = NO ++DOT_MULTI_TARGETS = NO ++GENERATE_LEGEND = YES ++DOT_CLEANUP = YES ++#--------------------------------------------------------------------------- ++# Configuration::additions related to the search engine ++#--------------------------------------------------------------------------- ++SEARCHENGINE = NO +diff --git a/drivers/usb/host/dwc_common_port/dwc_cc.c b/drivers/usb/host/dwc_common_port/dwc_cc.c +new file mode 100644 +index 0000000..613c901 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_cc.c +@@ -0,0 +1,532 @@ +/* ========================================================================= -+ * $File: //dwh/usb_iip/dev/software/dwc_common_port/dwc_cc.c $ -+ * $Revision: #1 $ -+ * $Date: 2008/12/21 $ -+ * $Change: 1156609 $ ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $ ++ * $Revision: #4 $ ++ * $Date: 2010/11/04 $ ++ * $Change: 1621692 $ + * + * Synopsys Portability Library Software and documentation + * (hereinafter, "Software") is an Unsupported proprietary work of @@ -30455,6 +32975,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * ========================================================================= */ ++#ifdef DWC_CCLIB ++ +#include "dwc_cc.h" + +typedef struct dwc_cc @@ -30497,9 +33019,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot +#define dump_bytes(x...) +#endif + -+static dwc_cc_t *alloc_cc(uint8_t *name, uint32_t length) ++static dwc_cc_t *alloc_cc(void *mem_ctx, uint8_t *name, uint32_t length) +{ -+ dwc_cc_t *cc = DWC_ALLOC(sizeof(dwc_cc_t)); ++ dwc_cc_t *cc = dwc_alloc(mem_ctx, sizeof(dwc_cc_t)); + if (!cc) { + return NULL; + } @@ -30507,19 +33029,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + + if (name) { + cc->length = length; -+ cc->name = DWC_ALLOC(length); ++ cc->name = dwc_alloc(mem_ctx, length); ++ if (!cc->name) { ++ dwc_free(mem_ctx, cc); ++ return NULL; ++ } ++ + DWC_MEMCPY(cc->name, name, length); + } + + return cc; +} + -+static void free_cc(dwc_cc_t *cc) ++static void free_cc(void *mem_ctx, dwc_cc_t *cc) +{ + if (cc->name) { -+ DWC_FREE(cc->name); ++ dwc_free(mem_ctx, cc->name); + } -+ DWC_FREE(cc); ++ dwc_free(mem_ctx, cc); +} + +static uint32_t next_uid(dwc_cc_if_t *cc_if) @@ -30591,7 +33118,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot +} + +/* Internal cc_add */ -+static int32_t cc_add(dwc_cc_if_t *cc_if, uint8_t *chid, uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) ++static int32_t cc_add(void *mem_ctx, dwc_cc_if_t *cc_if, uint8_t *chid, ++ uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) +{ + dwc_cc_t *cc; + uint32_t uid; @@ -30604,11 +33132,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + } + + if (uid) { -+ DWC_DEBUG("Replacing previous connection context id=%d name=%p name_len=%d", uid, name, length); ++ DWC_DEBUGC("Replacing previous connection context id=%d name=%p name_len=%d", uid, name, length); + cc = cc_find(cc_if, uid); + } + else { -+ cc = alloc_cc(name, length); ++ cc = alloc_cc(mem_ctx, name, length); + cc->uid = next_uid(cc_if); + DWC_CIRCLEQ_INSERT_TAIL(&cc_if->list, cc, list_entry); + } @@ -30617,7 +33145,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + DWC_MEMCPY(&(cc->cdid[0]), cdid, 16); + DWC_MEMCPY(&(cc->ck[0]), ck, 16); + -+ DWC_DEBUG("Added connection context id=%d name=%p name_len=%d", cc->uid, name, length); ++ DWC_DEBUGC("Added connection context id=%d name=%p name_len=%d", cc->uid, name, length); + dump_bytes("CHID", cc->chid, 16); + dump_bytes("CDID", cc->cdid, 16); + dump_bytes("CK", cc->ck, 16); @@ -30625,41 +33153,51 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot +} + +/* Internal cc_clear */ -+static void cc_clear(dwc_cc_if_t *cc_if) ++static void cc_clear(void *mem_ctx, dwc_cc_if_t *cc_if) +{ + while (!DWC_CIRCLEQ_EMPTY(&cc_if->list)) { + dwc_cc_t *cc = DWC_CIRCLEQ_FIRST(&cc_if->list); + DWC_CIRCLEQ_REMOVE_INIT(&cc_if->list, cc, list_entry); -+ free_cc(cc); ++ free_cc(mem_ctx, cc); + } +} + -+dwc_cc_if_t *dwc_cc_if_alloc(dwc_notifier_t *notifier, unsigned is_host) ++dwc_cc_if_t *dwc_cc_if_alloc(void *mem_ctx, void *mtx_ctx, ++ dwc_notifier_t *notifier, unsigned is_host) +{ + dwc_cc_if_t *cc_if = NULL; + + /* Allocate a common_cc_if structure */ -+ cc_if = DWC_ALLOC(sizeof(dwc_cc_if_t)); ++ cc_if = dwc_alloc(mem_ctx, sizeof(dwc_cc_if_t)); + -+ if(!cc_if) ++ if (!cc_if) + return NULL; + +#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) + DWC_MUTEX_ALLOC_LINUX_DEBUG(cc_if->mutex); +#else -+ cc_if->mutex = DWC_MUTEX_ALLOC(); ++ cc_if->mutex = dwc_mutex_alloc(mtx_ctx); +#endif ++ if (!cc_if->mutex) { ++ dwc_free(mem_ctx, cc_if); ++ return NULL; ++ } ++ + DWC_CIRCLEQ_INIT(&cc_if->list); + cc_if->is_host = is_host; + cc_if->notifier = notifier; + return cc_if; +} + -+void dwc_cc_if_free(dwc_cc_if_t *cc_if) ++void dwc_cc_if_free(void *mem_ctx, void *mtx_ctx, dwc_cc_if_t *cc_if) +{ ++#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) + DWC_MUTEX_FREE(cc_if->mutex); -+ cc_clear(cc_if); -+ DWC_FREE(cc_if); ++#else ++ dwc_mutex_free(mtx_ctx, cc_if->mutex); ++#endif ++ cc_clear(mem_ctx, cc_if); ++ dwc_free(mem_ctx, cc_if); +} + +static void cc_changed(dwc_cc_if_t *cc_if) @@ -30669,37 +33207,38 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + } +} + -+void dwc_cc_clear(dwc_cc_if_t *cc_if) ++void dwc_cc_clear(void *mem_ctx, dwc_cc_if_t *cc_if) +{ + DWC_MUTEX_LOCK(cc_if->mutex); -+ cc_clear(cc_if); ++ cc_clear(mem_ctx, cc_if); + DWC_MUTEX_UNLOCK(cc_if->mutex); + cc_changed(cc_if); +} + -+int32_t dwc_cc_add(dwc_cc_if_t *cc_if, uint8_t *chid, uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) ++int32_t dwc_cc_add(void *mem_ctx, dwc_cc_if_t *cc_if, uint8_t *chid, ++ uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) +{ + uint32_t uid; + + DWC_MUTEX_LOCK(cc_if->mutex); -+ uid = cc_add(cc_if, chid, cdid, ck, name, length); ++ uid = cc_add(mem_ctx, cc_if, chid, cdid, ck, name, length); + DWC_MUTEX_UNLOCK(cc_if->mutex); + cc_changed(cc_if); + + return uid; +} + -+void dwc_cc_change(dwc_cc_if_t *cc_if, int32_t id, -+ uint8_t *chid, uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) ++void dwc_cc_change(void *mem_ctx, dwc_cc_if_t *cc_if, int32_t id, uint8_t *chid, ++ uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length) +{ + dwc_cc_t* cc; + -+ DWC_DEBUG("Change connection context %d", id); ++ DWC_DEBUGC("Change connection context %d", id); + + DWC_MUTEX_LOCK(cc_if->mutex); + cc = cc_find(cc_if, id); + if (!cc) { -+ DWC_ERROR("Uid %d not found in cc list", id); ++ DWC_ERROR("Uid %d not found in cc list\n", id); + DWC_MUTEX_UNLOCK(cc_if->mutex); + return; + } @@ -30716,9 +33255,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + + if (name) { + if (cc->name) { -+ DWC_FREE(cc->name); ++ dwc_free(mem_ctx, cc->name); ++ } ++ cc->name = dwc_alloc(mem_ctx, length); ++ if (!cc->name) { ++ DWC_ERROR("Out of memory in dwc_cc_change()\n"); ++ DWC_MUTEX_UNLOCK(cc_if->mutex); ++ return; + } -+ cc->name = DWC_ALLOC(length); + cc->length = length; + DWC_MEMCPY(cc->name, name, length); + } @@ -30727,34 +33271,34 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + + cc_changed(cc_if); + -+ DWC_DEBUG("Changed connection context id=%d\n", id); ++ DWC_DEBUGC("Changed connection context id=%d\n", id); + dump_bytes("New CHID", cc->chid, 16); + dump_bytes("New CDID", cc->cdid, 16); + dump_bytes("New CK", cc->ck, 16); +} + -+void dwc_cc_remove(dwc_cc_if_t *cc_if, int32_t id) ++void dwc_cc_remove(void *mem_ctx, dwc_cc_if_t *cc_if, int32_t id) +{ + dwc_cc_t *cc; + -+ DWC_DEBUG("Removing connection context %d", id); ++ DWC_DEBUGC("Removing connection context %d", id); + + DWC_MUTEX_LOCK(cc_if->mutex); + cc = cc_find(cc_if, id); + if (!cc) { -+ DWC_ERROR("Uid %d not found in cc list", id); ++ DWC_ERROR("Uid %d not found in cc list\n", id); + DWC_MUTEX_UNLOCK(cc_if->mutex); + return; + } + + DWC_CIRCLEQ_REMOVE_INIT(&cc_if->list, cc, list_entry); + DWC_MUTEX_UNLOCK(cc_if->mutex); -+ free_cc(cc); ++ free_cc(mem_ctx, cc); + + cc_changed(cc_if); +} + -+uint8_t *dwc_cc_data_for_save(dwc_cc_if_t *cc_if, unsigned int *length) ++uint8_t *dwc_cc_data_for_save(void *mem_ctx, dwc_cc_if_t *cc_if, unsigned int *length) +{ + uint8_t *buf, *x; + uint8_t zero = 0; @@ -30767,9 +33311,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + return NULL; + } + -+ DWC_DEBUG("Creating data for saving (length=%d)", *length); ++ DWC_DEBUGC("Creating data for saving (length=%d)", *length); + -+ buf = DWC_ALLOC(*length); ++ buf = dwc_alloc(mem_ctx, *length); + if (!buf) { + *length = 0; + DWC_MUTEX_UNLOCK(cc_if->mutex); @@ -30800,7 +33344,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + return buf; +} + -+void dwc_cc_restore_from_data(dwc_cc_if_t *cc_if, uint8_t *data, uint32_t length) ++void dwc_cc_restore_from_data(void *mem_ctx, dwc_cc_if_t *cc_if, uint8_t *data, uint32_t length) +{ + uint8_t name_length; + uint8_t *name; @@ -30810,7 +33354,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + uint32_t i = 0; + + DWC_MUTEX_LOCK(cc_if->mutex); -+ cc_clear(cc_if); ++ cc_clear(mem_ctx, cc_if); + + while (i < length) { + chid = &data[i]; @@ -30834,11 +33378,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + /* check to see if we haven't overflown the buffer */ + if (i > length) { + DWC_ERROR("Data format error while attempting to load CCs " -+ "(nlen=%d, iter=%d, buflen=%d).", name_length, i, length); ++ "(nlen=%d, iter=%d, buflen=%d).\n", name_length, i, length); + break; + } + -+ cc_add(cc_if, chid, cdid, ck, name, name_length); ++ cc_add(mem_ctx, cc_if, chid, cdid, ck, name, name_length); + } + DWC_MUTEX_UNLOCK(cc_if->mutex); + @@ -30926,15 +33470,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.c linux-rpi-boot + + return retval; +} -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,209 @@ ++ ++#endif /* DWC_CCLIB */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_cc.h b/drivers/usb/host/dwc_common_port/dwc_cc.h +new file mode 100644 +index 0000000..6b2bbaf +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_cc.h +@@ -0,0 +1,225 @@ +/* ========================================================================= -+ * $File: //dwh/usb_iip/dev/software/dwc_common_port/dwc_cc.h $ -+ * $Revision: #1 $ -+ * $Date: 2008/12/21 $ -+ * $Change: 1156609 $ ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $ ++ * $Revision: #4 $ ++ * $Date: 2010/09/28 $ ++ * $Change: 1596182 $ + * + * Synopsys Portability Library Software and documentation + * (hereinafter, "Software") is an Unsupported proprietary work of @@ -30968,6 +33516,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot +#ifndef _DWC_CC_H_ +#define _DWC_CC_H_ + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ +/** @file + * + * This file defines the Context Context library. @@ -31001,14 +33553,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot +/** This function allocates memory for a dwc_cc_if_t structure, initializes + * fields to default values, and returns a pointer to the structure or NULL on + * error. */ -+extern dwc_cc_if_t *dwc_cc_if_alloc(dwc_notifier_t *notifier, unsigned is_host); ++extern dwc_cc_if_t *dwc_cc_if_alloc(void *mem_ctx, void *mtx_ctx, ++ dwc_notifier_t *notifier, unsigned is_host); + +/** Frees the memory for the specified CC structure allocated from + * dwc_cc_if_alloc(). */ -+extern void dwc_cc_if_free(dwc_cc_if_t *cc_if); ++extern void dwc_cc_if_free(void *mem_ctx, void *mtx_ctx, dwc_cc_if_t *cc_if); + +/** Removes all contexts from the connection context list */ -+extern void dwc_cc_clear(dwc_cc_if_t *cc_if); ++extern void dwc_cc_clear(void *mem_ctx, dwc_cc_if_t *cc_if); + +/** Adds a connection context (CHID, CK, CDID, Name) to the connection context list. + * If a CHID already exists, the CK and name are overwritten. Statistics are @@ -31023,7 +33576,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot + * @param length The length othe unicode string. + * @return A unique identifier used to refer to this context that is valid for + * as long as this context is still in the list. */ -+extern int32_t dwc_cc_add(dwc_cc_if_t *cc_if, uint8_t *chid, uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length); ++extern int32_t dwc_cc_add(void *mem_ctx, dwc_cc_if_t *cc_if, uint8_t *chid, ++ uint8_t *cdid, uint8_t *ck, uint8_t *name, ++ uint8_t length); + +/** Changes the CHID, CK, CDID, or Name values of a connection context in the + * list, preserving any accumulated statistics. This would typically be called @@ -31039,12 +33594,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot + * indicates no change. + * @param name Host friendly name UTF16-LE. NULL indicates no change. + * @param length Length of name. */ -+extern void dwc_cc_change(dwc_cc_if_t *cc_if, int32_t id, uint8_t *chid, uint8_t *cdid, uint8_t *ck, uint8_t *name, uint8_t length); ++extern void dwc_cc_change(void *mem_ctx, dwc_cc_if_t *cc_if, int32_t id, ++ uint8_t *chid, uint8_t *cdid, uint8_t *ck, ++ uint8_t *name, uint8_t length); + +/** Remove the specified connection context. + * @param cc_if The cc_if structure. + * @param id The identifier of the connection context to remove. */ -+extern void dwc_cc_remove(dwc_cc_if_t *cc_if, int32_t id); ++extern void dwc_cc_remove(void *mem_ctx, dwc_cc_if_t *cc_if, int32_t id); + +/** Get a binary block of data for the connection context list and attributes. + * This data can be used by the OS specific driver to save the connection @@ -31052,8 +33609,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot + * + * @param cc_if The cc_if structure. + * @param length Return the length of the data buffer. -+ * @return A pointer to the data buffer. The memory for this buffer should be freed with DWC_FREE() after use. */ -+extern uint8_t *dwc_cc_data_for_save(dwc_cc_if_t *cc_if, unsigned int *length); ++ * @return A pointer to the data buffer. The memory for this buffer should be ++ * freed with DWC_FREE() after use. */ ++extern uint8_t *dwc_cc_data_for_save(void *mem_ctx, dwc_cc_if_t *cc_if, ++ unsigned int *length); + +/** Restore the connection context list from the binary data that was previously + * returned from a call to dwc_cc_data_for_save. This can be used by the OS specific @@ -31062,7 +33621,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot + * @param cc_if The cc_if structure. + * @param data The data bytes as returned from dwc_cc_data_for_save. + * @param length The length of the data. */ -+extern void dwc_cc_restore_from_data(dwc_cc_if_t *cc_if, uint8_t *data, unsigned int length); ++extern void dwc_cc_restore_from_data(void *mem_ctx, dwc_cc_if_t *cc_if, ++ uint8_t *data, unsigned int length); + +/** Find the connection context from the specified CHID. + * @@ -31137,116 +33697,39 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_cc.h linux-rpi-boot + +/** @} */ + ++#ifdef __cplusplus ++} ++#endif ++ +#endif /* _DWC_CC_H_ */ + -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,1138 @@ -+#include "dwc_cc.h" -+#include "dwc_notifier.h" +diff --git a/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c b/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c +new file mode 100644 +index 0000000..6dd04b5 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c +@@ -0,0 +1,1308 @@ ++#include "dwc_os.h" ++#include "dwc_list.h" + -+#include -+#include -+#include -+#include -+ -+MODULE_DESCRIPTION("DWC Common Library - Portable version"); -+MODULE_AUTHOR("Synopsys Inc."); -+MODULE_LICENSE ("GPL"); -+ -+static int dwc_common_port_init_module(void) -+{ -+ printk( KERN_DEBUG "Module dwc_common_port init\n" ); -+#ifdef DEBUG_MEMORY -+ dwc_memory_debug_start(); ++#ifdef DWC_CCLIB ++# include "dwc_cc.h" +#endif -+ dwc_alloc_notification_manager(); -+ return 0; -+} + -+static void dwc_common_port_exit_module(void) -+{ -+ printk( KERN_DEBUG "Module dwc_common_port exit\n" ); -+ dwc_free_notification_manager(); -+#ifdef DEBUG_MEMORY -+ dwc_memory_debug_stop(); ++#ifdef DWC_CRYPTOLIB ++# include "dwc_modpow.h" ++# include "dwc_dh.h" ++# include "dwc_crypto.h" +#endif -+} + -+module_init(dwc_common_port_init_module); -+module_exit(dwc_common_port_exit_module); -+ -+/* CC */ -+EXPORT_SYMBOL(dwc_cc_if_alloc); -+EXPORT_SYMBOL(dwc_cc_if_free); -+EXPORT_SYMBOL(dwc_cc_clear); -+EXPORT_SYMBOL(dwc_cc_add); -+EXPORT_SYMBOL(dwc_cc_remove); -+EXPORT_SYMBOL(dwc_cc_change); -+EXPORT_SYMBOL(dwc_cc_data_for_save); -+EXPORT_SYMBOL(dwc_cc_restore_from_data); -+EXPORT_SYMBOL(dwc_cc_match_chid); -+EXPORT_SYMBOL(dwc_cc_match_cdid); -+EXPORT_SYMBOL(dwc_cc_ck); -+EXPORT_SYMBOL(dwc_cc_chid); -+EXPORT_SYMBOL(dwc_cc_cdid); -+EXPORT_SYMBOL(dwc_cc_name); -+ -+/* Notification */ -+EXPORT_SYMBOL(dwc_alloc_notification_manager); -+EXPORT_SYMBOL(dwc_free_notification_manager); -+EXPORT_SYMBOL(dwc_register_notifier); -+EXPORT_SYMBOL(dwc_unregister_notifier); -+EXPORT_SYMBOL(dwc_add_observer); -+EXPORT_SYMBOL(dwc_remove_observer); -+EXPORT_SYMBOL(dwc_notify); -+ -+/* Memory Debugging Routines */ -+#ifdef DEBUG_MEMORY -+EXPORT_SYMBOL(dwc_alloc_debug); -+EXPORT_SYMBOL(dwc_alloc_atomic_debug); -+EXPORT_SYMBOL(dwc_free_debug); -+EXPORT_SYMBOL(dwc_dma_alloc_debug); -+EXPORT_SYMBOL(dwc_dma_alloc_atomic_debug); -+EXPORT_SYMBOL(dwc_dma_free_debug); ++#ifdef DWC_NOTIFYLIB ++# include "dwc_notifier.h" +#endif + +/* OS-Level Implementations */ + -+/* This is the Linux kernel implementation of the DWC platform library. */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#else -+#include -+#endif -+#include -+#include -+#include -+#include -+#include -+#include -+#include ++/* This is the FreeBSD 7.0 kernel implementation of the DWC platform library. */ ++ + +/* MISC */ + @@ -31254,86 +33737,84 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu +{ + return memset(dest, byte, size); +} -+EXPORT_SYMBOL(DWC_MEMSET); + +void *DWC_MEMCPY(void *dest, void const *src, uint32_t size) +{ + return memcpy(dest, src, size); +} -+EXPORT_SYMBOL(DWC_MEMCPY); + +void *DWC_MEMMOVE(void *dest, void *src, uint32_t size) +{ -+ return memmove(dest, src, size); ++ bcopy(src, dest, size); ++ return dest; +} -+EXPORT_SYMBOL(DWC_MEMMOVE); + +int DWC_MEMCMP(void *m1, void *m2, uint32_t size) +{ + return memcmp(m1, m2, size); +} -+EXPORT_SYMBOL(DWC_MEMCMP); + +int DWC_STRNCMP(void *s1, void *s2, uint32_t size) +{ + return strncmp(s1, s2, size); +} -+EXPORT_SYMBOL(DWC_STRNCMP); + +int DWC_STRCMP(void *s1, void *s2) +{ + return strcmp(s1, s2); +} -+EXPORT_SYMBOL(DWC_STRCMP); + +int DWC_STRLEN(char const *str) +{ + return strlen(str); +} -+EXPORT_SYMBOL(DWC_STRLEN); + -+char *DWC_STRCPY(char *to, const char *from) ++char *DWC_STRCPY(char *to, char const *from) +{ + return strcpy(to, from); +} -+EXPORT_SYMBOL(DWC_STRCPY); + +char *DWC_STRDUP(char const *str) +{ + int len = DWC_STRLEN(str) + 1; + char *new = DWC_ALLOC_ATOMIC(len); ++ + if (!new) { + return NULL; + } ++ + DWC_MEMCPY(new, str, len); + return new; +} -+EXPORT_SYMBOL(DWC_STRDUP); + +int DWC_ATOI(char *str, int32_t *value) +{ + char *end = NULL; -+ *value = simple_strtol(str, &end, 0); ++ ++ *value = strtol(str, &end, 0); + if (*end == '\0') { + return 0; + } ++ + return -1; +} -+EXPORT_SYMBOL(DWC_ATOI); + +int DWC_ATOUI(char *str, uint32_t *value) +{ + char *end = NULL; -+ *value = simple_strtoul(str, &end, 0); ++ ++ *value = strtoul(str, &end, 0); + if (*end == '\0') { + return 0; + } ++ + return -1; +} -+EXPORT_SYMBOL(DWC_ATOUI); + + ++#ifdef DWC_UTFLIB +/* From usbstring.c */ ++ +int DWC_UTF8_TO_UTF16LE(uint8_t const *s, uint16_t *cp, unsigned len) +{ + int count = 0; @@ -31383,7 +33864,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + // = 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx + // (uuuuu = wwww + 1) + // FIXME accept the surrogate code points (only) -+ + } else + goto fail; + } else @@ -31396,27 +33876,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu +fail: + return -1; +} -+EXPORT_SYMBOL(DWC_UTF8_TO_UTF16LE); ++ ++#endif /* DWC_UTFLIB */ ++ + +/* dwc_debug.h */ + +dwc_bool_t DWC_IN_IRQ(void) +{ -+ return in_irq(); ++// return in_irq(); ++ return 0; +} -+EXPORT_SYMBOL(DWC_IN_IRQ); + -+int DWC_IN_BH(void) ++dwc_bool_t DWC_IN_BH(void) +{ -+ return in_softirq(); ++// return in_softirq(); ++ return 0; +} -+EXPORT_SYMBOL(DWC_IN_BH); + +void DWC_VPRINTF(char *format, va_list args) +{ -+ vprintk(format, args); ++ vprintf(format, args); +} -+EXPORT_SYMBOL(DWC_VPRINTF); + +int DWC_VSNPRINTF(char *str, int size, char *format, va_list args) +{ @@ -31426,79 +33907,74 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu +void DWC_PRINTF(char *format, ...) +{ + va_list args; ++ + va_start(args, format); + DWC_VPRINTF(format, args); + va_end(args); +} -+EXPORT_SYMBOL(DWC_PRINTF); + +int DWC_SPRINTF(char *buffer, char *format, ...) +{ + int retval; + va_list args; ++ + va_start(args, format); + retval = vsprintf(buffer, format, args); + va_end(args); + return retval; +} -+EXPORT_SYMBOL(DWC_SPRINTF); + +int DWC_SNPRINTF(char *buffer, int size, char *format, ...) +{ + int retval; + va_list args; ++ + va_start(args, format); + retval = vsnprintf(buffer, size, format, args); + va_end(args); + return retval; +} -+EXPORT_SYMBOL(DWC_SNPRINTF); + +void __DWC_WARN(char *format, ...) +{ + va_list args; ++ + va_start(args, format); -+ DWC_PRINTF(KERN_WARNING); + DWC_VPRINTF(format, args); + va_end(args); +} -+EXPORT_SYMBOL(__DWC_WARN); + +void __DWC_ERROR(char *format, ...) +{ + va_list args; ++ + va_start(args, format); -+ DWC_PRINTF(KERN_ERR); + DWC_VPRINTF(format, args); + va_end(args); +} -+EXPORT_SYMBOL(__DWC_ERROR); + +void DWC_EXCEPTION(char *format, ...) +{ + va_list args; ++ + va_start(args, format); -+ DWC_PRINTF(KERN_ERR); + DWC_VPRINTF(format, args); + va_end(args); -+ BUG_ON(1); ++// BUG_ON(1); ??? +} -+EXPORT_SYMBOL(DWC_EXCEPTION); + +#ifdef DEBUG +void __DWC_DEBUG(char *format, ...) +{ + va_list args; ++ + va_start(args, format); -+ DWC_PRINTF(KERN_DEBUG); + DWC_VPRINTF(format, args); + va_end(args); +} -+EXPORT_SYMBOL(__DWC_DEBUG); +#endif + + -+ +/* dwc_mem.h */ + +#if 0 @@ -31516,42 +33992,1390 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + dma_pool_destroy((struct dma_pool *)pool); +} + -+void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, U64 *dma_addr) ++void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, uint64_t *dma_addr) +{ -+ return dma_pool_alloc((struct dma_pool *)pool, GFP_KERNEL, dma_addr); ++// return dma_pool_alloc((struct dma_pool *)pool, GFP_KERNEL, dma_addr); ++ return dma_pool_alloc((struct dma_pool *)pool, M_WAITOK, dma_addr); +} + -+void *DWC_DMA_POOL_ZALLOC(dwc_pool_t *pool, U64 *dma_addr) ++void *DWC_DMA_POOL_ZALLOC(dwc_pool_t *pool, uint64_t *dma_addr) +{ + void *vaddr = DWC_DMA_POOL_ALLOC(pool, dma_addr); -+ memset(); ++ memset(..); +} + +void DWC_DMA_POOL_FREE(dwc_pool_t *pool, void *vaddr, void *daddr) +{ + dma_pool_free(pool, vaddr, daddr); +} -+ +#endif + -+void *__DWC_DMA_ALLOC(uint32_t size, dwc_dma_t *dma_addr) ++static void dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) +{ -+ void *buf = dma_alloc_coherent(NULL, (size_t)size, dma_addr, GFP_KERNEL); ++ if (error) ++ return; ++ *(bus_addr_t *)arg = segs[0].ds_addr; ++} ++ ++void *__DWC_DMA_ALLOC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr) ++{ ++ dwc_dmactx_t *dma = (dwc_dmactx_t *)dma_ctx; ++ int error; ++ ++ error = bus_dma_tag_create( ++#if __FreeBSD_version >= 700000 ++ bus_get_dma_tag(dma->dev), /* parent */ ++#else ++ NULL, /* parent */ ++#endif ++ 4, 0, /* alignment, bounds */ ++ BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ ++ BUS_SPACE_MAXADDR, /* highaddr */ ++ NULL, NULL, /* filter, filterarg */ ++ size, /* maxsize */ ++ 1, /* nsegments */ ++ size, /* maxsegsize */ ++ 0, /* flags */ ++ NULL, /* lockfunc */ ++ NULL, /* lockarg */ ++ &dma->dma_tag); ++ if (error) { ++ device_printf(dma->dev, "%s: bus_dma_tag_create failed: %d\n", ++ __func__, error); ++ goto fail_0; ++ } ++ ++ error = bus_dmamem_alloc(dma->dma_tag, &dma->dma_vaddr, ++ BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &dma->dma_map); ++ if (error) { ++ device_printf(dma->dev, "%s: bus_dmamem_alloc(%ju) failed: %d\n", ++ __func__, (uintmax_t)size, error); ++ goto fail_1; ++ } ++ ++ dma->dma_paddr = 0; ++ error = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr, size, ++ dmamap_cb, &dma->dma_paddr, BUS_DMA_NOWAIT); ++ if (error || dma->dma_paddr == 0) { ++ device_printf(dma->dev, "%s: bus_dmamap_load failed: %d\n", ++ __func__, error); ++ goto fail_2; ++ } ++ ++ *dma_addr = dma->dma_paddr; ++ return dma->dma_vaddr; ++ ++fail_2: ++ bus_dmamap_unload(dma->dma_tag, dma->dma_map); ++fail_1: ++ bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); ++ bus_dma_tag_destroy(dma->dma_tag); ++fail_0: ++ dma->dma_map = NULL; ++ dma->dma_tag = NULL; ++ ++ return NULL; ++} ++ ++void __DWC_DMA_FREE(void *dma_ctx, uint32_t size, void *virt_addr, dwc_dma_t dma_addr) ++{ ++ dwc_dmactx_t *dma = (dwc_dmactx_t *)dma_ctx; ++ ++ if (dma->dma_tag == NULL) ++ return; ++ if (dma->dma_map != NULL) { ++ bus_dmamap_sync(dma->dma_tag, dma->dma_map, ++ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); ++ bus_dmamap_unload(dma->dma_tag, dma->dma_map); ++ bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map); ++ dma->dma_map = NULL; ++ } ++ ++ bus_dma_tag_destroy(dma->dma_tag); ++ dma->dma_tag = NULL; ++} ++ ++void *__DWC_ALLOC(void *mem_ctx, uint32_t size) ++{ ++ return malloc(size, M_DEVBUF, M_WAITOK | M_ZERO); ++} ++ ++void *__DWC_ALLOC_ATOMIC(void *mem_ctx, uint32_t size) ++{ ++ return malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); ++} ++ ++void __DWC_FREE(void *mem_ctx, void *addr) ++{ ++ free(addr, M_DEVBUF); ++} ++ ++ ++#ifdef DWC_CRYPTOLIB ++/* dwc_crypto.h */ ++ ++void DWC_RANDOM_BYTES(uint8_t *buffer, uint32_t length) ++{ ++ get_random_bytes(buffer, length); ++} ++ ++int DWC_AES_CBC(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t iv[16], uint8_t *out) ++{ ++ struct crypto_blkcipher *tfm; ++ struct blkcipher_desc desc; ++ struct scatterlist sgd; ++ struct scatterlist sgs; ++ ++ tfm = crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC); ++ if (tfm == NULL) { ++ printk("failed to load transform for aes CBC\n"); ++ return -1; ++ } ++ ++ crypto_blkcipher_setkey(tfm, key, keylen); ++ crypto_blkcipher_set_iv(tfm, iv, 16); ++ ++ sg_init_one(&sgd, out, messagelen); ++ sg_init_one(&sgs, message, messagelen); ++ ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ if (crypto_blkcipher_encrypt(&desc, &sgd, &sgs, messagelen)) { ++ crypto_free_blkcipher(tfm); ++ DWC_ERROR("AES CBC encryption failed"); ++ return -1; ++ } ++ ++ crypto_free_blkcipher(tfm); ++ return 0; ++} ++ ++int DWC_SHA256(uint8_t *message, uint32_t len, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for sha256: %ld", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, len); ++ crypto_hash_digest(&desc, &sg, len, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++ ++int DWC_HMAC_SHA256(uint8_t *message, uint32_t messagelen, ++ uint8_t *key, uint32_t keylen, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("hmac(sha256)", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for hmac(sha256): %ld", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, messagelen); ++ crypto_hash_setkey(tfm, key, keylen); ++ crypto_hash_digest(&desc, &sg, messagelen, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++ ++#endif /* DWC_CRYPTOLIB */ ++ ++ ++/* Byte Ordering Conversions */ ++ ++uint32_t DWC_CPU_TO_LE32(uint32_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_CPU_TO_BE32(uint32_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_LE32_TO_CPU(uint32_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_BE32_TO_CPU(uint32_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint16_t DWC_CPU_TO_LE16(uint16_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_CPU_TO_BE16(uint16_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_LE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_BE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++ ++/* Registers */ ++ ++uint32_t DWC_READ_REG32(void *io_ctx, uint32_t volatile *reg) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ return bus_space_read_4(io->iot, io->ioh, ior); ++} ++ ++#if 0 ++uint64_t DWC_READ_REG64(void *io_ctx, uint64_t volatile *reg) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ return bus_space_read_8(io->iot, io->ioh, ior); ++} ++#endif ++ ++void DWC_WRITE_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t value) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_4(io->iot, io->ioh, ior, value); ++} ++ ++#if 0 ++void DWC_WRITE_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t value) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_8(io->iot, io->ioh, ior, value); ++} ++#endif ++ ++void DWC_MODIFY_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t clear_mask, ++ uint32_t set_mask) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_4(io->iot, io->ioh, ior, ++ (bus_space_read_4(io->iot, io->ioh, ior) & ++ ~clear_mask) | set_mask); ++} ++ ++#if 0 ++void DWC_MODIFY_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t clear_mask, ++ uint64_t set_mask) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_8(io->iot, io->ioh, ior, ++ (bus_space_read_8(io->iot, io->ioh, ior) & ++ ~clear_mask) | set_mask); ++} ++#endif ++ ++ ++/* Locking */ ++ ++dwc_spinlock_t *DWC_SPINLOCK_ALLOC(void) ++{ ++ struct mtx *sl = DWC_ALLOC(sizeof(*sl)); ++ ++ if (!sl) { ++ DWC_ERROR("Cannot allocate memory for spinlock"); ++ return NULL; ++ } ++ ++ mtx_init(sl, "dw3spn", NULL, MTX_SPIN); ++ return (dwc_spinlock_t *)sl; ++} ++ ++void DWC_SPINLOCK_FREE(dwc_spinlock_t *lock) ++{ ++ struct mtx *sl = (struct mtx *)lock; ++ ++ mtx_destroy(sl); ++ DWC_FREE(sl); ++} ++ ++void DWC_SPINLOCK(dwc_spinlock_t *lock) ++{ ++ mtx_lock_spin((struct mtx *)lock); // ??? ++} ++ ++void DWC_SPINUNLOCK(dwc_spinlock_t *lock) ++{ ++ mtx_unlock_spin((struct mtx *)lock); // ??? ++} ++ ++void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, dwc_irqflags_t *flags) ++{ ++ mtx_lock_spin((struct mtx *)lock); ++} ++ ++void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, dwc_irqflags_t flags) ++{ ++ mtx_unlock_spin((struct mtx *)lock); ++} ++ ++dwc_mutex_t *DWC_MUTEX_ALLOC(void) ++{ ++ struct mtx *m; ++ dwc_mutex_t *mutex = (dwc_mutex_t *)DWC_ALLOC(sizeof(struct mtx)); ++ ++ if (!mutex) { ++ DWC_ERROR("Cannot allocate memory for mutex"); ++ return NULL; ++ } ++ ++ m = (struct mtx *)mutex; ++ mtx_init(m, "dw3mtx", NULL, MTX_DEF); ++ return mutex; ++} ++ ++#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) ++#else ++void DWC_MUTEX_FREE(dwc_mutex_t *mutex) ++{ ++ mtx_destroy((struct mtx *)mutex); ++ DWC_FREE(mutex); ++} ++#endif ++ ++void DWC_MUTEX_LOCK(dwc_mutex_t *mutex) ++{ ++ struct mtx *m = (struct mtx *)mutex; ++ ++ mtx_lock(m); ++} ++ ++int DWC_MUTEX_TRYLOCK(dwc_mutex_t *mutex) ++{ ++ struct mtx *m = (struct mtx *)mutex; ++ ++ return mtx_trylock(m); ++} ++ ++void DWC_MUTEX_UNLOCK(dwc_mutex_t *mutex) ++{ ++ struct mtx *m = (struct mtx *)mutex; ++ ++ mtx_unlock(m); ++} ++ ++ ++/* Timing */ ++ ++void DWC_UDELAY(uint32_t usecs) ++{ ++ DELAY(usecs); ++} ++ ++void DWC_MDELAY(uint32_t msecs) ++{ ++ do { ++ DELAY(1000); ++ } while (--msecs); ++} ++ ++void DWC_MSLEEP(uint32_t msecs) ++{ ++ struct timeval tv; ++ ++ tv.tv_sec = msecs / 1000; ++ tv.tv_usec = (msecs - tv.tv_sec * 1000) * 1000; ++ pause("dw3slp", tvtohz(&tv)); ++} ++ ++uint32_t DWC_TIME(void) ++{ ++ struct timeval tv; ++ ++ microuptime(&tv); // or getmicrouptime? (less precise, but faster) ++ return tv.tv_sec * 1000 + tv.tv_usec / 1000; ++} ++ ++ ++/* Timers */ ++ ++struct dwc_timer { ++ struct callout t; ++ char *name; ++ dwc_spinlock_t *lock; ++ dwc_timer_callback_t cb; ++ void *data; ++}; ++ ++dwc_timer_t *DWC_TIMER_ALLOC(char *name, dwc_timer_callback_t cb, void *data) ++{ ++ dwc_timer_t *t = DWC_ALLOC(sizeof(*t)); ++ ++ if (!t) { ++ DWC_ERROR("Cannot allocate memory for timer"); ++ return NULL; ++ } ++ ++ callout_init(&t->t, 1); ++ ++ t->name = DWC_STRDUP(name); ++ if (!t->name) { ++ DWC_ERROR("Cannot allocate memory for timer->name"); ++ goto no_name; ++ } ++ ++ t->lock = DWC_SPINLOCK_ALLOC(); ++ if (!t->lock) { ++ DWC_ERROR("Cannot allocate memory for lock"); ++ goto no_lock; ++ } ++ ++ t->cb = cb; ++ t->data = data; ++ ++ return t; ++ ++ no_lock: ++ DWC_FREE(t->name); ++ no_name: ++ DWC_FREE(t); ++ ++ return NULL; ++} ++ ++void DWC_TIMER_FREE(dwc_timer_t *timer) ++{ ++ callout_stop(&timer->t); ++ DWC_SPINLOCK_FREE(timer->lock); ++ DWC_FREE(timer->name); ++ DWC_FREE(timer); ++} ++ ++void DWC_TIMER_SCHEDULE(dwc_timer_t *timer, uint32_t time) ++{ ++ struct timeval tv; ++ ++ tv.tv_sec = time / 1000; ++ tv.tv_usec = (time - tv.tv_sec * 1000) * 1000; ++ callout_reset(&timer->t, tvtohz(&tv), timer->cb, timer->data); ++} ++ ++void DWC_TIMER_CANCEL(dwc_timer_t *timer) ++{ ++ callout_stop(&timer->t); ++} ++ ++ ++/* Wait Queues */ ++ ++struct dwc_waitq { ++ struct mtx lock; ++ int abort; ++}; ++ ++dwc_waitq_t *DWC_WAITQ_ALLOC(void) ++{ ++ dwc_waitq_t *wq = DWC_ALLOC(sizeof(*wq)); ++ ++ if (!wq) { ++ DWC_ERROR("Cannot allocate memory for waitqueue"); ++ return NULL; ++ } ++ ++ mtx_init(&wq->lock, "dw3wtq", NULL, MTX_DEF); ++ wq->abort = 0; ++ ++ return wq; ++} ++ ++void DWC_WAITQ_FREE(dwc_waitq_t *wq) ++{ ++ mtx_destroy(&wq->lock); ++ DWC_FREE(wq); ++} ++ ++int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, void *data) ++{ ++// intrmask_t ipl; ++ int result = 0; ++ ++ mtx_lock(&wq->lock); ++// ipl = splbio(); ++ ++ /* Skip the sleep if already aborted or triggered */ ++ if (!wq->abort && !cond(data)) { ++// splx(ipl); ++ result = msleep(wq, &wq->lock, PCATCH, "dw3wat", 0); // infinite timeout ++// ipl = splbio(); ++ } ++ ++ if (result == ERESTART) { // signaled - restart ++ result = -DWC_E_RESTART; ++ ++ } else if (result == EINTR) { // signaled - interrupt ++ result = -DWC_E_ABORT; ++ ++ } else if (wq->abort) { ++ result = -DWC_E_ABORT; ++ ++ } else { ++ result = 0; ++ } ++ ++ wq->abort = 0; ++// splx(ipl); ++ mtx_unlock(&wq->lock); ++ return result; ++} ++ ++int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, ++ void *data, int32_t msecs) ++{ ++ struct timeval tv, tv1, tv2; ++// intrmask_t ipl; ++ int result = 0; ++ ++ tv.tv_sec = msecs / 1000; ++ tv.tv_usec = (msecs - tv.tv_sec * 1000) * 1000; ++ ++ mtx_lock(&wq->lock); ++// ipl = splbio(); ++ ++ /* Skip the sleep if already aborted or triggered */ ++ if (!wq->abort && !cond(data)) { ++// splx(ipl); ++ getmicrouptime(&tv1); ++ result = msleep(wq, &wq->lock, PCATCH, "dw3wto", tvtohz(&tv)); ++ getmicrouptime(&tv2); ++// ipl = splbio(); ++ } ++ ++ if (result == 0) { // awoken ++ if (wq->abort) { ++ result = -DWC_E_ABORT; ++ } else { ++ tv2.tv_usec -= tv1.tv_usec; ++ if (tv2.tv_usec < 0) { ++ tv2.tv_usec += 1000000; ++ tv2.tv_sec--; ++ } ++ ++ tv2.tv_sec -= tv1.tv_sec; ++ result = tv2.tv_sec * 1000 + tv2.tv_usec / 1000; ++ result = msecs - result; ++ if (result <= 0) ++ result = 1; ++ } ++ } else if (result == ERESTART) { // signaled - restart ++ result = -DWC_E_RESTART; ++ ++ } else if (result == EINTR) { // signaled - interrupt ++ result = -DWC_E_ABORT; ++ ++ } else { // timed out ++ result = -DWC_E_TIMEOUT; ++ } ++ ++ wq->abort = 0; ++// splx(ipl); ++ mtx_unlock(&wq->lock); ++ return result; ++} ++ ++void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq) ++{ ++ wakeup(wq); ++} ++ ++void DWC_WAITQ_ABORT(dwc_waitq_t *wq) ++{ ++// intrmask_t ipl; ++ ++ mtx_lock(&wq->lock); ++// ipl = splbio(); ++ wq->abort = 1; ++ wakeup(wq); ++// splx(ipl); ++ mtx_unlock(&wq->lock); ++} ++ ++ ++/* Threading */ ++ ++struct dwc_thread { ++ struct proc *proc; ++ int abort; ++}; ++ ++dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t func, char *name, void *data) ++{ ++ int retval; ++ dwc_thread_t *thread = DWC_ALLOC(sizeof(*thread)); ++ ++ if (!thread) { ++ return NULL; ++ } ++ ++ thread->abort = 0; ++ retval = kthread_create((void (*)(void *))func, data, &thread->proc, ++ RFPROC | RFNOWAIT, 0, "%s", name); ++ if (retval) { ++ DWC_FREE(thread); ++ return NULL; ++ } ++ ++ return thread; ++} ++ ++int DWC_THREAD_STOP(dwc_thread_t *thread) ++{ ++ int retval; ++ ++ thread->abort = 1; ++ retval = tsleep(&thread->abort, 0, "dw3stp", 60 * hz); ++ ++ if (retval == 0) { ++ /* DWC_THREAD_EXIT() will free the thread struct */ ++ return 0; ++ } ++ ++ /* NOTE: We leak the thread struct if thread doesn't die */ ++ ++ if (retval == EWOULDBLOCK) { ++ return -DWC_E_TIMEOUT; ++ } ++ ++ return -DWC_E_UNKNOWN; ++} ++ ++dwc_bool_t DWC_THREAD_SHOULD_STOP(dwc_thread_t *thread) ++{ ++ return thread->abort; ++} ++ ++void DWC_THREAD_EXIT(dwc_thread_t *thread) ++{ ++ wakeup(&thread->abort); ++ DWC_FREE(thread); ++ kthread_exit(0); ++} ++ ++ ++/* tasklets ++ - Runs in interrupt context (cannot sleep) ++ - Each tasklet runs on a single CPU [ How can we ensure this on FreeBSD? Does it matter? ] ++ - Different tasklets can be running simultaneously on different CPUs [ shouldn't matter ] ++ */ ++struct dwc_tasklet { ++ struct task t; ++ dwc_tasklet_callback_t cb; ++ void *data; ++}; ++ ++static void tasklet_callback(void *data, int pending) // what to do with pending ??? ++{ ++ dwc_tasklet_t *task = (dwc_tasklet_t *)data; ++ ++ task->cb(task->data); ++} ++ ++dwc_tasklet_t *DWC_TASK_ALLOC(char *name, dwc_tasklet_callback_t cb, void *data) ++{ ++ dwc_tasklet_t *task = DWC_ALLOC(sizeof(*task)); ++ ++ if (task) { ++ task->cb = cb; ++ task->data = data; ++ TASK_INIT(&task->t, 0, tasklet_callback, task); ++ } else { ++ DWC_ERROR("Cannot allocate memory for tasklet"); ++ } ++ ++ return task; ++} ++ ++void DWC_TASK_FREE(dwc_tasklet_t *task) ++{ ++ taskqueue_drain(taskqueue_fast, &task->t); // ??? ++ DWC_FREE(task); ++} ++ ++void DWC_TASK_SCHEDULE(dwc_tasklet_t *task) ++{ ++ /* Uses predefined system queue */ ++ taskqueue_enqueue_fast(taskqueue_fast, &task->t); ++} ++ ++ ++/* workqueues ++ - Runs in process context (can sleep) ++ */ ++typedef struct work_container { ++ dwc_work_callback_t cb; ++ void *data; ++ dwc_workq_t *wq; ++ char *name; ++ int hz; ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_ENTRY(work_container) entry; ++#endif ++ struct task task; ++} work_container_t; ++ ++#ifdef DEBUG ++DWC_CIRCLEQ_HEAD(work_container_queue, work_container); ++#endif ++ ++struct dwc_workq { ++ struct taskqueue *taskq; ++ dwc_spinlock_t *lock; ++ dwc_waitq_t *waitq; ++ int pending; ++ ++#ifdef DEBUG ++ struct work_container_queue entries; ++#endif ++}; ++ ++static void do_work(void *data, int pending) // what to do with pending ??? ++{ ++ work_container_t *container = (work_container_t *)data; ++ dwc_workq_t *wq = container->wq; ++ dwc_irqflags_t flags; ++ ++ if (container->hz) { ++ pause("dw3wrk", container->hz); ++ } ++ ++ container->cb(container->data); ++ DWC_DEBUG("Work done: %s, container=%p", container->name, container); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_REMOVE(&wq->entries, container, entry); ++#endif ++ if (container->name) ++ DWC_FREE(container->name); ++ DWC_FREE(container); ++ wq->pending--; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++} ++ ++static int work_done(void *data) ++{ ++ dwc_workq_t *workq = (dwc_workq_t *)data; ++ ++ return workq->pending == 0; ++} ++ ++int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout) ++{ ++ return DWC_WAITQ_WAIT_TIMEOUT(workq->waitq, work_done, workq, timeout); ++} ++ ++dwc_workq_t *DWC_WORKQ_ALLOC(char *name) ++{ ++ dwc_workq_t *wq = DWC_ALLOC(sizeof(*wq)); ++ ++ if (!wq) { ++ DWC_ERROR("Cannot allocate memory for workqueue"); ++ return NULL; ++ } ++ ++ wq->taskq = taskqueue_create(name, M_NOWAIT, taskqueue_thread_enqueue, &wq->taskq); ++ if (!wq->taskq) { ++ DWC_ERROR("Cannot allocate memory for taskqueue"); ++ goto no_taskq; ++ } ++ ++ wq->pending = 0; ++ ++ wq->lock = DWC_SPINLOCK_ALLOC(); ++ if (!wq->lock) { ++ DWC_ERROR("Cannot allocate memory for spinlock"); ++ goto no_lock; ++ } ++ ++ wq->waitq = DWC_WAITQ_ALLOC(); ++ if (!wq->waitq) { ++ DWC_ERROR("Cannot allocate memory for waitqueue"); ++ goto no_waitq; ++ } ++ ++ taskqueue_start_threads(&wq->taskq, 1, PWAIT, "%s taskq", "dw3tsk"); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INIT(&wq->entries); ++#endif ++ return wq; ++ ++ no_waitq: ++ DWC_SPINLOCK_FREE(wq->lock); ++ no_lock: ++ taskqueue_free(wq->taskq); ++ no_taskq: ++ DWC_FREE(wq); ++ ++ return NULL; ++} ++ ++void DWC_WORKQ_FREE(dwc_workq_t *wq) ++{ ++#ifdef DEBUG ++ dwc_irqflags_t flags; ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ ++ if (wq->pending != 0) { ++ struct work_container *container; ++ ++ DWC_ERROR("Destroying work queue with pending work"); ++ ++ DWC_CIRCLEQ_FOREACH(container, &wq->entries, entry) { ++ DWC_ERROR("Work %s still pending", container->name); ++ } ++ } ++ ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++#endif ++ DWC_WAITQ_FREE(wq->waitq); ++ DWC_SPINLOCK_FREE(wq->lock); ++ taskqueue_free(wq->taskq); ++ DWC_FREE(wq); ++} ++ ++void DWC_WORKQ_SCHEDULE(dwc_workq_t *wq, dwc_work_callback_t cb, void *data, ++ char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ container->hz = 0; ++ ++ DWC_DEBUG("Queueing work: %s, container=%p", container->name, container); ++ ++ TASK_INIT(&container->task, 0, do_work, container); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); ++#endif ++ taskqueue_enqueue_fast(wq->taskq, &container->task); ++} ++ ++void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *wq, dwc_work_callback_t cb, ++ void *data, uint32_t time, char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ struct timeval tv; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ ++ tv.tv_sec = time / 1000; ++ tv.tv_usec = (time - tv.tv_sec * 1000) * 1000; ++ container->hz = tvtohz(&tv); ++ ++ DWC_DEBUG("Queueing work: %s, container=%p", container->name, container); ++ ++ TASK_INIT(&container->task, 0, do_work, container); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); ++#endif ++ taskqueue_enqueue_fast(wq->taskq, &container->task); ++} ++ ++int DWC_WORKQ_PENDING(dwc_workq_t *wq) ++{ ++ return wq->pending; ++} +diff --git a/drivers/usb/host/dwc_common_port/dwc_common_linux.c b/drivers/usb/host/dwc_common_port/dwc_common_linux.c +new file mode 100644 +index 0000000..f00a9ff +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_common_linux.c +@@ -0,0 +1,1421 @@ ++#include ++#include ++#include ++#include ++ ++#ifdef DWC_CCLIB ++# include "dwc_cc.h" ++#endif ++ ++#ifdef DWC_CRYPTOLIB ++# include "dwc_modpow.h" ++# include "dwc_dh.h" ++# include "dwc_crypto.h" ++#endif ++ ++#ifdef DWC_NOTIFYLIB ++# include "dwc_notifier.h" ++#endif ++ ++/* OS-Level Implementations */ ++ ++/* This is the Linux kernel implementation of the DWC platform library. */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) ++# include ++#else ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "dwc_os.h" ++#include "dwc_list.h" ++ ++ ++/* MISC */ ++ ++void *DWC_MEMSET(void *dest, uint8_t byte, uint32_t size) ++{ ++ return memset(dest, byte, size); ++} ++ ++void *DWC_MEMCPY(void *dest, void const *src, uint32_t size) ++{ ++ return memcpy(dest, src, size); ++} ++ ++void *DWC_MEMMOVE(void *dest, void *src, uint32_t size) ++{ ++ return memmove(dest, src, size); ++} ++ ++int DWC_MEMCMP(void *m1, void *m2, uint32_t size) ++{ ++ return memcmp(m1, m2, size); ++} ++ ++int DWC_STRNCMP(void *s1, void *s2, uint32_t size) ++{ ++ return strncmp(s1, s2, size); ++} ++ ++int DWC_STRCMP(void *s1, void *s2) ++{ ++ return strcmp(s1, s2); ++} ++ ++int DWC_STRLEN(char const *str) ++{ ++ return strlen(str); ++} ++ ++char *DWC_STRCPY(char *to, char const *from) ++{ ++ return strcpy(to, from); ++} ++ ++char *DWC_STRDUP(char const *str) ++{ ++ int len = DWC_STRLEN(str) + 1; ++ char *new = DWC_ALLOC_ATOMIC(len); ++ ++ if (!new) { ++ return NULL; ++ } ++ ++ DWC_MEMCPY(new, str, len); ++ return new; ++} ++ ++int DWC_ATOI(const char *str, int32_t *value) ++{ ++ char *end = NULL; ++ ++ *value = simple_strtol(str, &end, 0); ++ if (*end == '\0') { ++ return 0; ++ } ++ ++ return -1; ++} ++ ++int DWC_ATOUI(const char *str, uint32_t *value) ++{ ++ char *end = NULL; ++ ++ *value = simple_strtoul(str, &end, 0); ++ if (*end == '\0') { ++ return 0; ++ } ++ ++ return -1; ++} ++ ++ ++#ifdef DWC_UTFLIB ++/* From usbstring.c */ ++ ++int DWC_UTF8_TO_UTF16LE(uint8_t const *s, uint16_t *cp, unsigned len) ++{ ++ int count = 0; ++ u8 c; ++ u16 uchar; ++ ++ /* this insists on correct encodings, though not minimal ones. ++ * BUT it currently rejects legit 4-byte UTF-8 code points, ++ * which need surrogate pairs. (Unicode 3.1 can use them.) ++ */ ++ while (len != 0 && (c = (u8) *s++) != 0) { ++ if (unlikely(c & 0x80)) { ++ // 2-byte sequence: ++ // 00000yyyyyxxxxxx = 110yyyyy 10xxxxxx ++ if ((c & 0xe0) == 0xc0) { ++ uchar = (c & 0x1f) << 6; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c; ++ ++ // 3-byte sequence (most CJKV characters): ++ // zzzzyyyyyyxxxxxx = 1110zzzz 10yyyyyy 10xxxxxx ++ } else if ((c & 0xf0) == 0xe0) { ++ uchar = (c & 0x0f) << 12; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c << 6; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c; ++ ++ /* no bogus surrogates */ ++ if (0xd800 <= uchar && uchar <= 0xdfff) ++ goto fail; ++ ++ // 4-byte sequence (surrogate pairs, currently rare): ++ // 11101110wwwwzzzzyy + 110111yyyyxxxxxx ++ // = 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx ++ // (uuuuu = wwww + 1) ++ // FIXME accept the surrogate code points (only) ++ } else ++ goto fail; ++ } else ++ uchar = c; ++ put_unaligned (cpu_to_le16 (uchar), cp++); ++ count++; ++ len--; ++ } ++ return count; ++fail: ++ return -1; ++} ++#endif /* DWC_UTFLIB */ ++ ++ ++/* dwc_debug.h */ ++ ++dwc_bool_t DWC_IN_IRQ(void) ++{ ++ return in_irq(); ++} ++ ++dwc_bool_t DWC_IN_BH(void) ++{ ++ return in_softirq(); ++} ++ ++void DWC_VPRINTF(char *format, va_list args) ++{ ++ vprintk(format, args); ++} ++ ++int DWC_VSNPRINTF(char *str, int size, char *format, va_list args) ++{ ++ return vsnprintf(str, size, format, args); ++} ++ ++void DWC_PRINTF(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++int DWC_SPRINTF(char *buffer, char *format, ...) ++{ ++ int retval; ++ va_list args; ++ ++ va_start(args, format); ++ retval = vsprintf(buffer, format, args); ++ va_end(args); ++ return retval; ++} ++ ++int DWC_SNPRINTF(char *buffer, int size, char *format, ...) ++{ ++ int retval; ++ va_list args; ++ ++ va_start(args, format); ++ retval = vsnprintf(buffer, size, format, args); ++ va_end(args); ++ return retval; ++} ++ ++void __DWC_WARN(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_PRINTF(KERN_WARNING); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++void __DWC_ERROR(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_PRINTF(KERN_ERR); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++void DWC_EXCEPTION(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_PRINTF(KERN_ERR); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++ BUG_ON(1); ++} ++ ++#ifdef DEBUG ++void __DWC_DEBUG(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_PRINTF(KERN_DEBUG); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++#endif ++ ++ ++/* dwc_mem.h */ ++ ++#if 0 ++dwc_pool_t *DWC_DMA_POOL_CREATE(uint32_t size, ++ uint32_t align, ++ uint32_t alloc) ++{ ++ struct dma_pool *pool = dma_pool_create("Pool", NULL, ++ size, align, alloc); ++ return (dwc_pool_t *)pool; ++} ++ ++void DWC_DMA_POOL_DESTROY(dwc_pool_t *pool) ++{ ++ dma_pool_destroy((struct dma_pool *)pool); ++} ++ ++void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, uint64_t *dma_addr) ++{ ++ return dma_pool_alloc((struct dma_pool *)pool, GFP_KERNEL, dma_addr); ++} ++ ++void *DWC_DMA_POOL_ZALLOC(dwc_pool_t *pool, uint64_t *dma_addr) ++{ ++ void *vaddr = DWC_DMA_POOL_ALLOC(pool, dma_addr); ++ memset(..); ++} ++ ++void DWC_DMA_POOL_FREE(dwc_pool_t *pool, void *vaddr, void *daddr) ++{ ++ dma_pool_free(pool, vaddr, daddr); ++} ++#endif ++ ++void *__DWC_DMA_ALLOC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr) ++{ ++#ifdef xxCOSIM /* Only works for 32-bit cosim */ ++ void *buf = dma_alloc_coherent(dma_ctx, (size_t)size, dma_addr, GFP_KERNEL); ++#else ++ void *buf = dma_alloc_coherent(dma_ctx, (size_t)size, dma_addr, GFP_KERNEL | GFP_DMA32); ++#endif + if (!buf) { + return NULL; + } ++ + memset(buf, 0, (size_t)size); + return buf; +} -+EXPORT_SYMBOL(__DWC_DMA_ALLOC); + -+void __DWC_DMA_FREE(uint32_t size, void *virt_addr, dwc_dma_t dma_addr) -+{ -+ dma_free_coherent(NULL, size, virt_addr, dma_addr); -+} -+EXPORT_SYMBOL(__DWC_DMA_FREE); -+ -+void *__DWC_DMA_ALLOC_ATOMIC(uint32_t size, dwc_dma_t *dma_addr) ++void *__DWC_DMA_ALLOC_ATOMIC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr) +{ + void *buf = dma_alloc_coherent(NULL, (size_t)size, dma_addr, GFP_ATOMIC); + if (!buf) { @@ -31560,119 +35384,199 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + memset(buf, 0, (size_t)size); + return buf; +} -+EXPORT_SYMBOL(__DWC_DMA_ALLOC_ATOMIC); + -+void *__DWC_ALLOC(uint32_t size) ++void __DWC_DMA_FREE(void *dma_ctx, uint32_t size, void *virt_addr, dwc_dma_t dma_addr) ++{ ++ dma_free_coherent(dma_ctx, size, virt_addr, dma_addr); ++} ++ ++void *__DWC_ALLOC(void *mem_ctx, uint32_t size) +{ + return kzalloc(size, GFP_KERNEL); +} -+EXPORT_SYMBOL(__DWC_ALLOC); + -+void *__DWC_ALLOC_ATOMIC(uint32_t size) ++void *__DWC_ALLOC_ATOMIC(void *mem_ctx, uint32_t size) +{ + return kzalloc(size, GFP_ATOMIC); +} -+EXPORT_SYMBOL(__DWC_ALLOC_ATOMIC); + -+void __DWC_FREE(void *addr) ++void __DWC_FREE(void *mem_ctx, void *addr) +{ + kfree(addr); +} -+EXPORT_SYMBOL(__DWC_FREE); + -+/* Byte Ordering Conversions. */ -+uint32_t DWC_CPU_TO_LE32(void *p) ++ ++#ifdef DWC_CRYPTOLIB ++/* dwc_crypto.h */ ++ ++void DWC_RANDOM_BYTES(uint8_t *buffer, uint32_t length) ++{ ++ get_random_bytes(buffer, length); ++} ++ ++int DWC_AES_CBC(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t iv[16], uint8_t *out) ++{ ++ struct crypto_blkcipher *tfm; ++ struct blkcipher_desc desc; ++ struct scatterlist sgd; ++ struct scatterlist sgs; ++ ++ tfm = crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC); ++ if (tfm == NULL) { ++ printk("failed to load transform for aes CBC\n"); ++ return -1; ++ } ++ ++ crypto_blkcipher_setkey(tfm, key, keylen); ++ crypto_blkcipher_set_iv(tfm, iv, 16); ++ ++ sg_init_one(&sgd, out, messagelen); ++ sg_init_one(&sgs, message, messagelen); ++ ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ if (crypto_blkcipher_encrypt(&desc, &sgd, &sgs, messagelen)) { ++ crypto_free_blkcipher(tfm); ++ DWC_ERROR("AES CBC encryption failed"); ++ return -1; ++ } ++ ++ crypto_free_blkcipher(tfm); ++ return 0; ++} ++ ++int DWC_SHA256(uint8_t *message, uint32_t len, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for sha256: %ld\n", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, len); ++ crypto_hash_digest(&desc, &sg, len, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++ ++int DWC_HMAC_SHA256(uint8_t *message, uint32_t messagelen, ++ uint8_t *key, uint32_t keylen, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("hmac(sha256)", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for hmac(sha256): %ld\n", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, messagelen); ++ crypto_hash_setkey(tfm, key, keylen); ++ crypto_hash_digest(&desc, &sg, messagelen, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++#endif /* DWC_CRYPTOLIB */ ++ ++ ++/* Byte Ordering Conversions */ ++ ++uint32_t DWC_CPU_TO_LE32(uint32_t *p) +{ +#ifdef __LITTLE_ENDIAN -+ return *((uint32_t *)p); ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; + + return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); +#endif +} -+EXPORT_SYMBOL(DWC_CPU_TO_LE32); + -+uint32_t DWC_CPU_TO_BE32(void *p) ++uint32_t DWC_CPU_TO_BE32(uint32_t *p) +{ +#ifdef __BIG_ENDIAN -+ return *((uint32_t *)p); ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; + + return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); +#endif +} -+EXPORT_SYMBOL(DWC_CPU_TO_BE32); + -+uint32_t DWC_LE32_TO_CPU(void *p) ++uint32_t DWC_LE32_TO_CPU(uint32_t *p) +{ +#ifdef __LITTLE_ENDIAN -+ return *((uint32_t *)p); -+#else -+ uint8_t *u_p = (uint8_t *)p; -+ -+ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); -+ -+#endif -+} -+EXPORT_SYMBOL(DWC_LE32_TO_CPU); -+ -+uint32_t DWC_BE32_TO_CPU(void *p) -+{ -+#ifdef __BIG_ENDIAN -+ return *((uint32_t *)p); ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; + + return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); +#endif +} -+EXPORT_SYMBOL(DWC_BE32_TO_CPU); + -+uint16_t DWC_CPU_TO_LE16(void *p) -+{ -+#ifdef __LITTLE_ENDIAN -+ return *((uint16_t *)p); -+#else -+ uint8_t *u_p = (uint8_t *)p; -+ return (u_p[1] | (u_p[0] << 8)); -+#endif -+} -+EXPORT_SYMBOL(DWC_CPU_TO_LE16); -+ -+uint16_t DWC_CPU_TO_BE16(void *p) ++uint32_t DWC_BE32_TO_CPU(uint32_t *p) +{ +#ifdef __BIG_ENDIAN -+ return *((uint16_t *)p); ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; -+ return (u_p[1] | (u_p[0] << 8)); ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); +#endif +} -+EXPORT_SYMBOL(DWC_CPU_TO_BE16); + -+uint16_t DWC_LE16_TO_CPU(void *p) ++uint16_t DWC_CPU_TO_LE16(uint16_t *p) +{ +#ifdef __LITTLE_ENDIAN -+ return *((uint16_t *)p); ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; + return (u_p[1] | (u_p[0] << 8)); +#endif +} -+EXPORT_SYMBOL(DWC_LE16_TO_CPU); + -+uint16_t DWC_BE16_TO_CPU(void *p) ++uint16_t DWC_CPU_TO_BE16(uint16_t *p) +{ +#ifdef __BIG_ENDIAN -+ return *((uint16_t *p)p); ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_LE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_BE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; +#else + uint8_t *u_p = (uint8_t *)p; + return (u_p[1] | (u_p[0] << 8)); +#endif +} -+EXPORT_SYMBOL(DWC_BE16_TO_CPU); + + +/* Registers */ @@ -31681,7 +35585,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu +{ + return readl(reg); +} -+EXPORT_SYMBOL(DWC_READ_REG32); + +#if 0 +uint64_t DWC_READ_REG64(uint64_t volatile *reg) @@ -31693,7 +35596,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu +{ + writel(value, reg); +} -+EXPORT_SYMBOL(DWC_WRITE_REG32); + +#if 0 +void DWC_WRITE_REG64(uint64_t volatile *reg, uint64_t value) @@ -31703,216 +35605,33 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + +void DWC_MODIFY_REG32(uint32_t volatile *reg, uint32_t clear_mask, uint32_t set_mask) +{ -+ writel( (readl(reg) & ~clear_mask) | set_mask, reg ); ++ writel((readl(reg) & ~clear_mask) | set_mask, reg); +} -+EXPORT_SYMBOL(DWC_MODIFY_REG32); + +#if 0 -+void DWC_MODIFY_REG64(uint64_t volatile *reg, uint64_t value) ++void DWC_MODIFY_REG64(uint64_t volatile *reg, uint64_t clear_mask, uint64_t set_mask) +{ +} +#endif + + -+ -+/* Threading */ -+ -+typedef struct work_container -+{ -+ dwc_work_callback_t cb; -+ void *data; -+ dwc_workq_t *wq; -+ char *name; -+ -+#ifdef DEBUG -+ DWC_CIRCLEQ_ENTRY(work_container) entry; -+#endif -+ -+ struct delayed_work work; -+} work_container_t; -+ -+#ifdef DEBUG -+DWC_CIRCLEQ_HEAD(work_container_queue, work_container); -+#endif -+ -+struct dwc_workq -+{ -+ struct workqueue_struct *wq; -+ int pending; -+ dwc_spinlock_t *lock; -+ dwc_waitq_t *waitq; -+ -+#ifdef DEBUG -+ struct work_container_queue entries; -+#endif -+}; -+ -+static void do_work(struct work_struct *work) -+{ -+ int64_t flags; -+ struct delayed_work *dw = container_of(work, struct delayed_work, work); -+ work_container_t *container = container_of(dw, struct work_container, work); -+ dwc_workq_t *wq = container->wq; -+ -+ container->cb(container->data); -+ -+#ifdef DEBUG -+ DWC_CIRCLEQ_REMOVE(&wq->entries, container, entry); -+#endif -+ -+ if (container->name) { -+ DWC_DEBUG("Work done: %s, container=%p", -+ container->name, container); //GRAYG -+ DWC_FREE(container->name); -+ } -+ DWC_FREE(container); -+ -+ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); -+ wq->pending --; -+ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); -+ DWC_WAITQ_TRIGGER(wq->waitq); -+} -+ -+static int work_done(void *data) -+{ -+ dwc_workq_t *workq = (dwc_workq_t *)data; -+ return workq->pending == 0; -+} -+ -+int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout) -+{ -+ return DWC_WAITQ_WAIT_TIMEOUT(workq->waitq, work_done, workq, timeout); -+} -+EXPORT_SYMBOL(DWC_WORKQ_WAIT_WORK_DONE); -+ -+dwc_workq_t *DWC_WORKQ_ALLOC(char *name) -+{ -+ dwc_workq_t *wq = DWC_ALLOC(sizeof(*wq)); -+ wq->wq = create_singlethread_workqueue(name); -+ wq->pending = 0; -+ wq->lock = DWC_SPINLOCK_ALLOC(); -+ wq->waitq = DWC_WAITQ_ALLOC(); -+#ifdef DEBUG -+ DWC_CIRCLEQ_INIT(&wq->entries); -+#endif -+ return wq; -+} -+EXPORT_SYMBOL(DWC_WORKQ_ALLOC); -+ -+void DWC_WORKQ_FREE(dwc_workq_t *wq) -+{ -+#ifdef DEBUG -+ if (wq->pending != 0) { -+ struct work_container *wc; -+ DWC_ERROR("Destroying work queue with pending work"); -+ DWC_CIRCLEQ_FOREACH(wc, &wq->entries, entry) { -+ DWC_ERROR("Work %s still pending", wc->name); -+ } -+ } -+#endif -+ destroy_workqueue((struct workqueue_struct *)wq->wq); -+ DWC_SPINLOCK_FREE(wq->lock); -+ DWC_WAITQ_FREE(wq->waitq); -+ DWC_FREE(wq); -+} -+EXPORT_SYMBOL(DWC_WORKQ_FREE); -+ -+void DWC_WORKQ_SCHEDULE(dwc_workq_t *wq, dwc_work_callback_t work_cb, void *data, char *format, ...) -+{ -+ int64_t flags; -+ work_container_t *container; -+ static char name[128]; -+ -+ va_list args; -+ va_start(args, format); -+ if (format) -+ DWC_VSNPRINTF(name, 128, format, args); -+ va_end(args); -+ -+ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); -+ wq->pending ++; -+ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); -+ DWC_WAITQ_TRIGGER(wq->waitq); -+ -+ container = DWC_ALLOC_ATOMIC(sizeof(*container)); -+ -+ container->data = data; -+ container->cb = work_cb; -+ container->wq = wq; -+ if (format) { -+ container->name = DWC_STRDUP(name); -+ DWC_DEBUG("Queueing work: %s, contianer=%p", -+ container->name, container); -+ } else -+ container->name = NULL; -+ -+ INIT_WORK(&container->work.work, do_work); -+ -+#ifdef DEBUG -+ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); -+#endif -+ -+ queue_work(wq->wq, &container->work.work); -+ -+} -+EXPORT_SYMBOL(DWC_WORKQ_SCHEDULE); -+ -+void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *wq, dwc_work_callback_t work_cb, void *data, uint32_t time, char *format, ...) -+{ -+ int64_t flags; -+ work_container_t *container; -+ static char name[128]; -+ -+ va_list args; -+ va_start(args, format); -+ if (format) -+ DWC_VSNPRINTF(name, 128, format, args); -+ va_end(args); -+ -+ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); -+ wq->pending ++; -+ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); -+ DWC_WAITQ_TRIGGER(wq->waitq); -+ -+ container = DWC_ALLOC_ATOMIC(sizeof(*container)); -+ -+ container->data = data; -+ container->cb = work_cb; -+ container->wq = wq; -+ if (format) { //GRAYG -+ container->name = DWC_STRDUP(name); -+ DWC_DEBUG("Queueing work: %s, contianer=%p", -+ container->name, container); -+ } else -+ container->name = NULL; -+ INIT_DELAYED_WORK(&container->work, do_work); -+ -+#ifdef DEBUG -+ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); -+#endif -+ -+ queue_delayed_work(wq->wq, &container->work, msecs_to_jiffies(time)); -+ -+} -+EXPORT_SYMBOL(DWC_WORKQ_SCHEDULE_DELAYED); -+ -+ -+int DWC_WORKQ_PENDING(dwc_workq_t *wq) -+{ -+ return wq->pending; -+} -+EXPORT_SYMBOL(DWC_WORKQ_PENDING); ++/* Locking */ + +dwc_spinlock_t *DWC_SPINLOCK_ALLOC(void) +{ + spinlock_t *sl = (spinlock_t *)1; ++ +#if defined(CONFIG_PREEMPT) || defined(CONFIG_SMP) + sl = DWC_ALLOC(sizeof(*sl)); ++ if (!sl) { ++ DWC_ERROR("Cannot allocate memory for spinlock\n"); ++ return NULL; ++ } ++ + spin_lock_init(sl); +#endif + return (dwc_spinlock_t *)sl; +} -+EXPORT_SYMBOL(DWC_SPINLOCK_ALLOC); + +void DWC_SPINLOCK_FREE(dwc_spinlock_t *lock) +{ @@ -31920,7 +35639,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + DWC_FREE(lock); +#endif +} -+EXPORT_SYMBOL(DWC_SPINLOCK_FREE); + +void DWC_SPINLOCK(dwc_spinlock_t *lock) +{ @@ -31928,7 +35646,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + spin_lock((spinlock_t *)lock); +#endif +} -+EXPORT_SYMBOL(DWC_SPINLOCK); + +void DWC_SPINUNLOCK(dwc_spinlock_t *lock) +{ @@ -31936,39 +35653,42 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + spin_unlock((spinlock_t *)lock); +#endif +} -+EXPORT_SYMBOL(DWC_SPINUNLOCK); + -+void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, uint64_t *flags) ++void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, dwc_irqflags_t *flags) +{ -+ unsigned long f; ++ dwc_irqflags_t f; ++ +#if defined(CONFIG_PREEMPT) || defined(CONFIG_SMP) -+ spin_lock_irqsave((spinlock_t *)lock, f); ++ spin_lock_irqsave((spinlock_t *)lock, f); +#else + local_irq_save(f); +#endif -+ *flags = f; ++ *flags = f; +} -+EXPORT_SYMBOL(DWC_SPINLOCK_IRQSAVE); + -+void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, uint64_t flags) ++void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, dwc_irqflags_t flags) +{ +#if defined(CONFIG_PREEMPT) || defined(CONFIG_SMP) -+ spin_unlock_irqrestore((spinlock_t *)lock, flags); ++ spin_unlock_irqrestore((spinlock_t *)lock, flags); +#else -+ // in kernel 2.6.31, at least, we check for unsigned long -+ local_irq_restore((unsigned long)flags); ++ local_irq_restore(flags); +#endif +} -+EXPORT_SYMBOL(DWC_SPINUNLOCK_IRQRESTORE); + +dwc_mutex_t *DWC_MUTEX_ALLOC(void) +{ -+ dwc_mutex_t *mutex = (dwc_mutex_t*)DWC_ALLOC(sizeof(struct mutex)); -+ struct mutex *m = (struct mutex *)mutex; ++ struct mutex *m; ++ dwc_mutex_t *mutex = (dwc_mutex_t *)DWC_ALLOC(sizeof(struct mutex)); ++ ++ if (!mutex) { ++ DWC_ERROR("Cannot allocate memory for mutex\n"); ++ return NULL; ++ } ++ ++ m = (struct mutex *)mutex; + mutex_init(m); + return mutex; +} -+EXPORT_SYMBOL(DWC_MUTEX_ALLOC); + +#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) +#else @@ -31977,7 +35697,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + mutex_destroy((struct mutex *)mutex); + DWC_FREE(mutex); +} -+EXPORT_SYMBOL(DWC_MUTEX_FREE); +#endif + +void DWC_MUTEX_LOCK(dwc_mutex_t *mutex) @@ -31985,48 +35704,46 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + struct mutex *m = (struct mutex *)mutex; + mutex_lock(m); +} -+EXPORT_SYMBOL(DWC_MUTEX_LOCK); + +int DWC_MUTEX_TRYLOCK(dwc_mutex_t *mutex) +{ + struct mutex *m = (struct mutex *)mutex; + return mutex_trylock(m); +} -+EXPORT_SYMBOL(DWC_MUTEX_TRYLOCK); + +void DWC_MUTEX_UNLOCK(dwc_mutex_t *mutex) +{ + struct mutex *m = (struct mutex *)mutex; + mutex_unlock(m); +} -+EXPORT_SYMBOL(DWC_MUTEX_UNLOCK); + -+dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t thread_function, char *name, void *data) -+{ -+ struct task_struct *thread = kthread_run(thread_function, data, name); -+ if (thread == ERR_PTR(-ENOMEM)) { -+ return NULL; -+ } -+ return (dwc_thread_t *)thread; -+} -+EXPORT_SYMBOL(DWC_THREAD_RUN); + -+int DWC_THREAD_STOP(dwc_thread_t *thread) -+{ -+ return kthread_stop((struct task_struct *)thread); -+} -+EXPORT_SYMBOL(DWC_THREAD_STOP); ++/* Timing */ + -+dwc_bool_t DWC_THREAD_SHOULD_STOP() ++void DWC_UDELAY(uint32_t usecs) +{ -+ return kthread_should_stop(); ++ udelay(usecs); +} -+EXPORT_SYMBOL(DWC_THREAD_SHOULD_STOP); ++ ++void DWC_MDELAY(uint32_t msecs) ++{ ++ mdelay(msecs); ++} ++ ++void DWC_MSLEEP(uint32_t msecs) ++{ ++ msleep(msecs); ++} ++ ++uint32_t DWC_TIME(void) ++{ ++ return jiffies_to_msecs(jiffies); ++} ++ + +/* Timers */ + -+struct dwc_timer -+{ ++struct dwc_timer { + struct timer_list *t; + char *name; + dwc_timer_callback_t cb; @@ -32035,39 +35752,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + dwc_spinlock_t *lock; +}; + -+static void set_scheduled(dwc_timer_t *t, int s) -+{ -+ uint64_t flags; -+ DWC_SPINLOCK_IRQSAVE(t->lock, &flags); -+ t->scheduled = s; -+ DWC_SPINUNLOCK_IRQRESTORE(t->lock, flags); -+} -+ -+static int get_scheduled(dwc_timer_t *t) -+{ -+ int s; -+ uint64_t flags; -+ DWC_SPINLOCK_IRQSAVE(t->lock, &flags); -+ s = t->scheduled; -+ DWC_SPINUNLOCK_IRQRESTORE(t->lock, flags); -+ return s; -+} -+ +static void timer_callback(unsigned long data) +{ + dwc_timer_t *timer = (dwc_timer_t *)data; -+ set_scheduled(timer, 0); -+ /*DWC_DEBUG("Timer %s callback", timer->name);*/ ++ dwc_irqflags_t flags; ++ ++ DWC_SPINLOCK_IRQSAVE(timer->lock, &flags); ++ timer->scheduled = 0; ++ DWC_SPINUNLOCK_IRQRESTORE(timer->lock, flags); ++ DWC_DEBUGC("Timer %s callback", timer->name); + timer->cb(timer->data); +} + +dwc_timer_t *DWC_TIMER_ALLOC(char *name, dwc_timer_callback_t cb, void *data) +{ + dwc_timer_t *t = DWC_ALLOC(sizeof(*t)); ++ + if (!t) { + DWC_ERROR("Cannot allocate memory for timer"); + return NULL; + } ++ + t->t = DWC_ALLOC(sizeof(*t->t)); + if (!t->t) { + DWC_ERROR("Cannot allocate memory for timer->t"); @@ -32085,6 +35790,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + DWC_ERROR("Cannot allocate memory for lock"); + goto no_lock; + } ++ + t->scheduled = 0; + t->t->base = &boot_tvec_bases; + t->t->expires = jiffies; @@ -32103,46 +35809,179 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + DWC_FREE(t); + return NULL; +} -+EXPORT_SYMBOL(DWC_TIMER_ALLOC); + +void DWC_TIMER_FREE(dwc_timer_t *timer) +{ -+ if (get_scheduled(timer)) { ++ dwc_irqflags_t flags; ++ ++ DWC_SPINLOCK_IRQSAVE(timer->lock, &flags); ++ ++ if (timer->scheduled) { + del_timer(timer->t); ++ timer->scheduled = 0; + } + ++ DWC_SPINUNLOCK_IRQRESTORE(timer->lock, flags); + DWC_SPINLOCK_FREE(timer->lock); + DWC_FREE(timer->t); + DWC_FREE(timer->name); + DWC_FREE(timer); +} -+EXPORT_SYMBOL(DWC_TIMER_FREE); + +void DWC_TIMER_SCHEDULE(dwc_timer_t *timer, uint32_t time) +{ -+ if (!get_scheduled(timer)) { -+ set_scheduled(timer, 1); -+ //cgg: DWC_DEBUG("Scheduling timer %s to expire in +%d msec", timer->name, time); ++ dwc_irqflags_t flags; ++ ++ DWC_SPINLOCK_IRQSAVE(timer->lock, &flags); ++ ++ if (!timer->scheduled) { ++ timer->scheduled = 1; ++ DWC_DEBUGC("Scheduling timer %s to expire in +%d msec", timer->name, time); + timer->t->expires = jiffies + msecs_to_jiffies(time); + add_timer(timer->t); -+ } -+ else { -+ //cgg: DWC_DEBUG("Modifying timer %s to expire in +%d msec", timer->name, time); ++ } else { ++ DWC_DEBUGC("Modifying timer %s to expire in +%d msec", timer->name, time); + mod_timer(timer->t, jiffies + msecs_to_jiffies(time)); + } ++ ++ DWC_SPINUNLOCK_IRQRESTORE(timer->lock, flags); +} -+EXPORT_SYMBOL(DWC_TIMER_SCHEDULE); + +void DWC_TIMER_CANCEL(dwc_timer_t *timer) +{ + del_timer(timer->t); +} -+EXPORT_SYMBOL(DWC_TIMER_CANCEL); + -+struct dwc_tasklet ++ ++/* Wait Queues */ ++ ++struct dwc_waitq { ++ wait_queue_head_t queue; ++ int abort; ++}; ++ ++dwc_waitq_t *DWC_WAITQ_ALLOC(void) +{ ++ dwc_waitq_t *wq = DWC_ALLOC(sizeof(*wq)); ++ ++ if (!wq) { ++ DWC_ERROR("Cannot allocate memory for waitqueue\n"); ++ return NULL; ++ } ++ ++ init_waitqueue_head(&wq->queue); ++ wq->abort = 0; ++ return wq; ++} ++ ++void DWC_WAITQ_FREE(dwc_waitq_t *wq) ++{ ++ DWC_FREE(wq); ++} ++ ++int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, void *data) ++{ ++ int result = wait_event_interruptible(wq->queue, ++ cond(data) || wq->abort); ++ if (result == -ERESTARTSYS) { ++ wq->abort = 0; ++ return -DWC_E_RESTART; ++ } ++ ++ if (wq->abort == 1) { ++ wq->abort = 0; ++ return -DWC_E_ABORT; ++ } ++ ++ wq->abort = 0; ++ ++ if (result == 0) { ++ return 0; ++ } ++ ++ return -DWC_E_UNKNOWN; ++} ++ ++int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, ++ void *data, int32_t msecs) ++{ ++ int32_t tmsecs; ++ int result = wait_event_interruptible_timeout(wq->queue, ++ cond(data) || wq->abort, ++ msecs_to_jiffies(msecs)); ++ if (result == -ERESTARTSYS) { ++ wq->abort = 0; ++ return -DWC_E_RESTART; ++ } ++ ++ if (wq->abort == 1) { ++ wq->abort = 0; ++ return -DWC_E_ABORT; ++ } ++ ++ wq->abort = 0; ++ ++ if (result > 0) { ++ tmsecs = jiffies_to_msecs(result); ++ if (!tmsecs) { ++ return 1; ++ } ++ ++ return tmsecs; ++ } ++ ++ if (result == 0) { ++ return -DWC_E_TIMEOUT; ++ } ++ ++ return -DWC_E_UNKNOWN; ++} ++ ++void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq) ++{ ++ wq->abort = 0; ++ wake_up_interruptible(&wq->queue); ++} ++ ++void DWC_WAITQ_ABORT(dwc_waitq_t *wq) ++{ ++ wq->abort = 1; ++ wake_up_interruptible(&wq->queue); ++} ++ ++ ++/* Threading */ ++ ++dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t func, char *name, void *data) ++{ ++ struct task_struct *thread = kthread_run(func, data, name); ++ ++ if (thread == ERR_PTR(-ENOMEM)) { ++ return NULL; ++ } ++ ++ return (dwc_thread_t *)thread; ++} ++ ++int DWC_THREAD_STOP(dwc_thread_t *thread) ++{ ++ return kthread_stop((struct task_struct *)thread); ++} ++ ++dwc_bool_t DWC_THREAD_SHOULD_STOP(void) ++{ ++ return kthread_should_stop(); ++} ++ ++ ++/* tasklets ++ - run in interrupt context (cannot sleep) ++ - each tasklet runs on a single CPU ++ - different tasklets can be running simultaneously on different CPUs ++ */ ++struct dwc_tasklet { + struct tasklet_struct t; -+ dwc_tasklet_callback_t cb; ++ dwc_tasklet_callback_t cb; + void *data; +}; + @@ -32152,139 +35991,2586 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_common_linux.c linu + t->cb(t->data); +} + -+dwc_tasklet_t *DWC_TASK_ALLOC(dwc_tasklet_callback_t cb, void *data) ++dwc_tasklet_t *DWC_TASK_ALLOC(char *name, dwc_tasklet_callback_t cb, void *data) +{ + dwc_tasklet_t *t = DWC_ALLOC(sizeof(*t)); -+ -+ if(t) { -+ t->data = data; ++ ++ if (t) { + t->cb = cb; ++ t->data = data; + tasklet_init(&t->t, tasklet_callback, (unsigned long)t); + } else { + DWC_ERROR("Cannot allocate memory for tasklet\n"); + } -+ ++ + return t; +} -+EXPORT_SYMBOL(DWC_TASK_ALLOC); + -+void DWC_TASK_FREE(dwc_tasklet_t *t) ++void DWC_TASK_FREE(dwc_tasklet_t *task) +{ -+ DWC_FREE(t); ++ DWC_FREE(task); +} -+EXPORT_SYMBOL(DWC_TASK_FREE); + +void DWC_TASK_SCHEDULE(dwc_tasklet_t *task) +{ + tasklet_schedule(&task->t); +} ++ ++ ++/* workqueues ++ - run in process context (can sleep) ++ */ ++typedef struct work_container { ++ dwc_work_callback_t cb; ++ void *data; ++ dwc_workq_t *wq; ++ char *name; ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_ENTRY(work_container) entry; ++#endif ++ struct delayed_work work; ++} work_container_t; ++ ++#ifdef DEBUG ++DWC_CIRCLEQ_HEAD(work_container_queue, work_container); ++#endif ++ ++struct dwc_workq { ++ struct workqueue_struct *wq; ++ dwc_spinlock_t *lock; ++ dwc_waitq_t *waitq; ++ int pending; ++ ++#ifdef DEBUG ++ struct work_container_queue entries; ++#endif ++}; ++ ++static void do_work(struct work_struct *work) ++{ ++ dwc_irqflags_t flags; ++ struct delayed_work *dw = container_of(work, struct delayed_work, work); ++ work_container_t *container = container_of(dw, struct work_container, work); ++ dwc_workq_t *wq = container->wq; ++ ++ container->cb(container->data); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_REMOVE(&wq->entries, container, entry); ++#endif ++ DWC_DEBUGC("Work done: %s, container=%p", container->name, container); ++ if (container->name) { ++ DWC_FREE(container->name); ++ } ++ DWC_FREE(container); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending--; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++} ++ ++static int work_done(void *data) ++{ ++ dwc_workq_t *workq = (dwc_workq_t *)data; ++ return workq->pending == 0; ++} ++ ++int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout) ++{ ++ return DWC_WAITQ_WAIT_TIMEOUT(workq->waitq, work_done, workq, timeout); ++} ++ ++dwc_workq_t *DWC_WORKQ_ALLOC(char *name) ++{ ++ dwc_workq_t *wq = DWC_ALLOC(sizeof(*wq)); ++ ++ if (!wq) { ++ return NULL; ++ } ++ ++ wq->wq = create_singlethread_workqueue(name); ++ if (!wq->wq) { ++ goto no_wq; ++ } ++ ++ wq->pending = 0; ++ ++ wq->lock = DWC_SPINLOCK_ALLOC(); ++ if (!wq->lock) { ++ goto no_lock; ++ } ++ ++ wq->waitq = DWC_WAITQ_ALLOC(); ++ if (!wq->waitq) { ++ goto no_waitq; ++ } ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INIT(&wq->entries); ++#endif ++ return wq; ++ ++ no_waitq: ++ DWC_SPINLOCK_FREE(wq->lock); ++ no_lock: ++ destroy_workqueue(wq->wq); ++ no_wq: ++ DWC_FREE(wq); ++ ++ return NULL; ++} ++ ++void DWC_WORKQ_FREE(dwc_workq_t *wq) ++{ ++#ifdef DEBUG ++ if (wq->pending != 0) { ++ struct work_container *wc; ++ DWC_ERROR("Destroying work queue with pending work"); ++ DWC_CIRCLEQ_FOREACH(wc, &wq->entries, entry) { ++ DWC_ERROR("Work %s still pending", wc->name); ++ } ++ } ++#endif ++ destroy_workqueue(wq->wq); ++ DWC_SPINLOCK_FREE(wq->lock); ++ DWC_WAITQ_FREE(wq->waitq); ++ DWC_FREE(wq); ++} ++ ++void DWC_WORKQ_SCHEDULE(dwc_workq_t *wq, dwc_work_callback_t cb, void *data, ++ char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container\n"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name\n"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ DWC_DEBUGC("Queueing work: %s, container=%p", container->name, container); ++ INIT_WORK(&container->work.work, do_work); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); ++#endif ++ queue_work(wq->wq, &container->work.work); ++} ++ ++void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *wq, dwc_work_callback_t cb, ++ void *data, uint32_t time, char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container\n"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name\n"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ DWC_DEBUGC("Queueing work: %s, container=%p", container->name, container); ++ INIT_DELAYED_WORK(&container->work, do_work); ++ ++#ifdef DEBUG ++ DWC_CIRCLEQ_INSERT_TAIL(&wq->entries, container, entry); ++#endif ++ queue_delayed_work(wq->wq, &container->work, msecs_to_jiffies(time)); ++} ++ ++int DWC_WORKQ_PENDING(dwc_workq_t *wq) ++{ ++ return wq->pending; ++} ++ ++ ++#ifdef DWC_LIBMODULE ++ ++#ifdef DWC_CCLIB ++/* CC */ ++EXPORT_SYMBOL(dwc_cc_if_alloc); ++EXPORT_SYMBOL(dwc_cc_if_free); ++EXPORT_SYMBOL(dwc_cc_clear); ++EXPORT_SYMBOL(dwc_cc_add); ++EXPORT_SYMBOL(dwc_cc_remove); ++EXPORT_SYMBOL(dwc_cc_change); ++EXPORT_SYMBOL(dwc_cc_data_for_save); ++EXPORT_SYMBOL(dwc_cc_restore_from_data); ++EXPORT_SYMBOL(dwc_cc_match_chid); ++EXPORT_SYMBOL(dwc_cc_match_cdid); ++EXPORT_SYMBOL(dwc_cc_ck); ++EXPORT_SYMBOL(dwc_cc_chid); ++EXPORT_SYMBOL(dwc_cc_cdid); ++EXPORT_SYMBOL(dwc_cc_name); ++#endif /* DWC_CCLIB */ ++ ++#ifdef DWC_CRYPTOLIB ++# ifndef CONFIG_MACH_IPMATE ++/* Modpow */ ++EXPORT_SYMBOL(dwc_modpow); ++ ++/* DH */ ++EXPORT_SYMBOL(dwc_dh_modpow); ++EXPORT_SYMBOL(dwc_dh_derive_keys); ++EXPORT_SYMBOL(dwc_dh_pk); ++# endif /* CONFIG_MACH_IPMATE */ ++ ++/* Crypto */ ++EXPORT_SYMBOL(dwc_wusb_aes_encrypt); ++EXPORT_SYMBOL(dwc_wusb_cmf); ++EXPORT_SYMBOL(dwc_wusb_prf); ++EXPORT_SYMBOL(dwc_wusb_fill_ccm_nonce); ++EXPORT_SYMBOL(dwc_wusb_gen_nonce); ++EXPORT_SYMBOL(dwc_wusb_gen_key); ++EXPORT_SYMBOL(dwc_wusb_gen_mic); ++#endif /* DWC_CRYPTOLIB */ ++ ++/* Notification */ ++#ifdef DWC_NOTIFYLIB ++EXPORT_SYMBOL(dwc_alloc_notification_manager); ++EXPORT_SYMBOL(dwc_free_notification_manager); ++EXPORT_SYMBOL(dwc_register_notifier); ++EXPORT_SYMBOL(dwc_unregister_notifier); ++EXPORT_SYMBOL(dwc_add_observer); ++EXPORT_SYMBOL(dwc_remove_observer); ++EXPORT_SYMBOL(dwc_notify); ++#endif ++ ++/* Memory Debugging Routines */ ++#ifdef DWC_DEBUG_MEMORY ++EXPORT_SYMBOL(dwc_alloc_debug); ++EXPORT_SYMBOL(dwc_alloc_atomic_debug); ++EXPORT_SYMBOL(dwc_free_debug); ++EXPORT_SYMBOL(dwc_dma_alloc_debug); ++EXPORT_SYMBOL(dwc_dma_free_debug); ++#endif ++ ++EXPORT_SYMBOL(DWC_MEMSET); ++EXPORT_SYMBOL(DWC_MEMCPY); ++EXPORT_SYMBOL(DWC_MEMMOVE); ++EXPORT_SYMBOL(DWC_MEMCMP); ++EXPORT_SYMBOL(DWC_STRNCMP); ++EXPORT_SYMBOL(DWC_STRCMP); ++EXPORT_SYMBOL(DWC_STRLEN); ++EXPORT_SYMBOL(DWC_STRCPY); ++EXPORT_SYMBOL(DWC_STRDUP); ++EXPORT_SYMBOL(DWC_ATOI); ++EXPORT_SYMBOL(DWC_ATOUI); ++ ++#ifdef DWC_UTFLIB ++EXPORT_SYMBOL(DWC_UTF8_TO_UTF16LE); ++#endif /* DWC_UTFLIB */ ++ ++EXPORT_SYMBOL(DWC_IN_IRQ); ++EXPORT_SYMBOL(DWC_IN_BH); ++EXPORT_SYMBOL(DWC_VPRINTF); ++EXPORT_SYMBOL(DWC_VSNPRINTF); ++EXPORT_SYMBOL(DWC_PRINTF); ++EXPORT_SYMBOL(DWC_SPRINTF); ++EXPORT_SYMBOL(DWC_SNPRINTF); ++EXPORT_SYMBOL(__DWC_WARN); ++EXPORT_SYMBOL(__DWC_ERROR); ++EXPORT_SYMBOL(DWC_EXCEPTION); ++ ++#ifdef DEBUG ++EXPORT_SYMBOL(__DWC_DEBUG); ++#endif ++ ++EXPORT_SYMBOL(__DWC_DMA_ALLOC); ++EXPORT_SYMBOL(__DWC_DMA_ALLOC_ATOMIC); ++EXPORT_SYMBOL(__DWC_DMA_FREE); ++EXPORT_SYMBOL(__DWC_ALLOC); ++EXPORT_SYMBOL(__DWC_ALLOC_ATOMIC); ++EXPORT_SYMBOL(__DWC_FREE); ++ ++#ifdef DWC_CRYPTOLIB ++EXPORT_SYMBOL(DWC_RANDOM_BYTES); ++EXPORT_SYMBOL(DWC_AES_CBC); ++EXPORT_SYMBOL(DWC_SHA256); ++EXPORT_SYMBOL(DWC_HMAC_SHA256); ++#endif ++ ++EXPORT_SYMBOL(DWC_CPU_TO_LE32); ++EXPORT_SYMBOL(DWC_CPU_TO_BE32); ++EXPORT_SYMBOL(DWC_LE32_TO_CPU); ++EXPORT_SYMBOL(DWC_BE32_TO_CPU); ++EXPORT_SYMBOL(DWC_CPU_TO_LE16); ++EXPORT_SYMBOL(DWC_CPU_TO_BE16); ++EXPORT_SYMBOL(DWC_LE16_TO_CPU); ++EXPORT_SYMBOL(DWC_BE16_TO_CPU); ++EXPORT_SYMBOL(DWC_READ_REG32); ++EXPORT_SYMBOL(DWC_WRITE_REG32); ++EXPORT_SYMBOL(DWC_MODIFY_REG32); ++ ++#if 0 ++EXPORT_SYMBOL(DWC_READ_REG64); ++EXPORT_SYMBOL(DWC_WRITE_REG64); ++EXPORT_SYMBOL(DWC_MODIFY_REG64); ++#endif ++ ++EXPORT_SYMBOL(DWC_SPINLOCK_ALLOC); ++EXPORT_SYMBOL(DWC_SPINLOCK_FREE); ++EXPORT_SYMBOL(DWC_SPINLOCK); ++EXPORT_SYMBOL(DWC_SPINUNLOCK); ++EXPORT_SYMBOL(DWC_SPINLOCK_IRQSAVE); ++EXPORT_SYMBOL(DWC_SPINUNLOCK_IRQRESTORE); ++EXPORT_SYMBOL(DWC_MUTEX_ALLOC); ++ ++#if (!defined(DWC_LINUX) || !defined(CONFIG_DEBUG_MUTEXES)) ++EXPORT_SYMBOL(DWC_MUTEX_FREE); ++#endif ++ ++EXPORT_SYMBOL(DWC_MUTEX_LOCK); ++EXPORT_SYMBOL(DWC_MUTEX_TRYLOCK); ++EXPORT_SYMBOL(DWC_MUTEX_UNLOCK); ++EXPORT_SYMBOL(DWC_UDELAY); ++EXPORT_SYMBOL(DWC_MDELAY); ++EXPORT_SYMBOL(DWC_MSLEEP); ++EXPORT_SYMBOL(DWC_TIME); ++EXPORT_SYMBOL(DWC_TIMER_ALLOC); ++EXPORT_SYMBOL(DWC_TIMER_FREE); ++EXPORT_SYMBOL(DWC_TIMER_SCHEDULE); ++EXPORT_SYMBOL(DWC_TIMER_CANCEL); ++EXPORT_SYMBOL(DWC_WAITQ_ALLOC); ++EXPORT_SYMBOL(DWC_WAITQ_FREE); ++EXPORT_SYMBOL(DWC_WAITQ_WAIT); ++EXPORT_SYMBOL(DWC_WAITQ_WAIT_TIMEOUT); ++EXPORT_SYMBOL(DWC_WAITQ_TRIGGER); ++EXPORT_SYMBOL(DWC_WAITQ_ABORT); ++EXPORT_SYMBOL(DWC_THREAD_RUN); ++EXPORT_SYMBOL(DWC_THREAD_STOP); ++EXPORT_SYMBOL(DWC_THREAD_SHOULD_STOP); ++EXPORT_SYMBOL(DWC_TASK_ALLOC); ++EXPORT_SYMBOL(DWC_TASK_FREE); +EXPORT_SYMBOL(DWC_TASK_SCHEDULE); ++EXPORT_SYMBOL(DWC_WORKQ_WAIT_WORK_DONE); ++EXPORT_SYMBOL(DWC_WORKQ_ALLOC); ++EXPORT_SYMBOL(DWC_WORKQ_FREE); ++EXPORT_SYMBOL(DWC_WORKQ_SCHEDULE); ++EXPORT_SYMBOL(DWC_WORKQ_SCHEDULE_DELAYED); ++EXPORT_SYMBOL(DWC_WORKQ_PENDING); ++ ++static int dwc_common_port_init_module(void) ++{ ++ int result = 0; ++ ++ printk(KERN_DEBUG "Module dwc_common_port init\n" ); ++ ++#ifdef DWC_DEBUG_MEMORY ++ result = dwc_memory_debug_start(NULL); ++ if (result) { ++ printk(KERN_ERR ++ "dwc_memory_debug_start() failed with error %d\n", ++ result); ++ return result; ++ } ++#endif ++ ++#ifdef DWC_NOTIFYLIB ++ result = dwc_alloc_notification_manager(NULL, NULL); ++ if (result) { ++ printk(KERN_ERR ++ "dwc_alloc_notification_manager() failed with error %d\n", ++ result); ++ return result; ++ } ++#endif ++ return result; ++} ++ ++static void dwc_common_port_exit_module(void) ++{ ++ printk(KERN_DEBUG "Module dwc_common_port exit\n" ); ++ ++#ifdef DWC_NOTIFYLIB ++ dwc_free_notification_manager(); ++#endif ++ ++#ifdef DWC_DEBUG_MEMORY ++ dwc_memory_debug_stop(); ++#endif ++} ++ ++module_init(dwc_common_port_init_module); ++module_exit(dwc_common_port_exit_module); ++ ++MODULE_DESCRIPTION("DWC Common Library - Portable version"); ++MODULE_AUTHOR("Synopsys Inc."); ++MODULE_LICENSE ("GPL"); ++ ++#endif /* DWC_LIBMODULE */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c b/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c +new file mode 100644 +index 0000000..49b07e1 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c +@@ -0,0 +1,1275 @@ ++#include "dwc_os.h" ++#include "dwc_list.h" ++ ++#ifdef DWC_CCLIB ++# include "dwc_cc.h" ++#endif ++ ++#ifdef DWC_CRYPTOLIB ++# include "dwc_modpow.h" ++# include "dwc_dh.h" ++# include "dwc_crypto.h" ++#endif ++ ++#ifdef DWC_NOTIFYLIB ++# include "dwc_notifier.h" ++#endif ++ ++/* OS-Level Implementations */ ++ ++/* This is the NetBSD 4.0.1 kernel implementation of the DWC platform library. */ ++ ++ ++/* MISC */ ++ ++void *DWC_MEMSET(void *dest, uint8_t byte, uint32_t size) ++{ ++ return memset(dest, byte, size); ++} ++ ++void *DWC_MEMCPY(void *dest, void const *src, uint32_t size) ++{ ++ return memcpy(dest, src, size); ++} ++ ++void *DWC_MEMMOVE(void *dest, void *src, uint32_t size) ++{ ++ bcopy(src, dest, size); ++ return dest; ++} ++ ++int DWC_MEMCMP(void *m1, void *m2, uint32_t size) ++{ ++ return memcmp(m1, m2, size); ++} ++ ++int DWC_STRNCMP(void *s1, void *s2, uint32_t size) ++{ ++ return strncmp(s1, s2, size); ++} ++ ++int DWC_STRCMP(void *s1, void *s2) ++{ ++ return strcmp(s1, s2); ++} ++ ++int DWC_STRLEN(char const *str) ++{ ++ return strlen(str); ++} ++ ++char *DWC_STRCPY(char *to, char const *from) ++{ ++ return strcpy(to, from); ++} ++ ++char *DWC_STRDUP(char const *str) ++{ ++ int len = DWC_STRLEN(str) + 1; ++ char *new = DWC_ALLOC_ATOMIC(len); ++ ++ if (!new) { ++ return NULL; ++ } ++ ++ DWC_MEMCPY(new, str, len); ++ return new; ++} ++ ++int DWC_ATOI(char *str, int32_t *value) ++{ ++ char *end = NULL; ++ ++ /* NetBSD doesn't have 'strtol' in the kernel, but 'strtoul' ++ * should be equivalent on 2's complement machines ++ */ ++ *value = strtoul(str, &end, 0); ++ if (*end == '\0') { ++ return 0; ++ } ++ ++ return -1; ++} ++ ++int DWC_ATOUI(char *str, uint32_t *value) ++{ ++ char *end = NULL; ++ ++ *value = strtoul(str, &end, 0); ++ if (*end == '\0') { ++ return 0; ++ } ++ ++ return -1; ++} ++ ++ ++#ifdef DWC_UTFLIB ++/* From usbstring.c */ ++ ++int DWC_UTF8_TO_UTF16LE(uint8_t const *s, uint16_t *cp, unsigned len) ++{ ++ int count = 0; ++ u8 c; ++ u16 uchar; ++ ++ /* this insists on correct encodings, though not minimal ones. ++ * BUT it currently rejects legit 4-byte UTF-8 code points, ++ * which need surrogate pairs. (Unicode 3.1 can use them.) ++ */ ++ while (len != 0 && (c = (u8) *s++) != 0) { ++ if (unlikely(c & 0x80)) { ++ // 2-byte sequence: ++ // 00000yyyyyxxxxxx = 110yyyyy 10xxxxxx ++ if ((c & 0xe0) == 0xc0) { ++ uchar = (c & 0x1f) << 6; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c; ++ ++ // 3-byte sequence (most CJKV characters): ++ // zzzzyyyyyyxxxxxx = 1110zzzz 10yyyyyy 10xxxxxx ++ } else if ((c & 0xf0) == 0xe0) { ++ uchar = (c & 0x0f) << 12; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c << 6; ++ ++ c = (u8) *s++; ++ if ((c & 0xc0) != 0xc0) ++ goto fail; ++ c &= 0x3f; ++ uchar |= c; ++ ++ /* no bogus surrogates */ ++ if (0xd800 <= uchar && uchar <= 0xdfff) ++ goto fail; ++ ++ // 4-byte sequence (surrogate pairs, currently rare): ++ // 11101110wwwwzzzzyy + 110111yyyyxxxxxx ++ // = 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx ++ // (uuuuu = wwww + 1) ++ // FIXME accept the surrogate code points (only) ++ } else ++ goto fail; ++ } else ++ uchar = c; ++ put_unaligned (cpu_to_le16 (uchar), cp++); ++ count++; ++ len--; ++ } ++ return count; ++fail: ++ return -1; ++} ++ ++#endif /* DWC_UTFLIB */ ++ ++ ++/* dwc_debug.h */ ++ ++dwc_bool_t DWC_IN_IRQ(void) ++{ ++// return in_irq(); ++ return 0; ++} ++ ++dwc_bool_t DWC_IN_BH(void) ++{ ++// return in_softirq(); ++ return 0; ++} ++ ++void DWC_VPRINTF(char *format, va_list args) ++{ ++ vprintf(format, args); ++} ++ ++int DWC_VSNPRINTF(char *str, int size, char *format, va_list args) ++{ ++ return vsnprintf(str, size, format, args); ++} ++ ++void DWC_PRINTF(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++int DWC_SPRINTF(char *buffer, char *format, ...) ++{ ++ int retval; ++ va_list args; ++ ++ va_start(args, format); ++ retval = vsprintf(buffer, format, args); ++ va_end(args); ++ return retval; ++} ++ ++int DWC_SNPRINTF(char *buffer, int size, char *format, ...) ++{ ++ int retval; ++ va_list args; ++ ++ va_start(args, format); ++ retval = vsnprintf(buffer, size, format, args); ++ va_end(args); ++ return retval; ++} ++ ++void __DWC_WARN(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++void __DWC_ERROR(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++ ++void DWC_EXCEPTION(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++// BUG_ON(1); ??? ++} ++ ++#ifdef DEBUG ++void __DWC_DEBUG(char *format, ...) ++{ ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VPRINTF(format, args); ++ va_end(args); ++} ++#endif ++ ++ ++/* dwc_mem.h */ ++ ++#if 0 ++dwc_pool_t *DWC_DMA_POOL_CREATE(uint32_t size, ++ uint32_t align, ++ uint32_t alloc) ++{ ++ struct dma_pool *pool = dma_pool_create("Pool", NULL, ++ size, align, alloc); ++ return (dwc_pool_t *)pool; ++} ++ ++void DWC_DMA_POOL_DESTROY(dwc_pool_t *pool) ++{ ++ dma_pool_destroy((struct dma_pool *)pool); ++} ++ ++void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, uint64_t *dma_addr) ++{ ++// return dma_pool_alloc((struct dma_pool *)pool, GFP_KERNEL, dma_addr); ++ return dma_pool_alloc((struct dma_pool *)pool, M_WAITOK, dma_addr); ++} ++ ++void *DWC_DMA_POOL_ZALLOC(dwc_pool_t *pool, uint64_t *dma_addr) ++{ ++ void *vaddr = DWC_DMA_POOL_ALLOC(pool, dma_addr); ++ memset(..); ++} ++ ++void DWC_DMA_POOL_FREE(dwc_pool_t *pool, void *vaddr, void *daddr) ++{ ++ dma_pool_free(pool, vaddr, daddr); ++} ++#endif ++ ++void *__DWC_DMA_ALLOC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr) ++{ ++ dwc_dmactx_t *dma = (dwc_dmactx_t *)dma_ctx; ++ int error; ++ ++ error = bus_dmamem_alloc(dma->dma_tag, size, 1, size, dma->segs, ++ sizeof(dma->segs) / sizeof(dma->segs[0]), ++ &dma->nsegs, BUS_DMA_NOWAIT); ++ if (error) { ++ printf("%s: bus_dmamem_alloc(%ju) failed: %d\n", __func__, ++ (uintmax_t)size, error); ++ goto fail_0; ++ } ++ ++ error = bus_dmamem_map(dma->dma_tag, dma->segs, dma->nsegs, size, ++ (caddr_t *)&dma->dma_vaddr, ++ BUS_DMA_NOWAIT | BUS_DMA_COHERENT); ++ if (error) { ++ printf("%s: bus_dmamem_map failed: %d\n", __func__, error); ++ goto fail_1; ++ } ++ ++ error = bus_dmamap_create(dma->dma_tag, size, 1, size, 0, ++ BUS_DMA_NOWAIT, &dma->dma_map); ++ if (error) { ++ printf("%s: bus_dmamap_create failed: %d\n", __func__, error); ++ goto fail_2; ++ } ++ ++ error = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr, ++ size, NULL, BUS_DMA_NOWAIT); ++ if (error) { ++ printf("%s: bus_dmamap_load failed: %d\n", __func__, error); ++ goto fail_3; ++ } ++ ++ dma->dma_paddr = (bus_addr_t)dma->segs[0].ds_addr; ++ *dma_addr = dma->dma_paddr; ++ return dma->dma_vaddr; ++ ++fail_3: ++ bus_dmamap_destroy(dma->dma_tag, dma->dma_map); ++fail_2: ++ bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size); ++fail_1: ++ bus_dmamem_free(dma->dma_tag, dma->segs, dma->nsegs); ++fail_0: ++ dma->dma_map = NULL; ++ dma->dma_vaddr = NULL; ++ dma->nsegs = 0; ++ ++ return NULL; ++} ++ ++void __DWC_DMA_FREE(void *dma_ctx, uint32_t size, void *virt_addr, dwc_dma_t dma_addr) ++{ ++ dwc_dmactx_t *dma = (dwc_dmactx_t *)dma_ctx; ++ ++ if (dma->dma_map != NULL) { ++ bus_dmamap_sync(dma->dma_tag, dma->dma_map, 0, size, ++ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); ++ bus_dmamap_unload(dma->dma_tag, dma->dma_map); ++ bus_dmamap_destroy(dma->dma_tag, dma->dma_map); ++ bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size); ++ bus_dmamem_free(dma->dma_tag, dma->segs, dma->nsegs); ++ dma->dma_paddr = 0; ++ dma->dma_map = NULL; ++ dma->dma_vaddr = NULL; ++ dma->nsegs = 0; ++ } ++} ++ ++void *__DWC_ALLOC(void *mem_ctx, uint32_t size) ++{ ++ return malloc(size, M_DEVBUF, M_WAITOK | M_ZERO); ++} ++ ++void *__DWC_ALLOC_ATOMIC(void *mem_ctx, uint32_t size) ++{ ++ return malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); ++} ++ ++void __DWC_FREE(void *mem_ctx, void *addr) ++{ ++ free(addr, M_DEVBUF); ++} ++ ++ ++#ifdef DWC_CRYPTOLIB ++/* dwc_crypto.h */ ++ ++void DWC_RANDOM_BYTES(uint8_t *buffer, uint32_t length) ++{ ++ get_random_bytes(buffer, length); ++} ++ ++int DWC_AES_CBC(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t iv[16], uint8_t *out) ++{ ++ struct crypto_blkcipher *tfm; ++ struct blkcipher_desc desc; ++ struct scatterlist sgd; ++ struct scatterlist sgs; ++ ++ tfm = crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC); ++ if (tfm == NULL) { ++ printk("failed to load transform for aes CBC\n"); ++ return -1; ++ } ++ ++ crypto_blkcipher_setkey(tfm, key, keylen); ++ crypto_blkcipher_set_iv(tfm, iv, 16); ++ ++ sg_init_one(&sgd, out, messagelen); ++ sg_init_one(&sgs, message, messagelen); ++ ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ if (crypto_blkcipher_encrypt(&desc, &sgd, &sgs, messagelen)) { ++ crypto_free_blkcipher(tfm); ++ DWC_ERROR("AES CBC encryption failed"); ++ return -1; ++ } ++ ++ crypto_free_blkcipher(tfm); ++ return 0; ++} ++ ++int DWC_SHA256(uint8_t *message, uint32_t len, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for sha256: %ld", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, len); ++ crypto_hash_digest(&desc, &sg, len, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++ ++int DWC_HMAC_SHA256(uint8_t *message, uint32_t messagelen, ++ uint8_t *key, uint32_t keylen, uint8_t *out) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg; ++ ++ tfm = crypto_alloc_hash("hmac(sha256)", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ DWC_ERROR("Failed to load transform for hmac(sha256): %ld", PTR_ERR(tfm)); ++ return 0; ++ } ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ sg_init_one(&sg, message, messagelen); ++ crypto_hash_setkey(tfm, key, keylen); ++ crypto_hash_digest(&desc, &sg, messagelen, out); ++ crypto_free_hash(tfm); ++ ++ return 1; ++} ++ ++#endif /* DWC_CRYPTOLIB */ ++ ++ ++/* Byte Ordering Conversions */ ++ ++uint32_t DWC_CPU_TO_LE32(uint32_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_CPU_TO_BE32(uint32_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_LE32_TO_CPU(uint32_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint32_t DWC_BE32_TO_CPU(uint32_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ ++ return (u_p[3] | (u_p[2] << 8) | (u_p[1] << 16) | (u_p[0] << 24)); ++#endif ++} ++ ++uint16_t DWC_CPU_TO_LE16(uint16_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_CPU_TO_BE16(uint16_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_LE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __LITTLE_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++uint16_t DWC_BE16_TO_CPU(uint16_t *p) ++{ ++#ifdef __BIG_ENDIAN ++ return *p; ++#else ++ uint8_t *u_p = (uint8_t *)p; ++ return (u_p[1] | (u_p[0] << 8)); ++#endif ++} ++ ++ ++/* Registers */ ++ ++uint32_t DWC_READ_REG32(void *io_ctx, uint32_t volatile *reg) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ return bus_space_read_4(io->iot, io->ioh, ior); ++} ++ ++#if 0 ++uint64_t DWC_READ_REG64(void *io_ctx, uint64_t volatile *reg) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ return bus_space_read_8(io->iot, io->ioh, ior); ++} ++#endif ++ ++void DWC_WRITE_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t value) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_4(io->iot, io->ioh, ior, value); ++} ++ ++#if 0 ++void DWC_WRITE_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t value) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_8(io->iot, io->ioh, ior, value); ++} ++#endif ++ ++void DWC_MODIFY_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t clear_mask, ++ uint32_t set_mask) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_4(io->iot, io->ioh, ior, ++ (bus_space_read_4(io->iot, io->ioh, ior) & ++ ~clear_mask) | set_mask); ++} ++ ++#if 0 ++void DWC_MODIFY_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t clear_mask, ++ uint64_t set_mask) ++{ ++ dwc_ioctx_t *io = (dwc_ioctx_t *)io_ctx; ++ bus_size_t ior = (bus_size_t)reg; ++ ++ bus_space_write_8(io->iot, io->ioh, ior, ++ (bus_space_read_8(io->iot, io->ioh, ior) & ++ ~clear_mask) | set_mask); ++} ++#endif ++ ++ ++/* Locking */ ++ ++dwc_spinlock_t *DWC_SPINLOCK_ALLOC(void) ++{ ++ struct simplelock *sl = DWC_ALLOC(sizeof(*sl)); ++ ++ if (!sl) { ++ DWC_ERROR("Cannot allocate memory for spinlock"); ++ return NULL; ++ } ++ ++ simple_lock_init(sl); ++ return (dwc_spinlock_t *)sl; ++} ++ ++void DWC_SPINLOCK_FREE(dwc_spinlock_t *lock) ++{ ++ struct simplelock *sl = (struct simplelock *)lock; ++ ++ DWC_FREE(sl); ++} ++ ++void DWC_SPINLOCK(dwc_spinlock_t *lock) ++{ ++ simple_lock((struct simplelock *)lock); ++} ++ ++void DWC_SPINUNLOCK(dwc_spinlock_t *lock) ++{ ++ simple_unlock((struct simplelock *)lock); ++} ++ ++void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, dwc_irqflags_t *flags) ++{ ++ simple_lock((struct simplelock *)lock); ++ *flags = splbio(); ++} ++ ++void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, dwc_irqflags_t flags) ++{ ++ splx(flags); ++ simple_unlock((struct simplelock *)lock); ++} ++ ++dwc_mutex_t *DWC_MUTEX_ALLOC(void) ++{ ++ dwc_mutex_t *mutex = DWC_ALLOC(sizeof(struct lock)); ++ ++ if (!mutex) { ++ DWC_ERROR("Cannot allocate memory for mutex"); ++ return NULL; ++ } ++ ++ lockinit((struct lock *)mutex, 0, "dw3mtx", 0, 0); ++ return mutex; ++} ++ ++#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) ++#else ++void DWC_MUTEX_FREE(dwc_mutex_t *mutex) ++{ ++ DWC_FREE(mutex); ++} ++#endif ++ ++void DWC_MUTEX_LOCK(dwc_mutex_t *mutex) ++{ ++ lockmgr((struct lock *)mutex, LK_EXCLUSIVE, NULL); ++} ++ ++int DWC_MUTEX_TRYLOCK(dwc_mutex_t *mutex) ++{ ++ int status; ++ ++ status = lockmgr((struct lock *)mutex, LK_EXCLUSIVE | LK_NOWAIT, NULL); ++ return status == 0; ++} ++ ++void DWC_MUTEX_UNLOCK(dwc_mutex_t *mutex) ++{ ++ lockmgr((struct lock *)mutex, LK_RELEASE, NULL); ++} ++ + +/* Timing */ + +void DWC_UDELAY(uint32_t usecs) +{ -+ udelay(usecs); ++ DELAY(usecs); +} -+EXPORT_SYMBOL(DWC_UDELAY); + +void DWC_MDELAY(uint32_t msecs) +{ -+ mdelay(msecs); ++ do { ++ DELAY(1000); ++ } while (--msecs); +} -+EXPORT_SYMBOL(DWC_MDELAY); + +void DWC_MSLEEP(uint32_t msecs) +{ -+ msleep(msecs); ++ struct timeval tv; ++ ++ tv.tv_sec = msecs / 1000; ++ tv.tv_usec = (msecs - tv.tv_sec * 1000) * 1000; ++ tsleep(&tv, 0, "dw3slp", tvtohz(&tv)); +} -+EXPORT_SYMBOL(DWC_MSLEEP); + +uint32_t DWC_TIME(void) +{ -+ return jiffies_to_msecs(jiffies); ++ struct timeval tv; ++ ++ microuptime(&tv); // or getmicrouptime? (less precise, but faster) ++ return tv.tv_sec * 1000 + tv.tv_usec / 1000; ++} ++ ++ ++/* Timers */ ++ ++struct dwc_timer { ++ struct callout t; ++ char *name; ++ dwc_spinlock_t *lock; ++ dwc_timer_callback_t cb; ++ void *data; ++}; ++ ++dwc_timer_t *DWC_TIMER_ALLOC(char *name, dwc_timer_callback_t cb, void *data) ++{ ++ dwc_timer_t *t = DWC_ALLOC(sizeof(*t)); ++ ++ if (!t) { ++ DWC_ERROR("Cannot allocate memory for timer"); ++ return NULL; ++ } ++ ++ callout_init(&t->t); ++ ++ t->name = DWC_STRDUP(name); ++ if (!t->name) { ++ DWC_ERROR("Cannot allocate memory for timer->name"); ++ goto no_name; ++ } ++ ++ t->lock = DWC_SPINLOCK_ALLOC(); ++ if (!t->lock) { ++ DWC_ERROR("Cannot allocate memory for timer->lock"); ++ goto no_lock; ++ } ++ ++ t->cb = cb; ++ t->data = data; ++ ++ return t; ++ ++ no_lock: ++ DWC_FREE(t->name); ++ no_name: ++ DWC_FREE(t); ++ ++ return NULL; ++} ++ ++void DWC_TIMER_FREE(dwc_timer_t *timer) ++{ ++ callout_stop(&timer->t); ++ DWC_SPINLOCK_FREE(timer->lock); ++ DWC_FREE(timer->name); ++ DWC_FREE(timer); ++} ++ ++void DWC_TIMER_SCHEDULE(dwc_timer_t *timer, uint32_t time) ++{ ++ struct timeval tv; ++ ++ tv.tv_sec = time / 1000; ++ tv.tv_usec = (time - tv.tv_sec * 1000) * 1000; ++ callout_reset(&timer->t, tvtohz(&tv), timer->cb, timer->data); ++} ++ ++void DWC_TIMER_CANCEL(dwc_timer_t *timer) ++{ ++ callout_stop(&timer->t); +} -+EXPORT_SYMBOL(DWC_TIME); + + +/* Wait Queues */ + -+struct dwc_waitq -+{ -+ wait_queue_head_t queue; ++struct dwc_waitq { ++ struct simplelock lock; + int abort; +}; + +dwc_waitq_t *DWC_WAITQ_ALLOC(void) +{ + dwc_waitq_t *wq = DWC_ALLOC(sizeof(*wq)); -+ init_waitqueue_head(&wq->queue); ++ ++ if (!wq) { ++ DWC_ERROR("Cannot allocate memory for waitqueue"); ++ return NULL; ++ } ++ ++ simple_lock_init(&wq->lock); + wq->abort = 0; ++ + return wq; +} -+EXPORT_SYMBOL(DWC_WAITQ_ALLOC); + +void DWC_WAITQ_FREE(dwc_waitq_t *wq) +{ + DWC_FREE(wq); +} -+EXPORT_SYMBOL(DWC_WAITQ_FREE); + -+static int32_t check_result(dwc_waitq_t *wq, int result) -+{ int32_t msecs; -+ if (result > 0) { -+ msecs = jiffies_to_msecs(result); -+ if (!msecs) { -+ return 1; ++int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, void *data) ++{ ++ int ipl; ++ int result = 0; ++ ++ simple_lock(&wq->lock); ++ ipl = splbio(); ++ ++ /* Skip the sleep if already aborted or triggered */ ++ if (!wq->abort && !cond(data)) { ++ splx(ipl); ++ result = ltsleep(wq, PCATCH, "dw3wat", 0, &wq->lock); // infinite timeout ++ ipl = splbio(); ++ } ++ ++ if (result == 0) { // awoken ++ if (wq->abort) { ++ wq->abort = 0; ++ result = -DWC_E_ABORT; ++ } else { ++ result = 0; ++ } ++ ++ splx(ipl); ++ simple_unlock(&wq->lock); ++ } else { ++ wq->abort = 0; ++ splx(ipl); ++ simple_unlock(&wq->lock); ++ ++ if (result == ERESTART) { // signaled - restart ++ result = -DWC_E_RESTART; ++ } else { // signaled - must be EINTR ++ result = -DWC_E_ABORT; + } -+ return msecs; + } + -+ if (result == 0) { ++ return result; ++} ++ ++int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, ++ void *data, int32_t msecs) ++{ ++ struct timeval tv, tv1, tv2; ++ int ipl; ++ int result = 0; ++ ++ tv.tv_sec = msecs / 1000; ++ tv.tv_usec = (msecs - tv.tv_sec * 1000) * 1000; ++ ++ simple_lock(&wq->lock); ++ ipl = splbio(); ++ ++ /* Skip the sleep if already aborted or triggered */ ++ if (!wq->abort && !cond(data)) { ++ splx(ipl); ++ getmicrouptime(&tv1); ++ result = ltsleep(wq, PCATCH, "dw3wto", tvtohz(&tv), &wq->lock); ++ getmicrouptime(&tv2); ++ ipl = splbio(); ++ } ++ ++ if (result == 0) { // awoken ++ if (wq->abort) { ++ wq->abort = 0; ++ splx(ipl); ++ simple_unlock(&wq->lock); ++ result = -DWC_E_ABORT; ++ } else { ++ splx(ipl); ++ simple_unlock(&wq->lock); ++ ++ tv2.tv_usec -= tv1.tv_usec; ++ if (tv2.tv_usec < 0) { ++ tv2.tv_usec += 1000000; ++ tv2.tv_sec--; ++ } ++ ++ tv2.tv_sec -= tv1.tv_sec; ++ result = tv2.tv_sec * 1000 + tv2.tv_usec / 1000; ++ result = msecs - result; ++ if (result <= 0) ++ result = 1; ++ } ++ } else { ++ wq->abort = 0; ++ splx(ipl); ++ simple_unlock(&wq->lock); ++ ++ if (result == ERESTART) { // signaled - restart ++ result = -DWC_E_RESTART; ++ ++ } else if (result == EINTR) { // signaled - interrupt ++ result = -DWC_E_ABORT; ++ ++ } else { // timed out ++ result = -DWC_E_TIMEOUT; ++ } ++ } ++ ++ return result; ++} ++ ++void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq) ++{ ++ wakeup(wq); ++} ++ ++void DWC_WAITQ_ABORT(dwc_waitq_t *wq) ++{ ++ int ipl; ++ ++ simple_lock(&wq->lock); ++ ipl = splbio(); ++ wq->abort = 1; ++ wakeup(wq); ++ splx(ipl); ++ simple_unlock(&wq->lock); ++} ++ ++ ++/* Threading */ ++ ++struct dwc_thread { ++ struct proc *proc; ++ int abort; ++}; ++ ++dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t func, char *name, void *data) ++{ ++ int retval; ++ dwc_thread_t *thread = DWC_ALLOC(sizeof(*thread)); ++ ++ if (!thread) { ++ return NULL; ++ } ++ ++ thread->abort = 0; ++ retval = kthread_create1((void (*)(void *))func, data, &thread->proc, ++ "%s", name); ++ if (retval) { ++ DWC_FREE(thread); ++ return NULL; ++ } ++ ++ return thread; ++} ++ ++int DWC_THREAD_STOP(dwc_thread_t *thread) ++{ ++ int retval; ++ ++ thread->abort = 1; ++ retval = tsleep(&thread->abort, 0, "dw3stp", 60 * hz); ++ ++ if (retval == 0) { ++ /* DWC_THREAD_EXIT() will free the thread struct */ ++ return 0; ++ } ++ ++ /* NOTE: We leak the thread struct if thread doesn't die */ ++ ++ if (retval == EWOULDBLOCK) { + return -DWC_E_TIMEOUT; + } + -+ if ((result == -ERESTARTSYS) || (wq->abort == 1)) { -+ return -DWC_E_ABORT; -+ } -+ + return -DWC_E_UNKNOWN; +} + -+int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t condition, void *data) ++dwc_bool_t DWC_THREAD_SHOULD_STOP(dwc_thread_t *thread) +{ -+ int result = wait_event_interruptible(wq->queue, -+ condition(data) || wq->abort); -+ return check_result(wq, result); ++ return thread->abort; +} -+EXPORT_SYMBOL(DWC_WAITQ_WAIT); + -+int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t condition, -+ void *data, int32_t msecs) ++void DWC_THREAD_EXIT(dwc_thread_t *thread) +{ -+ int result = wait_event_interruptible_timeout(wq->queue, -+ condition(data) || wq->abort, -+ msecs_to_jiffies(msecs)); -+ return check_result(wq, result); ++ wakeup(&thread->abort); ++ DWC_FREE(thread); ++ kthread_exit(0); +} -+EXPORT_SYMBOL(DWC_WAITQ_WAIT_TIMEOUT); + -+void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq) -+{ -+ wake_up_interruptible(&wq->queue); -+} -+EXPORT_SYMBOL(DWC_WAITQ_TRIGGER); ++/* tasklets ++ - Runs in interrupt context (cannot sleep) ++ - Each tasklet runs on a single CPU ++ - Different tasklets can be running simultaneously on different CPUs ++ [ On NetBSD there is no corresponding mechanism, drivers don't have bottom- ++ halves. So we just call the callback directly from DWC_TASK_SCHEDULE() ] ++ */ ++struct dwc_tasklet { ++ dwc_tasklet_callback_t cb; ++ void *data; ++}; + -+void DWC_WAITQ_ABORT(dwc_waitq_t *wq) ++static void tasklet_callback(void *data) +{ -+ wq->abort = 1; -+ DWC_WAITQ_TRIGGER(wq); ++ dwc_tasklet_t *task = (dwc_tasklet_t *)data; ++ ++ task->cb(task->data); +} -+EXPORT_SYMBOL(DWC_WAITQ_ABORT); -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h 2012-07-15 20:29:18.990081853 +0200 -@@ -0,0 +1,616 @@ ++ ++dwc_tasklet_t *DWC_TASK_ALLOC(char *name, dwc_tasklet_callback_t cb, void *data) ++{ ++ dwc_tasklet_t *task = DWC_ALLOC(sizeof(*task)); ++ ++ if (task) { ++ task->cb = cb; ++ task->data = data; ++ } else { ++ DWC_ERROR("Cannot allocate memory for tasklet"); ++ } ++ ++ return task; ++} ++ ++void DWC_TASK_FREE(dwc_tasklet_t *task) ++{ ++ DWC_FREE(task); ++} ++ ++void DWC_TASK_SCHEDULE(dwc_tasklet_t *task) ++{ ++ tasklet_callback(task); ++} ++ ++ ++/* workqueues ++ - Runs in process context (can sleep) ++ */ ++typedef struct work_container { ++ dwc_work_callback_t cb; ++ void *data; ++ dwc_workq_t *wq; ++ char *name; ++ int hz; ++ struct work task; ++} work_container_t; ++ ++struct dwc_workq { ++ struct workqueue *taskq; ++ dwc_spinlock_t *lock; ++ dwc_waitq_t *waitq; ++ int pending; ++ struct work_container *container; ++}; ++ ++static void do_work(struct work *task, void *data) ++{ ++ dwc_workq_t *wq = (dwc_workq_t *)data; ++ work_container_t *container = wq->container; ++ dwc_irqflags_t flags; ++ ++ if (container->hz) { ++ tsleep(container, 0, "dw3wrk", container->hz); ++ } ++ ++ container->cb(container->data); ++ DWC_DEBUG("Work done: %s, container=%p", container->name, container); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ if (container->name) ++ DWC_FREE(container->name); ++ DWC_FREE(container); ++ wq->pending--; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++} ++ ++static int work_done(void *data) ++{ ++ dwc_workq_t *workq = (dwc_workq_t *)data; ++ ++ return workq->pending == 0; ++} ++ ++int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout) ++{ ++ return DWC_WAITQ_WAIT_TIMEOUT(workq->waitq, work_done, workq, timeout); ++} ++ ++dwc_workq_t *DWC_WORKQ_ALLOC(char *name) ++{ ++ int result; ++ dwc_workq_t *wq = DWC_ALLOC(sizeof(*wq)); ++ ++ if (!wq) { ++ DWC_ERROR("Cannot allocate memory for workqueue"); ++ return NULL; ++ } ++ ++ result = workqueue_create(&wq->taskq, name, do_work, wq, 0 /*PWAIT*/, ++ IPL_BIO, 0); ++ if (result) { ++ DWC_ERROR("Cannot create workqueue"); ++ goto no_taskq; ++ } ++ ++ wq->pending = 0; ++ ++ wq->lock = DWC_SPINLOCK_ALLOC(); ++ if (!wq->lock) { ++ DWC_ERROR("Cannot allocate memory for spinlock"); ++ goto no_lock; ++ } ++ ++ wq->waitq = DWC_WAITQ_ALLOC(); ++ if (!wq->waitq) { ++ DWC_ERROR("Cannot allocate memory for waitqueue"); ++ goto no_waitq; ++ } ++ ++ return wq; ++ ++ no_waitq: ++ DWC_SPINLOCK_FREE(wq->lock); ++ no_lock: ++ workqueue_destroy(wq->taskq); ++ no_taskq: ++ DWC_FREE(wq); ++ ++ return NULL; ++} ++ ++void DWC_WORKQ_FREE(dwc_workq_t *wq) ++{ ++#ifdef DEBUG ++ dwc_irqflags_t flags; ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ ++ if (wq->pending != 0) { ++ struct work_container *container = wq->container; ++ ++ DWC_ERROR("Destroying work queue with pending work"); ++ ++ if (container && container->name) { ++ DWC_ERROR("Work %s still pending", container->name); ++ } ++ } ++ ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++#endif ++ DWC_WAITQ_FREE(wq->waitq); ++ DWC_SPINLOCK_FREE(wq->lock); ++ workqueue_destroy(wq->taskq); ++ DWC_FREE(wq); ++} ++ ++void DWC_WORKQ_SCHEDULE(dwc_workq_t *wq, dwc_work_callback_t cb, void *data, ++ char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ container->hz = 0; ++ wq->container = container; ++ ++ DWC_DEBUG("Queueing work: %s, container=%p", container->name, container); ++ workqueue_enqueue(wq->taskq, &container->task); ++} ++ ++void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *wq, dwc_work_callback_t cb, ++ void *data, uint32_t time, char *format, ...) ++{ ++ dwc_irqflags_t flags; ++ work_container_t *container; ++ static char name[128]; ++ struct timeval tv; ++ va_list args; ++ ++ va_start(args, format); ++ DWC_VSNPRINTF(name, 128, format, args); ++ va_end(args); ++ ++ DWC_SPINLOCK_IRQSAVE(wq->lock, &flags); ++ wq->pending++; ++ DWC_SPINUNLOCK_IRQRESTORE(wq->lock, flags); ++ DWC_WAITQ_TRIGGER(wq->waitq); ++ ++ container = DWC_ALLOC_ATOMIC(sizeof(*container)); ++ if (!container) { ++ DWC_ERROR("Cannot allocate memory for container"); ++ return; ++ } ++ ++ container->name = DWC_STRDUP(name); ++ if (!container->name) { ++ DWC_ERROR("Cannot allocate memory for container->name"); ++ DWC_FREE(container); ++ return; ++ } ++ ++ container->cb = cb; ++ container->data = data; ++ container->wq = wq; ++ tv.tv_sec = time / 1000; ++ tv.tv_usec = (time - tv.tv_sec * 1000) * 1000; ++ container->hz = tvtohz(&tv); ++ wq->container = container; ++ ++ DWC_DEBUG("Queueing work: %s, container=%p", container->name, container); ++ workqueue_enqueue(wq->taskq, &container->task); ++} ++ ++int DWC_WORKQ_PENDING(dwc_workq_t *wq) ++{ ++ return wq->pending; ++} +diff --git a/drivers/usb/host/dwc_common_port/dwc_crypto.c b/drivers/usb/host/dwc_common_port/dwc_crypto.c +new file mode 100644 +index 0000000..3b03532 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_crypto.c +@@ -0,0 +1,308 @@ ++/* ========================================================================= ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $ ++ * $Revision: #5 $ ++ * $Date: 2010/09/28 $ ++ * $Change: 1596182 $ ++ * ++ * Synopsys Portability Library Software and documentation ++ * (hereinafter, "Software") is an Unsupported proprietary work of ++ * Synopsys, Inc. unless otherwise expressly agreed to in writing ++ * between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product ++ * under any End User Software License Agreement or Agreement for ++ * Licensed Product with Synopsys or any supplement thereto. You are ++ * permitted to use and redistribute this Software in source and binary ++ * forms, with or without modification, provided that redistributions ++ * of source code must retain this notice. You may not view, use, ++ * disclose, copy or distribute this file or any information contained ++ * herein except pursuant to this license grant from Synopsys. If you ++ * do not agree with this notice, including the disclaimer below, then ++ * you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" ++ * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL ++ * SYNOPSYS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE ++ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================= */ ++ ++/** @file ++ * This file contains the WUSB cryptographic routines. ++ */ ++ ++#ifdef DWC_CRYPTOLIB ++ ++#include "dwc_crypto.h" ++#include "usb.h" ++ ++#ifdef DEBUG ++static inline void dump_bytes(char *name, uint8_t *bytes, int len) ++{ ++ int i; ++ DWC_PRINTF("%s: ", name); ++ for (i=0; idst == src, then the bytes will be encrypted ++ * in-place. ++ * ++ * @return 0 on success, negative error code on error. ++ */ ++int dwc_wusb_aes_encrypt(u8 *src, u8 *key, u8 *dst) ++{ ++ u8 block_t[16]; ++ DWC_MEMSET(block_t, 0, 16); ++ ++ return DWC_AES_CBC(src, 16, key, 16, block_t, dst); ++} ++ ++/** ++ * The CCM-MAC-FUNCTION described in section 6.5 of the WUSB spec. ++ * This function takes a data string and returns the encrypted CBC ++ * Counter-mode MIC. ++ * ++ * @param key The 128-bit symmetric key. ++ * @param nonce The CCM nonce. ++ * @param label The unique 14-byte ASCII text label. ++ * @param bytes The byte array to be encrypted. ++ * @param len Length of the byte array. ++ * @param result Byte array to receive the 8-byte encrypted MIC. ++ */ ++void dwc_wusb_cmf(u8 *key, u8 *nonce, ++ char *label, u8 *bytes, int len, u8 *result) ++{ ++ u8 block_m[16]; ++ u8 block_x[16]; ++ u8 block_t[8]; ++ int idx, blkNum; ++ u16 la = (u16)(len + 14); ++ ++ /* Set the AES-128 key */ ++ //dwc_aes_setkey(tfm, key, 16); ++ ++ /* Fill block B0 from flags = 0x59, N, and l(m) = 0 */ ++ block_m[0] = 0x59; ++ for (idx = 0; idx < 13; idx++) ++ block_m[idx + 1] = nonce[idx]; ++ block_m[14] = 0; ++ block_m[15] = 0; ++ ++ /* Produce the CBC IV */ ++ dwc_wusb_aes_encrypt(block_m, key, block_x); ++ show_block(block_m, "CBC IV in: ", "\n", 0); ++ show_block(block_x, "CBC IV out:", "\n", 0); ++ ++ /* Fill block B1 from l(a) = Blen + 14, and A */ ++ block_x[0] ^= (u8)(la >> 8); ++ block_x[1] ^= (u8)la; ++ for (idx = 0; idx < 14; idx++) ++ block_x[idx + 2] ^= label[idx]; ++ show_block(block_x, "After xor: ", "b1\n", 16); ++ ++ dwc_wusb_aes_encrypt(block_x, key, block_x); ++ show_block(block_x, "After AES: ", "b1\n", 16); ++ ++ idx = 0; ++ blkNum = 0; ++ ++ /* Fill remaining blocks with B */ ++ while (len-- > 0) { ++ block_x[idx] ^= *bytes++; ++ if (++idx >= 16) { ++ idx = 0; ++ show_block(block_x, "After xor: ", "\n", blkNum); ++ dwc_wusb_aes_encrypt(block_x, key, block_x); ++ show_block(block_x, "After AES: ", "\n", blkNum); ++ blkNum++; ++ } ++ } ++ ++ /* Handle partial last block */ ++ if (idx > 0) { ++ show_block(block_x, "After xor: ", "\n", blkNum); ++ dwc_wusb_aes_encrypt(block_x, key, block_x); ++ show_block(block_x, "After AES: ", "\n", blkNum); ++ } ++ ++ /* Save the MIC tag */ ++ DWC_MEMCPY(block_t, block_x, 8); ++ show_block(block_t, "MIC tag : ", NULL, 8); ++ ++ /* Fill block A0 from flags = 0x01, N, and counter = 0 */ ++ block_m[0] = 0x01; ++ block_m[14] = 0; ++ block_m[15] = 0; ++ ++ /* Encrypt the counter */ ++ dwc_wusb_aes_encrypt(block_m, key, block_x); ++ show_block(block_x, "CTR[MIC] : ", NULL, 8); ++ ++ /* XOR with MIC tag */ ++ for (idx = 0; idx < 8; idx++) { ++ block_t[idx] ^= block_x[idx]; ++ } ++ ++ /* Return result to caller */ ++ DWC_MEMCPY(result, block_t, 8); ++ show_block(result, "CCM-MIC : ", NULL, 8); ++ ++} ++ ++/** ++ * The PRF function described in section 6.5 of the WUSB spec. This function ++ * concatenates MIC values returned from dwc_cmf() to create a value of ++ * the requested length. ++ * ++ * @param prf_len Length of the PRF function in bits (64, 128, or 256). ++ * @param key, nonce, label, bytes, len Same as for dwc_cmf(). ++ * @param result Byte array to receive the result. ++ */ ++void dwc_wusb_prf(int prf_len, u8 *key, ++ u8 *nonce, char *label, u8 *bytes, int len, u8 *result) ++{ ++ int i; ++ ++ nonce[0] = 0; ++ for (i = 0; i < prf_len >> 6; i++, nonce[0]++) { ++ dwc_wusb_cmf(key, nonce, label, bytes, len, result); ++ result += 8; ++ } ++} ++ ++/** ++ * Fills in CCM Nonce per the WUSB spec. ++ * ++ * @param[in] haddr Host address. ++ * @param[in] daddr Device address. ++ * @param[in] tkid Session Key(PTK) identifier. ++ * @param[out] nonce Pointer to where the CCM Nonce output is to be written. ++ */ ++void dwc_wusb_fill_ccm_nonce(uint16_t haddr, uint16_t daddr, uint8_t *tkid, ++ uint8_t *nonce) ++{ ++ ++ DWC_DEBUG("%s %x %x\n", __func__, daddr, haddr); ++ ++ DWC_MEMSET(&nonce[0], 0, 16); ++ ++ DWC_MEMCPY(&nonce[6], tkid, 3); ++ nonce[9] = daddr & 0xFF; ++ nonce[10] = (daddr >> 8) & 0xFF; ++ nonce[11] = haddr & 0xFF; ++ nonce[12] = (haddr >> 8) & 0xFF; ++ ++ dump_bytes("CCM nonce", nonce, 16); ++} ++ ++/** ++ * Generates a 16-byte cryptographic-grade random number for the Host/Device ++ * Nonce. ++ */ ++void dwc_wusb_gen_nonce(uint16_t addr, uint8_t *nonce) ++{ ++ uint8_t inonce[16]; ++ uint32_t temp[4]; ++ ++ /* Fill in the Nonce */ ++ DWC_MEMSET(&inonce[0], 0, sizeof(inonce)); ++ inonce[9] = addr & 0xFF; ++ inonce[10] = (addr >> 8) & 0xFF; ++ inonce[11] = inonce[9]; ++ inonce[12] = inonce[10]; ++ ++ /* Collect "randomness samples" */ ++ DWC_RANDOM_BYTES((uint8_t *)temp, 16); ++ ++ dwc_wusb_prf_128((uint8_t *)temp, nonce, ++ "Random Numbers", (uint8_t *)temp, sizeof(temp), ++ nonce); ++} ++ ++/** ++ * Generates the Session Key (PTK) and Key Confirmation Key (KCK) per the ++ * WUSB spec. ++ * ++ * @param[in] ccm_nonce Pointer to CCM Nonce. ++ * @param[in] mk Master Key to derive the session from ++ * @param[in] hnonce Pointer to Host Nonce. ++ * @param[in] dnonce Pointer to Device Nonce. ++ * @param[out] kck Pointer to where the KCK output is to be written. ++ * @param[out] ptk Pointer to where the PTK output is to be written. ++ */ ++void dwc_wusb_gen_key(uint8_t *ccm_nonce, uint8_t *mk, uint8_t *hnonce, ++ uint8_t *dnonce, uint8_t *kck, uint8_t *ptk) ++{ ++ uint8_t idata[32]; ++ uint8_t odata[32]; ++ ++ dump_bytes("ck", mk, 16); ++ dump_bytes("hnonce", hnonce, 16); ++ dump_bytes("dnonce", dnonce, 16); ++ ++ /* The data is the HNonce and DNonce concatenated */ ++ DWC_MEMCPY(&idata[0], hnonce, 16); ++ DWC_MEMCPY(&idata[16], dnonce, 16); ++ ++ dwc_wusb_prf_256(mk, ccm_nonce, "Pair-wise keys", idata, 32, odata); ++ ++ /* Low 16 bytes of the result is the KCK, high 16 is the PTK */ ++ DWC_MEMCPY(kck, &odata[0], 16); ++ DWC_MEMCPY(ptk, &odata[16], 16); ++ ++ dump_bytes("kck", kck, 16); ++ dump_bytes("ptk", ptk, 16); ++} ++ ++/** ++ * Generates the Message Integrity Code over the Handshake data per the ++ * WUSB spec. ++ * ++ * @param ccm_nonce Pointer to CCM Nonce. ++ * @param kck Pointer to Key Confirmation Key. ++ * @param data Pointer to Handshake data to be checked. ++ * @param mic Pointer to where the MIC output is to be written. ++ */ ++void dwc_wusb_gen_mic(uint8_t *ccm_nonce, uint8_t *kck, ++ uint8_t *data, uint8_t *mic) ++{ ++ ++ dwc_wusb_prf_64(kck, ccm_nonce, "out-of-bandMIC", ++ data, WUSB_HANDSHAKE_LEN_FOR_MIC, mic); ++} ++ ++#endif /* DWC_CRYPTOLIB */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_crypto.h b/drivers/usb/host/dwc_common_port/dwc_crypto.h +new file mode 100644 +index 0000000..26fcddc +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_crypto.h +@@ -0,0 +1,111 @@ ++/* ========================================================================= ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $ ++ * $Revision: #3 $ ++ * $Date: 2010/09/28 $ ++ * $Change: 1596182 $ ++ * ++ * Synopsys Portability Library Software and documentation ++ * (hereinafter, "Software") is an Unsupported proprietary work of ++ * Synopsys, Inc. unless otherwise expressly agreed to in writing ++ * between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product ++ * under any End User Software License Agreement or Agreement for ++ * Licensed Product with Synopsys or any supplement thereto. You are ++ * permitted to use and redistribute this Software in source and binary ++ * forms, with or without modification, provided that redistributions ++ * of source code must retain this notice. You may not view, use, ++ * disclose, copy or distribute this file or any information contained ++ * herein except pursuant to this license grant from Synopsys. If you ++ * do not agree with this notice, including the disclaimer below, then ++ * you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" ++ * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL ++ * SYNOPSYS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE ++ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================= */ ++ ++#ifndef _DWC_CRYPTO_H_ ++#define _DWC_CRYPTO_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** @file ++ * ++ * This file contains declarations for the WUSB Cryptographic routines as ++ * defined in the WUSB spec. They are only to be used internally by the DWC UWB ++ * modules. ++ */ ++ ++#include "dwc_os.h" ++ ++int dwc_wusb_aes_encrypt(u8 *src, u8 *key, u8 *dst); ++ ++void dwc_wusb_cmf(u8 *key, u8 *nonce, ++ char *label, u8 *bytes, int len, u8 *result); ++void dwc_wusb_prf(int prf_len, u8 *key, ++ u8 *nonce, char *label, u8 *bytes, int len, u8 *result); ++ ++/** ++ * The PRF-64 function described in section 6.5 of the WUSB spec. ++ * ++ * @param key, nonce, label, bytes, len, result Same as for dwc_prf(). ++ */ ++static inline void dwc_wusb_prf_64(u8 *key, u8 *nonce, ++ char *label, u8 *bytes, int len, u8 *result) ++{ ++ dwc_wusb_prf(64, key, nonce, label, bytes, len, result); ++} ++ ++/** ++ * The PRF-128 function described in section 6.5 of the WUSB spec. ++ * ++ * @param key, nonce, label, bytes, len, result Same as for dwc_prf(). ++ */ ++static inline void dwc_wusb_prf_128(u8 *key, u8 *nonce, ++ char *label, u8 *bytes, int len, u8 *result) ++{ ++ dwc_wusb_prf(128, key, nonce, label, bytes, len, result); ++} ++ ++/** ++ * The PRF-256 function described in section 6.5 of the WUSB spec. ++ * ++ * @param key, nonce, label, bytes, len, result Same as for dwc_prf(). ++ */ ++static inline void dwc_wusb_prf_256(u8 *key, u8 *nonce, ++ char *label, u8 *bytes, int len, u8 *result) ++{ ++ dwc_wusb_prf(256, key, nonce, label, bytes, len, result); ++} ++ ++ ++void dwc_wusb_fill_ccm_nonce(uint16_t haddr, uint16_t daddr, uint8_t *tkid, ++ uint8_t *nonce); ++void dwc_wusb_gen_nonce(uint16_t addr, ++ uint8_t *nonce); ++ ++void dwc_wusb_gen_key(uint8_t *ccm_nonce, uint8_t *mk, ++ uint8_t *hnonce, uint8_t *dnonce, ++ uint8_t *kck, uint8_t *ptk); ++ ++ ++void dwc_wusb_gen_mic(uint8_t *ccm_nonce, uint8_t ++ *kck, uint8_t *data, uint8_t *mic); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _DWC_CRYPTO_H_ */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_dh.c b/drivers/usb/host/dwc_common_port/dwc_dh.c +new file mode 100644 +index 0000000..997f753 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_dh.c +@@ -0,0 +1,291 @@ ++/* ========================================================================= ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $ ++ * $Revision: #3 $ ++ * $Date: 2010/09/28 $ ++ * $Change: 1596182 $ ++ * ++ * Synopsys Portability Library Software and documentation ++ * (hereinafter, "Software") is an Unsupported proprietary work of ++ * Synopsys, Inc. unless otherwise expressly agreed to in writing ++ * between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product ++ * under any End User Software License Agreement or Agreement for ++ * Licensed Product with Synopsys or any supplement thereto. You are ++ * permitted to use and redistribute this Software in source and binary ++ * forms, with or without modification, provided that redistributions ++ * of source code must retain this notice. You may not view, use, ++ * disclose, copy or distribute this file or any information contained ++ * herein except pursuant to this license grant from Synopsys. If you ++ * do not agree with this notice, including the disclaimer below, then ++ * you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" ++ * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL ++ * SYNOPSYS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE ++ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================= */ ++#ifdef DWC_CRYPTOLIB ++ ++#ifndef CONFIG_MACH_IPMATE ++ ++#include "dwc_dh.h" ++#include "dwc_modpow.h" ++ ++#ifdef DEBUG ++/* This function prints out a buffer in the format described in the Association ++ * Model specification. */ ++static void dh_dump(char *str, void *_num, int len) ++{ ++ uint8_t *num = _num; ++ int i; ++ DWC_PRINTF("%s\n", str); ++ for (i = 0; i < len; i ++) { ++ DWC_PRINTF("%02x", num[i]); ++ if (((i + 1) % 2) == 0) DWC_PRINTF(" "); ++ if (((i + 1) % 26) == 0) DWC_PRINTF("\n"); ++ } ++ ++ DWC_PRINTF("\n"); ++} ++#else ++#define dh_dump(_x...) do {; } while(0) ++#endif ++ ++/* Constant g value */ ++static __u32 dh_g[] = { ++ 0x02000000, ++}; ++ ++/* Constant p value */ ++static __u32 dh_p[] = { ++ 0xFFFFFFFF, 0xFFFFFFFF, 0xA2DA0FC9, 0x34C26821, 0x8B62C6C4, 0xD11CDC80, 0x084E0229, 0x74CC678A, ++ 0xA6BE0B02, 0x229B133B, 0x79084A51, 0xDD04348E, 0xB31995EF, 0x1B433ACD, 0x6D0A2B30, 0x37145FF2, ++ 0x6D35E14F, 0x45C2516D, 0x76B585E4, 0xC67E5E62, 0xE9424CF4, 0x6BED37A6, 0xB65CFF0B, 0xEDB706F4, ++ 0xFB6B38EE, 0xA59F895A, 0x11249FAE, 0xE61F4B7C, 0x51662849, 0x3D5BE4EC, 0xB87C00C2, 0x05BF63A1, ++ 0x3648DA98, 0x9AD3551C, 0xA83F1669, 0x5FCF24FD, 0x235D6583, 0x96ADA3DC, 0x56F3621C, 0xBB528520, ++ 0x0729D59E, 0x6D969670, 0x4E350C67, 0x0498BC4A, 0x086C74F1, 0x7C2118CA, 0x465E9032, 0x3BCE362E, ++ 0x2C779EE3, 0x03860E18, 0xA283279B, 0x8FA207EC, 0xF05DC5B5, 0xC9524C6F, 0xF6CB2BDE, 0x18175895, ++ 0x7C499539, 0xE56A95EA, 0x1826D215, 0x1005FA98, 0x5A8E7215, 0x2DC4AA8A, 0x0D1733AD, 0x337A5004, ++ 0xAB2155A8, 0x64BA1CDF, 0x0485FBEC, 0x0AEFDB58, 0x5771EA8A, 0x7D0C065D, 0x850F97B3, 0xC7E4E1A6, ++ 0x8CAEF5AB, 0xD73309DB, 0xE0948C1E, 0x9D61254A, 0x26D2E3CE, 0x6BEED21A, 0x06FA2FF1, 0x64088AD9, ++ 0x730276D8, 0x646AC83E, 0x182B1F52, 0x0C207B17, 0x5717E1BB, 0x6C5D617A, 0xC0880977, 0xE246D9BA, ++ 0xA04FE208, 0x31ABE574, 0xFC5BDB43, 0x8E10FDE0, 0x20D1824B, 0xCAD23AA9, 0xFFFFFFFF, 0xFFFFFFFF, ++}; ++ ++static void dh_swap_bytes(void *_in, void *_out, uint32_t len) ++{ ++ uint8_t *in = _in; ++ uint8_t *out = _out; ++ int i; ++ for (i=0; inext = (link); \ + (link)->prev = (link); \ -+} while(0) ++} while (0) + +#define DWC_LIST_FIRST(link) ((link)->next) +#define DWC_LIST_LAST(link) ((link)->prev) @@ -32400,42 +38689,95 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +#define DWC_LIST_PREV(link) ((link)->prev) +#define DWC_LIST_EMPTY(link) \ + (DWC_LIST_FIRST(link) == DWC_LIST_END(link)) -+#define DWC_LIST_ENTRY(link, type, field) (type *) \ -+ ((uint8_t *)(link) - (size_t)(&((type *)0)->field)) ++#define DWC_LIST_ENTRY(link, type, field) \ ++ (type *)((uint8_t *)(link) - (size_t)(&((type *)0)->field)) + ++#if 0 +#define DWC_LIST_INSERT_HEAD(list, link) do { \ + (link)->next = (list)->next; \ + (link)->prev = (list); \ -+ (list)->next->prev = link; \ -+ (list)->next = link; \ -+} while(0) ++ (list)->next->prev = (link); \ ++ (list)->next = (link); \ ++} while (0) + +#define DWC_LIST_INSERT_TAIL(list, link) do { \ -+ (link)->next = list; \ ++ (link)->next = (list); \ + (link)->prev = (list)->prev; \ -+ (list)->prev->next = link; \ -+ (list)->prev = link; \ -+} while(0) ++ (list)->prev->next = (link); \ ++ (list)->prev = (link); \ ++} while (0) ++#else ++#define DWC_LIST_INSERT_HEAD(list, link) do { \ ++ dwc_list_link_t *__next__ = (list)->next; \ ++ __next__->prev = (link); \ ++ (link)->next = __next__; \ ++ (link)->prev = (list); \ ++ (list)->next = (link); \ ++} while (0) ++ ++#define DWC_LIST_INSERT_TAIL(list, link) do { \ ++ dwc_list_link_t *__prev__ = (list)->prev; \ ++ (list)->prev = (link); \ ++ (link)->next = (list); \ ++ (link)->prev = __prev__; \ ++ __prev__->next = (link); \ ++} while (0) ++#endif ++ ++#if 0 ++static inline void __list_add(struct list_head *new, ++ struct list_head *prev, ++ struct list_head *next) ++{ ++ next->prev = new; ++ new->next = next; ++ new->prev = prev; ++ prev->next = new; ++} ++ ++static inline void list_add(struct list_head *new, struct list_head *head) ++{ ++ __list_add(new, head, head->next); ++} ++ ++static inline void list_add_tail(struct list_head *new, struct list_head *head) ++{ ++ __list_add(new, head->prev, head); ++} ++ ++static inline void __list_del(struct list_head * prev, struct list_head * next) ++{ ++ next->prev = prev; ++ prev->next = next; ++} ++ ++static inline void list_del(struct list_head *entry) ++{ ++ __list_del(entry->prev, entry->next); ++ entry->next = LIST_POISON1; ++ entry->prev = LIST_POISON2; ++} ++#endif + +#define DWC_LIST_REMOVE(link) do { \ + (link)->next->prev = (link)->prev; \ + (link)->prev->next = (link)->next; \ -+} while(0) ++} while (0) + +#define DWC_LIST_REMOVE_INIT(link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INIT(link); \ -+} while(0) ++} while (0) + +#define DWC_LIST_MOVE_HEAD(list, link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INSERT_HEAD(list, link); \ -+} while(0) ++} while (0) + +#define DWC_LIST_MOVE_TAIL(list, link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INSERT_TAIL(list, link); \ -+} while(0) ++} while (0) + +#define DWC_LIST_FOREACH(var, list) \ + for((var) = DWC_LIST_FIRST(list); \ @@ -32443,9 +38785,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + (var) = DWC_LIST_NEXT(var)) + +#define DWC_LIST_FOREACH_SAFE(var, var2, list) \ -+ for((var) = DWC_LIST_FIRST(list), var2 = DWC_LIST_NEXT(var); \ ++ for((var) = DWC_LIST_FIRST(list), (var2) = DWC_LIST_NEXT(var); \ + (var) != DWC_LIST_END(list); \ -+ (var) = (var2), var2 = DWC_LIST_NEXT(var2)) ++ (var) = (var2), (var2) = DWC_LIST_NEXT(var2)) + +#define DWC_LIST_FOREACH_REVERSE(var, list) \ + for((var) = DWC_LIST_LAST(list); \ @@ -32459,15 +38801,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +struct name { \ + struct type *slh_first; /* first element */ \ +} -+ -+#define DWC_SLIST_HEAD_INITIALIZER(head) \ ++ ++#define DWC_SLIST_HEAD_INITIALIZER(head) \ + { NULL } -+ ++ +#define DWC_SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} -+ ++ +/* + * Singly-linked List access methods. + */ @@ -32476,13 +38818,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +#define DWC_SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head)) +#define DWC_SLIST_NEXT(elm, field) ((elm)->field.sle_next) + -+#define DWC_SLIST_FOREACH(var, head, field) \ ++#define DWC_SLIST_FOREACH(var, head, field) \ + for((var) = SLIST_FIRST(head); \ + (var) != SLIST_END(head); \ + (var) = SLIST_NEXT(var, field)) + -+#define DWC_SLIST_FOREACH_PREVPTR(var, varp, head, field) \ -+ for ((varp) = &SLIST_FIRST((head)); \ ++#define DWC_SLIST_FOREACH_PREVPTR(var, varp, head, field) \ ++ for((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != SLIST_END(head); \ + (varp) = &SLIST_NEXT((var), field)) + @@ -32493,7 +38835,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + SLIST_FIRST(head) = SLIST_END(head); \ +} + -+#define DWC_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ ++#define DWC_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (0) @@ -32524,88 +38866,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + } \ +} while (0) + -+#if 0 -+ -+/* -+ * List definitions. -+ */ -+#define DWC_LIST_HEAD(name, type) \ -+struct name { \ -+ struct type *lh_first; /* first element */ \ -+} -+ -+#define DWC_LIST_HEAD_INITIALIZER(head) \ -+ { NULL } -+ -+#define DWC_LIST_ENTRY(type) \ -+struct { \ -+ struct type *le_next; /* next element */ \ -+ struct type **le_prev; /* address of previous next element */ \ -+} -+ -+/* -+ * List access methods -+ */ -+#define DWC_LIST_FIRST(head) ((head)->lh_first) -+#define DWC_LIST_END(head) NULL -+#define DWC_LIST_EMPTY(head) (DWC_LIST_FIRST(head) == DWC_LIST_END(head)) -+#define DWC_LIST_NEXT(elm, field) ((elm)->field.le_next) -+ -+#define DWC_LIST_FOREACH(var, head, field) \ -+ for((var) = DWC_LIST_FIRST(head); \ -+ (var)!= DWC_LIST_END(head); \ -+ (var) = DWC_LIST_NEXT(var, field)) -+#define DWC_LIST_FOREACH_SAFE(var, var2, head, field) \ -+ for((var) = DWC_LIST_FIRST(head), var2 = DWC_LIST_NEXT(var, field); \ -+ (var) != DWC_LIST_END(head); \ -+ (var) = var2, var2 = DWC_LIST_NEXT(var, field)) -+ -+/* -+ * List functions. -+ */ -+#define DWC_LIST_INIT(head) do { \ -+ DWC_LIST_FIRST(head) = DWC_LIST_END(head); \ -+} while (0) -+ -+#define DWC_LIST_INSERT_AFTER(listelm, elm, field) do { \ -+ if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ -+ (listelm)->field.le_next->field.le_prev = \ -+ &(elm)->field.le_next; \ -+ (listelm)->field.le_next = (elm); \ -+ (elm)->field.le_prev = &(listelm)->field.le_next; \ -+} while (0) -+ -+#define DWC_LIST_INSERT_BEFORE(listelm, elm, field) do { \ -+ (elm)->field.le_prev = (listelm)->field.le_prev; \ -+ (elm)->field.le_next = (listelm); \ -+ *(listelm)->field.le_prev = (elm); \ -+ (listelm)->field.le_prev = &(elm)->field.le_next; \ -+} while (0) -+ -+#define DWC_LIST_INSERT_HEAD(head, elm, field) do { \ -+ if (((elm)->field.le_next = (head)->lh_first) != NULL) \ -+ (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ -+ (head)->lh_first = (elm); \ -+ (elm)->field.le_prev = &(head)->lh_first; \ -+} while (0) -+ -+#define DWC_LIST_REMOVE(elm, field) do { \ -+ if ((elm)->field.le_next != NULL) \ -+ (elm)->field.le_next->field.le_prev = \ -+ (elm)->field.le_prev; \ -+ *(elm)->field.le_prev = (elm)->field.le_next; \ -+} while (0) -+ -+#define DWC_LIST_REPLACE(elm, elm2, field) do { \ -+ if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ -+ (elm2)->field.le_next->field.le_prev = \ -+ &(elm2)->field.le_next; \ -+ (elm2)->field.le_prev = (elm)->field.le_prev; \ -+ *(elm2)->field.le_prev = (elm2); \ -+} while (0) -+ -+#endif -+ +/* + * Simple queue definitions. + */ @@ -32615,7 +38875,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + struct type **sqh_last; /* addr of last next element */ \ +} + -+#define DWC_SIMPLEQ_HEAD_INITIALIZER(head) \ ++#define DWC_SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define DWC_SIMPLEQ_ENTRY(type) \ @@ -32639,7 +38899,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +/* + * Simple queue functions. + */ -+#define DWC_SIMPLEQ_INIT(head) do { \ ++#define DWC_SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (0) @@ -32656,7 +38916,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (0) + -+#define DWC_SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ ++#define DWC_SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ @@ -32670,13 +38930,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +/* + * Tail queue definitions. + */ -+#define DWC_TAILQ_HEAD(name, type) \ ++#define DWC_TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + -+#define DWC_TAILQ_HEAD_INITIALIZER(head) \ ++#define DWC_TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define DWC_TAILQ_ENTRY(type) \ @@ -32685,12 +38945,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + struct type **tqe_prev; /* address of previous next element */ \ +} + -+/* -+ * tail queue access methods ++/* ++ * tail queue access methods + */ +#define DWC_TAILQ_FIRST(head) ((head)->tqh_first) -+#define DWC_TAILQ_END(head) NULL -+#define DWC_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) ++#define DWC_TAILQ_END(head) NULL ++#define DWC_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define DWC_TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +/* XXX */ @@ -32699,7 +38959,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +#define DWC_TAILQ_EMPTY(head) \ + (TAILQ_FIRST(head) == TAILQ_END(head)) + -+#define DWC_TAILQ_FOREACH(var, head, field) \ ++#define DWC_TAILQ_FOREACH(var, head, field) \ + for((var) = TAILQ_FIRST(head); \ + (var) != TAILQ_END(head); \ + (var) = TAILQ_NEXT(var, field)) @@ -32712,7 +38972,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +/* + * Tail queue functions. + */ -+#define DWC_TAILQ_INIT(head) do { \ ++#define DWC_TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (0) @@ -32744,7 +39004,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (0) + -+#define DWC_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ ++#define DWC_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ @@ -32779,7 +39039,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + struct type *cqh_last; /* last element */ \ +} + -+#define DWC_CIRCLEQ_HEAD_INITIALIZER(head) \ ++#define DWC_CIRCLEQ_HEAD_INITIALIZER(head) \ + { DWC_CIRCLEQ_END(&head), DWC_CIRCLEQ_END(&head) } + +#define DWC_CIRCLEQ_ENTRY(type) \ @@ -32789,7 +39049,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo +} + +/* -+ * Circular queue access methods ++ * Circular queue access methods + */ +#define DWC_CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define DWC_CIRCLEQ_LAST(head) ((head)->cqh_last) @@ -32803,33 +39063,33 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + +#define DWC_CIRCLEQ_FOREACH(var, head, field) \ + for((var) = DWC_CIRCLEQ_FIRST(head); \ -+ (var) != DWC_CIRCLEQ_END(head); \ ++ (var) != DWC_CIRCLEQ_END(head); \ + (var) = DWC_CIRCLEQ_NEXT(var, field)) + -+#define DWC_CIRCLEQ_FOREACH_SAFE(var, var2, head, field) \ -+ for((var) = DWC_CIRCLEQ_FIRST(head), var2 = DWC_CIRCLEQ_NEXT(var, field); \ ++#define DWC_CIRCLEQ_FOREACH_SAFE(var, var2, head, field) \ ++ for((var) = DWC_CIRCLEQ_FIRST(head), var2 = DWC_CIRCLEQ_NEXT(var, field); \ + (var) != DWC_CIRCLEQ_END(head); \ + (var) = var2, var2 = DWC_CIRCLEQ_NEXT(var, field)) + +#define DWC_CIRCLEQ_FOREACH_REVERSE(var, head, field) \ -+ for((var) = DWC_CIRCLEQ_LAST(head); \ -+ (var) != DWC_CIRCLEQ_END(head); \ ++ for((var) = DWC_CIRCLEQ_LAST(head); \ ++ (var) != DWC_CIRCLEQ_END(head); \ + (var) = DWC_CIRCLEQ_PREV(var, field)) + +/* + * Circular queue functions. + */ -+#define DWC_CIRCLEQ_INIT(head) do { \ -+ (head)->cqh_first = DWC_CIRCLEQ_END(head); \ -+ (head)->cqh_last = DWC_CIRCLEQ_END(head); \ ++#define DWC_CIRCLEQ_INIT(head) do { \ ++ (head)->cqh_first = DWC_CIRCLEQ_END(head); \ ++ (head)->cqh_last = DWC_CIRCLEQ_END(head); \ +} while (0) + -+#define DWC_CIRCLEQ_INIT_ENTRY(elm, field) do { \ -+ (elm)->field.cqe_next = NULL; \ -+ (elm)->field.cqe_prev = NULL; \ ++#define DWC_CIRCLEQ_INIT_ENTRY(elm, field) do { \ ++ (elm)->field.cqe_next = NULL; \ ++ (elm)->field.cqe_prev = NULL; \ +} while (0) + -+#define DWC_CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ ++#define DWC_CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == DWC_CIRCLEQ_END(head)) \ @@ -32839,7 +39099,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + (listelm)->field.cqe_next = (elm); \ +} while (0) + -+#define DWC_CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ ++#define DWC_CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == DWC_CIRCLEQ_END(head)) \ @@ -32869,51 +39129,57 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_list.h linux-rpi-bo + (head)->cqh_last = (elm); \ +} while (0) + -+#define DWC_CIRCLEQ_REMOVE(head, elm, field) do { \ -+ if ((elm)->field.cqe_next == DWC_CIRCLEQ_END(head)) \ ++#define DWC_CIRCLEQ_REMOVE(head, elm, field) do { \ ++ if ((elm)->field.cqe_next == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ -+ if ((elm)->field.cqe_prev == DWC_CIRCLEQ_END(head)) \ ++ if ((elm)->field.cqe_prev == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} while (0) + -+#define DWC_CIRCLEQ_REMOVE_INIT(head, elm, field) do { \ -+ DWC_CIRCLEQ_REMOVE(head, elm, field); \ -+ DWC_CIRCLEQ_INIT_ENTRY(elm, field); \ ++#define DWC_CIRCLEQ_REMOVE_INIT(head, elm, field) do { \ ++ DWC_CIRCLEQ_REMOVE(head, elm, field); \ ++ DWC_CIRCLEQ_INIT_ENTRY(elm, field); \ +} while (0) + -+#define DWC_CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ ++#define DWC_CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ -+ DWC_CIRCLEQ_END(head)) \ ++ DWC_CIRCLEQ_END(head)) \ + (head).cqh_last = (elm2); \ + else \ + (elm2)->field.cqe_next->field.cqe_prev = (elm2); \ + if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ -+ DWC_CIRCLEQ_END(head)) \ ++ DWC_CIRCLEQ_END(head)) \ + (head).cqh_first = (elm2); \ + else \ + (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ +} while (0) + -+#endif /* !_SYS_QUEUE_H_ */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,172 @@ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _DWC_LIST_H_ */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_mem.c b/drivers/usb/host/dwc_common_port/dwc_mem.c +new file mode 100644 +index 0000000..ad645ff +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_mem.c +@@ -0,0 +1,245 @@ ++/* Memory Debugging */ ++#ifdef DWC_DEBUG_MEMORY ++ +#include "dwc_os.h" +#include "dwc_list.h" + -+/* Memory Debugging */ -+#ifdef DEBUG_MEMORY -+ -+struct allocation -+{ ++struct allocation { + void *addr; ++ void *ctx; + char *func; + int line; + uint32_t size; @@ -32923,8 +39189,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi-boo + +DWC_CIRCLEQ_HEAD(allocation_queue, allocation); + -+struct allocation_manager -+{ ++struct allocation_manager { ++ void *mem_ctx; + struct allocation_queue allocations; + + /* statistics */ @@ -32932,160 +39198,918 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_mem.c linux-rpi-boo + int num_freed; + int num_active; + uint32_t total; -+ uint32_t current; ++ uint32_t cur; + uint32_t max; +}; + -+ +static struct allocation_manager *manager = NULL; + -+static void add_allocation(uint32_t size, char const* func, int line, void *addr, int dma) ++static int add_allocation(void *ctx, uint32_t size, char const *func, int line, void *addr, ++ int dma) +{ -+ struct allocation *a = __DWC_ALLOC_ATOMIC(sizeof(*a)); -+ a->func = __DWC_ALLOC_ATOMIC(DWC_STRLEN(func)+1); -+ DWC_MEMCPY(a->func, func, DWC_STRLEN(func)+1); ++ struct allocation *a; ++ ++ DWC_ASSERT(manager != NULL, "manager not allocated"); ++ ++ a = __DWC_ALLOC_ATOMIC(manager->mem_ctx, sizeof(*a)); ++ if (!a) { ++ return -DWC_E_NO_MEMORY; ++ } ++ ++ a->func = __DWC_ALLOC_ATOMIC(manager->mem_ctx, DWC_STRLEN(func) + 1); ++ if (!a->func) { ++ __DWC_FREE(manager->mem_ctx, a); ++ return -DWC_E_NO_MEMORY; ++ } ++ ++ DWC_MEMCPY(a->func, func, DWC_STRLEN(func) + 1); ++ a->addr = addr; ++ a->ctx = ctx; + a->line = line; + a->size = size; -+ a->addr = addr; + a->dma = dma; + DWC_CIRCLEQ_INSERT_TAIL(&manager->allocations, a, entry); + + /* Update stats */ -+ manager->num ++; -+ manager->num_active ++; ++ manager->num++; ++ manager->num_active++; + manager->total += size; -+ manager->current += size; -+ if (manager->max < manager->current) { -+ manager->max = manager->current; ++ manager->cur += size; ++ ++ if (manager->max < manager->cur) { ++ manager->max = manager->cur; + } ++ ++ return 0; +} + -+static struct allocation *find_allocation(void *addr) ++static struct allocation *find_allocation(void *ctx, void *addr) +{ + struct allocation *a; ++ + DWC_CIRCLEQ_FOREACH(a, &manager->allocations, entry) { -+ if (a->addr == addr) { ++ if (a->ctx == ctx && a->addr == addr) { + return a; + } + } ++ + return NULL; +} + -+static void free_allocation(void *addr, char const* func, int line) ++static void free_allocation(void *ctx, void *addr, char const *func, int line) +{ -+ struct allocation *a = find_allocation(addr); -+ if (!a && func && (line >= 0)) { -+ DWC_ASSERT(0, "Free of address %p that was never allocated or already freed %s:%d", addr, func, line); ++ struct allocation *a = find_allocation(ctx, addr); ++ ++ if (!a) { ++ DWC_ASSERT(0, ++ "Free of address %p that was never allocated or already freed %s:%d", ++ addr, func, line); + return; + } ++ + DWC_CIRCLEQ_REMOVE(&manager->allocations, a, entry); + -+ manager->num_active --; -+ manager->num_freed ++; -+ manager->current -= a->size; -+ __DWC_FREE(a->func); -+ __DWC_FREE(a); ++ manager->num_active--; ++ manager->num_freed++; ++ manager->cur -= a->size; ++ __DWC_FREE(manager->mem_ctx, a->func); ++ __DWC_FREE(manager->mem_ctx, a); +} + -+void dwc_memory_debug_start(void) ++int dwc_memory_debug_start(void *mem_ctx) +{ + DWC_ASSERT(manager == NULL, "Memory debugging has already started\n"); -+ if (manager == NULL) { -+ manager = __DWC_ALLOC(sizeof(*manager)); ++ ++ if (manager) { ++ return -DWC_E_BUSY; ++ } ++ ++ manager = __DWC_ALLOC(mem_ctx, sizeof(*manager)); ++ if (!manager) { ++ return -DWC_E_NO_MEMORY; + } + + DWC_CIRCLEQ_INIT(&manager->allocations); ++ manager->mem_ctx = mem_ctx; + manager->num = 0; + manager->num_freed = 0; + manager->num_active = 0; + manager->total = 0; -+ manager->current = 0; ++ manager->cur = 0; + manager->max = 0; ++ ++ return 0; +} + +void dwc_memory_debug_stop(void) +{ + struct allocation *a; ++ + dwc_memory_debug_report(); + + DWC_CIRCLEQ_FOREACH(a, &manager->allocations, entry) { + DWC_ERROR("Memory leaked from %s:%d\n", a->func, a->line); -+ free_allocation(a->addr, NULL, -1); ++ free_allocation(a->ctx, a->addr, NULL, -1); + } + -+ __DWC_FREE(manager); ++ __DWC_FREE(manager->mem_ctx, manager); +} + +void dwc_memory_debug_report(void) +{ + struct allocation *a; ++ + DWC_PRINTF("\n\n\n----------------- Memory Debugging Report -----------------\n\n"); + DWC_PRINTF("Num Allocations = %d\n", manager->num); + DWC_PRINTF("Freed = %d\n", manager->num_freed); + DWC_PRINTF("Active = %d\n", manager->num_active); -+ DWC_PRINTF("Current Memory Used = %d\n", manager->current); ++ DWC_PRINTF("Current Memory Used = %d\n", manager->cur); + DWC_PRINTF("Total Memory Used = %d\n", manager->total); + DWC_PRINTF("Maximum Memory Used at Once = %d\n", manager->max); + DWC_PRINTF("Unfreed allocations:\n"); + + DWC_CIRCLEQ_FOREACH(a, &manager->allocations, entry) { -+ DWC_PRINTF(" addr=%p, size=%d from %s:%d, DMA=%d\n", a->addr, a->size, a->func, a->line, a->dma); ++ DWC_PRINTF(" addr=%p, size=%d from %s:%d, DMA=%d\n", ++ a->addr, a->size, a->func, a->line, a->dma); + } +} + -+ -+ +/* The replacement functions */ -+void *dwc_alloc_debug(uint32_t size, char const* func, int line) ++void *dwc_alloc_debug(void *mem_ctx, uint32_t size, char const *func, int line) +{ -+ void *addr = __DWC_ALLOC(size); -+ add_allocation(size, func, line, addr, 0); ++ void *addr = __DWC_ALLOC(mem_ctx, size); ++ ++ if (!addr) { ++ return NULL; ++ } ++ ++ if (add_allocation(mem_ctx, size, func, line, addr, 0)) { ++ __DWC_FREE(mem_ctx, addr); ++ return NULL; ++ } ++ + return addr; +} + -+void *dwc_alloc_atomic_debug(uint32_t size, char const* func, int line) ++void *dwc_alloc_atomic_debug(void *mem_ctx, uint32_t size, char const *func, ++ int line) +{ -+ void *addr = __DWC_ALLOC_ATOMIC(size); -+ add_allocation(size, func, line, addr, 0); ++ void *addr = __DWC_ALLOC_ATOMIC(mem_ctx, size); ++ ++ if (!addr) { ++ return NULL; ++ } ++ ++ if (add_allocation(mem_ctx, size, func, line, addr, 0)) { ++ __DWC_FREE(mem_ctx, addr); ++ return NULL; ++ } ++ + return addr; +} + -+void dwc_free_debug(void *addr, char const* func, int line) ++void dwc_free_debug(void *mem_ctx, void *addr, char const *func, int line) +{ -+ free_allocation(addr, func, line); -+ __DWC_FREE(addr); ++ free_allocation(mem_ctx, addr, func, line); ++ __DWC_FREE(mem_ctx, addr); +} + -+void *dwc_dma_alloc_debug(uint32_t size, dwc_dma_t *dma_addr, char const *func, int line) ++void *dwc_dma_alloc_debug(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr, ++ char const *func, int line) +{ -+ void *addr = __DWC_DMA_ALLOC(size, dma_addr); -+ add_allocation(size, func, line, addr, 1); ++ void *addr = __DWC_DMA_ALLOC(dma_ctx, size, dma_addr); ++ ++ if (!addr) { ++ return NULL; ++ } ++ ++ if (add_allocation(dma_ctx, size, func, line, addr, 1)) { ++ __DWC_DMA_FREE(dma_ctx, size, addr, *dma_addr); ++ return NULL; ++ } ++ + return addr; +} + -+void *dwc_dma_alloc_atomic_debug(uint32_t size, dwc_dma_t *dma_addr, char const *func, int line) ++void *dwc_dma_alloc_atomic_debug(void *dma_ctx, uint32_t size, ++ dwc_dma_t *dma_addr, char const *func, int line) +{ -+ void *addr = __DWC_DMA_ALLOC_ATOMIC(size, dma_addr); -+ add_allocation(size, func, line, addr, 1); ++ void *addr = __DWC_DMA_ALLOC_ATOMIC(dma_ctx, size, dma_addr); ++ ++ if (!addr) { ++ return NULL; ++ } ++ ++ if (add_allocation(dma_ctx, size, func, line, addr, 1)) { ++ __DWC_DMA_FREE(dma_ctx, size, addr, *dma_addr); ++ return NULL; ++ } ++ + return addr; +} + -+void dwc_dma_free_debug(uint32_t size, void *virt_addr, dwc_dma_t dma_addr, char const *func, int line) ++void dwc_dma_free_debug(void *dma_ctx, uint32_t size, void *virt_addr, ++ dwc_dma_t dma_addr, char const *func, int line) +{ -+ free_allocation(virt_addr, func, line); -+ __DWC_DMA_FREE(size, virt_addr, dma_addr); ++ free_allocation(dma_ctx, virt_addr, func, line); ++ __DWC_DMA_FREE(dma_ctx, size, virt_addr, dma_addr); +} + -+#endif /* DEBUG_MEMORY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,256 @@ ++#endif /* DWC_DEBUG_MEMORY */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_modpow.c b/drivers/usb/host/dwc_common_port/dwc_modpow.c +new file mode 100644 +index 0000000..b7c456b +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_modpow.c +@@ -0,0 +1,636 @@ ++/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows. ++ * ++ * PuTTY is copyright 1997-2007 Simon Tatham. ++ * ++ * Portions copyright Robert de Bath, Joris van Rantwijk, Delian ++ * Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, ++ * Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, Markus ++ * Kuhn, and CORE SDI S.A. ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation files ++ * (the "Software"), to deal in the Software without restriction, ++ * including without limitation the rights to use, copy, modify, merge, ++ * publish, distribute, sublicense, and/or sell copies of the Software, ++ * and to permit persons to whom the Software is furnished to do so, ++ * subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE ++ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF ++ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ */ ++#ifdef DWC_CRYPTOLIB ++ ++#ifndef CONFIG_MACH_IPMATE ++ ++#include "dwc_modpow.h" ++ ++#define BIGNUM_INT_MASK 0xFFFFFFFFUL ++#define BIGNUM_TOP_BIT 0x80000000UL ++#define BIGNUM_INT_BITS 32 ++ ++ ++static void *snmalloc(void *mem_ctx, size_t n, size_t size) ++{ ++ void *p; ++ size *= n; ++ if (size == 0) size = 1; ++ p = dwc_alloc(mem_ctx, size); ++ return p; ++} ++ ++#define snewn(ctx, n, type) ((type *)snmalloc((ctx), (n), sizeof(type))) ++#define sfree dwc_free ++ ++/* ++ * Usage notes: ++ * * Do not call the DIVMOD_WORD macro with expressions such as array ++ * subscripts, as some implementations object to this (see below). ++ * * Note that none of the division methods below will cope if the ++ * quotient won't fit into BIGNUM_INT_BITS. Callers should be careful ++ * to avoid this case. ++ * If this condition occurs, in the case of the x86 DIV instruction, ++ * an overflow exception will occur, which (according to a correspondent) ++ * will manifest on Windows as something like ++ * 0xC0000095: Integer overflow ++ * The C variant won't give the right answer, either. ++ */ ++ ++#define MUL_WORD(w1, w2) ((BignumDblInt)w1 * w2) ++ ++#if defined __GNUC__ && defined __i386__ ++#define DIVMOD_WORD(q, r, hi, lo, w) \ ++ __asm__("div %2" : \ ++ "=d" (r), "=a" (q) : \ ++ "r" (w), "d" (hi), "a" (lo)) ++#else ++#define DIVMOD_WORD(q, r, hi, lo, w) do { \ ++ BignumDblInt n = (((BignumDblInt)hi) << BIGNUM_INT_BITS) | lo; \ ++ q = n / w; \ ++ r = n % w; \ ++} while (0) ++#endif ++ ++// q = n / w; ++// r = n % w; ++ ++#define BIGNUM_INT_BYTES (BIGNUM_INT_BITS / 8) ++ ++#define BIGNUM_INTERNAL ++ ++static Bignum newbn(void *mem_ctx, int length) ++{ ++ Bignum b = snewn(mem_ctx, length + 1, BignumInt); ++ //if (!b) ++ //abort(); /* FIXME */ ++ DWC_MEMSET(b, 0, (length + 1) * sizeof(*b)); ++ b[0] = length; ++ return b; ++} ++ ++void freebn(void *mem_ctx, Bignum b) ++{ ++ /* ++ * Burn the evidence, just in case. ++ */ ++ DWC_MEMSET(b, 0, sizeof(b[0]) * (b[0] + 1)); ++ sfree(mem_ctx, b); ++} ++ ++/* ++ * Compute c = a * b. ++ * Input is in the first len words of a and b. ++ * Result is returned in the first 2*len words of c. ++ */ ++static void internal_mul(BignumInt *a, BignumInt *b, ++ BignumInt *c, int len) ++{ ++ int i, j; ++ BignumDblInt t; ++ ++ for (j = 0; j < 2 * len; j++) ++ c[j] = 0; ++ ++ for (i = len - 1; i >= 0; i--) { ++ t = 0; ++ for (j = len - 1; j >= 0; j--) { ++ t += MUL_WORD(a[i], (BignumDblInt) b[j]); ++ t += (BignumDblInt) c[i + j + 1]; ++ c[i + j + 1] = (BignumInt) t; ++ t = t >> BIGNUM_INT_BITS; ++ } ++ c[i] = (BignumInt) t; ++ } ++} ++ ++static void internal_add_shifted(BignumInt *number, ++ unsigned n, int shift) ++{ ++ int word = 1 + (shift / BIGNUM_INT_BITS); ++ int bshift = shift % BIGNUM_INT_BITS; ++ BignumDblInt addend; ++ ++ addend = (BignumDblInt)n << bshift; ++ ++ while (addend) { ++ addend += number[word]; ++ number[word] = (BignumInt) addend & BIGNUM_INT_MASK; ++ addend >>= BIGNUM_INT_BITS; ++ word++; ++ } ++} ++ ++/* ++ * Compute a = a % m. ++ * Input in first alen words of a and first mlen words of m. ++ * Output in first alen words of a ++ * (of which first alen-mlen words will be zero). ++ * The MSW of m MUST have its high bit set. ++ * Quotient is accumulated in the `quotient' array, which is a Bignum ++ * rather than the internal bigendian format. Quotient parts are shifted ++ * left by `qshift' before adding into quot. ++ */ ++static void internal_mod(BignumInt *a, int alen, ++ BignumInt *m, int mlen, ++ BignumInt *quot, int qshift) ++{ ++ BignumInt m0, m1; ++ unsigned int h; ++ int i, k; ++ ++ m0 = m[0]; ++ if (mlen > 1) ++ m1 = m[1]; ++ else ++ m1 = 0; ++ ++ for (i = 0; i <= alen - mlen; i++) { ++ BignumDblInt t; ++ unsigned int q, r, c, ai1; ++ ++ if (i == 0) { ++ h = 0; ++ } else { ++ h = a[i - 1]; ++ a[i - 1] = 0; ++ } ++ ++ if (i == alen - 1) ++ ai1 = 0; ++ else ++ ai1 = a[i + 1]; ++ ++ /* Find q = h:a[i] / m0 */ ++ if (h >= m0) { ++ /* ++ * Special case. ++ * ++ * To illustrate it, suppose a BignumInt is 8 bits, and ++ * we are dividing (say) A1:23:45:67 by A1:B2:C3. Then ++ * our initial division will be 0xA123 / 0xA1, which ++ * will give a quotient of 0x100 and a divide overflow. ++ * However, the invariants in this division algorithm ++ * are not violated, since the full number A1:23:... is ++ * _less_ than the quotient prefix A1:B2:... and so the ++ * following correction loop would have sorted it out. ++ * ++ * In this situation we set q to be the largest ++ * quotient we _can_ stomach (0xFF, of course). ++ */ ++ q = BIGNUM_INT_MASK; ++ } else { ++ /* Macro doesn't want an array subscript expression passed ++ * into it (see definition), so use a temporary. */ ++ BignumInt tmplo = a[i]; ++ DIVMOD_WORD(q, r, h, tmplo, m0); ++ ++ /* Refine our estimate of q by looking at ++ h:a[i]:a[i+1] / m0:m1 */ ++ t = MUL_WORD(m1, q); ++ if (t > ((BignumDblInt) r << BIGNUM_INT_BITS) + ai1) { ++ q--; ++ t -= m1; ++ r = (r + m0) & BIGNUM_INT_MASK; /* overflow? */ ++ if (r >= (BignumDblInt) m0 && ++ t > ((BignumDblInt) r << BIGNUM_INT_BITS) + ai1) q--; ++ } ++ } ++ ++ /* Subtract q * m from a[i...] */ ++ c = 0; ++ for (k = mlen - 1; k >= 0; k--) { ++ t = MUL_WORD(q, m[k]); ++ t += c; ++ c = (unsigned)(t >> BIGNUM_INT_BITS); ++ if ((BignumInt) t > a[i + k]) ++ c++; ++ a[i + k] -= (BignumInt) t; ++ } ++ ++ /* Add back m in case of borrow */ ++ if (c != h) { ++ t = 0; ++ for (k = mlen - 1; k >= 0; k--) { ++ t += m[k]; ++ t += a[i + k]; ++ a[i + k] = (BignumInt) t; ++ t = t >> BIGNUM_INT_BITS; ++ } ++ q--; ++ } ++ if (quot) ++ internal_add_shifted(quot, q, qshift + BIGNUM_INT_BITS * (alen - mlen - i)); ++ } ++} ++ ++/* ++ * Compute p % mod. ++ * The most significant word of mod MUST be non-zero. ++ * We assume that the result array is the same size as the mod array. ++ * We optionally write out a quotient if `quotient' is non-NULL. ++ * We can avoid writing out the result if `result' is NULL. ++ */ ++void bigdivmod(void *mem_ctx, Bignum p, Bignum mod, Bignum result, Bignum quotient) ++{ ++ BignumInt *n, *m; ++ int mshift; ++ int plen, mlen, i, j; ++ ++ /* Allocate m of size mlen, copy mod to m */ ++ /* We use big endian internally */ ++ mlen = mod[0]; ++ m = snewn(mem_ctx, mlen, BignumInt); ++ //if (!m) ++ //abort(); /* FIXME */ ++ for (j = 0; j < mlen; j++) ++ m[j] = mod[mod[0] - j]; ++ ++ /* Shift m left to make msb bit set */ ++ for (mshift = 0; mshift < BIGNUM_INT_BITS-1; mshift++) ++ if ((m[0] << mshift) & BIGNUM_TOP_BIT) ++ break; ++ if (mshift) { ++ for (i = 0; i < mlen - 1; i++) ++ m[i] = (m[i] << mshift) | (m[i + 1] >> (BIGNUM_INT_BITS - mshift)); ++ m[mlen - 1] = m[mlen - 1] << mshift; ++ } ++ ++ plen = p[0]; ++ /* Ensure plen > mlen */ ++ if (plen <= mlen) ++ plen = mlen + 1; ++ ++ /* Allocate n of size plen, copy p to n */ ++ n = snewn(mem_ctx, plen, BignumInt); ++ //if (!n) ++ //abort(); /* FIXME */ ++ for (j = 0; j < plen; j++) ++ n[j] = 0; ++ for (j = 1; j <= (int)p[0]; j++) ++ n[plen - j] = p[j]; ++ ++ /* Main computation */ ++ internal_mod(n, plen, m, mlen, quotient, mshift); ++ ++ /* Fixup result in case the modulus was shifted */ ++ if (mshift) { ++ for (i = plen - mlen - 1; i < plen - 1; i++) ++ n[i] = (n[i] << mshift) | (n[i + 1] >> (BIGNUM_INT_BITS - mshift)); ++ n[plen - 1] = n[plen - 1] << mshift; ++ internal_mod(n, plen, m, mlen, quotient, 0); ++ for (i = plen - 1; i >= plen - mlen; i--) ++ n[i] = (n[i] >> mshift) | (n[i - 1] << (BIGNUM_INT_BITS - mshift)); ++ } ++ ++ /* Copy result to buffer */ ++ if (result) { ++ for (i = 1; i <= (int)result[0]; i++) { ++ int j = plen - i; ++ result[i] = j >= 0 ? n[j] : 0; ++ } ++ } ++ ++ /* Free temporary arrays */ ++ for (i = 0; i < mlen; i++) ++ m[i] = 0; ++ sfree(mem_ctx, m); ++ for (i = 0; i < plen; i++) ++ n[i] = 0; ++ sfree(mem_ctx, n); ++} ++ ++/* ++ * Simple remainder. ++ */ ++Bignum bigmod(void *mem_ctx, Bignum a, Bignum b) ++{ ++ Bignum r = newbn(mem_ctx, b[0]); ++ bigdivmod(mem_ctx, a, b, r, NULL); ++ return r; ++} ++ ++/* ++ * Compute (base ^ exp) % mod. ++ */ ++Bignum dwc_modpow(void *mem_ctx, Bignum base_in, Bignum exp, Bignum mod) ++{ ++ BignumInt *a, *b, *n, *m; ++ int mshift; ++ int mlen, i, j; ++ Bignum base, result; ++ ++ /* ++ * The most significant word of mod needs to be non-zero. It ++ * should already be, but let's make sure. ++ */ ++ //assert(mod[mod[0]] != 0); ++ ++ /* ++ * Make sure the base is smaller than the modulus, by reducing ++ * it modulo the modulus if not. ++ */ ++ base = bigmod(mem_ctx, base_in, mod); ++ ++ /* Allocate m of size mlen, copy mod to m */ ++ /* We use big endian internally */ ++ mlen = mod[0]; ++ m = snewn(mem_ctx, mlen, BignumInt); ++ //if (!m) ++ //abort(); /* FIXME */ ++ for (j = 0; j < mlen; j++) ++ m[j] = mod[mod[0] - j]; ++ ++ /* Shift m left to make msb bit set */ ++ for (mshift = 0; mshift < BIGNUM_INT_BITS - 1; mshift++) ++ if ((m[0] << mshift) & BIGNUM_TOP_BIT) ++ break; ++ if (mshift) { ++ for (i = 0; i < mlen - 1; i++) ++ m[i] = ++ (m[i] << mshift) | (m[i + 1] >> ++ (BIGNUM_INT_BITS - mshift)); ++ m[mlen - 1] = m[mlen - 1] << mshift; ++ } ++ ++ /* Allocate n of size mlen, copy base to n */ ++ n = snewn(mem_ctx, mlen, BignumInt); ++ //if (!n) ++ //abort(); /* FIXME */ ++ i = mlen - base[0]; ++ for (j = 0; j < i; j++) ++ n[j] = 0; ++ for (j = 0; j < base[0]; j++) ++ n[i + j] = base[base[0] - j]; ++ ++ /* Allocate a and b of size 2*mlen. Set a = 1 */ ++ a = snewn(mem_ctx, 2 * mlen, BignumInt); ++ //if (!a) ++ //abort(); /* FIXME */ ++ b = snewn(mem_ctx, 2 * mlen, BignumInt); ++ //if (!b) ++ //abort(); /* FIXME */ ++ for (i = 0; i < 2 * mlen; i++) ++ a[i] = 0; ++ a[2 * mlen - 1] = 1; ++ ++ /* Skip leading zero bits of exp. */ ++ i = 0; ++ j = BIGNUM_INT_BITS - 1; ++ while (i < exp[0] && (exp[exp[0] - i] & (1 << j)) == 0) { ++ j--; ++ if (j < 0) { ++ i++; ++ j = BIGNUM_INT_BITS - 1; ++ } ++ } ++ ++ /* Main computation */ ++ while (i < exp[0]) { ++ while (j >= 0) { ++ internal_mul(a + mlen, a + mlen, b, mlen); ++ internal_mod(b, mlen * 2, m, mlen, NULL, 0); ++ if ((exp[exp[0] - i] & (1 << j)) != 0) { ++ internal_mul(b + mlen, n, a, mlen); ++ internal_mod(a, mlen * 2, m, mlen, NULL, 0); ++ } else { ++ BignumInt *t; ++ t = a; ++ a = b; ++ b = t; ++ } ++ j--; ++ } ++ i++; ++ j = BIGNUM_INT_BITS - 1; ++ } ++ ++ /* Fixup result in case the modulus was shifted */ ++ if (mshift) { ++ for (i = mlen - 1; i < 2 * mlen - 1; i++) ++ a[i] = ++ (a[i] << mshift) | (a[i + 1] >> ++ (BIGNUM_INT_BITS - mshift)); ++ a[2 * mlen - 1] = a[2 * mlen - 1] << mshift; ++ internal_mod(a, mlen * 2, m, mlen, NULL, 0); ++ for (i = 2 * mlen - 1; i >= mlen; i--) ++ a[i] = ++ (a[i] >> mshift) | (a[i - 1] << ++ (BIGNUM_INT_BITS - mshift)); ++ } ++ ++ /* Copy result to buffer */ ++ result = newbn(mem_ctx, mod[0]); ++ for (i = 0; i < mlen; i++) ++ result[result[0] - i] = a[i + mlen]; ++ while (result[0] > 1 && result[result[0]] == 0) ++ result[0]--; ++ ++ /* Free temporary arrays */ ++ for (i = 0; i < 2 * mlen; i++) ++ a[i] = 0; ++ sfree(mem_ctx, a); ++ for (i = 0; i < 2 * mlen; i++) ++ b[i] = 0; ++ sfree(mem_ctx, b); ++ for (i = 0; i < mlen; i++) ++ m[i] = 0; ++ sfree(mem_ctx, m); ++ for (i = 0; i < mlen; i++) ++ n[i] = 0; ++ sfree(mem_ctx, n); ++ ++ freebn(mem_ctx, base); ++ ++ return result; ++} ++ ++ ++#ifdef UNITTEST ++ ++static __u32 dh_p[] = { ++ 96, ++ 0xFFFFFFFF, ++ 0xFFFFFFFF, ++ 0xA93AD2CA, ++ 0x4B82D120, ++ 0xE0FD108E, ++ 0x43DB5BFC, ++ 0x74E5AB31, ++ 0x08E24FA0, ++ 0xBAD946E2, ++ 0x770988C0, ++ 0x7A615D6C, ++ 0xBBE11757, ++ 0x177B200C, ++ 0x521F2B18, ++ 0x3EC86A64, ++ 0xD8760273, ++ 0xD98A0864, ++ 0xF12FFA06, ++ 0x1AD2EE6B, ++ 0xCEE3D226, ++ 0x4A25619D, ++ 0x1E8C94E0, ++ 0xDB0933D7, ++ 0xABF5AE8C, ++ 0xA6E1E4C7, ++ 0xB3970F85, ++ 0x5D060C7D, ++ 0x8AEA7157, ++ 0x58DBEF0A, ++ 0xECFB8504, ++ 0xDF1CBA64, ++ 0xA85521AB, ++ 0x04507A33, ++ 0xAD33170D, ++ 0x8AAAC42D, ++ 0x15728E5A, ++ 0x98FA0510, ++ 0x15D22618, ++ 0xEA956AE5, ++ 0x3995497C, ++ 0x95581718, ++ 0xDE2BCBF6, ++ 0x6F4C52C9, ++ 0xB5C55DF0, ++ 0xEC07A28F, ++ 0x9B2783A2, ++ 0x180E8603, ++ 0xE39E772C, ++ 0x2E36CE3B, ++ 0x32905E46, ++ 0xCA18217C, ++ 0xF1746C08, ++ 0x4ABC9804, ++ 0x670C354E, ++ 0x7096966D, ++ 0x9ED52907, ++ 0x208552BB, ++ 0x1C62F356, ++ 0xDCA3AD96, ++ 0x83655D23, ++ 0xFD24CF5F, ++ 0x69163FA8, ++ 0x1C55D39A, ++ 0x98DA4836, ++ 0xA163BF05, ++ 0xC2007CB8, ++ 0xECE45B3D, ++ 0x49286651, ++ 0x7C4B1FE6, ++ 0xAE9F2411, ++ 0x5A899FA5, ++ 0xEE386BFB, ++ 0xF406B7ED, ++ 0x0BFF5CB6, ++ 0xA637ED6B, ++ 0xF44C42E9, ++ 0x625E7EC6, ++ 0xE485B576, ++ 0x6D51C245, ++ 0x4FE1356D, ++ 0xF25F1437, ++ 0x302B0A6D, ++ 0xCD3A431B, ++ 0xEF9519B3, ++ 0x8E3404DD, ++ 0x514A0879, ++ 0x3B139B22, ++ 0x020BBEA6, ++ 0x8A67CC74, ++ 0x29024E08, ++ 0x80DC1CD1, ++ 0xC4C6628B, ++ 0x2168C234, ++ 0xC90FDAA2, ++ 0xFFFFFFFF, ++ 0xFFFFFFFF, ++}; ++ ++static __u32 dh_a[] = { ++ 8, ++ 0xdf367516, ++ 0x86459caa, ++ 0xe2d459a4, ++ 0xd910dae0, ++ 0x8a8b5e37, ++ 0x67ab31c6, ++ 0xf0b55ea9, ++ 0x440051d6, ++}; ++ ++static __u32 dh_b[] = { ++ 8, ++ 0xded92656, ++ 0xe07a048a, ++ 0x6fa452cd, ++ 0x2df89d30, ++ 0xc75f1b0f, ++ 0x8ce3578f, ++ 0x7980a324, ++ 0x5daec786, ++}; ++ ++static __u32 dh_g[] = { ++ 1, ++ 2, ++}; ++ ++int main(void) ++{ ++ int i; ++ __u32 *k; ++ k = dwc_modpow(NULL, dh_g, dh_a, dh_p); ++ ++ printf("\n\n"); ++ for (i=0; i> 16; ++ printf("%04x %04x ", m, l); ++ if (!((i + 1)%13)) printf("\n"); ++ } ++ printf("\n\n"); ++ ++ if ((k[0] == 0x60) && (k[1] == 0x28e490e5) && (k[0x60] == 0x5a0d3d4e)) { ++ printf("PASS\n\n"); ++ } ++ else { ++ printf("FAIL\n\n"); ++ } ++ ++} ++ ++#endif /* UNITTEST */ ++ ++#endif /* CONFIG_MACH_IPMATE */ ++ ++#endif /*DWC_CRYPTOLIB */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_modpow.h b/drivers/usb/host/dwc_common_port/dwc_modpow.h +new file mode 100644 +index 0000000..64f00c2 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_modpow.h +@@ -0,0 +1,34 @@ ++/* ++ * dwc_modpow.h ++ * See dwc_modpow.c for license and changes ++ */ ++#ifndef _DWC_MODPOW_H ++#define _DWC_MODPOW_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "dwc_os.h" ++ ++/** @file ++ * ++ * This file defines the module exponentiation function which is only used ++ * internally by the DWC UWB modules for calculation of PKs during numeric ++ * association. The routine is taken from the PUTTY, an open source terminal ++ * emulator. The PUTTY License is preserved in the dwc_modpow.c file. ++ * ++ */ ++ ++typedef uint32_t BignumInt; ++typedef uint64_t BignumDblInt; ++typedef BignumInt *Bignum; ++ ++/* Compute modular exponentiaion */ ++extern Bignum dwc_modpow(void *mem_ctx, Bignum base_in, Bignum exp, Bignum mod); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* _LINUX_BIGNUM_H */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_notifier.c b/drivers/usb/host/dwc_common_port/dwc_notifier.c +new file mode 100644 +index 0000000..8b3772a +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_notifier.c +@@ -0,0 +1,319 @@ ++#ifdef DWC_NOTIFYLIB ++ +#include "dwc_notifier.h" +#include "dwc_list.h" + -+typedef struct dwc_observer -+{ ++typedef struct dwc_observer { + void *observer; + dwc_notifier_callback_t callback; + void *data; @@ -33095,8 +40119,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + +DWC_CIRCLEQ_HEAD(observer_queue, dwc_observer); + -+typedef struct dwc_notifier -+{ ++typedef struct dwc_notifier { ++ void *mem_ctx; + void *object; + struct observer_queue observers; + DWC_CIRCLEQ_ENTRY(dwc_notifier) list_entry; @@ -33104,30 +40128,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + +DWC_CIRCLEQ_HEAD(notifier_queue, dwc_notifier); + -+typedef struct manager -+{ ++typedef struct manager { ++ void *mem_ctx; ++ void *wkq_ctx; + dwc_workq_t *wq; -+ dwc_mutex_t *mutex; ++// dwc_mutex_t *mutex; + struct notifier_queue notifiers; +} manager_t; + +static manager_t *manager = NULL; + -+static void create_manager(void) ++static int create_manager(void *mem_ctx, void *wkq_ctx) +{ -+ manager = DWC_ALLOC(sizeof(manager_t)); ++ manager = dwc_alloc(mem_ctx, sizeof(manager_t)); ++ if (!manager) { ++ return -DWC_E_NO_MEMORY; ++ } ++ + DWC_CIRCLEQ_INIT(&manager->notifiers); -+ manager->wq = DWC_WORKQ_ALLOC("DWC Notification WorkQ"); ++ ++ manager->wq = dwc_workq_alloc(wkq_ctx, "DWC Notification WorkQ"); ++ if (!manager->wq) { ++ return -DWC_E_NO_MEMORY; ++ } ++ ++ return 0; +} + +static void free_manager(void) +{ -+ DWC_WORKQ_FREE(manager->wq); ++ dwc_workq_free(manager->wq); ++ + /* All notifiers must have unregistered themselves before this module + * can be removed. Hitting this assertion indicates a programmer + * error. */ -+ DWC_ASSERT(DWC_CIRCLEQ_EMPTY(&manager->notifiers), "Notification manager being freed before all notifiers have been removed"); -+ DWC_FREE(manager); ++ DWC_ASSERT(DWC_CIRCLEQ_EMPTY(&manager->notifiers), ++ "Notification manager being freed before all notifiers have been removed"); ++ dwc_free(manager->mem_ctx, manager); +} + +#ifdef DEBUG @@ -33135,12 +40172,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +{ + notifier_t *n; + observer_t *o; ++ + DWC_ASSERT(manager, "Notification manager not found"); -+ DWC_DEBUG("List of all notifiers and observers:"); ++ ++ DWC_DEBUG("List of all notifiers and observers:\n"); + DWC_CIRCLEQ_FOREACH(n, &manager->notifiers, list_entry) { -+ DWC_DEBUG("Notifier %p has observers:", n->object); ++ DWC_DEBUG("Notifier %p has observers:\n", n->object); + DWC_CIRCLEQ_FOREACH(o, &n->observers, list_entry) { -+ DWC_DEBUG(" %p watching %s", o->observer, o->notification); ++ DWC_DEBUG(" %p watching %s\n", o->observer, o->notification); + } + } +} @@ -33148,9 +40187,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +#define dump_manager(...) +#endif + -+static observer_t *alloc_observer(void *observer, char *notification, dwc_notifier_callback_t callback, void *data) ++static observer_t *alloc_observer(void *mem_ctx, void *observer, char *notification, ++ dwc_notifier_callback_t callback, void *data) +{ -+ observer_t *new_observer = DWC_ALLOC(sizeof(observer_t)); ++ observer_t *new_observer = dwc_alloc(mem_ctx, sizeof(observer_t)); ++ ++ if (!new_observer) { ++ return NULL; ++ } ++ + DWC_CIRCLEQ_INIT_ENTRY(new_observer, list_entry); + new_observer->observer = observer; + new_observer->notification = notification; @@ -33159,12 +40204,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + return new_observer; +} + -+static void free_observer(observer_t *observer) ++static void free_observer(void *mem_ctx, observer_t *observer) +{ -+ DWC_FREE(observer); ++ dwc_free(mem_ctx, observer); +} + -+static notifier_t *alloc_notifier(void *object) ++static notifier_t *alloc_notifier(void *mem_ctx, void *object) +{ + notifier_t *notifier; + @@ -33172,10 +40217,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + return NULL; + } + -+ notifier = DWC_ALLOC(sizeof(notifier_t)); ++ notifier = dwc_alloc(mem_ctx, sizeof(notifier_t)); ++ if (!notifier) { ++ return NULL; ++ } ++ + DWC_CIRCLEQ_INIT(¬ifier->observers); + DWC_CIRCLEQ_INIT_ENTRY(notifier, list_entry); + ++ notifier->mem_ctx = mem_ctx; + notifier->object = object; + return notifier; +} @@ -33183,30 +40233,36 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +static void free_notifier(notifier_t *notifier) +{ + observer_t *observer; ++ + DWC_CIRCLEQ_FOREACH(observer, ¬ifier->observers, list_entry) { -+ free_observer(observer); ++ free_observer(notifier->mem_ctx, observer); + } -+ DWC_FREE(notifier); ++ ++ dwc_free(notifier->mem_ctx, notifier); +} + +static notifier_t *find_notifier(void *object) +{ + notifier_t *notifier; ++ ++ DWC_ASSERT(manager, "Notification manager not found"); ++ + if (!object) { + return NULL; + } -+ DWC_ASSERT(manager, "Notification manager not found"); ++ + DWC_CIRCLEQ_FOREACH(notifier, &manager->notifiers, list_entry) { + if (notifier->object == object) { + return notifier; + } + } ++ + return NULL; +} + -+void dwc_alloc_notification_manager(void) ++int dwc_alloc_notification_manager(void *mem_ctx, void *wkq_ctx) +{ -+ create_manager(); ++ return create_manager(mem_ctx, wkq_ctx); +} + +void dwc_free_notification_manager(void) @@ -33214,18 +40270,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + free_manager(); +} + -+dwc_notifier_t *dwc_register_notifier(void *object) ++dwc_notifier_t *dwc_register_notifier(void *mem_ctx, void *object) +{ -+ notifier_t *notifier = find_notifier(object); ++ notifier_t *notifier; ++ + DWC_ASSERT(manager, "Notification manager not found"); ++ ++ notifier = find_notifier(object); + if (notifier) { -+ DWC_ERROR("Notifier %p is already registered", object); ++ DWC_ERROR("Notifier %p is already registered\n", object); + return NULL; + } + -+ notifier = alloc_notifier(object); -+ DWC_CIRCLEQ_INSERT_TAIL(&manager->notifiers, notifier, list_entry); ++ notifier = alloc_notifier(mem_ctx, object); ++ if (!notifier) { ++ return NULL; ++ } + ++ DWC_CIRCLEQ_INSERT_TAIL(&manager->notifiers, notifier, list_entry); + + DWC_INFO("Notifier %p registered", object); + dump_manager(); @@ -33236,13 +40298,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +void dwc_unregister_notifier(dwc_notifier_t *notifier) +{ + DWC_ASSERT(manager, "Notification manager not found"); ++ + if (!DWC_CIRCLEQ_EMPTY(¬ifier->observers)) { + observer_t *o; -+ DWC_ERROR("Notifier %p has active observers when removing", notifier->object); ++ ++ DWC_ERROR("Notifier %p has active observers when removing\n", notifier->object); + DWC_CIRCLEQ_FOREACH(o, ¬ifier->observers, list_entry) { -+ DWC_DEBUG(" %p watching %s", o->observer, o->notification); ++ DWC_DEBUGC(" %p watching %s\n", o->observer, o->notification); + } -+ DWC_ASSERT(DWC_CIRCLEQ_EMPTY(¬ifier->observers), "Notifier %p has active observers when removing", notifier); ++ ++ DWC_ASSERT(DWC_CIRCLEQ_EMPTY(¬ifier->observers), ++ "Notifier %p has active observers when removing", notifier); + } + + DWC_CIRCLEQ_REMOVE_INIT(&manager->notifiers, notifier, list_entry); @@ -33253,16 +40319,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +} + +/* Add an observer to observe the notifier for a particular state, event, or notification. */ -+int dwc_add_observer(void *observer, void *object, char *notification, dwc_notifier_callback_t callback, void *data) ++int dwc_add_observer(void *observer, void *object, char *notification, ++ dwc_notifier_callback_t callback, void *data) +{ + notifier_t *notifier = find_notifier(object); + observer_t *new_observer; ++ + if (!notifier) { -+ DWC_ERROR("Notifier %p is not found when adding observer", object); -+ return -1; ++ DWC_ERROR("Notifier %p is not found when adding observer\n", object); ++ return -DWC_E_INVALID; + } + -+ new_observer = alloc_observer(observer, notification, callback, data); ++ new_observer = alloc_observer(notifier->mem_ctx, observer, notification, callback, data); ++ if (!new_observer) { ++ return -DWC_E_NO_MEMORY; ++ } + + DWC_CIRCLEQ_INSERT_TAIL(¬ifier->observers, new_observer, list_entry); + @@ -33276,16 +40347,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp +int dwc_remove_observer(void *observer) +{ + notifier_t *n; ++ + DWC_ASSERT(manager, "Notification manager not found"); ++ + DWC_CIRCLEQ_FOREACH(n, &manager->notifiers, list_entry) { + observer_t *o; + observer_t *o2; ++ + DWC_CIRCLEQ_FOREACH_SAFE(o, o2, &n->observers, list_entry) { + if (o->observer == observer) { + DWC_CIRCLEQ_REMOVE_INIT(&n->observers, o, list_entry); + DWC_INFO("Removing observer %p from notifier %p watching notification %s:", + o->observer, n->object, o->notification); -+ free_observer(o); ++ free_observer(n->mem_ctx, o); + } + } + } @@ -33294,42 +40368,53 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + return 0; +} + -+typedef struct callback_data -+{ ++typedef struct callback_data { ++ void *mem_ctx; + dwc_notifier_callback_t cb; + void *observer; + void *data; + void *object; -+ void *notification; ++ char *notification; + void *notification_data; +} cb_data_t; + +static void cb_task(void *data) +{ + cb_data_t *cb = (cb_data_t *)data; ++ + cb->cb(cb->object, cb->notification, cb->observer, cb->notification_data, cb->data); -+ DWC_FREE(cb); ++ dwc_free(cb->mem_ctx, cb); +} + +void dwc_notify(dwc_notifier_t *notifier, char *notification, void *notification_data) +{ + observer_t *o; ++ + DWC_ASSERT(manager, "Notification manager not found"); ++ + DWC_CIRCLEQ_FOREACH(o, ¬ifier->observers, list_entry) { + int len = DWC_STRLEN(notification); ++ + if (DWC_STRLEN(o->notification) != len) { + continue; + } + + if (DWC_STRNCMP(o->notification, notification, len) == 0) { -+ cb_data_t *cb_data = DWC_ALLOC(sizeof(cb_data_t)); ++ cb_data_t *cb_data = dwc_alloc(notifier->mem_ctx, sizeof(cb_data_t)); ++ ++ if (!cb_data) { ++ DWC_ERROR("Failed to allocate callback data\n"); ++ return; ++ } ++ ++ cb_data->mem_ctx = notifier->mem_ctx; + cb_data->cb = o->callback; + cb_data->observer = o->observer; + cb_data->data = o->data; + cb_data->object = notifier->object; + cb_data->notification = notification; + cb_data->notification_data = notification_data; -+ DWC_DEBUG("Observer found %p for notification %s", o->observer, notification); ++ DWC_DEBUGC("Observer found %p for notification %s\n", o->observer, notification); + DWC_WORKQ_SCHEDULE(manager->wq, cb_task, cb_data, + "Notify callback from %p for Notification %s, to observer %p", + cb_data->object, notification, cb_data->observer); @@ -33337,14 +40422,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-rp + } +} + -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,112 @@ ++#endif /* DWC_NOTIFYLIB */ +diff --git a/drivers/usb/host/dwc_common_port/dwc_notifier.h b/drivers/usb/host/dwc_common_port/dwc_notifier.h +new file mode 100644 +index 0000000..4a8cdfe +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_notifier.h +@@ -0,0 +1,122 @@ + +#ifndef __DWC_NOTIFIER_H__ +#define __DWC_NOTIFIER_H__ + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ +#include "dwc_os.h" + +/** @file @@ -33409,21 +40501,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rp + * the documentation of the observable module with the notifications. + * @param user_data This is any custom data that the observer provided when + * adding itself as an observer to the notification. */ -+typedef void (*dwc_notifier_callback_t)(void *object, char *notification, void *observer, void *notification_data, void *user_data); ++typedef void (*dwc_notifier_callback_t)(void *object, char *notification, void *observer, ++ void *notification_data, void *user_data); + +/** Brings up the notification manager. */ -+extern void dwc_alloc_notification_manager(void); ++extern int dwc_alloc_notification_manager(void *mem_ctx, void *wkq_ctx); +/** Brings down the notification manager. */ +extern void dwc_free_notification_manager(void); + -+/** This function register an observable module. A dwc_notifier_t object is ++/** This function registers an observable module. A dwc_notifier_t object is + * returned to the observable module. This is an opaque object that is used by + * the observable module to trigger notifications. This object should only be + * accessible to functions that are authorized to trigger notifications for this + * module. Observers do not need this object. */ -+extern dwc_notifier_t *dwc_register_notifier(void *object); ++extern dwc_notifier_t *dwc_register_notifier(void *mem_ctx, void *object); + -+/** This function unregister an observable module. All observers have to be ++/** This function unregisters an observable module. All observers have to be + * removed prior to unregistration. */ +extern void dwc_unregister_notifier(dwc_notifier_t *notifier); + @@ -33435,7 +40528,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rp + * @param notification The notification to observe + * @param callback The callback function to call + * @param user_data Any additional user data to pass into the callback function */ -+extern int dwc_add_observer(void *observer, void *object, char *notification, dwc_notifier_callback_t callback, void *user_data); ++extern int dwc_add_observer(void *observer, void *object, char *notification, ++ dwc_notifier_callback_t callback, void *user_data); + +/** Removes the specified observer from all notifications that it is currently + * observing. */ @@ -33452,16 +40546,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-rp + */ +void dwc_notify(dwc_notifier_t *notifier, char *notification, void *notification_data); + ++#ifdef __cplusplus ++} ++#endif ++ +#endif /* __DWC_NOTIFIER_H__ */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h ---- linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,925 @@ +diff --git a/drivers/usb/host/dwc_common_port/dwc_os.h b/drivers/usb/host/dwc_common_port/dwc_os.h +new file mode 100644 +index 0000000..308ddd5 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/dwc_os.h +@@ -0,0 +1,1260 @@ +/* ========================================================================= -+ * $File: //dwh/usb_iip/dev/software/dwc_common_port/dwc_os.h $ -+ * $Revision: #2 $ -+ * $Date: 2009/04/02 $ -+ * $Change: 1224130 $ ++ * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $ ++ * $Revision: #14 $ ++ * $Date: 2010/11/04 $ ++ * $Change: 1621695 $ + * + * Synopsys Portability Library Software and documentation + * (hereinafter, "Software") is an Unsupported proprietary work of @@ -33495,6 +40595,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +#ifndef _DWC_OS_H_ +#define _DWC_OS_H_ + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ +/** @file + * + * DWC portability library, low level os-wrapper functions @@ -33510,12 +40614,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ + +#ifdef DWC_LINUX -+# include -+# ifdef CONFIG_DEBUG_MUTEXES -+# include -+# endif -+#else -+# include ++# include ++# ifdef CONFIG_DEBUG_MUTEXES ++# include ++# endif ++# include ++# include ++#endif ++ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++# include +#endif + + @@ -33526,29 +40634,58 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +#define YES 1 +#define NO 0 + -+/** @todo make them positive and return the negative error code */ ++#ifdef DWC_LINUX ++ +/** @name Error Codes */ -+#define DWC_E_INVALID 1001 -+#define DWC_E_NO_MEMORY 1002 -+#define DWC_E_NO_DEVICE 1003 -+#define DWC_E_NOT_SUPPORTED 1004 -+#define DWC_E_TIMEOUT 1005 -+#define DWC_E_BUSY 1006 -+#define DWC_E_AGAIN 1007 -+#define DWC_E_RESTART 1008 -+#define DWC_E_ABORT 1009 -+#define DWC_E_SHUTDOWN 1010 -+#define DWC_E_NO_DATA 1011 -+#define DWC_E_DISCONNECT 2000 -+#define DWC_E_UNKNOWN 3000 -+#define DWC_E_NO_STREAM_RES 4001 -+#define DWC_E_COMMUNICATION 4002 -+#define DWC_E_OVERFLOW 4003 -+#define DWC_E_PROTOCOL 4004 -+#define DWC_E_IN_PROGRESS 4005 -+#define DWC_E_PIPE 4006 -+#define DWC_E_IO 4007 -+#define DWC_E_NO_SPACE 4008 ++#define DWC_E_INVALID EINVAL ++#define DWC_E_NO_MEMORY ENOMEM ++#define DWC_E_NO_DEVICE ENODEV ++#define DWC_E_NOT_SUPPORTED EOPNOTSUPP ++#define DWC_E_TIMEOUT ETIMEDOUT ++#define DWC_E_BUSY EBUSY ++#define DWC_E_AGAIN EAGAIN ++#define DWC_E_RESTART ERESTART ++#define DWC_E_ABORT ECONNABORTED ++#define DWC_E_SHUTDOWN ESHUTDOWN ++#define DWC_E_NO_DATA ENODATA ++#define DWC_E_DISCONNECT ECONNRESET ++#define DWC_E_UNKNOWN EINVAL ++#define DWC_E_NO_STREAM_RES ENOSR ++#define DWC_E_COMMUNICATION ECOMM ++#define DWC_E_OVERFLOW EOVERFLOW ++#define DWC_E_PROTOCOL EPROTO ++#define DWC_E_IN_PROGRESS EINPROGRESS ++#define DWC_E_PIPE EPIPE ++#define DWC_E_IO EIO ++#define DWC_E_NO_SPACE ENOSPC ++ ++#else ++ ++/** @name Error Codes */ ++#define DWC_E_INVALID 1001 ++#define DWC_E_NO_MEMORY 1002 ++#define DWC_E_NO_DEVICE 1003 ++#define DWC_E_NOT_SUPPORTED 1004 ++#define DWC_E_TIMEOUT 1005 ++#define DWC_E_BUSY 1006 ++#define DWC_E_AGAIN 1007 ++#define DWC_E_RESTART 1008 ++#define DWC_E_ABORT 1009 ++#define DWC_E_SHUTDOWN 1010 ++#define DWC_E_NO_DATA 1011 ++#define DWC_E_DISCONNECT 2000 ++#define DWC_E_UNKNOWN 3000 ++#define DWC_E_NO_STREAM_RES 4001 ++#define DWC_E_COMMUNICATION 4002 ++#define DWC_E_OVERFLOW 4003 ++#define DWC_E_PROTOCOL 4004 ++#define DWC_E_IN_PROGRESS 4005 ++#define DWC_E_PIPE 4006 ++#define DWC_E_IO 4007 ++#define DWC_E_NO_SPACE 4008 ++ ++#endif ++ + +/** @name Tracing/Logging Functions + * @@ -33559,8 +40696,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * expensive on your system. By default undefining the DEBUG macro already + * no-ops some of these functions. */ + -+#include -+ +/** Returns non-zero if in interrupt context. */ +extern dwc_bool_t DWC_IN_IRQ(void); +#define dwc_in_irq DWC_IN_IRQ @@ -33570,6 +40705,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + return DWC_IN_IRQ() ? "IRQ" : ""; +} + ++/** Returns non-zero if in bottom-half context. */ ++extern dwc_bool_t DWC_IN_BH(void); ++#define dwc_in_bh DWC_IN_BH ++ ++/** Returns "BH" if DWC_IN_BH is true. */ ++static inline char *dwc_bh(void) { ++ return DWC_IN_BH() ? "BH" : ""; ++} ++ +/** + * A vprintf() clone. Just call vprintf if you've got it. + */ @@ -33591,7 +40735,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +#ifdef __GNUC__ + __attribute__ ((format(printf, 1, 2))); +#else -+ ; ++ ; +#endif +#define dwc_printf DWC_PRINTF + @@ -33600,9 +40744,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ +extern int DWC_SPRINTF(char *string, char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 2, 3))); ++ __attribute__ ((format(printf, 2, 3))); +#else -+ ; ++ ; +#endif +#define dwc_sprintf DWC_SPRINTF + @@ -33611,9 +40755,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ +extern int DWC_SNPRINTF(char *string, int size, char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 3, 4))); ++ __attribute__ ((format(printf, 3, 4))); +#else -+ ; ++ ; +#endif +#define dwc_snprintf DWC_SNPRINTF + @@ -33626,23 +40770,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ +extern void __DWC_WARN(char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 1, 2))); ++ __attribute__ ((format(printf, 1, 2))); +#else -+ ; ++ ; +#endif + +/** + * Prints an error message. On systems that don't differentiate between errors + * and regular log messages, just print it. Indicates that something went wrong -+ * with the driver, but it can be recovered from. Works like printf(). ++ * with the driver. Works like printf(). + * + * Use the DWC_ERROR macro to call this function. + */ +extern void __DWC_ERROR(char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 1, 2))); ++ __attribute__ ((format(printf, 1, 2))); +#else -+ ; ++ ; +#endif + +/** @@ -33655,12 +40799,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ +extern void DWC_EXCEPTION(char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 1, 2))); ++ __attribute__ ((format(printf, 1, 2))); +#else -+ ; ++ ; +#endif +#define dwc_exception DWC_EXCEPTION + ++#ifndef DWC_OTG_DEBUG_LEV ++#define DWC_OTG_DEBUG_LEV 0 ++#endif ++ +#ifdef DEBUG +/** + * Prints out a debug message. Used for logging/trace messages. @@ -33669,120 +40817,203 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ +extern void __DWC_DEBUG(char *format, ...) +#ifdef __GNUC__ -+ __attribute__ ((format(printf, 1, 2))); ++ __attribute__ ((format(printf, 1, 2))); +#else -+ ; ++ ; +#endif +#else +#define __DWC_DEBUG printk -+#include +#endif + +/** + * Prints out a Debug message. + */ -+#define DWC_DEBUG(_format, _args...) __DWC_DEBUG("DEBUG:%s:%s: " _format "\n", __func__, dwc_irq(), ## _args) ++#define DWC_DEBUG(_format, _args...) __DWC_DEBUG("DEBUG:%s:%s: " _format "\n", \ ++ __func__, dwc_irq(), ## _args) +#define dwc_debug DWC_DEBUG +/** ++ * Prints out a Debug message if enabled at compile time. ++ */ ++#if DWC_OTG_DEBUG_LEV > 0 ++#define DWC_DEBUGC(_format, _args...) DWC_DEBUG(_format, ##_args ) ++#else ++#define DWC_DEBUGC(_format, _args...) ++#endif ++#define dwc_debugc DWC_DEBUGC ++/** + * Prints out an informative message. + */ -+#define DWC_INFO(_format, _args...) DWC_PRINTF("INFO:%s: " _format "\n", dwc_irq(), ## _args) ++#define DWC_INFO(_format, _args...) DWC_PRINTF("INFO:%s: " _format "\n", \ ++ dwc_irq(), ## _args) +#define dwc_info DWC_INFO +/** ++ * Prints out an informative message if enabled at compile time. ++ */ ++#if DWC_OTG_DEBUG_LEV > 1 ++#define DWC_INFOC(_format, _args...) DWC_INFO(_format, ##_args ) ++#else ++#define DWC_INFOC(_format, _args...) ++#endif ++#define dwc_infoc DWC_INFOC ++/** + * Prints out a warning message. + */ -+#define DWC_WARN(_format, _args...) __DWC_WARN("WARN:%s:%s:%d: " _format "\n", dwc_irq(), __func__, __LINE__, ## _args) ++#define DWC_WARN(_format, _args...) __DWC_WARN("WARN:%s:%s:%d: " _format "\n", \ ++ dwc_irq(), __func__, __LINE__, ## _args) +#define dwc_warn DWC_WARN +/** + * Prints out an error message. + */ -+#define DWC_ERROR(_format, _args...) __DWC_ERROR("ERROR:%s:%s:%d: " _format "\n", dwc_irq(), __func__, __LINE__, ## _args) ++#define DWC_ERROR(_format, _args...) __DWC_ERROR("ERROR:%s:%s:%d: " _format "\n", \ ++ dwc_irq(), __func__, __LINE__, ## _args) +#define dwc_error DWC_ERROR + -+#define DWC_PROTO_ERROR(_format, _args...) __DWC_WARN("ERROR:%s:%s:%d: " _format "\n", dwc_irq(), __func__, __LINE__, ## _args) ++#define DWC_PROTO_ERROR(_format, _args...) __DWC_WARN("ERROR:%s:%s:%d: " _format "\n", \ ++ dwc_irq(), __func__, __LINE__, ## _args) +#define dwc_proto_error DWC_PROTO_ERROR + +#ifdef DEBUG +/** Prints out a exception error message if the _expr expression fails. Disabled + * if DEBUG is not enabled. */ -+#define DWC_ASSERT(_expr, _format, _args...) if (!(_expr)) { DWC_EXCEPTION("%s:%s:%d: " _format "\n", dwc_irq(), __FILE__, __LINE__, ## _args); } ++#define DWC_ASSERT(_expr, _format, _args...) do { \ ++ if (!(_expr)) { DWC_EXCEPTION("%s:%s:%d: " _format "\n", dwc_irq(), \ ++ __FILE__, __LINE__, ## _args); } \ ++ } while (0) +#else +#define DWC_ASSERT(_x...) +#endif +#define dwc_assert DWC_ASSERT + -+/** @name Byter Ordering ++ ++/** @name Byte Ordering + * The following functions are for conversions between processor's byte ordering + * and specific ordering you want. + */ + +/** Converts 32 bit data in CPU byte ordering to little endian. */ -+extern uint32_t DWC_CPU_TO_LE32(void *p); ++extern uint32_t DWC_CPU_TO_LE32(uint32_t *p); +#define dwc_cpu_to_le32 DWC_CPU_TO_LE32 ++ +/** Converts 32 bit data in CPU byte orderint to big endian. */ -+extern uint32_t DWC_CPU_TO_BE32(void *p); ++extern uint32_t DWC_CPU_TO_BE32(uint32_t *p); +#define dwc_cpu_to_be32 DWC_CPU_TO_BE32 + +/** Converts 32 bit little endian data to CPU byte ordering. */ -+extern uint32_t DWC_LE32_TO_CPU(void *p); ++extern uint32_t DWC_LE32_TO_CPU(uint32_t *p); +#define dwc_le32_to_cpu DWC_LE32_TO_CPU ++ +/** Converts 32 bit big endian data to CPU byte ordering. */ -+extern uint32_t DWC_BE32_TO_CPU(void *p); ++extern uint32_t DWC_BE32_TO_CPU(uint32_t *p); +#define dwc_be32_to_cpu DWC_BE32_TO_CPU + +/** Converts 16 bit data in CPU byte ordering to little endian. */ -+extern uint16_t DWC_CPU_TO_LE16(void *p); ++extern uint16_t DWC_CPU_TO_LE16(uint16_t *p); +#define dwc_cpu_to_le16 DWC_CPU_TO_LE16 ++ +/** Converts 16 bit data in CPU byte orderint to big endian. */ -+extern uint16_t DWC_CPU_TO_BE16(void *p); ++extern uint16_t DWC_CPU_TO_BE16(uint16_t *p); +#define dwc_cpu_to_be16 DWC_CPU_TO_BE16 + +/** Converts 16 bit little endian data to CPU byte ordering. */ -+extern uint16_t DWC_LE16_TO_CPU(void *p); ++extern uint16_t DWC_LE16_TO_CPU(uint16_t *p); +#define dwc_le16_to_cpu DWC_LE16_TO_CPU ++ +/** Converts 16 bit bi endian data to CPU byte ordering. */ -+extern uint16_t DWC_BE16_TO_CPU(void *p); ++extern uint16_t DWC_BE16_TO_CPU(uint16_t *p); +#define dwc_be16_to_cpu DWC_BE16_TO_CPU + ++ +/** @name Register Read/Write + * -+ * The following five functions should be implemented to read/write registers of ++ * The following six functions should be implemented to read/write registers of + * 32-bit and 64-bit sizes. All modules use this to read/write register values. + * The reg value is a pointer to the register calculated from the void *base + * variable passed into the driver when it is started. */ + ++#ifdef DWC_LINUX ++/* Linux doesn't need any extra parameters for register read/write, so we ++ * just throw away the IO context parameter. ++ */ +/** Reads the content of a 32-bit register. */ +extern uint32_t DWC_READ_REG32(uint32_t volatile *reg); -+#define dwc_read_reg32 DWC_READ_REG32 ++#define dwc_read_reg32(_ctx_,_reg_) DWC_READ_REG32(_reg_) ++ +/** Reads the content of a 64-bit register. */ +extern uint64_t DWC_READ_REG64(uint64_t volatile *reg); -+#define dwc_read_reg64 DWC_READ_REG64 ++#define dwc_read_reg64(_ctx_,_reg_) DWC_READ_REG64(_reg_) ++ +/** Writes to a 32-bit register. */ +extern void DWC_WRITE_REG32(uint32_t volatile *reg, uint32_t value); -+#define dwc_write_reg32 DWC_WRITE_REG32 ++#define dwc_write_reg32(_ctx_,_reg_,_val_) DWC_WRITE_REG32(_reg_, _val_) ++ +/** Writes to a 64-bit register. */ +extern void DWC_WRITE_REG64(uint64_t volatile *reg, uint64_t value); -+#define dwc_write_reg64 DWC_WRITE_REG64 -+/** ++#define dwc_write_reg64(_ctx_,_reg_,_val_) DWC_WRITE_REG64(_reg_, _val_) ++ ++/** + * Modify bit values in a register. Using the + * algorithm: (reg_contents & ~clear_mask) | set_mask. + */ +extern void DWC_MODIFY_REG32(uint32_t volatile *reg, uint32_t clear_mask, uint32_t set_mask); ++#define dwc_modify_reg32(_ctx_,_reg_,_cmsk_,_smsk_) DWC_MODIFY_REG32(_reg_,_cmsk_,_smsk_) ++extern void DWC_MODIFY_REG64(uint64_t volatile *reg, uint64_t clear_mask, uint64_t set_mask); ++#define dwc_modify_reg64(_ctx_,_reg_,_cmsk_,_smsk_) DWC_MODIFY_REG64(_reg_,_cmsk_,_smsk_) ++ ++#endif /* DWC_LINUX */ ++ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++typedef struct dwc_ioctx { ++ struct device *dev; ++ bus_space_tag_t iot; ++ bus_space_handle_t ioh; ++} dwc_ioctx_t; ++ ++/** BSD needs two extra parameters for register read/write, so we pass ++ * them in using the IO context parameter. ++ */ ++/** Reads the content of a 32-bit register. */ ++extern uint32_t DWC_READ_REG32(void *io_ctx, uint32_t volatile *reg); ++#define dwc_read_reg32 DWC_READ_REG32 ++ ++/** Reads the content of a 64-bit register. */ ++extern uint64_t DWC_READ_REG64(void *io_ctx, uint64_t volatile *reg); ++#define dwc_read_reg64 DWC_READ_REG64 ++ ++/** Writes to a 32-bit register. */ ++extern void DWC_WRITE_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t value); ++#define dwc_write_reg32 DWC_WRITE_REG32 ++ ++/** Writes to a 64-bit register. */ ++extern void DWC_WRITE_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t value); ++#define dwc_write_reg64 DWC_WRITE_REG64 ++ ++/** ++ * Modify bit values in a register. Using the ++ * algorithm: (reg_contents & ~clear_mask) | set_mask. ++ */ ++extern void DWC_MODIFY_REG32(void *io_ctx, uint32_t volatile *reg, uint32_t clear_mask, uint32_t set_mask); +#define dwc_modify_reg32 DWC_MODIFY_REG32 ++extern void DWC_MODIFY_REG64(void *io_ctx, uint64_t volatile *reg, uint64_t clear_mask, uint64_t set_mask); ++#define dwc_modify_reg64 DWC_MODIFY_REG64 ++ ++#endif /* DWC_FREEBSD || DWC_NETBSD */ + +/** @cond */ + -+/** @name Some convenience MACROS used internally. Define DEBUG_REGS to log the ++/** @name Some convenience MACROS used internally. Define DWC_DEBUG_REGS to log the + * register writes. */ + -+#ifdef DEBUG_REGS ++#ifdef DWC_LINUX ++ ++# ifdef DWC_DEBUG_REGS + +#define dwc_define_read_write_reg_n(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg##_n(_container_type *container, int num) { \ + return DWC_READ_REG32(&container->regs->_reg[num]); \ +} \ +static inline void dwc_write_##_reg##_n(_container_type *container, int num, uint32_t data) { \ -+ DWC_DEBUG("WRITING %8s[%d]: %p: %08x", #_reg, num, &(((uint32_t*)container->regs->_reg)[num]), data); \ ++ DWC_DEBUG("WRITING %8s[%d]: %p: %08x", #_reg, num, \ ++ &(((uint32_t*)container->regs->_reg)[num]), data); \ + DWC_WRITE_REG32(&(((uint32_t*)container->regs->_reg)[num]), data); \ +} + @@ -33791,11 +41022,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + return DWC_READ_REG32(&container->regs->_reg); \ +} \ +static inline void dwc_write_##_reg(_container_type *container, uint32_t data) { \ -+ DWC_DEBUG("WRITING %11s: %p: %08x", #_reg, &container->regs->_reg, data); \ ++ DWC_DEBUG("WRITING %11s: %p: %08x", #_reg, &container->regs->_reg, data); \ + DWC_WRITE_REG32(&container->regs->_reg, data); \ +} + -+#else ++# else /* DWC_DEBUG_REGS */ + +#define dwc_define_read_write_reg_n(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg##_n(_container_type *container, int num) { \ @@ -33813,11 +41044,59 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + DWC_WRITE_REG32(&container->regs->_reg, data); \ +} + -+#endif ++# endif /* DWC_DEBUG_REGS */ ++ ++#endif /* DWC_LINUX */ ++ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++ ++# ifdef DWC_DEBUG_REGS ++ ++#define dwc_define_read_write_reg_n(_reg,_container_type) \ ++static inline uint32_t dwc_read_##_reg##_n(void *io_ctx, _container_type *container, int num) { \ ++ return DWC_READ_REG32(io_ctx, &container->regs->_reg[num]); \ ++} \ ++static inline void dwc_write_##_reg##_n(void *io_ctx, _container_type *container, int num, uint32_t data) { \ ++ DWC_DEBUG("WRITING %8s[%d]: %p: %08x", #_reg, num, \ ++ &(((uint32_t*)container->regs->_reg)[num]), data); \ ++ DWC_WRITE_REG32(io_ctx, &(((uint32_t*)container->regs->_reg)[num]), data); \ ++} ++ ++#define dwc_define_read_write_reg(_reg,_container_type) \ ++static inline uint32_t dwc_read_##_reg(void *io_ctx, _container_type *container) { \ ++ return DWC_READ_REG32(io_ctx, &container->regs->_reg); \ ++} \ ++static inline void dwc_write_##_reg(void *io_ctx, _container_type *container, uint32_t data) { \ ++ DWC_DEBUG("WRITING %11s: %p: %08x", #_reg, &container->regs->_reg, data); \ ++ DWC_WRITE_REG32(io_ctx, &container->regs->_reg, data); \ ++} ++ ++# else /* DWC_DEBUG_REGS */ ++ ++#define dwc_define_read_write_reg_n(_reg,_container_type) \ ++static inline uint32_t dwc_read_##_reg##_n(void *io_ctx, _container_type *container, int num) { \ ++ return DWC_READ_REG32(io_ctx, &container->regs->_reg[num]); \ ++} \ ++static inline void dwc_write_##_reg##_n(void *io_ctx, _container_type *container, int num, uint32_t data) { \ ++ DWC_WRITE_REG32(io_ctx, &(((uint32_t*)container->regs->_reg)[num]), data); \ ++} ++ ++#define dwc_define_read_write_reg(_reg,_container_type) \ ++static inline uint32_t dwc_read_##_reg(void *io_ctx, _container_type *container) { \ ++ return DWC_READ_REG32(io_ctx, &container->regs->_reg); \ ++} \ ++static inline void dwc_write_##_reg(void *io_ctx, _container_type *container, uint32_t data) { \ ++ DWC_WRITE_REG32(io_ctx, &container->regs->_reg, data); \ ++} ++ ++# endif /* DWC_DEBUG_REGS */ ++ ++#endif /* DWC_FREEBSD || DWC_NETBSD */ + +/** @endcond */ + + ++#ifdef DWC_CRYPTOLIB +/** @name Crypto Functions + * + * These are the low-level cryptographic functions used by the driver. */ @@ -33825,16 +41104,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +/** Perform AES CBC */ +extern int DWC_AES_CBC(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t iv[16], uint8_t *out); +#define dwc_aes_cbc DWC_AES_CBC ++ +/** Fill the provided buffer with random bytes. These should be cryptographic grade random numbers. */ +extern void DWC_RANDOM_BYTES(uint8_t *buffer, uint32_t length); +#define dwc_random_bytes DWC_RANDOM_BYTES ++ +/** Perform the SHA-256 hash function */ +extern int DWC_SHA256(uint8_t *message, uint32_t len, uint8_t *out); +#define dwc_sha256 DWC_SHA256 ++ +/** Calculated the HMAC-SHA256 */ +extern int DWC_HMAC_SHA256(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t *out); +#define dwc_hmac_sha256 DWC_HMAC_SHA256 + ++#endif /* DWC_CRYPTOLIB */ ++ + +/** @name Memory Allocation + * @@ -33843,7 +41127,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * of the memory debugging routines need to be implemented. The allocation + * routines all ZERO the contents of the memory. + * -+ * Defining DEBUG_MEMORY turns on memory debugging and statistic gathering. ++ * Defining DWC_DEBUG_MEMORY turns on memory debugging and statistic gathering. + * This checks for memory leaks, keeping track of alloc/free pairs. It also + * keeps track of how much memory the driver is using at any given time. */ + @@ -33853,9 +41137,38 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + +#define DWC_INVALID_DMA_ADDR 0x0 + -+typedef uint32_t dwc_dma_t; ++#ifdef DWC_LINUX ++/** Type for a DMA address */ ++typedef dma_addr_t dwc_dma_t; ++#endif + -+/** @todo these functions will be added in the future */ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++typedef bus_addr_t dwc_dma_t; ++#endif ++ ++#ifdef DWC_FREEBSD ++typedef struct dwc_dmactx { ++ struct device *dev; ++ bus_dma_tag_t dma_tag; ++ bus_dmamap_t dma_map; ++ bus_addr_t dma_paddr; ++ void *dma_vaddr; ++} dwc_dmactx_t; ++#endif ++ ++#ifdef DWC_NETBSD ++typedef struct dwc_dmactx { ++ struct device *dev; ++ bus_dma_tag_t dma_tag; ++ bus_dmamap_t dma_map; ++ bus_dma_segment_t segs[1]; ++ int nsegs; ++ bus_addr_t dma_paddr; ++ void *dma_vaddr; ++} dwc_dmactx_t; ++#endif ++ ++/* @todo these functions will be added in the future */ +#if 0 +/** + * Creates a DMA pool from which you can allocate DMA buffers. Buffers @@ -33875,79 +41188,121 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * when you are done with it. + */ +extern dwc_pool_t *DWC_DMA_POOL_CREATE(uint32_t size, uint32_t align, uint32_t boundary); ++ +/** + * Destroy a DMA pool. All buffers allocated from that pool must be freed first. + */ +extern void DWC_DMA_POOL_DESTROY(dwc_pool_t *pool); ++ +/** + * Allocate a buffer from the specified DMA pool and zeros its contents. + */ +extern void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, uint64_t *dma_addr); ++ +/** + * Free a previously allocated buffer from the DMA pool. + */ +extern void DWC_DMA_POOL_FREE(dwc_pool_t *pool, void *vaddr, void *daddr); +#endif + -+ +/** Allocates a DMA capable buffer and zeroes its contents. */ -+extern void *__DWC_DMA_ALLOC(uint32_t size, dwc_dma_t *dma_addr); ++extern void *__DWC_DMA_ALLOC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr); + +/** Allocates a DMA capable buffer and zeroes its contents in atomic contest */ -+extern void *__DWC_DMA_ALLOC_ATOMIC(uint32_t size, dwc_dma_t *dma_addr); ++extern void *__DWC_DMA_ALLOC_ATOMIC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr); + -+/** Frees a previosly allocated buffer. */ -+extern void __DWC_DMA_FREE(uint32_t size, void *virt_addr, dwc_dma_t dma_addr); ++/** Frees a previously allocated buffer. */ ++extern void __DWC_DMA_FREE(void *dma_ctx, uint32_t size, void *virt_addr, dwc_dma_t dma_addr); + +/** Allocates a block of memory and zeroes its contents. */ -+extern void *__DWC_ALLOC(uint32_t size); ++extern void *__DWC_ALLOC(void *mem_ctx, uint32_t size); + +/** Allocates a block of memory and zeroes its contents, in an atomic manner + * which can be used inside interrupt context. The size should be sufficiently + * small, a few KB at most, such that failures are not likely to occur. Can just call + * __DWC_ALLOC if it is atomic. */ -+extern void *__DWC_ALLOC_ATOMIC(uint32_t size); ++extern void *__DWC_ALLOC_ATOMIC(void *mem_ctx, uint32_t size); + +/** Frees a previously allocated buffer. */ -+extern void __DWC_FREE(void *addr); ++extern void __DWC_FREE(void *mem_ctx, void *addr); + -+#ifndef DEBUG_MEMORY ++#ifndef DWC_DEBUG_MEMORY + -+#define DWC_ALLOC(_size_) __DWC_ALLOC(_size_) -+#define DWC_ALLOC_ATOMIC(_size_) __DWC_ALLOC_ATOMIC(_size_) -+#define DWC_FREE(_addr_) __DWC_FREE(_addr_) -+#define DWC_DMA_ALLOC(_size_,_dma_) __DWC_DMA_ALLOC(_size_,_dma_) -+#define DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) __DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) -+#define DWC_DMA_FREE(_size_,_virt_,_dma_) __DWC_DMA_FREE(_size_,_virt_,_dma_) ++#define DWC_ALLOC(_size_) __DWC_ALLOC(NULL, _size_) ++#define DWC_ALLOC_ATOMIC(_size_) __DWC_ALLOC_ATOMIC(NULL, _size_) ++#define DWC_FREE(_addr_) __DWC_FREE(NULL, _addr_) + -+#else ++# ifdef DWC_LINUX ++#define DWC_DMA_ALLOC(_size_,_dma_) __DWC_DMA_ALLOC(NULL, _size_, _dma_) ++#define DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) __DWC_DMA_ALLOC_ATOMIC(NULL, _size_,_dma_) ++#define DWC_DMA_FREE(_size_,_virt_,_dma_) __DWC_DMA_FREE(NULL, _size_, _virt_, _dma_) ++# endif + -+extern void *dwc_alloc_debug(uint32_t size, char const *func, int line); -+extern void *dwc_alloc_atomic_debug(uint32_t size, char const *func, int line); -+extern void dwc_free_debug(void *addr, char const *func, int line); -+extern void *dwc_dma_alloc_debug(uint32_t size, dwc_dma_t *dma_addr, char const *func, int line); ++# if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++#define DWC_DMA_ALLOC __DWC_DMA_ALLOC ++#define DWC_DMA_FREE __DWC_DMA_FREE ++# endif +extern void *dwc_dma_alloc_atomic_debug(uint32_t size, dwc_dma_t *dma_addr, char const *func, int line); -+extern void dwc_dma_free_debug(uint32_t size, void *virt_addr, dwc_dma_t dma_addr, char const *func, int line); + -+extern void dwc_memory_debug_start(void); ++#else /* DWC_DEBUG_MEMORY */ ++ ++extern void *dwc_alloc_debug(void *mem_ctx, uint32_t size, char const *func, int line); ++extern void *dwc_alloc_atomic_debug(void *mem_ctx, uint32_t size, char const *func, int line); ++extern void dwc_free_debug(void *mem_ctx, void *addr, char const *func, int line); ++extern void *dwc_dma_alloc_debug(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr, ++ char const *func, int line); ++extern void *dwc_dma_alloc_atomic_debug(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr, ++ char const *func, int line); ++extern void dwc_dma_free_debug(void *dma_ctx, uint32_t size, void *virt_addr, ++ dwc_dma_t dma_addr, char const *func, int line); ++ ++extern int dwc_memory_debug_start(void *mem_ctx); +extern void dwc_memory_debug_stop(void); +extern void dwc_memory_debug_report(void); + -+#define DWC_ALLOC(_size_) (dwc_alloc_debug(_size_, __func__, __LINE__)) -+#define DWC_ALLOC_ATOMIC(_size_) (dwc_alloc_atomic_debug(_size_, __func__, __LINE__)) -+#define DWC_FREE(_addr_) (dwc_free_debug(_addr_, __func__, __LINE__)) -+#define DWC_DMA_ALLOC(_size_,_dma_) dwc_dma_alloc_debug(_size_, _dma_, __func__, __LINE__) -+#define DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) dwc_dma_alloc_atomic_debug(_size_, _dma_, __func__, __LINE__) -+#define DWC_DMA_FREE(_size_,_virt_,_dma_) dwc_dma_free_debug(_size_, _virt_, _dma_, __func__, __LINE__) ++#define DWC_ALLOC(_size_) dwc_alloc_debug(NULL, _size_, __func__, __LINE__) ++#define DWC_ALLOC_ATOMIC(_size_) dwc_alloc_atomic_debug(NULL, _size_, \ ++ __func__, __LINE__) ++#define DWC_FREE(_addr_) dwc_free_debug(NULL, _addr_, __func__, __LINE__) + -+#endif /* DEBUG_MEMORY */ ++# ifdef DWC_LINUX ++#define DWC_DMA_ALLOC(_size_,_dma_) dwc_dma_alloc_debug(NULL, _size_, \ ++ _dma_, __func__, __LINE__) ++#define DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) dwc_dma_alloc_atomic_debug(NULL, _size_, \ ++ _dma_, __func__, __LINE__) ++#define DWC_DMA_FREE(_size_,_virt_,_dma_) dwc_dma_free_debug(NULL, _size_, \ ++ _virt_, _dma_, __func__, __LINE__) ++# endif + -+#define dwc_alloc DWC_ALLOC -+#define dwc_alloc_atomic DWC_ALLOC_ATOMIC -+#define dwc_free DWC_FREE ++# if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++#define DWC_DMA_ALLOC(_ctx_,_size_,_dma_) dwc_dma_alloc_debug(_ctx_, _size_, \ ++ _dma_, __func__, __LINE__) ++#define DWC_DMA_FREE(_ctx_,_size_,_virt_,_dma_) dwc_dma_free_debug(_ctx_, _size_, \ ++ _virt_, _dma_, __func__, __LINE__) ++# endif ++ ++#endif /* DWC_DEBUG_MEMORY */ ++ ++#define dwc_alloc(_ctx_,_size_) DWC_ALLOC(_size_) ++#define dwc_alloc_atomic(_ctx_,_size_) DWC_ALLOC_ATOMIC(_size_) ++#define dwc_free(_ctx_,_addr_) DWC_FREE(_addr_) ++ ++#ifdef DWC_LINUX ++/* Linux doesn't need any extra parameters for DMA buffer allocation, so we ++ * just throw away the DMA context parameter. ++ */ ++#define dwc_dma_alloc(_ctx_,_size_,_dma_) DWC_DMA_ALLOC(_size_, _dma_) ++#define dwc_dma_alloc_atomic(_ctx_,_size_,_dma_) DWC_DMA_ALLOC_ATOMIC(_size_, _dma_) ++#define dwc_dma_free(_ctx_,_size_,_virt_,_dma_) DWC_DMA_FREE(_size_, _virt_, _dma_) ++#endif ++ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++/** BSD needs several extra parameters for DMA buffer allocation, so we pass ++ * them in using the DMA context parameter. ++ */ +#define dwc_dma_alloc DWC_DMA_ALLOC -+#define dwc_dma_alloc_atomic DWC_DMA_ALLOC_ATOMIC +#define dwc_dma_free DWC_DMA_FREE ++#endif + + +/** @name Memory and String Processing */ @@ -33955,24 +41310,31 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +/** memset() clone */ +extern void *DWC_MEMSET(void *dest, uint8_t byte, uint32_t size); +#define dwc_memset DWC_MEMSET ++ +/** memcpy() clone */ +extern void *DWC_MEMCPY(void *dest, void const *src, uint32_t size); +#define dwc_memcpy DWC_MEMCPY ++ +/** memmove() clone */ +extern void *DWC_MEMMOVE(void *dest, void *src, uint32_t size); +#define dwc_memmove DWC_MEMMOVE ++ +/** memcmp() clone */ +extern int DWC_MEMCMP(void *m1, void *m2, uint32_t size); +#define dwc_memcmp DWC_MEMCMP ++ +/** strcmp() clone */ +extern int DWC_STRCMP(void *s1, void *s2); +#define dwc_strcmp DWC_STRCMP ++ +/** strncmp() clone */ +extern int DWC_STRNCMP(void *s1, void *s2, uint32_t size); +#define dwc_strncmp DWC_STRNCMP ++ +/** strlen() clone, for NULL terminated ASCII strings */ +extern int DWC_STRLEN(char const *str); +#define dwc_strlen DWC_STRLEN ++ +/** strcpy() clone, for NULL terminated ASCII strings */ +extern char *DWC_STRCPY(char *to, const char *from); +#define dwc_strcpy DWC_STRCPY @@ -33982,7 +41344,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * calling a predefined strdup. Otherwise the memory allocated by this routine + * will not be seen by the debugging routines. */ +extern char *DWC_STRDUP(char const *str); -+#define dwc_strdup DWC_STRDUP ++#define dwc_strdup(_ctx_,_str_) DWC_STRDUP(_str_) + +/** NOT an atoi() clone. Read the description carefully. Returns an integer + * converted from the string str in base 10 unless the string begins with a "0x" @@ -33994,14 +41356,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * conversion are undefined. On sucess it returns 0. Overflow conditions are + * undefined. An example implementation using atoi() can be referenced from the + * Linux implementation. */ -+extern int DWC_ATOI(char *str, int32_t *value); ++extern int DWC_ATOI(const char *str, int32_t *value); +#define dwc_atoi DWC_ATOI ++ +/** Same as above but for unsigned. */ -+extern int DWC_ATOUI(char *str, uint32_t *value); ++extern int DWC_ATOUI(const char *str, uint32_t *value); +#define dwc_atoui DWC_ATOUI ++ ++#ifdef DWC_UTFLIB +/** This routine returns a UTF16LE unicode encoded string from a UTF8 string. */ +extern int DWC_UTF8_TO_UTF16LE(uint8_t const *utf8string, uint16_t *utf16string, unsigned len); +#define dwc_utf8_to_utf16le DWC_UTF8_TO_UTF16LE ++#endif ++ + +/** @name Wait queues + * @@ -34011,6 +41378,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * unblocked and the condition will be check again. Waitqs should be triggered + * every time a condition can potentially change.*/ +struct dwc_waitq; ++ ++/** Type for a waitq */ +typedef struct dwc_waitq dwc_waitq_t; + +/** The type of waitq condition callback function. This is called every time @@ -34019,7 +41388,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + +/** Allocate a waitq */ +extern dwc_waitq_t *DWC_WAITQ_ALLOC(void); -+#define dwc_waitq_alloc DWC_WAITQ_ALLOC ++#define dwc_waitq_alloc(_ctx_) DWC_WAITQ_ALLOC() ++ +/** Free a waitq */ +extern void DWC_WAITQ_FREE(dwc_waitq_t *wq); +#define dwc_waitq_free DWC_WAITQ_FREE @@ -34027,23 +41397,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +/** Check the condition and if it is false, block on the waitq. When unblocked, check the + * condition again. The function returns when the condition becomes true. The return value + * is 0 on condition true, DWC_WAITQ_ABORTED on abort or killed, or DWC_WAITQ_UNKNOWN on error. */ -+extern int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t condition, void *data); -+#define dwc_waitq_wait DWC_WAITQ_WAIT; ++extern int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, void *data); ++#define dwc_waitq_wait DWC_WAITQ_WAIT ++ +/** Check the condition and if it is false, block on the waitq. When unblocked, + * check the condition again. The function returns when the condition become + * true or the timeout has passed. The return value is 0 on condition true or + * DWC_TIMED_OUT on timeout, or DWC_WAITQ_ABORTED, or DWC_WAITQ_UNKNOWN on + * error. */ -+extern int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t condition, void *data, int32_t msecs); ++extern int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, ++ void *data, int32_t msecs); +#define dwc_waitq_wait_timeout DWC_WAITQ_WAIT_TIMEOUT ++ +/** Trigger a waitq, unblocking all processes. This should be called whenever a condition + * has potentially changed. */ +extern void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq); +#define dwc_waitq_trigger DWC_WAITQ_TRIGGER ++ +/** Unblock all processes waiting on the waitq with an ABORTED result. */ +extern void DWC_WAITQ_ABORT(dwc_waitq_t *wq); +#define dwc_waitq_abort DWC_WAITQ_ABORT + ++ +/** @name Threads + * + * A thread must be explicitly stopped. It must check DWC_THREAD_SHOULD_STOP @@ -34052,6 +41427,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ + +struct dwc_thread; ++ ++/** Type for a thread */ +typedef struct dwc_thread dwc_thread_t; + +/** The thread function */ @@ -34059,21 +41436,42 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + +/** Create a thread and start it running the thread_function. Returns a handle + * to the thread */ -+extern dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t thread_function, char *name, void *data); -+#define dwc_thread_run DWC_THREAD_RUN ++extern dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t func, char *name, void *data); ++#define dwc_thread_run(_ctx_,_func_,_name_,_data_) DWC_THREAD_RUN(_func_, _name_, _data_) ++ +/** Stops a thread. Return the value returned by the thread. Or will return + * DWC_ABORT if the thread never started. */ +extern int DWC_THREAD_STOP(dwc_thread_t *thread); +#define dwc_thread_stop DWC_THREAD_STOP ++ +/** Signifies to the thread that it must stop. */ ++#ifdef DWC_LINUX ++/* Linux doesn't need any parameters for kthread_should_stop() */ +extern dwc_bool_t DWC_THREAD_SHOULD_STOP(void); ++#define dwc_thread_should_stop(_thrd_) DWC_THREAD_SHOULD_STOP() ++ ++/* No thread_exit function in Linux */ ++#define dwc_thread_exit(_thrd_) ++#endif ++ ++#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) ++/** BSD needs the thread pointer for kthread_suspend_check() */ ++extern dwc_bool_t DWC_THREAD_SHOULD_STOP(dwc_thread_t *thread); +#define dwc_thread_should_stop DWC_THREAD_SHOULD_STOP + ++/** The thread must call this to exit. */ ++extern void DWC_THREAD_EXIT(dwc_thread_t *thread); ++#define dwc_thread_exit DWC_THREAD_EXIT ++#endif ++ ++ +/** @name Work queues + * + * Workqs are used to queue a callback function to be called at some later time, + * in another thread. */ +struct dwc_workq; ++ ++/** Type for a workq */ +typedef struct dwc_workq dwc_workq_t; + +/** The type of the callback function to be called. */ @@ -34081,33 +41479,38 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + +/** Allocate a workq */ +extern dwc_workq_t *DWC_WORKQ_ALLOC(char *name); -+#define dwc_workq_alloc DWC_WORKQ_ALLOC ++#define dwc_workq_alloc(_ctx_,_name_) DWC_WORKQ_ALLOC(_name_) ++ +/** Free a workq. All work must be completed before being freed. */ +extern void DWC_WORKQ_FREE(dwc_workq_t *workq); +#define dwc_workq_free DWC_WORKQ_FREE ++ +/** Schedule a callback on the workq, passing in data. The function will be + * scheduled at some later time. */ -+extern void DWC_WORKQ_SCHEDULE(dwc_workq_t *workq, dwc_work_callback_t work_cb, void *data, char *format, ...) ++extern void DWC_WORKQ_SCHEDULE(dwc_workq_t *workq, dwc_work_callback_t cb, ++ void *data, char *format, ...) +#ifdef __GNUC__ + __attribute__ ((format(printf, 4, 5))); +#else -+ ; ++ ; +#endif +#define dwc_workq_schedule DWC_WORKQ_SCHEDULE + -+/** Schedule a callback on the workq, that will be called until at least ++/** Schedule a callback on the workq, that will be called until at least + * given number miliseconds have passed. */ -+extern void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *workq, dwc_work_callback_t work_cb, void *data, uint32_t time, char *format, ...) ++extern void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *workq, dwc_work_callback_t cb, ++ void *data, uint32_t time, char *format, ...) +#ifdef __GNUC__ + __attribute__ ((format(printf, 5, 6))); +#else -+ ; ++ ; +#endif +#define dwc_workq_schedule_delayed DWC_WORKQ_SCHEDULE_DELAYED + +/** The number of processes in the workq */ +extern int DWC_WORKQ_PENDING(dwc_workq_t *workq); +#define dwc_workq_pending DWC_WORKQ_PENDING ++ +/** Blocks until all the work in the workq is complete or timed out. Returns < + * 0 on timeout. */ +extern int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout); @@ -34118,14 +41521,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * + */ +struct dwc_tasklet; ++ ++/** Type for a tasklet */ +typedef struct dwc_tasklet dwc_tasklet_t; + ++/** The type of the callback function to be called */ +typedef void (*dwc_tasklet_callback_t)(void *data); + -+extern dwc_tasklet_t *DWC_TASK_ALLOC(dwc_tasklet_callback_t cb, void *data); -+#define dwc_task_alloc DWC_TASK_ALLOC -+extern void DWC_TASK_FREE(dwc_tasklet_t *t); ++/** Allocates a tasklet */ ++extern dwc_tasklet_t *DWC_TASK_ALLOC(char *name, dwc_tasklet_callback_t cb, void *data); ++#define dwc_task_alloc(_ctx_,_name_,_cb_,_data_) DWC_TASK_ALLOC(_name_, _cb_, _data_) ++ ++/** Frees a tasklet */ ++extern void DWC_TASK_FREE(dwc_tasklet_t *task); +#define dwc_task_free DWC_TASK_FREE ++ ++/** Schedules a tasklet to run */ +extern void DWC_TASK_SCHEDULE(dwc_tasklet_t *task); +#define dwc_task_schedule DWC_TASK_SCHEDULE + @@ -34135,12 +41546,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * Callbacks must be small and atomic. + */ +struct dwc_timer; ++ ++/** Type for a timer */ +typedef struct dwc_timer dwc_timer_t; + ++/** The type of the callback function to be called */ +typedef void (*dwc_timer_callback_t)(void *data); + ++/** Allocates a timer */ +extern dwc_timer_t *DWC_TIMER_ALLOC(char *name, dwc_timer_callback_t cb, void *data); -+#define dwc_timer_alloc DWC_TIMER_ALLOC ++#define dwc_timer_alloc(_ctx_,_name_,_cb_,_data_) DWC_TIMER_ALLOC(_name_,_cb_,_data_) ++ ++/** Frees a timer */ +extern void DWC_TIMER_FREE(dwc_timer_t *timer); +#define dwc_timer_free DWC_TIMER_FREE + @@ -34157,7 +41574,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +#define dwc_timer_cancel DWC_TIMER_CANCEL + + -+ +/** @name Spinlocks + * + * These locks are used when the work between the lock/unlock is atomic and @@ -34170,25 +41586,30 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * change, and so you never have to lock between processes. */ + +struct dwc_spinlock; ++ ++/** Type for a spinlock */ +typedef struct dwc_spinlock dwc_spinlock_t; + ++/** Type for the 'flags' argument to spinlock funtions */ ++typedef unsigned long dwc_irqflags_t; ++ +/** Returns an initialized lock variable. This function should allocate and + * initialize the OS-specific data structure used for locking. This data + * structure is to be used for the DWC_LOCK and DWC_UNLOCK functions and should + * be freed by the DWC_FREE_LOCK when it is no longer used. */ +extern dwc_spinlock_t *DWC_SPINLOCK_ALLOC(void); -+#define dwc_spinlock_alloc DWC_SPINLOCK_ALLOC ++#define dwc_spinlock_alloc(_ctx_) DWC_SPINLOCK_ALLOC() + +/** Frees an initialized lock variable. */ +extern void DWC_SPINLOCK_FREE(dwc_spinlock_t *lock); -+#define dwc_spinlock_free DWC_SPINLOCK_FREE ++#define dwc_spinlock_free(_ctx_,_lock_) DWC_SPINLOCK_FREE(_lock_) + +/** Disables interrupts and blocks until it acquires the lock. + * + * @param lock Pointer to the spinlock. + * @param flags Unsigned long for irq flags storage. + */ -+extern void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, uint64_t *flags); ++extern void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, dwc_irqflags_t *flags); +#define dwc_spinlock_irqsave DWC_SPINLOCK_IRQSAVE + +/** Re-enables the interrupt and releases the lock. @@ -34197,7 +41618,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * @param flags Unsigned long for irq flags storage. Must be the same as was + * passed into DWC_LOCK. + */ -+extern void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, uint64_t flags); ++extern void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, dwc_irqflags_t flags); +#define dwc_spinunlock_irqrestore DWC_SPINUNLOCK_IRQRESTORE + +/** Blocks until it acquires the lock. @@ -34214,6 +41635,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +extern void DWC_SPINUNLOCK(dwc_spinlock_t *lock); +#define dwc_spinunlock DWC_SPINUNLOCK + ++ +/** @name Mutexes + * + * Unlike spinlocks Mutexes lock only between processes and the work between the @@ -34221,43 +41643,49 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + */ + +struct dwc_mutex; -+typedef struct dwc_mutex dwc_mutex_t; + ++/** Type for a mutex */ ++typedef struct dwc_mutex dwc_mutex_t; + +/* For Linux Mutex Debugging make it inline because the debugging routines use + * the symbol to determine recursive locking. This makes it falsely think + * recursive locking occurs. */ -+#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) ++#if defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES) +#define DWC_MUTEX_ALLOC_LINUX_DEBUG(__mutexp) ({ \ + __mutexp = (dwc_mutex_t *)DWC_ALLOC(sizeof(struct mutex)); \ + mutex_init((struct mutex *)__mutexp); \ +}) +#endif ++ ++/** Allocate a mutex */ +extern dwc_mutex_t *DWC_MUTEX_ALLOC(void); -+#define dwc_mutex_alloc DWC_MUTEX_ALLOC ++#define dwc_mutex_alloc(_ctx_) DWC_MUTEX_ALLOC() + +/* For memory leak debugging when using Linux Mutex Debugging */ -+#if (defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES)) ++#if defined(DWC_LINUX) && defined(CONFIG_DEBUG_MUTEXES) +#define DWC_MUTEX_FREE(__mutexp) do { \ + mutex_destroy((struct mutex *)__mutexp); \ + DWC_FREE(__mutexp); \ +} while(0) +#else ++/** Free a mutex */ +extern void DWC_MUTEX_FREE(dwc_mutex_t *mutex); -+#define dwc_mutex_free DWC_MUTEX_FREE ++#define dwc_mutex_free(_ctx_,_mutex_) DWC_MUTEX_FREE(_mutex_) +#endif + ++/** Lock a mutex */ +extern void DWC_MUTEX_LOCK(dwc_mutex_t *mutex); +#define dwc_mutex_lock DWC_MUTEX_LOCK ++ +/** Non-blocking lock returns 1 on successful lock. */ +extern int DWC_MUTEX_TRYLOCK(dwc_mutex_t *mutex); +#define dwc_mutex_trylock DWC_MUTEX_TRYLOCK ++ ++/** Unlock a mutex */ +extern void DWC_MUTEX_UNLOCK(dwc_mutex_t *mutex); +#define dwc_mutex_unlock DWC_MUTEX_UNLOCK + + -+ -+ +/** @name Time */ + +/** Microsecond delay. @@ -34282,15 +41710,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot +extern void DWC_MSLEEP(uint32_t msecs); +#define dwc_msleep DWC_MSLEEP + ++/** ++ * Returns number of milliseconds since boot. ++ */ +extern uint32_t DWC_TIME(void); +#define dwc_time DWC_TIME + -+#endif // _DWC_OS_H_ + + + -+ -+/** @mainpage DWC Portability and Common Library ++/* @mainpage DWC Portability and Common Library + * + * This is the documentation for the DWC Portability and Common Library. + * @@ -34382,100 +41811,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/dwc_os.h linux-rpi-boot + * threading should be able to be implemented with the defined behavior. + * + */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/Makefile linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/Makefile ---- linux-3.2.23/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/Makefile 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,46 @@ -+# -+# Makefile for DWC_common library -+# + -+ifneq ($(KERNELRELEASE),) ++#ifdef __cplusplus ++} ++#endif + -+#CPPFLAGS += -DDEBUG_MEMORY -+ -+ifeq ($(CONFIG_USB_DEBUG),y) -+CPPFLAGS += -DDEBUG -+endif -+CPPFLAGS += -DDWC_LINUX -+ -+obj-$(CONFIG_USB_DWCOTG) += dwc_common_port_lib.o -+dwc_common_port_lib-objs := dwc_cc.o \ -+ dwc_notifier.o \ -+ dwc_common_linux.o dwc_mem.o -+ -+kernrelwd := $(subst ., ,$(KERNELRELEASE)) -+kernrel3 := $(word 1,$(kernrelwd)).$(word 2,$(kernrelwd)).$(word 3,$(kernrelwd)) -+ -+ifneq ($(kernrel3),2.6.20) -+# grayg - I only know that we use EXTRA_CFLAGS in 2.6.31 actually -+EXTRA_CFLAGS += $(CPPFLAGS) -+endif -+ -+else -+ -+ifeq ($(DOXYGEN),) -+DOXYGEN := $(DOXYGEN) -+endif -+ -+default: -+ $(MAKE) -C$(KDIR) M=$(PWD) modules -+ -+docs: $(wildcard *.[hc]) doc/doxygen.cfg -+ $(DOXYGEN) doc/doxygen.cfg -+ -+tags: $(wildcard *.[hc]) -+ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) -+ -+endif -+ -+clean: -+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers -+ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/Makefile.linux linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/Makefile.linux ---- linux-3.2.23/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/Makefile.linux 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,36 @@ -+# -+# Makefile for DWC_common library -+# -+ifneq ($(KERNELRELEASE),) -+ -+#CPPFLAGS += -DDEBUG_MEMORY -+ -+#CPPFLAGS += -DDEBUG -+CPPFLAGS += -DDWC_LINUX -+ -+obj-m := dwc_common_port_lib.o -+dwc_common_port_lib-objs := dwc_cc.o dwc_modpow.o dwc_dh.o \ -+ dwc_crypto.o dwc_notifier.o \ -+ dwc_common_linux.o dwc_mem.o -+ -+else -+ -+ -+ifeq ($(DOXYGEN),) -+DOXYGEN := $(DOXYGEN) -+endif -+ -+default: -+ $(MAKE) -C$(KDIR) M=$(PWD) modules -+ -+docs: $(wildcard *.[hc]) doc/doxygen.cfg -+ $(DOXYGEN) doc/doxygen.cfg -+ -+tags: $(wildcard *.[hc]) -+ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) -+ -+endif -+ -+clean: -+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers -+ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/usb.h ---- linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_common_port/usb.h 2012-07-15 20:29:18.989081834 +0200 -@@ -0,0 +1,850 @@ ++#endif /* _DWC_OS_H_ */ +diff --git a/drivers/usb/host/dwc_common_port/usb.h b/drivers/usb/host/dwc_common_port/usb.h +new file mode 100644 +index 0000000..27bda82 +--- /dev/null ++++ b/drivers/usb/host/dwc_common_port/usb.h +@@ -0,0 +1,946 @@ +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. @@ -34519,7 +41866,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#ifndef _USB_H_ +#define _USB_H_ + -+#include "dwc_os.h" ++#ifdef __cplusplus ++extern "C" { ++#endif + +/* + * The USB records contain some unaligned little-endian word @@ -34532,6 +41881,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +typedef u_int8_t uDWord[4]; + +#define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) ++#define UCONSTW(x) { (x) & 0xff, ((x) >> 8) & 0xff } ++#define UCONSTDW(x) { (x) & 0xff, ((x) >> 8) & 0xff, \ ++ ((x) >> 16) & 0xff, ((x) >> 24) & 0xff } + +#if 1 +#define UGETW(w) ((w)[0] | ((w)[1] << 8)) @@ -34552,6 +41904,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define USETDW(w,v) (*(u_int32_t *)(w) = (v)) +#endif + ++/* ++ * Macros for accessing UAS IU fields, which are big-endian ++ */ ++#define IUSETW2(w,h,l) ((w)[0] = (u_int8_t)(h), (w)[1] = (u_int8_t)(l)) ++#define IUCONSTW(x) { ((x) >> 8) & 0xff, (x) & 0xff } ++#define IUCONSTDW(x) { ((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \ ++ ((x) >> 8) & 0xff, (x) & 0xff } ++#define IUGETW(w) (((w)[0] << 8) | (w)[1]) ++#define IUSETW(w,v) ((w)[0] = (u_int8_t)((v) >> 8), (w)[1] = (u_int8_t)(v)) ++#define IUGETDW(w) (((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) ++#define IUSETDW(w,v) ((w)[0] = (u_int8_t)((v) >> 24), \ ++ (w)[1] = (u_int8_t)((v) >> 16), \ ++ (w)[2] = (u_int8_t)((v) >> 8), \ ++ (w)[3] = (u_int8_t)(v)) ++ +#define UPACKED __attribute__((__packed__)) + +typedef struct { @@ -34618,6 +41985,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define UDESC_STRING 0x03 +#define UDESC_INTERFACE 0x04 +#define UDESC_ENDPOINT 0x05 ++#define UDESC_SS_USB_COMPANION 0x30 +#define UDESC_DEVICE_QUALIFIER 0x06 +#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 +#define UDESC_INTERFACE_POWER 0x08 @@ -34635,6 +42003,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define WUDESC_BOS 0x0f +#define WUDESC_DEVICE_CAPABILITY 0x10 +#define WUDESC_WIRELESS_ENDPOINT_COMPANION 0x11 ++#define UDESC_BOS 0x0f ++#define UDESC_DEVICE_CAPABILITY 0x10 +#define UDESC_CS_DEVICE 0x21 /* class specific */ +#define UDESC_CS_CONFIG 0x22 +#define UDESC_CS_STRING 0x23 @@ -34655,11 +42025,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define WUR_SET_SECURITY_DATA 0x12 +#define WUR_GET_SECURITY_DATA 0x13 +#define WUR_SET_WUSB_DATA 0x14 -+#define WUDATA_DRPIE_INFO 0x01 -+#define WUDATA_TRANSMIT_DATA 0x02 -+#define WUDATA_TRANSMIT_PARAMS 0x03 -+#define WUDATA_RECEIVE_PARAMS 0x04 -+#define WUDATA_TRANSMIT_POWER 0x05 ++#define WUDATA_DRPIE_INFO 0x01 ++#define WUDATA_TRANSMIT_DATA 0x02 ++#define WUDATA_TRANSMIT_PARAMS 0x03 ++#define WUDATA_RECEIVE_PARAMS 0x04 ++#define WUDATA_TRANSMIT_POWER 0x05 +#define WUR_LOOPBACK_DATA_WRITE 0x15 +#define WUR_LOOPBACK_DATA_READ 0x16 +#define WUR_SET_INTERFACE_DS 0x17 @@ -34671,11 +42041,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define UF_DEVICE_B_HNP_ENABLE 3 +#define UF_DEVICE_A_HNP_SUPPORT 4 +#define UF_DEVICE_A_ALT_HNP_SUPPORT 5 -+#define WUF_WUSB 3 -+#define WUF_TX_DRPIE 0x0 -+#define WUF_DEV_XMIT_PACKET 0x1 -+#define WUF_COUNT_PACKETS 0x2 -+#define WUF_CAPTURE_PACKETS 0x3 ++#define WUF_WUSB 3 ++#define WUF_TX_DRPIE 0x0 ++#define WUF_DEV_XMIT_PACKET 0x1 ++#define WUF_COUNT_PACKETS 0x2 ++#define WUF_CAPTURE_PACKETS 0x3 ++#define UF_FUNCTION_SUSPEND 0 ++#define UF_U1_ENABLE 48 ++#define UF_U2_ENABLE 49 ++#define UF_LTM_ENABLE 50 + +/* Class requests from the USB 2.0 hub spec, table 11-15 */ +#define UCR_CLEAR_HUB_FEATURE (0x2000 | UR_CLEAR_FEATURE) @@ -34687,6 +42061,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define UCR_SET_PORT_FEATURE (0x2300 | UR_SET_FEATURE) +#define UCR_SET_AND_TEST_PORT_FEATURE (0xa300 | UR_SET_AND_TEST_FEATURE) + ++#ifdef _MSC_VER ++#include ++#endif ++ +typedef struct { + uByte bLength; + uByte bDescriptorType; @@ -34696,6 +42074,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +typedef struct { + uByte bLength; + uByte bDescriptorType; ++} UPACKED usb_descriptor_header_t; ++ ++typedef struct { ++ uByte bLength; ++ uByte bDescriptorType; + uWord bcdUSB; +#define UD_USB_2_0 0x0200 +#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0) @@ -34721,6 +42104,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 + uByte bNumInterface; + uByte bConfigurationValue; + uByte iConfiguration; ++#define UC_ATT_ONE (1 << 7) /* must be set */ ++#define UC_ATT_SELFPOWER (1 << 6) /* self powered */ ++#define UC_ATT_WAKEUP (1 << 5) /* can wakeup */ ++#define UC_ATT_BATTERY (1 << 4) /* battery powered */ + uByte bmAttributes; +#define UC_BUS_POWERED 0x80 +#define UC_SELF_POWERED 0x40 @@ -34770,6 +42157,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +} UPACKED usb_endpoint_descriptor_t; +#define USB_ENDPOINT_DESCRIPTOR_SIZE 7 + ++typedef struct ss_endpoint_companion_descriptor { ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bMaxBurst; ++#define USSE_GET_MAX_STREAMS(a) ((a) & 0x1f) ++#define USSE_SET_MAX_STREAMS(a, b) ((a) | ((b) & 0x1f)) ++#define USSE_GET_MAX_PACKET_NUM(a) ((a) & 0x03) ++#define USSE_SET_MAX_PACKET_NUM(a, b) ((a) | ((b) & 0x03)) ++ uByte bmAttributes; ++ uWord wBytesPerInterval; ++} UPACKED ss_endpoint_companion_descriptor_t; ++#define USB_SS_ENDPOINT_COMPANION_DESCRIPTOR_SIZE 6 ++ +typedef struct { + uByte bLength; + uByte bDescriptorType; @@ -34898,6 +42298,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define UPS_C_PORT_RESET 0x0010 +} UPACKED usb_port_status_t; + ++#ifdef _MSC_VER ++#include ++#endif ++ +/* Device class codes */ +#define UDCLASS_IN_INTERFACE 0x00 +#define UDCLASS_COMM 0x02 @@ -34921,13 +42325,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define UISUBCLASS_MIDISTREAM 3 + +#define UICLASS_CDC 0x02 /* communication */ -+#define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 ++#define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 +#define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 -+#define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 -+#define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 -+#define UISUBCLASS_CAPI_CONTROLMODEL 5 -+#define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 -+#define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 ++#define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 ++#define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 ++#define UISUBCLASS_CAPI_CONTROLMODEL 5 ++#define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 ++#define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 +#define UIPROTO_CDC_AT 1 + +#define UICLASS_HID 0x03 @@ -34997,7 +42401,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 + +#define UICLASS_VENDOR 0xff + -+ +#define USB_HUB_MAX_DEPTH 5 + +/* @@ -35036,7 +42439,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 + +#define USB_BUS_RESET_DELAY 100 /* ms XXX?*/ + -+ +#define USB_UNCONFIG_NO 0 +#define USB_UNCONFIG_INDEX (-1) + @@ -35116,9 +42518,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 + u_int8_t udi_protocol; + u_int8_t udi_config; + u_int8_t udi_speed; -+#define USB_SPEED_LOW 1 -+#define USB_SPEED_FULL 2 -+#define USB_SPEED_HIGH 3 ++#define USB_SPEED_UNKNOWN 0 ++#define USB_SPEED_LOW 1 ++#define USB_SPEED_FULL 2 ++#define USB_SPEED_HIGH 3 ++#define USB_SPEED_VARIABLE 4 ++#define USB_SPEED_SUPER 5 + int udi_power; /* power consumption in mA, 0 if selfpowered */ + int udi_nports; + char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; @@ -35138,17 +42543,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 + u_long uds_requests[4]; /* indexed by transfer type UE_* */ +}; + -+ -+ -+ +#define WUSB_MIN_IE 0x80 +#define WUSB_WCTA_IE 0x80 +#define WUSB_WCONNECTACK_IE 0x81 +#define WUSB_WHOSTINFO_IE 0x82 +#define WUHI_GET_CA(_bmAttributes_) ((_bmAttributes_) & 0x3) -+#define WUHI_CA_RECONN 0x00 -+#define WUHI_CA_LIMITED 0x01 -+#define WUHI_CA_ALL 0x03 ++#define WUHI_CA_RECONN 0x00 ++#define WUHI_CA_LIMITED 0x01 ++#define WUHI_CA_ALL 0x03 +#define WUHI_GET_MLSI(_bmAttributes_) (((_bmAttributes_) & 0x38) >> 3) +#define WUSB_WCHCHANGEANNOUNCE_IE 0x83 +#define WUSB_WDEV_DISCONNECT_IE 0x84 @@ -35179,156 +42581,516 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_common_port/usb.h linux-rpi-bootc-3 +#define WUSB_DN_ALIVE 0x07 +#define WUSB_DN_MAX 0x07 + ++#ifdef _MSC_VER ++#include ++#endif + +/* WUSB Handshake Data. Used during the SET/GET HANDSHAKE requests */ +typedef struct wusb_hndshk_data { -+ uint8_t bMessageNumber; -+ uint8_t bStatus; -+ uint8_t tTKID[3]; -+ uint8_t bReserved; -+ uint8_t CDID[16]; -+ uint8_t Nonce[16]; -+ uint8_t MIC[8]; ++ uByte bMessageNumber; ++ uByte bStatus; ++ uByte tTKID[3]; ++ uByte bReserved; ++ uByte CDID[16]; ++ uByte Nonce[16]; ++ uByte MIC[8]; +} UPACKED wusb_hndshk_data_t; +#define WUSB_HANDSHAKE_LEN_FOR_MIC 38 + +/* WUSB Connection Context */ +typedef struct wusb_conn_context { -+ uint8_t CHID [16]; -+ uint8_t CDID [16]; -+ uint8_t CK [16]; ++ uByte CHID [16]; ++ uByte CDID [16]; ++ uByte CK [16]; +} UPACKED wusb_conn_context_t; + +/* WUSB Security Descriptor */ +typedef struct wusb_security_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint16_t wTotalLength; -+ uint8_t bNumEncryptionTypes; ++ uByte bLength; ++ uByte bDescriptorType; ++ uWord wTotalLength; ++ uByte bNumEncryptionTypes; +} UPACKED wusb_security_desc_t; + +/* WUSB Encryption Type Descriptor */ +typedef struct wusb_encrypt_type_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; ++ uByte bLength; ++ uByte bDescriptorType; + -+ uint8_t bEncryptionType; -+#define WUETD_UNSECURE 0 ++ uByte bEncryptionType; ++#define WUETD_UNSECURE 0 +#define WUETD_WIRED 1 +#define WUETD_CCM_1 2 +#define WUETD_RSA_1 3 + -+ uint8_t bEncryptionValue; -+ uint8_t bAuthKeyIndex; ++ uByte bEncryptionValue; ++ uByte bAuthKeyIndex; +} UPACKED wusb_encrypt_type_desc_t; + +/* WUSB Key Descriptor */ +typedef struct wusb_key_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint8_t tTKID[3]; -+ uint8_t bReserved; -+ uint8_t KeyData[1]; /* variable length */ ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte tTKID[3]; ++ uByte bReserved; ++ uByte KeyData[1]; /* variable length */ +} UPACKED wusb_key_desc_t; + +/* WUSB BOS Descriptor (Binary device Object Store) */ +typedef struct wusb_bos_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint16_t wTotalLength; -+ uint8_t bNumDeviceCaps; ++ uByte bLength; ++ uByte bDescriptorType; ++ uWord wTotalLength; ++ uByte bNumDeviceCaps; +} UPACKED wusb_bos_desc_t; + ++#define USB_DEVICE_CAPABILITY_20_EXTENSION 0x02 ++typedef struct usb_dev_cap_20_ext_desc { ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bDevCapabilityType; ++#define USB_20_EXT_LPM 0x02 ++ uDWord bmAttributes; ++} UPACKED usb_dev_cap_20_ext_desc_t; ++ ++#define USB_DEVICE_CAPABILITY_SS_USB 0x03 ++typedef struct usb_dev_cap_ss_usb { ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bDevCapabilityType; ++#define USB_DC_SS_USB_LTM_CAPABLE 0x02 ++ uByte bmAttributes; ++#define USB_DC_SS_USB_SPEED_SUPPORT_LOW 0x01 ++#define USB_DC_SS_USB_SPEED_SUPPORT_FULL 0x02 ++#define USB_DC_SS_USB_SPEED_SUPPORT_HIGH 0x04 ++#define USB_DC_SS_USB_SPEED_SUPPORT_SS 0x08 ++ uWord wSpeedsSupported; ++ uByte bFunctionalitySupport; ++ uByte bU1DevExitLat; ++ uWord wU2DevExitLat; ++} UPACKED usb_dev_cap_ss_usb_t; ++ ++#define USB_DEVICE_CAPABILITY_CONTAINER_ID 0x04 ++typedef struct usb_dev_cap_container_id { ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bDevCapabilityType; ++ uByte bReserved; ++ uByte containerID[16]; ++} UPACKED usb_dev_cap_container_id_t; + +/* Device Capability Type Codes */ +#define WUSB_DEVICE_CAPABILITY_WIRELESS_USB 0x01 + +/* Device Capability Descriptor */ +typedef struct wusb_dev_cap_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint8_t bDevCapabilityType; -+ uint8_t caps[1]; /* Variable length */ ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bDevCapabilityType; ++ uByte caps[1]; /* Variable length */ +} UPACKED wusb_dev_cap_desc_t; + +/* Device Capability Descriptor */ +typedef struct wusb_dev_cap_uwb_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint8_t bDevCapabilityType; -+ uint8_t bmAttributes; -+ uint16_t wPHYRates; /* Bitmap */ -+ uint8_t bmTFITXPowerInfo; -+ uint8_t bmFFITXPowerInfo; -+ uint16_t bmBandGroup; -+ uint8_t bReserved; ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bDevCapabilityType; ++ uByte bmAttributes; ++ uWord wPHYRates; /* Bitmap */ ++ uByte bmTFITXPowerInfo; ++ uByte bmFFITXPowerInfo; ++ uWord bmBandGroup; ++ uByte bReserved; +} UPACKED wusb_dev_cap_uwb_desc_t; + +/* Wireless USB Endpoint Companion Descriptor */ +typedef struct wusb_endpoint_companion_desc { -+ uint8_t bLength; -+ uint8_t bDescriptorType; -+ uint8_t bMaxBurst; -+ uint8_t bMaxSequence; -+ uint16_t wMaxStreamDelay; -+ uint16_t wOverTheAirPacketSize; -+ uint8_t bOverTheAirInterval; -+ uint8_t bmCompAttributes; ++ uByte bLength; ++ uByte bDescriptorType; ++ uByte bMaxBurst; ++ uByte bMaxSequence; ++ uWord wMaxStreamDelay; ++ uWord wOverTheAirPacketSize; ++ uByte bOverTheAirInterval; ++ uByte bmCompAttributes; +} UPACKED wusb_endpoint_companion_desc_t; + -+ +/* Wireless USB Numeric Association M1 Data Structure */ +typedef struct wusb_m1_data { -+ uint8_t version; -+ uint16_t langId; -+ uint8_t deviceFriendlyNameLength; -+ uint8_t sha_256_m3[32]; -+ uint8_t deviceFriendlyName[256]; ++ uByte version; ++ uWord langId; ++ uByte deviceFriendlyNameLength; ++ uByte sha_256_m3[32]; ++ uByte deviceFriendlyName[256]; +} UPACKED wusb_m1_data_t; + +typedef struct wusb_m2_data { -+ uint8_t version; -+ uint16_t langId; -+ uint8_t hostFriendlyNameLength; -+ uint8_t pkh[384]; -+ uint8_t hostFriendlyName[256]; ++ uByte version; ++ uWord langId; ++ uByte hostFriendlyNameLength; ++ uByte pkh[384]; ++ uByte hostFriendlyName[256]; +} UPACKED wusb_m2_data_t; + +typedef struct wusb_m3_data { -+ uint8_t pkd[384]; -+ uint8_t nd; ++ uByte pkd[384]; ++ uByte nd; +} UPACKED wusb_m3_data_t; + +typedef struct wusb_m4_data { -+ uint32_t _attributeTypeIdAndLength_1; -+ uint16_t associationTypeId; ++ uDWord _attributeTypeIdAndLength_1; ++ uWord associationTypeId; + -+ uint32_t _attributeTypeIdAndLength_2; -+ uint16_t associationSubTypeId; ++ uDWord _attributeTypeIdAndLength_2; ++ uWord associationSubTypeId; + -+ uint32_t _attributeTypeIdAndLength_3; -+ uint32_t length; ++ uDWord _attributeTypeIdAndLength_3; ++ uDWord length; + -+ uint32_t _attributeTypeIdAndLength_4; -+ uint32_t associationStatus; ++ uDWord _attributeTypeIdAndLength_4; ++ uDWord associationStatus; + -+ uint32_t _attributeTypeIdAndLength_5; -+ uint8_t chid[16]; ++ uDWord _attributeTypeIdAndLength_5; ++ uByte chid[16]; + -+ uint32_t _attributeTypeIdAndLength_6; -+ uint8_t cdid[16]; ++ uDWord _attributeTypeIdAndLength_6; ++ uByte cdid[16]; + -+ uint32_t _attributeTypeIdAndLength_7; -+ uint8_t bandGroups[2]; ++ uDWord _attributeTypeIdAndLength_7; ++ uByte bandGroups[2]; +} UPACKED wusb_m4_data_t; + ++#ifdef _MSC_VER ++#include ++#endif + -+ ++#ifdef __cplusplus ++} ++#endif + +#endif /* _USB_H_ */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dummy_audio.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dummy_audio.c 2012-07-15 20:29:19.078083509 +0200 +diff --git a/drivers/usb/host/dwc_otg/Makefile b/drivers/usb/host/dwc_otg/Makefile +new file mode 100644 +index 0000000..6bd6a2e +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/Makefile +@@ -0,0 +1,81 @@ ++# ++# Makefile for DWC_otg Highspeed USB controller driver ++# ++ ++ifneq ($(KERNELRELEASE),) ++ ++# Use the BUS_INTERFACE variable to compile the software for either ++# PCI(PCI_INTERFACE) or LM(LM_INTERFACE) bus. ++ifeq ($(BUS_INTERFACE),) ++# BUS_INTERFACE = -DPCI_INTERFACE ++# BUS_INTERFACE = -DLM_INTERFACE ++ BUS_INTERFACE = -DPLATFORM_INTERFACE ++endif ++ ++#EXTRA_CFLAGS += -DDEBUG ++#EXTRA_CFLAGS += -DDWC_OTG_DEBUGLEV=1 # reduce common debug msgs ++ ++# Use one of the following flags to compile the software in host-only or ++# device-only mode. ++#EXTRA_CFLAGS += -DDWC_HOST_ONLY ++#EXTRA_CFLAGS += -DDWC_DEVICE_ONLY ++ ++EXTRA_CFLAGS += -Dlinux -DDWC_HS_ELECT_TST ++#EXTRA_CFLAGS += -DDWC_EN_ISOC ++EXTRA_CFLAGS += -I$(obj)/../dwc_common_port ++#EXTRA_CFLAGS += -I$(PORTLIB) ++EXTRA_CFLAGS += -DDWC_LINUX ++EXTRA_CFLAGS += $(CFI) ++EXTRA_CFLAGS += $(BUS_INTERFACE) ++#EXTRA_CFLAGS += -DDWC_DEV_SRPCAP ++ ++obj-$(CONFIG_USB_DWCOTG) += dwc_otg.o ++ ++dwc_otg-objs := dwc_otg_driver.o dwc_otg_attr.o ++dwc_otg-objs += dwc_otg_cil.o dwc_otg_cil_intr.o ++dwc_otg-objs += dwc_otg_pcd_linux.o dwc_otg_pcd.o dwc_otg_pcd_intr.o ++dwc_otg-objs += dwc_otg_hcd.o dwc_otg_hcd_linux.o dwc_otg_hcd_intr.o dwc_otg_hcd_queue.o dwc_otg_hcd_ddma.o ++dwc_otg-objs += dwc_otg_adp.o ++dwc_otg-objs += dwc_otg_mphi_fix.o ++ifneq ($(CFI),) ++dwc_otg-objs += dwc_otg_cfi.o ++endif ++ ++kernrelwd := $(subst ., ,$(KERNELRELEASE)) ++kernrel3 := $(word 1,$(kernrelwd)).$(word 2,$(kernrelwd)).$(word 3,$(kernrelwd)) ++ ++ifneq ($(kernrel3),2.6.20) ++EXTRA_CFLAGS += $(CPPFLAGS) ++endif ++ ++else ++ ++PWD := $(shell pwd) ++PORTLIB := $(PWD)/../dwc_common_port ++ ++# Command paths ++CTAGS := $(CTAGS) ++DOXYGEN := $(DOXYGEN) ++ ++default: portlib ++ $(MAKE) -C$(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules ++ ++install: default ++ $(MAKE) -C$(KDIR) M=$(PORTLIB) modules_install ++ $(MAKE) -C$(KDIR) M=$(PWD) modules_install ++ ++portlib: ++ $(MAKE) -C$(KDIR) M=$(PORTLIB) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules ++ cp $(PORTLIB)/Module.symvers $(PWD)/ ++ ++docs: $(wildcard *.[hc]) doc/doxygen.cfg ++ $(DOXYGEN) doc/doxygen.cfg ++ ++tags: $(wildcard *.[hc]) ++ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) ++ ++ ++clean: ++ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers ++ ++endif +diff --git a/drivers/usb/host/dwc_otg/doc/doxygen.cfg b/drivers/usb/host/dwc_otg/doc/doxygen.cfg +new file mode 100644 +index 0000000..537c676 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/doc/doxygen.cfg +@@ -0,0 +1,224 @@ ++# Doxyfile 1.3.9.1 ++ ++#--------------------------------------------------------------------------- ++# Project related configuration options ++#--------------------------------------------------------------------------- ++PROJECT_NAME = "DesignWare USB 2.0 OTG Controller (DWC_otg) Device Driver" ++PROJECT_NUMBER = v3.00a ++OUTPUT_DIRECTORY = ./doc/ ++CREATE_SUBDIRS = NO ++OUTPUT_LANGUAGE = English ++BRIEF_MEMBER_DESC = YES ++REPEAT_BRIEF = YES ++ABBREVIATE_BRIEF = "The $name class" \ ++ "The $name widget" \ ++ "The $name file" \ ++ is \ ++ provides \ ++ specifies \ ++ contains \ ++ represents \ ++ a \ ++ an \ ++ the ++ALWAYS_DETAILED_SEC = NO ++INLINE_INHERITED_MEMB = NO ++FULL_PATH_NAMES = NO ++STRIP_FROM_PATH = ++STRIP_FROM_INC_PATH = ++SHORT_NAMES = NO ++JAVADOC_AUTOBRIEF = YES ++MULTILINE_CPP_IS_BRIEF = NO ++INHERIT_DOCS = YES ++DISTRIBUTE_GROUP_DOC = NO ++TAB_SIZE = 8 ++ALIASES = ++OPTIMIZE_OUTPUT_FOR_C = YES ++OPTIMIZE_OUTPUT_JAVA = NO ++SUBGROUPING = YES ++#--------------------------------------------------------------------------- ++# Build related configuration options ++#--------------------------------------------------------------------------- ++EXTRACT_ALL = NO ++EXTRACT_PRIVATE = YES ++EXTRACT_STATIC = YES ++EXTRACT_LOCAL_CLASSES = YES ++EXTRACT_LOCAL_METHODS = NO ++HIDE_UNDOC_MEMBERS = NO ++HIDE_UNDOC_CLASSES = NO ++HIDE_FRIEND_COMPOUNDS = NO ++HIDE_IN_BODY_DOCS = NO ++INTERNAL_DOCS = NO ++CASE_SENSE_NAMES = NO ++HIDE_SCOPE_NAMES = NO ++SHOW_INCLUDE_FILES = YES ++INLINE_INFO = YES ++SORT_MEMBER_DOCS = NO ++SORT_BRIEF_DOCS = NO ++SORT_BY_SCOPE_NAME = NO ++GENERATE_TODOLIST = YES ++GENERATE_TESTLIST = YES ++GENERATE_BUGLIST = YES ++GENERATE_DEPRECATEDLIST= YES ++ENABLED_SECTIONS = ++MAX_INITIALIZER_LINES = 30 ++SHOW_USED_FILES = YES ++SHOW_DIRECTORIES = YES ++#--------------------------------------------------------------------------- ++# configuration options related to warning and progress messages ++#--------------------------------------------------------------------------- ++QUIET = YES ++WARNINGS = YES ++WARN_IF_UNDOCUMENTED = NO ++WARN_IF_DOC_ERROR = YES ++WARN_FORMAT = "$file:$line: $text" ++WARN_LOGFILE = ++#--------------------------------------------------------------------------- ++# configuration options related to the input files ++#--------------------------------------------------------------------------- ++INPUT = . ++FILE_PATTERNS = *.c \ ++ *.h \ ++ ./linux/*.c \ ++ ./linux/*.h ++RECURSIVE = NO ++EXCLUDE = ./test/ \ ++ ./dwc_otg/.AppleDouble/ ++EXCLUDE_SYMLINKS = YES ++EXCLUDE_PATTERNS = *.mod.* ++EXAMPLE_PATH = ++EXAMPLE_PATTERNS = * ++EXAMPLE_RECURSIVE = NO ++IMAGE_PATH = ++INPUT_FILTER = ++FILTER_PATTERNS = ++FILTER_SOURCE_FILES = NO ++#--------------------------------------------------------------------------- ++# configuration options related to source browsing ++#--------------------------------------------------------------------------- ++SOURCE_BROWSER = YES ++INLINE_SOURCES = NO ++STRIP_CODE_COMMENTS = YES ++REFERENCED_BY_RELATION = NO ++REFERENCES_RELATION = NO ++VERBATIM_HEADERS = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the alphabetical class index ++#--------------------------------------------------------------------------- ++ALPHABETICAL_INDEX = NO ++COLS_IN_ALPHA_INDEX = 5 ++IGNORE_PREFIX = ++#--------------------------------------------------------------------------- ++# configuration options related to the HTML output ++#--------------------------------------------------------------------------- ++GENERATE_HTML = YES ++HTML_OUTPUT = html ++HTML_FILE_EXTENSION = .html ++HTML_HEADER = ++HTML_FOOTER = ++HTML_STYLESHEET = ++HTML_ALIGN_MEMBERS = YES ++GENERATE_HTMLHELP = NO ++CHM_FILE = ++HHC_LOCATION = ++GENERATE_CHI = NO ++BINARY_TOC = NO ++TOC_EXPAND = NO ++DISABLE_INDEX = NO ++ENUM_VALUES_PER_LINE = 4 ++GENERATE_TREEVIEW = YES ++TREEVIEW_WIDTH = 250 ++#--------------------------------------------------------------------------- ++# configuration options related to the LaTeX output ++#--------------------------------------------------------------------------- ++GENERATE_LATEX = NO ++LATEX_OUTPUT = latex ++LATEX_CMD_NAME = latex ++MAKEINDEX_CMD_NAME = makeindex ++COMPACT_LATEX = NO ++PAPER_TYPE = a4wide ++EXTRA_PACKAGES = ++LATEX_HEADER = ++PDF_HYPERLINKS = NO ++USE_PDFLATEX = NO ++LATEX_BATCHMODE = NO ++LATEX_HIDE_INDICES = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the RTF output ++#--------------------------------------------------------------------------- ++GENERATE_RTF = NO ++RTF_OUTPUT = rtf ++COMPACT_RTF = NO ++RTF_HYPERLINKS = NO ++RTF_STYLESHEET_FILE = ++RTF_EXTENSIONS_FILE = ++#--------------------------------------------------------------------------- ++# configuration options related to the man page output ++#--------------------------------------------------------------------------- ++GENERATE_MAN = NO ++MAN_OUTPUT = man ++MAN_EXTENSION = .3 ++MAN_LINKS = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the XML output ++#--------------------------------------------------------------------------- ++GENERATE_XML = NO ++XML_OUTPUT = xml ++XML_SCHEMA = ++XML_DTD = ++XML_PROGRAMLISTING = YES ++#--------------------------------------------------------------------------- ++# configuration options for the AutoGen Definitions output ++#--------------------------------------------------------------------------- ++GENERATE_AUTOGEN_DEF = NO ++#--------------------------------------------------------------------------- ++# configuration options related to the Perl module output ++#--------------------------------------------------------------------------- ++GENERATE_PERLMOD = NO ++PERLMOD_LATEX = NO ++PERLMOD_PRETTY = YES ++PERLMOD_MAKEVAR_PREFIX = ++#--------------------------------------------------------------------------- ++# Configuration options related to the preprocessor ++#--------------------------------------------------------------------------- ++ENABLE_PREPROCESSING = YES ++MACRO_EXPANSION = YES ++EXPAND_ONLY_PREDEF = YES ++SEARCH_INCLUDES = YES ++INCLUDE_PATH = ++INCLUDE_FILE_PATTERNS = ++PREDEFINED = DEVICE_ATTR DWC_EN_ISOC ++EXPAND_AS_DEFINED = DWC_OTG_DEVICE_ATTR_BITFIELD_SHOW DWC_OTG_DEVICE_ATTR_BITFIELD_STORE DWC_OTG_DEVICE_ATTR_BITFIELD_RW DWC_OTG_DEVICE_ATTR_BITFIELD_RO DWC_OTG_DEVICE_ATTR_REG_SHOW DWC_OTG_DEVICE_ATTR_REG_STORE DWC_OTG_DEVICE_ATTR_REG32_RW DWC_OTG_DEVICE_ATTR_REG32_RO DWC_EN_ISOC ++SKIP_FUNCTION_MACROS = NO ++#--------------------------------------------------------------------------- ++# Configuration::additions related to external references ++#--------------------------------------------------------------------------- ++TAGFILES = ++GENERATE_TAGFILE = ++ALLEXTERNALS = NO ++EXTERNAL_GROUPS = YES ++PERL_PATH = /usr/bin/perl ++#--------------------------------------------------------------------------- ++# Configuration options related to the dot tool ++#--------------------------------------------------------------------------- ++CLASS_DIAGRAMS = YES ++HIDE_UNDOC_RELATIONS = YES ++HAVE_DOT = NO ++CLASS_GRAPH = YES ++COLLABORATION_GRAPH = YES ++UML_LOOK = NO ++TEMPLATE_RELATIONS = NO ++INCLUDE_GRAPH = YES ++INCLUDED_BY_GRAPH = YES ++CALL_GRAPH = NO ++GRAPHICAL_HIERARCHY = YES ++DOT_IMAGE_FORMAT = png ++DOT_PATH = ++DOTFILE_DIRS = ++MAX_DOT_GRAPH_DEPTH = 1000 ++GENERATE_LEGEND = YES ++DOT_CLEANUP = YES ++#--------------------------------------------------------------------------- ++# Configuration::additions related to the search engine ++#--------------------------------------------------------------------------- ++SEARCHENGINE = NO +diff --git a/drivers/usb/host/dwc_otg/dummy_audio.c b/drivers/usb/host/dwc_otg/dummy_audio.c +new file mode 100644 +index 0000000..530ac8b +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dummy_audio.c @@ -0,0 +1,1575 @@ +/* + * zero.c -- Gadget Zero, for USB development @@ -36905,9 +44667,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dummy_audio.c linux-rpi-bootc-3 + remove_proc_entry("isoc_test", NULL); +} +module_exit (cleanup); -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_cfi_common.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2012-07-15 20:29:19.078083509 +0200 +diff --git a/drivers/usb/host/dwc_otg/dwc_cfi_common.h b/drivers/usb/host/dwc_otg/dwc_cfi_common.h +new file mode 100644 +index 0000000..be56af4 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_cfi_common.h @@ -0,0 +1,142 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -37051,15 +44815,963 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-rpi-boot +typedef struct cfi_string cfi_string_t; + +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2012-07-15 20:29:19.198085765 +0200 -@@ -0,0 +1,1316 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_adp.c b/drivers/usb/host/dwc_otg/dwc_otg_adp.c +new file mode 100644 +index 0000000..0877472 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_adp.c +@@ -0,0 +1,854 @@ ++/* ========================================================================== ++ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $ ++ * $Revision: #12 $ ++ * $Date: 2011/10/26 $ ++ * $Change: 1873028 $ ++ * ++ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, ++ * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless ++ * otherwise expressly agreed to in writing between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product under ++ * any End User Software License Agreement or Agreement for Licensed Product ++ * with Synopsys or any supplement thereto. You are permitted to use and ++ * redistribute this Software in source and binary forms, with or without ++ * modification, provided that redistributions of source code must retain this ++ * notice. You may not view, use, disclose, copy or distribute this file or ++ * any information contained herein except pursuant to this license grant from ++ * Synopsys. If you do not agree with this notice, including the disclaimer ++ * below, then you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, ++ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================== */ ++ ++#include "dwc_os.h" ++#include "dwc_otg_regs.h" ++#include "dwc_otg_cil.h" ++#include "dwc_otg_adp.h" ++ ++/** @file ++ * ++ * This file contains the most of the Attach Detect Protocol implementation for ++ * the driver to support OTG Rev2.0. ++ * ++ */ ++ ++void dwc_otg_adp_write_reg(dwc_otg_core_if_t * core_if, uint32_t value) ++{ ++ adpctl_data_t adpctl; ++ ++ adpctl.d32 = value; ++ adpctl.b.ar = 0x2; ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->adpctl, adpctl.d32); ++ ++ while (adpctl.b.ar) { ++ adpctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->adpctl); ++ } ++ ++} ++ ++/** ++ * Function is called to read ADP registers ++ */ ++uint32_t dwc_otg_adp_read_reg(dwc_otg_core_if_t * core_if) ++{ ++ adpctl_data_t adpctl; ++ ++ adpctl.d32 = 0; ++ adpctl.b.ar = 0x1; ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->adpctl, adpctl.d32); ++ ++ while (adpctl.b.ar) { ++ adpctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->adpctl); ++ } ++ ++ return adpctl.d32; ++} ++ ++/** ++ * Function is called to read ADPCTL register and filter Write-clear bits ++ */ ++uint32_t dwc_otg_adp_read_reg_filter(dwc_otg_core_if_t * core_if) ++{ ++ adpctl_data_t adpctl; ++ ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ adpctl.b.adp_tmout_int = 0; ++ adpctl.b.adp_prb_int = 0; ++ adpctl.b.adp_tmout_int = 0; ++ ++ return adpctl.d32; ++} ++ ++/** ++ * Function is called to write ADP registers ++ */ ++void dwc_otg_adp_modify_reg(dwc_otg_core_if_t * core_if, uint32_t clr, ++ uint32_t set) ++{ ++ dwc_otg_adp_write_reg(core_if, ++ (dwc_otg_adp_read_reg(core_if) & (~clr)) | set); ++} ++ ++static void adp_sense_timeout(void *ptr) ++{ ++ dwc_otg_core_if_t *core_if = (dwc_otg_core_if_t *) ptr; ++ core_if->adp.sense_timer_started = 0; ++ DWC_PRINTF("ADP SENSE TIMEOUT\n"); ++ if (core_if->adp_enable) { ++ dwc_otg_adp_sense_stop(core_if); ++ dwc_otg_adp_probe_start(core_if); ++ } ++} ++ ++/** ++ * This function is called when the ADP vbus timer expires. Timeout is 1.1s. ++ */ ++static void adp_vbuson_timeout(void *ptr) ++{ ++ gpwrdn_data_t gpwrdn; ++ dwc_otg_core_if_t *core_if = (dwc_otg_core_if_t *) ptr; ++ hprt0_data_t hprt0 = {.d32 = 0 }; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ DWC_PRINTF("%s: 1.1 seconds expire after turning on VBUS\n",__FUNCTION__); ++ if (core_if) { ++ core_if->adp.vbuson_timer_started = 0; ++ /* Turn off vbus */ ++ hprt0.b.prtpwr = 1; ++ DWC_MODIFY_REG32(core_if->host_if->hprt0, hprt0.d32, 0); ++ gpwrdn.d32 = 0; ++ ++ /* Power off the core */ ++ if (core_if->power_down == 2) { ++ /* Enable Wakeup Logic */ ++// gpwrdn.b.wkupactiv = 1; ++ gpwrdn.b.pmuactv = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, ++ gpwrdn.d32); ++ ++ /* Suspend the Phy Clock */ ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ ++ /* Switch on VDD */ ++// gpwrdn.b.wkupactiv = 1; ++ gpwrdn.b.pmuactv = 1; ++ gpwrdn.b.pwrdnrstn = 1; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, ++ gpwrdn.d32); ++ } else { ++ /* Enable Power Down Logic */ ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ } ++ ++ /* Power off the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, ++ gpwrdn.d32, 0); ++ } ++ ++ /* Unmask SRP detected interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.srp_det_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ ++ dwc_otg_adp_probe_start(core_if); ++ dwc_otg_dump_global_registers(core_if); ++ dwc_otg_dump_host_registers(core_if); ++ } ++ ++} ++ ++/** ++ * Start the ADP Initial Probe timer to detect if Port Connected interrupt is ++ * not asserted within 1.1 seconds. ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++void dwc_otg_adp_vbuson_timer_start(dwc_otg_core_if_t * core_if) ++{ ++ core_if->adp.vbuson_timer_started = 1; ++ if (core_if->adp.vbuson_timer) ++ { ++ DWC_PRINTF("SCHEDULING VBUSON TIMER\n"); ++ /* 1.1 secs + 60ms necessary for cil_hcd_start*/ ++ DWC_TIMER_SCHEDULE(core_if->adp.vbuson_timer, 1160); ++ } else { ++ DWC_WARN("VBUSON_TIMER = %p\n",core_if->adp.vbuson_timer); ++ } ++} ++ ++#if 0 ++/** ++ * Masks all DWC OTG core interrupts ++ * ++ */ ++static void mask_all_interrupts(dwc_otg_core_if_t * core_if) ++{ ++ int i; ++ gahbcfg_data_t ahbcfg = {.d32 = 0 }; ++ ++ /* Mask Host Interrupts */ ++ ++ /* Clear and disable HCINTs */ ++ for (i = 0; i < core_if->core_params->host_channels; i++) { ++ DWC_WRITE_REG32(&core_if->host_if->hc_regs[i]->hcintmsk, 0); ++ DWC_WRITE_REG32(&core_if->host_if->hc_regs[i]->hcint, 0xFFFFFFFF); ++ ++ } ++ ++ /* Clear and disable HAINT */ ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->haintmsk, 0x0000); ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->haint, 0xFFFFFFFF); ++ ++ /* Mask Device Interrupts */ ++ if (!core_if->multiproc_int_enable) { ++ /* Clear and disable IN Endpoint interrupts */ ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->diepmsk, 0); ++ for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[i]-> ++ diepint, 0xFFFFFFFF); ++ } ++ ++ /* Clear and disable OUT Endpoint interrupts */ ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->doepmsk, 0); ++ for (i = 0; i <= core_if->dev_if->num_out_eps; i++) { ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[i]-> ++ doepint, 0xFFFFFFFF); ++ } ++ ++ /* Clear and disable DAINT */ ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->daint, ++ 0xFFFFFFFF); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->daintmsk, 0); ++ } else { ++ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs-> ++ diepeachintmsk[i], 0); ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[i]-> ++ diepint, 0xFFFFFFFF); ++ } ++ ++ for (i = 0; i < core_if->dev_if->num_out_eps; ++i) { ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs-> ++ doepeachintmsk[i], 0); ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[i]-> ++ doepint, 0xFFFFFFFF); ++ } ++ ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->deachintmsk, ++ 0); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->deachint, ++ 0xFFFFFFFF); ++ ++ } ++ ++ /* Disable interrupts */ ++ ahbcfg.b.glblintrmsk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0); ++ ++ /* Disable all interrupts. */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, 0); ++ ++ /* Clear any pending interrupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* Clear any pending OTG Interrupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gotgint, 0xFFFFFFFF); ++} ++ ++/** ++ * Unmask Port Connection Detected interrupt ++ * ++ */ ++static void unmask_conn_det_intr(dwc_otg_core_if_t * core_if) ++{ ++ gintmsk_data_t gintmsk = {.d32 = 0,.b.portintr = 1 }; ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, gintmsk.d32); ++} ++#endif ++ ++/** ++ * Starts the ADP Probing ++ * ++ * @param core_if the pointer to core_if structure. ++ */ ++uint32_t dwc_otg_adp_probe_start(dwc_otg_core_if_t * core_if) ++{ ++ ++ adpctl_data_t adpctl = {.d32 = 0}; ++ gpwrdn_data_t gpwrdn; ++#if 0 ++ adpctl_data_t adpctl_int = {.d32 = 0, .b.adp_prb_int = 1, ++ .b.adp_sns_int = 1, b.adp_tmout_int}; ++#endif ++ dwc_otg_disable_global_interrupts(core_if); ++ DWC_PRINTF("ADP Probe Start\n"); ++ core_if->adp.probe_enabled = 1; ++ ++ adpctl.b.adpres = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ while (adpctl.b.adpres) { ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ } ++ ++ adpctl.d32 = 0; ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ ++ /* In Host mode unmask SRP detected interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.sts_chngint_msk = 1; ++ if (!gpwrdn.b.idsts) { ++ gpwrdn.b.srp_det_msk = 1; ++ } ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ ++ adpctl.b.adp_tmout_int_msk = 1; ++ adpctl.b.adp_prb_int_msk = 1; ++ adpctl.b.prb_dschg = 1; ++ adpctl.b.prb_delta = 1; ++ adpctl.b.prb_per = 1; ++ adpctl.b.adpen = 1; ++ adpctl.b.enaprb = 1; ++ ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ DWC_PRINTF("ADP Probe Finish\n"); ++ return 0; ++} ++ ++/** ++ * Starts the ADP Sense timer to detect if ADP Sense interrupt is not asserted ++ * within 3 seconds. ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++void dwc_otg_adp_sense_timer_start(dwc_otg_core_if_t * core_if) ++{ ++ core_if->adp.sense_timer_started = 1; ++ DWC_TIMER_SCHEDULE(core_if->adp.sense_timer, 3000 /* 3 secs */ ); ++} ++ ++/** ++ * Starts the ADP Sense ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++uint32_t dwc_otg_adp_sense_start(dwc_otg_core_if_t * core_if) ++{ ++ adpctl_data_t adpctl; ++ ++ DWC_PRINTF("ADP Sense Start\n"); ++ ++ /* Unmask ADP sense interrupt and mask all other from the core */ ++ adpctl.d32 = dwc_otg_adp_read_reg_filter(core_if); ++ adpctl.b.adp_sns_int_msk = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ dwc_otg_disable_global_interrupts(core_if); // vahrama ++ ++ /* Set ADP reset bit*/ ++ adpctl.d32 = dwc_otg_adp_read_reg_filter(core_if); ++ adpctl.b.adpres = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ while (adpctl.b.adpres) { ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ } ++ ++ adpctl.b.adpres = 0; ++ adpctl.b.adpen = 1; ++ adpctl.b.enasns = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ dwc_otg_adp_sense_timer_start(core_if); ++ ++ return 0; ++} ++ ++/** ++ * Stops the ADP Probing ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++uint32_t dwc_otg_adp_probe_stop(dwc_otg_core_if_t * core_if) ++{ ++ ++ adpctl_data_t adpctl; ++ DWC_PRINTF("Stop ADP probe\n"); ++ core_if->adp.probe_enabled = 0; ++ core_if->adp.probe_counter = 0; ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ ++ adpctl.b.adpen = 0; ++ adpctl.b.adp_prb_int = 1; ++ adpctl.b.adp_tmout_int = 1; ++ adpctl.b.adp_sns_int = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ return 0; ++} ++ ++/** ++ * Stops the ADP Sensing ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++uint32_t dwc_otg_adp_sense_stop(dwc_otg_core_if_t * core_if) ++{ ++ adpctl_data_t adpctl; ++ ++ core_if->adp.sense_enabled = 0; ++ ++ adpctl.d32 = dwc_otg_adp_read_reg_filter(core_if); ++ adpctl.b.enasns = 0; ++ adpctl.b.adp_sns_int = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ return 0; ++} ++ ++/** ++ * Called to turn on the VBUS after initial ADP probe in host mode. ++ * If port power was already enabled in cil_hcd_start function then ++ * only schedule a timer. ++ * ++ * @param core_if the pointer to core_if structure. ++ */ ++void dwc_otg_adp_turnon_vbus(dwc_otg_core_if_t * core_if) ++{ ++ hprt0_data_t hprt0 = {.d32 = 0 }; ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ DWC_PRINTF("Turn on VBUS for 1.1s, port power is %d\n", hprt0.b.prtpwr); ++ ++ if (hprt0.b.prtpwr == 0) { ++ hprt0.b.prtpwr = 1; ++ //DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ } ++ ++ dwc_otg_adp_vbuson_timer_start(core_if); ++} ++ ++/** ++ * Called right after driver is loaded ++ * to perform initial actions for ADP ++ * ++ * @param core_if the pointer to core_if structure. ++ * @param is_host - flag for current mode of operation either from GINTSTS or GPWRDN ++ */ ++void dwc_otg_adp_start(dwc_otg_core_if_t * core_if, uint8_t is_host) ++{ ++ gpwrdn_data_t gpwrdn; ++ ++ DWC_PRINTF("ADP Initial Start\n"); ++ core_if->adp.adp_started = 1; ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ dwc_otg_disable_global_interrupts(core_if); ++ if (is_host) { ++ DWC_PRINTF("HOST MODE\n"); ++ /* Enable Power Down Logic Interrupt*/ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ /* Initialize first ADP probe to obtain Ramp Time value */ ++ core_if->adp.initial_probe = 1; ++ dwc_otg_adp_probe_start(core_if); ++ } else { ++ gotgctl_data_t gotgctl; ++ gotgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); ++ DWC_PRINTF("DEVICE MODE\n"); ++ if (gotgctl.b.bsesvld == 0) { ++ /* Enable Power Down Logic Interrupt*/ ++ gpwrdn.d32 = 0; ++ DWC_PRINTF("VBUS is not valid - start ADP probe\n"); ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ core_if->adp.initial_probe = 1; ++ dwc_otg_adp_probe_start(core_if); ++ } else { ++ DWC_PRINTF("VBUS is valid - initialize core as a Device\n"); ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ dwc_otg_dump_global_registers(core_if); ++ dwc_otg_dump_dev_registers(core_if); ++ } ++ } ++} ++ ++void dwc_otg_adp_init(dwc_otg_core_if_t * core_if) ++{ ++ core_if->adp.adp_started = 0; ++ core_if->adp.initial_probe = 0; ++ core_if->adp.probe_timer_values[0] = -1; ++ core_if->adp.probe_timer_values[1] = -1; ++ core_if->adp.probe_enabled = 0; ++ core_if->adp.sense_enabled = 0; ++ core_if->adp.sense_timer_started = 0; ++ core_if->adp.vbuson_timer_started = 0; ++ core_if->adp.probe_counter = 0; ++ core_if->adp.gpwrdn = 0; ++ core_if->adp.attached = DWC_OTG_ADP_UNKOWN; ++ /* Initialize timers */ ++ core_if->adp.sense_timer = ++ DWC_TIMER_ALLOC("ADP SENSE TIMER", adp_sense_timeout, core_if); ++ core_if->adp.vbuson_timer = ++ DWC_TIMER_ALLOC("ADP VBUS ON TIMER", adp_vbuson_timeout, core_if); ++ if (!core_if->adp.sense_timer || !core_if->adp.vbuson_timer) ++ { ++ DWC_ERROR("Could not allocate memory for ADP timers\n"); ++ } ++} ++ ++void dwc_otg_adp_remove(dwc_otg_core_if_t * core_if) ++{ ++ gpwrdn_data_t gpwrdn = { .d32 = 0 }; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ if (core_if->adp.probe_enabled) ++ dwc_otg_adp_probe_stop(core_if); ++ if (core_if->adp.sense_enabled) ++ dwc_otg_adp_sense_stop(core_if); ++ if (core_if->adp.sense_timer_started) ++ DWC_TIMER_CANCEL(core_if->adp.sense_timer); ++ if (core_if->adp.vbuson_timer_started) ++ DWC_TIMER_CANCEL(core_if->adp.vbuson_timer); ++ DWC_TIMER_FREE(core_if->adp.sense_timer); ++ DWC_TIMER_FREE(core_if->adp.vbuson_timer); ++} ++ ++///////////////////////////////////////////////////////////////////// ++////////////// ADP Interrupt Handlers /////////////////////////////// ++///////////////////////////////////////////////////////////////////// ++/** ++ * This function sets Ramp Timer values ++ */ ++static uint32_t set_timer_value(dwc_otg_core_if_t * core_if, uint32_t val) ++{ ++ if (core_if->adp.probe_timer_values[0] == -1) { ++ core_if->adp.probe_timer_values[0] = val; ++ core_if->adp.probe_timer_values[1] = -1; ++ return 1; ++ } else { ++ core_if->adp.probe_timer_values[1] = ++ core_if->adp.probe_timer_values[0]; ++ core_if->adp.probe_timer_values[0] = val; ++ return 0; ++ } ++} ++ ++/** ++ * This function compares Ramp Timer values ++ */ ++static uint32_t compare_timer_values(dwc_otg_core_if_t * core_if) ++{ ++ uint32_t diff; ++ if (core_if->adp.probe_timer_values[0]>=core_if->adp.probe_timer_values[1]) ++ diff = core_if->adp.probe_timer_values[0]-core_if->adp.probe_timer_values[1]; ++ else ++ diff = core_if->adp.probe_timer_values[1]-core_if->adp.probe_timer_values[0]; ++ if(diff < 2) { ++ return 0; ++ } else { ++ return 1; ++ } ++} ++ ++/** ++ * This function handles ADP Probe Interrupts ++ */ ++static int32_t dwc_otg_adp_handle_prb_intr(dwc_otg_core_if_t * core_if, ++ uint32_t val) ++{ ++ adpctl_data_t adpctl = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn, temp; ++ adpctl.d32 = val; ++ ++ temp.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ core_if->adp.probe_counter++; ++ core_if->adp.gpwrdn = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (adpctl.b.rtim == 0 && !temp.b.idsts){ ++ DWC_PRINTF("RTIM value is 0\n"); ++ goto exit; ++ } ++ if (set_timer_value(core_if, adpctl.b.rtim) && ++ core_if->adp.initial_probe) { ++ core_if->adp.initial_probe = 0; ++ dwc_otg_adp_probe_stop(core_if); ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* check which value is for device mode and which for Host mode */ ++ if (!temp.b.idsts) { /* considered host mode value is 0 */ ++ /* ++ * Turn on VBUS after initial ADP probe. ++ */ ++ core_if->op_state = A_HOST; ++ dwc_otg_enable_global_interrupts(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_hcd_start(core_if); ++ dwc_otg_adp_turnon_vbus(core_if); ++ DWC_SPINLOCK(core_if->lock); ++ } else { ++ /* ++ * Initiate SRP after initial ADP probe. ++ */ ++ dwc_otg_enable_global_interrupts(core_if); ++ dwc_otg_initiate_srp(core_if); ++ } ++ } else if (core_if->adp.probe_counter > 2){ ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (compare_timer_values(core_if)) { ++ DWC_PRINTF("Difference in timer values !!! \n"); ++// core_if->adp.attached = DWC_OTG_ADP_ATTACHED; ++ dwc_otg_adp_probe_stop(core_if); ++ ++ /* Power on the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ } ++ ++ /* check which value is for device mode and which for Host mode */ ++ if (!temp.b.idsts) { /* considered host mode value is 0 */ ++ /* Disable Interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, gpwrdn.d32, 0); ++ ++ /* ++ * Initialize the Core for Host mode. ++ */ ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++ } else { ++ gotgctl_data_t gotgctl; ++ /* Mask SRP detected interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.srp_det_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, gpwrdn.d32, 0); ++ ++ /* Disable Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, gpwrdn.d32, 0); ++ ++ /* ++ * Initialize the Core for Device mode. ++ */ ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ ++ gotgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); ++ if (!gotgctl.b.bsesvld) { ++ dwc_otg_initiate_srp(core_if); ++ } ++ } ++ } ++ if (core_if->power_down == 2) { ++ if (gpwrdn.b.bsessvld) { ++ /* Mask SRP detected interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.srp_det_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Disable Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* ++ * Initialize the Core for Device mode. ++ */ ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ } ++ } ++ } ++exit: ++ /* Clear interrupt */ ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ adpctl.b.adp_prb_int = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ return 0; ++} ++ ++/** ++ * This function hadles ADP Sense Interrupt ++ */ ++static int32_t dwc_otg_adp_handle_sns_intr(dwc_otg_core_if_t * core_if) ++{ ++ adpctl_data_t adpctl; ++ /* Stop ADP Sense timer */ ++ DWC_TIMER_CANCEL(core_if->adp.sense_timer); ++ ++ /* Restart ADP Sense timer */ ++ dwc_otg_adp_sense_timer_start(core_if); ++ ++ /* Clear interrupt */ ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ adpctl.b.adp_sns_int = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ return 0; ++} ++ ++/** ++ * This function handles ADP Probe Interrupts ++ */ ++static int32_t dwc_otg_adp_handle_prb_tmout_intr(dwc_otg_core_if_t * core_if, ++ uint32_t val) ++{ ++ adpctl_data_t adpctl = {.d32 = 0 }; ++ adpctl.d32 = val; ++ set_timer_value(core_if, adpctl.b.rtim); ++ ++ /* Clear interrupt */ ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ adpctl.b.adp_tmout_int = 1; ++ dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ ++ return 0; ++} ++ ++/** ++ * ADP Interrupt handler. ++ * ++ */ ++int32_t dwc_otg_adp_handle_intr(dwc_otg_core_if_t * core_if) ++{ ++ int retval = 0; ++ adpctl_data_t adpctl = {.d32 = 0}; ++ ++ adpctl.d32 = dwc_otg_adp_read_reg(core_if); ++ DWC_PRINTF("ADPCTL = %08x\n",adpctl.d32); ++ ++ if (adpctl.b.adp_sns_int & adpctl.b.adp_sns_int_msk) { ++ DWC_PRINTF("ADP Sense interrupt\n"); ++ retval |= dwc_otg_adp_handle_sns_intr(core_if); ++ } ++ if (adpctl.b.adp_tmout_int & adpctl.b.adp_tmout_int_msk) { ++ DWC_PRINTF("ADP timeout interrupt\n"); ++ retval |= dwc_otg_adp_handle_prb_tmout_intr(core_if, adpctl.d32); ++ } ++ if (adpctl.b.adp_prb_int & adpctl.b.adp_prb_int_msk) { ++ DWC_PRINTF("ADP Probe interrupt\n"); ++ adpctl.b.adp_prb_int = 1; ++ retval |= dwc_otg_adp_handle_prb_intr(core_if, adpctl.d32); ++ } ++ ++// dwc_otg_adp_modify_reg(core_if, adpctl.d32, 0); ++ //dwc_otg_adp_write_reg(core_if, adpctl.d32); ++ DWC_PRINTF("RETURN FROM ADP ISR\n"); ++ ++ return retval; ++} ++ ++/** ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if) ++{ ++ ++#ifndef DWC_HOST_ONLY ++ hprt0_data_t hprt0; ++ gpwrdn_data_t gpwrdn; ++ DWC_DEBUGPL(DBG_ANY, "++ Power Down Logic Session Request Interrupt++\n"); ++ ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ /* check which value is for device mode and which for Host mode */ ++ if (!gpwrdn.b.idsts) { /* considered host mode value is 0 */ ++ DWC_PRINTF("SRP: Host mode\n"); ++ ++ if (core_if->adp_enable) { ++ dwc_otg_adp_probe_stop(core_if); ++ ++ /* Power on the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ } ++ ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++ } ++ ++ /* Turn on the port power bit. */ ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ hprt0.b.prtpwr = 1; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ ++ /* Start the Connection timer. So a message can be displayed ++ * if connect does not occur within 10 seconds. */ ++ cil_hcd_session_start(core_if); ++ } else { ++ DWC_PRINTF("SRP: Device mode %s\n", __FUNCTION__); ++ if (core_if->adp_enable) { ++ dwc_otg_adp_probe_stop(core_if); ++ ++ /* Power on the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ } ++ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 0; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, ++ gpwrdn.d32); ++ ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ } ++ } ++#endif ++ return 1; ++} +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_adp.h b/drivers/usb/host/dwc_otg/dwc_otg_adp.h +new file mode 100644 +index 0000000..d8c3f85 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_adp.h +@@ -0,0 +1,80 @@ ++/* ========================================================================== ++ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $ ++ * $Revision: #7 $ ++ * $Date: 2011/10/24 $ ++ * $Change: 1871159 $ ++ * ++ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, ++ * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless ++ * otherwise expressly agreed to in writing between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product under ++ * any End User Software License Agreement or Agreement for Licensed Product ++ * with Synopsys or any supplement thereto. You are permitted to use and ++ * redistribute this Software in source and binary forms, with or without ++ * modification, provided that redistributions of source code must retain this ++ * notice. You may not view, use, disclose, copy or distribute this file or ++ * any information contained herein except pursuant to this license grant from ++ * Synopsys. If you do not agree with this notice, including the disclaimer ++ * below, then you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, ++ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================== */ ++ ++#ifndef __DWC_OTG_ADP_H__ ++#define __DWC_OTG_ADP_H__ ++ ++/** ++ * @file ++ * ++ * This file contains the Attach Detect Protocol interfaces and defines ++ * (functions) and structures for Linux. ++ * ++ */ ++ ++#define DWC_OTG_ADP_UNATTACHED 0 ++#define DWC_OTG_ADP_ATTACHED 1 ++#define DWC_OTG_ADP_UNKOWN 2 ++ ++typedef struct dwc_otg_adp { ++ uint32_t adp_started; ++ uint32_t initial_probe; ++ int32_t probe_timer_values[2]; ++ uint32_t probe_enabled; ++ uint32_t sense_enabled; ++ dwc_timer_t *sense_timer; ++ uint32_t sense_timer_started; ++ dwc_timer_t *vbuson_timer; ++ uint32_t vbuson_timer_started; ++ uint32_t attached; ++ uint32_t probe_counter; ++ uint32_t gpwrdn; ++} dwc_otg_adp_t; ++ ++/** ++ * Attach Detect Protocol functions ++ */ ++ ++extern void dwc_otg_adp_write_reg(dwc_otg_core_if_t * core_if, uint32_t value); ++extern uint32_t dwc_otg_adp_read_reg(dwc_otg_core_if_t * core_if); ++extern uint32_t dwc_otg_adp_probe_start(dwc_otg_core_if_t * core_if); ++extern uint32_t dwc_otg_adp_sense_start(dwc_otg_core_if_t * core_if); ++extern uint32_t dwc_otg_adp_probe_stop(dwc_otg_core_if_t * core_if); ++extern uint32_t dwc_otg_adp_sense_stop(dwc_otg_core_if_t * core_if); ++extern void dwc_otg_adp_start(dwc_otg_core_if_t * core_if, uint8_t is_host); ++extern void dwc_otg_adp_init(dwc_otg_core_if_t * core_if); ++extern void dwc_otg_adp_remove(dwc_otg_core_if_t * core_if); ++extern int32_t dwc_otg_adp_handle_intr(dwc_otg_core_if_t * core_if); ++extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if); ++ ++#endif //__DWC_OTG_ADP_H__ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_attr.c b/drivers/usb/host/dwc_otg/dwc_otg_attr.c +new file mode 100644 +index 0000000..95eb7f8 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_attr.c +@@ -0,0 +1,1210 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $ -+ * $Revision: #35 $ -+ * $Date: 2009/04/03 $ -+ * $Change: 1225160 $ ++ * $Revision: #44 $ ++ * $Date: 2010/11/29 $ ++ * $Change: 1636033 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -37270,6 +45982,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + + + ++ rem_wakeup_pwrdn ++ On read, shows the status core - hibernated or not. On write, initiates ++ a remote wakeup of the device from Hibernation. ++ Read/Write ++ ++ ++ ++ mode_ch_tim_en ++ This bit is used to enable or disable the host core to wait for 200 PHY ++ clock cycles at the end of Resume to change the opmode signal to the PHY to 00 ++ after Suspend or LPM. ++ Read/Write ++ ++ ++ ++ fr_interval ++ On read, shows the value of HFIR Frame Interval. On write, dynamically ++ reload HFIR register during runtime. The application can write a value to this ++ register only after the Port Enable bit of the Host Port Control and Status ++ register (HPRT.PrtEnaPort) has been set ++ Read/Write ++ ++ ++ ++ disconnect_us ++ On read, shows the status of disconnect_device_us. On write, sets disconnect_us ++ which causes soft disconnect for 100us. Applicable only for device mode of operation. ++ Read/Write ++ ++ ++ + regdump + Dumps the contents of core registers. + Read @@ -37319,12 +46062,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + + + -+ sleep_local_dev -+ Generetates sleep signaling. Applicable only in host mode. -+ Write -+ -+ -+ + sleep_status + Shows sleep status of device. + Read @@ -37340,36 +46077,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + echo 0 > /sys/devices/lm0/buspower + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include /* permission constants */ -+#include -+#include -+#include -+#include -+ -+ -+#ifdef LM_INTERFACE -+#include -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#else -+/* in 2.6.31, at least, we seem to have lost the generic LM infrastructure - -+ here we use definitions stolen from arm-integrator headers -+*/ -+#include -+#endif -+#elif defined(PLATFORM_INTERFACE) -+#include -+#endif -+ -+#include -+ ++#include "dwc_otg_os_dep.h" +#include "dwc_os.h" +#include "dwc_otg_driver.h" +#include "dwc_otg_attr.h" @@ -37538,24 +46246,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +/**@{*/ + +/** ++ * Helper function returning the otg_device structure of the given device ++ */ ++static dwc_otg_device_t *dwc_otg_drvdev(struct device *_dev) ++{ ++ dwc_otg_device_t *otg_dev; ++ DWC_OTG_GETDRVDEV(otg_dev, _dev); ++ return otg_dev; ++} ++ ++/** + * Show the register offset of the Register Access. + */ +static ssize_t regoffset_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = container_of(_dev, -+ struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return snprintf(buf, sizeof("0xFFFFFFFF\n") + 1, "0x%08x\n", -+ otg_dev->reg_offset); ++ otg_dev->os_dep.reg_offset); +} + +/** @@ -37565,20 +46273,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = container_of(_dev, -+ struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t offset = simple_strtoul(buf, NULL, 16); -+ if (offset < SZ_256K) { -+ otg_dev->reg_offset = offset; ++#if defined(LM_INTERFACE) || defined(PLATFORM_INTERFACE) ++ if (offset < SZ_256K) { ++#elif defined(PCI_INTERFACE) ++ if (offset < 0x00040000) { ++#endif ++ otg_dev->os_dep.reg_offset = offset; + } else { + dev_err(_dev, "invalid offset\n"); + } @@ -37595,31 +46297,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t regvalue_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t val; + volatile uint32_t *addr; + -+ if (otg_dev->reg_offset != 0xFFFFFFFF && 0 != otg_dev->base) { ++ if (otg_dev->os_dep.reg_offset != 0xFFFFFFFF && 0 != otg_dev->os_dep.base) { + /* Calculate the address */ -+ addr = (uint32_t *) (otg_dev->reg_offset + -+ (uint8_t *) otg_dev->base); -+ val = dwc_read_reg32(addr); ++ addr = (uint32_t *) (otg_dev->os_dep.reg_offset + ++ (uint8_t *) otg_dev->os_dep.base); ++ val = DWC_READ_REG32(addr); + return snprintf(buf, + sizeof("Reg@0xFFFFFFFF = 0xFFFFFFFF\n") + 1, -+ "Reg@0x%06x = 0x%08x\n", otg_dev->reg_offset, ++ "Reg@0x%06x = 0x%08x\n", otg_dev->os_dep.reg_offset, + val); + } else { -+ dev_err(_dev, "Invalid offset (0x%0x)\n", otg_dev->reg_offset); ++ dev_err(_dev, "Invalid offset (0x%0x)\n", otg_dev->os_dep.reg_offset); + return sprintf(buf, "invalid offset\n"); + } +} @@ -37633,28 +46325,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + volatile uint32_t *addr; + uint32_t val = simple_strtoul(buf, NULL, 16); + //dev_dbg(_dev, "Offset=0x%08x Val=0x%08x\n", otg_dev->reg_offset, val); -+ if (otg_dev->reg_offset != 0xFFFFFFFF && 0 != otg_dev->base) { ++ if (otg_dev->os_dep.reg_offset != 0xFFFFFFFF && 0 != otg_dev->os_dep.base) { + /* Calculate the address */ -+ addr = (uint32_t *) (otg_dev->reg_offset + -+ (uint8_t *) otg_dev->base); -+ dwc_write_reg32(addr, val); ++ addr = (uint32_t *) (otg_dev->os_dep.reg_offset + ++ (uint8_t *) otg_dev->os_dep.base); ++ DWC_WRITE_REG32(addr, val); + } else { + dev_err(_dev, "Invalid Register Offset (0x%08x)\n", -+ otg_dev->reg_offset); ++ otg_dev->os_dep.reg_offset); + } + return count; +} @@ -37666,7 +46348,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + */ +DWC_OTG_DEVICE_ATTR_BITFIELD_RO(mode, "Mode"); +DWC_OTG_DEVICE_ATTR_BITFIELD_RW(hnpcapable, "HNPCapable"); -+DWC_OTG_DEVICE_ATTR_BITFIELD_RW(srpcapable, "Mode"); ++DWC_OTG_DEVICE_ATTR_BITFIELD_RW(srpcapable, "SRPCapable"); +DWC_OTG_DEVICE_ATTR_BITFIELD_RW(hsic_connect, "HSIC Connect"); +DWC_OTG_DEVICE_ATTR_BITFIELD_RW(inv_sel_hsic, "Invert Select HSIC"); + @@ -37712,16 +46394,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t hnp_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return sprintf(buf, "HstNegScs = 0x%x\n", + dwc_otg_get_hnpstatus(otg_dev->core_if)); +} @@ -37733,16 +46406,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t in = simple_strtoul(buf, NULL, 16); + dwc_otg_set_hnpreq(otg_dev->core_if, in); + return count; @@ -37760,16 +46424,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, char *buf) +{ +#ifndef DWC_HOST_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return sprintf(buf, "SesReqScs = 0x%x\n", + dwc_otg_get_srpstatus(otg_dev->core_if)); +#else @@ -37785,16 +46440,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + const char *buf, size_t count) +{ +#ifndef DWC_HOST_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + dwc_otg_pcd_initiate_srp(otg_dev->pcd); +#endif + return count; @@ -37811,16 +46457,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t buspower_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return sprintf(buf, "Bus Power = 0x%x\n", + dwc_otg_get_prtpower(otg_dev->core_if)); +} @@ -37832,16 +46469,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t on = simple_strtoul(buf, NULL, 16); + dwc_otg_set_prtpower(otg_dev->core_if, on); + return count; @@ -37858,17 +46486,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t bussuspend_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return sprintf(buf, "Bus Suspend = 0x%x\n", + dwc_otg_get_prtsuspend(otg_dev->core_if)); +} @@ -37880,17 +46498,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t in = simple_strtoul(buf, NULL, 16); + dwc_otg_set_prtsuspend(otg_dev->core_if, in); + return count; @@ -37899,22 +46507,65 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +DEVICE_ATTR(bussuspend, 0644, bussuspend_show, bussuspend_store); + +/** ++ * Show the Mode Change Ready Timer status ++ */ ++static ssize_t mode_ch_tim_en_show(struct device *_dev, ++ struct device_attribute *attr, char *buf) ++{ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ return sprintf(buf, "Mode Change Ready Timer Enable = 0x%x\n", ++ dwc_otg_get_mode_ch_tim(otg_dev->core_if)); ++} ++ ++/** ++ * Set the Mode Change Ready Timer status ++ */ ++static ssize_t mode_ch_tim_en_store(struct device *_dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ uint32_t in = simple_strtoul(buf, NULL, 16); ++ dwc_otg_set_mode_ch_tim(otg_dev->core_if, in); ++ return count; ++} ++ ++DEVICE_ATTR(mode_ch_tim_en, 0644, mode_ch_tim_en_show, mode_ch_tim_en_store); ++ ++/** ++ * Show the value of HFIR Frame Interval bitfield ++ */ ++static ssize_t fr_interval_show(struct device *_dev, ++ struct device_attribute *attr, char *buf) ++{ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ return sprintf(buf, "Frame Interval = 0x%x\n", ++ dwc_otg_get_fr_interval(otg_dev->core_if)); ++} ++ ++/** ++ * Set the HFIR Frame Interval value ++ */ ++static ssize_t fr_interval_store(struct device *_dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ uint32_t in = simple_strtoul(buf, NULL, 10); ++ dwc_otg_set_fr_interval(otg_dev->core_if, in); ++ return count; ++} ++ ++DEVICE_ATTR(fr_interval, 0644, fr_interval_show, fr_interval_store); ++ ++/** + * Show the status of Remote Wakeup. + */ +static ssize_t remote_wakeup_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ +#ifndef DWC_HOST_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + + return sprintf(buf, + "Remote Wakeup Sig = %d Enabled = %d LPM Remote Wakeup = %d\n", @@ -37937,17 +46588,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + const char *buf, size_t count) +{ +#ifndef DWC_HOST_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t val = simple_strtoul(buf, NULL, 16); + + if (val & 1) { @@ -37963,22 +46604,69 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + remote_wakeup_store); + +/** ++ * Show the whether core is hibernated or not. ++ */ ++static ssize_t rem_wakeup_pwrdn_show(struct device *_dev, ++ struct device_attribute *attr, char *buf) ++{ ++#ifndef DWC_HOST_ONLY ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ ++ if (dwc_otg_get_core_state(otg_dev->core_if)) { ++ DWC_PRINTF("Core is in hibernation\n"); ++ } else { ++ DWC_PRINTF("Core is not in hibernation\n"); ++ } ++#endif /* DWC_HOST_ONLY */ ++ return 0; ++} ++ ++extern int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if, ++ int rem_wakeup, int reset); ++ ++/** ++ * Initiate a remote wakeup of the device to exit from hibernation. ++ */ ++static ssize_t rem_wakeup_pwrdn_store(struct device *_dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++#ifndef DWC_HOST_ONLY ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ dwc_otg_device_hibernation_restore(otg_dev->core_if, 1, 0); ++#endif ++ return count; ++} ++ ++DEVICE_ATTR(rem_wakeup_pwrdn, S_IRUGO | S_IWUSR, rem_wakeup_pwrdn_show, ++ rem_wakeup_pwrdn_store); ++ ++static ssize_t disconnect_us(struct device *_dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ ++#ifndef DWC_HOST_ONLY ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); ++ uint32_t val = simple_strtoul(buf, NULL, 16); ++ DWC_PRINTF("The Passed value is %04x\n", val); ++ ++ dwc_otg_pcd_disconnect_us(otg_dev->pcd, 50); ++ ++#endif /* DWC_HOST_ONLY */ ++ return count; ++} ++ ++DEVICE_ATTR(disconnect_us, S_IWUSR, 0, disconnect_us); ++ ++/** + * Dump global registers and either host or device registers (depending on the + * current mode of the core). + */ +static ssize_t regdump_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + + dwc_otg_dump_global_registers(otg_dev->core_if); + if (dwc_otg_is_host_mode(otg_dev->core_if)) { @@ -37999,16 +46687,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t spramdump_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + + dwc_otg_dump_spram(otg_dev->core_if); + @@ -38024,17 +46703,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, char *buf) +{ +#ifndef DWC_DEVICE_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + dwc_otg_hcd_dump_state(otg_dev->hcd); +#endif /* DWC_DEVICE_ONLY */ + return sprintf(buf, "HCD Dump\n"); @@ -38051,16 +46720,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, char *buf) +{ +#ifndef DWC_DEVICE_ONLY -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + + dwc_otg_hcd_dump_frrem(otg_dev->hcd); +#endif /* DWC_DEVICE_ONLY */ @@ -38078,17 +46738,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t rd_reg_test_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + int i; + int time; + int start_jiffies; @@ -38114,17 +46764,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t wr_reg_test_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t reg_val; + int i; + int time; @@ -38153,16 +46793,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t lpmresp_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + + if (!dwc_otg_get_param_lpm_enable(otg_dev->core_if)) + return sprintf(buf, "** LPM is DISABLED **\n"); @@ -38181,17 +46812,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + uint32_t val = simple_strtoul(buf, NULL, 16); + + if (!dwc_otg_get_param_lpm_enable(otg_dev->core_if)) { @@ -38214,18 +46835,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +static ssize_t sleepstatus_show(struct device *_dev, + struct device_attribute *attr, char *buf) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + return sprintf(buf, "Sleep Status = %d\n", + dwc_otg_get_lpm_portsleepstatus(otg_dev->core_if)); +} @@ -38237,17 +46847,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + struct device_attribute *attr, + const char *buf, size_t count) +{ -+#ifdef LM_INTERFACE -+ struct lm_device *lm_dev = container_of(_dev, struct lm_device, dev); -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(lm_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = dev_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platform_dev = -+ container_of(_dev, struct platform_device, dev); -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(platform_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = dwc_otg_drvdev(_dev); + dwc_otg_core_if_t *core_if = otg_dev->core_if; + + if (dwc_otg_get_lpm_portsleepstatus(otg_dev->core_if)) { @@ -38264,23 +46864,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +DEVICE_ATTR(sleep_status, S_IRUGO | S_IWUSR, sleepstatus_show, + sleepstatus_store); + -+#endif /* CONFIG_USB_DWC_OTG_LPM_ENABLE */ ++#endif /* CONFIG_USB_DWC_OTG_LPM_ENABLE */ + +/**@}*/ + +/** + * Create the device files + */ -+void dwc_otg_attr_create ( ++void dwc_otg_attr_create( +#ifdef LM_INTERFACE + struct lm_device *dev +#elif defined(PCI_INTERFACE) + struct pci_dev *dev +#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *dev ++ struct platform_device *dev +#endif -+ ) -+ ++ ) +{ + int error; + @@ -38295,6 +46894,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + error = device_create_file(&dev->dev, &dev_attr_srp); + error = device_create_file(&dev->dev, &dev_attr_buspower); + error = device_create_file(&dev->dev, &dev_attr_bussuspend); ++ error = device_create_file(&dev->dev, &dev_attr_mode_ch_tim_en); ++ error = device_create_file(&dev->dev, &dev_attr_fr_interval); + error = device_create_file(&dev->dev, &dev_attr_busconnected); + error = device_create_file(&dev->dev, &dev_attr_gotgctl); + error = device_create_file(&dev->dev, &dev_attr_gusbcfg); @@ -38309,6 +46910,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + error = device_create_file(&dev->dev, &dev_attr_hptxfsiz); + error = device_create_file(&dev->dev, &dev_attr_hprt0); + error = device_create_file(&dev->dev, &dev_attr_remote_wakeup); ++ error = device_create_file(&dev->dev, &dev_attr_rem_wakeup_pwrdn); ++ error = device_create_file(&dev->dev, &dev_attr_disconnect_us); + error = device_create_file(&dev->dev, &dev_attr_regdump); + error = device_create_file(&dev->dev, &dev_attr_spramdump); + error = device_create_file(&dev->dev, &dev_attr_hcddump); @@ -38324,7 +46927,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +/** + * Remove the device files + */ -+void dwc_otg_attr_remove ( ++void dwc_otg_attr_remove( +#ifdef LM_INTERFACE + struct lm_device *dev +#elif defined(PCI_INTERFACE) @@ -38332,8 +46935,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- +#elif defined(PLATFORM_INTERFACE) + struct platform_device *dev +#endif -+ ) -+ ++ ) +{ + device_remove_file(&dev->dev, &dev_attr_regoffset); + device_remove_file(&dev->dev, &dev_attr_regvalue); @@ -38346,6 +46948,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + device_remove_file(&dev->dev, &dev_attr_srp); + device_remove_file(&dev->dev, &dev_attr_buspower); + device_remove_file(&dev->dev, &dev_attr_bussuspend); ++ device_remove_file(&dev->dev, &dev_attr_mode_ch_tim_en); ++ device_remove_file(&dev->dev, &dev_attr_fr_interval); + device_remove_file(&dev->dev, &dev_attr_busconnected); + device_remove_file(&dev->dev, &dev_attr_gotgctl); + device_remove_file(&dev->dev, &dev_attr_gusbcfg); @@ -38360,6 +46964,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + device_remove_file(&dev->dev, &dev_attr_hptxfsiz); + device_remove_file(&dev->dev, &dev_attr_hprt0); + device_remove_file(&dev->dev, &dev_attr_remote_wakeup); ++ device_remove_file(&dev->dev, &dev_attr_rem_wakeup_pwrdn); ++ device_remove_file(&dev->dev, &dev_attr_disconnect_us); + device_remove_file(&dev->dev, &dev_attr_regdump); + device_remove_file(&dev->dev, &dev_attr_spramdump); + device_remove_file(&dev->dev, &dev_attr_hcddump); @@ -38371,15 +46977,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-rpi-bootc- + device_remove_file(&dev->dev, &dev_attr_sleep_status); +#endif +} -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2012-07-15 20:29:19.065083268 +0200 -@@ -0,0 +1,88 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_attr.h b/drivers/usb/host/dwc_otg/dwc_otg_attr.h +new file mode 100644 +index 0000000..fc14d94 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_attr.h +@@ -0,0 +1,89 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $ -+ * $Revision: #11 $ -+ * $Date: 2009/04/03 $ -+ * $Change: 1225160 $ ++ * $Revision: #13 $ ++ * $Date: 2010/06/21 $ ++ * $Change: 1532021 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -38424,6 +47032,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi-bootc- +extern struct device_attribute dev_attr_srp; +extern struct device_attribute dev_attr_buspower; +extern struct device_attribute dev_attr_bussuspend; ++extern struct device_attribute dev_attr_mode_ch_tim_en; ++extern struct device_attribute dev_attr_fr_interval; +extern struct device_attribute dev_attr_busconnected; +extern struct device_attribute dev_attr_gotgctl; +extern struct device_attribute dev_attr_gusbcfg; @@ -38439,33 +47049,34 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-rpi-bootc- +extern struct device_attribute dev_attr_hprt0; +#ifdef CONFIG_USB_DWC_OTG_LPM +extern struct device_attribute dev_attr_lpm_response; -+extern struct device_attribute dev_attr_sleep_local_dev; +extern struct device_attribute devi_attr_sleep_status; +#endif + -+void dwc_otg_attr_create ( ++void dwc_otg_attr_create( +#ifdef LM_INTERFACE -+ struct lm_device *dev ++ struct lm_device *dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *dev ++ struct pci_dev *dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *dev +#endif -+ ); ++ ); + -+void dwc_otg_attr_remove ( ++void dwc_otg_attr_remove( +#ifdef LM_INTERFACE -+ struct lm_device *dev ++ struct lm_device *dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *dev ++ struct pci_dev *dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *dev +#endif -+ ); ++ ); +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2012-07-15 20:29:19.180085427 +0200 +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cfi.c b/drivers/usb/host/dwc_otg/dwc_otg_cfi.c +new file mode 100644 +index 0000000..a9878d6 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cfi.c @@ -0,0 +1,1876 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -38497,7 +47108,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + +/** @file + * -+ * This file contains the most of the CFI implementation for the OTG. ++ * This file contains the most of the CFI(Core Feature Interface) ++ * implementation for the OTG. + */ + +#ifdef DWC_UTE_CFI @@ -38754,7 +47366,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + if (wValue == 0) { + /* @TODO - MAS - fix the access to the base field */ + regaddr = 0; -+ //regaddr = (uint32_t) pcd->otg_dev->base; ++ //regaddr = (uint32_t) pcd->otg_dev->os_dep.base; + //GET_CORE_IF(pcd)->co + regaddr |= wIndex; + } else { @@ -38762,7 +47374,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + } + + /* Read a 32-bit value of the memory at the regaddr */ -+ regval = dwc_read_reg32((uint32_t *) regaddr); ++ regval = DWC_READ_REG32((uint32_t *) regaddr); + + ep = &pcd->ep0; + dwc_memcpy(cfi->buf_in.buf, ®val, sizeof(uint32_t)); @@ -38875,13 +47487,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + CFI_INFO("%s\n", __func__); + + if (cfiobj->buf_in.buf) { -+ dwc_dma_free(CFI_IN_BUF_LEN, cfiobj->buf_in.buf, ++ DWC_DMA_FREE(CFI_IN_BUF_LEN, cfiobj->buf_in.buf, + cfiobj->buf_in.addr); + cfiobj->buf_in.buf = NULL; + } + + if (cfiobj->buf_out.buf) { -+ dwc_dma_free(CFI_OUT_BUF_LEN, cfiobj->buf_out.buf, ++ DWC_DMA_FREE(CFI_OUT_BUF_LEN, cfiobj->buf_out.buf, + cfiobj->buf_out.addr); + cfiobj->buf_out.buf = NULL; + } @@ -38900,21 +47512,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 +static void cfi_free_ep_bs_dyn_data(cfi_ep_t * cfiep) +{ + if (cfiep->bm_sg) { -+ dwc_free(cfiep->bm_sg); ++ DWC_FREE(cfiep->bm_sg); + cfiep->bm_sg = NULL; + } + + if (cfiep->bm_align) { -+ dwc_free(cfiep->bm_align); ++ DWC_FREE(cfiep->bm_align); + cfiep->bm_align = NULL; + } + + if (cfiep->bm_concat) { + if (NULL != cfiep->bm_concat->wTxBytes) { -+ dwc_free(cfiep->bm_concat->wTxBytes); ++ DWC_FREE(cfiep->bm_concat->wTxBytes); + cfiep->bm_concat->wTxBytes = NULL; + } -+ dwc_free(cfiep->bm_concat); ++ DWC_FREE(cfiep->bm_concat); + cfiep->bm_concat = NULL; + } +} @@ -38928,7 +47540,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 +{ + int retval = 0; + -+ cfiep->bm_sg = dwc_alloc(sizeof(ddma_sg_buffer_setup_t)); ++ cfiep->bm_sg = DWC_ALLOC(sizeof(ddma_sg_buffer_setup_t)); + if (NULL == cfiep->bm_sg) { + CFI_INFO("Failed to allocate memory for SG feature value\n"); + return -DWC_E_NO_MEMORY; @@ -38939,21 +47551,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + * memory for the wTxBytes field - it will be done in the set_feature_value + * request handler. + */ -+ cfiep->bm_concat = dwc_alloc(sizeof(ddma_concat_buffer_setup_t)); ++ cfiep->bm_concat = DWC_ALLOC(sizeof(ddma_concat_buffer_setup_t)); + if (NULL == cfiep->bm_concat) { + CFI_INFO + ("Failed to allocate memory for CONCATENATION feature value\n"); -+ dwc_free(cfiep->bm_sg); ++ DWC_FREE(cfiep->bm_sg); + return -DWC_E_NO_MEMORY; + } + dwc_memset(cfiep->bm_concat, 0, sizeof(ddma_concat_buffer_setup_t)); + -+ cfiep->bm_align = dwc_alloc(sizeof(ddma_align_buffer_setup_t)); ++ cfiep->bm_align = DWC_ALLOC(sizeof(ddma_align_buffer_setup_t)); + if (NULL == cfiep->bm_align) { + CFI_INFO + ("Failed to allocate memory for Alignment feature value\n"); -+ dwc_free(cfiep->bm_sg); -+ dwc_free(cfiep->bm_concat); ++ DWC_FREE(cfiep->bm_sg); ++ DWC_FREE(cfiep->bm_concat); + return -DWC_E_NO_MEMORY; + } + dwc_memset(cfiep->bm_align, 0, sizeof(ddma_align_buffer_setup_t)); @@ -38985,7 +47597,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + if (NULL == cfiep) { + /* Allocate a cfi_ep_t object */ -+ cfiep = dwc_alloc(sizeof(cfi_ep_t)); ++ cfiep = DWC_ALLOC(sizeof(cfi_ep_t)); + if (NULL == cfiep) { + CFI_INFO + ("Unable to allocate memory for in function %s\n", @@ -38999,12 +47611,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + /* Allocate the DMA Descriptors chain of MAX_DMA_DESCS_PER_EP count */ + ep->dwc_ep.descs = -+ dwc_dma_alloc(MAX_DMA_DESCS_PER_EP * ++ DWC_DMA_ALLOC(MAX_DMA_DESCS_PER_EP * + sizeof(dwc_otg_dma_desc_t), + &ep->dwc_ep.descs_dma_addr); + + if (NULL == ep->dwc_ep.descs) { -+ dwc_free(cfiep); ++ DWC_FREE(cfiep); + return -DWC_E_NO_MEMORY; + } + @@ -39065,7 +47677,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + reg_value = *((uint32_t *) buf); + if (wValue == 0) { + addr = 0; -+ //addr = (uint32_t) pcd->otg_dev->base; ++ //addr = (uint32_t) pcd->otg_dev->os_dep.base; + addr += wIndex; + } else { + addr = (wValue << 16) | wIndex; @@ -39260,7 +47872,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + struct dwc_otg_pcd_ep *ep, dma_addr_t * dma, + unsigned size, gfp_t flags) +{ -+ return dwc_dma_alloc(size, dma); ++ return DWC_DMA_ALLOC(size, dma); +} + +/** @@ -39272,7 +47884,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + /* Allocate a buffer for IN XFERs */ + cfiobj->buf_in.buf = -+ dwc_dma_alloc(CFI_IN_BUF_LEN, &cfiobj->buf_in.addr); ++ DWC_DMA_ALLOC(CFI_IN_BUF_LEN, &cfiobj->buf_in.addr); + if (NULL == cfiobj->buf_in.buf) { + CFI_INFO("Unable to allocate buffer for INs\n"); + return -DWC_E_NO_MEMORY; @@ -39280,7 +47892,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + /* Allocate a buffer for OUT XFERs */ + cfiobj->buf_out.buf = -+ dwc_dma_alloc(CFI_OUT_BUF_LEN, &cfiobj->buf_out.addr); ++ DWC_DMA_ALLOC(CFI_OUT_BUF_LEN, &cfiobj->buf_out.addr); + if (NULL == cfiobj->buf_out.buf) { + CFI_INFO("Unable to allocate buffer for OUT\n"); + return -DWC_E_NO_MEMORY; @@ -39394,7 +48006,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 +{ + /* First we need to free the wTxBytes field */ + if (cfiep->bm_concat->wTxBytes) { -+ dwc_free(cfiep->bm_concat->wTxBytes); ++ DWC_FREE(cfiep->bm_concat->wTxBytes); + cfiep->bm_concat->wTxBytes = NULL; + } + @@ -39453,8 +48065,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + params->dev_tx_fifo_size[ep->dwc_ep.tx_fifo_num - + 1]; + params->dev_tx_fifo_size[ep->dwc_ep.tx_fifo_num - 1] = -+ GET_CORE_IF(pcd)->init_txfsiz[ep->dwc_ep. -+ tx_fifo_num - 1]; ++ GET_CORE_IF(pcd)->init_txfsiz[ep-> ++ dwc_ep.tx_fifo_num - ++ 1]; + } + } + @@ -39473,13 +48086,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + int i; + for (i = 0; i < core_if->hwcfg4.b.num_in_eps; + i++) { -+ core_if->core_params-> -+ dev_tx_fifo_size[i] = tx_siz[i]; ++ core_if-> ++ core_params->dev_tx_fifo_size[i] = ++ tx_siz[i]; + } + } else { -+ params->dev_tx_fifo_size[ep->dwc_ep. -+ tx_fifo_num - 1] = -+ tx_siz[0]; ++ params->dev_tx_fifo_size[ep-> ++ dwc_ep.tx_fifo_num - ++ 1] = tx_siz[0]; + } + } + retval = -DWC_E_INVALID; @@ -39818,12 +48432,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + /* Free the previously allocated storage for the wTxBytes */ + if (ep->bm_concat->wTxBytes) { -+ dwc_free(ep->bm_concat->wTxBytes); ++ DWC_FREE(ep->bm_concat->wTxBytes); + } + + /* Allocate a new storage for the wTxBytes field */ + ep->bm_concat->wTxBytes = -+ dwc_alloc(sizeof(uint16_t) * pConcatValHdr->bDescCount); ++ DWC_ALLOC(sizeof(uint16_t) * pConcatValHdr->bDescCount); + if (NULL == ep->bm_concat->wTxBytes) { + CFI_INFO("%s: Unable to allocate memory\n", __func__); + return -DWC_E_NO_MEMORY; @@ -39915,16 +48529,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + switch (wValue >> 8) { + case 0: -+ return (GET_CORE_IF(pcd)-> -+ pwron_txfsiz[ep->dwc_ep.tx_fifo_num - 1] < -+ 768) ? GET_CORE_IF(pcd)->pwron_txfsiz[ep->dwc_ep. -+ tx_fifo_num - -+ 1] : 32768; ++ return (GET_CORE_IF(pcd)->pwron_txfsiz ++ [ep->dwc_ep.tx_fifo_num - 1] < ++ 768) ? GET_CORE_IF(pcd)->pwron_txfsiz[ep-> ++ dwc_ep.tx_fifo_num ++ - 1] : 32768; + break; + case 1: -+ return GET_CORE_IF(pcd)->core_params->dev_tx_fifo_size[ep-> -+ dwc_ep. -+ num - 1]; ++ return GET_CORE_IF(pcd)->core_params-> ++ dev_tx_fifo_size[ep->dwc_ep.num - 1]; + break; + default: + return -DWC_E_INVALID; @@ -40021,65 +48634,63 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + + /* Configure data FIFO sizes */ + if (core_if->hwcfg2.b.dynamic_fifo && params->enable_dynamic_fifo) { -+ rx_fsz_bak = dwc_read_reg32(&global_regs->grxfsiz); ++ rx_fsz_bak = DWC_READ_REG32(&global_regs->grxfsiz); + rx_fifo_size = params->dev_rx_fifo_size; -+ dwc_write_reg32(&global_regs->grxfsiz, rx_fifo_size); ++ DWC_WRITE_REG32(&global_regs->grxfsiz, rx_fifo_size); + + /* + * Tx FIFOs These FIFOs are numbered from 1 to 15. + * Indexes of the FIFO size module parameters in the + * dev_tx_fifo_size array and the FIFO size registers in -+ * the dptxfsiz_dieptxf array run from 0 to 14. ++ * the dtxfsiz array run from 0 to 14. + */ + + /* Non-periodic Tx FIFO */ -+ nptxfsz_bak = dwc_read_reg32(&global_regs->gnptxfsiz); ++ nptxfsz_bak = DWC_READ_REG32(&global_regs->gnptxfsiz); + nptxfifosize.b.depth = params->dev_nperio_tx_fifo_size; + start_address = params->dev_rx_fifo_size; + nptxfifosize.b.startaddr = start_address; + -+ dwc_write_reg32(&global_regs->gnptxfsiz, nptxfifosize.d32); ++ DWC_WRITE_REG32(&global_regs->gnptxfsiz, nptxfifosize.d32); + + start_address += nptxfifosize.b.depth; + + for (i = 0; i < core_if->hwcfg4.b.num_in_eps; i++) { -+ txfsz_bak[i] = -+ dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]); ++ txfsz_bak[i] = DWC_READ_REG32(&global_regs->dtxfsiz[i]); + + txfifosize[i].b.depth = params->dev_tx_fifo_size[i]; + txfifosize[i].b.startaddr = start_address; -+ dwc_write_reg32(&global_regs->dptxfsiz_dieptxf[i], ++ DWC_WRITE_REG32(&global_regs->dtxfsiz[i], + txfifosize[i].d32); + + start_address += txfifosize[i].b.depth; + } + + /** Check if register values are set correctly */ -+ if (rx_fifo_size != dwc_read_reg32(&global_regs->grxfsiz)) { ++ if (rx_fifo_size != DWC_READ_REG32(&global_regs->grxfsiz)) { + retval = 0; + } + -+ if (nptxfifosize.d32 != dwc_read_reg32(&global_regs->gnptxfsiz)) { ++ if (nptxfifosize.d32 != DWC_READ_REG32(&global_regs->gnptxfsiz)) { + retval = 0; + } + + for (i = 0; i < core_if->hwcfg4.b.num_in_eps; i++) { + if (txfifosize[i].d32 != -+ dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i])) { ++ DWC_READ_REG32(&global_regs->dtxfsiz[i])) { + retval = 0; + } + } + + /** If register values are not set correctly, reset old values */ + if (retval == 0) { -+ dwc_write_reg32(&global_regs->grxfsiz, rx_fsz_bak); ++ DWC_WRITE_REG32(&global_regs->grxfsiz, rx_fsz_bak); + + /* Non-periodic Tx FIFO */ -+ dwc_write_reg32(&global_regs->gnptxfsiz, nptxfsz_bak); ++ DWC_WRITE_REG32(&global_regs->gnptxfsiz, nptxfsz_bak); + + for (i = 0; i < core_if->hwcfg4.b.num_in_eps; i++) { -+ dwc_write_reg32(&global_regs-> -+ dptxfsiz_dieptxf[i], ++ DWC_WRITE_REG32(&global_regs->dtxfsiz[i], + txfsz_bak[i]); + } + } @@ -40342,16 +48953,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-rpi-bootc-3 + return retval; +} + -+#endif //DWC_UTE_CFI -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2012-07-15 20:29:19.104083997 +0200 -@@ -0,0 +1,319 @@ ++#endif //DWC_UTE_CFI +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cfi.h b/drivers/usb/host/dwc_otg/dwc_otg_cfi.h +new file mode 100644 +index 0000000..cbccdab +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cfi.h +@@ -0,0 +1,320 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. -+ * ++ * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and @@ -40361,7 +48974,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. -+ * ++ * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -40382,10 +48995,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 +#include "dwc_cfi_common.h" + +/** -+ * @file -+ * -+ * This file contains the CFI related OTG PCD specific common constants, interfaces -+ * (functions and macros) and data structures. ++ * @file ++ * This file contains the CFI related OTG PCD specific common constants, ++ * interfaces(functions and macros) and data structures.The CFI Protocol is an ++ * optional interface for internal testing purposes that a DUT may implement to ++ * support testing of configurable features. + * + */ + @@ -40419,7 +49033,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 +#define max(x,y) ({ \ + x > y ? x : y; }) + -+/** ++/** + * Descriptor DMA SG Buffer setup structure (SG buffer). This structure is + * also used for setting up a buffer for Circular DDMA. + */ @@ -40483,7 +49097,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + +/** + * struct cfi_usb_ctrlrequest - the CFI implementation of the struct usb_ctrlrequest -+ * This structure encapsulates the standard usb_ctrlrequest and adds a pointer ++ * This structure encapsulates the standard usb_ctrlrequest and adds a pointer + * to the data returned in the data stage of a 3-stage Control Write requests. + */ +struct cfi_usb_ctrlrequest { @@ -40499,7 +49113,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + +/** + * The CFI wrapper of the enabled and activated dwc_otg_pcd_ep structures. -+ * This structure is used to store the buffer setup data for any ++ * This structure is used to store the buffer setup data for any + * enabled endpoint in the PCD. + */ +struct cfi_ep { @@ -40519,7 +49133,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + ddma_align_buffer_setup_t *bm_align; + /* XFER length */ + uint32_t xfer_len; -+ /* ++ /* + * Count of DMA descriptors currently used. + * The total should not exceed the MAX_DMA_DESCS_PER_EP value + * defined in the dwc_otg_cil.h @@ -40539,7 +49153,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + +/** + * This is the interface for the CFI operations. -+ * ++ * + * @param ep_enable Called when any endpoint is enabled and activated. + * @param release Called when the CFI object is released and it needs to correctly + * deallocate the dynamic memory @@ -40578,12 +49192,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + /* This flag shall control the propagation of a specific request + * to the gadget's processing routines. + * 0 - no gadget handling -+ * 1 - the gadget needs to know about this request (w/o completing a status ++ * 1 - the gadget needs to know about this request (w/o completing a status + * phase - just return a 0 to the _setup callback) + */ + uint8_t need_gadget_att; + -+ /* Flag indicating whether the status IN phase needs to be ++ /* Flag indicating whether the status IN phase needs to be + * completed by the PCD + */ + uint8_t need_status_in_complete; @@ -40665,21 +49279,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-rpi-bootc-3 + +int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl); + -+#endif /* (__DWC_OTG_CFI_H__) */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2012-07-15 20:29:19.065083268 +0200 -@@ -0,0 +1,5410 @@ ++#endif /* (__DWC_OTG_CFI_H__) */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cil.c b/drivers/usb/host/dwc_otg/dwc_otg_cil.c +new file mode 100644 +index 0000000..9b67537 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cil.c +@@ -0,0 +1,7151 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $ -+ * $Revision: #159 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237465 $ ++ * $Revision: #191 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. -+ * ++ * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and @@ -40689,7 +49305,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. -+ * ++ * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -40703,7 +49319,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * DAMAGE. + * ========================================================================== */ + -+/** @file ++/** @file + * + * The Core Interface Layer provides basic services for accessing and + * managing the DWC_otg hardware. These services are used by both the @@ -40723,7 +49339,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * + * The Core Interface Layer has the following requirements: + * - Provides basic controller operations. -+ * - Minimal use of OS services. ++ * - Minimal use of OS services. + * - The OS services used will be abstracted by using inline functions + * or macros. + * @@ -40735,12 +49351,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + +static int dwc_otg_setup_params(dwc_otg_core_if_t * core_if); + -+/** ++/** + * This function is called to initialize the DWC_otg CSR data -+ * structures. The register addresses in the device and host ++ * structures. The register addresses in the device and host + * structures are initialized from the base address supplied by the -+ * caller. The calling function must make the OS calls to get the -+ * base address of the DWC_otg controller registers. The core_params ++ * caller. The calling function must make the OS calls to get the ++ * base address of the DWC_otg controller registers. The core_params + * argument holds the parameters that specify how the core should be + * configured. + * @@ -40757,9 +49373,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_CILV, "%s(%p)\n", __func__, reg_base_addr); + -+ core_if = dwc_alloc(sizeof(dwc_otg_core_if_t)); ++ core_if = DWC_ALLOC(sizeof(dwc_otg_core_if_t)); + -+ if (core_if == 0) { ++ if (core_if == NULL) { + DWC_DEBUGPL(DBG_CIL, + "Allocation of dwc_otg_core_if_t failed\n"); + return 0; @@ -40769,11 +49385,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* + * Allocate the Device Mode structures. + */ -+ dev_if = dwc_alloc(sizeof(dwc_otg_dev_if_t)); ++ dev_if = DWC_ALLOC(sizeof(dwc_otg_dev_if_t)); + -+ if (dev_if == 0) { ++ if (dev_if == NULL) { + DWC_DEBUGPL(DBG_CIL, "Allocation of dwc_otg_dev_if_t failed\n"); -+ dwc_free(core_if); ++ DWC_FREE(core_if); + return 0; + } + @@ -40802,13 +49418,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* + * Allocate the Host Mode structures. + */ -+ host_if = dwc_alloc(sizeof(dwc_otg_host_if_t)); ++ host_if = DWC_ALLOC(sizeof(dwc_otg_host_if_t)); + -+ if (host_if == 0) { ++ if (host_if == NULL) { + DWC_DEBUGPL(DBG_CIL, + "Allocation of dwc_otg_host_if_t failed\n"); -+ dwc_free(dev_if); -+ dwc_free(core_if); ++ DWC_FREE(dev_if); ++ DWC_FREE(core_if); + return 0; + } + @@ -40833,8 +49449,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if->data_fifo[i] = + (uint32_t *) (reg_base + DWC_OTG_DATA_FIFO_OFFSET + + (i * DWC_OTG_DATA_FIFO_SIZE)); -+ DWC_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08x\n", -+ i, (unsigned)core_if->data_fifo[i]); ++ DWC_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08lx\n", ++ i, (unsigned long)core_if->data_fifo[i]); + } + + core_if->pcgcctl = (uint32_t *) (reg_base + DWC_OTG_PCGCCTL_OFFSET); @@ -40846,13 +49462,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * easy access later. + */ + core_if->hwcfg1.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->ghwcfg1); ++ DWC_READ_REG32(&core_if->core_global_regs->ghwcfg1); + core_if->hwcfg2.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->ghwcfg2); ++ DWC_READ_REG32(&core_if->core_global_regs->ghwcfg2); + core_if->hwcfg3.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->ghwcfg3); ++ DWC_READ_REG32(&core_if->core_global_regs->ghwcfg3); + core_if->hwcfg4.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->ghwcfg4); ++ DWC_READ_REG32(&core_if->core_global_regs->ghwcfg4); ++ ++ /* Force host mode to get HPTXFSIZ exact power on value */ ++ { ++ gusbcfg_data_t gusbcfg = {.d32 = 0 }; ++ gusbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); ++ gusbcfg.b.force_host_mode = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, gusbcfg.d32); ++ dwc_mdelay(100); ++ core_if->hptxfsiz.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs->hptxfsiz); ++ gusbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); ++ gusbcfg.b.force_host_mode = 0; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, gusbcfg.d32); ++ dwc_mdelay(100); ++ } + + DWC_DEBUGPL(DBG_CILV, "hwcfg1=%08x\n", core_if->hwcfg1.d32); + DWC_DEBUGPL(DBG_CILV, "hwcfg2=%08x\n", core_if->hwcfg2.d32); @@ -40860,9 +49491,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_DEBUGPL(DBG_CILV, "hwcfg4=%08x\n", core_if->hwcfg4.d32); + + core_if->hcfg.d32 = -+ dwc_read_reg32(&core_if->host_if->host_global_regs->hcfg); ++ DWC_READ_REG32(&core_if->host_if->host_global_regs->hcfg); + core_if->dcfg.d32 = -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg); ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); + + DWC_DEBUGPL(DBG_CILV, "hcfg=%08x\n", core_if->hcfg.d32); + DWC_DEBUGPL(DBG_CILV, "dcfg=%08x\n", core_if->dcfg.d32); @@ -40896,13 +49527,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if->wq_otg = DWC_WORKQ_ALLOC("dwc_otg"); + if (core_if->wq_otg == 0) { + DWC_WARN("DWC_WORKQ_ALLOC failed\n"); -+ dwc_free(host_if); -+ dwc_free(dev_if); -+ dwc_free(core_if); ++ DWC_FREE(host_if); ++ DWC_FREE(dev_if); ++ DWC_FREE(core_if); + return 0; + } + -+ core_if->snpsid = dwc_read_reg32(&core_if->core_global_regs->gsnpsid); ++ core_if->snpsid = DWC_READ_REG32(&core_if->core_global_regs->gsnpsid); + + DWC_PRINTF("Core Release: %x.%x%x%x\n", + (core_if->snpsid >> 12 & 0xF), @@ -40913,10 +49544,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + w_wakeup_detected, core_if); + if (core_if->wkp_timer == 0) { + DWC_WARN("DWC_TIMER_ALLOC failed\n"); -+ dwc_free(host_if); -+ dwc_free(dev_if); ++ DWC_FREE(host_if); ++ DWC_FREE(dev_if); + DWC_WORKQ_FREE(core_if->wq_otg); -+ dwc_free(core_if); ++ DWC_FREE(core_if); + return 0; + } + @@ -40924,37 +49555,59 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_WARN("Error while setting core params\n"); + } + ++ core_if->hibernation_suspend = 0; ++ ++ /** ADP initialization */ ++ dwc_otg_adp_init(core_if); ++ + return core_if; +} + +/** + * This function frees the structures allocated by dwc_otg_cil_init(). -+ * ++ * + * @param core_if The core interface pointer returned from + * dwc_otg_cil_init(). + * + */ +void dwc_otg_cil_remove(dwc_otg_core_if_t * core_if) +{ ++ dctl_data_t dctl = {.d32 = 0 }; + DWC_DEBUGPL(DBG_CILV, "%s(%p)\n", __func__, core_if); + + /* Disable all interrupts */ -+ dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, 1, 0); -+ dwc_write_reg32(&core_if->core_global_regs->gintmsk, 0); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gahbcfg, 1, 0); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, 0); ++ ++ dctl.b.sftdiscon = 1; ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, ++ dctl.d32); ++ } + + if (core_if->wq_otg) { + DWC_WORKQ_WAIT_WORK_DONE(core_if->wq_otg, 500); + DWC_WORKQ_FREE(core_if->wq_otg); + } + if (core_if->dev_if) { -+ dwc_free(core_if->dev_if); ++ DWC_FREE(core_if->dev_if); + } + if (core_if->host_if) { -+ dwc_free(core_if->host_if); ++ DWC_FREE(core_if->host_if); + } -+ dwc_free(core_if); -+ DWC_TIMER_FREE(core_if->wkp_timer); -+ DWC_FREE(core_if->core_params); ++ ++ /** Remove ADP Stuff */ ++ dwc_otg_adp_remove(core_if); ++ if (core_if->core_params) { ++ DWC_FREE(core_if->core_params); ++ } ++ if (core_if->wkp_timer) { ++ DWC_TIMER_FREE(core_if->wkp_timer); ++ } ++ if (core_if->srp_timer) { ++ DWC_TIMER_FREE(core_if->srp_timer); ++ } ++ DWC_FREE(core_if); +} + +/** @@ -40967,7 +49620,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +{ + gahbcfg_data_t ahbcfg = {.d32 = 0 }; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ -+ dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32); +} + +/** @@ -40979,9 +49632,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +void dwc_otg_disable_global_interrupts(dwc_otg_core_if_t * core_if) +{ + gahbcfg_data_t ahbcfg = {.d32 = 0 }; -+ ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ -+ DWC_PRINTF("%x -> %x\n", (unsigned int)&core_if->core_global_regs->gahbcfg, ahbcfg.d32); -+ dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0); ++ ahbcfg.b.glblintrmsk = 1; /* Disable interrupts */ ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0); +} + +/** @@ -40997,13 +49649,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + gintmsk_data_t intr_mask = {.d32 = 0 }; + + /* Clear any pending OTG Interrupts */ -+ dwc_write_reg32(&global_regs->gotgint, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&global_regs->gotgint, 0xFFFFFFFF); + + /* Clear any pending interrupts */ -+ dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&global_regs->gintsts, 0xFFFFFFFF); + -+ /* -+ * Enable the interrupts in the GINTMSK. ++ /* ++ * Enable the interrupts in the GINTMSK. + */ + intr_mask.b.modemismatch = 1; + intr_mask.b.otgintr = 1; @@ -41014,7 +49666,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + intr_mask.b.conidstschng = 1; + intr_mask.b.wkupintr = 1; -+ intr_mask.b.disconnect = 1; ++ intr_mask.b.disconnect = 0; + intr_mask.b.usbsuspend = 1; + intr_mask.b.sessreqintr = 1; +#ifdef CONFIG_USB_DWC_OTG_LPM @@ -41022,7 +49674,709 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + intr_mask.b.lpmtranrcvd = 1; + } +#endif -+ dwc_write_reg32(&global_regs->gintmsk, intr_mask.d32); ++ DWC_WRITE_REG32(&global_regs->gintmsk, intr_mask.d32); ++} ++ ++/* ++ * The restore operation is modified to support Synopsys Emulated Powerdown and ++ * Hibernation. This function is for exiting from Device mode hibernation by ++ * Host Initiated Resume/Reset and Device Initiated Remote-Wakeup. ++ * @param core_if Programming view of DWC_otg controller. ++ * @param rem_wakeup - indicates whether resume is initiated by Device or Host. ++ * @param reset - indicates whether resume is initiated by Reset. ++ */ ++int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if, ++ int rem_wakeup, int reset) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ dctl_data_t dctl = {.d32 = 0 }; ++ ++ int timeout = 2000; ++ ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++ ++ DWC_DEBUGPL(DBG_PCD, "%s called\n", __FUNCTION__); ++ /* Switch-on voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Assert Restore signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.restore = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ if (rem_wakeup) { ++ dwc_udelay(70); ++ } ++ ++ /* Deassert Reset core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Mask interrupts from gpwrdn */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.connect_det_msk = 1; ++ gpwrdn.b.srp_det_msk = 1; ++ gpwrdn.b.disconn_det_msk = 1; ++ gpwrdn.b.rst_det_msk = 1; ++ gpwrdn.b.lnstchng_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Indicates that we are going out from hibernation */ ++ core_if->hibernation_suspend = 0; ++ ++ /* ++ * Set Restore Essential Regs bit in PCGCCTL register, restore_mode = 1 ++ * indicates restore from remote_wakeup ++ */ ++ restore_essential_regs(core_if, rem_wakeup, 0); ++ ++ /* ++ * Wait a little for seeing new value of variable hibernation_suspend if ++ * Restore done interrupt received before polling ++ */ ++ dwc_udelay(10); ++ ++ if (core_if->hibernation_suspend == 0) { ++ /* ++ * Wait For Restore_done Interrupt. This mechanism of polling the ++ * interrupt is introduced to avoid any possible race conditions ++ */ ++ do { ++ gintsts_data_t gintsts; ++ gintsts.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ if (gintsts.b.restoredone) { ++ gintsts.d32 = 0; ++ gintsts.b.restoredone = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs-> ++ gintsts, gintsts.d32); ++ DWC_PRINTF("Restore Done Interrupt seen\n"); ++ break; ++ } ++ dwc_udelay(10); ++ } while (--timeout); ++ if (!timeout) { ++ DWC_PRINTF("Restore Done interrupt wasn't generated here\n"); ++ } ++ } ++ /* Clear all pending interupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* De-assert Restore */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.restore = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ if (!rem_wakeup) { ++ pcgcctl.d32 = 0; ++ pcgcctl.b.rstpdwnmodule = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); ++ } ++ ++ /* Restore GUSBCFG and DCFG */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, ++ core_if->gr_backup->gusbcfg_local); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, ++ core_if->dr_backup->dcfg); ++ ++ /* De-assert Wakeup Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ if (!rem_wakeup) { ++ /* Set Device programming done bit */ ++ dctl.b.pwronprgdone = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ } else { ++ /* Start Remote Wakeup Signaling */ ++ dctl.d32 = core_if->dr_backup->dctl; ++ dctl.b.rmtwkupsig = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32); ++ } ++ ++ dwc_mdelay(2); ++ /* Clear all pending interupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* Restore global registers */ ++ dwc_otg_restore_global_regs(core_if); ++ /* Restore device global registers */ ++ dwc_otg_restore_dev_regs(core_if, rem_wakeup); ++ ++ if (rem_wakeup) { ++ dwc_mdelay(7); ++ dctl.d32 = 0; ++ dctl.b.rmtwkupsig = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32, 0); ++ } ++ ++ core_if->hibernation_suspend = 0; ++ /* The core will be in ON STATE */ ++ core_if->lx_state = DWC_OTG_L0; ++ DWC_PRINTF("Hibernation recovery completes here\n"); ++ ++ return 1; ++} ++ ++/* ++ * The restore operation is modified to support Synopsys Emulated Powerdown and ++ * Hibernation. This function is for exiting from Host mode hibernation by ++ * Host Initiated Resume/Reset and Device Initiated Remote-Wakeup. ++ * @param core_if Programming view of DWC_otg controller. ++ * @param rem_wakeup - indicates whether resume is initiated by Device or Host. ++ * @param reset - indicates whether resume is initiated by Reset. ++ */ ++int dwc_otg_host_hibernation_restore(dwc_otg_core_if_t * core_if, ++ int rem_wakeup, int reset) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ hprt0_data_t hprt0 = {.d32 = 0 }; ++ ++ int timeout = 2000; ++ ++ DWC_DEBUGPL(DBG_HCD, "%s called\n", __FUNCTION__); ++ /* Switch-on voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Assert Restore signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.restore = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ if (!rem_wakeup) { ++ dwc_udelay(50); ++ } ++ ++ /* Deassert Reset core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.connect_det_msk = 1; ++ gpwrdn.b.srp_det_msk = 1; ++ gpwrdn.b.disconn_det_msk = 1; ++ gpwrdn.b.rst_det_msk = 1; ++ gpwrdn.b.lnstchng_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Indicates that we are going out from hibernation */ ++ core_if->hibernation_suspend = 0; ++ ++ /* Set Restore Essential Regs bit in PCGCCTL register */ ++ restore_essential_regs(core_if, rem_wakeup, 1); ++ ++ /* Wait a little for seeing new value of variable hibernation_suspend if ++ * Restore done interrupt received before polling */ ++ dwc_udelay(10); ++ ++ if (core_if->hibernation_suspend == 0) { ++ /* Wait For Restore_done Interrupt. This mechanism of polling the ++ * interrupt is introduced to avoid any possible race conditions ++ */ ++ do { ++ gintsts_data_t gintsts; ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ if (gintsts.b.restoredone) { ++ gintsts.d32 = 0; ++ gintsts.b.restoredone = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_DEBUGPL(DBG_HCD,"Restore Done Interrupt seen\n"); ++ break; ++ } ++ dwc_udelay(10); ++ } while (--timeout); ++ if (!timeout) { ++ DWC_WARN("Restore Done interrupt wasn't generated\n"); ++ } ++ } ++ ++ /* Set the flag's value to 0 again after receiving restore done interrupt */ ++ core_if->hibernation_suspend = 0; ++ ++ /* This step is not described in functional spec but if not wait for this ++ * delay, mismatch interrupts occurred because just after restore core is ++ * in Device mode(gintsts.curmode == 0) */ ++ dwc_mdelay(100); ++ ++ /* Clear all pending interrupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* De-assert Restore */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.restore = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Restore GUSBCFG and HCFG */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, ++ core_if->gr_backup->gusbcfg_local); ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hcfg, ++ core_if->hr_backup->hcfg_local); ++ ++ /* De-assert Wakeup Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Start the Resume operation by programming HPRT0 */ ++ hprt0.d32 = core_if->hr_backup->hprt0_local; ++ hprt0.b.prtpwr = 1; ++ hprt0.b.prtena = 0; ++ hprt0.b.prtsusp = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ ++ DWC_PRINTF("Resume Starts Now\n"); ++ if (!reset) { // Indicates it is Resume Operation ++ hprt0.d32 = core_if->hr_backup->hprt0_local; ++ hprt0.b.prtres = 1; ++ hprt0.b.prtpwr = 1; ++ hprt0.b.prtena = 0; ++ hprt0.b.prtsusp = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ ++ if (!rem_wakeup) ++ hprt0.b.prtres = 0; ++ /* Wait for Resume time and then program HPRT again */ ++ dwc_mdelay(100); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ ++ } else { // Indicates it is Reset Operation ++ hprt0.d32 = core_if->hr_backup->hprt0_local; ++ hprt0.b.prtrst = 1; ++ hprt0.b.prtpwr = 1; ++ hprt0.b.prtena = 0; ++ hprt0.b.prtsusp = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ /* Wait for Reset time and then program HPRT again */ ++ dwc_mdelay(60); ++ hprt0.b.prtrst = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ } ++ /* Clear all interrupt status */ ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ hprt0.b.prtconndet = 1; ++ hprt0.b.prtenchng = 1; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ ++ /* Clear all pending interupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* Restore global registers */ ++ dwc_otg_restore_global_regs(core_if); ++ /* Restore host global registers */ ++ dwc_otg_restore_host_regs(core_if, reset); ++ ++ /* The core will be in ON STATE */ ++ core_if->lx_state = DWC_OTG_L0; ++ DWC_PRINTF("Hibernation recovery is complete here\n"); ++ return 0; ++} ++ ++/** Saves some register values into system memory. */ ++int dwc_otg_save_global_regs(dwc_otg_core_if_t * core_if) ++{ ++ struct dwc_otg_global_regs_backup *gr; ++ int i; ++ ++ gr = core_if->gr_backup; ++ if (!gr) { ++ gr = DWC_ALLOC(sizeof(*gr)); ++ if (!gr) { ++ return -DWC_E_NO_MEMORY; ++ } ++ core_if->gr_backup = gr; ++ } ++ ++ gr->gotgctl_local = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); ++ gr->gintmsk_local = DWC_READ_REG32(&core_if->core_global_regs->gintmsk); ++ gr->gahbcfg_local = DWC_READ_REG32(&core_if->core_global_regs->gahbcfg); ++ gr->gusbcfg_local = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); ++ gr->grxfsiz_local = DWC_READ_REG32(&core_if->core_global_regs->grxfsiz); ++ gr->gnptxfsiz_local = DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz); ++ gr->hptxfsiz_local = DWC_READ_REG32(&core_if->core_global_regs->hptxfsiz); ++#ifdef CONFIG_USB_DWC_OTG_LPM ++ gr->glpmcfg_local = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); ++#endif ++ gr->gi2cctl_local = DWC_READ_REG32(&core_if->core_global_regs->gi2cctl); ++ gr->pcgcctl_local = DWC_READ_REG32(core_if->pcgcctl); ++ gr->gdfifocfg_local = ++ DWC_READ_REG32(&core_if->core_global_regs->gdfifocfg); ++ for (i = 0; i < MAX_EPS_CHANNELS; i++) { ++ gr->dtxfsiz_local[i] = ++ DWC_READ_REG32(&(core_if->core_global_regs->dtxfsiz[i])); ++ } ++ ++ DWC_DEBUGPL(DBG_ANY, "===========Backing Global registers==========\n"); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gotgctl = %08x\n", gr->gotgctl_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gintmsk = %08x\n", gr->gintmsk_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gahbcfg = %08x\n", gr->gahbcfg_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gusbcfg = %08x\n", gr->gusbcfg_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up grxfsiz = %08x\n", gr->grxfsiz_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gnptxfsiz = %08x\n", ++ gr->gnptxfsiz_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up hptxfsiz = %08x\n", ++ gr->hptxfsiz_local); ++#ifdef CONFIG_USB_DWC_OTG_LPM ++ DWC_DEBUGPL(DBG_ANY, "Backed up glpmcfg = %08x\n", gr->glpmcfg_local); ++#endif ++ DWC_DEBUGPL(DBG_ANY, "Backed up gi2cctl = %08x\n", gr->gi2cctl_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up pcgcctl = %08x\n", gr->pcgcctl_local); ++ DWC_DEBUGPL(DBG_ANY,"Backed up gdfifocfg = %08x\n",gr->gdfifocfg_local); ++ ++ return 0; ++} ++ ++/** Saves GINTMSK register before setting the msk bits. */ ++int dwc_otg_save_gintmsk_reg(dwc_otg_core_if_t * core_if) ++{ ++ struct dwc_otg_global_regs_backup *gr; ++ ++ gr = core_if->gr_backup; ++ if (!gr) { ++ gr = DWC_ALLOC(sizeof(*gr)); ++ if (!gr) { ++ return -DWC_E_NO_MEMORY; ++ } ++ core_if->gr_backup = gr; ++ } ++ ++ gr->gintmsk_local = DWC_READ_REG32(&core_if->core_global_regs->gintmsk); ++ ++ DWC_DEBUGPL(DBG_ANY,"=============Backing GINTMSK registers============\n"); ++ DWC_DEBUGPL(DBG_ANY, "Backed up gintmsk = %08x\n", gr->gintmsk_local); ++ ++ return 0; ++} ++ ++int dwc_otg_save_dev_regs(dwc_otg_core_if_t * core_if) ++{ ++ struct dwc_otg_dev_regs_backup *dr; ++ int i; ++ ++ dr = core_if->dr_backup; ++ if (!dr) { ++ dr = DWC_ALLOC(sizeof(*dr)); ++ if (!dr) { ++ return -DWC_E_NO_MEMORY; ++ } ++ core_if->dr_backup = dr; ++ } ++ ++ dr->dcfg = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); ++ dr->dctl = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl); ++ dr->daintmsk = ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk); ++ dr->diepmsk = ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->diepmsk); ++ dr->doepmsk = ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->doepmsk); ++ ++ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { ++ dr->diepctl[i] = ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[i]->diepctl); ++ dr->dieptsiz[i] = ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[i]->dieptsiz); ++ dr->diepdma[i] = ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[i]->diepdma); ++ } ++ ++ DWC_DEBUGPL(DBG_ANY, ++ "=============Backing Host registers==============\n"); ++ DWC_DEBUGPL(DBG_ANY, "Backed up dcfg = %08x\n", dr->dcfg); ++ DWC_DEBUGPL(DBG_ANY, "Backed up dctl = %08x\n", dr->dctl); ++ DWC_DEBUGPL(DBG_ANY, "Backed up daintmsk = %08x\n", ++ dr->daintmsk); ++ DWC_DEBUGPL(DBG_ANY, "Backed up diepmsk = %08x\n", dr->diepmsk); ++ DWC_DEBUGPL(DBG_ANY, "Backed up doepmsk = %08x\n", dr->doepmsk); ++ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { ++ DWC_DEBUGPL(DBG_ANY, "Backed up diepctl[%d] = %08x\n", i, ++ dr->diepctl[i]); ++ DWC_DEBUGPL(DBG_ANY, "Backed up dieptsiz[%d] = %08x\n", ++ i, dr->dieptsiz[i]); ++ DWC_DEBUGPL(DBG_ANY, "Backed up diepdma[%d] = %08x\n", i, ++ dr->diepdma[i]); ++ } ++ ++ return 0; ++} ++ ++int dwc_otg_save_host_regs(dwc_otg_core_if_t * core_if) ++{ ++ struct dwc_otg_host_regs_backup *hr; ++ int i; ++ ++ hr = core_if->hr_backup; ++ if (!hr) { ++ hr = DWC_ALLOC(sizeof(*hr)); ++ if (!hr) { ++ return -DWC_E_NO_MEMORY; ++ } ++ core_if->hr_backup = hr; ++ } ++ ++ hr->hcfg_local = ++ DWC_READ_REG32(&core_if->host_if->host_global_regs->hcfg); ++ hr->haintmsk_local = ++ DWC_READ_REG32(&core_if->host_if->host_global_regs->haintmsk); ++ for (i = 0; i < dwc_otg_get_param_host_channels(core_if); ++i) { ++ hr->hcintmsk_local[i] = ++ DWC_READ_REG32(&core_if->host_if->hc_regs[i]->hcintmsk); ++ } ++ hr->hprt0_local = DWC_READ_REG32(core_if->host_if->hprt0); ++ hr->hfir_local = ++ DWC_READ_REG32(&core_if->host_if->host_global_regs->hfir); ++ ++ DWC_DEBUGPL(DBG_ANY, ++ "=============Backing Host registers===============\n"); ++ DWC_DEBUGPL(DBG_ANY, "Backed up hcfg = %08x\n", ++ hr->hcfg_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up haintmsk = %08x\n", hr->haintmsk_local); ++ for (i = 0; i < dwc_otg_get_param_host_channels(core_if); ++i) { ++ DWC_DEBUGPL(DBG_ANY, "Backed up hcintmsk[%02d]=%08x\n", i, ++ hr->hcintmsk_local[i]); ++ } ++ DWC_DEBUGPL(DBG_ANY, "Backed up hprt0 = %08x\n", ++ hr->hprt0_local); ++ DWC_DEBUGPL(DBG_ANY, "Backed up hfir = %08x\n", ++ hr->hfir_local); ++ ++ return 0; ++} ++ ++int dwc_otg_restore_global_regs(dwc_otg_core_if_t *core_if) ++{ ++ struct dwc_otg_global_regs_backup *gr; ++ int i; ++ ++ gr = core_if->gr_backup; ++ if (!gr) { ++ return -DWC_E_INVALID; ++ } ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gotgctl, gr->gotgctl_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, gr->gintmsk_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, gr->gusbcfg_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gahbcfg, gr->gahbcfg_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->grxfsiz, gr->grxfsiz_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gnptxfsiz, ++ gr->gnptxfsiz_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->hptxfsiz, ++ gr->hptxfsiz_local); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gdfifocfg, ++ gr->gdfifocfg_local); ++ for (i = 0; i < MAX_EPS_CHANNELS; i++) { ++ DWC_WRITE_REG32(&core_if->core_global_regs->dtxfsiz[i], ++ gr->dtxfsiz_local[i]); ++ } ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, 0x0000100A); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gahbcfg, ++ (gr->gahbcfg_local)); ++ return 0; ++} ++ ++int dwc_otg_restore_dev_regs(dwc_otg_core_if_t * core_if, int rem_wakeup) ++{ ++ struct dwc_otg_dev_regs_backup *dr; ++ int i; ++ ++ dr = core_if->dr_backup; ++ ++ if (!dr) { ++ return -DWC_E_INVALID; ++ } ++ ++ if (!rem_wakeup) { ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, ++ dr->dctl); ++ } ++ ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->daintmsk, dr->daintmsk); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->diepmsk, dr->diepmsk); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->doepmsk, dr->doepmsk); ++ ++ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[i]->dieptsiz, dr->dieptsiz[i]); ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[i]->diepdma, dr->diepdma[i]); ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[i]->diepctl, dr->diepctl[i]); ++ } ++ ++ return 0; ++} ++ ++int dwc_otg_restore_host_regs(dwc_otg_core_if_t * core_if, int reset) ++{ ++ struct dwc_otg_host_regs_backup *hr; ++ int i; ++ hr = core_if->hr_backup; ++ ++ if (!hr) { ++ return -DWC_E_INVALID; ++ } ++ ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hcfg, hr->hcfg_local); ++ //if (!reset) ++ //{ ++ // DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hfir, hr->hfir_local); ++ //} ++ ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->haintmsk, ++ hr->haintmsk_local); ++ for (i = 0; i < dwc_otg_get_param_host_channels(core_if); ++i) { ++ DWC_WRITE_REG32(&core_if->host_if->hc_regs[i]->hcintmsk, ++ hr->hcintmsk_local[i]); ++ } ++ ++ return 0; ++} ++ ++int restore_lpm_i2c_regs(dwc_otg_core_if_t * core_if) ++{ ++ struct dwc_otg_global_regs_backup *gr; ++ ++ gr = core_if->gr_backup; ++ ++ /* Restore values for LPM and I2C */ ++#ifdef CONFIG_USB_DWC_OTG_LPM ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, gr->glpmcfg_local); ++#endif ++ DWC_WRITE_REG32(&core_if->core_global_regs->gi2cctl, gr->gi2cctl_local); ++ ++ return 0; ++} ++ ++int restore_essential_regs(dwc_otg_core_if_t * core_if, int rmode, int is_host) ++{ ++ struct dwc_otg_global_regs_backup *gr; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ gahbcfg_data_t gahbcfg = {.d32 = 0 }; ++ gusbcfg_data_t gusbcfg = {.d32 = 0 }; ++ gintmsk_data_t gintmsk = {.d32 = 0 }; ++ ++ /* Restore LPM and I2C registers */ ++ restore_lpm_i2c_regs(core_if); ++ ++ /* Set PCGCCTL to 0 */ ++ DWC_WRITE_REG32(core_if->pcgcctl, 0x00000000); ++ ++ gr = core_if->gr_backup; ++ /* Load restore values for [31:14] bits */ ++ DWC_WRITE_REG32(core_if->pcgcctl, ++ ((gr->pcgcctl_local & 0xffffc000) | 0x00020000)); ++ ++ /* Umnask global Interrupt in GAHBCFG and restore it */ ++ gahbcfg.d32 = gr->gahbcfg_local; ++ gahbcfg.b.glblintrmsk = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gahbcfg, gahbcfg.d32); ++ ++ /* Clear all pending interupts */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ ++ /* Unmask restore done interrupt */ ++ gintmsk.b.restoredone = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, gintmsk.d32); ++ ++ /* Restore GUSBCFG and HCFG/DCFG */ ++ gusbcfg.d32 = core_if->gr_backup->gusbcfg_local; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, gusbcfg.d32); ++ ++ if (is_host) { ++ hcfg_data_t hcfg = {.d32 = 0 }; ++ hcfg.d32 = core_if->hr_backup->hcfg_local; ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hcfg, ++ hcfg.d32); ++ ++ /* Load restore values for [31:14] bits */ ++ pcgcctl.d32 = gr->pcgcctl_local & 0xffffc000; ++ pcgcctl.d32 = gr->pcgcctl_local | 0x00020000; ++ ++ if (rmode) ++ pcgcctl.b.restoremode = 1; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ dwc_udelay(10); ++ ++ /* Load restore values for [31:14] bits and set EssRegRestored bit */ ++ pcgcctl.d32 = gr->pcgcctl_local | 0xffffc000; ++ pcgcctl.d32 = gr->pcgcctl_local & 0xffffc000; ++ pcgcctl.b.ess_reg_restored = 1; ++ if (rmode) ++ pcgcctl.b.restoremode = 1; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ } else { ++ dcfg_data_t dcfg = {.d32 = 0 }; ++ dcfg.d32 = core_if->dr_backup->dcfg; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32); ++ ++ /* Load restore values for [31:14] bits */ ++ pcgcctl.d32 = gr->pcgcctl_local & 0xffffc000; ++ pcgcctl.d32 = gr->pcgcctl_local | 0x00020000; ++ if (!rmode) { ++ pcgcctl.d32 |= 0x208; ++ } ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ dwc_udelay(10); ++ ++ /* Load restore values for [31:14] bits */ ++ pcgcctl.d32 = gr->pcgcctl_local & 0xffffc000; ++ pcgcctl.d32 = gr->pcgcctl_local | 0x00020000; ++ pcgcctl.b.ess_reg_restored = 1; ++ if (!rmode) ++ pcgcctl.d32 |= 0x208; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ } ++ ++ return 0; +} + +/** @@ -41046,9 +50400,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + + DWC_DEBUGPL(DBG_CIL, "Initializing HCFG.FSLSPClkSel to 0x%1x\n", val); -+ hcfg.d32 = dwc_read_reg32(&core_if->host_if->host_global_regs->hcfg); ++ hcfg.d32 = DWC_READ_REG32(&core_if->host_if->host_global_regs->hcfg); + hcfg.b.fslspclksel = val; -+ dwc_write_reg32(&core_if->host_if->host_global_regs->hcfg, hcfg.d32); ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hcfg, hcfg.d32); +} + +/** @@ -41076,14 +50430,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_CIL, "Initializing DCFG.DevSpd to 0x%1x\n", val); + -+ dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg); ++ dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); + dcfg.b.devspd = val; -+ dwc_write_reg32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32); +} + +/** + * This function calculates the number of IN EPS -+ * using GHWCFG1 and GHWCFG2 registers values ++ * using GHWCFG1 and GHWCFG2 registers values + * + * @param core_if Programming view of the DWC_otg controller + */ @@ -41112,7 +50466,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + +/** + * This function calculates the number of OUT EPS -+ * using GHWCFG1 and GHWCFG2 registers values ++ * using GHWCFG1 and GHWCFG2 registers values + * + * @param core_if Programming view of the DWC_otg controller + */ @@ -41152,8 +50506,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if, global_regs); + + /* Common Initialization */ -+ -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + + /* Program the ULPI External VBUS bit if needed */ + usbcfg.b.ulpi_ext_vbus_drv = @@ -41163,11 +50516,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Set external TS Dline pulsing */ + usbcfg.b.term_sel_dl_pulse = + (core_if->core_params->ts_dline == 1) ? 1 : 0; -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + + /* Reset the Controller */ + dwc_otg_core_reset(core_if); + ++ core_if->adp_enable = core_if->core_params->adp_supp_enable; ++ core_if->power_down = core_if->core_params->power_down; ++ core_if->otg_sts = 0; ++ + /* Initialize parameters from Hardware configuration registers. */ + dev_if->num_in_eps = calc_num_in_eps(core_if); + dev_if->num_out_eps = calc_num_out_eps(core_if); @@ -41177,22 +50534,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + for (i = 0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; i++) { + dev_if->perio_tx_fifo_size[i] = -+ dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]) >> 16; ++ DWC_READ_REG32(&global_regs->dtxfsiz[i]) >> 16; + DWC_DEBUGPL(DBG_CIL, "Periodic Tx FIFO SZ #%d=0x%0x\n", + i, dev_if->perio_tx_fifo_size[i]); + } + + for (i = 0; i < core_if->hwcfg4.b.num_in_eps; i++) { + dev_if->tx_fifo_size[i] = -+ dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]) >> 16; ++ DWC_READ_REG32(&global_regs->dtxfsiz[i]) >> 16; + DWC_DEBUGPL(DBG_CIL, "Tx FIFO SZ #%d=0x%0x\n", -+ i, dev_if->perio_tx_fifo_size[i]); ++ i, dev_if->tx_fifo_size[i]); + } + + core_if->total_fifo_size = core_if->hwcfg3.b.dfifo_depth; -+ core_if->rx_fifo_size = dwc_read_reg32(&global_regs->grxfsiz); ++ core_if->rx_fifo_size = DWC_READ_REG32(&global_regs->grxfsiz); + core_if->nperio_tx_fifo_size = -+ dwc_read_reg32(&global_regs->gnptxfsiz) >> 16; ++ DWC_READ_REG32(&global_regs->gnptxfsiz) >> 16; + + DWC_DEBUGPL(DBG_CIL, "Total FIFO SZ=%d\n", core_if->total_fifo_size); + DWC_DEBUGPL(DBG_CIL, "Rx FIFO SZ=%d\n", core_if->rx_fifo_size); @@ -41210,9 +50567,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (!core_if->phy_init_done) { + core_if->phy_init_done = 1; + DWC_DEBUGPL(DBG_CIL, "FS_PHY detected\n"); -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + usbcfg.b.physel = 1; -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + + /* Reset after a PHY select */ + dwc_otg_core_reset(core_if); @@ -41230,17 +50587,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (core_if->core_params->i2c_enable) { + DWC_DEBUGPL(DBG_CIL, "FS_PHY Enabling I2c\n"); + /* Program GUSBCFG.OtgUtmifsSel to I2C */ -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + usbcfg.b.otgutmifssel = 1; -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + + /* Program GI2CCTL.I2CEn */ -+ i2cctl.d32 = dwc_read_reg32(&global_regs->gi2cctl); ++ i2cctl.d32 = DWC_READ_REG32(&global_regs->gi2cctl); + i2cctl.b.i2cdevaddr = 1; + i2cctl.b.i2cen = 0; -+ dwc_write_reg32(&global_regs->gi2cctl, i2cctl.d32); ++ DWC_WRITE_REG32(&global_regs->gi2cctl, i2cctl.d32); + i2cctl.b.i2cen = 1; -+ dwc_write_reg32(&global_regs->gi2cctl, i2cctl.d32); ++ DWC_WRITE_REG32(&global_regs->gi2cctl, i2cctl.d32); + } + + } /* endif speed == DWC_SPEED_PARAM_FULL */ @@ -41251,24 +50608,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* HS PHY parameters. These parameters are preserved + * during soft reset so only program the first time. Do + * a soft reset immediately after setting phyif. */ -+ usbcfg.b.ulpi_utmi_sel = core_if->core_params->phy_type; -+ if (usbcfg.b.ulpi_utmi_sel == 1) { ++ ++ if (core_if->core_params->phy_type == 2) { + /* ULPI interface */ ++ usbcfg.b.ulpi_utmi_sel = 1; + usbcfg.b.phyif = 0; + usbcfg.b.ddrsel = + core_if->core_params->phy_ulpi_ddr; -+ } else { ++ } else if (core_if->core_params->phy_type == 1) { + /* UTMI+ interface */ ++ usbcfg.b.ulpi_utmi_sel = 0; + if (core_if->core_params->phy_utmi_width == 16) { + usbcfg.b.phyif = 1; + + } else { + usbcfg.b.phyif = 0; + } -+ ++ } else { ++ DWC_ERROR("FS PHY TYPE\n"); + } -+ -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + /* Reset after setting the PHY parameters */ + dwc_otg_core_reset(core_if); + } @@ -41278,15 +50637,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + (core_if->hwcfg2.b.fs_phy_type == 1) && + (core_if->core_params->ulpi_fs_ls)) { + DWC_DEBUGPL(DBG_CIL, "Setting ULPI FSLS\n"); -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + usbcfg.b.ulpi_fsls = 1; + usbcfg.b.ulpi_clk_sus_m = 1; -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + } else { -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + } + + /* Program the GAHBCFG Register. */ @@ -41318,8 +50677,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + case DWC_INT_DMA_ARCH: + DWC_DEBUGPL(DBG_CIL, "Internal DMA Mode\n"); -+ /*ahbcfg.b.hburstlen = DWC_GAHBCFG_INT_DMA_BURST_INCR; */ -+ ahbcfg.b.hburstlen = (1<<3)|(0<<0); /* WRESP=1, max 4 beats */ ++ /* Old value was DWC_GAHBCFG_INT_DMA_BURST_INCR - done for ++ Host mode ISOC in issue fix - vahrama */ ++ /* Broadcom had altered to (1<<3)|(0<<0) - WRESP=1, max 4 beats */ ++ ahbcfg.b.hburstlen = (1<<3)|(0<<0);//DWC_GAHBCFG_INT_DMA_BURST_INCR4; + core_if->dma_enable = (core_if->core_params->dma_enable != 0); + core_if->dma_desc_enable = + (core_if->core_params->dma_desc_enable != 0); @@ -41337,9 +50698,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_PRINTF("Using Slave mode\n"); + core_if->dma_desc_enable = 0; + } ++ ++ if (core_if->core_params->ahb_single) { ++ ahbcfg.b.ahbsingle = 1; ++ } + + ahbcfg.b.dmaenable = core_if->dma_enable; -+ dwc_write_reg32(&global_regs->gahbcfg, ahbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gahbcfg, ahbcfg.d32); + + core_if->en_multiple_tx_fifo = core_if->hwcfg4.b.ded_fifo_en; + @@ -41350,10 +50715,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_PRINTF("Multiprocessor Interrupt Enhancement - %s\n", + ((core_if->multiproc_int_enable) ? "enabled" : "disabled")); + -+ /* -+ * Program the GUSBCFG register. ++ /* ++ * Program the GUSBCFG register. + */ -+ usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + + switch (core_if->hwcfg2.b.op_mode) { + case DWC_MODE_HNP_SRP_CAPABLE: @@ -41397,7 +50762,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + break; + } + -+ dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, usbcfg.d32); + +#ifdef CONFIG_USB_DWC_OTG_LPM + if (core_if->core_params->lpm_enable) { @@ -41412,7 +50777,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Retry 3 times */ + lpmcfg.b.retry_count = 3; + -+ dwc_modify_reg32(&core_if->core_global_regs->glpmcfg, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->glpmcfg, + 0, lpmcfg.d32); + + } @@ -41420,9 +50785,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (core_if->core_params->ic_usb_cap) { + gusbcfg_data_t gusbcfg = {.d32 = 0 }; + gusbcfg.b.ic_usb_cap = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gusbcfg, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gusbcfg, + 0, gusbcfg.d32); + } ++ { ++ gotgctl_data_t gotgctl = {.d32 = 0 }; ++ gotgctl.b.otgver = core_if->core_params->otg_ver; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gotgctl, 0, ++ gotgctl.d32); ++ /* Set OTG version supported */ ++ core_if->otg_ver = core_if->core_params->otg_ver; ++ DWC_PRINTF("OTG VER PARAM: %d, OTG VER FLAG: %d\n", ++ core_if->core_params->otg_ver, core_if->otg_ver); ++ } ++ + + /* Enable common interrupts */ + dwc_otg_enable_common_interrupts(core_if); @@ -41441,7 +50817,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } +} + -+/** ++/** + * This function enables the Device mode interrupts. + * + * @param core_if Programming view of DWC_otg controller @@ -41454,10 +50830,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_DEBUGPL(DBG_CIL, "%s()\n", __func__); + + /* Disable all interrupts. */ -+ dwc_write_reg32(&global_regs->gintmsk, 0); ++ DWC_WRITE_REG32(&global_regs->gintmsk, 0); + + /* Clear any pending interrupts */ -+ dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&global_regs->gintsts, 0xFFFFFFFF); + + /* Enable the common interrupts */ + dwc_otg_enable_common_interrupts(core_if); @@ -41465,6 +50841,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Enable interrupts */ + intr_mask.b.usbreset = 1; + intr_mask.b.enumdone = 1; ++ /* Disable Disconnect interrupt in Device mode */ ++ intr_mask.b.disconnect = 0; + + if (!core_if->multiproc_int_enable) { + intr_mask.b.inepintr = 1; @@ -41476,15 +50854,36 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (core_if->en_multiple_tx_fifo == 0) { + intr_mask.b.epmismatch = 1; + } ++ ++ //intr_mask.b.incomplisoout = 1; ++ intr_mask.b.incomplisoin = 1; ++ ++/* Enable the ignore frame number for ISOC xfers - MAS */ ++/* Disable to support high bandwith ISOC transfers - manukz */ ++#if 0 ++#ifdef DWC_UTE_PER_IO ++ if (core_if->dma_enable) { ++ if (core_if->dma_desc_enable) { ++ dctl_data_t dctl1 = {.d32 = 0 }; ++ dctl1.b.ifrmnum = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> ++ dctl, 0, dctl1.d32); ++ DWC_DEBUG("----Enabled Ignore frame number (0x%08x)", ++ DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->dctl)); ++ } ++ } ++#endif ++#endif +#ifdef DWC_EN_ISOC + if (core_if->dma_enable) { + if (core_if->dma_desc_enable == 0) { + if (core_if->pti_enh_enable) { + dctl_data_t dctl = {.d32 = 0 }; + dctl.b.ifrmnum = 1; -+ dwc_modify_reg32(&core_if->dev_if-> -+ dev_global_regs->dctl, 0, -+ dctl.d32); ++ DWC_MODIFY_REG32(&core_if-> ++ dev_if->dev_global_regs->dctl, ++ 0, dctl.d32); + } else { + intr_mask.b.incomplisoin = 1; + intr_mask.b.incomplisoout = 1; @@ -41494,7 +50893,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + intr_mask.b.incomplisoin = 1; + intr_mask.b.incomplisoout = 1; + } -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ + + /** @todo NGS: Should this be a module parameter? */ +#ifdef USE_PERIODIC_EP @@ -41504,16 +50903,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + intr_mask.b.incomplisoout = 1; +#endif + -+ dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32); + + DWC_DEBUGPL(DBG_CIL, "%s() gintmsk=%0x\n", __func__, -+ dwc_read_reg32(&global_regs->gintmsk)); ++ DWC_READ_REG32(&global_regs->gintmsk)); +} + +/** + * This function initializes the DWC_otg controller registers for + * device mode. -+ * ++ * + * @param core_if Programming view of DWC_otg controller + * + */ @@ -41524,23 +50923,38 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_dev_if_t *dev_if = core_if->dev_if; + dwc_otg_core_params_t *params = core_if->core_params; + dcfg_data_t dcfg = {.d32 = 0 }; ++ depctl_data_t diepctl = {.d32 = 0 }; + grstctl_t resetctl = {.d32 = 0 }; + uint32_t rx_fifo_size; + fifosize_data_t nptxfifosize; + fifosize_data_t txfifosize; + dthrctl_data_t dthrctl; + fifosize_data_t ptxfifosize; ++ uint16_t rxfsiz, nptxfsiz; ++ gdfifocfg_data_t gdfifocfg = {.d32 = 0 }; ++ hwcfg3_data_t hwcfg3 = {.d32 = 0 }; + + /* Restart the Phy Clock */ -+ dwc_write_reg32(core_if->pcgcctl, 0); ++ DWC_WRITE_REG32(core_if->pcgcctl, 0); + + /* Device configuration register */ + init_devspd(core_if); -+ dcfg.d32 = dwc_read_reg32(&dev_if->dev_global_regs->dcfg); ++ dcfg.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dcfg); + dcfg.b.descdma = (core_if->dma_desc_enable) ? 1 : 0; + dcfg.b.perfrint = DWC_DCFG_FRAME_INTERVAL_80; ++ /* Enable Device OUT NAK in case of DDMA mode*/ ++ if (core_if->core_params->dev_out_nak) { ++ dcfg.b.endevoutnak = 1; ++ } + -+ dwc_write_reg32(&dev_if->dev_global_regs->dcfg, dcfg.d32); ++ if (core_if->core_params->cont_on_bna) { ++ dctl_data_t dctl = {.d32 = 0 }; ++ dctl.b.encontonbna = 1; ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ } ++ ++ ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dcfg, dcfg.d32); + + /* Configure data FIFO sizes */ + if (core_if->hwcfg2.b.dynamic_fifo && params->enable_dynamic_fifo) { @@ -41553,17 +50967,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + /* Rx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial grxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->grxfsiz)); ++ DWC_READ_REG32(&global_regs->grxfsiz)); + +#ifdef DWC_UTE_CFI -+ core_if->pwron_rxfsiz = dwc_read_reg32(&global_regs->grxfsiz); ++ core_if->pwron_rxfsiz = DWC_READ_REG32(&global_regs->grxfsiz); + core_if->init_rxfsiz = params->dev_rx_fifo_size; +#endif + rx_fifo_size = params->dev_rx_fifo_size; -+ dwc_write_reg32(&global_regs->grxfsiz, rx_fifo_size); ++ DWC_WRITE_REG32(&global_regs->grxfsiz, rx_fifo_size); + + DWC_DEBUGPL(DBG_CIL, "new grxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->grxfsiz)); ++ DWC_READ_REG32(&global_regs->grxfsiz)); + + /** Set Periodic Tx FIFO Mask all bits 0 */ + core_if->p_tx_msk = 0; @@ -41574,16 +50988,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (core_if->en_multiple_tx_fifo == 0) { + /* Non-periodic Tx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + + nptxfifosize.b.depth = params->dev_nperio_tx_fifo_size; + nptxfifosize.b.startaddr = params->dev_rx_fifo_size; + -+ dwc_write_reg32(&global_regs->gnptxfsiz, ++ DWC_WRITE_REG32(&global_regs->gnptxfsiz, + nptxfifosize.d32); + + DWC_DEBUGPL(DBG_CIL, "new gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + + /**@todo NGS: Fix Periodic FIFO Sizing! */ + /* @@ -41595,24 +51009,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /** @todo Finish debug of this */ + ptxfifosize.b.startaddr = + nptxfifosize.b.startaddr + nptxfifosize.b.depth; -+ for (i = 0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; -+ i++) { ++ for (i = 0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; i++) { + ptxfifosize.b.depth = + params->dev_perio_tx_fifo_size[i]; + DWC_DEBUGPL(DBG_CIL, -+ "initial dptxfsiz_dieptxf[%d]=%08x\n", -+ i, -+ dwc_read_reg32(&global_regs-> -+ dptxfsiz_dieptxf ++ "initial dtxfsiz[%d]=%08x\n", i, ++ DWC_READ_REG32(&global_regs->dtxfsiz + [i])); -+ dwc_write_reg32(&global_regs-> -+ dptxfsiz_dieptxf[i], ++ DWC_WRITE_REG32(&global_regs->dtxfsiz[i], + ptxfifosize.d32); -+ DWC_DEBUGPL(DBG_CIL, -+ "new dptxfsiz_dieptxf[%d]=%08x\n", ++ DWC_DEBUGPL(DBG_CIL, "new dtxfsiz[%d]=%08x\n", + i, -+ dwc_read_reg32(&global_regs-> -+ dptxfsiz_dieptxf ++ DWC_READ_REG32(&global_regs->dtxfsiz + [i])); + ptxfifosize.b.startaddr += ptxfifosize.b.depth; + } @@ -41621,27 +51029,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * Tx FIFOs These FIFOs are numbered from 1 to 15. + * Indexes of the FIFO size module parameters in the + * dev_tx_fifo_size array and the FIFO size registers in -+ * the dptxfsiz_dieptxf array run from 0 to 14. ++ * the dtxfsiz array run from 0 to 14. + */ + + /* Non-periodic Tx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + +#ifdef DWC_UTE_CFI + core_if->pwron_gnptxfsiz = -+ (dwc_read_reg32(&global_regs->gnptxfsiz) >> 16); ++ (DWC_READ_REG32(&global_regs->gnptxfsiz) >> 16); + core_if->init_gnptxfsiz = + params->dev_nperio_tx_fifo_size; +#endif + nptxfifosize.b.depth = params->dev_nperio_tx_fifo_size; + nptxfifosize.b.startaddr = params->dev_rx_fifo_size; + -+ dwc_write_reg32(&global_regs->gnptxfsiz, ++ DWC_WRITE_REG32(&global_regs->gnptxfsiz, + nptxfifosize.d32); + + DWC_DEBUGPL(DBG_CIL, "new gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + + txfifosize.b.startaddr = + nptxfifosize.b.startaddr + nptxfifosize.b.depth; @@ -41652,69 +51060,102 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + params->dev_tx_fifo_size[i]; + + DWC_DEBUGPL(DBG_CIL, -+ "initial dptxfsiz_dieptxf[%d]=%08x\n", ++ "initial dtxfsiz[%d]=%08x\n", + i, -+ dwc_read_reg32(&global_regs-> -+ dptxfsiz_dieptxf ++ DWC_READ_REG32(&global_regs->dtxfsiz + [i])); + +#ifdef DWC_UTE_CFI + core_if->pwron_txfsiz[i] = -+ (dwc_read_reg32 -+ (&global_regs->dptxfsiz_dieptxf[i]) >> 16); ++ (DWC_READ_REG32 ++ (&global_regs->dtxfsiz[i]) >> 16); + core_if->init_txfsiz[i] = + params->dev_tx_fifo_size[i]; +#endif -+ dwc_write_reg32(&global_regs-> -+ dptxfsiz_dieptxf[i], ++ DWC_WRITE_REG32(&global_regs->dtxfsiz[i], + txfifosize.d32); + + DWC_DEBUGPL(DBG_CIL, -+ "new dptxfsiz_dieptxf[%d]=%08x\n", ++ "new dtxfsiz[%d]=%08x\n", + i, -+ dwc_read_reg32(&global_regs-> -+ dptxfsiz_dieptxf ++ DWC_READ_REG32(&global_regs->dtxfsiz + [i])); + + txfifosize.b.startaddr += txfifosize.b.depth; + } ++ if (core_if->snpsid <= OTG_CORE_REV_2_94a) { ++ /* Calculating DFIFOCFG for Device mode to include RxFIFO and NPTXFIFO */ ++ gdfifocfg.d32 = DWC_READ_REG32(&global_regs->gdfifocfg); ++ hwcfg3.d32 = DWC_READ_REG32(&global_regs->ghwcfg3); ++ gdfifocfg.b.gdfifocfg = (DWC_READ_REG32(&global_regs->ghwcfg3) >> 16); ++ DWC_WRITE_REG32(&global_regs->gdfifocfg, gdfifocfg.d32); ++ rxfsiz = (DWC_READ_REG32(&global_regs->grxfsiz) & 0x0000ffff); ++ nptxfsiz = (DWC_READ_REG32(&global_regs->gnptxfsiz) >> 16); ++ gdfifocfg.b.epinfobase = rxfsiz + nptxfsiz; ++ DWC_WRITE_REG32(&global_regs->gdfifocfg, gdfifocfg.d32); ++ } + } -+ } -+ /* Flush the FIFOs */ -+ dwc_otg_flush_tx_fifo(core_if, 0x10); /* all Tx FIFOs */ -+ dwc_otg_flush_rx_fifo(core_if); + -+ /* Flush the Learning Queue. */ -+ resetctl.b.intknqflsh = 1; -+ dwc_write_reg32(&core_if->core_global_regs->grstctl, resetctl.d32); ++ /* Flush the FIFOs */ ++ dwc_otg_flush_tx_fifo(core_if, 0x10); /* all Tx FIFOs */ ++ dwc_otg_flush_rx_fifo(core_if); + -+ /* Clear all pending Device Interrupts */ -+ /** @todo - if the condition needed to be checked -+ * or in any case all pending interrutps should be cleared? -+ */ -+ if (core_if->multiproc_int_enable) { -+ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { -+ dwc_write_reg32(&dev_if->dev_global_regs-> -+ diepeachintmsk[i], 0); ++ /* Flush the Learning Queue. */ ++ resetctl.b.intknqflsh = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->grstctl, resetctl.d32); ++ ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) { ++ core_if->start_predict = 0; ++ for (i = 0; i<= core_if->dev_if->num_in_eps; ++i) { ++ core_if->nextep_seq[i] = 0xff; // 0xff - EP not active ++ } ++ core_if->nextep_seq[0] = 0; ++ core_if->first_in_nextep_seq = 0; ++ diepctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[0]->diepctl); ++ diepctl.b.nextep = 0; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[0]->diepctl, diepctl.d32); ++ ++ /* Update IN Endpoint Mismatch Count by active IN NP EP count + 1 */ ++ dcfg.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dcfg); ++ dcfg.b.epmscnt = 2; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dcfg, dcfg.d32); ++ ++ DWC_DEBUGPL(DBG_CILV,"%s first_in_nextep_seq= %2d; nextep_seq[]:\n", ++ __func__, core_if->first_in_nextep_seq); ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_DEBUGPL(DBG_CILV, "%2d ", core_if->nextep_seq[i]); ++ } ++ DWC_DEBUGPL(DBG_CILV,"\n"); ++ } ++ ++ /* Clear all pending Device Interrupts */ ++ /** @todo - if the condition needed to be checked ++ * or in any case all pending interrutps should be cleared? ++ */ ++ if (core_if->multiproc_int_enable) { ++ for (i = 0; i < core_if->dev_if->num_in_eps; ++i) { ++ DWC_WRITE_REG32(&dev_if-> ++ dev_global_regs->diepeachintmsk[i], 0); ++ } + } + + for (i = 0; i < core_if->dev_if->num_out_eps; ++i) { -+ dwc_write_reg32(&dev_if->dev_global_regs-> -+ doepeachintmsk[i], 0); ++ DWC_WRITE_REG32(&dev_if-> ++ dev_global_regs->doepeachintmsk[i], 0); + } + -+ dwc_write_reg32(&dev_if->dev_global_regs->deachint, 0xFFFFFFFF); -+ dwc_write_reg32(&dev_if->dev_global_regs->deachintmsk, 0); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->deachint, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->deachintmsk, 0); + } else { -+ dwc_write_reg32(&dev_if->dev_global_regs->diepmsk, 0); -+ dwc_write_reg32(&dev_if->dev_global_regs->doepmsk, 0); -+ dwc_write_reg32(&dev_if->dev_global_regs->daint, 0xFFFFFFFF); -+ dwc_write_reg32(&dev_if->dev_global_regs->daintmsk, 0); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->diepmsk, 0); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->doepmsk, 0); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->daint, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->daintmsk, 0); + } + + for (i = 0; i <= dev_if->num_in_eps; i++) { + depctl_data_t depctl; -+ depctl.d32 = dwc_read_reg32(&dev_if->in_ep_regs[i]->diepctl); ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); + if (depctl.b.epena) { + depctl.d32 = 0; + depctl.b.epdis = 1; @@ -41723,29 +51164,55 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl.d32 = 0; + } + -+ dwc_write_reg32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32); + -+ dwc_write_reg32(&dev_if->in_ep_regs[i]->dieptsiz, 0); -+ dwc_write_reg32(&dev_if->in_ep_regs[i]->diepdma, 0); -+ dwc_write_reg32(&dev_if->in_ep_regs[i]->diepint, 0xFF); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->dieptsiz, 0); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepdma, 0); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepint, 0xFF); + } + + for (i = 0; i <= dev_if->num_out_eps; i++) { + depctl_data_t depctl; -+ depctl.d32 = dwc_read_reg32(&dev_if->out_ep_regs[i]->doepctl); ++ depctl.d32 = DWC_READ_REG32(&dev_if->out_ep_regs[i]->doepctl); + if (depctl.b.epena) { ++ dctl_data_t dctl = {.d32 = 0 }; ++ gintmsk_data_t gintsts = {.d32 = 0 }; ++ doepint_data_t doepint = {.d32 = 0 }; ++ dctl.b.sgoutnak = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ do { ++ dwc_udelay(10); ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ } while (!gintsts.b.goutnakeff); ++ gintsts.d32 = 0; ++ gintsts.b.goutnakeff = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[i]->doepctl, depctl.d32); ++ do { ++ dwc_udelay(10); ++ doepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[i]->doepint); ++ } while (!doepint.b.epdisabled); ++ ++ doepint.b.epdisabled = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[i]->doepint, doepint.d32); ++ ++ dctl.d32 = 0; ++ dctl.b.cgoutnak = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); + } else { + depctl.d32 = 0; + } + -+ dwc_write_reg32(&dev_if->out_ep_regs[i]->doepctl, depctl.d32); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doepctl, depctl.d32); + -+ dwc_write_reg32(&dev_if->out_ep_regs[i]->doeptsiz, 0); -+ dwc_write_reg32(&dev_if->out_ep_regs[i]->doepdma, 0); -+ dwc_write_reg32(&dev_if->out_ep_regs[i]->doepint, 0xFF); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doeptsiz, 0); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doepdma, 0); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doepint, 0xFF); + } + + if (core_if->en_multiple_tx_fifo && core_if->dma_enable) { @@ -41766,7 +51233,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dthrctl.b.rx_thr_len = dev_if->rx_thr_length; + dthrctl.b.ahb_thr_ratio = params->ahb_thr_ratio; + -+ dwc_write_reg32(&dev_if->dev_global_regs->dtknqr3_dthrctl, ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dtknqr3_dthrctl, + dthrctl.d32); + + DWC_DEBUGPL(DBG_CIL, @@ -41783,10 +51250,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + diepmsk_data_t msk = {.d32 = 0 }; + msk.b.txfifoundrn = 1; + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs-> + diepeachintmsk[0], msk.d32, msk.d32); + } else { -+ dwc_modify_reg32(&dev_if->dev_global_regs->diepmsk, ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->diepmsk, + msk.d32, msk.d32); + } + } @@ -41795,11 +51262,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Set NAK on Babble */ + dctl_data_t dctl = {.d32 = 0 }; + dctl.b.nakonbble = 1; -+ dwc_modify_reg32(&dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ } ++ ++ if (core_if->snpsid >= OTG_CORE_REV_2_94a) { ++ dctl_data_t dctl = {.d32 = 0 }; ++ dctl.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dctl); ++ dctl.b.sftdiscon = 0; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dctl, dctl.d32); + } +} + -+/** ++/** + * This function enables the Host mode interrupts. + * + * @param core_if Programming view of DWC_otg controller @@ -41812,10 +51286,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_DEBUGPL(DBG_CIL, "%s(%p)\n", __func__, core_if); + + /* Disable all interrupts. */ -+ dwc_write_reg32(&global_regs->gintmsk, 0); ++ DWC_WRITE_REG32(&global_regs->gintmsk, 0); + + /* Clear any pending interrupts. */ -+ dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&global_regs->gintsts, 0xFFFFFFFF); + + /* Enable the common interrupts */ + dwc_otg_enable_common_interrupts(core_if); @@ -41824,17 +51298,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * Enable host mode interrupts without disturbing common + * interrupts. + */ -+ -+ /* Do not need sof interrupt for Descriptor DMA*/ -+ if (!core_if->dma_desc_enable) -+ intr_mask.b.sofintr = 1; ++ ++ intr_mask.b.disconnect = 1; + intr_mask.b.portintr = 1; + intr_mask.b.hcintr = 1; + -+ dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32); +} + -+/** ++/** + * This function disables the Host Mode interrupts. + * + * @param core_if Programming view of DWC_otg controller @@ -41856,7 +51328,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + intr_mask.b.ptxfempty = 1; + intr_mask.b.nptxfempty = 1; + -+ dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, 0); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, intr_mask.d32, 0); +} + +/** @@ -41878,9 +51350,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hprt0_data_t hprt0 = {.d32 = 0 }; + fifosize_data_t nptxfifosize; + fifosize_data_t ptxfifosize; ++ uint16_t rxfsiz, nptxfsiz, hptxfsiz; ++ gdfifocfg_data_t gdfifocfg = {.d32 = 0 }; + int i; + hcchar_data_t hcchar; + hcfg_data_t hcfg; ++ hfir_data_t hfir; + dwc_otg_hc_regs_t *hc_regs; + int num_channels; + gotgctl_data_t gotgctl = {.d32 = 0 }; @@ -41888,38 +51363,52 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_DEBUGPL(DBG_CILV, "%s(%p)\n", __func__, core_if); + + /* Restart the Phy Clock */ -+ dwc_write_reg32(core_if->pcgcctl, 0); ++ DWC_WRITE_REG32(core_if->pcgcctl, 0); + + /* Initialize Host Configuration Register */ + init_fslspclksel(core_if); + if (core_if->core_params->speed == DWC_SPEED_PARAM_FULL) { -+ hcfg.d32 = dwc_read_reg32(&host_if->host_global_regs->hcfg); ++ hcfg.d32 = DWC_READ_REG32(&host_if->host_global_regs->hcfg); + hcfg.b.fslssupp = 1; -+ dwc_write_reg32(&host_if->host_global_regs->hcfg, hcfg.d32); -+ ++ DWC_WRITE_REG32(&host_if->host_global_regs->hcfg, hcfg.d32); ++ ++ } ++ ++ /* This bit allows dynamic reloading of the HFIR register ++ * during runtime. This bit needs to be programmed during ++ * initial configuration and its value must not be changed ++ * during runtime.*/ ++ if (core_if->core_params->reload_ctl == 1) { ++ hfir.d32 = DWC_READ_REG32(&host_if->host_global_regs->hfir); ++ hfir.b.hfirrldctrl = 1; ++ DWC_WRITE_REG32(&host_if->host_global_regs->hfir, hfir.d32); + } + + if (core_if->core_params->dma_desc_enable) { -+ uint8_t op_mode = core_if->hwcfg2.b.op_mode; -+ if (!(core_if->hwcfg4.b.desc_dma && (core_if->snpsid >= OTG_CORE_REV_2_90a) && -+ ((op_mode == DWC_HWCFG2_OP_MODE_HNP_SRP_CAPABLE_OTG) || -+ (op_mode == DWC_HWCFG2_OP_MODE_SRP_ONLY_CAPABLE_OTG) || -+ (op_mode == DWC_HWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE_OTG) || -+ (op_mode == DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST) || -+ (op_mode == DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST)))) { -+ -+ DWC_ERROR("Host can't operate in Descriptor DMA mode.\n" -+ "Either core version is below 2.90a or " -+ "GHWCFG2, GHWCFG4 registers' values do not allow Descriptor DMA in host mode.\n" -+ "To run the driver in Buffer DMA host mode set dma_desc_enable " -+ "module parameter to 0.\n"); -+ return; -+ } -+ hcfg.d32 = dwc_read_reg32(&host_if->host_global_regs->hcfg); ++ uint8_t op_mode = core_if->hwcfg2.b.op_mode; ++ if (! ++ (core_if->hwcfg4.b.desc_dma ++ && (core_if->snpsid >= OTG_CORE_REV_2_90a) ++ && ((op_mode == DWC_HWCFG2_OP_MODE_HNP_SRP_CAPABLE_OTG) ++ || (op_mode == DWC_HWCFG2_OP_MODE_SRP_ONLY_CAPABLE_OTG) ++ || (op_mode == ++ DWC_HWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE_OTG) ++ || (op_mode == DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST) ++ || (op_mode == ++ DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST)))) { ++ ++ DWC_ERROR("Host can't operate in Descriptor DMA mode.\n" ++ "Either core version is below 2.90a or " ++ "GHWCFG2, GHWCFG4 registers' values do not allow Descriptor DMA in host mode.\n" ++ "To run the driver in Buffer DMA host mode set dma_desc_enable " ++ "module parameter to 0.\n"); ++ return; ++ } ++ hcfg.d32 = DWC_READ_REG32(&host_if->host_global_regs->hcfg); + hcfg.b.descdma = 1; -+ dwc_write_reg32(&host_if->host_global_regs->hcfg, hcfg.d32); ++ DWC_WRITE_REG32(&host_if->host_global_regs->hcfg, hcfg.d32); + } -+ ++ + /* Configure data FIFO sizes */ + if (core_if->hwcfg2.b.dynamic_fifo && params->enable_dynamic_fifo) { + DWC_DEBUGPL(DBG_CIL, "Total FIFO Size=%d\n", @@ -41933,65 +51422,80 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + /* Rx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial grxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->grxfsiz)); -+ dwc_write_reg32(&global_regs->grxfsiz, ++ DWC_READ_REG32(&global_regs->grxfsiz)); ++ DWC_WRITE_REG32(&global_regs->grxfsiz, + params->host_rx_fifo_size); + DWC_DEBUGPL(DBG_CIL, "new grxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->grxfsiz)); ++ DWC_READ_REG32(&global_regs->grxfsiz)); + + /* Non-periodic Tx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + nptxfifosize.b.depth = params->host_nperio_tx_fifo_size; + nptxfifosize.b.startaddr = params->host_rx_fifo_size; -+ dwc_write_reg32(&global_regs->gnptxfsiz, nptxfifosize.d32); ++ DWC_WRITE_REG32(&global_regs->gnptxfsiz, nptxfifosize.d32); + DWC_DEBUGPL(DBG_CIL, "new gnptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->gnptxfsiz)); ++ DWC_READ_REG32(&global_regs->gnptxfsiz)); + + /* Periodic Tx FIFO */ + DWC_DEBUGPL(DBG_CIL, "initial hptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->hptxfsiz)); ++ DWC_READ_REG32(&global_regs->hptxfsiz)); + ptxfifosize.b.depth = params->host_perio_tx_fifo_size; + ptxfifosize.b.startaddr = + nptxfifosize.b.startaddr + nptxfifosize.b.depth; -+ dwc_write_reg32(&global_regs->hptxfsiz, ptxfifosize.d32); ++ DWC_WRITE_REG32(&global_regs->hptxfsiz, ptxfifosize.d32); + DWC_DEBUGPL(DBG_CIL, "new hptxfsiz=%08x\n", -+ dwc_read_reg32(&global_regs->hptxfsiz)); ++ DWC_READ_REG32(&global_regs->hptxfsiz)); ++ ++ if (core_if->en_multiple_tx_fifo ++ && core_if->snpsid <= OTG_CORE_REV_2_94a) { ++ /* Global DFIFOCFG calculation for Host mode - include RxFIFO, NPTXFIFO and HPTXFIFO */ ++ gdfifocfg.d32 = DWC_READ_REG32(&global_regs->gdfifocfg); ++ rxfsiz = (DWC_READ_REG32(&global_regs->grxfsiz) & 0x0000ffff); ++ nptxfsiz = (DWC_READ_REG32(&global_regs->gnptxfsiz) >> 16); ++ hptxfsiz = (DWC_READ_REG32(&global_regs->hptxfsiz) >> 16); ++ gdfifocfg.b.epinfobase = rxfsiz + nptxfsiz + hptxfsiz; ++ DWC_WRITE_REG32(&global_regs->gdfifocfg, gdfifocfg.d32); ++ } + } + ++ /* TODO - check this */ ++ /* Clear Host Set HNP Enable in the OTG Control Register */ ++ gotgctl.b.hstsethnpen = 1; ++ DWC_MODIFY_REG32(&global_regs->gotgctl, gotgctl.d32, 0); ++ /* Make sure the FIFOs are flushed. */ ++ dwc_otg_flush_tx_fifo(core_if, 0x10 /* all TX FIFOs */ ); ++ dwc_otg_flush_rx_fifo(core_if); ++ + /* Clear Host Set HNP Enable in the OTG Control Register */ + gotgctl.b.hstsethnpen = 1; -+ dwc_modify_reg32(&global_regs->gotgctl, gotgctl.d32, 0); ++ DWC_MODIFY_REG32(&global_regs->gotgctl, gotgctl.d32, 0); + -+ /* Make sure the FIFOs are flushed. */ -+ dwc_otg_flush_tx_fifo(core_if, 0x10 /* all Tx FIFOs */ ); -+ dwc_otg_flush_rx_fifo(core_if); -+ -+ if(!core_if->core_params->dma_desc_enable) { ++ if (!core_if->core_params->dma_desc_enable) { + /* Flush out any leftover queued requests. */ + num_channels = core_if->core_params->host_channels; -+ ++ + for (i = 0; i < num_channels; i++) { + hc_regs = core_if->host_if->hc_regs[i]; -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + } + + /* Halt all channels to put them into a known state. */ + for (i = 0; i < num_channels; i++) { + int count = 0; + hc_regs = core_if->host_if->hc_regs[i]; -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + DWC_DEBUGPL(DBG_HCDV, "%s: Halt channel %d regs %p\n", __func__, i, hc_regs); + do { -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (++count > 1000) { + DWC_ERROR + ("%s: Unable to clear halt on channel %d (timeout HCCHAR 0x%X @%p)\n", @@ -42002,7 +51506,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } while (hcchar.b.chen); + } + } -+ ++ + /* Turn on the vbus power. */ + DWC_PRINTF("Init: Port Power? op_state=%d\n", core_if->op_state); + if (core_if->op_state == A_HOST) { @@ -42010,7 +51514,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + DWC_PRINTF("Init: Power Port (%d)\n", hprt0.b.prtpwr); + if (hprt0.b.prtpwr == 0) { + hprt0.b.prtpwr = 1; -+ dwc_write_reg32(host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(host_if->hprt0, hprt0.d32); + } + } + @@ -42041,7 +51545,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Clear old interrupt conditions for this host channel. */ + hc_intr_mask.d32 = 0xFFFFFFFF; + hc_intr_mask.b.reserved14_31 = 0; -+ dwc_write_reg32(&hc_regs->hcint, hc_intr_mask.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hc_intr_mask.d32); + + /* Enable channel interrupts required for this transfer. */ + hc_intr_mask.d32 = 0; @@ -42051,10 +51555,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (!core_if->dma_desc_enable) + hc_intr_mask.b.ahberr = 1; + else { -+ if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) ++ if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) + hc_intr_mask.b.xfercompl = 1; + } -+ ++ + if (hc->error_state && !hc->do_split && + hc->ep_type != DWC_OTG_EP_TYPE_ISOC) { + hc_intr_mask.b.ack = 1; @@ -42130,15 +51634,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + break; + } + } -+ dwc_write_reg32(&hc_regs->hcintmsk, hc_intr_mask.d32); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, hc_intr_mask.d32); + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); -+ dwc_modify_reg32(&host_if->host_global_regs->haintmsk, 0, intr_enable); ++ DWC_MODIFY_REG32(&host_if->host_global_regs->haintmsk, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, 0, gintmsk.d32); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, 0, gintmsk.d32); + + /* + * Program the HCCHARn register with the endpoint characteristics for @@ -42152,16 +51656,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hcchar.b.eptype = hc->ep_type; + hcchar.b.mps = hc->max_packet; + -+ dwc_write_reg32(&host_if->hc_regs[hc_num]->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&host_if->hc_regs[hc_num]->hcchar, hcchar.d32); + -+ DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num); -+ DWC_DEBUGPL(DBG_HCDV, " Dev Addr: %d\n", hcchar.b.devaddr); -+ DWC_DEBUGPL(DBG_HCDV, " Ep Num: %d\n", hcchar.b.epnum); -+ DWC_DEBUGPL(DBG_HCDV, " Is In: %d\n", hcchar.b.epdir); -+ DWC_DEBUGPL(DBG_HCDV, " Is Low Speed: %d\n", hcchar.b.lspddev); -+ DWC_DEBUGPL(DBG_HCDV, " Ep Type: %d\n", hcchar.b.eptype); -+ DWC_DEBUGPL(DBG_HCDV, " Max Pkt: %d\n", hcchar.b.mps); -+ DWC_DEBUGPL(DBG_HCDV, " Multi Cnt: %d\n", hcchar.b.multicnt); ++ DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d, Dev Addr %d, EP #%d\n", ++ __func__, hc->hc_num, hcchar.b.devaddr, hcchar.b.epnum); ++ DWC_DEBUGPL(DBG_HCDV, " Is In %d, Is Low Speed %d, EP Type %d, " ++ "Max Pkt %d, Multi Cnt %d\n", ++ hcchar.b.epdir, hcchar.b.lspddev, hcchar.b.eptype, ++ hcchar.b.mps, hcchar.b.multicnt); + + /* + * Program the HCSPLIT register for SPLITs @@ -42175,15 +51677,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hcsplt.b.xactpos = hc->xact_pos; + hcsplt.b.hubaddr = hc->hub_addr; + hcsplt.b.prtaddr = hc->port_addr; -+ DWC_DEBUGPL(DBG_HCDV, " comp split %d\n", hc->complete_split); -+ DWC_DEBUGPL(DBG_HCDV, " xact pos %d\n", hc->xact_pos); -+ DWC_DEBUGPL(DBG_HCDV, " hub addr %d\n", hc->hub_addr); -+ DWC_DEBUGPL(DBG_HCDV, " port addr %d\n", hc->port_addr); -+ DWC_DEBUGPL(DBG_HCDV, " is_in %d\n", hc->ep_is_in); -+ DWC_DEBUGPL(DBG_HCDV, " Max Pkt: %d\n", hcchar.b.mps); -+ DWC_DEBUGPL(DBG_HCDV, " xferlen: %d\n", hc->xfer_len); ++ DWC_DEBUGPL(DBG_HCDV, "\t comp split %d\n", hc->complete_split); ++ DWC_DEBUGPL(DBG_HCDV, "\t xact pos %d\n", hc->xact_pos); ++ DWC_DEBUGPL(DBG_HCDV, "\t hub addr %d\n", hc->hub_addr); ++ DWC_DEBUGPL(DBG_HCDV, "\t port addr %d\n", hc->port_addr); ++ DWC_DEBUGPL(DBG_HCDV, "\t is_in %d\n", hc->ep_is_in); ++ DWC_DEBUGPL(DBG_HCDV, "\t Max Pkt: %d\n", hcchar.b.mps); ++ DWC_DEBUGPL(DBG_HCDV, "\t xferlen: %d\n", hc->xfer_len); + } -+ dwc_write_reg32(&host_if->hc_regs[hc_num]->hcsplt, hcsplt.d32); ++ DWC_WRITE_REG32(&host_if->hc_regs[hc_num]->hcsplt, hcsplt.d32); + +} + @@ -42224,7 +51726,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_core_global_regs_t *global_regs; + dwc_otg_host_global_regs_t *host_global_regs; + -+ DWC_DEBUGPL(DBG_HW2937, " dwc_otg_hc_halt(%d)\n", hc->hc_num); + hc_regs = core_if->host_if->hc_regs[hc->hc_num]; + global_regs = core_if->core_global_regs; + host_global_regs = core_if->host_if->host_global_regs; @@ -42243,14 +51744,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hcintmsk_data_t hcintmsk; + hcintmsk.d32 = 0; + hcintmsk.b.chhltd = 1; -+ dwc_write_reg32(&hc_regs->hcintmsk, hcintmsk.d32); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, hcintmsk.d32); + + /* + * Make sure no other interrupts besides halt are currently + * pending. Handling another interrupt could cause a crash due + * to the QTD and QH state. + */ -+ dwc_write_reg32(&hc_regs->hcint, ~hcintmsk.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, ~hcintmsk.d32); + + /* + * Make sure the halt status is set to URB_DEQUEUE or AHB_ERR @@ -42259,7 +51760,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + */ + hc->halt_status = halt_status; + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen == 0) { + /* + * The channel is either already halted or it hasn't @@ -42290,32 +51791,32 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return; + } + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); -+ ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); ++ + /* No need to set the bit in DDMA for disabling the channel */ -+ //TODO check it everywhere channel is disabled -+ if(!core_if->core_params->dma_desc_enable) ++ //TODO check it everywhere channel is disabled ++ if (!core_if->core_params->dma_desc_enable) + hcchar.b.chen = 1; + hcchar.b.chdis = 1; -+ ++ + if (!core_if->dma_enable) { + /* Check for space in the request queue to issue the halt. */ + if (hc->ep_type == DWC_OTG_EP_TYPE_CONTROL || + hc->ep_type == DWC_OTG_EP_TYPE_BULK) { -+ nptxsts.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ nptxsts.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + if (nptxsts.b.nptxqspcavail == 0) { + hcchar.b.chen = 0; + } + } else { + hptxsts.d32 = -+ dwc_read_reg32(&host_global_regs->hptxsts); ++ DWC_READ_REG32(&host_global_regs->hptxsts); + if ((hptxsts.b.ptxqspcavail == 0) + || (core_if->queuing_high_bandwidth)) { + hcchar.b.chen = 0; + } + } + } -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + + hc->halt_status = halt_status; + @@ -42353,8 +51854,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + * conditions. + */ + hc_regs = core_if->host_if->hc_regs[hc->hc_num]; -+ dwc_write_reg32(&hc_regs->hcintmsk, 0); -+ dwc_write_reg32(&hc_regs->hcint, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, 0); ++ DWC_WRITE_REG32(&hc_regs->hcint, 0xFFFFFFFF); +#ifdef DEBUG + DWC_TIMER_CANCEL(core_if->hc_xfer_timer[hc->hc_num]); +#endif @@ -42377,7 +51878,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hc->ep_type == DWC_OTG_EP_TYPE_ISOC) { + hfnum_data_t hfnum; + hfnum.d32 = -+ dwc_read_reg32(&core_if->host_if->host_global_regs->hfnum); ++ DWC_READ_REG32(&core_if->host_if->host_global_regs->hfnum); + + /* 1 if _next_ frame is odd, 0 if it's even */ + hcchar->b.oddfrm = (hfnum.b.frnum & 0x1) ? 0 : 1; @@ -42407,36 +51908,85 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +#ifdef DEBUG +void hc_xfer_timeout(void *ptr) +{ -+ hc_xfer_info_t *xfer_info = (hc_xfer_info_t *) ptr; -+ int hc_num = xfer_info->hc->hc_num; ++ hc_xfer_info_t *xfer_info = NULL; ++ int hc_num = 0; ++ ++ if (ptr) ++ xfer_info = (hc_xfer_info_t *) ptr; ++ ++ if (!xfer_info->hc) { ++ DWC_ERROR("xfer_info->hc = %p\n", xfer_info->hc); ++ return; ++ } ++ ++ hc_num = xfer_info->hc->hc_num; + DWC_WARN("%s: timeout on channel %d\n", __func__, hc_num); + DWC_WARN(" start_hcchar_val 0x%08x\n", + xfer_info->core_if->start_hcchar_val[hc_num]); +} +#endif + ++void ep_xfer_timeout(void *ptr) ++{ ++ ep_xfer_info_t *xfer_info = NULL; ++ int ep_num = 0; ++ dctl_data_t dctl = {.d32 = 0 }; ++ gintsts_data_t gintsts = {.d32 = 0 }; ++ gintmsk_data_t gintmsk = {.d32 = 0 }; ++ ++ if (ptr) ++ xfer_info = (ep_xfer_info_t *) ptr; ++ ++ if (!xfer_info->ep) { ++ DWC_ERROR("xfer_info->ep = %p\n", xfer_info->ep); ++ return; ++ } ++ ++ ep_num = xfer_info->ep->num; ++ DWC_WARN("%s: timeout on endpoit %d\n", __func__, ep_num); ++ /* Put the sate to 2 as it was time outed */ ++ xfer_info->state = 2; ++ ++ dctl.d32 = ++ DWC_READ_REG32(&xfer_info->core_if->dev_if->dev_global_regs->dctl); ++ gintsts.d32 = ++ DWC_READ_REG32(&xfer_info->core_if->core_global_regs->gintsts); ++ gintmsk.d32 = ++ DWC_READ_REG32(&xfer_info->core_if->core_global_regs->gintmsk); ++ ++ if (!gintmsk.b.goutnakeff) { ++ /* Unmask it */ ++ gintmsk.b.goutnakeff = 1; ++ DWC_WRITE_REG32(&xfer_info->core_if->core_global_regs->gintmsk, ++ gintmsk.d32); ++ ++ } ++ ++ if (!gintsts.b.goutnakeff) { ++ dctl.b.sgoutnak = 1; ++ } ++ DWC_WRITE_REG32(&xfer_info->core_if->dev_if->dev_global_regs->dctl, ++ dctl.d32); ++ ++} ++ +void set_pid_isoc(dwc_hc_t * hc) +{ + /* Set up the initial PID for the transfer. */ + if (hc->speed == DWC_OTG_EP_SPEED_HIGH) { + if (hc->ep_is_in) { + if (hc->multi_count == 1) { -+ hc->data_pid_start = -+ DWC_OTG_HC_PID_DATA0; ++ hc->data_pid_start = DWC_OTG_HC_PID_DATA0; + } else if (hc->multi_count == 2) { -+ hc->data_pid_start = -+ DWC_OTG_HC_PID_DATA1; ++ hc->data_pid_start = DWC_OTG_HC_PID_DATA1; + } else { -+ hc->data_pid_start = -+ DWC_OTG_HC_PID_DATA2; ++ hc->data_pid_start = DWC_OTG_HC_PID_DATA2; + } + } else { + if (hc->multi_count == 1) { -+ hc->data_pid_start = -+ DWC_OTG_HC_PID_DATA0; ++ hc->data_pid_start = DWC_OTG_HC_PID_DATA0; + } else { -+ hc->data_pid_start = -+ DWC_OTG_HC_PID_MDATA; ++ hc->data_pid_start = DWC_OTG_HC_PID_MDATA; + } + } + } else { @@ -42571,7 +52121,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hc->start_pkt_count = num_packets; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = hc->data_pid_start; -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + + DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num); + DWC_DEBUGPL(DBG_HCDV, " Xfer Size: %d\n", hctsiz.b.xfersize); @@ -42583,20 +52133,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (hc->align_buff) { + dma_addr = hc->align_buff; + } else { -+ dma_addr = (uint32_t)hc->xfer_buff; ++ dma_addr = ((unsigned long)hc->xfer_buff & 0xffffffff); + } -+ dwc_write_reg32(&hc_regs->hcdma, dma_addr); ++ DWC_WRITE_REG32(&hc_regs->hcdma, dma_addr); + } + + /* Start the split */ + if (hc->do_split) { + hcsplt_data_t hcsplt; -+ hcsplt.d32 = dwc_read_reg32(&hc_regs->hcsplt); ++ hcsplt.d32 = DWC_READ_REG32(&hc_regs->hcsplt); + hcsplt.b.spltena = 1; -+ dwc_write_reg32(&hc_regs->hcsplt, hcsplt.d32); ++ DWC_WRITE_REG32(&hc_regs->hcsplt, hcsplt.d32); + } + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.multicnt = hc->multi_count; + hc_set_even_odd_frame(core_if, hc, &hcchar); +#ifdef DEBUG @@ -42610,7 +52160,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Set host channel enable after all other setup is complete. */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + + hc->xfer_started = 1; + hc->requests++; @@ -42625,6 +52175,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hc->hc_num, core_if);//GRAYG + core_if->hc_xfer_info[hc->hc_num].core_if = core_if; + core_if->hc_xfer_info[hc->hc_num].hc = hc; ++ + /* Start a timer for this transfer. */ + DWC_TIMER_SCHEDULE(core_if->hc_xfer_timer[hc->hc_num], 10000); + } @@ -42632,7 +52183,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +} + +/** -+ * This function does the setup for a data transfer for a host channel ++ * This function does the setup for a data transfer for a host channel + * and starts the transfer in Descriptor DMA mode. + * + * Initializes HCTSIZ register. For a PING transfer the Do Ping bit is set. @@ -42647,40 +52198,40 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + */ +void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if, dwc_hc_t * hc) +{ -+ dwc_otg_hc_regs_t *hc_regs = core_if->host_if->hc_regs[hc->hc_num]; ++ dwc_otg_hc_regs_t *hc_regs = core_if->host_if->hc_regs[hc->hc_num]; + hcchar_data_t hcchar; + hctsiz_data_t hctsiz; -+ hcdma_data_t hcdma; -+ ++ hcdma_data_t hcdma; ++ + hctsiz.d32 = 0; + -+ if (hc->do_ping && !hc->ep_is_in) ++ if (hc->do_ping) + hctsiz.b_ddma.dopng = 1; + + if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) + set_pid_isoc(hc); -+ ++ + /* Packet Count and Xfer Size are not used in Descriptor DMA mode */ + hctsiz.b_ddma.pid = hc->data_pid_start; -+ hctsiz.b_ddma.ntd = hc->ntd - 1; /* 0 - 1 descriptor, 1 - 2 descriptors, etc. */ -+ hctsiz.b_ddma.schinfo = hc->schinfo; /* Non-zero only for high-speed interrupt endpoints */ -+ ++ hctsiz.b_ddma.ntd = hc->ntd - 1; /* 0 - 1 descriptor, 1 - 2 descriptors, etc. */ ++ hctsiz.b_ddma.schinfo = hc->schinfo; /* Non-zero only for high-speed interrupt endpoints */ ++ + DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num); + DWC_DEBUGPL(DBG_HCDV, " Start PID: %d\n", hctsiz.b.pid); -+ DWC_DEBUGPL(DBG_HCDV, " NTD: %d\n", hctsiz.b_ddma.ntd); ++ DWC_DEBUGPL(DBG_HCDV, " NTD: %d\n", hctsiz.b_ddma.ntd); + -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + + hcdma.d32 = 0; -+ hcdma.b.dma_addr = ((uint32_t)hc->desc_list_addr) >> 11; -+ ++ hcdma.b.dma_addr = ((uint32_t) hc->desc_list_addr) >> 11; ++ + /* Always start from first descriptor. */ + hcdma.b.ctd = 0; -+ dwc_write_reg32(&hc_regs->hcdma, hcdma.d32); ++ DWC_WRITE_REG32(&hc_regs->hcdma, hcdma.d32); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.multicnt = hc->multi_count; -+ ++ +#ifdef DEBUG + core_if->start_hcchar_val[hc->hc_num] = hcchar.d32; + if (hcchar.b.chdis) { @@ -42692,14 +52243,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Set host channel enable after all other setup is complete. */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; -+ -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + + hc->xfer_started = 1; + hc->requests++; -+ ++ +#ifdef DEBUG -+ if ((hc->ep_type != DWC_OTG_EP_TYPE_INTR) && (hc->ep_type != DWC_OTG_EP_TYPE_ISOC)) { ++ if ((hc->ep_type != DWC_OTG_EP_TYPE_INTR) ++ && (hc->ep_type != DWC_OTG_EP_TYPE_ISOC)) { + DWC_DEBUGPL(DBG_HCDV, "DMA transfer %d from core_if %p\n", + hc->hc_num, core_if);//GRAYG + core_if->hc_xfer_info[hc->hc_num].core_if = core_if; @@ -42707,11 +52259,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Start a timer for this transfer. */ + DWC_TIMER_SCHEDULE(core_if->hc_xfer_timer[hc->hc_num], 10000); + } -+ +#endif -+ ++ +} -+ ++ +/** + * This function continues a data transfer that was started by previous call + * to dwc_otg_hc_start_transfer. The caller must ensure there is @@ -42754,13 +52305,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_hc_regs_t *hc_regs = + core_if->host_if->hc_regs[hc->hc_num]; + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hc_set_even_odd_frame(core_if, hc, &hcchar); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + DWC_DEBUGPL(DBG_HCDV, " IN xfer: hcchar = 0x%08x\n", + hcchar.d32); -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + hc->requests++; + return 1; + } else { @@ -42771,7 +52322,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hcchar_data_t hcchar; + dwc_otg_hc_regs_t *hc_regs; + hc_regs = core_if->host_if->hc_regs[hc->hc_num]; -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hc_set_even_odd_frame(core_if, hc, &hcchar); + } + @@ -42800,12 +52351,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); +} + +/* @@ -42840,7 +52391,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if ((((unsigned long)data_buff) & 0x3) == 0) { + /* xfer_buff is DWORD aligned. */ + for (i = 0; i < dword_count; i++, data_buff++) { -+ dwc_write_reg32(data_fifo, *data_buff); ++ DWC_WRITE_REG32(data_fifo, *data_buff); + } + } else { + /* xfer_buff is not DWORD aligned. */ @@ -42849,7 +52400,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + data = + (data_buff[0] | data_buff[1] << 8 | data_buff[2] << + 16 | data_buff[3] << 24); -+ dwc_write_reg32(data_fifo, data); ++ DWC_WRITE_REG32(data_fifo, data); + } + } + @@ -42858,21 +52409,62 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +} + +/** -+ * Gets the current USB frame number. This is the frame number from the last -+ * SOF packet. ++ * Gets the current USB frame number. This is the frame number from the last ++ * SOF packet. + */ +uint32_t dwc_otg_get_frame_number(dwc_otg_core_if_t * core_if) +{ + dsts_data_t dsts; -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + + /* read current frame/microframe number from DSTS register */ + return dsts.b.soffn; +} + +/** -+ * This function reads a setup packet from the Rx FIFO into the destination -+ * buffer. This function is called from the Rx Status Queue Level (RxStsQLvl) ++ * Calculates and gets the frame Interval value of HFIR register according PHY ++ * type and speed.The application can modify a value of HFIR register only after ++ * the Port Enable bit of the Host Port Control and Status register ++ * (HPRT.PrtEnaPort) has been set. ++*/ ++ ++uint32_t calc_frame_interval(dwc_otg_core_if_t * core_if) ++{ ++ gusbcfg_data_t usbcfg; ++ hwcfg2_data_t hwcfg2; ++ hprt0_data_t hprt0; ++ int clock = 60; // default value ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); ++ hwcfg2.d32 = DWC_READ_REG32(&core_if->core_global_regs->ghwcfg2); ++ hprt0.d32 = DWC_READ_REG32(core_if->host_if->hprt0); ++ if (!usbcfg.b.physel && usbcfg.b.ulpi_utmi_sel && !usbcfg.b.phyif) ++ clock = 60; ++ if (usbcfg.b.physel && hwcfg2.b.fs_phy_type == 3) ++ clock = 48; ++ if (!usbcfg.b.phylpwrclksel && !usbcfg.b.physel && ++ !usbcfg.b.ulpi_utmi_sel && usbcfg.b.phyif) ++ clock = 30; ++ if (!usbcfg.b.phylpwrclksel && !usbcfg.b.physel && ++ !usbcfg.b.ulpi_utmi_sel && !usbcfg.b.phyif) ++ clock = 60; ++ if (usbcfg.b.phylpwrclksel && !usbcfg.b.physel && ++ !usbcfg.b.ulpi_utmi_sel && usbcfg.b.phyif) ++ clock = 48; ++ if (usbcfg.b.physel && !usbcfg.b.phyif && hwcfg2.b.fs_phy_type == 2) ++ clock = 48; ++ if (usbcfg.b.physel && hwcfg2.b.fs_phy_type == 1) ++ clock = 48; ++ if (hprt0.b.prtspd == 0) ++ /* High speed case */ ++ return 125 * clock; ++ else ++ /* FS/LS case */ ++ return 1000 * clock; ++} ++ ++/** ++ * This function reads a setup packet from the Rx FIFO into the destination ++ * buffer. This function is called from the Rx Status Queue Level (RxStsQLvl) + * Interrupt routine when a SETUP packet has been received in Slave mode. + * + * @param core_if Programming view of DWC_otg controller. @@ -42880,16 +52472,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + */ +void dwc_otg_read_setup_packet(dwc_otg_core_if_t * core_if, uint32_t * dest) +{ ++ device_grxsts_data_t status; + /* Get the 8 bytes of a setup transaction data */ + + /* Pop 2 DWORDS off the receive data FIFO into memory */ -+ dest[0] = dwc_read_reg32(core_if->data_fifo[0]); -+ dest[1] = dwc_read_reg32(core_if->data_fifo[0]); ++ dest[0] = DWC_READ_REG32(core_if->data_fifo[0]); ++ dest[1] = DWC_READ_REG32(core_if->data_fifo[0]); ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ status.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs->grxstsp); ++ DWC_DEBUGPL(DBG_ANY, ++ "EP:%d BCnt:%d " "pktsts:%x Frame:%d(0x%0x)\n", ++ status.b.epnum, status.b.bcnt, status.b.pktsts, ++ status.b.fn, status.b.fn); ++ } +} + +/** -+ * This function enables EP0 OUT to receive SETUP packets and configures EP0 -+ * IN for transmitting packets. It is normally called when the ++ * This function enables EP0 OUT to receive SETUP packets and configures EP0 ++ * IN for transmitting packets. It is normally called when the + * "Enumeration Done" interrupt occurs. + * + * @param core_if Programming view of DWC_otg controller. @@ -42903,10 +52504,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl_data_t doepctl; + dctl_data_t dctl = {.d32 = 0 }; + ++ ep->stp_rollover = 0; + /* Read the Device Status and Endpoint 0 Control registers */ -+ dsts.d32 = dwc_read_reg32(&dev_if->dev_global_regs->dsts); -+ diepctl.d32 = dwc_read_reg32(&dev_if->in_ep_regs[0]->diepctl); -+ doepctl.d32 = dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl); ++ dsts.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dsts); ++ diepctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[0]->diepctl); ++ doepctl.d32 = DWC_READ_REG32(&dev_if->out_ep_regs[0]->doepctl); + + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) { @@ -42920,28 +52522,30 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + break; + } + -+ dwc_write_reg32(&dev_if->in_ep_regs[0]->diepctl, diepctl.d32); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[0]->diepctl, diepctl.d32); + + /* Enable OUT EP for receive */ ++ if (core_if->snpsid <= OTG_CORE_REV_2_94a) { + doepctl.b.epena = 1; -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doepctl, doepctl.d32); -+ ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doepctl, doepctl.d32); ++ } +#ifdef VERBOSE + DWC_DEBUGPL(DBG_PCDV, "doepctl0=%0x\n", -+ dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl)); ++ DWC_READ_REG32(&dev_if->out_ep_regs[0]->doepctl)); + DWC_DEBUGPL(DBG_PCDV, "diepctl0=%0x\n", -+ dwc_read_reg32(&dev_if->in_ep_regs[0]->diepctl)); ++ DWC_READ_REG32(&dev_if->in_ep_regs[0]->diepctl)); +#endif + dctl.b.cgnpinnak = 1; + -+ dwc_modify_reg32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); + DWC_DEBUGPL(DBG_PCDV, "dctl=%0x\n", -+ dwc_read_reg32(&dev_if->dev_global_regs->dctl)); ++ DWC_READ_REG32(&dev_if->dev_global_regs->dctl)); ++ +} + +/** + * This function activates an EP. The Device EP control register for -+ * the EP is configured as defined in the ep structure. Note: This ++ * the EP is configured as defined in the ep structure. Note: This + * function is not used for EP0. + * + * @param core_if Programming view of DWC_otg controller. @@ -42953,10 +52557,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl_data_t depctl; + volatile uint32_t *addr; + daint_data_t daintmsk = {.d32 = 0 }; ++ dcfg_data_t dcfg; ++ uint8_t i; + + DWC_DEBUGPL(DBG_PCDV, "%s() EP%d-%s\n", __func__, ep->num, + (ep->is_in ? "IN" : "OUT")); + ++#ifdef DWC_UTE_PER_IO ++ ep->xiso_frame_num = 0xFFFFFFFF; ++ ep->xiso_active_xfers = 0; ++ ep->xiso_queued_xfers = 0; ++#endif + /* Read DEPCTLn register */ + if (ep->is_in == 1) { + addr = &dev_if->in_ep_regs[ep->num]->diepctl; @@ -42968,21 +52579,45 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + /* If the EP is already active don't change the EP Control + * register. */ -+ depctl.d32 = dwc_read_reg32(addr); ++ depctl.d32 = DWC_READ_REG32(addr); + if (!depctl.b.usbactep) { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + + if (ep->type == DWC_OTG_EP_TYPE_ISOC) { -+ depctl.b.setd0pid = 1; // ??? ++ depctl.b.setd0pid = 1; // ??? + } else { + depctl.b.setd0pid = 1; + } + depctl.b.usbactep = 1; + -+ dwc_write_reg32(addr, depctl.d32); -+ DWC_DEBUGPL(DBG_PCDV, "DEPCTL=%08x\n", dwc_read_reg32(addr)); ++ /* Update nextep_seq array and EPMSCNT in DCFG*/ ++ if (!(depctl.b.eptype & 1) && (ep->is_in == 1)) { // NP IN EP ++ for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { ++ if (core_if->nextep_seq[i] == core_if->first_in_nextep_seq) ++ break; ++ } ++ core_if->nextep_seq[i] = ep->num; ++ core_if->nextep_seq[ep->num] = core_if->first_in_nextep_seq; ++ depctl.b.nextep = core_if->nextep_seq[ep->num]; ++ dcfg.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dcfg); ++ dcfg.b.epmscnt++; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dcfg, dcfg.d32); ++ ++ DWC_DEBUGPL(DBG_PCDV, ++ "%s first_in_nextep_seq= %2d; nextep_seq[]:\n", ++ __func__, core_if->first_in_nextep_seq); ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_DEBUGPL(DBG_PCDV, "%2d\n", ++ core_if->nextep_seq[i]); ++ } ++ ++ } ++ ++ ++ DWC_WRITE_REG32(addr, depctl.d32); ++ DWC_DEBUGPL(DBG_PCDV, "DEPCTL=%08x\n", DWC_READ_REG32(addr)); + } + + /* Enable the Interrupt for this EP */ @@ -42994,17 +52629,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + diepmsk.b.epdisabled = 1; + diepmsk.b.ahberr = 1; + diepmsk.b.intknepmis = 1; ++ if (!core_if->en_multiple_tx_fifo && core_if->dma_enable) ++ diepmsk.b.intknepmis = 0; + diepmsk.b.txfifoundrn = 1; //????? ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ diepmsk.b.nak = 1; ++ } + ++ ++ ++/* + if (core_if->dma_desc_enable) { + diepmsk.b.bna = 1; + } ++*/ +/* -+ if(core_if->dma_enable) { ++ if (core_if->dma_enable) { + doepmsk.b.nak = 1; + } +*/ -+ dwc_write_reg32(&dev_if->dev_global_regs-> ++ DWC_WRITE_REG32(&dev_if->dev_global_regs-> + diepeachintmsk[ep->num], diepmsk.d32); + + } else { @@ -43012,35 +52656,52 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + doepmsk.b.xfercompl = 1; + doepmsk.b.ahberr = 1; + doepmsk.b.epdisabled = 1; ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) ++ doepmsk.b.outtknepdis = 1; ++ ++/* + + if (core_if->dma_desc_enable) { + doepmsk.b.bna = 1; + } ++*/ +/* + doepmsk.b.babble = 1; + doepmsk.b.nyet = 1; + doepmsk.b.nak = 1; +*/ -+ dwc_write_reg32(&dev_if->dev_global_regs-> ++ DWC_WRITE_REG32(&dev_if->dev_global_regs-> + doepeachintmsk[ep->num], doepmsk.d32); + } -+ dwc_modify_reg32(&dev_if->dev_global_regs->deachintmsk, ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->deachintmsk, + 0, daintmsk.d32); + } else { -+ dwc_modify_reg32(&dev_if->dev_global_regs->daintmsk, ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ if (ep->is_in) { ++ diepmsk_data_t diepmsk = {.d32 = 0 }; ++ diepmsk.b.nak = 1; ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->diepmsk, 0, diepmsk.d32); ++ } else { ++ doepmsk_data_t doepmsk = {.d32 = 0 }; ++ doepmsk.b.outtknepdis = 1; ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->doepmsk, 0, doepmsk.d32); ++ } ++ } ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->daintmsk, + 0, daintmsk.d32); + } + + DWC_DEBUGPL(DBG_PCDV, "DAINTMSK=%0x\n", -+ dwc_read_reg32(&dev_if->dev_global_regs->daintmsk)); ++ DWC_READ_REG32(&dev_if->dev_global_regs->daintmsk)); + + ep->stall_clear_flag = 0; ++ + return; +} + +/** -+ * This function deactivates an EP. This is done by clearing the USB Active -+ * EP bit in the Device EP control register. Note: This function is not used ++ * This function deactivates an EP. This is done by clearing the USB Active ++ * EP bit in the Device EP control register. Note: This function is not used + * for EP0. EP0 cannot be deactivated. + * + * @param core_if Programming view of DWC_otg controller. @@ -43051,6 +52712,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl_data_t depctl = {.d32 = 0 }; + volatile uint32_t *addr; + daint_data_t daintmsk = {.d32 = 0 }; ++ dcfg_data_t dcfg; ++ uint8_t i = 0; ++ ++#ifdef DWC_UTE_PER_IO ++ ep->xiso_frame_num = 0xFFFFFFFF; ++ ep->xiso_active_xfers = 0; ++ ep->xiso_queued_xfers = 0; ++#endif + + /* Read DEPCTLn register */ + if (ep->is_in == 1) { @@ -43061,31 +52730,128 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + daintmsk.ep.out = 1 << ep->num; + } + -+ depctl.d32 = dwc_read_reg32(addr); ++ depctl.d32 = DWC_READ_REG32(addr); + + depctl.b.usbactep = 0; ++ ++ /* Update nextep_seq array and EPMSCNT in DCFG*/ ++ if (!(depctl.b.eptype & 1) && ep->is_in == 1) { // NP EP IN ++ for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { ++ if (core_if->nextep_seq[i] == ep->num) ++ break; ++ } ++ core_if->nextep_seq[i] = core_if->nextep_seq[ep->num]; ++ if (core_if->first_in_nextep_seq == ep->num) ++ core_if->first_in_nextep_seq = i; ++ core_if->nextep_seq[ep->num] = 0xff; ++ depctl.b.nextep = 0; ++ dcfg.d32 = ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); ++ dcfg.b.epmscnt--; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, ++ dcfg.d32); ++ ++ DWC_DEBUGPL(DBG_PCDV, ++ "%s first_in_nextep_seq= %2d; nextep_seq[]:\n", ++ __func__, core_if->first_in_nextep_seq); ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_DEBUGPL(DBG_PCDV, "%2d\n", core_if->nextep_seq[i]); ++ } ++ } ++ ++ if (ep->is_in == 1) ++ depctl.b.txfnum = 0; + + if (core_if->dma_desc_enable) + depctl.b.epdis = 1; + -+ dwc_write_reg32(addr, depctl.d32); ++ DWC_WRITE_REG32(addr, depctl.d32); ++ depctl.d32 = DWC_READ_REG32(addr); ++ if (core_if->dma_enable && ep->type == DWC_OTG_EP_TYPE_ISOC ++ && depctl.b.epena) { ++ depctl_data_t depctl = {.d32 = 0}; ++ if (ep->is_in) { ++ diepint_data_t diepint = {.d32 = 0}; ++ ++ depctl.b.snak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ diepctl, depctl.d32); ++ do { ++ dwc_udelay(10); ++ diepint.d32 = ++ DWC_READ_REG32(&core_if-> ++ dev_if->in_ep_regs[ep->num]-> ++ diepint); ++ } while (!diepint.b.inepnakeff); ++ diepint.b.inepnakeff = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ diepint, diepint.d32); ++ depctl.d32 = 0; ++ depctl.b.epdis = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ diepctl, depctl.d32); ++ do { ++ dwc_udelay(10); ++ diepint.d32 = ++ DWC_READ_REG32(&core_if-> ++ dev_if->in_ep_regs[ep->num]-> ++ diepint); ++ } while (!diepint.b.epdisabled); ++ diepint.b.epdisabled = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ diepint, diepint.d32); ++ } else { ++ dctl_data_t dctl = {.d32 = 0}; ++ gintmsk_data_t gintsts = {.d32 = 0}; ++ doepint_data_t doepint = {.d32 = 0}; ++ dctl.b.sgoutnak = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> ++ dctl, 0, dctl.d32); ++ do { ++ dwc_udelay(10); ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ } while (!gintsts.b.goutnakeff); ++ gintsts.d32 = 0; ++ gintsts.b.goutnakeff = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ ++ depctl.d32 = 0; ++ depctl.b.epdis = 1; ++ depctl.b.snak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[ep->num]->doepctl, depctl.d32); ++ do ++ { ++ dwc_udelay(10); ++ doepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->num]->doepint); ++ } while (!doepint.b.epdisabled); ++ ++ doepint.b.epdisabled = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[ep->num]->doepint, doepint.d32); ++ ++ dctl.d32 = 0; ++ dctl.b.cgoutnak = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ } ++ } + + /* Disable the Interrupt for this EP */ + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->deachintmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->deachintmsk, + daintmsk.d32, 0); + + if (ep->is_in == 1) { -+ dwc_write_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs-> + diepeachintmsk[ep->num], 0); + } else { -+ dwc_write_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs-> + doepeachintmsk[ep->num], 0); + } + } else { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->daintmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->daintmsk, + daintmsk.d32, 0); + } ++ +} + +/** @@ -43100,28 +52866,51 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + uint32_t offset; + uint32_t xfer_est; + int i; ++ unsigned maxxfer_local, total_len; ++ ++ if (!ep->is_in && ep->type == DWC_OTG_EP_TYPE_INTR && ++ (ep->maxpacket%4)) { ++ maxxfer_local = ep->maxpacket; ++ total_len = ep->xfer_len; ++ } else { ++ maxxfer_local = ep->maxxfer; ++ total_len = ep->total_len; ++ } ++ ++ ep->desc_cnt = (total_len / maxxfer_local) + ++ ((total_len % maxxfer_local) ? 1 : 0); + -+ ep->desc_cnt = (ep->total_len / ep->maxxfer) + -+ ((ep->total_len % ep->maxxfer) ? 1 : 0); + if (!ep->desc_cnt) + ep->desc_cnt = 1; + ++ if (ep->desc_cnt > MAX_DMA_DESC_CNT) ++ ep->desc_cnt = MAX_DMA_DESC_CNT; ++ + dma_desc = ep->desc_addr; -+ xfer_est = ep->total_len; ++ if (maxxfer_local == ep->maxpacket) { ++ if ((total_len % maxxfer_local) && ++ (total_len/maxxfer_local < MAX_DMA_DESC_CNT)) { ++ xfer_est = (ep->desc_cnt - 1) * maxxfer_local + ++ (total_len % maxxfer_local); ++ } else ++ xfer_est = ep->desc_cnt * maxxfer_local; ++ } else ++ xfer_est = total_len; + offset = 0; + for (i = 0; i < ep->desc_cnt; ++i) { + /** DMA Descriptor Setup */ -+ if (xfer_est > ep->maxxfer) { ++ if (xfer_est > maxxfer_local) { + dma_desc->status.b.bs = BS_HOST_BUSY; + dma_desc->status.b.l = 0; + dma_desc->status.b.ioc = 0; + dma_desc->status.b.sp = 0; -+ dma_desc->status.b.bytes = ep->maxxfer; ++ dma_desc->status.b.bytes = maxxfer_local; + dma_desc->buf = ep->dma_addr + offset; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + -+ xfer_est -= ep->maxxfer; -+ offset += ep->maxxfer; ++ xfer_est -= maxxfer_local; ++ offset += maxxfer_local; + } else { + dma_desc->status.b.bs = BS_HOST_BUSY; + dma_desc->status.b.l = 1; @@ -43133,20 +52922,75 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + sent_zlp) ? 1 : 0); + dma_desc->status.b.bytes = xfer_est; + } else { -+ dma_desc->status.b.bytes = -+ xfer_est + ((4 - (xfer_est & 0x3)) & 0x3); ++ if (maxxfer_local == ep->maxpacket) ++ dma_desc->status.b.bytes = xfer_est; ++ else ++ dma_desc->status.b.bytes = ++ xfer_est + ((4 - (xfer_est & 0x3)) & 0x3); + } + + dma_desc->buf = ep->dma_addr + offset; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + } + dma_desc++; + } +} ++/** ++ * This function is called when to write ISOC data into appropriate dedicated ++ * periodic FIFO. ++ */ ++static int32_t write_isoc_tx_fifo(dwc_otg_core_if_t * core_if, dwc_ep_t * dwc_ep) ++{ ++ dwc_otg_dev_if_t *dev_if = core_if->dev_if; ++ dwc_otg_dev_in_ep_regs_t *ep_regs; ++ dtxfsts_data_t txstatus = {.d32 = 0 }; ++ uint32_t len = 0; ++ int epnum = dwc_ep->num; ++ int dwords; + ++ DWC_DEBUGPL(DBG_PCD, "Dedicated TxFifo Empty: %d \n", epnum); ++ ++ ep_regs = core_if->dev_if->in_ep_regs[epnum]; ++ ++ len = dwc_ep->xfer_len - dwc_ep->xfer_count; ++ ++ if (len > dwc_ep->maxpacket) { ++ len = dwc_ep->maxpacket; ++ } ++ ++ dwords = (len + 3) / 4; ++ ++ /* While there is space in the queue and space in the FIFO and ++ * More data to tranfer, Write packets to the Tx FIFO */ ++ txstatus.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts); ++ DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n", epnum, txstatus.d32); ++ ++ while (txstatus.b.txfspcavail > dwords && ++ dwc_ep->xfer_count < dwc_ep->xfer_len && dwc_ep->xfer_len != 0) { ++ /* Write the FIFO */ ++ dwc_otg_ep_write_packet(core_if, dwc_ep, 0); ++ ++ len = dwc_ep->xfer_len - dwc_ep->xfer_count; ++ if (len > dwc_ep->maxpacket) { ++ len = dwc_ep->maxpacket; ++ } ++ ++ dwords = (len + 3) / 4; ++ txstatus.d32 = ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts); ++ DWC_DEBUGPL(DBG_PCDV, "dtxfsts[%d]=0x%08x\n", epnum, ++ txstatus.d32); ++ } ++ ++ DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n", epnum, ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts)); ++ ++ return 1; ++} +/** + * This function does the setup for a data transfer for an EP and -+ * starts the transfer. For an IN transfer, the packets will be ++ * starts the transfer. For an IN transfer, the packets will be + * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers, + * the packets are unloaded from the Rx FIFO in the ISR. the ISR. + * @@ -43174,21 +53018,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + gnptxsts_data_t gtxstatus; + + gtxstatus.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->gnptxsts); ++ DWC_READ_REG32(&core_if->core_global_regs->gnptxsts); + + if (core_if->en_multiple_tx_fifo == 0 -+ && gtxstatus.b.nptxqspcavail == 0) { ++ && gtxstatus.b.nptxqspcavail == 0 && !core_if->dma_enable) { +#ifdef DEBUG + DWC_PRINTF("TX Queue Full (0x%0x)\n", gtxstatus.d32); +#endif + return; + } + -+ depctl.d32 = dwc_read_reg32(&(in_regs->diepctl)); -+ deptsiz.d32 = dwc_read_reg32(&(in_regs->dieptsiz)); ++ depctl.d32 = DWC_READ_REG32(&(in_regs->diepctl)); ++ deptsiz.d32 = DWC_READ_REG32(&(in_regs->dieptsiz)); ++ ++ if (ep->maxpacket > ep->maxxfer / MAX_PKT_CNT) ++ ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ? ++ ep->maxxfer : (ep->total_len - ep->xfer_len); ++ else ++ ep->xfer_len += (MAX_PKT_CNT * ep->maxpacket < (ep->total_len - ep->xfer_len)) ? ++ MAX_PKT_CNT * ep->maxpacket : (ep->total_len - ep->xfer_len); + -+ ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ? -+ ep->maxxfer : (ep->total_len - ep->xfer_len); + + /* Zero Length Packet? */ + if ((ep->xfer_len - ep->xfer_count) == 0) { @@ -43198,93 +53047,120 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len - ep->xfer_count; + deptsiz.b.pktcnt = + (ep->xfer_len - ep->xfer_count - 1 + + ep->maxpacket) / ep->maxpacket; ++ if (deptsiz.b.pktcnt > MAX_PKT_CNT) { ++ deptsiz.b.pktcnt = MAX_PKT_CNT; ++ deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; ++ } ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) ++ deptsiz.b.mc = deptsiz.b.pktcnt; + } + + /* Write the DMA register */ + if (core_if->dma_enable) { + if (core_if->dma_desc_enable == 0) { -+ dwc_write_reg32(&in_regs->dieptsiz, ++ if (ep->type != DWC_OTG_EP_TYPE_ISOC) ++ deptsiz.b.mc = 1; ++ DWC_WRITE_REG32(&in_regs->dieptsiz, + deptsiz.d32); -+ dwc_write_reg32(&(in_regs->diepdma), ++ DWC_WRITE_REG32(&(in_regs->diepdma), + (uint32_t) ep->dma_addr); + } else { +#ifdef DWC_UTE_CFI + /* The descriptor chain should be already initialized by now */ + if (ep->buff_mode != BM_STANDARD) { -+ dwc_write_reg32(&in_regs->diepdma, ++ DWC_WRITE_REG32(&in_regs->diepdma, + ep->descs_dma_addr); + } else { +#endif -+ init_dma_desc_chain(core_if, ep); ++ init_dma_desc_chain(core_if, ep); + /** DIEPDMAn Register write */ -+ dwc_write_reg32(&in_regs->diepdma, -+ ep->dma_desc_addr); ++ DWC_WRITE_REG32(&in_regs->diepdma, ++ ep->dma_desc_addr); +#ifdef DWC_UTE_CFI -+ } ++ } +#endif + } + } else { -+ dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&in_regs->dieptsiz, deptsiz.d32); + if (ep->type != DWC_OTG_EP_TYPE_ISOC) { -+ /** ++ /** + * Enable the Non-Periodic Tx FIFO empty interrupt, + * or the Tx FIFO epmty interrupt in dedicated Tx FIFO mode, + * the data will be written into the fifo by the ISR. + */ + if (core_if->en_multiple_tx_fifo == 0) { + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if-> -+ core_global_regs-> -+ gintmsk, intr_mask.d32, -+ intr_mask.d32); ++ DWC_MODIFY_REG32 ++ (&core_if->core_global_regs->gintmsk, ++ intr_mask.d32, intr_mask.d32); + } else { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) { + uint32_t fifoemptymsk = 0; + fifoemptymsk = 1 << ep->num; -+ dwc_modify_reg32(&core_if-> -+ dev_if-> -+ dev_global_regs-> -+ dtknqr4_fifoemptymsk, -+ 0, -+ fifoemptymsk); ++ DWC_MODIFY_REG32 ++ (&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk, ++ 0, fifoemptymsk); + + } + } ++ } else { ++ write_isoc_tx_fifo(core_if, ep); ++ } ++ } ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) ++ depctl.b.nextep = core_if->nextep_seq[ep->num]; ++ ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ dsts_data_t dsts = {.d32 = 0}; ++ if (ep->bInterval == 1) { ++ dsts.d32 = ++ DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->dsts); ++ ep->frame_num = dsts.b.soffn + ep->bInterval; ++ if (ep->frame_num > 0x3FFF) { ++ ep->frm_overrun = 1; ++ ep->frame_num &= 0x3FFF; ++ } else ++ ep->frm_overrun = 0; ++ if (ep->frame_num & 0x1) { ++ depctl.b.setd1pid = 1; ++ } else { ++ depctl.b.setd0pid = 1; ++ } + } + } -+ + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&in_regs->diepctl, depctl.d32); -+ -+ depctl.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl); -+ depctl.b.nextep = ep->num; -+ dwc_write_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl, -+ depctl.d32); ++ DWC_WRITE_REG32(&in_regs->diepctl, depctl.d32); + + } else { + /* OUT endpoint */ + dwc_otg_dev_out_ep_regs_t *out_regs = + core_if->dev_if->out_ep_regs[ep->num]; + -+ depctl.d32 = dwc_read_reg32(&(out_regs->doepctl)); -+ deptsiz.d32 = dwc_read_reg32(&(out_regs->doeptsiz)); ++ depctl.d32 = DWC_READ_REG32(&(out_regs->doepctl)); ++ deptsiz.d32 = DWC_READ_REG32(&(out_regs->doeptsiz)); + -+ ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ? -+ ep->maxxfer : (ep->total_len - ep->xfer_len); ++ if (!core_if->dma_desc_enable) { ++ if (ep->maxpacket > ep->maxxfer / MAX_PKT_CNT) ++ ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ? ++ ep->maxxfer : (ep->total_len - ep->xfer_len); ++ else ++ ep->xfer_len += (MAX_PKT_CNT * ep->maxpacket < (ep->total_len ++ - ep->xfer_len)) ? MAX_PKT_CNT * ep->maxpacket : (ep->total_len - ep->xfer_len); ++ } + + /* Program the transfer size and packet count as follows: -+ * -+ * pktcnt = N ++ * ++ * pktcnt = N + * xfersize = N * maxpacket + */ + if ((ep->xfer_len - ep->xfer_count) == 0) { @@ -43295,8 +53171,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + deptsiz.b.pktcnt = + (ep->xfer_len - ep->xfer_count + + (ep->maxpacket - 1)) / ep->maxpacket; -+ ep->xfer_len = -+ deptsiz.b.pktcnt * ep->maxpacket + ep->xfer_count; ++ if (deptsiz.b.pktcnt > MAX_PKT_CNT) { ++ deptsiz.b.pktcnt = MAX_PKT_CNT; ++ } ++ if (!core_if->dma_desc_enable) { ++ ep->xfer_len = ++ deptsiz.b.pktcnt * ep->maxpacket + ep->xfer_count; ++ } + deptsiz.b.xfersize = ep->xfer_len - ep->xfer_count; + } + @@ -43305,47 +53186,96 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + if (core_if->dma_enable) { + if (!core_if->dma_desc_enable) { -+ dwc_write_reg32(&out_regs->doeptsiz, ++ DWC_WRITE_REG32(&out_regs->doeptsiz, + deptsiz.d32); + -+ dwc_write_reg32(&(out_regs->doepdma), ++ DWC_WRITE_REG32(&(out_regs->doepdma), + (uint32_t) ep->dma_addr); + } else { +#ifdef DWC_UTE_CFI + /* The descriptor chain should be already initialized by now */ + if (ep->buff_mode != BM_STANDARD) { -+ dwc_write_reg32(&out_regs->doepdma, ++ DWC_WRITE_REG32(&out_regs->doepdma, + ep->descs_dma_addr); + } else { +#endif ++ /** This is used for interrupt out transfers*/ ++ if (!ep->xfer_len) ++ ep->xfer_len = ep->total_len; ++ init_dma_desc_chain(core_if, ep); + -+ init_dma_desc_chain(core_if, ep); -+ ++ if (core_if->core_params->dev_out_nak) { ++ if (ep->type == DWC_OTG_EP_TYPE_BULK) { ++ deptsiz.b.pktcnt = (ep->total_len + ++ (ep->maxpacket - 1)) / ep->maxpacket; ++ deptsiz.b.xfersize = ep->total_len; ++ /* Remember initial value of doeptsiz */ ++ core_if->start_doeptsiz_val[ep->num] = deptsiz.d32; ++ DWC_WRITE_REG32(&out_regs->doeptsiz, ++ deptsiz.d32); ++ } ++ } + /** DOEPDMAn Register write */ -+ dwc_write_reg32(&out_regs->doepdma, -+ ep->dma_desc_addr); ++ DWC_WRITE_REG32(&out_regs->doepdma, ++ ep->dma_desc_addr); +#ifdef DWC_UTE_CFI + } +#endif + } + } else { -+ dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&out_regs->doeptsiz, deptsiz.d32); ++ } ++ ++ if (ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ dsts_data_t dsts = {.d32 = 0}; ++ if (ep->bInterval == 1) { ++ dsts.d32 = ++ DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->dsts); ++ ep->frame_num = dsts.b.soffn + ep->bInterval; ++ if (ep->frame_num > 0x3FFF) { ++ ep->frm_overrun = 1; ++ ep->frame_num &= 0x3FFF; ++ } else ++ ep->frm_overrun = 0; ++ ++ if (ep->frame_num & 0x1) { ++ depctl.b.setd1pid = 1; ++ } else { ++ depctl.b.setd0pid = 1; ++ } ++ } + } + + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + -+ dwc_write_reg32(&out_regs->doepctl, depctl.d32); ++ DWC_WRITE_REG32(&out_regs->doepctl, depctl.d32); + + DWC_DEBUGPL(DBG_PCD, "DOEPCTL=%08x DOEPTSIZ=%08x\n", -+ dwc_read_reg32(&out_regs->doepctl), -+ dwc_read_reg32(&out_regs->doeptsiz)); ++ DWC_READ_REG32(&out_regs->doepctl), ++ DWC_READ_REG32(&out_regs->doeptsiz)); + DWC_DEBUGPL(DBG_PCD, "DAINTMSK=%08x GINTMSK=%08x\n", -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs-> + daintmsk), -+ dwc_read_reg32(&core_if->core_global_regs-> ++ DWC_READ_REG32(&core_if->core_global_regs-> + gintmsk)); ++ ++ /* Timer is scheduling only for out bulk transfers for ++ * "Device DDMA OUT NAK Enhancement" feature to inform user ++ * about received data payload in case of timeout ++ */ ++ if (core_if->core_params->dev_out_nak) { ++ if (ep->type == DWC_OTG_EP_TYPE_BULK) { ++ core_if->ep_xfer_info[ep->num].core_if = core_if; ++ core_if->ep_xfer_info[ep->num].ep = ep; ++ core_if->ep_xfer_info[ep->num].state = 1; ++ ++ /* Start a timer for this transfer. */ ++ DWC_TIMER_SCHEDULE(core_if->ep_xfer_timer[ep->num], 10000); ++ } ++ } + } +} + @@ -43372,8 +53302,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_dev_in_ep_regs_t *in_regs = + core_if->dev_if->in_ep_regs[ep->num]; + -+ depctl.d32 = dwc_read_reg32(&(in_regs->diepctl)); -+ deptsiz.d32 = dwc_read_reg32(&(in_regs->dieptsiz)); ++ depctl.d32 = DWC_READ_REG32(&(in_regs->diepctl)); ++ deptsiz.d32 = DWC_READ_REG32(&(in_regs->dieptsiz)); + + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; @@ -43381,54 +53311,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Write the DMA register */ + if (core_if->dma_enable) { + if (core_if->dma_desc_enable == 0) { -+ dwc_write_reg32(&in_regs->dieptsiz, ++ deptsiz.b.mc = 1; ++ DWC_WRITE_REG32(&in_regs->dieptsiz, + deptsiz.d32); -+ dwc_write_reg32(&(in_regs->diepdma), ++ DWC_WRITE_REG32(&(in_regs->diepdma), + (uint32_t) ep->dma_addr); + } + } else { -+ dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32); -+ /** ++ DWC_WRITE_REG32(&in_regs->dieptsiz, deptsiz.d32); ++ /** + * Enable the Non-Periodic Tx FIFO empty interrupt, + * or the Tx FIFO epmty interrupt in dedicated Tx FIFO mode, + * the data will be written into the fifo by the ISR. + */ + if (core_if->en_multiple_tx_fifo == 0) { + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if->core_global_regs-> -+ gintmsk, intr_mask.d32, -+ intr_mask.d32); ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gintmsk, ++ intr_mask.d32, intr_mask.d32); + } else { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) { + uint32_t fifoemptymsk = 0; + fifoemptymsk = 1 << ep->num; -+ dwc_modify_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ dtknqr4_fifoemptymsk, ++ DWC_MODIFY_REG32(&core_if-> ++ dev_if->dev_global_regs->dtknqr4_fifoemptymsk, + 0, fifoemptymsk); + } + } + } + ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) ++ depctl.b.nextep = core_if->nextep_seq[ep->num]; + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&in_regs->diepctl, depctl.d32); -+ -+ depctl.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl); -+ depctl.b.nextep = ep->num; -+ dwc_write_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl, -+ depctl.d32); ++ DWC_WRITE_REG32(&in_regs->diepctl, depctl.d32); + + } else { + /* OUT endpoint */ + dwc_otg_dev_out_ep_regs_t *out_regs = + core_if->dev_if->out_ep_regs[ep->num]; + -+ depctl.d32 = dwc_read_reg32(&(out_regs->doepctl)); -+ deptsiz.d32 = dwc_read_reg32(&(out_regs->doeptsiz)); ++ depctl.d32 = DWC_READ_REG32(&(out_regs->doepctl)); ++ deptsiz.d32 = DWC_READ_REG32(&(out_regs->doeptsiz)); + + /* Zero Length Packet */ + deptsiz.b.xfersize = ep->maxpacket; @@ -43436,21 +53362,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + if (core_if->dma_enable) { + if (!core_if->dma_desc_enable) { -+ dwc_write_reg32(&out_regs->doeptsiz, ++ DWC_WRITE_REG32(&out_regs->doeptsiz, + deptsiz.d32); + -+ dwc_write_reg32(&(out_regs->doepdma), ++ DWC_WRITE_REG32(&(out_regs->doepdma), + (uint32_t) ep->dma_addr); + } + } else { -+ dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&out_regs->doeptsiz, deptsiz.d32); + } + + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + -+ dwc_write_reg32(&out_regs->doepctl, depctl.d32); ++ DWC_WRITE_REG32(&out_regs->doepctl, depctl.d32); + + } +} @@ -43485,15 +53411,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + gnptxsts_data_t gtxstatus; + ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ depctl.d32 = DWC_READ_REG32(&in_regs->diepctl); ++ if (depctl.b.epena) ++ return; ++ } ++ + gtxstatus.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->gnptxsts); ++ DWC_READ_REG32(&core_if->core_global_regs->gnptxsts); ++ ++ /* If dedicated FIFO every time flush fifo before enable ep*/ ++ if (core_if->en_multiple_tx_fifo && core_if->snpsid >= OTG_CORE_REV_3_00a) ++ dwc_otg_flush_tx_fifo(core_if, ep->tx_fifo_num); + + if (core_if->en_multiple_tx_fifo == 0 -+ && gtxstatus.b.nptxqspcavail == 0) { ++ && gtxstatus.b.nptxqspcavail == 0 ++ && !core_if->dma_enable) { +#ifdef DEBUG -+ deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz); ++ deptsiz.d32 = DWC_READ_REG32(&in_regs->dieptsiz); + DWC_DEBUGPL(DBG_PCD, "DIEPCTL0=%0x\n", -+ dwc_read_reg32(&in_regs->diepctl)); ++ DWC_READ_REG32(&in_regs->diepctl)); + DWC_DEBUGPL(DBG_PCD, "DIEPTSIZ0=%0x (sz=%d, pcnt=%d)\n", + deptsiz.d32, + deptsiz.b.xfersize, deptsiz.b.pktcnt); @@ -43503,8 +53440,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return; + } + -+ depctl.d32 = dwc_read_reg32(&in_regs->diepctl); -+ deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz); ++ depctl.d32 = DWC_READ_REG32(&in_regs->diepctl); ++ deptsiz.d32 = DWC_READ_REG32(&in_regs->dieptsiz); + + /* Zero Length Packet? */ + if (ep->xfer_len == 0) { @@ -43514,7 +53451,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + if (ep->xfer_len > ep->maxpacket) { + ep->xfer_len = ep->maxpacket; @@ -43533,10 +53470,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Write the DMA register */ + if (core_if->dma_enable) { + if (core_if->dma_desc_enable == 0) { -+ dwc_write_reg32(&in_regs->dieptsiz, ++ DWC_WRITE_REG32(&in_regs->dieptsiz, + deptsiz.d32); + -+ dwc_write_reg32(&(in_regs->diepdma), ++ DWC_WRITE_REG32(&(in_regs->diepdma), + (uint32_t) ep->dma_addr); + } else { + dma_desc = core_if->dev_if->in_desc_addr; @@ -43549,40 +53486,42 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + (ep->xfer_len == ep->maxpacket) ? 0 : 1; + dma_desc->status.b.bytes = ep->xfer_len; + dma_desc->buf = ep->dma_addr; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + + /** DIEPDMA0 Register write */ -+ dwc_write_reg32(&in_regs->diepdma, -+ core_if->dev_if-> -+ dma_in_desc_addr); ++ DWC_WRITE_REG32(&in_regs->diepdma, ++ core_if-> ++ dev_if->dma_in_desc_addr); + } + } else { -+ dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&in_regs->dieptsiz, deptsiz.d32); + } + ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) ++ depctl.b.nextep = core_if->nextep_seq[ep->num]; + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&in_regs->diepctl, depctl.d32); ++ DWC_WRITE_REG32(&in_regs->diepctl, depctl.d32); + -+ /** ++ /** + * Enable the Non-Periodic Tx FIFO empty interrupt, the + * data will be written into the fifo by the ISR. + */ + if (!core_if->dma_enable) { + if (core_if->en_multiple_tx_fifo == 0) { + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if->core_global_regs-> -+ gintmsk, intr_mask.d32, -+ intr_mask.d32); ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gintmsk, ++ intr_mask.d32, intr_mask.d32); + } else { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) { + uint32_t fifoemptymsk = 0; + fifoemptymsk |= 1 << ep->num; -+ dwc_modify_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ dtknqr4_fifoemptymsk, ++ DWC_MODIFY_REG32(&core_if-> ++ dev_if->dev_global_regs->dtknqr4_fifoemptymsk, + 0, fifoemptymsk); + } + } @@ -43592,8 +53531,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_dev_out_ep_regs_t *out_regs = + core_if->dev_if->out_ep_regs[0]; + -+ depctl.d32 = dwc_read_reg32(&out_regs->doepctl); -+ deptsiz.d32 = dwc_read_reg32(&out_regs->doeptsiz); ++ depctl.d32 = DWC_READ_REG32(&out_regs->doepctl); ++ deptsiz.d32 = DWC_READ_REG32(&out_regs->doeptsiz); + + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) @@ -43601,41 +53540,48 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Zero Length Packet */ + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) ++ deptsiz.b.supcnt = 3; + + DWC_DEBUGPL(DBG_PCDV, "len=%d xfersize=%d pktcnt=%d\n", + ep->xfer_len, deptsiz.b.xfersize, deptsiz.b.pktcnt); + + if (core_if->dma_enable) { + if (!core_if->dma_desc_enable) { -+ dwc_write_reg32(&out_regs->doeptsiz, ++ DWC_WRITE_REG32(&out_regs->doeptsiz, + deptsiz.d32); + -+ dwc_write_reg32(&(out_regs->doepdma), ++ DWC_WRITE_REG32(&(out_regs->doepdma), + (uint32_t) ep->dma_addr); + } else { + dma_desc = core_if->dev_if->out_desc_addr; + + /** DMA Descriptor Setup */ + dma_desc->status.b.bs = BS_HOST_BUSY; ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ dma_desc->status.b.mtrf = 0; ++ dma_desc->status.b.sr = 0; ++ } + dma_desc->status.b.l = 1; + dma_desc->status.b.ioc = 1; + dma_desc->status.b.bytes = ep->maxpacket; + dma_desc->buf = ep->dma_addr; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + + /** DOEPDMA0 Register write */ -+ dwc_write_reg32(&out_regs->doepdma, ++ DWC_WRITE_REG32(&out_regs->doepdma, + core_if->dev_if-> + dma_out_desc_addr); + } + } else { -+ dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&out_regs->doeptsiz, deptsiz.d32); + } + + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&(out_regs->doepctl), depctl.d32); ++ DWC_WRITE_REG32(&(out_regs->doepctl), depctl.d32); + } +} + @@ -43661,17 +53607,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + gnptxsts_data_t tx_status = {.d32 = 0 }; + + tx_status.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->gnptxsts); ++ DWC_READ_REG32(&core_if->core_global_regs->gnptxsts); + /** @todo Should there be check for room in the Tx + * Status Queue. If not remove the code above this comment. */ + -+ depctl.d32 = dwc_read_reg32(&in_regs->diepctl); -+ deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz); ++ depctl.d32 = DWC_READ_REG32(&in_regs->diepctl); ++ deptsiz.d32 = DWC_READ_REG32(&in_regs->dieptsiz); + + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + + if (core_if->dma_desc_enable == 0) { @@ -43685,7 +53631,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } else { + ep->xfer_len = deptsiz.b.xfersize; + } -+ dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&in_regs->dieptsiz, deptsiz.d32); + } else { + ep->xfer_len = + (ep->total_len - ep->xfer_count) > @@ -43702,10 +53648,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + (ep->xfer_len == ep->maxpacket) ? 0 : 1; + dma_desc->status.b.bytes = ep->xfer_len; + dma_desc->buf = ep->dma_addr; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + + /** DIEPDMA0 Register write */ -+ dwc_write_reg32(&in_regs->diepdma, ++ DWC_WRITE_REG32(&in_regs->diepdma, + core_if->dev_if->dma_in_desc_addr); + } + @@ -43717,16 +53664,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Write the DMA register */ + if (core_if->hwcfg2.b.architecture == DWC_INT_DMA_ARCH) { + if (core_if->dma_desc_enable == 0) -+ dwc_write_reg32(&(in_regs->diepdma), ++ DWC_WRITE_REG32(&(in_regs->diepdma), + (uint32_t) ep->dma_addr); + } -+ ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) ++ depctl.b.nextep = core_if->nextep_seq[ep->num]; + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&in_regs->diepctl, depctl.d32); ++ DWC_WRITE_REG32(&in_regs->diepctl, depctl.d32); + -+ /** ++ /** + * Enable the Non-Periodic Tx FIFO empty interrupt, the + * data will be written into the fifo by the ISR. + */ @@ -43734,18 +53682,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if (core_if->en_multiple_tx_fifo == 0) { + /* First clear it from GINTSTS */ + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if->core_global_regs-> -+ gintmsk, intr_mask.d32, -+ intr_mask.d32); ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gintmsk, ++ intr_mask.d32, intr_mask.d32); + + } else { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) { + uint32_t fifoemptymsk = 0; + fifoemptymsk |= 1 << ep->num; -+ dwc_modify_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ dtknqr4_fifoemptymsk, ++ DWC_MODIFY_REG32(&core_if-> ++ dev_if->dev_global_regs->dtknqr4_fifoemptymsk, + 0, fifoemptymsk); + } + } @@ -43754,19 +53701,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_otg_dev_out_ep_regs_t *out_regs = + core_if->dev_if->out_ep_regs[0]; + -+ depctl.d32 = dwc_read_reg32(&out_regs->doepctl); -+ deptsiz.d32 = dwc_read_reg32(&out_regs->doeptsiz); ++ depctl.d32 = DWC_READ_REG32(&out_regs->doepctl); ++ deptsiz.d32 = DWC_READ_REG32(&out_regs->doeptsiz); + + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + + if (core_if->dma_desc_enable == 0) { -+ dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&out_regs->doeptsiz, deptsiz.d32); + } else { + dma_desc = core_if->dev_if->out_desc_addr; + @@ -43776,10 +53723,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dma_desc->status.b.ioc = 1; + dma_desc->status.b.bytes = ep->maxpacket; + dma_desc->buf = ep->dma_addr; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + + /** DOEPDMA0 Register write */ -+ dwc_write_reg32(&out_regs->doepdma, ++ DWC_WRITE_REG32(&out_regs->doepdma, + core_if->dev_if->dma_out_desc_addr); + } + @@ -43791,14 +53739,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Write the DMA register */ + if (core_if->hwcfg2.b.architecture == DWC_INT_DMA_ARCH) { + if (core_if->dma_desc_enable == 0) -+ dwc_write_reg32(&(out_regs->doepdma), ++ DWC_WRITE_REG32(&(out_regs->doepdma), + (uint32_t) ep->dma_addr); ++ + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; -+ dwc_write_reg32(&out_regs->doepctl, depctl.d32); ++ DWC_WRITE_REG32(&out_regs->doepctl, depctl.d32); + + } +} @@ -43836,7 +53785,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + +/** + * This function writes a packet into the Tx FIFO associated with the -+ * EP. For non-periodic EPs the non-periodic Tx FIFO is written. For ++ * EP. For non-periodic EPs the non-periodic Tx FIFO is written. For + * periodic EPs the periodic Tx FIFO associated with the EP is written + * with all packets for the next micro-frame. + * @@ -43849,15 +53798,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +{ + /** + * The buffer is padded to DWORD on a per packet basis in -+ * slave/dma mode if the MPS is not DWORD aligned. The last ++ * slave/dma mode if the MPS is not DWORD aligned. The last + * packet, if short, is also padded to a multiple of DWORD. + * -+ * ep->xfer_buff always starts DWORD aligned in memory and is a ++ * ep->xfer_buff always starts DWORD aligned in memory and is a + * multiple of DWORD in length + * + * ep->xfer_len can be any number of bytes + * -+ * ep->xfer_count is a multiple of ep->maxpacket until the last ++ * ep->xfer_count is a multiple of ep->maxpacket until the last + * packet + * + * FIFO access is DWORD */ @@ -43900,7 +53849,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + if (!dma) { + for (i = 0; i < dword_count; i++, data_buff++) { -+ dwc_write_reg32(fifo, *data_buff); ++ DWC_WRITE_REG32(fifo, *data_buff); + } + } + @@ -43909,7 +53858,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + ep->dma_addr += byte_count; +} + -+/** ++/** + * Set the EP STALL. + * + * @param core_if Programming view of DWC_otg controller. @@ -43925,29 +53874,29 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + if (ep->is_in == 1) { + depctl_addr = &(core_if->dev_if->in_ep_regs[ep->num]->diepctl); -+ depctl.d32 = dwc_read_reg32(depctl_addr); ++ depctl.d32 = DWC_READ_REG32(depctl_addr); + + /* set the disable and stall bits */ + if (depctl.b.epena) { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; -+ dwc_write_reg32(depctl_addr, depctl.d32); ++ DWC_WRITE_REG32(depctl_addr, depctl.d32); + } else { + depctl_addr = &(core_if->dev_if->out_ep_regs[ep->num]->doepctl); -+ depctl.d32 = dwc_read_reg32(depctl_addr); ++ depctl.d32 = DWC_READ_REG32(depctl_addr); + + /* set the stall bit */ + depctl.b.stall = 1; -+ dwc_write_reg32(depctl_addr, depctl.d32); ++ DWC_WRITE_REG32(depctl_addr, depctl.d32); + } + -+ DWC_DEBUGPL(DBG_PCD, "DEPCTL=%0x\n", dwc_read_reg32(depctl_addr)); ++ DWC_DEBUGPL(DBG_PCD, "DEPCTL=%0x\n", DWC_READ_REG32(depctl_addr)); + + return; +} + -+/** ++/** + * Clear the EP STALL. + * + * @param core_if Programming view of DWC_otg controller. @@ -43967,12 +53916,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl_addr = &(core_if->dev_if->out_ep_regs[ep->num]->doepctl); + } + -+ depctl.d32 = dwc_read_reg32(depctl_addr); ++ depctl.d32 = DWC_READ_REG32(depctl_addr); + + /* clear the stall bits */ + depctl.b.stall = 0; + -+ /* ++ /* + * USB Spec 9.4.5: For endpoints using data toggle, regardless + * of whether an endpoint has the Halt feature set, a + * ClearFeature(ENDPOINT_HALT) request always results in the @@ -43983,14 +53932,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl.b.setd0pid = 1; /* DATA0 */ + } + -+ dwc_write_reg32(depctl_addr, depctl.d32); -+ DWC_DEBUGPL(DBG_PCD, "DEPCTL=%0x\n", dwc_read_reg32(depctl_addr)); ++ DWC_WRITE_REG32(depctl_addr, depctl.d32); ++ DWC_DEBUGPL(DBG_PCD, "DEPCTL=%0x\n", DWC_READ_REG32(depctl_addr)); + return; +} + -+/** ++/** + * This function reads a packet from the Rx FIFO into the destination -+ * buffer. To read SETUP data use dwc_otg_read_setup_packet. ++ * buffer. To read SETUP data use dwc_otg_read_setup_packet. + * + * @param core_if Programming view of DWC_otg controller. + * @param dest Destination buffer for the packet. @@ -44015,7 +53964,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if, dest, bytes); + + for (i = 0; i < word_count; i++, data_buff++) { -+ *data_buff = dwc_read_reg32(fifo); ++ *data_buff = DWC_READ_REG32(fifo); + } + + return; @@ -44033,119 +53982,125 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_PRINTF("Device Global Registers\n"); + addr = &core_if->dev_if->dev_global_regs->dcfg; -+ DWC_PRINTF("DCFG @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DCFG @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->dctl; -+ DWC_PRINTF("DCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DCTL @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->dsts; -+ DWC_PRINTF("DSTS @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DSTS @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->diepmsk; -+ DWC_PRINTF("DIEPMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DIEPMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->doepmsk; -+ DWC_PRINTF("DOEPMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DOEPMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->daint; -+ DWC_PRINTF("DAINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DAINT @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->daintmsk; -+ DWC_PRINTF("DAINTMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DAINTMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->dev_if->dev_global_regs->dtknqr1; -+ DWC_PRINTF("DTKNQR1 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DTKNQR1 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + if (core_if->hwcfg2.b.dev_token_q_depth > 6) { + addr = &core_if->dev_if->dev_global_regs->dtknqr2; -+ DWC_PRINTF("DTKNQR2 @0x%08X : 0x%08X\n", -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ DWC_PRINTF("DTKNQR2 @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + } + + addr = &core_if->dev_if->dev_global_regs->dvbusdis; -+ DWC_PRINTF("DVBUSID @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DVBUSID @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + + addr = &core_if->dev_if->dev_global_regs->dvbuspulse; -+ DWC_PRINTF("DVBUSPULSE @0x%08X : 0x%08X\n", -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ DWC_PRINTF("DVBUSPULSE @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + -+ addr = &core_if->dev_if->dev_global_regs->dtknqr3_dthrctl; -+ DWC_PRINTF("DTKNQR3_DTHRCTL @0x%08X : 0x%08X\n", -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ addr = &core_if->dev_if->dev_global_regs->dtknqr3_dthrctl; ++ DWC_PRINTF("DTKNQR3_DTHRCTL @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + + if (core_if->hwcfg2.b.dev_token_q_depth > 22) { + addr = &core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk; -+ DWC_PRINTF("DTKNQR4 @0x%08X : 0x%08X\n", -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ DWC_PRINTF("DTKNQR4 @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + } + + addr = &core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk; -+ DWC_PRINTF("FIFOEMPMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("FIFOEMPMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + -+ addr = &core_if->dev_if->dev_global_regs->deachint; -+ DWC_PRINTF("DEACHINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); -+ addr = &core_if->dev_if->dev_global_regs->deachintmsk; -+ DWC_PRINTF("DEACHINTMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ if (core_if->hwcfg2.b.multi_proc_int) { + -+ for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { -+ addr = &core_if->dev_if->dev_global_regs->diepeachintmsk[i]; -+ DWC_PRINTF("DIEPEACHINTMSK[%d] @0x%08X : 0x%08X\n", i, -+ (uint32_t) addr, dwc_read_reg32(addr)); -+ } ++ addr = &core_if->dev_if->dev_global_regs->deachint; ++ DWC_PRINTF("DEACHINT @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); ++ addr = &core_if->dev_if->dev_global_regs->deachintmsk; ++ DWC_PRINTF("DEACHINTMSK @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + -+ for (i = 0; i <= core_if->dev_if->num_out_eps; i++) { -+ addr = &core_if->dev_if->dev_global_regs->doepeachintmsk[i]; -+ DWC_PRINTF("DOEPEACHINTMSK[%d] @0x%08X : 0x%08X\n", i, -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { ++ addr = ++ &core_if->dev_if-> ++ dev_global_regs->diepeachintmsk[i]; ++ DWC_PRINTF("DIEPEACHINTMSK[%d] @0x%08lX : 0x%08X\n", ++ i, (unsigned long)addr, ++ DWC_READ_REG32(addr)); ++ } ++ ++ for (i = 0; i <= core_if->dev_if->num_out_eps; i++) { ++ addr = ++ &core_if->dev_if-> ++ dev_global_regs->doepeachintmsk[i]; ++ DWC_PRINTF("DOEPEACHINTMSK[%d] @0x%08lX : 0x%08X\n", ++ i, (unsigned long)addr, ++ DWC_READ_REG32(addr)); ++ } + } + + for (i = 0; i <= core_if->dev_if->num_in_eps; i++) { + DWC_PRINTF("Device IN EP %d Registers\n", i); + addr = &core_if->dev_if->in_ep_regs[i]->diepctl; -+ DWC_PRINTF("DIEPCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DIEPCTL @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->in_ep_regs[i]->diepint; -+ DWC_PRINTF("DIEPINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DIEPINT @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->in_ep_regs[i]->dieptsiz; -+ DWC_PRINTF("DIETSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DIETSIZ @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->in_ep_regs[i]->diepdma; -+ DWC_PRINTF("DIEPDMA @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DIEPDMA @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->in_ep_regs[i]->dtxfsts; -+ DWC_PRINTF("DTXFSTS @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DTXFSTS @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->in_ep_regs[i]->diepdmab; -+ DWC_PRINTF("DIEPDMAB @0x%08X : 0x%08X\n", (uint32_t) addr, -+ 0 /*dwc_read_reg32(addr) */ ); ++ DWC_PRINTF("DIEPDMAB @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, 0 /*DWC_READ_REG32(addr) */ ); + } + + for (i = 0; i <= core_if->dev_if->num_out_eps; i++) { + DWC_PRINTF("Device OUT EP %d Registers\n", i); + addr = &core_if->dev_if->out_ep_regs[i]->doepctl; -+ DWC_PRINTF("DOEPCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); -+ addr = &core_if->dev_if->out_ep_regs[i]->doepfn; -+ DWC_PRINTF("DOEPFN @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DOEPCTL @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->out_ep_regs[i]->doepint; -+ DWC_PRINTF("DOEPINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DOEPINT @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->out_ep_regs[i]->doeptsiz; -+ DWC_PRINTF("DOETSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DOETSIZ @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->dev_if->out_ep_regs[i]->doepdma; -+ DWC_PRINTF("DOEPDMA @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("DOEPDMA @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + if (core_if->dma_enable) { /* Don't access this register in SLAVE mode */ + addr = &core_if->dev_if->out_ep_regs[i]->doepdmab; -+ DWC_PRINTF("DOEPDMAB @0x%08X : 0x%08X\n", -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ DWC_PRINTF("DOEPDMAB @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + } + + } @@ -44162,15 +54117,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_PRINTF("SPRAM Data:\n"); + start_addr = (void *)core_if->core_global_regs; -+ DWC_PRINTF("Base Address: 0x%8X\n", (uint32_t) start_addr); ++ DWC_PRINTF("Base Address: 0x%8lX\n", (unsigned long)start_addr); + start_addr += 0x00028000; + end_addr = (void *)core_if->core_global_regs; + end_addr += 0x000280e0; + + for (addr = start_addr; addr < end_addr; addr += 16) { + DWC_PRINTF -+ ("0x%8X:\t%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\n", -+ (uint32_t) addr, addr[0], addr[1], addr[2], addr[3], ++ ("0x%8lX:\t%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\n", ++ (unsigned long)addr, addr[0], addr[1], addr[2], addr[3], + addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], + addr[10], addr[11], addr[12], addr[13], addr[14], addr[15] + ); @@ -44191,57 +54146,58 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_PRINTF("Host Global Registers\n"); + addr = &core_if->host_if->host_global_regs->hcfg; -+ DWC_PRINTF("HCFG @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCFG @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->host_global_regs->hfir; -+ DWC_PRINTF("HFIR @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HFIR @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->host_global_regs->hfnum; -+ DWC_PRINTF("HFNUM @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HFNUM @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->host_if->host_global_regs->hptxsts; -+ DWC_PRINTF("HPTXSTS @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HPTXSTS @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->host_if->host_global_regs->haint; -+ DWC_PRINTF("HAINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HAINT @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->host_if->host_global_regs->haintmsk; -+ DWC_PRINTF("HAINTMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HAINTMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + if (core_if->dma_desc_enable) { + addr = &core_if->host_if->host_global_regs->hflbaddr; -+ DWC_PRINTF("HFLBADDR @0x%08X : 0x%08X\n",(uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HFLBADDR @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + } -+ ++ + addr = core_if->host_if->hprt0; -+ DWC_PRINTF("HPRT0 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HPRT0 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + + for (i = 0; i < core_if->core_params->host_channels; i++) { + DWC_PRINTF("Host Channel %d Specific Registers\n", i); + addr = &core_if->host_if->hc_regs[i]->hcchar; -+ DWC_PRINTF("HCCHAR @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCCHAR @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->hc_regs[i]->hcsplt; -+ DWC_PRINTF("HCSPLT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCSPLT @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->hc_regs[i]->hcint; -+ DWC_PRINTF("HCINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCINT @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->hc_regs[i]->hcintmsk; -+ DWC_PRINTF("HCINTMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCINTMSK @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->hc_regs[i]->hctsiz; -+ DWC_PRINTF("HCTSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCTSIZ @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->host_if->hc_regs[i]->hcdma; -+ DWC_PRINTF("HCDMA @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HCDMA @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + if (core_if->dma_desc_enable) { -+ addr=&core_if->host_if->hc_regs[i]->hcdmab; -+ DWC_PRINTF("HCDMAB @0x%08X : 0x%08X\n",(uint32_t) addr, dwc_read_reg32(addr)); -+ } ++ addr = &core_if->host_if->hc_regs[i]->hcdmab; ++ DWC_PRINTF("HCDMAB @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); ++ } + + } + return; @@ -44254,85 +54210,102 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + */ +void dwc_otg_dump_global_registers(dwc_otg_core_if_t * core_if) +{ -+ int i; ++ int i, ep_num; + volatile uint32_t *addr; ++ char *txfsiz; + + DWC_PRINTF("Core Global Registers\n"); + addr = &core_if->core_global_regs->gotgctl; -+ DWC_PRINTF("GOTGCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GOTGCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gotgint; -+ DWC_PRINTF("GOTGINT @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GOTGINT @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gahbcfg; -+ DWC_PRINTF("GAHBCFG @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GAHBCFG @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gusbcfg; -+ DWC_PRINTF("GUSBCFG @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GUSBCFG @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->grstctl; -+ DWC_PRINTF("GRSTCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GRSTCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gintsts; -+ DWC_PRINTF("GINTSTS @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GINTSTS @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gintmsk; -+ DWC_PRINTF("GINTMSK @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GINTMSK @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->grxstsr; -+ DWC_PRINTF("GRXSTSR @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GRXSTSR @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->grxfsiz; -+ DWC_PRINTF("GRXFSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GRXFSIZ @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gnptxfsiz; -+ DWC_PRINTF("GNPTXFSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GNPTXFSIZ @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gnptxsts; -+ DWC_PRINTF("GNPTXSTS @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GNPTXSTS @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gi2cctl; -+ DWC_PRINTF("GI2CCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GI2CCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gpvndctl; -+ DWC_PRINTF("GPVNDCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GPVNDCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->ggpio; -+ DWC_PRINTF("GGPIO @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GGPIO @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->guid; -+ DWC_PRINTF("GUID @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GUID @0x%08lX : 0x%08X\n", ++ (unsigned long)addr, DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->gsnpsid; -+ DWC_PRINTF("GSNPSID @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GSNPSID @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->ghwcfg1; -+ DWC_PRINTF("GHWCFG1 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GHWCFG1 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->ghwcfg2; -+ DWC_PRINTF("GHWCFG2 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GHWCFG2 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->ghwcfg3; -+ DWC_PRINTF("GHWCFG3 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GHWCFG3 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->ghwcfg4; -+ DWC_PRINTF("GHWCFG4 @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GHWCFG4 @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + addr = &core_if->core_global_regs->glpmcfg; -+ DWC_PRINTF("GLPMCFG @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("GLPMCFG @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); ++ addr = &core_if->core_global_regs->gpwrdn; ++ DWC_PRINTF("GPWRDN @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); ++ addr = &core_if->core_global_regs->gdfifocfg; ++ DWC_PRINTF("GDFIFOCFG @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); ++ addr = &core_if->core_global_regs->adpctl; ++ DWC_PRINTF("ADPCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ dwc_otg_adp_read_reg(core_if)); + addr = &core_if->core_global_regs->hptxfsiz; -+ DWC_PRINTF("HPTXFSIZ @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("HPTXFSIZ @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); + -+ for (i = 0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; i++) { -+ addr = &core_if->core_global_regs->dptxfsiz_dieptxf[i]; -+ DWC_PRINTF("DPTXFSIZ[%d] @0x%08X : 0x%08X\n", i, -+ (uint32_t) addr, dwc_read_reg32(addr)); ++ if (core_if->en_multiple_tx_fifo == 0) { ++ ep_num = core_if->hwcfg4.b.num_dev_perio_in_ep; ++ txfsiz = "DPTXFSIZ"; ++ } else { ++ ep_num = core_if->hwcfg4.b.num_in_eps; ++ txfsiz = "DIENPTXF"; ++ } ++ for (i = 0; i < ep_num; i++) { ++ addr = &core_if->core_global_regs->dtxfsiz[i]; ++ DWC_PRINTF("%s[%d] @0x%08lX : 0x%08X\n", txfsiz, i + 1, ++ (unsigned long)addr, DWC_READ_REG32(addr)); + } + addr = core_if->pcgcctl; -+ DWC_PRINTF("PCGCCTL @0x%08X : 0x%08X\n", (uint32_t) addr, -+ dwc_read_reg32(addr)); ++ DWC_PRINTF("PCGCCTL @0x%08lX : 0x%08X\n", (unsigned long)addr, ++ DWC_READ_REG32(addr)); +} + +/** @@ -44351,14 +54324,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + greset.b.txfflsh = 1; + greset.b.txfnum = num; -+ dwc_write_reg32(&global_regs->grstctl, greset.d32); ++ DWC_WRITE_REG32(&global_regs->grstctl, greset.d32); + + do { -+ greset.d32 = dwc_read_reg32(&global_regs->grstctl); ++ greset.d32 = DWC_READ_REG32(&global_regs->grstctl); + if (++count > 10000) { + DWC_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n", + __func__, greset.d32, -+ dwc_read_reg32(&global_regs->gnptxsts)); ++ DWC_READ_REG32(&global_regs->gnptxsts)); + break; + } + dwc_udelay(1); @@ -44381,13 +54354,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + DWC_DEBUGPL((DBG_CIL | DBG_PCDV), "%s\n", __func__); + /* -+ * ++ * + */ + greset.b.rxfflsh = 1; -+ dwc_write_reg32(&global_regs->grstctl, greset.d32); ++ DWC_WRITE_REG32(&global_regs->grstctl, greset.d32); + + do { -+ greset.d32 = dwc_read_reg32(&global_regs->grstctl); ++ greset.d32 = DWC_READ_REG32(&global_regs->grstctl); + if (++count > 10000) { + DWC_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, + greset.d32); @@ -44414,7 +54387,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Wait for AHB master IDLE state. */ + do { + dwc_udelay(10); -+ greset.d32 = dwc_read_reg32(&global_regs->grstctl); ++ greset.d32 = DWC_READ_REG32(&global_regs->grstctl); + if (++count > 100000) { + DWC_WARN("%s() HANG! AHB Idle GRSTCTL=%0x\n", __func__, + greset.d32); @@ -44426,9 +54399,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; -+ dwc_write_reg32(&global_regs->grstctl, greset.d32); ++ DWC_WRITE_REG32(&global_regs->grstctl, greset.d32); + do { -+ greset.d32 = dwc_read_reg32(&global_regs->grstctl); ++ greset.d32 = DWC_READ_REG32(&global_regs->grstctl); + if (++count > 10000) { + DWC_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", + __func__, greset.d32); @@ -44453,7 +54426,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +} + +/** -+ * Register HCD callbacks. The callbacks are used to start and stop ++ * Register HCD callbacks. The callbacks are used to start and stop + * the HCD for interrupt processing. + * + * @param core_if Programming view of DWC_otg controller. @@ -44468,7 +54441,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +} + +/** -+ * Register PCD callbacks. The callbacks are used to start and stop ++ * Register PCD callbacks. The callbacks are used to start and stop + * the PCD for interrupt processing. + * + * @param core_if Programming view of DWC_otg controller. @@ -44514,7 +54487,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* While there is space in the queue and space in the FIFO and + * More data to tranfer, Write packets to the Tx FIFO */ + txstatus.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dtxfsts); ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[ep->num]->dtxfsts); + DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n", ep->num, txstatus.d32); + + while (txstatus.b.txfspcavail > dwords && @@ -44529,7 +54502,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + dwords = (len + 3) / 4; + txstatus.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> + dtxfsts); + DWC_DEBUGPL(DBG_PCDV, "dtxfsts[%d]=0x%08x\n", ep->num, + txstatus.d32); @@ -44566,18 +54539,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = + (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + deptsiz.b.mc = deptsiz.b.pktcnt; -+ dwc_write_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dieptsiz, ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]->dieptsiz, + deptsiz.d32); + + /* Write the DMA register */ + if (core_if->dma_enable) { -+ dwc_write_reg32(& ++ DWC_WRITE_REG32(& + (core_if->dev_if->in_ep_regs[ep->num]-> + diepdma), (uint32_t) ep->dma_addr); + } @@ -44586,13 +54559,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + -+ dwc_write_reg32(&core_if->dev_if->out_ep_regs[ep->num]-> -+ doeptsiz, deptsiz.d32); ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->num]->doeptsiz, deptsiz.d32); + + if (core_if->dma_enable) { -+ dwc_write_reg32(& -+ (core_if->dev_if->out_ep_regs[ep->num]-> -+ doepdma), (uint32_t) ep->dma_addr); ++ DWC_WRITE_REG32(& ++ (core_if->dev_if-> ++ out_ep_regs[ep->num]->doepdma), ++ (uint32_t) ep->dma_addr); + } + } + @@ -44601,7 +54575,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl.d32 = 0; + if (ep->bInterval == 1) { + dsts.d32 = -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + ep->next_frame = dsts.b.soffn + ep->bInterval; + + if (ep->next_frame & 0x1) { @@ -44621,15 +54595,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + depctl.b.epena = 1; + depctl.b.cnak = 1; + -+ dwc_modify_reg32(addr, 0, depctl.d32); -+ depctl.d32 = dwc_read_reg32(addr); ++ DWC_MODIFY_REG32(addr, 0, depctl.d32); ++ depctl.d32 = DWC_READ_REG32(addr); + + if (ep->is_in && core_if->dma_enable == 0) { + write_isoc_frame_data(core_if, ep); + } + +} -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ + +static void dwc_otg_set_uninitialized(int32_t * p, int size) +{ @@ -44720,8 +54694,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + dwc_param_tx_thr_length_default); + dwc_otg_set_param_rx_thr_length(core_if, + dwc_param_rx_thr_length_default); -+ dwc_otg_set_param_ahb_thr_ratio(core_if, dwc_param_ahb_thr_ratio_default); ++ dwc_otg_set_param_ahb_thr_ratio(core_if, ++ dwc_param_ahb_thr_ratio_default); ++ dwc_otg_set_param_power_down(core_if, dwc_param_power_down_default); ++ dwc_otg_set_param_reload_ctl(core_if, dwc_param_reload_ctl_default); ++ dwc_otg_set_param_dev_out_nak(core_if, dwc_param_dev_out_nak_default); ++ dwc_otg_set_param_cont_on_bna(core_if, dwc_param_cont_on_bna_default); ++ dwc_otg_set_param_ahb_single(core_if, dwc_param_ahb_single_default); ++ dwc_otg_set_param_otg_ver(core_if, dwc_param_otg_ver_default); ++ dwc_otg_set_param_adp_enable(core_if, dwc_param_adp_enable_default); + DWC_PRINTF("Finished setting default values for core params\n"); ++ + return 0; +} + @@ -44762,7 +54745,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + && (core_if->hwcfg2.b.op_mode != + DWC_HWCFG2_OP_MODE_SRP_CAPABLE_DEVICE) + && (core_if->hwcfg2.b.op_mode != -+ DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST)) { ++ DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST)) { + valid = 0; + } + break; @@ -44791,7 +54774,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + + core_if->core_params->otg_cap = val; -+ out: ++out: + return retval; +} + @@ -44960,11 +54943,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > dwc_read_reg32(&core_if->core_global_regs->grxfsiz)) { -+ if(dwc_otg_param_initialized(core_if->core_params->dev_rx_fifo_size)) { ++ if (val > DWC_READ_REG32(&core_if->core_global_regs->grxfsiz)) { ++ if (dwc_otg_param_initialized(core_if->core_params->dev_rx_fifo_size)) { + DWC_WARN("%d invalid for dev_rx_fifo_size parameter\n", val); + } -+ val = dwc_read_reg32(&core_if->core_global_regs->grxfsiz); ++ val = DWC_READ_REG32(&core_if->core_global_regs->grxfsiz); + retval = -DWC_E_INVALID; + } + @@ -44988,7 +54971,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > (dwc_read_reg32(&core_if->core_global_regs->gnptxfsiz) >> 16)) { ++ if (val > (DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz) >> 16)) { + if (dwc_otg_param_initialized + (core_if->core_params->dev_nperio_tx_fifo_size)) { + DWC_ERROR @@ -44996,7 +54979,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + val); + } + val = -+ (dwc_read_reg32(&core_if->core_global_regs->gnptxfsiz) >> ++ (DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz) >> + 16); + retval = -DWC_E_INVALID; + } @@ -45021,14 +55004,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > dwc_read_reg32(&core_if->core_global_regs->grxfsiz)) { ++ if (val > DWC_READ_REG32(&core_if->core_global_regs->grxfsiz)) { + if (dwc_otg_param_initialized + (core_if->core_params->host_rx_fifo_size)) { + DWC_ERROR + ("%d invalid for host_rx_fifo_size. Check HW configuration.\n", + val); + } -+ val = dwc_read_reg32(&core_if->core_global_regs->grxfsiz); ++ val = DWC_READ_REG32(&core_if->core_global_regs->grxfsiz); + retval = -DWC_E_INVALID; + } + @@ -45053,7 +55036,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > (dwc_read_reg32(&core_if->core_global_regs->gnptxfsiz) >> 16)) { ++ if (val > (DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz) >> 16)) { + if (dwc_otg_param_initialized + (core_if->core_params->host_nperio_tx_fifo_size)) { + DWC_ERROR @@ -45061,7 +55044,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + val); + } + val = -+ (dwc_read_reg32(&core_if->core_global_regs->gnptxfsiz) >> ++ (DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz) >> + 16); + retval = -DWC_E_INVALID; + } @@ -45085,17 +55068,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > -+ ((dwc_read_reg32(&core_if->core_global_regs->hptxfsiz) >> 16))) { ++ if (val > ((core_if->hptxfsiz.d32) >> 16)) { + if (dwc_otg_param_initialized + (core_if->core_params->host_perio_tx_fifo_size)) { + DWC_ERROR + ("%d invalid for host_perio_tx_fifo_size. Check HW configuration.\n", + val); + } -+ val = -+ (dwc_read_reg32(&core_if->core_global_regs->hptxfsiz) >> -+ 16); ++ val = (core_if->hptxfsiz.d32) >> 16; + retval = -DWC_E_INVALID; + } + @@ -45324,9 +55304,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + + if ((val == DWC_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ) + && (dwc_otg_get_param_phy_type(core_if) == DWC_PHY_TYPE_PARAM_FS)) { -+ if(dwc_otg_param_initialized(core_if->core_params->host_ls_low_power_phy_clk)) { -+ DWC_ERROR("%d invalid for host_ls_low_power_phy_clk. Check HW configuration.\n", -+ val); ++ if (dwc_otg_param_initialized ++ (core_if->core_params->host_ls_low_power_phy_clk)) { ++ DWC_ERROR ++ ("%d invalid for host_ls_low_power_phy_clk. Check HW configuration.\n", ++ val); + } + val = + (dwc_otg_get_param_phy_type(core_if) == @@ -45441,9 +55423,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } +#ifndef NO_FS_PHY_HW_CHECK + if (val == 1 && core_if->hwcfg3.b.i2c == 0) { -+ if(dwc_otg_param_initialized(core_if->core_params->i2c_enable)) { -+ DWC_ERROR("%d invalid for i2c_enable. Check HW configuration.\n", -+ val); ++ if (dwc_otg_param_initialized(core_if->core_params->i2c_enable)) { ++ DWC_ERROR ++ ("%d invalid for i2c_enable. Check HW configuration.\n", ++ val); + } + val = 0; + retval = -DWC_E_INVALID; @@ -45470,12 +55453,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > (dwc_read_reg32(&core_if->core_global_regs->dptxfsiz_dieptxf[fifo_num]))) { -+ if(dwc_otg_param_initialized(core_if->core_params->dev_perio_tx_fifo_size[fifo_num])) { -+ DWC_ERROR("`%d' invalid for parameter `dev_perio_fifo_size_%d'. Check HW configuration.\n", -+ val, fifo_num); ++ if (val > ++ (DWC_READ_REG32(&core_if->core_global_regs->dtxfsiz[fifo_num]))) { ++ if (dwc_otg_param_initialized ++ (core_if->core_params->dev_perio_tx_fifo_size[fifo_num])) { ++ DWC_ERROR ++ ("`%d' invalid for parameter `dev_perio_fifo_size_%d'. Check HW configuration.\n", ++ val, fifo_num); + } -+ val = (dwc_read_reg32(&core_if->core_global_regs->dptxfsiz_dieptxf[fifo_num])); ++ val = (DWC_READ_REG32(&core_if->core_global_regs->dtxfsiz[fifo_num])); + retval = -DWC_E_INVALID; + } + @@ -45500,9 +55486,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + + if (val == 1 && core_if->hwcfg4.b.ded_fifo_en == 0) { -+ if(dwc_otg_param_initialized(core_if->core_params->en_multiple_tx_fifo)) { -+ DWC_ERROR("%d invalid for parameter en_multiple_tx_fifo. Check HW configuration.\n", -+ val); ++ if (dwc_otg_param_initialized ++ (core_if->core_params->en_multiple_tx_fifo)) { ++ DWC_ERROR ++ ("%d invalid for parameter en_multiple_tx_fifo. Check HW configuration.\n", ++ val); + } + val = 0; + retval = -DWC_E_INVALID; @@ -45528,12 +55516,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val > (dwc_read_reg32(&core_if->core_global_regs->dptxfsiz_dieptxf[fifo_num]))) { -+ if(dwc_otg_param_initialized(core_if->core_params->dev_tx_fifo_size[fifo_num])) { -+ DWC_ERROR("`%d' invalid for parameter `dev_tx_fifo_size_%d'. Check HW configuration.\n", -+ val, fifo_num); ++ if (val > ++ (DWC_READ_REG32(&core_if->core_global_regs->dtxfsiz[fifo_num]))) { ++ if (dwc_otg_param_initialized ++ (core_if->core_params->dev_tx_fifo_size[fifo_num])) { ++ DWC_ERROR ++ ("`%d' invalid for parameter `dev_tx_fifo_size_%d'. Check HW configuration.\n", ++ val, fifo_num); + } -+ val = (dwc_read_reg32(&core_if->core_global_regs->dptxfsiz_dieptxf[fifo_num])); ++ val = (DWC_READ_REG32(&core_if->core_global_regs->dtxfsiz[fifo_num])); + retval = -DWC_E_INVALID; + } + @@ -45560,9 +55551,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + if ((val != 0) && + (!dwc_otg_get_param_dma_enable(core_if) || + !core_if->hwcfg4.b.ded_fifo_en)) { -+ if(dwc_otg_param_initialized(core_if->core_params->thr_ctl)) { -+ DWC_ERROR("%d invalid for parameter thr_ctl. Check HW configuration.\n", -+ val); ++ if (dwc_otg_param_initialized(core_if->core_params->thr_ctl)) { ++ DWC_ERROR ++ ("%d invalid for parameter thr_ctl. Check HW configuration.\n", ++ val); + } + val = 0; + retval = -DWC_E_INVALID; @@ -45588,9 +55580,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + + if (val && !core_if->hwcfg3.b.otg_lpm_en) { -+ if(dwc_otg_param_initialized(core_if->core_params->lpm_enable)) { -+ DWC_ERROR("%d invalid for parameter lpm_enable. Check HW configuration.\n", -+ val); ++ if (dwc_otg_param_initialized(core_if->core_params->lpm_enable)) { ++ DWC_ERROR ++ ("%d invalid for parameter lpm_enable. Check HW configuration.\n", ++ val); + } + val = 0; + retval = -DWC_E_INVALID; @@ -45670,7 +55663,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + if (val && (core_if->snpsid < OTG_CORE_REV_2_72a)) { + if (dwc_otg_param_initialized(core_if->core_params->pti_enable)) { -+ DWC_ERROR("%d invalid for parameter pti_enable. Check HW configuration.\n", ++ DWC_ERROR ++ ("%d invalid for parameter pti_enable. Check HW configuration.\n", + val); + } + retval = -DWC_E_INVALID; @@ -45694,7 +55688,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + } + if (val && (core_if->hwcfg2.b.multi_proc_int == 0)) { + if (dwc_otg_param_initialized(core_if->core_params->mpi_enable)) { -+ DWC_ERROR("%d invalid for parameter mpi_enable. Check HW configuration.\n", ++ DWC_ERROR ++ ("%d invalid for parameter mpi_enable. Check HW configuration.\n", + val); + } + retval = -DWC_E_INVALID; @@ -45709,8 +55704,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return core_if->core_params->mpi_enable; +} + -+int dwc_otg_set_param_ic_usb_cap(dwc_otg_core_if_t * core_if, -+ int32_t val) ++int dwc_otg_set_param_adp_enable(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `adp_enable'\n", val); ++ return -DWC_E_INVALID; ++ } ++ if (val && (core_if->hwcfg3.b.adp_supp == 0)) { ++ if (dwc_otg_param_initialized ++ (core_if->core_params->adp_supp_enable)) { ++ DWC_ERROR ++ ("%d invalid for parameter adp_enable. Check HW configuration.\n", ++ val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->adp_supp_enable = val; ++ /*Set OTG version 2.0 in case of enabling ADP*/ ++ if (val) ++ dwc_otg_set_param_otg_ver(core_if, 1); ++ ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_adp_enable(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->adp_supp_enable; ++} ++ ++int dwc_otg_set_param_ic_usb_cap(dwc_otg_core_if_t * core_if, int32_t val) +{ + int retval = 0; + if (DWC_OTG_PARAM_TEST(val, 0, 1)) { @@ -45719,9 +55743,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + return -DWC_E_INVALID; + } + -+ if (val && (core_if->hwcfg3.b.otg_enable_ic_usb == 0)) { ++ if (val && (core_if->hwcfg2.b.otg_enable_ic_usb == 0)) { + if (dwc_otg_param_initialized(core_if->core_params->ic_usb_cap)) { -+ DWC_ERROR("%d invalid for parameter ic_usb_cap. Check HW configuration.\n", ++ DWC_ERROR ++ ("%d invalid for parameter ic_usb_cap. Check HW configuration.\n", + val); + } + retval = -DWC_E_INVALID; @@ -45730,6 +55755,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if->core_params->ic_usb_cap = val; + return retval; +} ++ +int32_t dwc_otg_get_param_ic_usb_cap(dwc_otg_core_if_t * core_if) +{ + return core_if->core_params->ic_usb_cap; @@ -45740,20 +55766,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + int retval = 0; + int valid = 1; + -+ if(DWC_OTG_PARAM_TEST(val, 0, 3)) { ++ if (DWC_OTG_PARAM_TEST(val, 0, 3)) { + DWC_WARN("`%d' invalid for parameter `ahb_thr_ratio'\n", val); + DWC_WARN("ahb_thr_ratio must be 0 - 3\n"); + return -DWC_E_INVALID; + } + -+ if(val && (core_if->snpsid < OTG_CORE_REV_2_81a || !dwc_otg_get_param_thr_ctl(core_if))) { ++ if (val ++ && (core_if->snpsid < OTG_CORE_REV_2_81a ++ || !dwc_otg_get_param_thr_ctl(core_if))) { + valid = 0; -+ } else if(val && ((dwc_otg_get_param_tx_thr_length(core_if) / (1 << val)) < 4)) { ++ } else if (val ++ && ((dwc_otg_get_param_tx_thr_length(core_if) / (1 << val)) < ++ 4)) { + valid = 0; + } -+ if(valid == 0) { -+ if(dwc_otg_param_initialized(core_if->core_params->ahb_thr_ratio)) { -+ DWC_ERROR("%d invalid for parameter ahb_thr_ratio. Chack HW configuration.\n", val); ++ if (valid == 0) { ++ if (dwc_otg_param_initialized ++ (core_if->core_params->ahb_thr_ratio)) { ++ DWC_ERROR ++ ("%d invalid for parameter ahb_thr_ratio. Check HW configuration.\n", ++ val); + } + retval = -DWC_E_INVALID; + val = 0; @@ -45762,32 +55795,221 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if->core_params->ahb_thr_ratio = val; + return retval; +} ++ +int32_t dwc_otg_get_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if) +{ + return core_if->core_params->ahb_thr_ratio; +} + ++int dwc_otg_set_param_power_down(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ int valid = 1; ++ hwcfg4_data_t hwcfg4 = {.d32 = 0 }; ++ hwcfg4.d32 = DWC_READ_REG32(&core_if->core_global_regs->ghwcfg4); ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 3)) { ++ DWC_WARN("`%d' invalid for parameter `power_down'\n", val); ++ DWC_WARN("power_down must be 0 - 2\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ if ((val == 2) && (core_if->snpsid < OTG_CORE_REV_2_91a)) { ++ valid = 0; ++ } ++ if ((val == 3) ++ && ((core_if->snpsid < OTG_CORE_REV_3_00a) ++ || (hwcfg4.b.xhiber == 0))) { ++ valid = 0; ++ } ++ if (valid == 0) { ++ if (dwc_otg_param_initialized(core_if->core_params->power_down)) { ++ DWC_ERROR ++ ("%d invalid for parameter power_down. Check HW configuration.\n", ++ val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->power_down = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_power_down(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->power_down; ++} ++ ++int dwc_otg_set_param_reload_ctl(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ int valid = 1; ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `reload_ctl'\n", val); ++ DWC_WARN("reload_ctl must be 0 or 1\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ if ((val == 1) && (core_if->snpsid < OTG_CORE_REV_2_92a)) { ++ valid = 0; ++ } ++ if (valid == 0) { ++ if (dwc_otg_param_initialized(core_if->core_params->reload_ctl)) { ++ DWC_ERROR("%d invalid for parameter reload_ctl." ++ "Check HW configuration.\n", val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->reload_ctl = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_reload_ctl(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->reload_ctl; ++} ++ ++int dwc_otg_set_param_dev_out_nak(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ int valid = 1; ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `dev_out_nak'\n", val); ++ DWC_WARN("dev_out_nak must be 0 or 1\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ if ((val == 1) && ((core_if->snpsid < OTG_CORE_REV_2_93a) || ++ !(core_if->core_params->dma_desc_enable))) { ++ valid = 0; ++ } ++ if (valid == 0) { ++ if (dwc_otg_param_initialized(core_if->core_params->dev_out_nak)) { ++ DWC_ERROR("%d invalid for parameter dev_out_nak." ++ "Check HW configuration.\n", val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->dev_out_nak = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_dev_out_nak(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->dev_out_nak; ++} ++ ++int dwc_otg_set_param_cont_on_bna(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ int valid = 1; ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `cont_on_bna'\n", val); ++ DWC_WARN("cont_on_bna must be 0 or 1\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ if ((val == 1) && ((core_if->snpsid < OTG_CORE_REV_2_94a) || ++ !(core_if->core_params->dma_desc_enable))) { ++ valid = 0; ++ } ++ if (valid == 0) { ++ if (dwc_otg_param_initialized(core_if->core_params->cont_on_bna)) { ++ DWC_ERROR("%d invalid for parameter cont_on_bna." ++ "Check HW configuration.\n", val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->cont_on_bna = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_cont_on_bna(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->cont_on_bna; ++} ++ ++int dwc_otg_set_param_ahb_single(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ int valid = 1; ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `ahb_single'\n", val); ++ DWC_WARN("ahb_single must be 0 or 1\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ if ((val == 1) && (core_if->snpsid < OTG_CORE_REV_2_94a)) { ++ valid = 0; ++ } ++ if (valid == 0) { ++ if (dwc_otg_param_initialized(core_if->core_params->ahb_single)) { ++ DWC_ERROR("%d invalid for parameter ahb_single." ++ "Check HW configuration.\n", val); ++ } ++ retval = -DWC_E_INVALID; ++ val = 0; ++ } ++ core_if->core_params->ahb_single = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_ahb_single(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->ahb_single; ++} ++ ++int dwc_otg_set_param_otg_ver(dwc_otg_core_if_t * core_if, int32_t val) ++{ ++ int retval = 0; ++ ++ if (DWC_OTG_PARAM_TEST(val, 0, 1)) { ++ DWC_WARN("`%d' invalid for parameter `otg_ver'\n", val); ++ DWC_WARN ++ ("otg_ver must be 0(for OTG 1.3 support) or 1(for OTG 2.0 support)\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ core_if->core_params->otg_ver = val; ++ return retval; ++} ++ ++int32_t dwc_otg_get_param_otg_ver(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->core_params->otg_ver; ++} + +uint32_t dwc_otg_get_hnpstatus(dwc_otg_core_if_t * core_if) +{ + gotgctl_data_t otgctl; -+ otgctl.d32 = dwc_read_reg32(&core_if->core_global_regs->gotgctl); ++ otgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); + return otgctl.b.hstnegscs; +} + +uint32_t dwc_otg_get_srpstatus(dwc_otg_core_if_t * core_if) +{ + gotgctl_data_t otgctl; -+ otgctl.d32 = dwc_read_reg32(&core_if->core_global_regs->gotgctl); ++ otgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); + return otgctl.b.sesreqscs; +} + +void dwc_otg_set_hnpreq(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ gotgctl_data_t otgctl; -+ otgctl.d32 = dwc_read_reg32(&core_if->core_global_regs->gotgctl); -+ otgctl.b.hnpreq = val; -+ dwc_write_reg32(&core_if->core_global_regs->gotgctl, otgctl.d32); ++ if(core_if->otg_ver == 0) { ++ gotgctl_data_t otgctl; ++ otgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); ++ otgctl.b.hnpreq = val; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gotgctl, otgctl.d32); ++ } else { ++ core_if->otg_sts = val; ++ } +} + +uint32_t dwc_otg_get_gsnpsid(dwc_otg_core_if_t * core_if) @@ -45797,45 +56019,47 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + +uint32_t dwc_otg_get_mode(dwc_otg_core_if_t * core_if) +{ -+ gotgctl_data_t otgctl; -+ otgctl.d32 = dwc_read_reg32(&core_if->core_global_regs->gotgctl); -+ return otgctl.b.currmod; ++ gintsts_data_t gintsts; ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ return gintsts.b.curmode; +} + +uint32_t dwc_otg_get_hnpcapable(dwc_otg_core_if_t * core_if) +{ + gusbcfg_data_t usbcfg; -+ usbcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); + return usbcfg.b.hnpcap; +} + +void dwc_otg_set_hnpcapable(dwc_otg_core_if_t * core_if, uint32_t val) +{ + gusbcfg_data_t usbcfg; -+ usbcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); + usbcfg.b.hnpcap = val; -+ dwc_write_reg32(&core_if->core_global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, usbcfg.d32); +} + +uint32_t dwc_otg_get_srpcapable(dwc_otg_core_if_t * core_if) +{ + gusbcfg_data_t usbcfg; -+ usbcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); + return usbcfg.b.srpcap; +} + +void dwc_otg_set_srpcapable(dwc_otg_core_if_t * core_if, uint32_t val) +{ + gusbcfg_data_t usbcfg; -+ usbcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); + usbcfg.b.srpcap = val; -+ dwc_write_reg32(&core_if->core_global_regs->gusbcfg, usbcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, usbcfg.d32); +} + +uint32_t dwc_otg_get_devspeed(dwc_otg_core_if_t * core_if) +{ + dcfg_data_t dcfg; -+ dcfg.d32 = -1; //GRAYG ++ /* originally: dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); */ ++ ++ dcfg.d32 = -1; //GRAYG + DWC_DEBUGPL(DBG_CILV, "%s - core_if(%p)\n", __func__, core_if); + if (NULL == core_if) + DWC_ERROR("reg request with NULL core_if\n"); @@ -45855,7 +56079,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 + core_if, core_if->dev_if, + core_if->dev_if->dev_global_regs, + &core_if->dev_if->dev_global_regs->dcfg); -+ dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg); ++ dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); + } + return dcfg.b.devspd; +} @@ -45863,45 +56087,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +void dwc_otg_set_devspeed(dwc_otg_core_if_t * core_if, uint32_t val) +{ + dcfg_data_t dcfg; -+ dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg); ++ dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); + dcfg.b.devspd = val; -+ dwc_write_reg32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32); +} + +uint32_t dwc_otg_get_busconnected(dwc_otg_core_if_t * core_if) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(core_if->host_if->hprt0); + return hprt0.b.prtconnsts; +} + +uint32_t dwc_otg_get_enumspeed(dwc_otg_core_if_t * core_if) +{ + dsts_data_t dsts; -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + return dsts.b.enumspd; +} + +uint32_t dwc_otg_get_prtpower(dwc_otg_core_if_t * core_if) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(core_if->host_if->hprt0); + return hprt0.b.prtpwr; + +} + ++uint32_t dwc_otg_get_core_state(dwc_otg_core_if_t * core_if) ++{ ++ return core_if->hibernation_suspend; ++} ++ +void dwc_otg_set_prtpower(dwc_otg_core_if_t * core_if, uint32_t val) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtpwr = val; -+ dwc_write_reg32(core_if->host_if->hprt0, val); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); +} + +uint32_t dwc_otg_get_prtsuspend(dwc_otg_core_if_t * core_if) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(core_if->host_if->hprt0); + return hprt0.b.prtsusp; + +} @@ -45909,30 +56138,119 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +void dwc_otg_set_prtsuspend(dwc_otg_core_if_t * core_if, uint32_t val) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtsusp = val; -+ dwc_write_reg32(core_if->host_if->hprt0, val); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++} ++ ++uint32_t dwc_otg_get_fr_interval(dwc_otg_core_if_t * core_if) ++{ ++ hfir_data_t hfir; ++ hfir.d32 = DWC_READ_REG32(&core_if->host_if->host_global_regs->hfir); ++ return hfir.b.frint; ++ ++} ++ ++void dwc_otg_set_fr_interval(dwc_otg_core_if_t * core_if, uint32_t val) ++{ ++ hfir_data_t hfir; ++ uint32_t fram_int; ++ fram_int = calc_frame_interval(core_if); ++ hfir.d32 = DWC_READ_REG32(&core_if->host_if->host_global_regs->hfir); ++ if (!core_if->core_params->reload_ctl) { ++ DWC_WARN("\nCannot reload HFIR register.HFIR.HFIRRldCtrl bit is" ++ "not set to 1.\nShould load driver with reload_ctl=1" ++ " module parameter\n"); ++ return; ++ } ++ switch (fram_int) { ++ case 3750: ++ if ((val < 3350) || (val > 4150)) { ++ DWC_WARN("HFIR interval for HS core and 30 MHz" ++ "clock freq should be from 3350 to 4150\n"); ++ return; ++ } ++ break; ++ case 30000: ++ if ((val < 26820) || (val > 33180)) { ++ DWC_WARN("HFIR interval for FS/LS core and 30 MHz" ++ "clock freq should be from 26820 to 33180\n"); ++ return; ++ } ++ break; ++ case 6000: ++ if ((val < 5360) || (val > 6640)) { ++ DWC_WARN("HFIR interval for HS core and 48 MHz" ++ "clock freq should be from 5360 to 6640\n"); ++ return; ++ } ++ break; ++ case 48000: ++ if ((val < 42912) || (val > 53088)) { ++ DWC_WARN("HFIR interval for FS/LS core and 48 MHz" ++ "clock freq should be from 42912 to 53088\n"); ++ return; ++ } ++ break; ++ case 7500: ++ if ((val < 6700) || (val > 8300)) { ++ DWC_WARN("HFIR interval for HS core and 60 MHz" ++ "clock freq should be from 6700 to 8300\n"); ++ return; ++ } ++ break; ++ case 60000: ++ if ((val < 53640) || (val > 65536)) { ++ DWC_WARN("HFIR interval for FS/LS core and 60 MHz" ++ "clock freq should be from 53640 to 65536\n"); ++ return; ++ } ++ break; ++ default: ++ DWC_WARN("Unknown frame interval\n"); ++ return; ++ break; ++ ++ } ++ hfir.b.frint = val; ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hfir, hfir.d32); ++} ++ ++uint32_t dwc_otg_get_mode_ch_tim(dwc_otg_core_if_t * core_if) ++{ ++ hcfg_data_t hcfg; ++ hcfg.d32 = DWC_READ_REG32(&core_if->host_if->host_global_regs->hcfg); ++ return hcfg.b.modechtimen; ++ ++} ++ ++void dwc_otg_set_mode_ch_tim(dwc_otg_core_if_t * core_if, uint32_t val) ++{ ++ hcfg_data_t hcfg; ++ hcfg.d32 = DWC_READ_REG32(&core_if->host_if->host_global_regs->hcfg); ++ hcfg.b.modechtimen = val; ++ DWC_WRITE_REG32(&core_if->host_if->host_global_regs->hcfg, hcfg.d32); +} + +void dwc_otg_set_prtresume(dwc_otg_core_if_t * core_if, uint32_t val) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtres = val; -+ dwc_write_reg32(core_if->host_if->hprt0, val); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); +} + +uint32_t dwc_otg_get_remotewakesig(dwc_otg_core_if_t * core_if) +{ + dctl_data_t dctl; -+ dctl.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dctl); ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl); + return dctl.b.rmtwkupsig; +} + +uint32_t dwc_otg_get_lpm_portsleepstatus(dwc_otg_core_if_t * core_if) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + + DWC_ASSERT(! + ((core_if->lx_state == DWC_OTG_L1) ^ lpmcfg.b.prt_sleep_sts), @@ -45945,44 +56263,44 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +uint32_t dwc_otg_get_lpm_remotewakeenabled(dwc_otg_core_if_t * core_if) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + return lpmcfg.b.rem_wkup_en; +} + +uint32_t dwc_otg_get_lpmresponse(dwc_otg_core_if_t * core_if) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + return lpmcfg.b.appl_resp; +} + +void dwc_otg_set_lpmresponse(dwc_otg_core_if_t * core_if, uint32_t val) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + lpmcfg.b.appl_resp = val; -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); +} + +uint32_t dwc_otg_get_hsic_connect(dwc_otg_core_if_t * core_if) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + return lpmcfg.b.hsic_connect; +} + +void dwc_otg_set_hsic_connect(dwc_otg_core_if_t * core_if, uint32_t val) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + lpmcfg.b.hsic_connect = val; -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); +} + +uint32_t dwc_otg_get_inv_sel_hsic(dwc_otg_core_if_t * core_if) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + return lpmcfg.b.inv_sel_hsic; + +} @@ -45990,110 +56308,151 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-rpi-bootc-3 +void dwc_otg_set_inv_sel_hsic(dwc_otg_core_if_t * core_if, uint32_t val) +{ + glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + lpmcfg.b.inv_sel_hsic = val; -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); +} + +uint32_t dwc_otg_get_gotgctl(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->gotgctl); ++ return DWC_READ_REG32(&core_if->core_global_regs->gotgctl); +} + +void dwc_otg_set_gotgctl(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->gotgctl, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gotgctl, val); +} + +uint32_t dwc_otg_get_gusbcfg(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ return DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); +} + +void dwc_otg_set_gusbcfg(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->gusbcfg, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, val); +} + +uint32_t dwc_otg_get_grxfsiz(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->grxfsiz); ++ return DWC_READ_REG32(&core_if->core_global_regs->grxfsiz); +} + +void dwc_otg_set_grxfsiz(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->grxfsiz, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->grxfsiz, val); +} + +uint32_t dwc_otg_get_gnptxfsiz(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->gnptxfsiz); ++ return DWC_READ_REG32(&core_if->core_global_regs->gnptxfsiz); +} + +void dwc_otg_set_gnptxfsiz(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->gnptxfsiz, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gnptxfsiz, val); +} + +uint32_t dwc_otg_get_gpvndctl(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->gpvndctl); ++ return DWC_READ_REG32(&core_if->core_global_regs->gpvndctl); +} + +void dwc_otg_set_gpvndctl(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->gpvndctl, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gpvndctl, val); +} + +uint32_t dwc_otg_get_ggpio(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->ggpio); ++ return DWC_READ_REG32(&core_if->core_global_regs->ggpio); +} + +void dwc_otg_set_ggpio(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->ggpio, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->ggpio, val); +} + +uint32_t dwc_otg_get_hprt0(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(core_if->host_if->hprt0); ++ return DWC_READ_REG32(core_if->host_if->hprt0); + +} + +void dwc_otg_set_hprt0(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(core_if->host_if->hprt0, val); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, val); +} + +uint32_t dwc_otg_get_guid(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->guid); ++ return DWC_READ_REG32(&core_if->core_global_regs->guid); +} + +void dwc_otg_set_guid(dwc_otg_core_if_t * core_if, uint32_t val) +{ -+ dwc_write_reg32(&core_if->core_global_regs->guid, val); ++ DWC_WRITE_REG32(&core_if->core_global_regs->guid, val); +} + +uint32_t dwc_otg_get_hptxfsiz(dwc_otg_core_if_t * core_if) +{ -+ return dwc_read_reg32(&core_if->core_global_regs->hptxfsiz); ++ return DWC_READ_REG32(&core_if->core_global_regs->hptxfsiz); +} -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2012-07-15 20:29:19.070083357 +0200 -@@ -0,0 +1,1143 @@ ++ ++uint16_t dwc_otg_get_otg_version(dwc_otg_core_if_t * core_if) ++{ ++ return ((core_if->otg_ver == 1) ? (uint16_t)0x0200 : (uint16_t)0x0103); ++} ++ ++/** ++ * Start the SRP timer to detect when the SRP does not complete within ++ * 6 seconds. ++ * ++ * @param core_if the pointer to core_if strucure. ++ */ ++void dwc_otg_pcd_start_srp_timer(dwc_otg_core_if_t * core_if) ++{ ++ core_if->srp_timer_started = 1; ++ DWC_TIMER_SCHEDULE(core_if->srp_timer, 6000 /* 6 secs */ ); ++} ++ ++void dwc_otg_initiate_srp(dwc_otg_core_if_t * core_if) ++{ ++ uint32_t *addr = (uint32_t *) & (core_if->core_global_regs->gotgctl); ++ gotgctl_data_t mem; ++ gotgctl_data_t val; ++ ++ val.d32 = DWC_READ_REG32(addr); ++ if (val.b.sesreq) { ++ DWC_ERROR("Session Request Already active!\n"); ++ return; ++ } ++ ++ DWC_INFO("Session Request Initated\n"); //NOTICE ++ mem.d32 = DWC_READ_REG32(addr); ++ mem.b.sesreq = 1; ++ DWC_WRITE_REG32(addr, mem.d32); ++ ++ /* Start the SRP timer */ ++ dwc_otg_pcd_start_srp_timer(core_if); ++ return; ++} +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cil.h b/drivers/usb/host/dwc_otg/dwc_otg_cil.h +new file mode 100644 +index 0000000..d367cd1 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cil.h +@@ -0,0 +1,1464 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $ -+ * $Revision: #99 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237466 $ ++ * $Revision: #123 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. -+ * ++ * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and @@ -46103,7 +56462,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. -+ * ++ * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -46120,15 +56479,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 +#if !defined(__DWC_CIL_H__) +#define __DWC_CIL_H__ + -+//#define HW2937_WORKAROUND -+#define DBG_HW2937 0x400 -+ -+#include "dwc_os.h" +#include "dwc_list.h" +#include "dwc_otg_dbg.h" +#include "dwc_otg_regs.h" + +#include "dwc_otg_core_if.h" ++#include "dwc_otg_adp.h" + +/** + * @file @@ -46149,16 +56505,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + BM_CIRCULAR = 3, /* data buffer uses the circular DMA mode */ + BM_ALIGN = 4 /* data buffer is in buffer alignment mode */ +} data_buffer_mode_e; -+#endif //DWC_UTE_CFI ++#endif //DWC_UTE_CFI + -+/** Macros defined for DWC OTG HW Release verison */ ++/** Macros defined for DWC OTG HW Release version */ + +#define OTG_CORE_REV_2_60a 0x4F54260A +#define OTG_CORE_REV_2_71a 0x4F54271A +#define OTG_CORE_REV_2_72a 0x4F54272A +#define OTG_CORE_REV_2_80a 0x4F54280A +#define OTG_CORE_REV_2_81a 0x4F54281A -+#define OTG_CORE_REV_2_90a 0x4F54290A ++#define OTG_CORE_REV_2_90a 0x4F54290A ++#define OTG_CORE_REV_2_91a 0x4F54291A ++#define OTG_CORE_REV_2_92a 0x4F54292A ++#define OTG_CORE_REV_2_93a 0x4F54293A ++#define OTG_CORE_REV_2_94a 0x4F54294A ++#define OTG_CORE_REV_3_00a 0x4F54300A + +/** + * Information for each ISOC packet. @@ -46182,8 +56543,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + /** EP active. */ + unsigned active:1; + -+ /** Periodic Tx FIFO # for IN EPs For INTR EP set to 0 to use non-periodic Tx FIFO -+ If dedicated Tx FIFOs are enabled for all IN Eps - Tx FIFO # FOR IN EPs*/ ++ /** ++ * Periodic Tx FIFO # for IN EPs For INTR EP set to 0 to use non-periodic ++ * Tx FIFO. If dedicated Tx FIFOs are enabled Tx FIFO # FOR IN EPs*/ + unsigned tx_fifo_num:4; + /** EP type: 0 - Control, 1 - ISOC, 2 - BULK, 3 - INTR */ + unsigned type:2; @@ -46230,6 +56592,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + /** stall clear flag */ + unsigned stall_clear_flag:1; + ++ /** SETUP pkt cnt rollover flag for EP0 out*/ ++ unsigned stp_rollover; ++ +#ifdef DWC_UTE_CFI + /* The buffer mode */ + data_buffer_mode_e buff_mode; @@ -46245,9 +56610,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + uint32_t cfi_req_len; +#endif //DWC_UTE_CFI + ++/** Max DMA Descriptor count for any EP */ ++#define MAX_DMA_DESC_CNT 256 + /** Allocated DMA Desc count */ + uint32_t desc_cnt; ++ ++ /** bInterval */ ++ uint32_t bInterval; ++ /** Next frame num to setup next ISOC transfer */ ++ uint32_t frame_num; ++ /** Indicates SOF number overrun in DSTS */ ++ uint8_t frm_overrun; + ++#ifdef DWC_UTE_PER_IO ++ /** Next frame num for which will be setup DMA Desc */ ++ uint32_t xiso_frame_num; ++ /** bInterval */ ++ uint32_t xiso_bInterval; ++ /** Count of currently active transfers - shall be either 0 or 1 */ ++ int xiso_active_xfers; ++ int xiso_queued_xfers; ++#endif +#ifdef DWC_EN_ISOC + /** + * Variables specific for ISOC EPs @@ -46316,9 +56699,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + DWC_OTG_HC_XFER_AHB_ERR, + DWC_OTG_HC_XFER_PERIODIC_INCOMPLETE, + DWC_OTG_HC_XFER_URB_DEQUEUE -+#ifdef HW2937_WORKAROUND -+ , DWC_OTG_HC_XFER_PAUSE_IN -+#endif +} dwc_otg_halt_status_e; + +/** @@ -46387,7 +56767,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + /** Pointer to the current transfer buffer position. */ + uint8_t *xfer_buff; -+ /** ++ /** + * In Buffer DMA mode this buffer will be used + * if xfer_buff is not DWORD aligned. + */ @@ -46444,9 +56824,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + uint8_t hub_addr; /**< Address of high speed hub */ + + uint8_t port_addr; /**< Port of the low/full speed device */ -+ /** Split transaction position ++ /** Split transaction position + * One of the following values: -+ * - DWC_HCSPLIT_XACTPOS_MID ++ * - DWC_HCSPLIT_XACTPOS_MID + * - DWC_HCSPLIT_XACTPOS_BEGIN + * - DWC_HCSPLIT_XACTPOS_END + * - DWC_HCSPLIT_XACTPOS_ALL */ @@ -46470,19 +56850,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + /** Entry in list of host channels. */ + DWC_CIRCLEQ_ENTRY(dwc_hc) hc_list_entry; -+ ++ + /** @name Descriptor DMA support */ + /** @{ */ -+ ++ + /** Number of Transfer Descriptors */ + uint16_t ntd; -+ ++ + /** Descriptor List DMA address */ + dwc_dma_t desc_list_addr; -+ ++ + /** Scheduling micro-frame bitmap. */ + uint8_t schinfo; -+ ++ + /** @} */ +} dwc_hc_t; + @@ -46512,9 +56892,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + int32_t dma_enable; + + /** -+ * When DMA mode is enabled specifies whether to use address DMA or DMA Descritor mode for accessing the data -+ * FIFOs in device mode. The driver will automatically detect the value for this -+ * parameter if none is specified. ++ * When DMA mode is enabled specifies whether to use address DMA or DMA ++ * Descriptor mode for accessing the data FIFOs in device mode. The driver ++ * will automatically detect the value for this if none is specified. + * 0 - address DMA + * 1 - DMA Descriptor(default, if available) + */ @@ -46533,7 +56913,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + * 1 - Full Speed + */ + int32_t speed; -+ /** Specifies whether low power mode is supported when attached ++ /** Specifies whether low power mode is supported when attached + * to a Full Speed or Low Speed device in host mode. + * 0 - Don't support low power mode (default) + * 1 - Support low power mode @@ -46542,7 +56922,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + /** Specifies the PHY clock rate in low power mode when connected to a + * Low Speed device in host mode. This parameter is applicable only if -+ * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS ++ * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS + * then defaults to 6 MHZ otherwise 48 MHZ. + * + * 0 - 48 MHz @@ -46556,21 +56936,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + int32_t enable_dynamic_fifo; + -+ /** Total number of 4-byte words in the data FIFO memory. This -+ * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic ++ /** Total number of 4-byte words in the data FIFO memory. This ++ * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic + * Tx FIFOs. + * 32 to 32768 (default 8192) + * Note: The total FIFO memory depth in the FPGA configuration is 8192. + */ + int32_t data_fifo_size; + -+ /** Number of 4-byte words in the Rx FIFO in device mode when dynamic ++ /** Number of 4-byte words in the Rx FIFO in device mode when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1064) + */ + int32_t dev_rx_fifo_size; + -+ /** Number of 4-byte words in the non-periodic Tx FIFO in device mode ++ /** Number of 4-byte words in the non-periodic Tx FIFO in device mode + * when dynamic FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ @@ -46582,52 +56962,52 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + uint32_t dev_perio_tx_fifo_size[MAX_PERIO_FIFOS]; + -+ /** Number of 4-byte words in the Rx FIFO in host mode when dynamic ++ /** Number of 4-byte words in the Rx FIFO in host mode when dynamic + * FIFO sizing is enabled. -+ * 16 to 32768 (default 1024) ++ * 16 to 32768 (default 1024) + */ + int32_t host_rx_fifo_size; + -+ /** Number of 4-byte words in the non-periodic Tx FIFO in host mode -+ * when Dynamic FIFO sizing is enabled in the core. ++ /** Number of 4-byte words in the non-periodic Tx FIFO in host mode ++ * when Dynamic FIFO sizing is enabled in the core. + * 16 to 32768 (default 1024) + */ + int32_t host_nperio_tx_fifo_size; + -+ /** Number of 4-byte words in the host periodic Tx FIFO when dynamic -+ * FIFO sizing is enabled. ++ /** Number of 4-byte words in the host periodic Tx FIFO when dynamic ++ * FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ + int32_t host_perio_tx_fifo_size; + -+ /** The maximum transfer size supported in bytes. ++ /** The maximum transfer size supported in bytes. + * 2047 to 65,535 (default 65,535) + */ + int32_t max_transfer_size; + -+ /** The maximum number of packets in a transfer. ++ /** The maximum number of packets in a transfer. + * 15 to 511 (default 511) + */ + int32_t max_packet_count; + -+ /** The number of host channel registers to use. -+ * 1 to 16 (default 12) ++ /** The number of host channel registers to use. ++ * 1 to 16 (default 12) + * Note: The FPGA configuration supports a maximum of 12 host channels. + */ + int32_t host_channels; + -+ /** The number of endpoints in addition to EP0 available for device -+ * mode operations. -+ * 1 to 15 (default 6 IN and OUT) -+ * Note: The FPGA configuration supports a maximum of 6 IN and OUT ++ /** The number of endpoints in addition to EP0 available for device ++ * mode operations. ++ * 1 to 15 (default 6 IN and OUT) ++ * Note: The FPGA configuration supports a maximum of 6 IN and OUT + * endpoints in addition to EP0. + */ + int32_t dev_endpoints; + -+ /** ++ /** + * Specifies the type of PHY interface to use. By default, the driver + * will automatically detect the phy_type. -+ * ++ * + * 0 - Full Speed PHY + * 1 - UTMI+ (default) + * 2 - ULPI @@ -46635,13 +57015,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + int32_t phy_type; + + /** -+ * Specifies the UTMI+ Data Width. This parameter is ++ * Specifies the UTMI+ Data Width. This parameter is + * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI + * PHY_TYPE, this parameter indicates the data width between + * the MAC and the ULPI Wrapper.) Also, this parameter is + * applicable only if the OTG_HSPHY_WIDTH cC parameter was set + * to "8 and 16 bits", meaning that the core has been -+ * configured to work at either data path width. ++ * configured to work at either data path width. + * + * 8 or 16 bits (default 16) + */ @@ -46651,7 +57031,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + * Specifies whether the ULPI operates at double or single + * data rate. This parameter is only applicable if PHY_TYPE is + * ULPI. -+ * ++ * + * 0 - single data rate ULPI interface with 8 bit wide data + * bus (default) + * 1 - double data rate ULPI interface with 4 bit wide data @@ -46660,7 +57040,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + int32_t phy_ulpi_ddr; + + /** -+ * Specifies whether to use the internal or external supply to ++ * Specifies whether to use the internal or external supply to + * drive the vbus with a ULPI phy. + */ + int32_t phy_ulpi_ext_vbus; @@ -46678,9 +57058,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + int32_t ts_dline; + + /** -+ * Specifies whether dedicated transmit FIFOs are ++ * Specifies whether dedicated transmit FIFOs are + * enabled for non periodic IN endpoints in device mode -+ * 0 - No ++ * 0 - No + * 1 - Yes + */ + int32_t en_multiple_tx_fifo; @@ -46691,19 +57071,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + uint32_t dev_tx_fifo_size[MAX_TX_FIFOS]; + -+ /** Thresholding enable flag- ++ /** Thresholding enable flag- + * bit 0 - enable non-ISO Tx thresholding + * bit 1 - enable ISO Tx thresholding + * bit 2 - enable Rx thresholding + */ + uint32_t thr_ctl; + -+ /** Thresholding length for Tx ++ /** Thresholding length for Tx + * FIFOs in 32 bit DWORDs + */ + uint32_t tx_thr_length; + -+ /** Thresholding length for Rx ++ /** Thresholding length for Rx + * FIFOs in 32 bit DWORDs + */ + uint32_t rx_thr_length; @@ -46713,14 +57093,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + int32_t lpm_enable; + -+ /** Per Transfer Interrupt ++ /** Per Transfer Interrupt + * mode enable flag + * 1 - Enabled + * 0 - Disabled + */ + int32_t pti_enable; + -+ /** Multi Processor Interrupt ++ /** Multi Processor Interrupt + * mode enable flag + * 1 - Enabled + * 0 - Disabled @@ -46741,6 +57121,53 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + int32_t ahb_thr_ratio; + ++ /** ADP Support ++ * 1 - Enabled ++ * 0 - Disabled ++ */ ++ int32_t adp_supp_enable; ++ ++ /** HFIR Reload Control ++ * 0 - The HFIR cannot be reloaded dynamically. ++ * 1 - Allow dynamic reloading of the HFIR register during runtime. ++ */ ++ int32_t reload_ctl; ++ ++ /** DCFG: Enable device Out NAK ++ * 0 - The core does not set NAK after Bulk Out transfer complete. ++ * 1 - The core sets NAK after Bulk OUT transfer complete. ++ */ ++ int32_t dev_out_nak; ++ ++ /** DCFG: Enable Continue on BNA ++ * After receiving BNA interrupt the core disables the endpoint,when the ++ * endpoint is re-enabled by the application the core starts processing ++ * 0 - from the DOEPDMA descriptor ++ * 1 - from the descriptor which received the BNA. ++ */ ++ int32_t cont_on_bna; ++ ++ /** GAHBCFG: AHB Single Support ++ * This bit when programmed supports SINGLE transfers for remainder ++ * data in a transfer for DMA mode of operation. ++ * 0 - in this case the remainder data will be sent using INCR burst size. ++ * 1 - in this case the remainder data will be sent using SINGLE burst size. ++ */ ++ int32_t ahb_single; ++ ++ /** Core Power down mode ++ * 0 - No Power Down is enabled ++ * 1 - Reserved ++ * 2 - Complete Power Down (Hibernation) ++ */ ++ int32_t power_down; ++ ++ /** OTG revision supported ++ * 0 - OTG 1.3 revision ++ * 1 - OTG 2.0 revision ++ */ ++ int32_t otg_ver; ++ +} dwc_otg_core_params_t; + +#ifdef DEBUG @@ -46750,6 +57177,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + dwc_hc_t *hc; +} hc_xfer_info_t; +#endif ++ ++typedef struct ep_xfer_info { ++ struct dwc_otg_core_if *core_if; ++ dwc_ep_t *ep; ++ uint8_t state; ++} ep_xfer_info_t; +/* + * Device States + */ @@ -46764,6 +57197,44 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + DWC_OTG_L3 +} dwc_otg_lx_state_e; + ++struct dwc_otg_global_regs_backup { ++ uint32_t gotgctl_local; ++ uint32_t gintmsk_local; ++ uint32_t gahbcfg_local; ++ uint32_t gusbcfg_local; ++ uint32_t grxfsiz_local; ++ uint32_t gnptxfsiz_local; ++#ifdef CONFIG_USB_DWC_OTG_LPM ++ uint32_t glpmcfg_local; ++#endif ++ uint32_t gi2cctl_local; ++ uint32_t hptxfsiz_local; ++ uint32_t pcgcctl_local; ++ uint32_t gdfifocfg_local; ++ uint32_t dtxfsiz_local[MAX_EPS_CHANNELS]; ++ uint32_t gpwrdn_local; ++ uint32_t xhib_pcgcctl; ++ uint32_t xhib_gpwrdn; ++}; ++ ++struct dwc_otg_host_regs_backup { ++ uint32_t hcfg_local; ++ uint32_t haintmsk_local; ++ uint32_t hcintmsk_local[MAX_EPS_CHANNELS]; ++ uint32_t hprt0_local; ++ uint32_t hfir_local; ++}; ++ ++struct dwc_otg_dev_regs_backup { ++ uint32_t dcfg; ++ uint32_t dctl; ++ uint32_t daintmsk; ++ uint32_t diepmsk; ++ uint32_t doepmsk; ++ uint32_t diepctl[MAX_EPS_CHANNELS]; ++ uint32_t dieptsiz[MAX_EPS_CHANNELS]; ++ uint32_t diepdma[MAX_EPS_CHANNELS]; ++}; +/** + * The dwc_otg_core_if structure contains information needed to manage + * the DWC_otg controller acting in either host or device mode. It @@ -46795,7 +57266,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ + uint8_t srp_success; + uint8_t srp_timer_started; ++ /** Timer for SRP. If it expires before SRP is successful ++ * clear the SRP. */ ++ dwc_timer_t *srp_timer; + ++#ifdef DWC_DEV_SRPCAP ++ /* This timer is needed to power on the hibernated host core if SRP is not ++ * initiated on connected SRP capable device for limited period of time ++ */ ++ uint8_t pwron_timer_started; ++ dwc_timer_t *pwron_timer; ++#endif + /* Common configuration information */ + /** Power and Clock Gating Control Register */ + volatile uint32_t *pcgcctl; @@ -46837,6 +57318,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + hwcfg2_data_t hwcfg2; + hwcfg3_data_t hwcfg3; + hwcfg4_data_t hwcfg4; ++ fifosize_data_t hptxfsiz; + + /** Host and Device Configuration -- stored here for convenience.*/ + hcfg_data_t hcfg; @@ -46883,7 +57365,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + /** Timer object used for handling "Wakeup Detected" Interrupt */ + dwc_timer_t *wkp_timer; -+ ++ /** This arrays used for debug purposes for DEV OUT NAK enhancement */ ++ uint32_t start_doeptsiz_val[MAX_EPS_CHANNELS]; ++ ep_xfer_info_t ep_xfer_info[MAX_EPS_CHANNELS]; ++ dwc_timer_t *ep_xfer_timer[MAX_EPS_CHANNELS]; +#ifdef DEBUG + uint32_t start_hcchar_val[MAX_EPS_CHANNELS]; + @@ -46911,6 +57396,51 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + /** Lx state of device */ + dwc_otg_lx_state_e lx_state; + ++ /** Saved Core Global registers */ ++ struct dwc_otg_global_regs_backup *gr_backup; ++ /** Saved Host registers */ ++ struct dwc_otg_host_regs_backup *hr_backup; ++ /** Saved Device registers */ ++ struct dwc_otg_dev_regs_backup *dr_backup; ++ ++ /** Power Down Enable */ ++ uint32_t power_down; ++ ++ /** ADP support Enable */ ++ uint32_t adp_enable; ++ ++ /** ADP structure object */ ++ dwc_otg_adp_t adp; ++ ++ /** hibernation/suspend flag */ ++ int hibernation_suspend; ++ ++ /** Device mode extended hibernation flag */ ++ int xhib; ++ ++ /** OTG revision supported */ ++ uint32_t otg_ver; ++ ++ /** OTG status flag used for HNP polling */ ++ uint8_t otg_sts; ++ ++ /** Pointer to either hcd->lock or pcd->lock */ ++ dwc_spinlock_t *lock; ++ ++ /** Start predict NextEP based on Learning Queue if equal 1, ++ * also used as counter of disabled NP IN EP's */ ++ uint8_t start_predict; ++ ++ /** NextEp sequence, including EP0: nextep_seq[] = EP if non-periodic and ++ * active, 0xff otherwise */ ++ uint8_t nextep_seq[MAX_EPS_CHANNELS]; ++ ++ /** Index of fisrt EP in nextep_seq array which should be re-enabled **/ ++ uint8_t first_in_nextep_seq; ++ ++ /** Frame number while entering to ISR - needed for ISOCs **/ ++ uint32_t frame_num; ++ +}; + +#ifdef DEBUG @@ -46921,13 +57451,40 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 +#endif + +/* -+ * The following functions are functions for works ++ * This function is called when transfer is timed out on endpoint. ++ */ ++extern void ep_xfer_timeout(void *ptr); ++ ++/* ++ * The following functions are functions for works + * using during handling some interrupts + */ +extern void w_conn_id_status_change(void *p); + +extern void w_wakeup_detected(void *p); + ++/** Saves global register values into system memory. */ ++extern int dwc_otg_save_global_regs(dwc_otg_core_if_t * core_if); ++/** Saves device register values into system memory. */ ++extern int dwc_otg_save_dev_regs(dwc_otg_core_if_t * core_if); ++/** Saves host register values into system memory. */ ++extern int dwc_otg_save_host_regs(dwc_otg_core_if_t * core_if); ++/** Restore global register values. */ ++extern int dwc_otg_restore_global_regs(dwc_otg_core_if_t * core_if); ++/** Restore host register values. */ ++extern int dwc_otg_restore_host_regs(dwc_otg_core_if_t * core_if, int reset); ++/** Restore device register values. */ ++extern int dwc_otg_restore_dev_regs(dwc_otg_core_if_t * core_if, ++ int rem_wakeup); ++extern int restore_lpm_i2c_regs(dwc_otg_core_if_t * core_if); ++extern int restore_essential_regs(dwc_otg_core_if_t * core_if, int rmode, ++ int is_host); ++ ++extern int dwc_otg_host_hibernation_restore(dwc_otg_core_if_t * core_if, ++ int restore_mode, int reset); ++extern int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if, ++ int rem_wakeup, int reset); ++ +/* + * The following functions support initialization of the CIL driver component + * and the DWC_otg controller. @@ -46967,7 +57524,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + dwc_ep_t * ep); +extern void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t * core_if, + dwc_ep_t * ep); -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ +/**@}*/ + +/** @name Host CIL Functions @@ -46989,14 +57546,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 +extern void dwc_otg_enable_host_interrupts(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_disable_host_interrupts(dwc_otg_core_if_t * _core_if); + -+extern void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if, dwc_hc_t * hc); ++extern void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if, ++ dwc_hc_t * hc); ++ ++extern uint32_t calc_frame_interval(dwc_otg_core_if_t * core_if); + +/* Macro used to clear one channel interrupt */ +#define clear_hc_int(_hc_regs_, _intr_) \ +do { \ + hcint_data_t hcint_clear = {.d32 = 0}; \ + hcint_clear.b._intr_ = 1; \ -+ dwc_write_reg32(&(_hc_regs_)->hcint, hcint_clear.d32); \ ++ DWC_WRITE_REG32(&(_hc_regs_)->hcint, hcint_clear.d32); \ +} while (0) + +/* @@ -47010,18 +57570,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 +do { \ + hcintmsk_data_t hcintmsk = {.d32 = 0}; \ + hcintmsk.b._intr_ = 1; \ -+ dwc_modify_reg32(&(_hc_regs_)->hcintmsk, hcintmsk.d32, 0); \ ++ DWC_MODIFY_REG32(&(_hc_regs_)->hcintmsk, hcintmsk.d32, 0); \ +} while (0) -+ ++ +/** -+ * This function Reads HPRT0 in preparation to modify. It keeps the ++ * This function Reads HPRT0 in preparation to modify. It keeps the + * WC bits 0 so that if they are read as 1, they won't clear when you -+ * write it back ++ * write it back + */ +static inline uint32_t dwc_otg_read_hprt0(dwc_otg_core_if_t * _core_if) +{ + hprt0_data_t hprt0; -+ hprt0.d32 = dwc_read_reg32(_core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(_core_if->host_if->hprt0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; @@ -47049,8 +57609,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ +static inline uint32_t dwc_otg_read_core_intr(dwc_otg_core_if_t * core_if) +{ -+ return (dwc_read_reg32(&core_if->core_global_regs->gintsts) & -+ dwc_read_reg32(&core_if->core_global_regs->gintmsk)); ++ return (DWC_READ_REG32(&core_if->core_global_regs->gintsts) & ++ DWC_READ_REG32(&core_if->core_global_regs->gintmsk)); +} + +/** @@ -47058,7 +57618,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + */ +static inline uint32_t dwc_otg_read_otg_intr(dwc_otg_core_if_t * core_if) +{ -+ return (dwc_read_reg32(&core_if->core_global_regs->gotgint)); ++ return (DWC_READ_REG32(&core_if->core_global_regs->gotgint)); +} + +/** @@ -47072,13 +57632,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + uint32_t v; + + if (core_if->multiproc_int_enable) { -+ v = dwc_read_reg32(&core_if->dev_if->dev_global_regs-> -+ deachint) & dwc_read_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ deachintmsk); ++ v = DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->deachint) & ++ DWC_READ_REG32(&core_if-> ++ dev_if->dev_global_regs->deachintmsk); + } else { -+ v = dwc_read_reg32(&core_if->dev_if->dev_global_regs->daint) & -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->daintmsk); ++ v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) & ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk); + } + return (v & 0xffff); +} @@ -47093,13 +57653,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + uint32_t v; + + if (core_if->multiproc_int_enable) { -+ v = dwc_read_reg32(&core_if->dev_if->dev_global_regs-> -+ deachint) & dwc_read_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ deachintmsk); ++ v = DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->deachint) & ++ DWC_READ_REG32(&core_if-> ++ dev_if->dev_global_regs->deachintmsk); + } else { -+ v = dwc_read_reg32(&core_if->dev_if->dev_global_regs->daint) & -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->daintmsk); ++ v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) & ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk); + } + + return ((v & 0xffff0000) >> 16); @@ -47116,20 +57676,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + if (core_if->multiproc_int_enable) { + msk = -+ dwc_read_reg32(&dev_if->dev_global_regs-> -+ diepeachintmsk[ep->num]); ++ DWC_READ_REG32(&dev_if-> ++ dev_global_regs->diepeachintmsk[ep->num]); + emp = -+ dwc_read_reg32(&dev_if->dev_global_regs-> -+ dtknqr4_fifoemptymsk); ++ DWC_READ_REG32(&dev_if-> ++ dev_global_regs->dtknqr4_fifoemptymsk); + msk |= ((emp >> ep->num) & 0x1) << 7; -+ v = dwc_read_reg32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; ++ v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; + } else { -+ msk = dwc_read_reg32(&dev_if->dev_global_regs->diepmsk); ++ msk = DWC_READ_REG32(&dev_if->dev_global_regs->diepmsk); + emp = -+ dwc_read_reg32(&dev_if->dev_global_regs-> -+ dtknqr4_fifoemptymsk); ++ DWC_READ_REG32(&dev_if-> ++ dev_global_regs->dtknqr4_fifoemptymsk); + msk |= ((emp >> ep->num) & 0x1) << 7; -+ v = dwc_read_reg32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; ++ v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; + } + + return v; @@ -47147,20 +57707,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + + if (_core_if->multiproc_int_enable) { + msk.d32 = -+ dwc_read_reg32(&dev_if->dev_global_regs-> -+ doepeachintmsk[_ep->num]); ++ DWC_READ_REG32(&dev_if-> ++ dev_global_regs->doepeachintmsk[_ep->num]); + if (_core_if->pti_enh_enable) { + msk.b.pktdrpsts = 1; + } -+ v = dwc_read_reg32(&dev_if->out_ep_regs[_ep->num]-> -+ doepint) & msk.d32; ++ v = DWC_READ_REG32(&dev_if-> ++ out_ep_regs[_ep->num]->doepint) & msk.d32; + } else { -+ msk.d32 = dwc_read_reg32(&dev_if->dev_global_regs->doepmsk); ++ msk.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->doepmsk); + if (_core_if->pti_enh_enable) { + msk.b.pktdrpsts = 1; + } -+ v = dwc_read_reg32(&dev_if->out_ep_regs[_ep->num]-> -+ doepint) & msk.d32; ++ v = DWC_READ_REG32(&dev_if-> ++ out_ep_regs[_ep->num]->doepint) & msk.d32; + } + return v; +} @@ -47171,30 +57731,30 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 +static inline uint32_t dwc_otg_read_host_all_channels_intr(dwc_otg_core_if_t * + _core_if) +{ -+ return (dwc_read_reg32(&_core_if->host_if->host_global_regs->haint)); ++ return (DWC_READ_REG32(&_core_if->host_if->host_global_regs->haint)); +} + +static inline uint32_t dwc_otg_read_host_channel_intr(dwc_otg_core_if_t * + _core_if, dwc_hc_t * _hc) +{ -+ return (dwc_read_reg32 ++ return (DWC_READ_REG32 + (&_core_if->host_if->hc_regs[_hc->hc_num]->hcint)); +} + +/** + * This function returns the mode of the operation, host or device. + * -+ * @return 0 - Device Mode, 1 - Host Mode ++ * @return 0 - Device Mode, 1 - Host Mode + */ +static inline uint32_t dwc_otg_mode(dwc_otg_core_if_t * _core_if) +{ -+ return (dwc_read_reg32(&_core_if->core_global_regs->gintsts) & 0x1); ++ return (DWC_READ_REG32(&_core_if->core_global_regs->gintsts) & 0x1); +} + +/**@}*/ + +/** -+ * DWC_otg CIL callback structure. This structure allows the HCD and ++ * DWC_otg CIL callback structure. This structure allows the HCD and + * PCD to register functions used for starting and stopping the PCD + * and HCD for role change on for a DRD. + */ @@ -47226,16 +57786,138 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-rpi-bootc-3 + dwc_otg_cil_callbacks_t * _cb, + void *_p); + ++void dwc_otg_initiate_srp(dwc_otg_core_if_t * core_if); ++ ++////////////////////////////////////////////////////////////////////// ++/** Start the HCD. Helper function for using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_start(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->start) { ++ core_if->hcd_cb->start(core_if->hcd_cb->p); ++ } ++} ++ ++/** Stop the HCD. Helper function for using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_stop(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->stop) { ++ core_if->hcd_cb->stop(core_if->hcd_cb->p); ++ } ++} ++ ++/** Disconnect the HCD. Helper function for using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_disconnect(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->disconnect) { ++ core_if->hcd_cb->disconnect(core_if->hcd_cb->p); ++ } ++} ++ ++/** Inform the HCD the a New Session has begun. Helper function for ++ * using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_session_start(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->session_start) { ++ core_if->hcd_cb->session_start(core_if->hcd_cb->p); ++ } ++} ++ ++#ifdef CONFIG_USB_DWC_OTG_LPM ++/** ++ * Inform the HCD about LPM sleep. ++ * Helper function for using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_sleep(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->sleep) { ++ core_if->hcd_cb->sleep(core_if->hcd_cb->p); ++ } ++} +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2012-07-15 20:29:19.135084581 +0200 -@@ -0,0 +1,846 @@ ++ ++/** Resume the HCD. Helper function for using the HCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_hcd_resume(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->hcd_cb && core_if->hcd_cb->resume_wakeup) { ++ core_if->hcd_cb->resume_wakeup(core_if->hcd_cb->p); ++ } ++} ++ ++/** Start the PCD. Helper function for using the PCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_pcd_start(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->pcd_cb && core_if->pcd_cb->start) { ++ core_if->pcd_cb->start(core_if->pcd_cb->p); ++ } ++} ++ ++/** Stop the PCD. Helper function for using the PCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_pcd_stop(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->pcd_cb && core_if->pcd_cb->stop) { ++ core_if->pcd_cb->stop(core_if->pcd_cb->p); ++ } ++} ++ ++/** Suspend the PCD. Helper function for using the PCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_pcd_suspend(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->pcd_cb && core_if->pcd_cb->suspend) { ++ core_if->pcd_cb->suspend(core_if->pcd_cb->p); ++ } ++} ++ ++/** Resume the PCD. Helper function for using the PCD callbacks. ++ * ++ * @param core_if Programming view of DWC_otg controller. ++ */ ++static inline void cil_pcd_resume(dwc_otg_core_if_t * core_if) ++{ ++ if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { ++ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); ++ } ++} ++ ++////////////////////////////////////////////////////////////////////// ++ ++#endif +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c b/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c +new file mode 100644 +index 0000000..b861b55 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c +@@ -0,0 +1,1571 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $ -+ * $Revision: #15 $ -+ * $Date: 2009/04/15 $ -+ * $Change: 1234129 $ ++ * $Revision: #32 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -47275,6 +57957,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo +#include "dwc_os.h" +#include "dwc_otg_regs.h" +#include "dwc_otg_cil.h" ++#include "dwc_otg_driver.h" ++#include "dwc_otg_pcd.h" ++#include "dwc_otg_hcd.h" ++#include "dwc_otg_mphi_fix.h" ++ ++extern bool fiq_fix_enable; + +#ifdef DEBUG +inline const char *op_state_str(dwc_otg_core_if_t * core_if) @@ -47300,125 +57988,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + return 1; +} + -+/** Start the HCD. Helper function for using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_start(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->start) { -+ core_if->hcd_cb->start(core_if->hcd_cb->p); -+ } -+} -+ -+/** Stop the HCD. Helper function for using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_stop(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->stop) { -+ core_if->hcd_cb->stop(core_if->hcd_cb->p); -+ } -+} -+ -+/** Disconnect the HCD. Helper function for using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_disconnect(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->disconnect) { -+ core_if->hcd_cb->disconnect(core_if->hcd_cb->p); -+ } -+} -+ -+/** Inform the HCD the a New Session has begun. Helper function for -+ * using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_session_start(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->session_start) { -+ core_if->hcd_cb->session_start(core_if->hcd_cb->p); -+ } -+} -+ -+#ifdef CONFIG_USB_DWC_OTG_LPM -+/** -+ * Inform the HCD about LPM sleep. -+ * Helper function for using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_sleep(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->sleep) { -+ core_if->hcd_cb->sleep(core_if->hcd_cb->p); -+ } -+} -+#endif -+ -+/** Resume the HCD. Helper function for using the HCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void hcd_resume(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->hcd_cb && core_if->hcd_cb->resume_wakeup) { -+ core_if->hcd_cb->resume_wakeup(core_if->hcd_cb->p); -+ } -+} -+ -+/** Start the PCD. Helper function for using the PCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void pcd_start(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->pcd_cb && core_if->pcd_cb->start) { -+ core_if->pcd_cb->start(core_if->pcd_cb->p); -+ } -+} -+ -+/** Stop the PCD. Helper function for using the PCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void pcd_stop(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->pcd_cb && core_if->pcd_cb->stop) { -+ core_if->pcd_cb->stop(core_if->pcd_cb->p); -+ } -+} -+ -+/** Suspend the PCD. Helper function for using the PCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void pcd_suspend(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->pcd_cb && core_if->pcd_cb->suspend) { -+ core_if->pcd_cb->suspend(core_if->pcd_cb->p); -+ } -+} -+ -+/** Resume the PCD. Helper function for using the PCD callbacks. -+ * -+ * @param core_if Programming view of DWC_otg controller. -+ */ -+static inline void pcd_resume(dwc_otg_core_if_t * core_if) -+{ -+ if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { -+ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); -+ } -+} -+ +/** + * This function handles the OTG Interrupts. It reads the OTG + * Interrupt Register (GOTGINT) to determine what interrupt has @@ -47432,9 +58005,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + gotgint_data_t gotgint; + gotgctl_data_t gotgctl; + gintmsk_data_t gintmsk; ++ gpwrdn_data_t gpwrdn; + -+ gotgint.d32 = dwc_read_reg32(&global_regs->gotgint); -+ gotgctl.d32 = dwc_read_reg32(&global_regs->gotgctl); ++ gotgint.d32 = DWC_READ_REG32(&global_regs->gotgint); ++ gotgctl.d32 = DWC_READ_REG32(&global_regs->gotgctl); + DWC_DEBUGPL(DBG_CIL, "++OTG Interrupt gotgint=%0x [%s]\n", gotgint.d32, + op_state_str(core_if)); + @@ -47442,10 +58016,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + DWC_DEBUGPL(DBG_ANY, " ++OTG Interrupt: " + "Session End Detected++ (%s)\n", + op_state_str(core_if)); -+ gotgctl.d32 = dwc_read_reg32(&global_regs->gotgctl); ++ gotgctl.d32 = DWC_READ_REG32(&global_regs->gotgctl); + + if (core_if->op_state == B_HOST) { -+ pcd_start(core_if); ++ cil_pcd_start(core_if); + core_if->op_state = B_PERIPHERAL; + } else { + /* If not B_HOST and Device HNP still set. HNP @@ -47460,26 +58034,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Reset PCD and Gadget driver to a + * clean state. */ + core_if->lx_state = DWC_OTG_L0; -+ pcd_stop(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_pcd_stop(core_if); ++ DWC_SPINLOCK(core_if->lock); ++ ++ if (core_if->adp_enable) { ++ if (core_if->power_down == 2) { ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs-> ++ gpwrdn, gpwrdn.d32, 0); ++ } ++ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ ++ dwc_otg_adp_sense_start(core_if); ++ } + } ++ + gotgctl.d32 = 0; + gotgctl.b.devhnpen = 1; -+ dwc_modify_reg32(&global_regs->gotgctl, gotgctl.d32, 0); ++ DWC_MODIFY_REG32(&global_regs->gotgctl, gotgctl.d32, 0); + } + if (gotgint.b.sesreqsucstschng) { + DWC_DEBUGPL(DBG_ANY, " ++OTG Interrupt: " + "Session Reqeust Success Status Change++\n"); -+ gotgctl.d32 = dwc_read_reg32(&global_regs->gotgctl); ++ gotgctl.d32 = DWC_READ_REG32(&global_regs->gotgctl); + if (gotgctl.b.sesreqscs) { ++ + if ((core_if->core_params->phy_type == + DWC_PHY_TYPE_PARAM_FS) && (core_if->core_params->i2c_enable)) { + core_if->srp_success = 1; + } else { -+ pcd_resume(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_pcd_resume(core_if); ++ DWC_SPINLOCK(core_if->lock); + /* Clear Session Request */ + gotgctl.d32 = 0; + gotgctl.b.sesreq = 1; -+ dwc_modify_reg32(&global_regs->gotgctl, ++ DWC_MODIFY_REG32(&global_regs->gotgctl, + gotgctl.d32, 0); + } + } @@ -47487,7 +58085,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + if (gotgint.b.hstnegsucstschng) { + /* Print statements during the HNP interrupt handling + * can cause it to fail.*/ -+ gotgctl.d32 = dwc_read_reg32(&global_regs->gotgctl); ++ gotgctl.d32 = DWC_READ_REG32(&global_regs->gotgctl); ++ /* WA for 3.00a- HW is not setting cur_mode, even sometimes ++ * this does not help*/ ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) ++ dwc_udelay(100); + if (gotgctl.b.hstnegscs) { + if (dwc_otg_is_host_mode(core_if)) { + core_if->op_state = B_HOST; @@ -47503,20 +58105,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + */ + gintmsk.d32 = 0; + gintmsk.b.sofintr = 1; -+ dwc_modify_reg32(&global_regs->gintmsk, ++ DWC_MODIFY_REG32(&global_regs->gintmsk, + gintmsk.d32, 0); -+ pcd_stop(core_if); ++ /* Call callback function with spin lock released */ ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_pcd_stop(core_if); + /* + * Initialize the Core for Host mode. + */ -+ hcd_start(core_if); ++ cil_hcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = B_HOST; + } + } else { + gotgctl.d32 = 0; + gotgctl.b.hnpreq = 1; + gotgctl.b.devhnpen = 1; -+ dwc_modify_reg32(&global_regs->gotgctl, gotgctl.d32, 0); ++ DWC_MODIFY_REG32(&global_regs->gotgctl, gotgctl.d32, 0); + DWC_DEBUGPL(DBG_ANY, "HNP Failed\n"); + __DWC_ERROR("Device Not Connected/Responding\n"); + } @@ -47534,8 +58139,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + if (dwc_otg_is_device_mode(core_if)) { + DWC_DEBUGPL(DBG_ANY, "a_suspend->a_peripheral (%d)\n", + core_if->op_state); -+ hcd_disconnect(core_if); -+ pcd_start(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_hcd_disconnect(core_if); ++ cil_pcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = A_PERIPHERAL; + } else { + /* @@ -47549,9 +58156,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + */ + gintmsk.d32 = 0; + gintmsk.b.sofintr = 1; -+ dwc_modify_reg32(&global_regs->gintmsk, gintmsk.d32, 0); -+ pcd_stop(core_if); -+ hcd_start(core_if); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, gintmsk.d32, 0); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_pcd_stop(core_if); ++ cil_hcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = A_HOST; + } + } @@ -47564,7 +58173,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + } + + /* Clear GOTGINT */ -+ dwc_write_reg32(&core_if->core_global_regs->gotgint, gotgint.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gotgint, gotgint.d32); + + return 1; +} @@ -47575,7 +58184,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + uint32_t count = 0; + gotgctl_data_t gotgctl = {.d32 = 0 }; + -+ gotgctl.d32 = dwc_read_reg32(&core_if->core_global_regs->gotgctl); ++ gotgctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->gotgctl); + DWC_DEBUGPL(DBG_CIL, "gotgctl=%0x\n", gotgctl.d32); + DWC_DEBUGPL(DBG_CIL, "gotgctl.b.conidsts=%d\n", gotgctl.b.conidsts); + @@ -47595,7 +58204,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + core_if->op_state = B_PERIPHERAL; + dwc_otg_core_init(core_if); + dwc_otg_enable_global_interrupts(core_if); -+ pcd_start(core_if); ++ cil_pcd_start(core_if); + } else { + /* A-Device connector (Host Mode) */ + while (!dwc_otg_is_host_mode(core_if)) { @@ -47614,7 +58223,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + */ + dwc_otg_core_init(core_if); + dwc_otg_enable_global_interrupts(core_if); -+ hcd_start(core_if); ++ cil_hcd_start(core_if); + } +} + @@ -47622,7 +58231,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + * This function handles the Connector ID Status Change Interrupt. It + * reads the OTG Interrupt Register (GOTCTL) to determine whether this + * is a Device to Host Mode transition or a Host Mode to Device -+ * Transition. ++ * Transition. + * + * This only occurs when the cable is connected/removed from the PHY + * connector. @@ -47643,21 +58252,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + gintsts_data_t gintsts = {.d32 = 0 }; + + gintmsk.b.sofintr = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, gintmsk.d32, 0); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, gintmsk.d32, 0); + + DWC_DEBUGPL(DBG_CIL, + " ++Connector ID Status Change Interrupt++ (%s)\n", + (dwc_otg_is_host_mode(core_if) ? "Host" : "Device")); ++ ++ DWC_SPINUNLOCK(core_if->lock); + + /* + * Need to schedule a work, as there are possible DELAY function calls ++ * Release lock before scheduling workq as it holds spinlock during scheduling + */ ++ + DWC_WORKQ_SCHEDULE(core_if->wq_otg, w_conn_id_status_change, + core_if, "connection id status change"); ++ DWC_SPINLOCK(core_if->lock); + + /* Set flag and clear interrupt */ + gintsts.b.conidstschng = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -47673,7 +58287,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + */ +int32_t dwc_otg_handle_session_req_intr(dwc_otg_core_if_t * core_if) +{ -+ hprt0_data_t hprt0; + gintsts_data_t gintsts; + +#ifndef DWC_HOST_ONLY @@ -47682,23 +58295,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + if (dwc_otg_is_device_mode(core_if)) { + DWC_PRINTF("SRP: Device mode\n"); + } else { ++ hprt0_data_t hprt0; + DWC_PRINTF("SRP: Host mode\n"); + + /* Turn on the port power bit. */ + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtpwr = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + + /* Start the Connection timer. So a message can be displayed + * if connect does not occur within 10 seconds. */ -+ hcd_session_start(core_if); ++ cil_hcd_session_start(core_if); + } +#endif + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -47715,22 +58329,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + pcgcctl_data_t pcgcctl = {.d32 = 0 }; + /* Restart the Phy Clock */ + pcgcctl.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, pcgcctl.d32, 0); ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); + dwc_udelay(10); -+#endif //0 ++#endif //0 + hprt0.d32 = dwc_otg_read_hprt0(core_if); + DWC_DEBUGPL(DBG_ANY, "Resume: HPRT0=%0x\n", hprt0.d32); +// dwc_mdelay(70); + hprt0.b.prtres = 0; /* Resume */ -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + DWC_DEBUGPL(DBG_ANY, "Clear Resume: HPRT0=%0x\n", -+ dwc_read_reg32(core_if->host_if->hprt0)); ++ DWC_READ_REG32(core_if->host_if->hprt0)); + -+ hcd_resume(core_if); ++ cil_hcd_resume(core_if); + + /** Change to L0 state*/ + core_if->lx_state = DWC_OTG_L0; -+ +} + +/** @@ -47752,42 +58365,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + if (dwc_otg_is_device_mode(core_if)) { + dctl_data_t dctl = {.d32 = 0 }; + DWC_DEBUGPL(DBG_PCD, "DSTS=0x%0x\n", -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs-> + dsts)); + if (core_if->lx_state == DWC_OTG_L2) { +#ifdef PARTIAL_POWER_DOWN + if (core_if->hwcfg4.b.power_optimiz) { + pcgcctl_data_t power = {.d32 = 0 }; + -+ power.d32 = dwc_read_reg32(core_if->pcgcctl); ++ power.d32 = DWC_READ_REG32(core_if->pcgcctl); + DWC_DEBUGPL(DBG_CIL, "PCGCCTL=%0x\n", + power.d32); + + power.b.stoppclk = 0; -+ dwc_write_reg32(core_if->pcgcctl, power.d32); ++ DWC_WRITE_REG32(core_if->pcgcctl, power.d32); + + power.b.pwrclmp = 0; -+ dwc_write_reg32(core_if->pcgcctl, power.d32); ++ DWC_WRITE_REG32(core_if->pcgcctl, power.d32); + + power.b.rstpdwnmodule = 0; -+ dwc_write_reg32(core_if->pcgcctl, power.d32); ++ DWC_WRITE_REG32(core_if->pcgcctl, power.d32); + } +#endif -+ /* Clear the Remote Wakeup Signalling */ ++ /* Clear the Remote Wakeup Signaling */ + dctl.b.rmtwkupsig = 1; -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + dctl, dctl.d32, 0); + ++ DWC_SPINUNLOCK(core_if->lock); + if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { -+ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb-> -+ p); ++ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); + } ++ DWC_SPINLOCK(core_if->lock); + } else { + glpmcfg_data_t lpmcfg; + lpmcfg.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + lpmcfg.b.hird_thres &= (~(1 << 4)); -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, + lpmcfg.d32); + } + /** Change to L0 state*/ @@ -47798,8 +58412,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + + /* Restart the Phy Clock */ + pcgcctl.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, pcgcctl.d32, 0); -+ ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); + DWC_TIMER_SCHEDULE(core_if->wkp_timer, 71); + } else { + /** Change to L0 state*/ @@ -47810,14 +58423,432 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} + -+/** ++/** ++ * This interrupt indicates that the Wakeup Logic has detected a ++ * Device disconnect. ++ */ ++static int32_t dwc_otg_handle_pwrdn_disconnect_intr(dwc_otg_core_if_t *core_if) ++{ ++ gpwrdn_data_t gpwrdn = { .d32 = 0 }; ++ gpwrdn_data_t gpwrdn_temp = { .d32 = 0 }; ++ gpwrdn_temp.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ ++ DWC_PRINTF("%s called\n", __FUNCTION__); ++ ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++ ++ /* Switch on the voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Disable power clamps*/ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Remove reset the core signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ core_if->hibernation_suspend = 0; ++ ++ /* Disable PMU */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ if (gpwrdn_temp.b.idsts) { ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ } else { ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++ } ++ ++ return 1; ++} ++ ++/** ++ * This interrupt indicates that the Wakeup Logic has detected a ++ * remote wakeup sequence. ++ */ ++static int32_t dwc_otg_handle_pwrdn_wakeup_detected_intr(dwc_otg_core_if_t * core_if) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ DWC_DEBUGPL(DBG_ANY, ++ "++Powerdown Remote Wakeup Detected Interrupt++\n"); ++ ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++ ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (gpwrdn.b.idsts) { // Device Mode ++ if ((core_if->power_down == 2) ++ && (core_if->hibernation_suspend == 1)) { ++ dwc_otg_device_hibernation_restore(core_if, 0, 0); ++ } ++ } else { ++ if ((core_if->power_down == 2) ++ && (core_if->hibernation_suspend == 1)) { ++ dwc_otg_host_hibernation_restore(core_if, 1, 0); ++ } ++ } ++ return 1; ++} ++ ++static int32_t dwc_otg_handle_pwrdn_idsts_change(dwc_otg_device_t *otg_dev) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn_temp = {.d32 = 0 }; ++ dwc_otg_core_if_t *core_if = otg_dev->core_if; ++ ++ DWC_DEBUGPL(DBG_ANY, "%s called\n", __FUNCTION__); ++ gpwrdn_temp.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (core_if->power_down == 2) { ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++ DWC_DEBUGPL(DBG_ANY, "Exit from hibernation on ID sts change\n"); ++ /* Switch on the voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Remove reset the core signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /*Indicates that we are exiting from hibernation */ ++ core_if->hibernation_suspend = 0; ++ ++ /* Disable PMU */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ gpwrdn.d32 = core_if->gr_backup->gpwrdn_local; ++ if (gpwrdn.b.dis_vbus == 1) { ++ gpwrdn.d32 = 0; ++ gpwrdn.b.dis_vbus = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ } ++ ++ if (gpwrdn_temp.b.idsts) { ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ } else { ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++ } ++ } ++ ++ if (core_if->adp_enable) { ++ uint8_t is_host = 0; ++ DWC_SPINUNLOCK(core_if->lock); ++ /* Change the core_if's lock to hcd/pcd lock depend on mode? */ ++#ifndef DWC_HOST_ONLY ++ if (gpwrdn_temp.b.idsts) ++ core_if->lock = otg_dev->pcd->lock; ++#endif ++#ifndef DWC_DEVICE_ONLY ++ if (!gpwrdn_temp.b.idsts) { ++ core_if->lock = otg_dev->hcd->lock; ++ is_host = 1; ++ } ++#endif ++ DWC_PRINTF("RESTART ADP\n"); ++ if (core_if->adp.probe_enabled) ++ dwc_otg_adp_probe_stop(core_if); ++ if (core_if->adp.sense_enabled) ++ dwc_otg_adp_sense_stop(core_if); ++ if (core_if->adp.sense_timer_started) ++ DWC_TIMER_CANCEL(core_if->adp.sense_timer); ++ if (core_if->adp.vbuson_timer_started) ++ DWC_TIMER_CANCEL(core_if->adp.vbuson_timer); ++ core_if->adp.probe_timer_values[0] = -1; ++ core_if->adp.probe_timer_values[1] = -1; ++ core_if->adp.sense_timer_started = 0; ++ core_if->adp.vbuson_timer_started = 0; ++ core_if->adp.probe_counter = 0; ++ core_if->adp.gpwrdn = 0; ++ ++ /* Disable PMU and restart ADP */ ++ gpwrdn_temp.d32 = 0; ++ gpwrdn_temp.b.pmuactv = 1; ++ gpwrdn_temp.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ DWC_PRINTF("Check point 1\n"); ++ dwc_mdelay(110); ++ dwc_otg_adp_start(core_if, is_host); ++ DWC_SPINLOCK(core_if->lock); ++ } ++ ++ ++ return 1; ++} ++ ++static int32_t dwc_otg_handle_pwrdn_session_change(dwc_otg_core_if_t * core_if) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ int32_t otg_cap_param = core_if->core_params->otg_cap; ++ DWC_DEBUGPL(DBG_ANY, "%s called\n", __FUNCTION__); ++ ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (core_if->power_down == 2) { ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++ ++ if ((otg_cap_param != DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE || ++ otg_cap_param != DWC_OTG_CAP_PARAM_SRP_ONLY_CAPABLE) && ++ gpwrdn.b.bsessvld == 0) { ++ /* Save gpwrdn register for further usage if stschng interrupt */ ++ core_if->gr_backup->gpwrdn_local = ++ DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ /*Exit from ISR and wait for stschng interrupt with bsessvld = 1 */ ++ return 1; ++ } ++ ++ /* Switch on the voltage to the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Remove reset the core signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /*Indicates that we are exiting from hibernation */ ++ core_if->hibernation_suspend = 0; ++ ++ /* Disable PMU */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ ++ if (otg_cap_param == DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE || ++ otg_cap_param == DWC_OTG_CAP_PARAM_SRP_ONLY_CAPABLE) { ++ /* ++ * Initiate SRP after initial ADP probe. ++ */ ++ dwc_otg_initiate_srp(core_if); ++ } ++ } ++ ++ return 1; ++} ++/** ++ * This interrupt indicates that the Wakeup Logic has detected a ++ * status change either on IDDIG or BSessVld. ++ */ ++static uint32_t dwc_otg_handle_pwrdn_stschng_intr(dwc_otg_device_t *otg_dev) ++{ ++ int retval; ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn_temp = {.d32 = 0 }; ++ dwc_otg_core_if_t *core_if = otg_dev->core_if; ++ ++ DWC_PRINTF("%s called\n", __FUNCTION__); ++ ++ if (core_if->power_down == 2) { ++ if (core_if->hibernation_suspend <= 0) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } else ++ gpwrdn_temp.d32 = core_if->gr_backup->gpwrdn_local; ++ ++ } else { ++ gpwrdn_temp.d32 = core_if->adp.gpwrdn; ++ } ++ ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ ++ if (gpwrdn.b.idsts ^ gpwrdn_temp.b.idsts) { ++ retval = dwc_otg_handle_pwrdn_idsts_change(otg_dev); ++ } else if (gpwrdn.b.bsessvld ^ gpwrdn_temp.b.bsessvld) { ++ retval = dwc_otg_handle_pwrdn_session_change(core_if); ++ } ++ ++ return retval; ++} ++ ++/** ++ * This interrupt indicates that the Wakeup Logic has detected a ++ * SRP. ++ */ ++static int32_t dwc_otg_handle_pwrdn_srp_intr(dwc_otg_core_if_t * core_if) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ ++ DWC_PRINTF("%s called\n", __FUNCTION__); ++ ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return 1; ++ } ++#ifdef DWC_DEV_SRPCAP ++ if (core_if->pwron_timer_started) { ++ core_if->pwron_timer_started = 0; ++ DWC_TIMER_CANCEL(core_if->pwron_timer); ++ } ++#endif ++ ++ /* Switch on the voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Remove reset the core signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Indicates that we are exiting from hibernation */ ++ core_if->hibernation_suspend = 0; ++ ++ /* Disable PMU */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Programm Disable VBUS to 0 */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.dis_vbus = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /*Initialize the core as Host */ ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++ ++ return 1; ++} ++ ++/** This interrupt indicates that restore command after Hibernation ++ * was completed by the core. */ ++int32_t dwc_otg_handle_restore_done_intr(dwc_otg_core_if_t * core_if) ++{ ++ pcgcctl_data_t pcgcctl; ++ DWC_DEBUGPL(DBG_ANY, "++Restore Done Interrupt++\n"); ++ ++ //TODO De-assert restore signal. 8.a ++ pcgcctl.d32 = DWC_READ_REG32(core_if->pcgcctl); ++ if (pcgcctl.b.restoremode == 1) { ++ gintmsk_data_t gintmsk = {.d32 = 0 }; ++ /* ++ * If restore mode is Remote Wakeup, ++ * unmask Remote Wakeup interrupt. ++ */ ++ gintmsk.b.wkupintr = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, ++ 0, gintmsk.d32); ++ } ++ ++ return 1; ++} ++ ++/** + * This interrupt indicates that a device has been disconnected from -+ * the root port. ++ * the root port. + */ +int32_t dwc_otg_handle_disconnect_intr(dwc_otg_core_if_t * core_if) +{ @@ -47832,13 +58863,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + if (core_if->op_state == B_HOST) { + /* If in device mode Disconnect and stop the HCD, then + * start the PCD. */ -+ hcd_disconnect(core_if); -+ pcd_start(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_hcd_disconnect(core_if); ++ cil_pcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = B_PERIPHERAL; + } else if (dwc_otg_is_device_mode(core_if)) { + gotgctl_data_t gotgctl = {.d32 = 0 }; + gotgctl.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->gotgctl); ++ DWC_READ_REG32(&core_if->core_global_regs->gotgctl); + if (gotgctl.b.hstsethnpen == 1) { + /* Do nothing, if HNP in process the OTG + * interrupt "Host Negotiation Detected" @@ -47847,8 +58880,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + } else if (gotgctl.b.devhnpen == 0) { + /* If in device mode Disconnect and stop the HCD, then + * start the PCD. */ -+ hcd_disconnect(core_if); -+ pcd_start(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_hcd_disconnect(core_if); ++ cil_pcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = B_PERIPHERAL; + } else { + DWC_DEBUGPL(DBG_ANY, "!a_peripheral && !devhnpen\n"); @@ -47856,7 +58891,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + } else { + if (core_if->op_state == A_HOST) { + /* A-Cable still connected but device disconnected. */ -+ hcd_disconnect(core_if); ++ cil_hcd_disconnect(core_if); ++ if (core_if->adp_enable) { ++ gpwrdn_data_t gpwrdn = { .d32 = 0 }; ++ cil_hcd_stop(core_if); ++ /* Enable Power Down Logic */ ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_otg_adp_probe_start(core_if); ++ ++ /* Power off the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32 ++ (&core_if->core_global_regs->gpwrdn, ++ gpwrdn.d32, 0); ++ } ++ } + } + } +#endif @@ -47865,14 +58919,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + + gintsts.d32 = 0; + gintsts.b.disconnect = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + return 1; +} + +/** + * This interrupt indicates that SUSPEND state has been detected on + * the USB. -+ * ++ * + * For HNP the USB Suspend interrupt signals the change from + * "a_peripheral" to "a_host". + * @@ -47883,6 +58937,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo +{ + dsts_data_t dsts; + gintsts_data_t gintsts; ++ dcfg_data_t dcfg; + + DWC_DEBUGPL(DBG_ANY, "USB SUSPEND\n"); + @@ -47890,7 +58945,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Check the Device status register to determine if the Suspend + * state is active. */ + dsts.d32 = -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + DWC_DEBUGPL(DBG_PCD, "DSTS=0x%0x\n", dsts.d32); + DWC_DEBUGPL(DBG_PCD, "DSTS.Suspend Status=%d " + "HWCFG4.power Optimize=%d\n", @@ -47904,26 +58959,161 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + DWC_DEBUGPL(DBG_CIL, "suspend\n"); + + power.b.pwrclmp = 1; -+ dwc_write_reg32(core_if->pcgcctl, power.d32); ++ DWC_WRITE_REG32(core_if->pcgcctl, power.d32); + + power.b.rstpdwnmodule = 1; -+ dwc_modify_reg32(core_if->pcgcctl, 0, power.d32); ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, power.d32); + + power.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, 0, power.d32); ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, power.d32); + + } else { + DWC_DEBUGPL(DBG_ANY, "disconnect?\n"); + } +#endif -+ /* PCD callback for suspend. */ -+ pcd_suspend(core_if); ++ /* PCD callback for suspend. Release the lock inside of callback function */ ++ cil_pcd_suspend(core_if); ++ if (core_if->power_down == 2) ++ { ++ dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); ++ DWC_DEBUGPL(DBG_ANY,"lx_state = %08x\n",core_if->lx_state); ++ DWC_DEBUGPL(DBG_ANY," device address = %08d\n",dcfg.b.devaddr); ++ ++ if (core_if->lx_state != DWC_OTG_L3 && dcfg.b.devaddr) { ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ gusbcfg_data_t gusbcfg = {.d32 = 0 }; ++ ++ /* Change to L2(suspend) state */ ++ core_if->lx_state = DWC_OTG_L2; ++ ++ /* Clear interrupt in gintsts */ ++ gintsts.d32 = 0; ++ gintsts.b.usbsuspend = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs-> ++ gintsts, gintsts.d32); ++ DWC_PRINTF("Start of hibernation completed\n"); ++ dwc_otg_save_global_regs(core_if); ++ dwc_otg_save_dev_regs(core_if); ++ ++ gusbcfg.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs-> ++ gusbcfg); ++ if (gusbcfg.b.ulpi_utmi_sel == 1) { ++ /* ULPI interface */ ++ /* Suspend the Phy Clock */ ++ pcgcctl.d32 = 0; ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, ++ pcgcctl.d32); ++ dwc_udelay(10); ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ } else { ++ /* UTMI+ Interface */ ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, ++ pcgcctl.d32); ++ dwc_udelay(10); ++ } ++ ++ /* Set flag to indicate that we are in hibernation */ ++ core_if->hibernation_suspend = 1; ++ /* Enable interrupts from wake up logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Unmask device mode interrupts in GPWRDN */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.rst_det_msk = 1; ++ gpwrdn.b.lnstchng_msk = 1; ++ gpwrdn.b.sts_chngint_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Enable Power Down Clamp */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Switch off VDD */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ ++ /* Save gpwrdn register for further usage if stschng interrupt */ ++ core_if->gr_backup->gpwrdn_local = ++ DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ DWC_PRINTF("Hibernation completed\n"); ++ ++ return 1; ++ } ++ } else if (core_if->power_down == 3) { ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ dcfg.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dcfg); ++ DWC_DEBUGPL(DBG_ANY, "lx_state = %08x\n",core_if->lx_state); ++ DWC_DEBUGPL(DBG_ANY, " device address = %08d\n",dcfg.b.devaddr); ++ ++ if (core_if->lx_state != DWC_OTG_L3 && dcfg.b.devaddr) { ++ DWC_DEBUGPL(DBG_ANY, "Start entering to extended hibernation\n"); ++ core_if->xhib = 1; ++ ++ /* Clear interrupt in gintsts */ ++ gintsts.d32 = 0; ++ gintsts.b.usbsuspend = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs-> ++ gintsts, gintsts.d32); ++ ++ dwc_otg_save_global_regs(core_if); ++ dwc_otg_save_dev_regs(core_if); ++ ++ /* Wait for 10 PHY clocks */ ++ dwc_udelay(10); ++ ++ /* Program GPIO register while entering to xHib */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->ggpio, 0x1); ++ ++ pcgcctl.b.enbl_extnd_hiber = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ ++ pcgcctl.d32 = 0; ++ pcgcctl.b.extnd_hiber_pwrclmp = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ ++ pcgcctl.d32 = 0; ++ pcgcctl.b.extnd_hiber_switch = 1; ++ core_if->gr_backup->xhib_gpwrdn = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ core_if->gr_backup->xhib_pcgcctl = DWC_READ_REG32(core_if->pcgcctl) | pcgcctl.d32; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ ++ DWC_DEBUGPL(DBG_ANY, "Finished entering to extended hibernation\n"); ++ ++ return 1; ++ } ++ } + } else { + if (core_if->op_state == A_PERIPHERAL) { + DWC_DEBUGPL(DBG_ANY, "a_peripheral->a_host\n"); + /* Clear the a_peripheral flag, back to a_host. */ -+ pcd_stop(core_if); -+ hcd_start(core_if); ++ DWC_SPINUNLOCK(core_if->lock); ++ cil_pcd_stop(core_if); ++ cil_hcd_start(core_if); ++ DWC_SPINLOCK(core_if->lock); + core_if->op_state = A_HOST; + } + } @@ -47934,7 +59124,71 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ ++ return 1; ++} ++ ++static int32_t dwc_otg_handle_xhib_exit_intr(dwc_otg_core_if_t * core_if) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ gahbcfg_data_t gahbcfg = {.d32 = 0 }; ++ ++ dwc_udelay(10); ++ ++ /* Program GPIO register while entering to xHib */ ++ DWC_WRITE_REG32(&core_if->core_global_regs->ggpio, 0x0); ++ ++ pcgcctl.d32 = core_if->gr_backup->xhib_pcgcctl; ++ pcgcctl.b.extnd_hiber_pwrclmp = 0; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ dwc_udelay(10); ++ ++ gpwrdn.d32 = core_if->gr_backup->xhib_gpwrdn; ++ gpwrdn.b.restore = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ restore_lpm_i2c_regs(core_if); ++ ++ pcgcctl.d32 = core_if->gr_backup->pcgcctl_local & (0x3FFFF << 14); ++ pcgcctl.b.max_xcvrselect = 1; ++ pcgcctl.b.ess_reg_restored = 0; ++ pcgcctl.b.extnd_hiber_switch = 0; ++ pcgcctl.b.extnd_hiber_pwrclmp = 0; ++ pcgcctl.b.enbl_extnd_hiber = 1; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ ++ gahbcfg.d32 = core_if->gr_backup->gahbcfg_local; ++ gahbcfg.b.glblintrmsk = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gahbcfg, gahbcfg.d32); ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, 0x1 << 16); ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, ++ core_if->gr_backup->gusbcfg_local); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, ++ core_if->dr_backup->dcfg); ++ ++ pcgcctl.d32 = 0; ++ pcgcctl.d32 = core_if->gr_backup->pcgcctl_local & (0x3FFFF << 14); ++ pcgcctl.b.max_xcvrselect = 1; ++ pcgcctl.d32 |= 0x608; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ dwc_udelay(10); ++ ++ pcgcctl.d32 = 0; ++ pcgcctl.d32 = core_if->gr_backup->pcgcctl_local & (0x3FFFF << 14); ++ pcgcctl.b.max_xcvrselect = 1; ++ pcgcctl.b.ess_reg_restored = 1; ++ pcgcctl.b.enbl_extnd_hiber = 1; ++ pcgcctl.b.rstpdwnmodule = 1; ++ pcgcctl.b.restoremode = 1; ++ DWC_WRITE_REG32(core_if->pcgcctl, pcgcctl.d32); ++ ++ DWC_DEBUGPL(DBG_ANY, "%s called\n", __FUNCTION__); + + return 1; +} @@ -47952,20 +59206,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + DWC_PRINTF("Unexpected LPM interrupt\n"); + } + -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + DWC_PRINTF("LPM config register = 0x%08x\n", lpmcfg.d32); + + if (dwc_otg_is_host_mode(core_if)) { -+ hcd_sleep(core_if); ++ cil_hcd_sleep(core_if); + } else { + lpmcfg.b.hird_thres |= (1 << 4); -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, + lpmcfg.d32); + } + -+ /* Examine prt_sleep_sts after TL1TokenTetry period max (10 us) */ ++ /* Examine prt_sleep_sts after TL1TokenTetry period max (10 us) */ + dwc_udelay(10); -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + if (lpmcfg.b.prt_sleep_sts) { + /* Save the current state */ + core_if->lx_state = DWC_OTG_L1; @@ -47974,16 +59228,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.lpmtranrcvd = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + return 1; +} -+#endif /* CONFIG_USB_DWC_OTG_LPM */ ++#endif /* CONFIG_USB_DWC_OTG_LPM */ + +/** + * This function returns the Core Interrupt register. + */ +static inline uint32_t dwc_otg_read_common_intr(dwc_otg_core_if_t * core_if) +{ ++ gahbcfg_data_t gahbcfg = {.d32 = 0 }; + gintsts_data_t gintsts; + gintmsk_data_t gintmsk; + gintmsk_data_t gintmsk_common = {.d32 = 0 }; @@ -47997,13 +59252,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo +#ifdef CONFIG_USB_DWC_OTG_LPM + gintmsk_common.b.lpmtranrcvd = 1; +#endif -+ /** @todo: The port interrupt occurs while in device -+ * mode. Added code to CIL to clear the interrupt for now! ++ gintmsk_common.b.restoredone = 1; ++ /** @todo: The port interrupt occurs while in device ++ * mode. Added code to CIL to clear the interrupt for now! + */ + gintmsk_common.b.portintr = 1; + -+ gintsts.d32 = dwc_read_reg32(&core_if->core_global_regs->gintsts); -+ gintmsk.d32 = dwc_read_reg32(&core_if->core_global_regs->gintmsk); ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ gintmsk.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintmsk); ++ gahbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gahbcfg); ++ +#ifdef DEBUG + /* if any common interrupts set */ + if (gintsts.d32 & gintmsk_common.d32) { @@ -48011,15 +59269,31 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + gintsts.d32, gintmsk.d32); + } +#endif -+ -+ return ((gintsts.d32 & gintmsk.d32) & gintmsk_common.d32); ++ if (!fiq_fix_enable){ ++ if (gahbcfg.b.glblintrmsk) ++ return ((gintsts.d32 & gintmsk.d32) & gintmsk_common.d32); ++ else ++ return 0; ++ } ++ else { ++ return ((gintsts.d32 & gintmsk.d32) & gintmsk_common.d32); ++ } + +} + ++/* MACRO for clearing interupt bits in GPWRDN register */ ++#define CLEAR_GPWRDN_INTR(__core_if,__intr) \ ++do { \ ++ gpwrdn_data_t gpwrdn = {.d32=0}; \ ++ gpwrdn.b.__intr = 1; \ ++ DWC_MODIFY_REG32(&__core_if->core_global_regs->gpwrdn, \ ++ 0, gpwrdn.d32); \ ++} while (0) ++ +/** + * Common interrupt handler. + * -+ * The common interrupts are those that occur in both Host and Device mode. ++ * The common interrupts are those that occur in both Host and Device mode. + * This handler handles the following interrupts: + * - Mode Mismatch Interrupt + * - Disconnect Interrupt @@ -48027,65 +59301,200 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-rpi-bo + * - Connector ID Status Change Interrupt + * - Session Request Interrupt. + * - Resume / Remote Wakeup Detected Interrupt. -+ * - LPM Transaction Received Interrutp -+ * ++ * - LPM Transaction Received Interrupt ++ * - ADP Transaction Received Interrupt ++ * + */ -+int32_t dwc_otg_handle_common_intr(dwc_otg_core_if_t * core_if) ++int32_t dwc_otg_handle_common_intr(void *dev) +{ + int retval = 0; + gintsts_data_t gintsts; ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ dwc_otg_device_t *otg_dev = dev; ++ dwc_otg_core_if_t *core_if = otg_dev->core_if; ++ gpwrdn.d32 = DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ if (dwc_otg_is_device_mode(core_if)) ++ core_if->frame_num = dwc_otg_get_frame_number(core_if); ++ ++ if (core_if->lock) ++ DWC_SPINLOCK(core_if->lock); + -+ gintsts.d32 = dwc_otg_read_common_intr(core_if); ++ if (core_if->power_down == 3 && core_if->xhib == 1) { ++ DWC_DEBUGPL(DBG_ANY, "Exiting from xHIB state\n"); ++ retval |= dwc_otg_handle_xhib_exit_intr(core_if); ++ core_if->xhib = 2; ++ if (core_if->lock) ++ DWC_SPINUNLOCK(core_if->lock); + -+ if (gintsts.b.modemismatch) { -+ retval |= dwc_otg_handle_mode_mismatch_intr(core_if); -+ } -+ if (gintsts.b.otgintr) { -+ retval |= dwc_otg_handle_otg_intr(core_if); -+ } -+ if (gintsts.b.conidstschng) { -+ retval |= dwc_otg_handle_conn_id_status_change_intr(core_if); -+ } -+ if (gintsts.b.disconnect) { -+ retval |= dwc_otg_handle_disconnect_intr(core_if); -+ } -+ if (gintsts.b.sessreqintr) { -+ retval |= dwc_otg_handle_session_req_intr(core_if); -+ } -+ if (gintsts.b.wkupintr) { -+ retval |= dwc_otg_handle_wakeup_detected_intr(core_if); -+ } -+ if (gintsts.b.usbsuspend) { -+ retval |= dwc_otg_handle_usb_suspend_intr(core_if); ++ return retval; + } ++ ++ if (core_if->hibernation_suspend <= 0) { ++ gintsts.d32 = dwc_otg_read_common_intr(core_if); ++ ++ if (gintsts.b.modemismatch) { ++ retval |= dwc_otg_handle_mode_mismatch_intr(core_if); ++ } ++ if (gintsts.b.otgintr) { ++ retval |= dwc_otg_handle_otg_intr(core_if); ++ } ++ if (gintsts.b.conidstschng) { ++ retval |= ++ dwc_otg_handle_conn_id_status_change_intr(core_if); ++ } ++ if (gintsts.b.disconnect) { ++ retval |= dwc_otg_handle_disconnect_intr(core_if); ++ } ++ if (gintsts.b.sessreqintr) { ++ retval |= dwc_otg_handle_session_req_intr(core_if); ++ } ++ if (gintsts.b.wkupintr) { ++ retval |= dwc_otg_handle_wakeup_detected_intr(core_if); ++ } ++ if (gintsts.b.usbsuspend) { ++ retval |= dwc_otg_handle_usb_suspend_intr(core_if); ++ } +#ifdef CONFIG_USB_DWC_OTG_LPM -+ if (gintsts.b.lpmtranrcvd) { -+ retval |= dwc_otg_handle_lpm_intr(core_if); -+ } ++ if (gintsts.b.lpmtranrcvd) { ++ retval |= dwc_otg_handle_lpm_intr(core_if); ++ } +#endif ++ if (gintsts.b.restoredone) { ++ gintsts.d32 = 0; ++ if (core_if->power_down == 2) ++ core_if->hibernation_suspend = -1; ++ else if (core_if->power_down == 3 && core_if->xhib == 2) { ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ dctl_data_t dctl = {.d32 = 0 }; + -+ if (gintsts.b.portintr && dwc_otg_is_device_mode(core_if)) { -+ /* The port interrupt occurs while in device mode with HPRT0 -+ * Port Enable/Disable. -+ */ -+ gintsts.d32 = 0; -+ gintsts.b.portintr = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, -+ gintsts.d32); -+ retval |= 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs-> ++ gintsts, 0xFFFFFFFF); + ++ DWC_DEBUGPL(DBG_ANY, ++ "RESTORE DONE generated\n"); ++ ++ gpwrdn.b.restore = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ pcgcctl.b.rstpdwnmodule = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); ++ ++ DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, core_if->gr_backup->gusbcfg_local); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dcfg, core_if->dr_backup->dcfg); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, core_if->dr_backup->dctl); ++ dwc_udelay(50); ++ ++ dctl.b.pwronprgdone = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ dwc_udelay(10); ++ ++ dwc_otg_restore_global_regs(core_if); ++ dwc_otg_restore_dev_regs(core_if, 0); ++ ++ dctl.d32 = 0; ++ dctl.b.pwronprgdone = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32, 0); ++ dwc_udelay(10); ++ ++ pcgcctl.d32 = 0; ++ pcgcctl.b.enbl_extnd_hiber = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); ++ ++ /* The core will be in ON STATE */ ++ core_if->lx_state = DWC_OTG_L0; ++ core_if->xhib = 0; ++ ++ DWC_SPINUNLOCK(core_if->lock); ++ if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { ++ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); ++ } ++ DWC_SPINLOCK(core_if->lock); ++ ++ } ++ ++ gintsts.b.restoredone = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts,gintsts.d32); ++ DWC_PRINTF(" --Restore done interrupt received-- \n"); ++ retval |= 1; ++ } ++ if (gintsts.b.portintr && dwc_otg_is_device_mode(core_if)) { ++ /* The port interrupt occurs while in device mode with HPRT0 ++ * Port Enable/Disable. ++ */ ++ gintsts.d32 = 0; ++ gintsts.b.portintr = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts,gintsts.d32); ++ retval |= 1; ++ ++ } ++ } else { ++ DWC_DEBUGPL(DBG_ANY, "gpwrdn=%08x\n", gpwrdn.d32); ++ ++ if (gpwrdn.b.disconn_det && gpwrdn.b.disconn_det_msk) { ++ CLEAR_GPWRDN_INTR(core_if, disconn_det); ++ if (gpwrdn.b.linestate == 0) { ++ dwc_otg_handle_pwrdn_disconnect_intr(core_if); ++ } else { ++ DWC_PRINTF("Disconnect detected while linestate is not 0\n"); ++ } ++ ++ retval |= 1; ++ } ++ if (gpwrdn.b.lnstschng && gpwrdn.b.lnstchng_msk) { ++ CLEAR_GPWRDN_INTR(core_if, lnstschng); ++ /* remote wakeup from hibernation */ ++ if (gpwrdn.b.linestate == 2 || gpwrdn.b.linestate == 1) { ++ dwc_otg_handle_pwrdn_wakeup_detected_intr(core_if); ++ } else { ++ DWC_PRINTF("gpwrdn.linestate = %d\n", gpwrdn.b.linestate); ++ } ++ retval |= 1; ++ } ++ if (gpwrdn.b.rst_det && gpwrdn.b.rst_det_msk) { ++ CLEAR_GPWRDN_INTR(core_if, rst_det); ++ if (gpwrdn.b.linestate == 0) { ++ DWC_PRINTF("Reset detected\n"); ++ retval |= dwc_otg_device_hibernation_restore(core_if, 0, 1); ++ } ++ } ++ if (gpwrdn.b.srp_det && gpwrdn.b.srp_det_msk) { ++ CLEAR_GPWRDN_INTR(core_if, srp_det); ++ dwc_otg_handle_pwrdn_srp_intr(core_if); ++ retval |= 1; ++ } + } ++ /* Handle ADP interrupt here */ ++ if (gpwrdn.b.adp_int) { ++ DWC_PRINTF("ADP interrupt\n"); ++ CLEAR_GPWRDN_INTR(core_if, adp_int); ++ dwc_otg_adp_handle_intr(core_if); ++ retval |= 1; ++ } ++ if (gpwrdn.b.sts_chngint && gpwrdn.b.sts_chngint_msk) { ++ DWC_PRINTF("STS CHNG interrupt asserted\n"); ++ CLEAR_GPWRDN_INTR(core_if, sts_chngint); ++ dwc_otg_handle_pwrdn_stschng_intr(otg_dev); ++ ++ retval |= 1; ++ } ++ if (core_if->lock) ++ DWC_SPINUNLOCK(core_if->lock); ++ + return retval; +} -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2012-07-15 20:29:19.140084674 +0200 -@@ -0,0 +1,642 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_core_if.h b/drivers/usb/host/dwc_otg/dwc_otg_core_if.h +new file mode 100644 +index 0000000..10b68c4 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_core_if.h +@@ -0,0 +1,705 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $ -+ * $Revision: #4 $ -+ * $Date: 2008/12/18 $ -+ * $Change: 1155299 $ ++ * $Revision: #13 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -48146,7 +59555,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo +extern uint8_t dwc_otg_is_dma_enable(dwc_otg_core_if_t * core_if); + +/** This function should be called on every hardware interrupt. */ -+extern int32_t dwc_otg_handle_common_intr(dwc_otg_core_if_t * _core_if); ++extern int32_t dwc_otg_handle_common_intr(void *otg_dev); + +/** @name OTG Core Parameters */ +/** @{ */ @@ -48351,7 +59760,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo + int32_t val); +extern int32_t dwc_otg_get_param_host_channels(dwc_otg_core_if_t * core_if); +//#define dwc_param_host_channels_default 12 -+#define dwc_param_host_channels_default 8// Broadcom BCM2708 ++#define dwc_param_host_channels_default 8 // Broadcom BCM2708 + +/** The number of endpoints in addition to EP0 available for device + * mode operations. @@ -48380,7 +59789,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo +#define dwc_param_phy_type_default DWC_PHY_TYPE_PARAM_UTMI + +/** -+ * Specifies the UTMI+ Data Width. This parameter is ++ * Specifies the UTMI+ Data Width. This parameter is + * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI + * PHY_TYPE, this parameter indicates the data width between + * the MAC and the ULPI Wrapper.) Also, this parameter is @@ -48462,7 +59871,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo + int fifo_num, int32_t val); +extern int32_t dwc_otg_get_param_dev_tx_fifo_size(dwc_otg_core_if_t * core_if, + int fifo_num); -+#define dwc_param_dev_tx_fifo_size_default 256 ++#define dwc_param_dev_tx_fifo_size_default 768 + +/** Thresholding enable flag- + * bit 0 - enable non-ISO Tx thresholding @@ -48514,17 +59923,56 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo +#define dwc_param_mpi_enable_default 0 + +/** ++ * Specifies whether ADP capability is enabled ++ */ ++extern int dwc_otg_set_param_adp_enable(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_adp_enable(dwc_otg_core_if_t * core_if); ++#define dwc_param_adp_enable_default 0 ++ ++/** + * Specifies whether IC_USB capability is enabled + */ ++ +extern int dwc_otg_set_param_ic_usb_cap(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_ic_usb_cap(dwc_otg_core_if_t * core_if); +#define dwc_param_ic_usb_cap_default 0 + -+extern int dwc_otg_set_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if, int32_t val); ++extern int dwc_otg_set_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if, ++ int32_t val); +extern int32_t dwc_otg_get_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if); +#define dwc_param_ahb_thr_ratio_default 0 + ++extern int dwc_otg_set_param_power_down(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_power_down(dwc_otg_core_if_t * core_if); ++#define dwc_param_power_down_default 0 ++ ++extern int dwc_otg_set_param_reload_ctl(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_reload_ctl(dwc_otg_core_if_t * core_if); ++#define dwc_param_reload_ctl_default 0 ++ ++extern int dwc_otg_set_param_dev_out_nak(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_dev_out_nak(dwc_otg_core_if_t * core_if); ++#define dwc_param_dev_out_nak_default 0 ++ ++extern int dwc_otg_set_param_cont_on_bna(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_cont_on_bna(dwc_otg_core_if_t * core_if); ++#define dwc_param_cont_on_bna_default 0 ++ ++extern int dwc_otg_set_param_ahb_single(dwc_otg_core_if_t * core_if, ++ int32_t val); ++extern int32_t dwc_otg_get_param_ahb_single(dwc_otg_core_if_t * core_if); ++#define dwc_param_ahb_single_default 0 ++ ++extern int dwc_otg_set_param_otg_ver(dwc_otg_core_if_t * core_if, int32_t val); ++extern int32_t dwc_otg_get_param_otg_ver(dwc_otg_core_if_t * core_if); ++#define dwc_param_otg_ver_default 0 ++ +/** @} */ + +/** @name Access to registers and bit-fields */ @@ -48604,6 +60052,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo + * Get value of prtpwr field from the HPRT0 register + */ +extern uint32_t dwc_otg_get_prtpower(dwc_otg_core_if_t * core_if); ++ ++/** ++ * Get value of flag indicating core state - hibernated or not ++ */ ++extern uint32_t dwc_otg_get_core_state(dwc_otg_core_if_t * core_if); ++ +/** + * Set value of prtpwr field from the HPRT0 register + */ @@ -48619,6 +60073,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo +extern void dwc_otg_set_prtsuspend(dwc_otg_core_if_t * core_if, uint32_t val); + +/** ++ * Get value of ModeChTimEn field from the HCFG regsiter ++ */ ++extern uint32_t dwc_otg_get_mode_ch_tim(dwc_otg_core_if_t * core_if); ++/** ++ * Set value of ModeChTimEn field from the HCFG regsiter ++ */ ++extern void dwc_otg_set_mode_ch_tim(dwc_otg_core_if_t * core_if, uint32_t val); ++ ++/** ++ * Get value of Fram Interval field from the HFIR regsiter ++ */ ++extern uint32_t dwc_otg_get_fr_interval(dwc_otg_core_if_t * core_if); ++/** ++ * Set value of Frame Interval field from the HFIR regsiter ++ */ ++extern void dwc_otg_set_fr_interval(dwc_otg_core_if_t * core_if, uint32_t val); ++ ++/** + * Set value of prtres field from the HPRT0 register + *FIXME Remove? + */ @@ -48723,10 +60195,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-rpi-boo +/** @} */ + +#endif /* __DWC_CORE_IF_H__ */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2012-07-15 20:29:19.197085746 +0200 -@@ -0,0 +1,113 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_dbg.h b/drivers/usb/host/dwc_otg/dwc_otg_dbg.h +new file mode 100644 +index 0000000..2ff1532 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_dbg.h +@@ -0,0 +1,117 @@ +/* ========================================================================== + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -48778,6 +60252,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-bootc-3 + return old; +} + ++#define DBG_USER (0x1) +/** When debug level has the DBG_CIL bit set, display CIL Debug messages. */ +#define DBG_CIL (0x2) +/** When debug level has the DBG_CILV bit set, display CIL Verbose debug @@ -48797,6 +60272,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-bootc-3 +/** When debug level has the DBG_HCD_URB bit set, display enqueued URBs in host + * mode. */ +#define DBG_HCD_URB (0x800) ++/** When debug level has the DBG_HCDI bit set, display host interrupt ++ * messages. */ ++#define DBG_HCDI (0x1000) + +/** When debug level has any bit set, display debug messages */ +#define DBG_ANY (0xFF) @@ -48840,15 +60318,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-rpi-bootc-3 + +#endif /*DEBUG*/ +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2012-07-15 20:29:19.058083099 +0200 -@@ -0,0 +1,1726 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_driver.c b/drivers/usb/host/dwc_otg/dwc_otg_driver.c +new file mode 100644 +index 0000000..b618f4b +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_driver.c +@@ -0,0 +1,1727 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $ -+ * $Revision: #76 $ -+ * $Date: 2009/05/03 $ -+ * $Change: 1245589 $ ++ * $Revision: #92 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -48894,48 +60374,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + * device. + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include /* permission constants */ -+#include -+#include -+ -+#ifdef LM_INTERFACE -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#include -+#else -+/* in 2.6.31, at least, we seem to have lost the generic LM infrastructure - -+ here we use definitions stolen from arm-integrator headers -+*/ -+#include -+#include -+#endif -+#include -+#include -+ -+#elif defined(PLATFORM_INTERFACE) -+ -+#include -+#include -+ -+#endif -+ -+# include -+ -+#ifdef SOF_FIX -+#include -+#include -+#endif -+ -+#include -+ -+ ++#include "dwc_otg_os_dep.h" +#include "dwc_os.h" +#include "dwc_otg_dbg.h" +#include "dwc_otg_driver.h" @@ -48944,49 +60383,55 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot +#include "dwc_otg_pcd_if.h" +#include "dwc_otg_hcd_if.h" + -+#define DWC_DRIVER_VERSION "2.90b 6-MAY-2010" ++#define DWC_DRIVER_VERSION "3.00a 10-AUG-2012" +#define DWC_DRIVER_DESC "HS OTG USB Controller driver" + ++bool microframe_schedule=true; ++ +static const char dwc_driver_name[] = "dwc_otg"; + ++extern void* dummy_send; ++ +extern int pcd_init( +#ifdef LM_INTERFACE -+ struct lm_device *_dev ++ struct lm_device *_dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev ++ struct pci_dev *_dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *dev +#endif -+ ); ++ ); +extern int hcd_init( +#ifdef LM_INTERFACE -+ struct lm_device *_dev ++ struct lm_device *_dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev ++ struct pci_dev *_dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *dev +#endif -+ ); ++ ); + +extern int pcd_remove( +#ifdef LM_INTERFACE -+ struct lm_device *_dev ++ struct lm_device *_dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev ++ struct pci_dev *_dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *_dev +#endif -+ ); ++ ); + +extern void hcd_remove( +#ifdef LM_INTERFACE -+ struct lm_device *_dev ++ struct lm_device *_dev +#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev ++ struct pci_dev *_dev +#elif defined(PLATFORM_INTERFACE) + struct platform_device *_dev +#endif -+ ); ++ ); ++ ++extern void dwc_otg_adp_start(dwc_otg_core_if_t * core_if, uint8_t is_host); + +/*-------------------------------------------------------------------------*/ +/* Encapsulate the module parameter settings */ @@ -49029,8 +60474,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + int32_t lpm_enable; + int32_t ic_usb_cap; + int32_t ahb_thr_ratio; -+ int32_t sof_setting; // 0=off, 1=on -+ int32_t proc_init_done; // 0=not done, 1=done ++ int32_t power_down; ++ int32_t reload_ctl; ++ int32_t dev_out_nak; ++ int32_t cont_on_bna; ++ int32_t ahb_single; ++ int32_t otg_ver; ++ int32_t adp_enable; +}; + +static struct dwc_otg_driver_module_params dwc_otg_module_params = { @@ -49107,136 +60557,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + .lpm_enable = -1, + .ic_usb_cap = -1, + .ahb_thr_ratio = -1, -+ .sof_setting = 0, -+ .proc_init_done = 0, ++ .power_down = -1, ++ .reload_ctl = -1, ++ .dev_out_nak = -1, ++ .cont_on_bna = -1, ++ .ahb_single = -1, ++ .otg_ver = -1, ++ .adp_enable = -1, +}; + -+/** -+ * PROC_FS SUPPORT -+ * proc_fs support for setting the Start-of-Frame (SOF) interrupt processing -+ * fix (reducing SOF interrupts by an order of magnitude). When set -+ * to "on" the SOF interrupt will only be turned on once per tick, for -+ * 3 micro-frame times. When set to "off" it will not turn off the -+ * SOF interrupt, and process all 8000 per second. -+ */ -+ -+#ifdef SOF_FIX -+ -+static struct proc_dir_entry *proc_dir, *proc_file; -+ -+int sof_setting(void) -+{ -+ return dwc_otg_module_params.sof_setting; -+} -+ -+static int sof_read_data (char *page, -+ char **start, -+ off_t off, -+ int count, -+ int *eof, -+ void *data) -+{ -+ -+ if (dwc_otg_module_params.sof_setting == 1) -+ { -+ sprintf(page, "on\n"); -+ return 4; -+ } -+ else -+ { -+ sprintf(page, "off\n"); -+ return 5; -+ } -+ return 0; -+} -+ -+#define PROC_FS_MAX_SIZE 1024 -+#define PROC_FS_NAME "SOF_reduction" -+ -+static char proc_fs_buffer[PROC_FS_MAX_SIZE]; -+ -+static int sof_write_data (struct file *file, -+ const char __user *buffer, -+ unsigned long count, -+ void *data) -+{ -+ unsigned long buffer_size = count; -+ -+ if (buffer_size > PROC_FS_MAX_SIZE) -+ buffer_size = PROC_FS_MAX_SIZE; -+ -+ memset(proc_fs_buffer, 0, sizeof(proc_fs_buffer)); -+ -+ if (copy_from_user(proc_fs_buffer, buffer, buffer_size)) -+ { -+ printk(KERN_ERR "\nSOF_write_data: copy_from_user failure\n"); -+ return -EFAULT; -+ } -+ -+ if ((strnlen(proc_fs_buffer, PROC_FS_MAX_SIZE) == 3) && -+ (strncmp(proc_fs_buffer, "on", 2) == 0)) -+ { -+ printk(KERN_ERR "\n%s: Setting SOF (reduction) ON.\n", PROC_FS_NAME); -+ dwc_otg_module_params.sof_setting = 1; -+ } -+ else if ((strnlen(proc_fs_buffer, PROC_FS_MAX_SIZE) == 4) && -+ (strncmp(proc_fs_buffer, "off", 3) == 0)) -+ { -+ printk(KERN_ERR "\n%s: Setting SOF reduction OFF.\n",PROC_FS_NAME); -+ dwc_otg_module_params.sof_setting = 0; -+ } -+ else -+ printk(KERN_ERR "\n%s: input not \'on\' or \'off\', ignored.\n", PROC_FS_NAME); -+#ifdef DEBUG_SOF_FIX -+ printk(KERN_ERR "\n%s:buffer %s, len = %d.\n",__func__, -+ proc_fs_buffer, strnlen(proc_fs_buffer, PROC_FS_MAX_SIZE)); -+#endif -+ -+ return buffer_size; -+} -+ -+/** -+ * Initialize proc_fs entry for SOF setting. -+ */ -+static int init_proc_fs(void) -+{ -+ int retval = 0; -+ -+ if (dwc_otg_module_params.proc_init_done) -+ return 0; -+ -+ proc_dir = proc_mkdir_mode("dwc_sof", 0755, NULL); -+ -+ if(proc_dir == NULL) -+ { -+ retval = -ENOMEM; -+ printk("Error creating dir\n"); -+ return retval; -+ } -+ -+ proc_file = create_proc_entry(PROC_FS_NAME, 0666, proc_dir); -+ -+ if (proc_file != NULL) -+ { -+ dwc_otg_module_params.proc_init_done = 1; -+ proc_file->read_proc = sof_read_data; -+ proc_file->write_proc = sof_write_data; -+ proc_file->mode = S_IFREG | S_IRUGO; -+ proc_file->uid = 0; -+ proc_file->gid = 0; -+ proc_file->gid = PROC_FS_MAX_SIZE; -+ } -+ else -+ { -+ retval = -ENOMEM; -+ printk("Error creating file\n"); -+ remove_proc_entry(PROC_FS_NAME, NULL); -+ } -+ -+ return retval; -+} -+ -+#endif ++//Global variable to switch the fiq fix on or off ++bool fiq_fix_enable = false; + + +/** @@ -49419,7 +60750,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + } + if (dwc_otg_module_params.ulpi_fs_ls != -1) { + retval += -+ dwc_otg_set_param_ulpi_fs_ls(core_if, dwc_otg_module_params.ulpi_fs_ls); ++ dwc_otg_set_param_ulpi_fs_ls(core_if, ++ dwc_otg_module_params.ulpi_fs_ls); + } + if (dwc_otg_module_params.ts_dline != -1) { + retval += @@ -49496,9 +60828,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + dwc_otg_module_params. + rx_thr_length); + } -+ if(dwc_otg_module_params.ahb_thr_ratio != -1) { ++ if (dwc_otg_module_params.ahb_thr_ratio != -1) { + retval += -+ dwc_otg_set_param_ahb_thr_ratio(core_if, dwc_otg_module_params.ahb_thr_ratio); ++ dwc_otg_set_param_ahb_thr_ratio(core_if, ++ dwc_otg_module_params.ahb_thr_ratio); ++ } ++ if (dwc_otg_module_params.power_down != -1) { ++ retval += ++ dwc_otg_set_param_power_down(core_if, ++ dwc_otg_module_params.power_down); ++ } ++ if (dwc_otg_module_params.reload_ctl != -1) { ++ retval += ++ dwc_otg_set_param_reload_ctl(core_if, ++ dwc_otg_module_params.reload_ctl); ++ } ++ ++ if (dwc_otg_module_params.dev_out_nak != -1) { ++ retval += ++ dwc_otg_set_param_dev_out_nak(core_if, ++ dwc_otg_module_params.dev_out_nak); ++ } ++ ++ if (dwc_otg_module_params.cont_on_bna != -1) { ++ retval += ++ dwc_otg_set_param_cont_on_bna(core_if, ++ dwc_otg_module_params.cont_on_bna); ++ } ++ ++ if (dwc_otg_module_params.ahb_single != -1) { ++ retval += ++ dwc_otg_set_param_ahb_single(core_if, ++ dwc_otg_module_params.ahb_single); ++ } ++ ++ if (dwc_otg_module_params.otg_ver != -1) { ++ retval += ++ dwc_otg_set_param_otg_ver(core_if, ++ dwc_otg_module_params.otg_ver); ++ } ++ if (dwc_otg_module_params.adp_enable != -1) { ++ retval += ++ dwc_otg_set_param_adp_enable(core_if, ++ dwc_otg_module_params. ++ adp_enable); + } + return retval; +} @@ -49509,10 +60882,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + */ +static irqreturn_t dwc_otg_common_irq(int irq, void *dev) +{ -+ dwc_otg_device_t *otg_dev = dev; + int32_t retval = IRQ_NONE; + -+ retval = dwc_otg_handle_common_intr(otg_dev->core_if); ++ retval = dwc_otg_handle_common_intr(dev); + if (retval != 0) { + S3C2410X_CLEAR_EINTPEND(); + } @@ -49529,54 +60901,41 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + * @param _dev + */ +#ifdef LM_INTERFACE -+static void dwc_otg_driver_remove( -+ struct lm_device *_dev ++#define REM_RETVAL(n) ++static void dwc_otg_driver_remove( struct lm_device *_dev ) ++{ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); +#elif defined(PCI_INTERFACE) -+static void dwc_otg_driver_remove( -+ struct pci_dev *_dev ++#define REM_RETVAL(n) ++static void dwc_otg_driver_remove( struct pci_dev *_dev ) ++{ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); +#elif defined(PLATFORM_INTERFACE) -+static int dwc_otg_driver_remove( -+ struct platform_device *_dev ++#define REM_RETVAL(n) n ++static int dwc_otg_driver_remove( struct platform_device *_dev ) ++{ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); +#endif -+) -+ -+{ -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif -+ + + DWC_DEBUGPL(DBG_ANY, "%s(%p) otg_dev %p\n", __func__, _dev, otg_dev); + + if (!otg_dev) { + /* Memory allocation for the dwc_otg_device failed. */ + DWC_DEBUGPL(DBG_ANY, "%s: otg_dev NULL!\n", __func__); -+#ifdef PLATFORM_INTERFACE -+ return -ENOMEM; -+#else -+ return; -+#endif ++ return REM_RETVAL(-ENOMEM); + } +#ifndef DWC_DEVICE_ONLY + if (otg_dev->hcd) { + hcd_remove(_dev); + } else { + DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->hcd NULL!\n", __func__); -+#ifdef PLATFORM_INTERFACE -+ return -EINVAL; -+#else -+ return; -+#endif ++ return REM_RETVAL(-EINVAL); + } +#endif + +#ifndef DWC_HOST_ONLY + if (otg_dev->pcd) { + pcd_remove(_dev); ++ } else { ++ DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->pcd NULL!\n", __func__); ++ return REM_RETVAL(-EINVAL); + } +#endif + /* @@ -49588,10 +60947,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot +#else + free_irq(_dev->irq, otg_dev); +#endif -+ } ++ } else { ++ DWC_DEBUGPL(DBG_ANY, "%s: There is no installed irq!\n", __func__); ++ return REM_RETVAL(-ENXIO); ++ } + + if (otg_dev->core_if) { + dwc_otg_cil_remove(otg_dev->core_if); ++ } else { ++ DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->core_if NULL!\n", __func__); ++ return REM_RETVAL(-ENXIO); + } + + /* @@ -49602,23 +60967,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + /* + * Return the memory. + */ -+ if (otg_dev->base) { -+ iounmap(otg_dev->base); ++ if (otg_dev->os_dep.base) { ++ iounmap(otg_dev->os_dep.base); + } -+ dwc_free(otg_dev); ++ DWC_FREE(otg_dev); + + /* + * Clear the drvdata pointer. + */ +#ifdef LM_INTERFACE + lm_set_drvdata(_dev, 0); -+#elif defined(PCI_INTERFACE) -+ release_mem_region(otg_dev->rsrc_start, otg_dev->rsrc_len); -+ pci_set_drvdata(_dev, 0); ++#elif defined(PCI_INTERFACE) ++ release_mem_region(otg_dev->os_dep.rsrc_start, ++ otg_dev->os_dep.rsrc_len); ++ pci_set_drvdata(_dev, 0); +#elif defined(PLATFORM_INTERFACE) + platform_set_drvdata(_dev, 0); -+ return 0; +#endif ++ return REM_RETVAL(0); +} + +/** @@ -49634,13 +61000,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + */ +static int dwc_otg_driver_probe( +#ifdef LM_INTERFACE -+struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+struct pci_dev *_dev, const struct pci_device_id *id ++ struct lm_device *_dev ++#elif defined(PCI_INTERFACE) ++ struct pci_dev *_dev, ++ const struct pci_device_id *id +#elif defined(PLATFORM_INTERFACE) -+struct platform_device *_dev ++ struct platform_device *_dev +#endif -+) ++ ) +{ + int retval = 0; + dwc_otg_device_t *dwc_otg_device; @@ -49649,9 +61016,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + dev_dbg(&_dev->dev, "dwc_otg_driver_probe(%p)\n", _dev); +#ifdef LM_INTERFACE + dev_dbg(&_dev->dev, "start=0x%08x\n", (unsigned)_dev->resource.start); -+#elif defined(PCI_INTERFACE) ++#elif defined(PCI_INTERFACE) + if (!id) { -+ DWC_ERROR("Invalid pci_device_id %p", id); ++ DWC_ERROR("Invalid pci_device_id %p", id); + return -EINVAL; + } + @@ -49668,92 +61035,109 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + (unsigned)(_dev->resource->end - _dev->resource->start)); +#endif + -+ -+ dwc_otg_device = dwc_alloc(sizeof(dwc_otg_device_t)); ++ dwc_otg_device = DWC_ALLOC(sizeof(dwc_otg_device_t)); + + if (!dwc_otg_device) { + dev_err(&_dev->dev, "kmalloc of dwc_otg_device failed\n"); -+ retval = -ENOMEM; -+ goto fail; ++ return -ENOMEM; + } + + memset(dwc_otg_device, 0, sizeof(*dwc_otg_device)); -+ dwc_otg_device->reg_offset = 0xFFFFFFFF; ++ dwc_otg_device->os_dep.reg_offset = 0xFFFFFFFF; + + /* + * Map the DWC_otg Core memory into virtual address space. + */ +#ifdef LM_INTERFACE -+#if 1 -+ dwc_otg_device->base = ioremap(_dev->resource.start, SZ_256K); -+#else -+ struct map_desc desc = { -+ .virtual = IO_ADDRESS((unsigned)_dev->resource.start), -+ .pfn = __phys_to_pfn((unsigned)_dev->resource.start), -+ .length = SZ_128K, -+ .type = MT_DEVICE -+ }; -+ iotable_init(&desc, 1); -+ dwc_otg_device->base = (void *)desc.virtual; -+#endif ++ dwc_otg_device->os_dep.base = ioremap(_dev->resource.start, SZ_256K); + -+ if (!dwc_otg_device->base) { ++ if (!dwc_otg_device->os_dep.base) { + dev_err(&_dev->dev, "ioremap() failed\n"); -+ retval = -ENOMEM; -+ goto fail; ++ DWC_FREE(dwc_otg_device); ++ return -ENOMEM; + } -+ dev_dbg(&_dev->dev, "base=0x%08x\n", (unsigned)dwc_otg_device->base); -+#elif defined(PCI_INTERFACE) ++ dev_dbg(&_dev->dev, "base=0x%08x\n", ++ (unsigned)dwc_otg_device->os_dep.base); ++#elif defined(PCI_INTERFACE) + _dev->current_state = PCI_D0; + _dev->dev.power.power_state = PMSG_ON; -+ ++ + if (!_dev->irq) { -+ DWC_ERROR("Found HC with no IRQ. Check BIOS/PCI %s setup!", pci_name(_dev)); -+ retval = -ENODEV; -+ goto fail; -+ } ++ DWC_ERROR("Found HC with no IRQ. Check BIOS/PCI %s setup!", ++ pci_name(_dev)); ++ iounmap(dwc_otg_device->os_dep.base); ++ DWC_FREE(dwc_otg_device); ++ return -ENODEV; ++ } + -+ dwc_otg_device->rsrc_start = pci_resource_start(_dev,0); -+ dwc_otg_device->rsrc_len = pci_resource_len(_dev,0); -+ DWC_DEBUGPL(DBG_ANY,"PCI resource: start=%08x, len=%08x\n", -+ dwc_otg_device->rsrc_start, -+ dwc_otg_device->rsrc_len); -+ if (!request_mem_region(dwc_otg_device->rsrc_start, dwc_otg_device->rsrc_len, "dwc_otg")) { -+ dev_dbg(&_dev->dev, "error mapping memory\n"); -+ retval = -EFAULT; -+ goto fail; -+ } ++ dwc_otg_device->os_dep.rsrc_start = pci_resource_start(_dev, 0); ++ dwc_otg_device->os_dep.rsrc_len = pci_resource_len(_dev, 0); ++ DWC_DEBUGPL(DBG_ANY, "PCI resource: start=%08x, len=%08x\n", ++ (unsigned)dwc_otg_device->os_dep.rsrc_start, ++ (unsigned)dwc_otg_device->os_dep.rsrc_len); ++ if (!request_mem_region ++ (dwc_otg_device->os_dep.rsrc_start, dwc_otg_device->os_dep.rsrc_len, ++ "dwc_otg")) { ++ dev_dbg(&_dev->dev, "error requesting memory\n"); ++ iounmap(dwc_otg_device->os_dep.base); ++ DWC_FREE(dwc_otg_device); ++ return -EFAULT; ++ } + -+ dwc_otg_device->base = ioremap_nocache(dwc_otg_device->rsrc_start, dwc_otg_device->rsrc_len); -+ if (dwc_otg_device->base == NULL) { -+ dev_dbg(&_dev->dev, "error mapping memory\n"); -+ retval = -EFAULT; -+ goto fail; -+ } -+ dev_dbg(&_dev->dev, "base=0x%p (before adjust) \n", dwc_otg_device->base); -+ dwc_otg_device->base = (char *)dwc_otg_device->base; -+ dev_dbg(&_dev->dev, "base=0x%p (after adjust) \n", dwc_otg_device->base); -+ dev_dbg(&_dev->dev, "%s: mapped PA 0x%x to VA 0x%p\n", __func__, -+ (unsigned)dwc_otg_device->rsrc_start, dwc_otg_device->base); -+ // -+ pci_set_drvdata(_dev, dwc_otg_device); -+ pci_set_master(_dev); ++ dwc_otg_device->os_dep.base = ++ ioremap_nocache(dwc_otg_device->os_dep.rsrc_start, ++ dwc_otg_device->os_dep.rsrc_len); ++ if (dwc_otg_device->os_dep.base == NULL) { ++ dev_dbg(&_dev->dev, "error mapping memory\n"); ++ release_mem_region(dwc_otg_device->os_dep.rsrc_start, ++ dwc_otg_device->os_dep.rsrc_len); ++ iounmap(dwc_otg_device->os_dep.base); ++ DWC_FREE(dwc_otg_device); ++ return -EFAULT; ++ } ++ dev_dbg(&_dev->dev, "base=0x%p (before adjust) \n", ++ dwc_otg_device->os_dep.base); ++ dwc_otg_device->os_dep.base = (char *)dwc_otg_device->os_dep.base; ++ dev_dbg(&_dev->dev, "base=0x%p (after adjust) \n", ++ dwc_otg_device->os_dep.base); ++ dev_dbg(&_dev->dev, "%s: mapped PA 0x%x to VA 0x%p\n", __func__, ++ (unsigned)dwc_otg_device->os_dep.rsrc_start, ++ dwc_otg_device->os_dep.base); ++ ++ pci_set_master(_dev); ++ pci_set_drvdata(_dev, dwc_otg_device); +#elif defined(PLATFORM_INTERFACE) + DWC_DEBUGPL(DBG_ANY,"Platform resource: start=%08x, len=%08x\n", + _dev->resource->start, + _dev->resource->end - _dev->resource->start + 1); +#if 1 -+ if (!request_mem_region(_dev->resource->start, -+ _dev->resource->end - _dev->resource->start + 1, ++ if (!request_mem_region(_dev->resource[0].start, ++ _dev->resource[0].end - _dev->resource[0].start + 1, + "dwc_otg")) { + dev_dbg(&_dev->dev, "error reserving mapped memory\n"); + retval = -EFAULT; + goto fail; + } + -+ dwc_otg_device->base = ioremap_nocache(_dev->resource->start, -+ _dev->resource->end - -+ _dev->resource->start + 1); ++ dwc_otg_device->os_dep.base = ioremap_nocache(_dev->resource[0].start, ++ _dev->resource[0].end - ++ _dev->resource[0].start+1); ++ if (fiq_fix_enable) ++ { ++ if (!request_mem_region(_dev->resource[1].start, ++ _dev->resource[1].end - _dev->resource[1].start + 1, ++ "dwc_otg")) { ++ dev_dbg(&_dev->dev, "error reserving mapped memory\n"); ++ retval = -EFAULT; ++ goto fail; ++ } ++ ++ dwc_otg_device->os_dep.mphi_base = ioremap_nocache(_dev->resource[1].start, ++ _dev->resource[1].end - ++ _dev->resource[1].start + 1); ++ dummy_send = (void *) kmalloc(16, GFP_ATOMIC); ++ } ++ +#else + { + struct map_desc desc = { @@ -49763,15 +61147,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + .type = MT_DEVICE + }; + iotable_init(&desc, 1); -+ dwc_otg_device->base = (void *)desc.virtual; ++ dwc_otg_device->os_dep.base = (void *)desc.virtual; + } +#endif -+ if (!dwc_otg_device->base) { ++ if (!dwc_otg_device->os_dep.base) { + dev_err(&_dev->dev, "ioremap() failed\n"); + retval = -ENOMEM; + goto fail; + } -+ dev_dbg(&_dev->dev, "base=0x%08x\n", (unsigned)dwc_otg_device->base); ++ dev_dbg(&_dev->dev, "base=0x%08x\n", ++ (unsigned)dwc_otg_device->os_dep.base); +#endif + + /* @@ -49785,7 +61170,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot +#endif + dev_dbg(&_dev->dev, "dwc_otg_device=0x%p\n", dwc_otg_device); + -+ dwc_otg_device->core_if = dwc_otg_cil_init(dwc_otg_device->base); ++ dwc_otg_device->core_if = dwc_otg_cil_init(dwc_otg_device->os_dep.base); + DWC_DEBUGPL(DBG_HCDV, "probe of device %p given core_if %p\n", + dwc_otg_device, dwc_otg_device->core_if);//GRAYG + @@ -49799,15 +61184,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + /* + * Attempt to ensure this device is really a DWC_otg Controller. + * Read and verify the SNPSID register contents. The value should be -+ * 0x45F42XXX, which corresponds to "OT2", as in "OTG version 2.XX". ++ * 0x45F42XXX or 0x45F42XXX, which corresponds to either "OT2" or "OTG3", ++ * as in "OTG version 2.XX" or "OTG version 3.XX". + */ + -+ if ((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) != -+ 0x4F542000) { ++ if (((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) != 0x4F542000) && ++ ((dwc_otg_get_gsnpsid(dwc_otg_device->core_if) & 0xFFFFF000) != 0x4F543000)) { + dev_err(&_dev->dev, "Bad value for SNPSID: 0x%08x\n", + dwc_otg_get_gsnpsid(dwc_otg_device->core_if)); -+ dwc_otg_cil_remove(dwc_otg_device->core_if); -+ dwc_free(dwc_otg_device); + retval = -EINVAL; + goto fail; + } @@ -49817,7 +61201,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + */ + dev_dbg(&_dev->dev, "Calling set_parameters\n"); + if (set_parameters(dwc_otg_device->core_if)) { -+ dwc_otg_cil_remove(dwc_otg_device->core_if); + retval = -EINVAL; + goto fail; + } @@ -49828,12 +61211,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + dev_dbg(&_dev->dev, "Calling attr_create\n"); + dwc_otg_attr_create(_dev); + -+#ifdef SOF_FIX -+ retval = init_proc_fs(); -+ if (retval) -+ goto fail; -+#endif -+ + /* + * Disable the global interrupt until all the interrupt + * handlers are installed. @@ -49845,6 +61222,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + * Install the interrupt handler for the common interrupts before + * enabling common interrupts in core_init below. + */ ++ +#if defined(PLATFORM_INTERFACE) + devirq = platform_get_irq(_dev, 0); +#else @@ -49876,13 +61254,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + ); +#endif +#endif /*IRQF_TRIGGER_LOW*/ -+ ++ + /* + * Initialize the DWC_otg core. + */ + dev_dbg(&_dev->dev, "Calling dwc_otg_core_init\n"); + dwc_otg_core_init(dwc_otg_device->core_if); -+ ++ +#ifndef DWC_HOST_ONLY + /* + * Initialize the PCD @@ -49893,7 +61271,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + DWC_ERROR("pcd_init failed\n"); + dwc_otg_device->pcd = NULL; + goto fail; -+ } ++ } +#endif +#ifndef DWC_DEVICE_ONLY + /* @@ -49914,19 +61292,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + platform_set_drvdata(_dev, dwc_otg_device); +#elif defined(PCI_INTERFACE) + pci_set_drvdata(_dev, dwc_otg_device); ++ dwc_otg_device->os_dep.pcidev = _dev; +#endif + + /* + * Enable the global interrupt after all the interrupt -+ * handlers are installed. ++ * handlers are installed if there is no ADP support else ++ * perform initial actions required for Internal ADP logic. + */ -+ dev_dbg(&_dev->dev, "Calling enable_global_interrupts\n"); -+ dwc_otg_enable_global_interrupts(dwc_otg_device->core_if); -+ dev_dbg(&_dev->dev, "Done\n"); ++ if (!dwc_otg_get_param_adp_enable(dwc_otg_device->core_if)) { ++ dev_dbg(&_dev->dev, "Calling enable_global_interrupts\n"); ++ dwc_otg_enable_global_interrupts(dwc_otg_device->core_if); ++ dev_dbg(&_dev->dev, "Done\n"); ++ } else ++ dwc_otg_adp_start(dwc_otg_device->core_if, ++ dwc_otg_is_host_mode(dwc_otg_device->core_if)); + + return 0; + -+ fail: ++fail: + dwc_otg_driver_remove(_dev); + return retval; +} @@ -49944,32 +61328,32 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + */ +#ifdef LM_INTERFACE +static struct lm_driver dwc_otg_driver = { -+ .drv = { -+ .name = (char *)dwc_driver_name, -+ }, ++ .drv = {.name = (char *)dwc_driver_name,}, + .probe = dwc_otg_driver_probe, + .remove = dwc_otg_driver_remove, + // 'suspend' and 'resume' absent +}; +#elif defined(PCI_INTERFACE) +static const struct pci_device_id pci_ids[] = { { -+ PCI_DEVICE(0x16c3, 0xabcd), -+ .driver_data = (unsigned long) 0xdeadbeef, -+ }, { /* end: all zeroes */ } ++ PCI_DEVICE(0x16c3, 0xabcd), ++ .driver_data = ++ (unsigned long)0xdeadbeef, ++ }, { /* end: all zeroes */ } +}; ++ +MODULE_DEVICE_TABLE(pci, pci_ids); + +/* pci driver glue; this is a "new style" PCI driver module */ +static struct pci_driver dwc_otg_driver = { -+ .name = "dwc_otg", -+ .id_table = pci_ids, ++ .name = "dwc_otg", ++ .id_table = pci_ids, + -+ .probe = dwc_otg_driver_probe, -+ .remove = dwc_otg_driver_remove, ++ .probe = dwc_otg_driver_probe, ++ .remove = dwc_otg_driver_remove, + -+ .driver = { -+ .name = (char*)dwc_driver_name, -+ }, ++ .driver = { ++ .name = (char *)dwc_driver_name, ++ }, +}; +#elif defined(PLATFORM_INTERFACE) +static struct platform_device_id platform_ids[] = { @@ -49993,7 +61377,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot +}; +#endif + -+ +/** + * This function is called when the dwc_otg_driver is installed with the + * insmod command. It registers the dwc_otg_driver structure with the @@ -50004,46 +61387,36 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + * + * @return + */ -+ +static int __init dwc_otg_driver_init(void) +{ + int retval = 0; + int error; ++ struct device_driver *drv; + printk(KERN_INFO "%s: version %s (%s bus)\n", dwc_driver_name, + DWC_DRIVER_VERSION, +#ifdef LM_INTERFACE + "logicmodule"); + retval = lm_driver_register(&dwc_otg_driver); ++ drv = &dwc_otg_driver.drv; +#elif defined(PCI_INTERFACE) + "pci"); + retval = pci_register_driver(&dwc_otg_driver); ++ drv = &dwc_otg_driver.driver; +#elif defined(PLATFORM_INTERFACE) + "platform"); + retval = platform_driver_register(&dwc_otg_driver); ++ drv = &dwc_otg_driver.driver; +#endif + if (retval < 0) { + printk(KERN_ERR "%s retval=%d\n", __func__, retval); + return retval; + } -+#ifdef LM_INTERFACE -+ error = driver_create_file(&dwc_otg_driver.drv, &driver_attr_version); -+ error = driver_create_file(&dwc_otg_driver.drv, &driver_attr_debuglevel); -+#elif defined(PCI_INTERFACE) -+ error = driver_create_file(&dwc_otg_driver.driver, -+ &driver_attr_version); -+ error = driver_create_file(&dwc_otg_driver.driver, -+ &driver_attr_debuglevel); -+#elif defined(PLATFORM_INTERFACE) -+ error = driver_create_file(&dwc_otg_driver.driver, -+ &driver_attr_version); -+ error = driver_create_file(&dwc_otg_driver.driver, -+ &driver_attr_debuglevel); -+#endif ++ printk(KERN_DEBUG "dwc_otg: FIQ %s\n", fiq_fix_enable ? "enabled":"disabled"); + -+#ifdef SOF_FIX -+ retval = init_proc_fs(); ++ error = driver_create_file(drv, &driver_attr_version); ++#ifdef DEBUG ++ error = driver_create_file(drv, &driver_attr_debuglevel); +#endif -+ + return retval; +} + @@ -50075,6 +61448,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + + printk(KERN_INFO "%s module removed\n", dwc_driver_name); +} ++ +module_exit(dwc_otg_driver_cleanup); + +MODULE_DESCRIPTION(DWC_DRIVER_DESC); @@ -50298,8 +61672,29 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot +module_param_named(ic_usb_cap, dwc_otg_module_params.ic_usb_cap, int, 0444); +MODULE_PARM_DESC(ic_usb_cap, + "IC_USB Capability 0=IC_USB Disabled 1=IC_USB Enabled"); -+module_param_named(ahb_thr_ratio, dwc_otg_module_params.ahb_thr_ratio, int, 0444); ++module_param_named(ahb_thr_ratio, dwc_otg_module_params.ahb_thr_ratio, int, ++ 0444); +MODULE_PARM_DESC(ahb_thr_ratio, "AHB Threshold Ratio"); ++module_param_named(power_down, dwc_otg_module_params.power_down, int, 0444); ++MODULE_PARM_DESC(power_down, "Power Down Mode"); ++module_param_named(reload_ctl, dwc_otg_module_params.reload_ctl, int, 0444); ++MODULE_PARM_DESC(reload_ctl, "HFIR Reload Control"); ++module_param_named(dev_out_nak, dwc_otg_module_params.dev_out_nak, int, 0444); ++MODULE_PARM_DESC(dev_out_nak, "Enable Device OUT NAK"); ++module_param_named(cont_on_bna, dwc_otg_module_params.cont_on_bna, int, 0444); ++MODULE_PARM_DESC(cont_on_bna, "Enable Enable Continue on BNA"); ++module_param_named(ahb_single, dwc_otg_module_params.ahb_single, int, 0444); ++MODULE_PARM_DESC(ahb_single, "Enable AHB Single Support"); ++module_param_named(adp_enable, dwc_otg_module_params.adp_enable, int, 0444); ++MODULE_PARM_DESC(adp_enable, "ADP Enable 0=ADP Disabled 1=ADP Enabled"); ++module_param_named(otg_ver, dwc_otg_module_params.otg_ver, int, 0444); ++MODULE_PARM_DESC(otg_ver, "OTG revision supported 0=OTG 1.3 1=OTG 2.0"); ++module_param(microframe_schedule, bool, 0444); ++MODULE_PARM_DESC(microframe_schedule, "Enable the microframe scheduler"); ++ ++ ++module_param(fiq_fix_enable, bool, 0444); ++MODULE_PARM_DESC(fiq_fix_enable, "Enable the fiq fix"); + +/** @page "Module Parameters" + * @@ -50487,7 +61882,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + + + -+ otg_en_multiple_tx_fifo ++ ulpi_fs_ls ++ Specifies whether to use ULPI FS/LS mode only. ++ - 0: Disabled (default) ++ - 1: Enabled ++ ++ ++ ++ ts_dline ++ Specifies whether term select D-Line pulsing for all PHYs is enabled. ++ - 0: Disabled (default) ++ - 1: Enabled ++ ++ ++ ++ en_multiple_tx_fifo + Specifies whether dedicatedto tx fifos are enabled for non periodic IN EPs. + The driver will automatically detect the value for this parameter if none is + specified. @@ -50516,9 +61925,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + + + thr_ctl -+ Specifies whether to enable Thresholding for Device mode. Bits 0, 1, 2 of this -+ parmater specifies if thresholding is enabled for non-Iso Tx, Iso Tx and Rx -+ transfers accordingly. ++ Specifies whether to enable Thresholding for Device mode. Bits 0, 1, 2 of ++ this parmater specifies if thresholding is enabled for non-Iso Tx, Iso Tx and ++ Rx transfers accordingly. + The driver will automatically detect the value for this parameter if none is + specified. + - Values: 0 to 7 (default 0) @@ -50542,7 +61951,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + The driver will automatically detect the value for this parameter if none is + specified. + - 0: MPI disabled (default) -+ - 1: MPI enable ++ - 1: MPI enable + + + @@ -50551,7 +61960,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + The driver will automatically detect the value for this parameter if none is + specified. + - 0: PTI disabled (default) -+ - 1: PTI enable ++ - 1: PTI enable + + + @@ -50563,22 +61972,96 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-rpi-boot + - 1: LPM enable (default, if available) + + -+ ++ ++ ic_usb_cap ++ Specifies whether to enable IC_USB capability. ++ The driver will automatically detect the value for this parameter if none is ++ specified. ++ - 0: IC_USB disabled (default, if available) ++ - 1: IC_USB enable ++ ++ ++ + ahb_thr_ratio + Specifies AHB Threshold ratio. + - Values: 0 to 3 (default 0) + + ++ ++ power_down ++ Specifies Power Down(Hibernation) Mode. ++ The driver will automatically detect the value for this parameter if none is ++ specified. ++ - 0: Power Down disabled (default) ++ - 2: Power Down enabled ++ ++ ++ ++ reload_ctl ++ Specifies whether dynamic reloading of the HFIR register is allowed during ++ run time. The driver will automatically detect the value for this parameter if ++ none is specified. In case the HFIR value is reloaded when HFIR.RldCtrl == 1'b0 ++ the core might misbehave. ++ - 0: Reload Control disabled (default) ++ - 1: Reload Control enabled ++ ++ ++ ++ dev_out_nak ++ Specifies whether Device OUT NAK enhancement enabled or no. ++ The driver will automatically detect the value for this parameter if ++ none is specified. This parameter is valid only when OTG_EN_DESC_DMA == 1b1. ++ - 0: The core does not set NAK after Bulk OUT transfer complete (default) ++ - 1: The core sets NAK after Bulk OUT transfer complete ++ ++ ++ ++ cont_on_bna ++ Specifies whether Enable Continue on BNA enabled or no. ++ After receiving BNA interrupt the core disables the endpoint,when the ++ endpoint is re-enabled by the application the ++ - 0: Core starts processing from the DOEPDMA descriptor (default) ++ - 1: Core starts processing from the descriptor which received the BNA. ++ This parameter is valid only when OTG_EN_DESC_DMA == 1b1. ++ ++ ++ ++ ahb_single ++ This bit when programmed supports SINGLE transfers for remainder data ++ in a transfer for DMA mode of operation. ++ - 0: The remainder data will be sent using INCR burst size (default) ++ - 1: The remainder data will be sent using SINGLE burst size. ++ ++ ++ ++ adp_enable ++ Specifies whether ADP feature is enabled. ++ The driver will automatically detect the value for this parameter if none is ++ specified. ++ - 0: ADP feature disabled (default) ++ - 1: ADP feature enabled ++ ++ ++ ++ otg_ver ++ Specifies whether OTG is performing as USB OTG Revision 2.0 or Revision 1.3 ++ USB OTG device. ++ - 0: OTG 2.0 support disabled (default) ++ - 1: OTG 2.0 support enabled ++ ++ +*/ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2012-07-15 20:29:19.139084655 +0200 -@@ -0,0 +1,101 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_driver.h b/drivers/usb/host/dwc_otg/dwc_otg_driver.h +new file mode 100644 +index 0000000..8a0e41b +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_driver.h +@@ -0,0 +1,86 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $ -+ * $Revision: #16 $ -+ * $Date: 2009/04/03 $ -+ * $Change: 1225160 $ ++ * $Revision: #19 $ ++ * $Date: 2010/11/15 $ ++ * $Change: 1627671 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -50613,41 +62096,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi-boot +/** @file + * This file contains the interface to the Linux driver. + */ ++#include "dwc_otg_os_dep.h" +#include "dwc_otg_core_if.h" + +/* Type declarations */ +struct dwc_otg_pcd; +struct dwc_otg_hcd; + -+#ifdef PCI_INTERFACE -+#include -+#endif -+ -+ -+ +/** + * This structure is a wrapper that encapsulates the driver components used to + * manage a single DWC_otg controller. + */ +typedef struct dwc_otg_device { -+ /** Base address returned from ioremap() */ -+ void *base; -+ -+#ifdef LM_INTERFACE -+ struct lm_device *lmdev; -+#elif defined(PCI_INTERFACE) -+ int rsrc_start; -+ int rsrc_len; -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *platformdev; -+#endif ++ /** Structure containing OS-dependent stuff. KEEP THIS STRUCT AT THE ++ * VERY BEGINNING OF THE DEVICE STRUCT. OSes such as FreeBSD and NetBSD ++ * require this. */ ++ struct os_dependent os_dep; + + /** Pointer to the core interface structure. */ + dwc_otg_core_if_t *core_if; + -+ /** Register offset for Diagnostic API. */ -+ uint32_t reg_offset; -+ + /** Pointer to the PCD structure. */ + struct dwc_otg_pcd *pcd; + @@ -50675,16 +62143,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-rpi-boot +#endif + +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2012-07-15 20:29:19.129084467 +0200 -@@ -0,0 +1,3390 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +new file mode 100644 +index 0000000..20f989e +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +@@ -0,0 +1,3478 @@ + +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.c $ -+ * $Revision: #87 $ -+ * $Date: 2009/04/23 $ -+ * $Change: 1239143 $ ++ * $Revision: #104 $ ++ * $Date: 2011/10/24 $ ++ * $Change: 1871159 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -50715,7 +62185,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +#ifndef DWC_DEVICE_ONLY + +/** @file -+ * This file implements HCD Core. All code in this file is portable and don't ++ * This file implements HCD Core. All code in this file is portable and doesn't + * use any OS specific functions. + * Interface provided by HCD Core is defined in + * header file. @@ -50724,14 +62194,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +#include "dwc_otg_hcd.h" +#include "dwc_otg_regs.h" + -+#ifdef HW2937_WORKAROUND -+//#include -+#include -+#endif -+ ++extern bool microframe_schedule; ++ ++//#define DEBUG_HOST_CHANNELS ++#ifdef DEBUG_HOST_CHANNELS ++static int last_sel_trans_num_per_scheduled = 0; ++static int last_sel_trans_num_nonper_scheduled = 0; ++static int last_sel_trans_num_avail_hc_at_start = 0; ++static int last_sel_trans_num_avail_hc_at_end = 0; ++#endif /* DEBUG_HOST_CHANNELS */ ++ ++extern int g_next_sched_frame, g_np_count, g_np_sent; ++ +dwc_otg_hcd_t *dwc_otg_hcd_alloc_hcd(void) +{ -+ return dwc_alloc(sizeof(dwc_otg_hcd_t)); ++ return DWC_ALLOC(sizeof(dwc_otg_hcd_t)); +} + +/** @@ -50745,38 +62222,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + __DWC_ERROR("Device Not Connected/Responding\n"); +} + -+/** -+ * SOF_FIX: Reduce the SOF overhead by disabling the SOF interrupt except -+ * when there are USB transfers pending. Re-enable the interrupt -+ * every tick for periodic transaction handling. MSO 5/31/12 -+ * SOF (Start of Frame) timeout function. Kick the driver by re-enabling -+ * the SOF interrupt -+ */ -+#ifdef SOF_FIX -+void dwc_otg_hcd_sof_timeout(void *ptr) -+{ -+ dwc_otg_hcd_t * hcd = (dwc_otg_hcd_t *)ptr; -+ dwc_otg_core_if_t *core_if = hcd->core_if; -+ gintmsk_data_t gintmsk = {.d32 = 0}; -+ dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs; -+ unsigned int intmsk; -+ -+ // turn on Start-of-Frame interrupt -+ gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk); -+ intmsk = gintmsk.d32; -+ gintmsk.b.sofintr |= 1; -+ dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32); -+ DWC_TIMER_SCHEDULE(hcd->sof_timer, 1); /* 1ms */ -+#ifdef DEBUG_SOF_FIX -+ if ((++sof_timeout_count % 10000) == 0) -+ printk(KERN_ERR "%s: %d timeouts handled, read 0x%x wrote 0x%x.", -+ __FUNCTION__, sof_timeout_count, intmsk, gintmsk.d32); -+#endif -+ -+} -+#endif -+ -+#ifdef DEBUG ++#if defined(DEBUG) +static void dump_channel_info(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) +{ + if (qh->channel != NULL) { @@ -50793,10 +62239,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + uint32_t hcdma; + + hc_regs = hcd->core_if->host_if->hc_regs[hc->hc_num]; -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); -+ hcsplt.d32 = dwc_read_reg32(&hc_regs->hcsplt); -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); -+ hcdma = dwc_read_reg32(&hc_regs->hcdma); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); ++ hcsplt.d32 = DWC_READ_REG32(&hc_regs->hcsplt); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); ++ hcdma = DWC_READ_REG32(&hc_regs->hcdma); + + DWC_PRINTF(" Assigned to channel %p:\n", hc); + DWC_PRINTF(" hcchar 0x%08x, hcsplt 0x%08x\n", hcchar.d32, @@ -50832,7 +62278,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + } +} -+#endif /* DEBUG */ ++#else ++#define dump_channel_info(hcd, qh) ++#endif /* DEBUG */ + +/** + * Work queue function for starting the HCD when A-Cable is connected. @@ -50882,8 +62330,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + qtd = DWC_CIRCLEQ_FIRST(&qh->qtd_list); + if (qtd->urb != NULL) { + hcd->fops->complete(hcd, qtd->urb->priv, -+ qtd->urb, -+ -DWC_E_TIMEOUT); ++ qtd->urb, -DWC_E_TIMEOUT); + dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); + } + @@ -50954,7 +62401,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtrst = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + } + DWC_WORKQ_SCHEDULE_DELAYED(core_if->wq_otg, + hcd_start_func, dwc_otg_hcd, 50, @@ -50988,9 +62435,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + intr.b.nptxfempty = 1; + intr.b.ptxfempty = 1; + intr.b.hcintr = 1; -+ dwc_modify_reg32(&dwc_otg_hcd->core_if->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&dwc_otg_hcd->core_if->core_global_regs->gintmsk, + intr.d32, 0); -+ dwc_modify_reg32(&dwc_otg_hcd->core_if->core_global_regs->gintsts, ++ DWC_MODIFY_REG32(&dwc_otg_hcd->core_if->core_global_regs->gintsts, + intr.d32, 0); + + del_timers(dwc_otg_hcd); @@ -51005,7 +62452,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hprt0_data_t hprt0 = {.d32 = 0 }; + DWC_PRINTF("Disconnect: PortPower off\n"); + hprt0.b.prtpwr = 0; -+ dwc_write_reg32(dwc_otg_hcd->core_if->host_if->hprt0, ++ DWC_WRITE_REG32(dwc_otg_hcd->core_if->host_if->hprt0, + hprt0.d32); + } + @@ -51032,17 +62479,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (DWC_CIRCLEQ_EMPTY_ENTRY + (channel, hc_list_entry)) { + hc_regs = -+ dwc_otg_hcd->core_if->host_if-> -+ hc_regs[i]; ++ dwc_otg_hcd->core_if-> ++ host_if->hc_regs[i]; + hcchar.d32 = -+ dwc_read_reg32(&hc_regs->hcchar); ++ DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen) { + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; -+ dwc_write_reg32(&hc_regs-> -+ hcchar, -+ hcchar.d32); ++ DWC_WRITE_REG32 ++ (&hc_regs->hcchar, ++ hcchar.d32); + } + } + } @@ -51053,25 +62500,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (DWC_CIRCLEQ_EMPTY_ENTRY(channel, hc_list_entry)) { + hc_regs = + dwc_otg_hcd->core_if->host_if->hc_regs[i]; -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen) { + /* Halt the channel. */ + hcchar.b.chdis = 1; -+ dwc_write_reg32(&hc_regs->hcchar, ++ DWC_WRITE_REG32(&hc_regs->hcchar, + hcchar.d32); + } + + dwc_otg_hc_cleanup(dwc_otg_hcd->core_if, + channel); -+ DWC_CIRCLEQ_INSERT_TAIL(&dwc_otg_hcd-> -+ free_hc_list, channel, -+ hc_list_entry); -+ /* -+ * Added for Descriptor DMA to prevent channel double cleanup ++ DWC_CIRCLEQ_INSERT_TAIL ++ (&dwc_otg_hcd->free_hc_list, channel, ++ hc_list_entry); ++ /* ++ * Added for Descriptor DMA to prevent channel double cleanup + * in release_channel_ddma(). Which called from ep_disable + * when device disconnect. -+ */ -+ channel->qh = NULL; ++ */ ++ channel->qh = NULL; + } + } + } @@ -51098,7 +62545,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +} + +#ifdef CONFIG_USB_DWC_OTG_LPM -+/** ++/** + * HCD Callback function for sleep of HCD. + * + * @param p void pointer to the struct usb_hcd @@ -51113,6 +62560,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +} +#endif + ++ +/** + * HCD Callback function for Remote Wakeup. + * @@ -51155,44 +62603,49 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + /* Turn off the vbus power */ + DWC_PRINTF("PortPower off\n"); + hprt0.b.prtpwr = 0; -+ dwc_write_reg32(hcd->core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(hcd->core_if->host_if->hprt0, hprt0.d32); + dwc_mdelay(1); +} + +int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_t * hcd, -+ dwc_otg_hcd_urb_t * dwc_otg_urb, void **ep_handle) ++ dwc_otg_hcd_urb_t * dwc_otg_urb, void **ep_handle, ++ int atomic_alloc) +{ -+ uint64_t flags; ++ dwc_irqflags_t flags; + int retval = 0; + dwc_otg_qtd_t *qtd; ++ gintmsk_data_t intr_mask = {.d32 = 0 }; + -+ if (NULL == hcd->core_if) { //GRAYG ++#ifdef DEBUG /* integrity checks (Broadcom) */ ++ if (NULL == hcd->core_if) { + DWC_ERROR("**** DWC OTG HCD URB Enqueue - HCD has NULL core_if\n"); + /* No longer connected. */ + return -DWC_E_INVALID; + } -+ ++#endif + if (!hcd->flags.b.port_connect_status) { + /* No longer connected. */ ++ DWC_ERROR("Not connected\n"); + return -DWC_E_NO_DEVICE; + } + -+ qtd = dwc_otg_hcd_qtd_create(dwc_otg_urb); ++ qtd = dwc_otg_hcd_qtd_create(dwc_otg_urb, atomic_alloc); + if (qtd == NULL) { + DWC_ERROR("DWC OTG HCD URB Enqueue failed creating QTD\n"); + return -DWC_E_NO_MEMORY; + } -+ if (qtd->urb == NULL) { //GRAYG ++#ifdef DEBUG /* integrity checks (Broadcom) */ ++ if (qtd->urb == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Enqueue created QTD with no URBs\n"); + return -DWC_E_NO_MEMORY; + } -+ if (qtd->urb->priv == NULL) { //GRAYG ++ if (qtd->urb->priv == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Enqueue created QTD URB with no URB handle\n"); + return -DWC_E_NO_MEMORY; + } -+ ++#endif + retval = -+ dwc_otg_hcd_qtd_add(qtd, hcd, (dwc_otg_qh_t **) ep_handle); ++ dwc_otg_hcd_qtd_add(qtd, hcd, (dwc_otg_qh_t **) ep_handle, atomic_alloc); + // creates a new queue in ep_handle if it doesn't exist already + if (retval < 0) { + DWC_ERROR("DWC OTG HCD URB Enqueue failed adding QTD. " @@ -51201,11 +62654,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } else { + qtd->qh = *ep_handle; + } -+ -+ if (hcd->core_if->dma_desc_enable && retval == 0) { -+ dwc_otg_transaction_type_e tr_type; -+ if ((qtd->qh->ep_type == UE_BULK) && !(qtd->urb->flags & URB_GIVEBACK_ASAP)) { -+ /* Do not schedule SG transcations until qtd has URB_GIVEBACK_ASAP set */ ++ intr_mask.d32 = DWC_READ_REG32(&hcd->core_if->core_global_regs->gintmsk); ++ if (!intr_mask.b.sofintr && retval == 0) { ++ dwc_otg_transaction_type_e tr_type; ++ if ((qtd->qh->ep_type == UE_BULK) ++ && !(qtd->urb->flags & URB_GIVEBACK_ASAP)) { ++ /* Do not schedule SG transactions until qtd has URB_GIVEBACK_ASAP set */ + return 0; + } + DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); @@ -51222,42 +62676,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +int dwc_otg_hcd_urb_dequeue(dwc_otg_hcd_t * hcd, + dwc_otg_hcd_urb_t * dwc_otg_urb) +{ -+ uint64_t flags; -+ + dwc_otg_qh_t *qh; + dwc_otg_qtd_t *urb_qtd; + -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); -+ -+ if (hcd == NULL) { //GRAYG ++#ifdef DEBUG /* integrity checks (Broadcom) */ ++ ++ if (hcd == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Dequeue has NULL HCD\n"); + return -DWC_E_INVALID; + } -+ if (dwc_otg_urb == NULL) { //GRAYG ++ if (dwc_otg_urb == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Dequeue has NULL URB\n"); + return -DWC_E_INVALID; + } -+ if (dwc_otg_urb->qtd == NULL) { //GRAYG ++ if (dwc_otg_urb->qtd == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Dequeue with NULL QTD\n"); + return -DWC_E_INVALID; + } + urb_qtd = dwc_otg_urb->qtd; -+ if (urb_qtd->qh == NULL) { //GRAYG ++ if (urb_qtd->qh == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Dequeue with QTD with NULL Q handler\n"); + return -DWC_E_INVALID; + } ++#else ++ urb_qtd = dwc_otg_urb->qtd; ++#endif + qh = urb_qtd->qh; -+#ifdef DEBUG + if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { + if (urb_qtd->in_process) { + dump_channel_info(hcd, qh); + } + } -+#endif -+ if (hcd->core_if == NULL) { //GRAYG ++#ifdef DEBUG /* integrity checks (Broadcom) */ ++ if (hcd->core_if == NULL) { + DWC_ERROR("**** DWC OTG HCD URB Dequeue HCD has NULL core_if\n"); + return -DWC_E_INVALID; + } ++#endif + if (urb_qtd->in_process && qh->channel) { + /* The QTD is in process (it has been assigned to a channel). */ + if (hcd->flags.b.port_connect_status) { @@ -51277,12 +62732,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * Free the QTD and clean up the associated QH. Leave the QH in the + * schedule if it has any remaining QTDs. + */ -+ ++ + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD URB Dequeue - " + "delete %sQueue handler\n", -+ hcd->core_if->dma_desc_enable?"DMA ":""); //GRAYG ++ hcd->core_if->dma_desc_enable?"DMA ":""); + if (!hcd->core_if->dma_desc_enable) { -+ uint8_t b = urb_qtd->in_process; ++ uint8_t b = urb_qtd->in_process; + dwc_otg_hcd_qtd_remove_and_free(hcd, urb_qtd, qh); + if (b) { + dwc_otg_hcd_qh_deactivate(hcd, qh, 0); @@ -51290,13 +62745,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } else if (DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { + dwc_otg_hcd_qh_remove(hcd, qh); + } -+ } -+ else { ++ } else { + dwc_otg_hcd_qtd_remove_and_free(hcd, urb_qtd, qh); + } -+ -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); -+ + return 0; +} + @@ -51305,7 +62756,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +{ + dwc_otg_qh_t *qh = (dwc_otg_qh_t *) ep_handle; + int retval = 0; -+ uint64_t flags; ++ dwc_irqflags_t flags; + + if (retry < 0) { + retval = -DWC_E_INVALID; @@ -51313,11 +62764,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + + if (!qh) { ++ retval = -DWC_E_INVALID; + goto done; + } + + DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); -+ ++ + while (!DWC_CIRCLEQ_EMPTY(&qh->qtd_list) && retry) { + DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + retry--; @@ -51326,20 +62778,33 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + + dwc_otg_hcd_qh_remove(hcd, qh); -+ ++ + DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); -+ /* -+ * Split dwc_otg_hcd_qh_remove_and_free() into qh_remove -+ * and qh_free to prevent stack dump on dwc_dma_free() with -+ * irq_disabled (spinlock_irqsave) in dwc_otg_hcd_desc_list_free() ++ /* ++ * Split dwc_otg_hcd_qh_remove_and_free() into qh_remove ++ * and qh_free to prevent stack dump on DWC_DMA_FREE() with ++ * irq_disabled (spinlock_irqsave) in dwc_otg_hcd_desc_list_free() + * and dwc_otg_hcd_frame_list_alloc(). + */ + dwc_otg_hcd_qh_free(hcd, qh); + -+ done: ++done: + return retval; +} + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) ++int dwc_otg_hcd_endpoint_reset(dwc_otg_hcd_t * hcd, void *ep_handle) ++{ ++ int retval = 0; ++ dwc_otg_qh_t *qh = (dwc_otg_qh_t *) ep_handle; ++ if (!qh) ++ return -DWC_E_INVALID; ++ ++ qh->data_toggle = DWC_OTG_HC_PID_DATA0; ++ return retval; ++} ++#endif ++ +/** + * HCD Callback structure for handling mode switching. + */ @@ -51368,11 +62833,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtrst = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + dwc_mdelay(60); + + hprt0.b.prtrst = 0; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + dwc_otg_hcd->flags.b.port_reset_change = 1; +} + @@ -51380,14 +62845,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +{ + dwc_list_link_t *item; + dwc_otg_qh_t *qh; ++ dwc_irqflags_t flags; + + if (!qh_list->next) { + /* The list hasn't been initialized yet. */ + return; + } -+ ++ /* ++ * Hold spinlock here. Not needed in that case if bellow ++ * function is being called from ISR ++ */ ++ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); + /* Ensure there are no QTDs or URBs left. */ + kill_urbs_in_qh_list(hcd, qh_list); ++ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + + DWC_LIST_FOREACH(item, qh_list) { + qh = DWC_LIST_ENTRY(item, dwc_otg_qh_t, qh_list_entry); @@ -51396,6 +62867,68 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +} + +/** ++ * Exit from Hibernation if Host did not detect SRP from connected SRP capable ++ * Device during SRP time by host power up. ++ */ ++void dwc_otg_hcd_power_up(void *ptr) ++{ ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ dwc_otg_core_if_t *core_if = (dwc_otg_core_if_t *) ptr; ++ ++ DWC_PRINTF("%s called\n", __FUNCTION__); ++ ++ if (!core_if->hibernation_suspend) { ++ DWC_PRINTF("Already exited from Hibernation\n"); ++ return; ++ } ++ ++ /* Switch on the voltage to the core */ ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Reset the core */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Disable power clamps */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ /* Remove reset the core signal */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnrstn = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Disable PMU interrupt */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ core_if->hibernation_suspend = 0; ++ ++ /* Disable PMU */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ dwc_udelay(10); ++ ++ /* Enable VBUS */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.dis_vbus = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, gpwrdn.d32, 0); ++ ++ core_if->op_state = A_HOST; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_hcd_start(core_if); ++} ++ ++/** + * Frees secondary storage associated with the dwc_otg_hcd structure contained + * in the struct usb_hcd field. + */ @@ -51427,25 +62960,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (hc != NULL) { + DWC_DEBUGPL(DBG_HCDV, "HCD Free channel #%i, hc=%p\n", + i, hc); -+ dwc_free(hc); ++ DWC_FREE(hc); + } + } + + if (dwc_otg_hcd->core_if->dma_enable) { + if (dwc_otg_hcd->status_buf_dma) { -+ dwc_dma_free(DWC_OTG_HCD_STATUS_BUF_SIZE, ++ DWC_DMA_FREE(DWC_OTG_HCD_STATUS_BUF_SIZE, + dwc_otg_hcd->status_buf, + dwc_otg_hcd->status_buf_dma); + } + } else if (dwc_otg_hcd->status_buf != NULL) { -+ dwc_free(dwc_otg_hcd->status_buf); ++ DWC_FREE(dwc_otg_hcd->status_buf); + } + DWC_SPINLOCK_FREE(dwc_otg_hcd->lock); ++ /* Set core_if's lock pointer to NULL */ ++ dwc_otg_hcd->core_if->lock = NULL; ++ + DWC_TIMER_FREE(dwc_otg_hcd->conn_timer); + DWC_TASK_FREE(dwc_otg_hcd->reset_tasklet); -+ dwc_free(dwc_otg_hcd); ++ ++#ifdef DWC_DEV_SRPCAP ++ if (dwc_otg_hcd->core_if->power_down == 2 && ++ dwc_otg_hcd->core_if->pwron_timer) { ++ DWC_TIMER_FREE(dwc_otg_hcd->core_if->pwron_timer); ++ } ++#endif ++ DWC_FREE(dwc_otg_hcd); +} + ++int init_hcd_usecs(dwc_otg_hcd_t *_hcd); ++ +int dwc_otg_hcd_init(dwc_otg_hcd_t * hcd, dwc_otg_core_if_t * core_if) +{ + int retval = 0; @@ -51454,11 +62999,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_hc_t *channel; + + hcd->lock = DWC_SPINLOCK_ALLOC(); -+ + DWC_DEBUGPL(DBG_HCDV, "init of HCD %p given core_if %p\n", -+ hcd, core_if);//GRAYG -+ ++ hcd, core_if); ++ if (!hcd->lock) { ++ DWC_ERROR("Could not allocate lock for pcd"); ++ DWC_FREE(hcd); ++ retval = -DWC_E_NO_MEMORY; ++ goto out; ++ } + hcd->core_if = core_if; ++ + /* Register the HCD CIL Callbacks */ + dwc_otg_cil_register_hcd_callbacks(hcd->core_if, + &hcd_cil_callbacks, hcd); @@ -51481,7 +63031,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + num_channels = hcd->core_if->core_params->host_channels; + DWC_MEMSET(hcd->hc_ptr_array, 0, sizeof(hcd->hc_ptr_array)); + for (i = 0; i < num_channels; i++) { -+ channel = dwc_alloc(sizeof(dwc_hc_t)); ++ channel = DWC_ALLOC(sizeof(dwc_hc_t)); + if (channel == NULL) { + retval = -DWC_E_NO_MEMORY; + DWC_ERROR("%s: host channel allocation failed\n", @@ -51504,15 +63054,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcd->conn_timer = DWC_TIMER_ALLOC("Connection timer", + dwc_otg_hcd_connect_timeout, 0); + -+#ifdef SOF_FIX -+ /* Initialize the Start of Frame interrupt timeout timer. */ -+ hcd->sof_timer = DWC_TIMER_ALLOC("SOF timer", -+ dwc_otg_hcd_sof_timeout, hcd); -+ DWC_TIMER_SCHEDULE(hcd->sof_timer, 1); /* 1ms */ -+#endif ++ printk(KERN_DEBUG "dwc_otg: Microframe scheduler %s\n", microframe_schedule ? "enabled":"disabled"); ++ if (microframe_schedule) ++ init_hcd_usecs(hcd); + + /* Initialize reset tasklet. */ -+ hcd->reset_tasklet = DWC_TASK_ALLOC(reset_tasklet_func, hcd); ++ hcd->reset_tasklet = DWC_TASK_ALLOC("reset_tasklet", reset_tasklet_func, hcd); ++#ifdef DWC_DEV_SRPCAP ++ if (hcd->core_if->power_down == 2) { ++ /* Initialize Power on timer for Host power up in case hibernation */ ++ hcd->core_if->pwron_timer = DWC_TIMER_ALLOC("PWRON TIMER", ++ dwc_otg_hcd_power_up, core_if); ++ } ++#endif + + /* + * Allocate space for storing data on status transactions. Normally no @@ -51522,10 +63076,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + if (hcd->core_if->dma_enable) { + hcd->status_buf = -+ dwc_dma_alloc(DWC_OTG_HCD_STATUS_BUF_SIZE, ++ DWC_DMA_ALLOC(DWC_OTG_HCD_STATUS_BUF_SIZE, + &hcd->status_buf_dma); + } else { -+ hcd->status_buf = dwc_alloc(DWC_OTG_HCD_STATUS_BUF_SIZE); ++ hcd->status_buf = DWC_ALLOC(DWC_OTG_HCD_STATUS_BUF_SIZE); + } + if (!hcd->status_buf) { + retval = -DWC_E_NO_MEMORY; @@ -51537,12 +63091,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcd->otg_port = 1; + hcd->frame_list = NULL; + hcd->frame_list_dma = 0; -+ -+#ifdef HW2937_WORKAROUND -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_IDLE; -+ hcd->hw2937_assigned_channels = 0; -+#endif -+ ++ hcd->periodic_qh_count = 0; +out: + return retval; +} @@ -51568,9 +63117,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcd->flags.d32 = 0; + + hcd->non_periodic_qh_ptr = &hcd->non_periodic_sched_active; -+ hcd->non_periodic_channels = 0; -+ hcd->periodic_channels = 0; -+ ++ if (!microframe_schedule) { ++ hcd->non_periodic_channels = 0; ++ hcd->periodic_channels = 0; ++ } else { ++ hcd->available_host_channels = hcd->core_if->core_params->host_channels; ++ } + /* + * Put all channels in the free channel list and clean up channel + * states. @@ -51590,6 +63142,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + /* Initialize the DWC core for host mode operation. */ + dwc_otg_core_host_init(hcd->core_if); ++ ++ /* Set core_if's lock pointer to the hcd->lock */ ++ hcd->core_if->lock = hcd->lock; +} + +/** @@ -51601,19 +63156,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * @param qh Transactions from the first QTD for this QH are selected and + * assigned to a free host channel. + */ -+#ifdef HW2937_WORKAROUND -+static int assign_and_init_hc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+#else +static void assign_and_init_hc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+#endif +{ + dwc_hc_t *hc; + dwc_otg_qtd_t *qtd; + dwc_otg_hcd_urb_t *urb; + void* ptr = NULL; -+#ifdef HW2937_WORKAROUND -+ int ep_is_in; -+#endif + + qtd = DWC_CIRCLEQ_FIRST(&qh->qtd_list); + @@ -51621,13 +63169,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_HCDV, "%s(%p,%p) - urb %x, actual_length %d\n", __func__, hcd, qh, (unsigned int)urb, urb->actual_length); + -+#ifdef HW2937_WORKAROUND -+ ep_is_in = (dwc_otg_hcd_is_pipe_in(&urb->pipe_info) != 0); -+ if (ep_is_in && ((hcd->hw2937_xfer_mode == HW2937_XFER_MODE_OUT) || -+ (hcd->hw2937_xfer_mode == HW2937_XFER_MODE_PAUSEIN))) -+ return 0; -+#endif -+ + if (((urb->actual_length < 0) || (urb->actual_length > urb->length)) && !dwc_otg_hcd_is_pipe_in(&urb->pipe_info)) + urb->actual_length = urb->length; + @@ -51636,8 +63177,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + /* Remove the host channel from the free list. */ + DWC_CIRCLEQ_REMOVE_INIT(&hcd->free_hc_list, hc, hc_list_entry); ++ + qh->channel = hc; -+ ++ + qtd->in_process = 1; + + /* @@ -51662,20 +63204,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * started to accommodate the max widths of the XferSize and PktCnt + * fields in the HCTSIZn register. + */ -+ hc->do_ping = qh->ping_state; -+#ifdef HW2937_WORKAROUND -+ hc->ep_is_in = ep_is_in; -+#else ++ + hc->ep_is_in = (dwc_otg_hcd_is_pipe_in(&urb->pipe_info) != 0); -+#endif ++ if (hc->ep_is_in) { ++ hc->do_ping = 0; ++ } else { ++ hc->do_ping = qh->ping_state; ++ } ++ + hc->data_pid_start = qh->data_toggle; + hc->multi_count = 1; + + if (hcd->core_if->dma_enable) { + hc->xfer_buff = (uint8_t *) urb->dma + urb->actual_length; -+ ++ + /* For non-dword aligned case */ -+ if (((uint32_t)hc->xfer_buff & 0x3) && !hcd->core_if->dma_desc_enable) { ++ if (((unsigned long)hc->xfer_buff & 0x3) ++ && !hcd->core_if->dma_desc_enable) { + ptr = (uint8_t *) urb->buf + urb->actual_length; + } + } else { @@ -51734,7 +63279,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (hc->ep_is_in) { + hc->do_ping = 0; + } -+ ++ + hc->data_pid_start = DWC_OTG_HC_PID_DATA1; + + hc->xfer_len = 0; @@ -51756,16 +63301,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + case UE_ISOCHRONOUS: + { + struct dwc_otg_hcd_iso_packet_desc *frame_desc; -+ ++ + hc->ep_type = DWC_OTG_EP_TYPE_ISOC; -+ ++ + if (hcd->core_if->dma_desc_enable) + break; -+ ++ + frame_desc = &urb->iso_descs[qtd->isoc_frame_index]; -+ ++ + frame_desc->status = 0; -+ ++ + if (hcd->core_if->dma_enable) { + hc->xfer_buff = (uint8_t *) urb->dma; + } else { @@ -51777,12 +63322,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + frame_desc->length - qtd->isoc_split_offset; + + /* For non-dword aligned buffers */ -+ if (((uint32_t)hc->xfer_buff & 0x3) && hcd->core_if->dma_enable) { -+ ptr = (uint8_t *) urb->buf + frame_desc->offset + qtd->isoc_split_offset; -+ } -+ else -+ ptr = NULL; -+ ++ if (((unsigned long)hc->xfer_buff & 0x3) ++ && hcd->core_if->dma_enable) { ++ ptr = ++ (uint8_t *) urb->buf + frame_desc->offset + ++ qtd->isoc_split_offset; ++ } else ++ ptr = NULL; ++ + if (hc->xact_pos == DWC_HCSPLIT_XACTPOS_ALL) { + if (hc->xfer_len <= 188) { + hc->xact_pos = DWC_HCSPLIT_XACTPOS_ALL; @@ -51803,25 +63350,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + buf_size = 4096; + } + if (!qh->dw_align_buf) { -+ qh->dw_align_buf = -+ dwc_dma_alloc_atomic(buf_size, -+ &qh->dw_align_buf_dma); ++ qh->dw_align_buf = DWC_DMA_ALLOC_ATOMIC(buf_size, ++ &qh->dw_align_buf_dma); + if (!qh->dw_align_buf) { -+ DWC_ERROR("%s: Failed to allocate memory to handle " -+ "non-dword aligned buffer case\n", __func__); -+#ifdef HW2937_WORKAROUND -+ return 0; -+#else ++ DWC_ERROR ++ ("%s: Failed to allocate memory to handle " ++ "non-dword aligned buffer case\n", ++ __func__); + return; -+#endif + } + } + if (!hc->ep_is_in) { + dwc_memcpy(qh->dw_align_buf, ptr, hc->xfer_len); + } + hc->align_buff = qh->dw_align_buf_dma; -+ } -+ else { ++ } else { + hc->align_buff = 0; + } + @@ -51833,184 +63376,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + hc->multi_count = dwc_hb_mult(qh->maxp); + } -+ ++ + if (hcd->core_if->dma_desc_enable) + hc->desc_list_addr = qh->desc_list_dma; -+ ++ + dwc_otg_hc_init(hcd->core_if, hc); + hc->qh = qh; -+#ifdef HW2937_WORKAROUND -+ hcd->hw2937_assigned_channels |= (1 << hc->hc_num); -+ DWC_DEBUGPL(DBG_HW2937, " assign %d -> hw2937_ac %x\n", hc->hc_num, hcd->hw2937_assigned_channels); -+ return 1; -+#endif +} + -+#ifdef HW2937_WORKAROUND -+ -+void debug_halt(void) -+{ -+ spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; -+ unsigned long flags; -+ extern void v6_flush_kern_cache_all(void); -+ -+ spin_lock_irqsave(&mr_lock, flags); -+#ifdef CONFIG_MACH_BCM2708 -+ v6_flush_kern_cache_all(); -+#endif -+ while (1) continue; -+} -+ -+static -+void dwc_otg_hcd_disable_in_channels(dwc_otg_hcd_t * hcd) -+{ -+ int num_channels = hcd->core_if->core_params->host_channels; -+ static int stall_count = 0; -+ static int max_stall_count = 1; -+ static int last_stalled = 0; -+ int stalled = 0; -+ int i; -+ -+ DWC_DEBUGPL(DBG_HW2937, " Disable In Channels(%x)\n", hcd->hw2937_assigned_channels); -+ -+ for (i = 0; i < num_channels; i++) { -+ if (hcd->hw2937_assigned_channels & (1 << i)) { -+ dwc_hc_t *hc = hcd->hc_ptr_array[i]; -+ if (!hc->halt_pending) { -+ dwc_otg_hc_regs_t *hc_regs = hcd->core_if->host_if->hc_regs[hc->hc_num]; -+ hctsiz_data_t hctsiz; -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); -+ DWC_DEBUGPL(DBG_HW2937, "pktcnt %d, xfersize %x, xfer_len %x\n", hctsiz.b.pktcnt, hctsiz.b.xfersize, hc->xfer_len); -+ if (hctsiz.b.pktcnt == hc->start_pkt_count) -+ { -+ dwc_otg_hc_halt(hcd->core_if, hc, DWC_OTG_HC_XFER_PAUSE_IN); -+ } -+ else -+ { -+ /* Unless a receive is in progress */ -+ stalled |= (1< max_stall_count) -+ { -+ max_stall_count = stall_count; -+ DWC_PRINTF( "stall (%x) count -> %d\n", stalled, stall_count); -+ if (stall_count == 10) -+ { -+ debug_halt(); -+ } -+ } -+ } -+ else -+ { -+ stall_count = 0; -+ last_stalled = stalled; -+ } -+} -+ -+static -+int dwc_otg_hcd_update_transaction_mode(dwc_otg_hcd_t * hcd) -+{ -+ dwc_list_link_t *qh_ptr; -+ dwc_otg_qh_t *qh; -+ dwc_otg_qtd_t *qtd; -+ dwc_otg_hcd_urb_t *urb; -+ int found_in = 0; -+ -+ /* If there are any existing out transactions, stay in OUT mode */ -+ if (hcd->hw2937_xfer_mode == HW2937_XFER_MODE_OUT) -+ { -+ return 1; -+ } -+ -+ /* Scan entries in the periodic ready list. */ -+ qh_ptr = DWC_LIST_FIRST(&hcd->periodic_sched_ready); -+ -+ while (qh_ptr != &hcd->periodic_sched_ready) { -+ qh = DWC_LIST_ENTRY(qh_ptr, dwc_otg_qh_t, qh_list_entry); -+ qtd = DWC_CIRCLEQ_FIRST(&qh->qtd_list); -+ urb = qtd->urb; -+ if (!dwc_otg_hcd_is_pipe_in(&urb->pipe_info)) { -+ /* Switch to OUT mode */ -+ switch (hcd->hw2937_xfer_mode) -+ { -+ case HW2937_XFER_MODE_IDLE: -+ DWC_DEBUGPL(DBG_HW2937, "utm -> OUT\n"); -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_OUT; -+ /* Drop through... */ -+ case HW2937_XFER_MODE_OUT: -+ return 1; -+ case HW2937_XFER_MODE_IN: -+ DWC_DEBUGPL(DBG_HW2937, "utm - halting %x INs\n", hcd->hw2937_assigned_channels); -+ /* Disable the channels with outstanding INs */ -+ dwc_otg_hcd_disable_in_channels(hcd); -+ -+ DWC_DEBUGPL(DBG_HW2937, "utm -> PAUSEIN\n"); -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_PAUSEIN; -+ /* Drop through... */ -+ case HW2937_XFER_MODE_PAUSEIN: -+ /* Delay until the halt completes */ -+ return 0; -+ } -+ } -+ found_in = 1; -+ qh_ptr = DWC_LIST_NEXT(qh_ptr); -+ } -+ -+ /* -+ * Scan entries in the inactive portion of the non-periodic -+ * schedule. -+ */ -+ qh_ptr = hcd->non_periodic_sched_inactive.next; -+ while (qh_ptr != &hcd->non_periodic_sched_inactive) { -+ qh = DWC_LIST_ENTRY(qh_ptr, dwc_otg_qh_t, qh_list_entry); -+ qtd = DWC_CIRCLEQ_FIRST(&qh->qtd_list); -+ urb = qtd->urb; -+ if (!dwc_otg_hcd_is_pipe_in(&urb->pipe_info)) { -+ /* Switch to OUT mode */ -+ switch (hcd->hw2937_xfer_mode) -+ { -+ case HW2937_XFER_MODE_IDLE: -+ DWC_DEBUGPL(DBG_HW2937, "utm -> OUT\n"); -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_OUT; -+ /* Drop through... */ -+ case HW2937_XFER_MODE_OUT: -+ return 1; -+ case HW2937_XFER_MODE_IN: -+ DWC_DEBUGPL(DBG_HW2937, "utm - halting %x INs\n", hcd->hw2937_assigned_channels); -+ /* Disable the channels with outstanding INs */ -+ dwc_otg_hcd_disable_in_channels(hcd); -+ -+ DWC_DEBUGPL(DBG_HW2937, "utm -> PAUSEIN\n"); -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_PAUSEIN; -+ /* Drop through... */ -+ case HW2937_XFER_MODE_PAUSEIN: -+ /* Delay until the halt completes */ -+ return 0; -+ } -+ } -+ found_in = 1; -+ qh_ptr = DWC_LIST_NEXT(qh_ptr); -+ } -+ -+ if (found_in && (hcd->hw2937_xfer_mode == HW2937_XFER_MODE_IDLE)) -+ { -+ DWC_DEBUGPL(DBG_HW2937, "utm -> IN\n"); -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_IN; -+ } -+ return 1; -+} -+ -+#endif /* HW2937_WORKAROUND */ -+ +/** + * This function selects transactions from the HCD transfer schedule and + * assigns them to available host channels. It is called from HCD interrupt @@ -52025,64 +63398,53 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_list_link_t *qh_ptr; + dwc_otg_qh_t *qh; + int num_channels; ++ dwc_irqflags_t flags; ++ dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); + dwc_otg_transaction_type_e ret_val = DWC_OTG_TRANSACTION_NONE; -+#ifdef SOF_FIX -+ dwc_otg_core_if_t *core_if = hcd->core_if; -+ gintmsk_data_t gintmsk = {.d32 = 0}; -+ dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs; -+#endif + +#ifdef DEBUG_SOF + DWC_DEBUGPL(DBG_HCD, " Select Transactions\n"); +#endif + -+#ifdef HW2937_WORKAROUND -+ if (!dwc_otg_hcd_update_transaction_mode(hcd)) -+ { -+ return ret_val; -+ } -+#endif ++#ifdef DEBUG_HOST_CHANNELS ++ last_sel_trans_num_per_scheduled = 0; ++ last_sel_trans_num_nonper_scheduled = 0; ++ last_sel_trans_num_avail_hc_at_start = hcd->available_host_channels; ++#endif /* DEBUG_HOST_CHANNELS */ + + /* Process entries in the periodic ready list. */ + qh_ptr = DWC_LIST_FIRST(&hcd->periodic_sched_ready); + + while (qh_ptr != &hcd->periodic_sched_ready && + !DWC_CIRCLEQ_EMPTY(&hcd->free_hc_list)) { ++ if (microframe_schedule) { ++ // Make sure we leave one channel for non periodic transactions. ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); ++ if (hcd->available_host_channels <= 1) { ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++ break; ++ } ++ hcd->available_host_channels--; ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++#ifdef DEBUG_HOST_CHANNELS ++ last_sel_trans_num_per_scheduled++; ++#endif /* DEBUG_HOST_CHANNELS */ ++ } + qh = DWC_LIST_ENTRY(qh_ptr, dwc_otg_qh_t, qh_list_entry); -+#ifdef HW2937_WORKAROUND -+ if (assign_and_init_hc(hcd, qh)) { -+#else + assign_and_init_hc(hcd, qh); -+#endif + + /* + * Move the QH from the periodic ready schedule to the + * periodic assigned schedule. + */ + qh_ptr = DWC_LIST_NEXT(qh_ptr); ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); + DWC_LIST_MOVE_HEAD(&hcd->periodic_sched_assigned, + &qh->qh_list_entry); ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); + + ret_val = DWC_OTG_TRANSACTION_PERIODIC; -+#ifdef HW2937_WORKAROUND -+ } else { -+ qh_ptr = DWC_LIST_NEXT(qh_ptr); -+ } -+#endif + } -+#ifdef SOF_FIX -+ /* -+ * If there are transactions queued then enable the SOF interrupt to send them to -+ * the controller. -+ */ -+ if (ret_val != DWC_OTG_TRANSACTION_NONE) -+ { -+ // turn on Start-of-Frame interrupt -+ gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk); -+ gintmsk.b.sofintr |= 1; -+ dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32); -+ } -+#endif + + /* + * Process entries in the inactive portion of the non-periodic @@ -52092,25 +63454,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + qh_ptr = hcd->non_periodic_sched_inactive.next; + num_channels = hcd->core_if->core_params->host_channels; + while (qh_ptr != &hcd->non_periodic_sched_inactive && -+ (hcd->non_periodic_channels < ++ (microframe_schedule || hcd->non_periodic_channels < + num_channels - hcd->periodic_channels) && + !DWC_CIRCLEQ_EMPTY(&hcd->free_hc_list)) { + ++ if (microframe_schedule) { ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); ++ if (hcd->available_host_channels < 1) { ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++ break; ++ } ++ hcd->available_host_channels--; ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++#ifdef DEBUG_HOST_CHANNELS ++ last_sel_trans_num_nonper_scheduled++; ++#endif /* DEBUG_HOST_CHANNELS */ ++ } + qh = DWC_LIST_ENTRY(qh_ptr, dwc_otg_qh_t, qh_list_entry); + -+#ifdef HW2937_WORKAROUND -+ if (assign_and_init_hc(hcd, qh)) { -+#else + assign_and_init_hc(hcd, qh); -+#endif + + /* + * Move the QH from the non-periodic inactive schedule to the + * non-periodic active schedule. + */ + qh_ptr = DWC_LIST_NEXT(qh_ptr); ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); + DWC_LIST_MOVE_HEAD(&hcd->non_periodic_sched_active, + &qh->qh_list_entry); ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++ ++ g_np_sent++; + + if (ret_val == DWC_OTG_TRANSACTION_NONE) { + ret_val = DWC_OTG_TRANSACTION_NON_PERIODIC; @@ -52118,16 +63492,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + ret_val = DWC_OTG_TRANSACTION_ALL; + } + -+ hcd->non_periodic_channels++; -+#ifdef HW2937_WORKAROUND -+ } else { -+ qh_ptr = DWC_LIST_NEXT(qh_ptr); -+ } -+#endif ++ if (!microframe_schedule) ++ hcd->non_periodic_channels++; + } + ++#ifdef DEBUG_HOST_CHANNELS ++ last_sel_trans_num_avail_hc_at_end = hcd->available_host_channels; ++#endif /* DEBUG_HOST_CHANNELS */ ++ ++ DWC_SPINLOCK_FREE(channel_lock); + return ret_val; +} ++ +/** + * Attempts to queue a single transaction request for a host channel + * associated with either a periodic or non-periodic transfer. This function @@ -52153,12 +63529,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + if (hcd->core_if->dma_enable) { + if (hcd->core_if->dma_desc_enable) { -+ if (!hc->xfer_started || (hc->ep_type == DWC_OTG_EP_TYPE_ISOC)) { ++ if (!hc->xfer_started ++ || (hc->ep_type == DWC_OTG_EP_TYPE_ISOC)) { + dwc_otg_hcd_start_xfer_ddma(hcd, hc->qh); + hc->qh->ping_state = 0; + } -+ } -+ else if (!hc->xfer_started) { ++ } else if (!hc->xfer_started) { + dwc_otg_hc_start_transfer(hcd->core_if, hc); + hc->qh->ping_state = 0; + } @@ -52220,7 +63596,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_HCDV, "Queue periodic transactions\n"); +#ifdef DEBUG -+ tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts); ++ tx_status.d32 = DWC_READ_REG32(&host_regs->hptxsts); + DWC_DEBUGPL(DBG_HCDV, + " P Tx Req Queue Space Avail (before queue): %d\n", + tx_status.b.ptxqspcavail); @@ -52230,7 +63606,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + qh_ptr = hcd->periodic_sched_assigned.next; + while (qh_ptr != &hcd->periodic_sched_assigned) { -+ tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts); ++ tx_status.d32 = DWC_READ_REG32(&host_regs->hptxsts); + if (tx_status.b.ptxqspcavail == 0) { + no_queue_space = 1; + break; @@ -52283,7 +63659,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + global_regs = hcd->core_if->core_global_regs; + intr_mask.b.ptxfempty = 1; +#ifdef DEBUG -+ tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts); ++ tx_status.d32 = DWC_READ_REG32(&host_regs->hptxsts); + DWC_DEBUGPL(DBG_HCDV, + " P Tx Req Queue Space Avail (after queue): %d\n", + tx_status.b.ptxqspcavail); @@ -52300,7 +63676,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * level to ensure that new requests are loaded as + * soon as possible.) + */ -+ dwc_modify_reg32(&global_regs->gintmsk, 0, ++ DWC_MODIFY_REG32(&global_regs->gintmsk, 0, + intr_mask.d32); + } else { + /* @@ -52310,7 +63686,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * handlers to queue more transactions as transfer + * states change. + */ -+ dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, ++ DWC_MODIFY_REG32(&global_regs->gintmsk, intr_mask.d32, + 0); + } + } @@ -52338,7 +63714,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_HCDV, "Queue non-periodic transactions\n"); +#ifdef DEBUG -+ tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ tx_status.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + DWC_DEBUGPL(DBG_HCDV, + " NP Tx Req Queue Space Avail (before queue): %d\n", + tx_status.b.nptxqspcavail); @@ -52359,7 +63735,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * available in the request queue or the Tx FIFO. + */ + do { -+ tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ tx_status.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + if (!hcd->core_if->dma_enable && tx_status.b.nptxqspcavail == 0) { + no_queue_space = 1; + break; @@ -52392,7 +63768,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + intr_mask.b.nptxfempty = 1; + +#ifdef DEBUG -+ tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ tx_status.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + DWC_DEBUGPL(DBG_HCDV, + " NP Tx Req Queue Space Avail (after queue): %d\n", + tx_status.b.nptxqspcavail); @@ -52408,7 +63784,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * level to ensure that new requests are loaded as + * soon as possible.) + */ -+ dwc_modify_reg32(&global_regs->gintmsk, 0, ++ DWC_MODIFY_REG32(&global_regs->gintmsk, 0, + intr_mask.d32); + } else { + /* @@ -52418,7 +63794,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * handlers to queue more transactions as transfer + * states change. + */ -+ dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, ++ DWC_MODIFY_REG32(&global_regs->gintmsk, intr_mask.d32, + 0); + } + } @@ -52434,7 +63810,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + * periodic, or both). + */ +void dwc_otg_hcd_queue_transactions(dwc_otg_hcd_t * hcd, -+ dwc_otg_transaction_type_e tr_type) ++ dwc_otg_transaction_type_e tr_type) +{ +#ifdef DEBUG_SOF + DWC_DEBUGPL(DBG_HCD, "Queue Transactions\n"); @@ -52459,12 +63835,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + gintmsk_data_t gintmsk = {.d32 = 0 }; + gintmsk.b.nptxfempty = 1; -+ dwc_modify_reg32(&hcd->core_if->core_global_regs-> -+ gintmsk, gintmsk.d32, 0); ++ DWC_MODIFY_REG32(&hcd->core_if-> ++ core_global_regs->gintmsk, gintmsk.d32, ++ 0); + } + } +} -+ ++ +#ifdef DWC_HS_ELECT_TST +/* + * Quick and dirty hack to implement the HS Electrical Test @@ -52493,70 +63870,70 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcint_data_t hcint; + + /* Enable HAINTs */ -+ dwc_write_reg32(&hc_global_regs->haintmsk, 0x0001); ++ DWC_WRITE_REG32(&hc_global_regs->haintmsk, 0x0001); + + /* Enable HCINTs */ -+ dwc_write_reg32(&hc_regs->hcintmsk, 0x04a3); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, 0x04a3); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* + * Send Setup packet (Get Device Descriptor) + */ + + /* Make sure channel is disabled */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen) { + hcchar.b.chdis = 1; +// hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + //sleep(1); + dwc_mdelay(1000); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + } + + /* Set HCTSIZ */ @@ -52564,56 +63941,55 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hctsiz.b.xfersize = 8; + hctsiz.b.pktcnt = 1; + hctsiz.b.pid = DWC_OTG_HC_PID_SETUP; -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + + /* Set HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL; + hcchar.b.epdir = 0; + hcchar.b.epnum = 0; + hcchar.b.mps = 8; + hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + + /* Fill FIFO with Setup data for Get Device Descriptor */ + data_fifo = (uint32_t *) ((char *)global_regs + 0x1000); -+ dwc_write_reg32(data_fifo++, 0x01000680); -+ dwc_write_reg32(data_fifo++, 0x00080000); ++ DWC_WRITE_REG32(data_fifo++, 0x01000680); ++ DWC_WRITE_REG32(data_fifo++, 0x00080000); + -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Wait for host channel interrupt */ + do { -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + } while (gintsts.b.hcintr == 0); + -+ + /* Disable HCINTs */ -+ dwc_write_reg32(&hc_regs->hcintmsk, 0x0000); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, 0x0000); + + /* Disable HAINTs */ -+ dwc_write_reg32(&hc_global_regs->haintmsk, 0x0000); ++ DWC_WRITE_REG32(&hc_global_regs->haintmsk, 0x0000); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); +} + +static void do_in_ack(void) @@ -52626,70 +64002,70 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + host_grxsts_data_t grxsts; + + /* Enable HAINTs */ -+ dwc_write_reg32(&hc_global_regs->haintmsk, 0x0001); ++ DWC_WRITE_REG32(&hc_global_regs->haintmsk, 0x0001); + + /* Enable HCINTs */ -+ dwc_write_reg32(&hc_regs->hcintmsk, 0x04a3); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, 0x04a3); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* + * Receive Control In packet + */ + + /* Make sure channel is disabled */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen) { + hcchar.b.chdis = 1; + hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + //sleep(1); + dwc_mdelay(1000); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + } + + /* Set HCTSIZ */ @@ -52697,32 +64073,31 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hctsiz.b.xfersize = 8; + hctsiz.b.pktcnt = 1; + hctsiz.b.pid = DWC_OTG_HC_PID_DATA1; -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + + /* Set HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL; + hcchar.b.epdir = 1; + hcchar.b.epnum = 0; + hcchar.b.mps = 8; + hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Wait for receive status queue interrupt */ + do { -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + } while (gintsts.b.rxstsqlvl == 0); + -+ + /* Read RXSTS */ -+ grxsts.d32 = dwc_read_reg32(&global_regs->grxstsp); ++ grxsts.d32 = DWC_READ_REG32(&global_regs->grxstsp); + + /* Clear RXSTSQLVL in GINTSTS */ + gintsts.d32 = 0; + gintsts.b.rxstsqlvl = 1; -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + switch (grxsts.b.pktsts) { + case DWC_GRXSTS_PKTSTS_IN: @@ -52734,7 +64109,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + data_fifo = (uint32_t *) ((char *)global_regs + 0x1000); + + for (i = 0; i < word_count; i++) { -+ (void)dwc_read_reg32(data_fifo++); ++ (void)DWC_READ_REG32(data_fifo++); + } + } + break; @@ -52743,21 +64118,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + break; + } + -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Wait for receive status queue interrupt */ + do { -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + } while (gintsts.b.rxstsqlvl == 0); + -+ + /* Read RXSTS */ -+ grxsts.d32 = dwc_read_reg32(&global_regs->grxstsp); ++ grxsts.d32 = DWC_READ_REG32(&global_regs->grxstsp); + + /* Clear RXSTSQLVL in GINTSTS */ + gintsts.d32 = 0; + gintsts.b.rxstsqlvl = 1; -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + switch (grxsts.b.pktsts) { + case DWC_GRXSTS_PKTSTS_IN_XFER_COMP: @@ -52767,34 +64141,33 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + break; + } + -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Wait for host channel interrupt */ + do { -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + } while (gintsts.b.hcintr == 0); + -+ + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + +// usleep(100000); +// mdelay(100); @@ -52805,57 +64178,57 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Make sure channel is disabled */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chen) { + hcchar.b.chdis = 1; + hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + //sleep(1); + dwc_mdelay(1000); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + } + + /* Set HCTSIZ */ @@ -52863,51 +64236,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hctsiz.b.xfersize = 0; + hctsiz.b.pktcnt = 1; + hctsiz.b.pid = DWC_OTG_HC_PID_DATA1; -+ dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32); ++ DWC_WRITE_REG32(&hc_regs->hctsiz, hctsiz.d32); + + /* Set HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL; + hcchar.b.epdir = 0; + hcchar.b.epnum = 0; + hcchar.b.mps = 8; + hcchar.b.chen = 1; -+ dwc_write_reg32(&hc_regs->hcchar, hcchar.d32); ++ DWC_WRITE_REG32(&hc_regs->hcchar, hcchar.d32); + -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + + /* Wait for host channel interrupt */ + do { -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); + } while (gintsts.b.hcintr == 0); + -+ + /* Disable HCINTs */ -+ dwc_write_reg32(&hc_regs->hcintmsk, 0x0000); ++ DWC_WRITE_REG32(&hc_regs->hcintmsk, 0x0000); + + /* Disable HAINTs */ -+ dwc_write_reg32(&hc_global_regs->haintmsk, 0x0000); ++ DWC_WRITE_REG32(&hc_global_regs->haintmsk, 0x0000); + + /* Read HAINT */ -+ haint.d32 = dwc_read_reg32(&hc_global_regs->haint); ++ haint.d32 = DWC_READ_REG32(&hc_global_regs->haint); + + /* Read HCINT */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + + /* Read HCCHAR */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + + /* Clear HCINT */ -+ dwc_write_reg32(&hc_regs->hcint, hcint.d32); ++ DWC_WRITE_REG32(&hc_regs->hcint, hcint.d32); + + /* Clear HAINT */ -+ dwc_write_reg32(&hc_global_regs->haint, haint.d32); ++ DWC_WRITE_REG32(&hc_global_regs->haint, haint.d32); + + /* Clear GINTSTS */ -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + /* Read GINTSTS */ -+ gintsts.d32 = dwc_read_reg32(&global_regs->gintsts); ++ gintsts.d32 = DWC_READ_REG32(&global_regs->gintsts); +} +#endif + @@ -52954,23 +64326,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + "ClearPortFeature USB_PORT_FEAT_ENABLE\n"); + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtena = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + break; + case UHF_PORT_SUSPEND: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " + "ClearPortFeature USB_PORT_FEAT_SUSPEND\n"); + -+ dwc_write_reg32(core_if->pcgcctl, 0); -+ dwc_mdelay(5); ++ if (core_if->power_down == 2) { ++ dwc_otg_host_hibernation_restore(core_if, 0, 0); ++ } else { ++ DWC_WRITE_REG32(core_if->pcgcctl, 0); ++ dwc_mdelay(5); + -+ hprt0.d32 = dwc_otg_read_hprt0(core_if); -+ hprt0.b.prtres = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); -+ hprt0.b.prtsusp = 0; -+ /* Clear Resume bit */ -+ dwc_mdelay(100); -+ hprt0.b.prtres = 0; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ hprt0.b.prtres = 1; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ hprt0.b.prtsusp = 0; ++ /* Clear Resume bit */ ++ dwc_mdelay(100); ++ hprt0.b.prtres = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ } + break; +#ifdef CONFIG_USB_DWC_OTG_LPM + case UHF_PORT_L1: @@ -52979,24 +64355,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + glpmcfg_data_t lpmcfg = {.d32 = 0 }; + + lpmcfg.d32 = -+ dwc_read_reg32(&core_if->core_global_regs-> -+ glpmcfg); ++ DWC_READ_REG32(&core_if-> ++ core_global_regs->glpmcfg); + lpmcfg.b.en_utmi_sleep = 0; + lpmcfg.b.hird_thres &= (~(1 << 4)); + lpmcfg.b.prt_sleep_sts = 1; -+ dwc_write_reg32(&core_if->core_global_regs-> -+ glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&core_if-> ++ core_global_regs->glpmcfg, ++ lpmcfg.d32); + + /* Clear Enbl_L1Gating bit. */ + pcgcctl.b.enbl_sleep_gating = 1; -+ dwc_modify_reg32(core_if->pcgcctl, pcgcctl.d32, ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, + 0); + + dwc_mdelay(5); + + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtres = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, ++ DWC_WRITE_REG32(core_if->host_if->hprt0, + hprt0.d32); + /* This bit will be cleared in wakeup interrupt handle */ + break; @@ -53007,7 +64384,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + "ClearPortFeature USB_PORT_FEAT_POWER\n"); + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtpwr = 0; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + break; + case UHF_PORT_INDICATOR: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " @@ -53080,7 +64457,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + break; + case UCR_GET_PORT_STATUS: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " -+ "GetPortStatus\n"); ++ "GetPortStatus wIndex = 0x%04x FLAGS=0x%08x\n", ++ wIndex, dwc_otg_hcd->flags.d32); + if (!wIndex || wIndex > 1) + goto error; + @@ -53103,7 +64481,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + + if (dwc_otg_hcd->flags.b.port_over_current_change) { -+ DWC_ERROR("Device Not Supported\n"); ++ DWC_WARN("Overcurrent change detected\n"); + port_status |= (1 << UHF_C_PORT_OVER_CURRENT); + } + @@ -53119,7 +64497,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + break; + } + -+ hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(core_if->host_if->hprt0); + DWC_DEBUGPL(DBG_HCDV, " HPRT0: 0x%08x\n", hprt0.d32); + + if (hprt0.b.prtconnsts) @@ -53150,7 +64528,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (dwc_otg_get_lpm_portsleepstatus(dwc_otg_hcd->core_if)) { + port_status |= (1 << UHF_PORT_L1); + } -+ ++ /* ++ For Synopsys HW emulation of Power down wkup_control asserts the ++ hreset_n and prst_n on suspned. This causes the HPRT0 to be zero. ++ We intentionally tell the software that port is in L2Suspend state. ++ Only for STE. ++ */ ++ if ((core_if->power_down == 2) ++ && (core_if->hibernation_suspend == 1)) { ++ port_status |= (1 << UHF_PORT_SUSPEND); ++ } + /* USB_PORT_FEAT_INDICATOR unsupported always 0 */ + + *((__le32 *) buf) = dwc_cpu_to_le32(&port_status); @@ -53180,19 +64567,149 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + case UHF_PORT_SUSPEND: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " + "SetPortFeature - USB_PORT_FEAT_SUSPEND\n"); ++ if (dwc_otg_hcd_otg_port(dwc_otg_hcd) != wIndex) { ++ goto error; ++ } ++ if (core_if->power_down == 2) { ++ int timeout = 300; ++ dwc_irqflags_t flags; ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ gusbcfg_data_t gusbcfg = {.d32 = 0 }; ++#ifdef DWC_DEV_SRPCAP ++ int32_t otg_cap_param = core_if->core_params->otg_cap; ++#endif ++ DWC_PRINTF("Preparing for complete power-off\n"); ++ ++ /* Save registers before hibernation */ ++ dwc_otg_save_global_regs(core_if); ++ dwc_otg_save_host_regs(core_if); ++ ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ hprt0.b.prtsusp = 1; ++ hprt0.b.prtena = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ /* Spin hprt0.b.prtsusp to became 1 */ ++ do { ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ if (hprt0.b.prtsusp) { ++ break; ++ } ++ dwc_mdelay(1); ++ } while (--timeout); ++ if (!timeout) { ++ DWC_WARN("Suspend wasn't genereted\n"); ++ } ++ dwc_udelay(10); ++ ++ /* ++ * We need to disable interrupts to prevent servicing of any IRQ ++ * during going to hibernation ++ */ ++ DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &flags); ++ core_if->lx_state = DWC_OTG_L2; ++#ifdef DWC_DEV_SRPCAP ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ hprt0.b.prtpwr = 0; ++ hprt0.b.prtena = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, ++ hprt0.d32); ++#endif ++ gusbcfg.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs-> ++ gusbcfg); ++ if (gusbcfg.b.ulpi_utmi_sel == 1) { ++ /* ULPI interface */ ++ /* Suspend the Phy Clock */ ++ pcgcctl.d32 = 0; ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, ++ pcgcctl.d32); ++ dwc_udelay(10); ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ } else { ++ /* UTMI+ Interface */ ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, pcgcctl.d32); ++ dwc_udelay(10); ++ } ++#ifdef DWC_DEV_SRPCAP ++ gpwrdn.d32 = 0; ++ gpwrdn.b.dis_vbus = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++#endif ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ gpwrdn.d32 = 0; ++#ifdef DWC_DEV_SRPCAP ++ gpwrdn.b.srp_det_msk = 1; ++#endif ++ gpwrdn.b.disconn_det_msk = 1; ++ gpwrdn.b.lnstchng_msk = 1; ++ gpwrdn.b.sts_chngint_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Enable Power Down Clamp and all interrupts in GPWRDN */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnclmp = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ dwc_udelay(10); ++ ++ /* Switch off VDD */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ ++#ifdef DWC_DEV_SRPCAP ++ if (otg_cap_param == DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE) ++ { ++ core_if->pwron_timer_started = 1; ++ DWC_TIMER_SCHEDULE(core_if->pwron_timer, 6000 /* 6 secs */ ); ++ } ++#endif ++ /* Save gpwrdn register for further usage if stschng interrupt */ ++ core_if->gr_backup->gpwrdn_local = ++ DWC_READ_REG32(&core_if->core_global_regs->gpwrdn); ++ ++ /* Set flag to indicate that we are in hibernation */ ++ core_if->hibernation_suspend = 1; ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock,flags); ++ ++ DWC_PRINTF("Host hibernation completed\n"); ++ // Exit from case statement ++ break; ++ ++ } + if (dwc_otg_hcd_otg_port(dwc_otg_hcd) == wIndex && + dwc_otg_hcd->fops->get_b_hnp_enable(dwc_otg_hcd)) { + gotgctl_data_t gotgctl = {.d32 = 0 }; + gotgctl.b.hstsethnpen = 1; -+ dwc_modify_reg32(&core_if->core_global_regs-> ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> + gotgctl, 0, gotgctl.d32); + core_if->op_state = A_SUSPEND; + } + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtsusp = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + { -+ uint64_t flags; ++ dwc_irqflags_t flags; + /* Update lx_state */ + DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &flags); + core_if->lx_state = DWC_OTG_L2; @@ -53202,64 +64719,111 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + { + pcgcctl_data_t pcgcctl = {.d32 = 0 }; + pcgcctl.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, 0, ++ DWC_MODIFY_REG32(core_if->pcgcctl, 0, + pcgcctl.d32); ++ dwc_udelay(10); + } + + /* For HNP the bus must be suspended for at least 200ms. */ + if (dwc_otg_hcd->fops->get_b_hnp_enable(dwc_otg_hcd)) { ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); + dwc_mdelay(200); + } ++ ++ /** @todo - check how sw can wait for 1 sec to check asesvld??? */ ++#if 0 //vahrama !!!!!!!!!!!!!!!!!! ++ if (core_if->adp_enable) { ++ gotgctl_data_t gotgctl = {.d32 = 0 }; ++ gpwrdn_data_t gpwrdn; ++ ++ while (gotgctl.b.asesvld == 1) { ++ gotgctl.d32 = ++ DWC_READ_REG32(&core_if-> ++ core_global_regs-> ++ gotgctl); ++ dwc_mdelay(100); ++ } ++ ++ /* Enable Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ ++ /* Unmask SRP detected interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.srp_det_msk = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs-> ++ gpwrdn, 0, gpwrdn.d32); ++ ++ dwc_otg_adp_probe_start(core_if); ++ } ++#endif + break; + case UHF_PORT_POWER: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " + "SetPortFeature - USB_PORT_FEAT_POWER\n"); + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prtpwr = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + break; + case UHF_PORT_RESET: -+ DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " -+ "SetPortFeature - USB_PORT_FEAT_RESET\n"); -+ { -+ pcgcctl_data_t pcgcctl = {.d32 = 0 }; -+ pcgcctl.b.enbl_sleep_gating = 1; -+ pcgcctl.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, pcgcctl.d32, -+ 0); -+ dwc_write_reg32(core_if->pcgcctl, 0); -+ } -+#ifdef CONFIG_USB_DWC_OTG_LPM -+ { -+ glpmcfg_data_t lpmcfg; -+ lpmcfg.d32 = -+ dwc_read_reg32(&core_if->core_global_regs-> -+ glpmcfg); -+ if (lpmcfg.b.prt_sleep_sts) { -+ lpmcfg.b.en_utmi_sleep = 0; -+ lpmcfg.b.hird_thres &= (~(1 << 4)); -+ dwc_write_reg32(&core_if-> -+ core_global_regs-> -+ glpmcfg, lpmcfg.d32); -+ dwc_mdelay(1); ++ if ((core_if->power_down == 2) ++ && (core_if->hibernation_suspend == 1)) { ++ /* If we are going to exit from Hibernated ++ * state via USB RESET. ++ */ ++ dwc_otg_host_hibernation_restore(core_if, 0, 1); ++ } else { ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ ++ DWC_DEBUGPL(DBG_HCD, ++ "DWC OTG HCD HUB CONTROL - " ++ "SetPortFeature - USB_PORT_FEAT_RESET\n"); ++ { ++ pcgcctl_data_t pcgcctl = {.d32 = 0 }; ++ pcgcctl.b.enbl_sleep_gating = 1; ++ pcgcctl.b.stoppclk = 1; ++ DWC_MODIFY_REG32(core_if->pcgcctl, pcgcctl.d32, 0); ++ DWC_WRITE_REG32(core_if->pcgcctl, 0); ++ } ++#ifdef CONFIG_USB_DWC_OTG_LPM ++ { ++ glpmcfg_data_t lpmcfg; ++ lpmcfg.d32 = ++ DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); ++ if (lpmcfg.b.prt_sleep_sts) { ++ lpmcfg.b.en_utmi_sleep = 0; ++ lpmcfg.b.hird_thres &= (~(1 << 4)); ++ DWC_WRITE_REG32 ++ (&core_if->core_global_regs->glpmcfg, ++ lpmcfg.d32); ++ dwc_mdelay(1); ++ } + } -+ } +#endif -+ hprt0.d32 = dwc_otg_read_hprt0(core_if); -+ /* When B-Host the Port reset bit is set in -+ * the Start HCD Callback function, so that -+ * the reset is started within 1ms of the HNP -+ * success interrupt. */ -+ if (!dwc_otg_hcd_is_b_host(dwc_otg_hcd)) { -+ hprt0.b.prtrst = 1; -+ dwc_write_reg32(core_if->host_if->hprt0, -+ hprt0.d32); ++ hprt0.d32 = dwc_otg_read_hprt0(core_if); ++ /* Clear suspend bit if resetting from suspended state. */ ++ hprt0.b.prtsusp = 0; ++ /* When B-Host the Port reset bit is set in ++ * the Start HCD Callback function, so that ++ * the reset is started within 1ms of the HNP ++ * success interrupt. */ ++ if (!dwc_otg_hcd_is_b_host(dwc_otg_hcd)) { ++ hprt0.b.prtpwr = 1; ++ hprt0.b.prtrst = 1; ++ DWC_PRINTF("Indeed it is in host mode hprt0 = %08x\n",hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, ++ hprt0.d32); ++ } ++ /* Clear reset bit in 10ms (FS/LS) or 50ms (HS) */ ++ dwc_mdelay(60); ++ hprt0.b.prtrst = 0; ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); ++ core_if->lx_state = DWC_OTG_L0; /* Now back to the on state */ + } -+ /* Clear reset bit in 10ms (FS/LS) or 50ms (HS) */ -+ dwc_mdelay(60); -+ hprt0.b.prtrst = 0; -+ dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32); -+ core_if->lx_state = DWC_OTG_L0; /* Now back to the on state */ + break; +#ifdef DWC_HS_ELECT_TST + case UHF_PORT_TEST: @@ -53276,7 +64840,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (t < 6) { + hprt0.d32 = dwc_otg_read_hprt0(core_if); + hprt0.b.prttstctl = t; -+ dwc_write_reg32(core_if->host_if->hprt0, ++ DWC_WRITE_REG32(core_if->host_if->hprt0, + hprt0.d32); + } else { + /* Setup global vars with reg addresses (quick and @@ -53296,14 +64860,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + if (t == 6) { /* HS_HOST_PORT_SUSPEND_RESUME */ + /* Save current interrupt mask */ + gintmsk.d32 = -+ dwc_read_reg32 ++ DWC_READ_REG32 + (&global_regs->gintmsk); + + /* Disable all interrupts while we muck with + * the hardware directly + */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, 0); ++ DWC_WRITE_REG32(&global_regs->gintmsk, 0); + + /* 15 second delay per the test spec */ + dwc_mdelay(15000); @@ -53313,9 +64876,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_otg_read_hprt0(core_if); + hprt0.b.prtsusp = 1; + hprt0.b.prtres = 0; -+ dwc_write_reg32(core_if-> -+ host_if->hprt0, -+ hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + + /* 15 second delay per the test spec */ + dwc_mdelay(15000); @@ -53325,32 +64886,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_otg_read_hprt0(core_if); + hprt0.b.prtsusp = 0; + hprt0.b.prtres = 1; -+ dwc_write_reg32(core_if-> -+ host_if->hprt0, -+ hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + dwc_mdelay(100); + + /* Clear the resume bit */ + hprt0.b.prtres = 0; -+ dwc_write_reg32(core_if-> -+ host_if->hprt0, -+ hprt0.d32); ++ DWC_WRITE_REG32(core_if->host_if->hprt0, hprt0.d32); + + /* Restore interrupts */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, -+ gintmsk.d32); ++ DWC_WRITE_REG32(&global_regs->gintmsk, gintmsk.d32); + } else if (t == 7) { /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR setup */ + /* Save current interrupt mask */ + gintmsk.d32 = -+ dwc_read_reg32 ++ DWC_READ_REG32 + (&global_regs->gintmsk); + + /* Disable all interrupts while we muck with + * the hardware directly + */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, 0); ++ DWC_WRITE_REG32(&global_regs->gintmsk, 0); + + /* 15 second delay per the test spec */ + dwc_mdelay(15000); @@ -53362,20 +64916,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_mdelay(15000); + + /* Restore interrupts */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, -+ gintmsk.d32); ++ DWC_WRITE_REG32(&global_regs->gintmsk, gintmsk.d32); + } else if (t == 8) { /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR execute */ + /* Save current interrupt mask */ + gintmsk.d32 = -+ dwc_read_reg32 ++ DWC_READ_REG32 + (&global_regs->gintmsk); + + /* Disable all interrupts while we muck with + * the hardware directly + */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, 0); ++ DWC_WRITE_REG32(&global_regs->gintmsk, 0); + + /* Send the Setup packet */ + do_setup(); @@ -53390,14 +64941,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_mdelay(15000); + + /* Restore interrupts */ -+ dwc_write_reg32(&global_regs-> -+ gintmsk, -+ gintmsk.d32); ++ DWC_WRITE_REG32(&global_regs->gintmsk, gintmsk.d32); + } + } + break; + } -+#endif /* DWC_HS_ELECT_TST */ ++#endif /* DWC_HS_ELECT_TST */ + + case UHF_PORT_INDICATOR: + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - " @@ -53432,7 +64981,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + /* Check if the port currently is in SLEEP state */ + lpmcfg.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + if (lpmcfg.b.prt_sleep_sts) { + DWC_INFO("Port is already in sleep mode\n"); + buf[0] = 0; /* Return success */ @@ -53458,7 +65007,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + /* Disable LPM interrupt */ + gintmsk.d32 = 0; + gintmsk.b.lpmtranrcvd = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, + gintmsk.d32, 0); + + if (dwc_otg_hcd_send_lpm @@ -53475,8 +65024,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + */ + do { + gintsts.d32 = -+ dwc_read_reg32(&core_if->core_global_regs-> -+ gintsts); ++ DWC_READ_REG32(&core_if->core_global_regs->gintsts); + if (gintsts.b.lpmtranrcvd) { + break; + } @@ -53494,8 +65042,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_otg_hcd_free_hc_from_lpm(dwc_otg_hcd); + } else { + lpmcfg.d32 = -+ dwc_read_reg32(&core_if->core_global_regs-> -+ glpmcfg); ++ DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + if (lpmcfg.b.lpm_resp == 0x3) { + /* ACK responce from the device */ + buf[0] = 0x00; /* Success */ @@ -53509,14 +65056,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + DWC_PRINTF("Device responce to LPM trans is %x\n", + lpmcfg.b.lpm_resp); -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, 0, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, 0, + gintmsk.d32); + + break; + } -+#endif /* CONFIG_USB_DWC_OTG_LPM */ ++#endif /* CONFIG_USB_DWC_OTG_LPM */ + default: -+ error: ++error: + retval = -DWC_E_INVALID; + DWC_WARN("DWC OTG HCD - " + "Unknown hub control request type or invalid typeReq: %xh wIndex: %xh wValue: %xh\n", @@ -53545,7 +65092,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + + /* Mask host channel interrupts. */ + gintmsk.b.hcintr = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, gintmsk.d32, 0); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, gintmsk.d32, 0); + + /* Fill fields that core needs for LPM transaction */ + hcchar.b.devaddr = devaddr; @@ -53554,7 +65101,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcchar.b.mps = 64; + hcchar.b.lspddev = (hc->speed == DWC_OTG_EP_SPEED_LOW); + hcchar.b.epdir = 0; /* OUT */ -+ dwc_write_reg32(&core_if->host_if->hc_regs[hc->hc_num]->hcchar, ++ DWC_WRITE_REG32(&core_if->host_if->hc_regs[hc->hc_num]->hcchar, + hcchar.d32); + + /* Remove the host channel from the free list. */ @@ -53572,7 +65119,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + glpmcfg_data_t lpmcfg; + uint8_t hc_num; + -+ lpmcfg.d32 = dwc_read_reg32(&hcd->core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&hcd->core_if->core_global_regs->glpmcfg); + hc_num = lpmcfg.b.lpm_chan_index; + + hc = hcd->hc_ptr_array[hc_num]; @@ -53595,10 +65142,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + } + + pcgcctl.b.enbl_sleep_gating = 1; -+ dwc_modify_reg32(hcd->core_if->pcgcctl, 0, pcgcctl.d32); ++ DWC_MODIFY_REG32(hcd->core_if->pcgcctl, 0, pcgcctl.d32); + + /* Read LPM config register */ -+ lpmcfg.d32 = dwc_read_reg32(&hcd->core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&hcd->core_if->core_global_regs->glpmcfg); + + /* Program LPM transaction fields */ + lpmcfg.b.rem_wkup_en = bRemoteWake; @@ -53607,16 +65154,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + lpmcfg.b.lpm_chan_index = channel; + lpmcfg.b.en_utmi_sleep = 1; + /* Program LPM config register */ -+ dwc_write_reg32(&hcd->core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&hcd->core_if->core_global_regs->glpmcfg, lpmcfg.d32); + + /* Send LPM transaction */ + lpmcfg.b.send_lpm = 1; -+ dwc_write_reg32(&hcd->core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&hcd->core_if->core_global_regs->glpmcfg, lpmcfg.d32); + + return 0; +} + -+#endif /* CONFIG_USB_DWC_OTG_LPM */ ++#endif /* CONFIG_USB_DWC_OTG_LPM */ + +int dwc_otg_hcd_is_status_changed(dwc_otg_hcd_t * hcd, int port) +{ @@ -53653,8 +65200,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +int dwc_otg_hcd_get_frame_number(dwc_otg_hcd_t * dwc_otg_hcd) +{ + hfnum_data_t hfnum; -+ hfnum.d32 = dwc_read_reg32(&dwc_otg_hcd->core_if-> -+ host_if->host_global_regs->hfnum); ++ hfnum.d32 = ++ DWC_READ_REG32(&dwc_otg_hcd->core_if->host_if->host_global_regs-> ++ hfnum); + +#ifdef DEBUG_SOF + DWC_DEBUGPL(DBG_HCDV, "DWC OTG HCD GET FRAME NUMBER %d\n", @@ -53669,7 +65217,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + int retval = 0; + + hcd->fops = fops; -+ if (!dwc_otg_is_device_mode(hcd->core_if)) { ++ if (!dwc_otg_is_device_mode(hcd->core_if) && ++ (!hcd->core_if->adp_enable || hcd->core_if->adp.adp_started)) { + dwc_otg_hcd_reinit(hcd); + } else { + retval = -DWC_E_NO_DEVICE; @@ -53714,12 +65263,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + size = + sizeof(*dwc_otg_urb) + + iso_desc_count * sizeof(struct dwc_otg_hcd_iso_packet_desc); -+ if (atomic_alloc) { -+ dwc_otg_urb = dwc_alloc_atomic(size); -+ } else { -+ dwc_otg_urb = dwc_alloc(size); -+ } -+ dwc_otg_urb->packet_count = iso_desc_count; ++ if (atomic_alloc) ++ dwc_otg_urb = DWC_ALLOC_ATOMIC(size); ++ else ++ dwc_otg_urb = DWC_ALLOC(size); ++ ++ if (NULL != dwc_otg_urb) ++ dwc_otg_urb->packet_count = iso_desc_count; ++ else { ++ dwc_otg_urb->packet_count = 0; ++ if (size != 0) { ++ DWC_ERROR("**** DWC OTG HCD URB alloc - " ++ "%salloc of %db failed\n", ++ atomic_alloc?"atomic ":"", size); ++ } ++ } + + return dwc_otg_urb; +} @@ -53867,20 +65425,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + hcint_data_t hcint; + hcintmsk_data_t hcintmsk; + hfnum.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if-> -+ host_global_regs->hfnum); ++ DWC_READ_REG32(&hcd->core_if-> ++ host_if->host_global_regs->hfnum); + hcchar.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]-> -+ hcchar); ++ DWC_READ_REG32(&hcd->core_if->host_if-> ++ hc_regs[i]->hcchar); + hctsiz.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]-> -+ hctsiz); ++ DWC_READ_REG32(&hcd->core_if->host_if-> ++ hc_regs[i]->hctsiz); + hcint.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]-> -+ hcint); ++ DWC_READ_REG32(&hcd->core_if->host_if-> ++ hc_regs[i]->hcint); + hcintmsk.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]-> -+ hcintmsk); ++ DWC_READ_REG32(&hcd->core_if->host_if-> ++ hc_regs[i]->hcintmsk); + DWC_PRINTF(" hfnum: 0x%08x\n", hfnum.d32); + DWC_PRINTF(" hcchar: 0x%08x\n", hcchar.d32); + DWC_PRINTF(" hctsiz: 0x%08x\n", hctsiz.d32); @@ -53892,7 +65450,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + dwc_otg_hcd_urb_t *urb; + + DWC_CIRCLEQ_FOREACH(qtd, &hc->qh->qtd_list, qtd_list_entry) { -+ if(!qtd->in_process) ++ if (!qtd->in_process) + break; + + urb = qtd->urb; @@ -53916,23 +65474,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 + (void *)urb->dma); + DWC_PRINTF(" transfer_buffer_length: %d\n", + urb->length); -+ DWC_PRINTF(" actual_length: %d\n", -+ urb->actual_length); ++ DWC_PRINTF(" actual_length: %d\n", ++ urb->actual_length); ++ } + } + } + } -+ } + DWC_PRINTF(" non_periodic_channels: %d\n", hcd->non_periodic_channels); + DWC_PRINTF(" periodic_channels: %d\n", hcd->periodic_channels); + DWC_PRINTF(" periodic_usecs: %d\n", hcd->periodic_usecs); + np_tx_status.d32 = -+ dwc_read_reg32(&hcd->core_if->core_global_regs->gnptxsts); ++ DWC_READ_REG32(&hcd->core_if->core_global_regs->gnptxsts); + DWC_PRINTF(" NP Tx Req Queue Space Avail: %d\n", + np_tx_status.b.nptxqspcavail); + DWC_PRINTF(" NP Tx FIFO Space Avail: %d\n", + np_tx_status.b.nptxfspcavail); + p_tx_status.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hptxsts); ++ DWC_READ_REG32(&hcd->core_if->host_if->host_global_regs->hptxsts); + DWC_PRINTF(" P Tx Req Queue Space Avail: %d\n", + p_tx_status.b.ptxqspcavail); + DWC_PRINTF(" P Tx FIFO Space Avail: %d\n", p_tx_status.b.ptxfspcavail); @@ -54068,1126 +65626,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-rpi-bootc-3 +#endif +} + -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2012-07-15 20:29:19.150084862 +0200 -@@ -0,0 +1,1106 @@ -+/*========================================================================== -+ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $ -+ * $Revision: #2 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237473 $ -+ * -+ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, -+ * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless -+ * otherwise expressly agreed to in writing between Synopsys and you. -+ * -+ * The Software IS NOT an item of Licensed Software or Licensed Product under -+ * any End User Software License Agreement or Agreement for Licensed Product -+ * with Synopsys or any supplement thereto. You are permitted to use and -+ * redistribute this Software in source and binary forms, with or without -+ * modification, provided that redistributions of source code must retain this -+ * notice. You may not view, use, disclose, copy or distribute this file or -+ * any information contained herein except pursuant to this license grant from -+ * Synopsys. If you do not agree with this notice, including the disclaimer -+ * below, then you are not authorized to use the Software. -+ * -+ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS -+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, -+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -+ * DAMAGE. -+ * ========================================================================== */ -+#ifndef DWC_DEVICE_ONLY -+ -+/** @file -+ * This file contains Descriptor DMA support implementation for host mode. -+ */ -+ -+#include "dwc_otg_hcd.h" -+#include "dwc_otg_regs.h" -+ -+ -+static inline uint8_t frame_list_idx(uint16_t frame) -+{ -+ return (frame & (MAX_FRLIST_EN_NUM - 1)); -+} -+ -+static inline uint16_t desclist_idx_inc(uint16_t idx, uint16_t inc, uint8_t speed) -+{ -+ return (idx + inc) & -+ (((speed == DWC_OTG_EP_SPEED_HIGH) ? MAX_DMA_DESC_NUM_HS_ISOC : MAX_DMA_DESC_NUM_GENERIC) - 1); -+} -+ -+static inline uint16_t desclist_idx_dec(uint16_t idx, uint16_t inc, uint8_t speed) -+{ -+ return (idx - inc) & -+ (((speed == DWC_OTG_EP_SPEED_HIGH) ? MAX_DMA_DESC_NUM_HS_ISOC : MAX_DMA_DESC_NUM_GENERIC) - 1); -+} -+ -+static inline uint16_t max_desc_num(dwc_otg_qh_t * qh) -+{ -+ return (((qh->ep_type == UE_ISOCHRONOUS) && (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH)) -+ ? -+ MAX_DMA_DESC_NUM_HS_ISOC -+ : -+ MAX_DMA_DESC_NUM_GENERIC); -+} -+static inline uint16_t frame_incr_val(dwc_otg_qh_t * qh) -+{ -+ return ((qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) -+ ? ((qh->interval + 8 - 1) / 8) -+ : -+ qh->interval); -+} -+ -+static int desc_list_alloc(dwc_otg_qh_t * qh) -+{ -+ int retval = 0; -+ -+ qh->desc_list = (dwc_otg_host_dma_desc_t *) -+ dwc_dma_alloc(sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh), -+ &qh->desc_list_dma -+ ); -+ -+ if (!qh->desc_list) { -+ retval = -DWC_E_NO_MEMORY; -+ DWC_ERROR("%s: DMA descriptor list allocation failed\n", __func__); -+ -+ } -+ -+ dwc_memset(qh->desc_list, 0x00, sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh)); -+ -+ -+ qh->n_bytes = (uint32_t *) dwc_alloc(sizeof(uint32_t) * max_desc_num(qh)); -+ -+ if (!qh->n_bytes) { -+ retval = -DWC_E_NO_MEMORY; -+ DWC_ERROR("%s: Failed to allocate array for descriptors' size actual values\n", -+ __func__); -+ -+ } -+ return retval; -+ -+} -+ -+static void desc_list_free(dwc_otg_qh_t * qh) -+{ -+ if(qh->desc_list) { -+ dwc_dma_free(max_desc_num(qh), qh->desc_list, qh->desc_list_dma); -+ qh->desc_list = NULL; -+ } -+ -+ if (qh->n_bytes) { -+ dwc_free(qh->n_bytes); -+ qh->n_bytes = NULL; -+ } -+} -+ -+static int frame_list_alloc(dwc_otg_hcd_t * hcd) -+{ -+ int retval = 0; -+ if (hcd->frame_list) -+ return 0; -+ -+ hcd->frame_list = dwc_dma_alloc(4 * MAX_FRLIST_EN_NUM, -+ &hcd->frame_list_dma -+ ); -+ if (!hcd->frame_list) { -+ retval = -DWC_E_NO_MEMORY; -+ DWC_ERROR("%s: Frame List allocation failed\n", __func__); -+ } -+ -+ dwc_memset(hcd->frame_list, 0x00, 4 * MAX_FRLIST_EN_NUM); -+ -+ return retval; -+} -+ -+static void frame_list_free(dwc_otg_hcd_t * hcd) -+{ -+ if (!hcd->frame_list) -+ return; -+ -+ dwc_dma_free(4 * MAX_FRLIST_EN_NUM, hcd->frame_list, hcd->frame_list_dma); -+ hcd->frame_list = NULL; -+} -+ -+static void per_sched_enable(dwc_otg_hcd_t * hcd, uint16_t fr_list_en) -+{ -+ -+ hcfg_data_t hcfg; -+ -+ hcfg.d32 = dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hcfg); -+ -+ if (hcfg.b.perschedstat) { -+ /* already enabled*/ -+ return; -+ } -+ -+ dwc_write_reg32(&hcd->core_if->host_if->host_global_regs->hflbaddr, hcd->frame_list_dma); -+ -+ switch(fr_list_en) { -+ case 64: -+ hcfg.b.frlisten = 3; -+ break; -+ case 32: -+ hcfg.b.frlisten = 2; -+ break; -+ case 16: -+ hcfg.b.frlisten = 1; -+ case 8: -+ hcfg.b.frlisten = 0; -+ default: -+ break; -+ } -+ -+ hcfg.b.perschedena = 1; -+ -+ DWC_DEBUGPL(DBG_HCD, "Enabling Periodic schedule\n"); -+ dwc_write_reg32(&hcd->core_if->host_if->host_global_regs->hcfg, hcfg.d32); -+ -+} -+ -+static void per_sched_disable(dwc_otg_hcd_t * hcd) -+{ -+ hcfg_data_t hcfg; -+ -+ hcfg.d32 = dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hcfg); -+ -+ if (!hcfg.b.perschedstat) { -+ /* already disabled */ -+ return; -+ } -+ hcfg.b.perschedena = 0; -+ -+ DWC_DEBUGPL(DBG_HCD, "Disabling Periodic schedule\n"); -+ dwc_write_reg32(&hcd->core_if->host_if->host_global_regs->hcfg, hcfg.d32); -+} -+ -+/* -+ * Activates/Deactivates FrameList entries for the channel -+ * based on endpoint servicing period. -+ */ -+void update_frame_list(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, uint8_t enable) -+{ -+ uint16_t i, j, inc; -+ dwc_hc_t *hc = qh->channel; -+ -+ inc = frame_incr_val(qh); -+ -+ if (qh->ep_type == UE_ISOCHRONOUS) -+ i = frame_list_idx(qh->sched_frame); -+ else -+ i = 0; -+ -+ j = i; -+ do { -+ if (enable) -+ hcd->frame_list[j] |= (1 << hc->hc_num); -+ else -+ hcd->frame_list[j] &= ~(1 << hc->hc_num); -+ j = (j + inc) & (MAX_FRLIST_EN_NUM - 1); -+ } -+ while (j != i); -+ -+ if (!enable) -+ return; -+ -+ hc->schinfo = 0; -+ if (qh->channel->speed == DWC_OTG_EP_SPEED_HIGH) { -+ j = 1; -+ for (i = 0 ; i < 8 / qh->interval; i++) { -+ hc->schinfo |= j; -+ j = j << qh->interval; -+ } -+ } -+ else { -+ hc->schinfo = 0xff; -+ } -+} -+#if 1 -+void dump_frame_list(dwc_otg_hcd_t * hcd) -+{ -+ int i = 0; -+ DWC_PRINTF("--FRAME LIST (hex) --\n"); -+ for (i = 0; i < MAX_FRLIST_EN_NUM; i++) { -+ DWC_PRINTF("%x\t",hcd->frame_list[i]); -+ if (!(i % 8) && i) -+ DWC_PRINTF("\n"); -+ } -+ DWC_PRINTF("\n----\n"); -+ -+} -+#endif -+ -+static void release_channel_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ dwc_hc_t *hc = qh->channel; -+ if (dwc_qh_is_non_per(qh)) { -+ hcd->non_periodic_channels--; -+ } -+ else { -+ update_frame_list(hcd, qh, 0); -+ } -+ /* -+ * The condition is added to prevent double cleanup try in case of device -+ * disconnect. See channel cleanup in dwc_otg_hcd_disconnect_cb(). -+ */ -+ if (hc->qh) { -+ dwc_otg_hc_cleanup(hcd->core_if, hc); -+ DWC_CIRCLEQ_INSERT_TAIL(&hcd->free_hc_list, hc, hc_list_entry); -+ hc->qh = NULL; -+ } -+ -+ qh->channel = NULL; -+ qh->ntd = 0; -+ -+ if (qh->desc_list) { -+ dwc_memset(qh->desc_list, 0x00, -+ sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh)); -+ } -+} -+ -+/** -+ * Initializes a QH structure's Descriptor DMA related members. -+ * Allocates memory for descriptor list. -+ * On first periodic QH, allocates memory for FrameList -+ * and enables periodic scheduling. -+ * -+ * @param hcd The HCD state structure for the DWC OTG controller. -+ * @param qh The QH to init. -+ * -+ * @return 0 if successful, negative error code otherwise. -+ */ -+int dwc_otg_hcd_qh_init_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ int retval = 0; -+ -+ if (qh->do_split) { -+ DWC_ERROR("SPLIT Transfers are not supported in Descriptor DMA.\n"); -+ return -1; -+ } -+ -+ retval = desc_list_alloc(qh); -+ -+ if ((retval == 0) && (qh->ep_type == UE_ISOCHRONOUS || qh->ep_type == UE_INTERRUPT)) { -+ if(!hcd->frame_list) { -+ retval = frame_list_alloc(hcd); -+ /* Enable periodic schedule on first periodic QH */ -+ if (retval == 0) -+ per_sched_enable(hcd, MAX_FRLIST_EN_NUM); -+ } -+ } -+ -+ qh->ntd = 0; -+ -+ return retval; -+} -+ -+/** -+ * Frees descriptor list memory associated with the QH. -+ * If QH is periodic and the last, frees FrameList memory -+ * and disables periodic scheduling. -+ * -+ * @param hcd The HCD state structure for the DWC OTG controller. -+ * @param qh The QH to init. -+ */ -+void dwc_otg_hcd_qh_free_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ desc_list_free(qh); -+ -+ /* -+ * Channel still assigned due to some reasons. -+ * Seen on Isoc URB dequeue. Channel halted but no subsequent -+ * ChHalted interrupt to release the channel. Afterwards -+ * when it comes here from endpoint disable routine -+ * channel remains assigned. -+ */ -+ if (qh->channel) -+ release_channel_ddma(hcd, qh); -+ -+ if ((qh->ep_type == UE_ISOCHRONOUS || qh->ep_type == UE_INTERRUPT) -+ && !hcd->periodic_channels && hcd->frame_list) { -+ -+ per_sched_disable(hcd); -+ frame_list_free(hcd); -+ } -+} -+ -+static uint8_t frame_to_desc_idx(dwc_otg_qh_t * qh, uint16_t frame_idx) -+{ -+ if (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) { -+ /* -+ * Descriptor set(8 descriptors) index -+ * which is 8-aligned. -+ */ -+ return (frame_idx & ((MAX_DMA_DESC_NUM_HS_ISOC / 8) - 1)) * 8; -+ } -+ else { -+ return (frame_idx & (MAX_DMA_DESC_NUM_GENERIC - 1)); -+ } -+} -+ -+/* -+ * Determine starting frame for Isochronous transfer. -+ * Few frames skipped to prevent race condition with HC. -+ */ -+static uint8_t calc_starting_frame(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, uint8_t* skip_frames) -+{ -+ uint16_t frame = 0; -+ hcd->frame_number = dwc_otg_hcd_get_frame_number(hcd); -+ -+ /* sched_frame is always frame number(not uFrame) both in FS and HS !! */ -+ -+ /* -+ * skip_frames is used to limit activated descriptors number -+ * to avoid the situation when HC services the last activated -+ * descriptor firstly. -+ * Example for FS: -+ * Current frame is 1, scheduled frame is 3. Since HC always fetches the descriptor -+ * corresponding to curr_frame+1, the descriptor corresponding to frame 2 -+ * will be fetched. If the number of descriptors is max=64 (or greather) the list will -+ * be fully programmed with Active descriptors and it is possible case(rare) that the latest -+ * descriptor(considering rollback) corresponding to frame 2 will be serviced first. -+ * HS case is more probable because, in fact, up to 11 uframes(16 in the code) -+ * may be skipped. -+ */ -+ if (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) { -+ /* -+ * Consider uframe counter also, to start xfer asap. -+ * If half of the frame elapsed skip 2 frames otherwise -+ * just 1 frame. -+ * Starting descriptor index must be 8-aligned, so -+ * if the current frame is near to complete the next one -+ * is skipped as well. -+ */ -+ -+ if (dwc_micro_frame_num(hcd->frame_number) >= 5) { -+ *skip_frames = 2 * 8; -+ frame = dwc_frame_num_inc(hcd->frame_number, *skip_frames); -+ } -+ else { -+ *skip_frames = 1 * 8; -+ frame = dwc_frame_num_inc(hcd->frame_number, *skip_frames); -+ } -+ -+ frame = dwc_full_frame_num(frame); -+ } else { -+ /* -+ * Two frames are skipped for FS - the current and the next. -+ * But for descriptor programming, 1 frame(descriptor) is enough, -+ * see example above. -+ */ -+ *skip_frames = 1; -+ frame = dwc_frame_num_inc(hcd->frame_number, 2); -+ } -+ -+ return frame; -+} -+/* -+ * Calculate initial descriptor index for isochronous transfer -+ * based on scheduled frame. -+ */ -+static uint8_t recalc_initial_desc_idx(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ uint16_t frame = 0, fr_idx, fr_idx_tmp; -+ uint8_t skip_frames = 0 ; -+ /* -+ * With current ISOC processing algorithm the channel is being -+ * released when no more QTDs in the list(qh->ntd == 0). -+ * Thus this function is called only when qh->ntd == 0 and qh->channel == 0. -+ * -+ * So qh->channel != NULL branch is not used and just not removed from the -+ * source file. It is required for another possible approach which is, -+ * do not disable and release the channel when ISOC session completed, -+ * just move QH to inactive schedule until new QTD arrives. -+ * On new QTD, the QH moved back to 'ready' schedule, -+ * starting frame and therefore starting desc_index are recalculated. -+ * In this case channel is released only on ep_disable. -+ */ -+ -+ /* Calculate starting descriptor index. For INTERRUPT endpoint it is always 0. */ -+ if (qh->channel) { -+ frame = calc_starting_frame(hcd, qh, &skip_frames); -+ /* -+ * Calculate initial descriptor index based on FrameList current bitmap -+ * and servicing period. -+ */ -+ fr_idx_tmp = frame_list_idx(frame); -+ fr_idx = (MAX_FRLIST_EN_NUM + frame_list_idx(qh->sched_frame) - fr_idx_tmp) -+ % frame_incr_val(qh); -+ fr_idx = (fr_idx + fr_idx_tmp) % MAX_FRLIST_EN_NUM; -+ } -+ else { -+ qh->sched_frame = calc_starting_frame(hcd, qh, &skip_frames); -+ fr_idx = frame_list_idx(qh->sched_frame); -+ } -+ -+ qh->td_first = qh->td_last = frame_to_desc_idx(qh, fr_idx); -+ -+ return skip_frames; -+} -+ -+#define ISOC_URB_GIVEBACK_ASAP -+ -+#define MAX_ISOC_XFER_SIZE_FS 1023 -+#define MAX_ISOC_XFER_SIZE_HS 3072 -+#define DESCNUM_THRESHOLD 4 -+ -+static void init_isoc_dma_desc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, uint8_t skip_frames) -+{ -+ struct dwc_otg_hcd_iso_packet_desc *frame_desc; -+ dwc_otg_qtd_t *qtd; -+ dwc_otg_host_dma_desc_t *dma_desc; -+ uint16_t idx, inc, n_desc, ntd_max, max_xfer_size; -+ -+ idx = qh->td_last; -+ inc = qh->interval; -+ n_desc = 0; -+ -+ ntd_max = (max_desc_num(qh) + qh->interval - 1) / qh->interval; -+ if (skip_frames && !qh->channel) -+ ntd_max = ntd_max - skip_frames / qh->interval; -+ -+ max_xfer_size = (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) ? MAX_ISOC_XFER_SIZE_HS -+ : MAX_ISOC_XFER_SIZE_FS; -+ -+ DWC_CIRCLEQ_FOREACH(qtd, &qh->qtd_list, qtd_list_entry) { -+ while ((qh->ntd < ntd_max) && (qtd->isoc_frame_index_last < qtd->urb->packet_count)) { -+ -+ dma_desc = &qh->desc_list[idx]; -+ dwc_memset(dma_desc, 0x00, sizeof(dwc_otg_host_dma_desc_t)); -+ -+ frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index_last]; -+ -+ if (frame_desc->length > max_xfer_size) -+ qh->n_bytes[idx] = max_xfer_size; -+ else -+ qh->n_bytes[idx] = frame_desc->length; -+ dma_desc->status.b_isoc.n_bytes = qh->n_bytes[idx]; -+ dma_desc->status.b_isoc.a = 1; -+ -+ dma_desc->buf = qtd->urb->dma + frame_desc->offset; -+ -+ qh->ntd++; -+ -+ qtd->isoc_frame_index_last++; -+ -+ #ifdef ISOC_URB_GIVEBACK_ASAP -+ /* -+ * Set IOC for each descriptor corresponding to the -+ * last frame of the URB. -+ */ -+ if (qtd->isoc_frame_index_last == qtd->urb->packet_count) -+ dma_desc->status.b_isoc.ioc = 1; -+ -+ #endif -+ idx = desclist_idx_inc(idx, inc, qh->dev_speed); -+ n_desc++; -+ -+ } -+ qtd->in_process = 1; -+ } -+ -+ qh->td_last = idx; -+ -+#ifdef ISOC_URB_GIVEBACK_ASAP -+ /* Set IOC for the last descriptor if descriptor list is full */ -+ if (qh->ntd == ntd_max) { -+ idx = desclist_idx_dec(qh->td_last, inc, qh->dev_speed); -+ qh->desc_list[idx].status.b_isoc.ioc = 1; -+ } -+#else -+ /* -+ * Set IOC bit only for one descriptor. -+ * Always try to be ahead of HW processing, -+ * i.e. on IOC generation driver activates next descriptors but -+ * core continues to process descriptors followed the one with IOC set. -+ */ -+ -+ if (n_desc > DESCNUM_THRESHOLD) { -+ /* -+ * Move IOC "up". Required even if there is only one QTD -+ * in the list, cause QTDs migth continue to be queued, -+ * but during the activation it was only one queued. -+ * Actually more than one QTD might be in the list if this function called -+ * from XferCompletion - QTDs was queued during HW processing of the previous -+ * descriptor chunk. -+ */ -+ idx = dwc_desclist_idx_dec(idx, inc * ((qh->ntd + 1) / 2), qh->dev_speed); -+ } -+ else { -+ /* -+ * Set the IOC for the latest descriptor -+ * if either number of descriptor is not greather than threshold -+ * or no more new descriptors activated. -+ */ -+ idx = dwc_desclist_idx_dec(qh->td_last, inc, qh->dev_speed); -+ } -+ -+ qh->desc_list[idx].status.b_isoc.ioc = 1; -+#endif -+} -+ -+ -+static void init_non_isoc_dma_desc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ -+ dwc_hc_t *hc; -+ dwc_otg_host_dma_desc_t *dma_desc; -+ dwc_otg_qtd_t *qtd; -+ int num_packets, len, n_desc = 0; -+ -+ hc = qh->channel; -+ -+ /* -+ * Start with hc->xfer_buff initialized in -+ * assign_and_init_hc(), then if SG transfer consists of multiple URBs, -+ * this pointer re-assigned to the buffer of the currently processed QTD. -+ * For non-SG request there is always one QTD active. -+ */ -+ -+ DWC_CIRCLEQ_FOREACH(qtd, &qh->qtd_list, qtd_list_entry) { -+ -+ if (n_desc) { -+ /* SG request - more than 1 QTDs */ -+ hc->xfer_buff = (uint8_t *)qtd->urb->dma + qtd->urb->actual_length; -+ hc->xfer_len = qtd->urb->length - qtd->urb->actual_length; -+ } -+ -+ qtd->n_desc = 0; -+ -+ do { -+ dma_desc = &qh->desc_list[n_desc]; -+ len = hc->xfer_len; -+ -+ -+ if (len > MAX_DMA_DESC_SIZE) -+ len = MAX_DMA_DESC_SIZE - hc->max_packet + 1; -+ -+ if (hc->ep_is_in) { -+ if (len > 0) { -+ num_packets = (len + hc->max_packet - 1) / hc->max_packet; -+ } -+ else { -+ /* Need 1 packet for transfer length of 0. */ -+ num_packets = 1; -+ } -+ /* Always program an integral # of max packets for IN transfers. */ -+ len = num_packets * hc->max_packet; -+ } -+ -+ dma_desc->status.b.n_bytes = len; -+ -+ qh->n_bytes[n_desc] = len; -+ -+ -+ if ((qh->ep_type == UE_CONTROL) && (qtd->control_phase == DWC_OTG_CONTROL_SETUP)) -+ dma_desc->status.b.sup = 1; /* Setup Packet */ -+ -+ dma_desc->status.b.a = 1; /* Active descriptor */ -+ -+ dma_desc->buf = (uint32_t) hc->xfer_buff; -+ -+ /* -+ * Last descriptor(or single) of IN transfer -+ * with actual size less than MaxPacket. -+ */ -+ if (len > hc->xfer_len) { -+ hc->xfer_len = 0; -+ } -+ else { -+ hc->xfer_buff += len; -+ hc->xfer_len -= len; -+ } -+ -+ qtd->n_desc++; -+ n_desc++; -+ } -+ while ((hc->xfer_len > 0) && (n_desc != MAX_DMA_DESC_NUM_GENERIC)); -+ -+ -+ qtd->in_process = 1; -+ -+ if (n_desc == MAX_DMA_DESC_NUM_GENERIC) -+ break; -+ } -+ -+ if (n_desc) { -+ /* Request Transfer Complete interrupt for the last descriptor */ -+ qh->desc_list[n_desc-1].status.b.ioc = 1; -+ /* End of List indicator */ -+ qh->desc_list[n_desc-1].status.b.eol = 1; -+ -+ hc->ntd = n_desc; -+ } -+} -+ -+/** -+ * For Control and Bulk endpoints initializes descriptor list -+ * and starts the transfer. -+ * -+ * For Interrupt and Isochronous endpoints initializes descriptor list -+ * then updates FrameList, marking appropriate entries as active. -+ * In case of Isochronous, the starting descriptor index is calculated based -+ * on the scheduled frame, but only on the first transfer descriptor within a session. -+ * Then starts the transfer via enabling the channel. -+ * For Isochronous endpoint the channel is not halted on XferComplete -+ * interrupt so remains assigned to the endpoint(QH) until session is done. -+ * -+ * @param hcd The HCD state structure for the DWC OTG controller. -+ * @param qh The QH to init. -+ * -+ * @return 0 if successful, negative error code otherwise. -+ */ -+void dwc_otg_hcd_start_xfer_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) -+{ -+ /* Channel is already assigned */ -+ dwc_hc_t *hc = qh->channel; -+ uint8_t skip_frames = 0; -+ -+ switch (hc->ep_type) { -+ case DWC_OTG_EP_TYPE_CONTROL: -+ case DWC_OTG_EP_TYPE_BULK: -+ init_non_isoc_dma_desc(hcd, qh); -+ -+ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); -+ break; -+ case DWC_OTG_EP_TYPE_INTR: -+ init_non_isoc_dma_desc(hcd, qh); -+ -+ update_frame_list(hcd, qh, 1); -+ -+ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); -+ break; -+ case DWC_OTG_EP_TYPE_ISOC: -+ -+ if(!qh->ntd) -+ skip_frames = recalc_initial_desc_idx(hcd, qh); -+ -+ init_isoc_dma_desc(hcd, qh, skip_frames); -+ -+ if (!hc->xfer_started) { -+ -+ update_frame_list(hcd, qh, 1); -+ -+ /* -+ * Always set to max, instead of actual size. -+ * Otherwise ntd will be changed with -+ * channel being enabled. Not recommended. -+ * -+ */ -+ hc->ntd = max_desc_num(qh); -+ /* Enable channel only once for ISOC */ -+ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); -+ } -+ -+ break; -+ default: -+ -+ break; -+ } -+} -+ -+static void complete_isoc_xfer_ddma(dwc_otg_hcd_t *hcd, -+ dwc_hc_t *hc, -+ dwc_otg_hc_regs_t *hc_regs, -+ dwc_otg_halt_status_e halt_status) -+{ -+ struct dwc_otg_hcd_iso_packet_desc *frame_desc; -+ dwc_otg_qtd_t *qtd, *qtd_tmp; -+ dwc_otg_qh_t *qh; -+ dwc_otg_host_dma_desc_t *dma_desc; -+ uint16_t idx, remain; -+ uint8_t urb_compl; -+ -+ qh = hc->qh; -+ idx = qh->td_first; -+ -+ -+ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { -+ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) -+ qtd->in_process = 0; -+ return; -+ } -+ else if ((halt_status == DWC_OTG_HC_XFER_AHB_ERR) || -+ (halt_status == DWC_OTG_HC_XFER_BABBLE_ERR)) { -+ /* -+ * Channel is halted in these error cases. -+ * Considered as serious issues. -+ * Complete all URBs marking all frames as failed, -+ * irrespective whether some of the descriptors(frames) succeeded or no. -+ * Pass error code to completion routine as well, to -+ * update urb->status, some of class drivers might use it to stop -+ * queing transfer requests. -+ */ -+ int err = (halt_status == DWC_OTG_HC_XFER_AHB_ERR) -+ ? (-DWC_E_IO) -+ : (-DWC_E_OVERFLOW); -+ -+ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { -+ for(idx = 0; idx < qtd->urb->packet_count; idx++) { -+ frame_desc = &qtd->urb->iso_descs[idx]; -+ frame_desc->status = err; -+ } -+ hcd->fops->complete(hcd, qtd->urb->priv, qtd->urb, err); -+ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); -+ } -+ return; -+ } -+ -+ -+ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { -+ -+ if (!qtd->in_process) -+ break; -+ -+ urb_compl = 0; -+ -+ do { -+ -+ dma_desc = &qh->desc_list[idx]; -+ -+ frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index]; -+ remain = hc->ep_is_in ? dma_desc->status.b_isoc.n_bytes : 0; -+ -+ if (dma_desc->status.b_isoc.sts == DMA_DESC_STS_PKTERR) { -+ /* -+ * XactError or, unable to complete all the transactions -+ * in the scheduled micro-frame/frame, -+ * both indicated by DMA_DESC_STS_PKTERR. -+ */ -+ qtd->urb->error_count++; -+ frame_desc->actual_length = qh->n_bytes[idx] - remain; -+ frame_desc->status = -DWC_E_PROTOCOL; -+ } -+ else { -+ /* Success */ -+ -+ frame_desc->actual_length = qh->n_bytes[idx] - remain; -+ frame_desc->status = 0; -+ } -+ -+ if (++qtd->isoc_frame_index == qtd->urb->packet_count) { -+ /* -+ * urb->status is not used for isoc transfers here. -+ * The individual frame_desc status are used instead. -+ */ -+ -+ hcd->fops->complete(hcd, qtd->urb->priv, qtd->urb, 0); -+ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); -+ -+ /* -+ * This check is necessary because urb_dequeue can be called -+ * from urb complete callback(sound driver example). -+ * All pending URBs are dequeued there, so no need for -+ * further processing. -+ */ -+ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { -+ return; -+ } -+ -+ urb_compl = 1; -+ -+ } -+ -+ qh->ntd--; -+ -+ /* Stop if IOC requested descriptor reached */ -+ if (dma_desc->status.b_isoc.ioc) { -+ idx = desclist_idx_inc(idx, qh->interval, hc->speed); -+ goto stop_scan; -+ } -+ -+ idx = desclist_idx_inc(idx, qh->interval, hc->speed); -+ -+ if (urb_compl) -+ break; -+ } -+ while(idx != qh->td_first); -+ } -+stop_scan: -+ qh->td_first = idx; -+} -+ -+uint8_t update_non_isoc_urb_state_ddma(dwc_otg_hcd_t * hcd, -+ dwc_hc_t * hc, -+ dwc_otg_qtd_t * qtd, -+ dwc_otg_host_dma_desc_t * dma_desc, -+ dwc_otg_halt_status_e halt_status, -+ uint32_t n_bytes, -+ uint8_t *xfer_done) -+{ -+ -+ uint16_t remain = hc->ep_is_in ? dma_desc->status.b.n_bytes : 0; -+ dwc_otg_hcd_urb_t *urb = qtd->urb; -+ -+ -+ if (halt_status == DWC_OTG_HC_XFER_AHB_ERR) { -+ urb->status = -DWC_E_IO; -+ return 1; -+ } -+ if (dma_desc->status.b.sts == DMA_DESC_STS_PKTERR) { -+ switch (halt_status) { -+ case DWC_OTG_HC_XFER_STALL: -+ urb->status = -DWC_E_PIPE; -+ break; -+ case DWC_OTG_HC_XFER_BABBLE_ERR: -+ urb->status = -DWC_E_OVERFLOW; -+ break; -+ case DWC_OTG_HC_XFER_XACT_ERR: -+ urb->status = -DWC_E_PROTOCOL; -+ break; -+ default: -+ DWC_ERROR("%s: Unhandled descriptor error status (%d)\n", __func__, -+ halt_status); -+ break; -+ } -+ return 1; -+ } -+ -+ if (dma_desc->status.b.a == 1) { -+ DWC_DEBUGPL(DBG_HCDV, "Active descriptor encountered on channel %d\n", hc->hc_num); -+ return 0; -+ } -+ -+ if (hc->ep_type == DWC_OTG_EP_TYPE_CONTROL) { -+ if (qtd->control_phase == DWC_OTG_CONTROL_DATA) { -+ urb->actual_length += n_bytes - remain; -+ if (remain || urb->actual_length >= urb->length) { -+ /* -+ * For Control Data stage do not set urb->status=0 to prevent -+ * URB callback. Set it when Status phase done. See below. -+ */ -+ *xfer_done = 1; -+ } -+ -+ } -+ else if (qtd->control_phase == DWC_OTG_CONTROL_STATUS) { -+ urb->status = 0; -+ *xfer_done = 1; -+ } -+ /* No handling for SETUP stage */ -+ -+ } -+ else { -+ /* BULK and INTR */ -+ urb->actual_length += n_bytes - remain; -+ if (remain || urb->actual_length >= urb->length) { -+ urb->status = 0; -+ *xfer_done = 1; -+ } -+ } -+ -+ return 0; -+} -+ -+static void complete_non_isoc_xfer_ddma(dwc_otg_hcd_t * hcd, -+ dwc_hc_t * hc, -+ dwc_otg_hc_regs_t * hc_regs, -+ dwc_otg_halt_status_e halt_status) -+{ -+ dwc_otg_hcd_urb_t *urb = NULL; -+ dwc_otg_qtd_t *qtd, *qtd_tmp; -+ dwc_otg_qh_t *qh; -+ dwc_otg_host_dma_desc_t *dma_desc; -+ uint32_t n_bytes, n_desc, i; -+ uint8_t failed = 0, xfer_done; -+ -+ n_desc = 0; -+ -+ qh = hc->qh; -+ -+ -+ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { -+ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { -+ qtd->in_process = 0; -+ } -+ return; -+ } -+ -+ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &qh->qtd_list, qtd_list_entry) { -+ -+ urb = qtd->urb; -+ -+ n_bytes = 0; -+ xfer_done = 0; -+ -+ for (i = 0; i < qtd->n_desc; i++) { -+ dma_desc = &qh->desc_list[n_desc]; -+ -+ n_bytes = qh->n_bytes[n_desc]; -+ -+ -+ failed = update_non_isoc_urb_state_ddma(hcd, hc, qtd, dma_desc, -+ halt_status, n_bytes, &xfer_done); -+ -+ if (failed || (xfer_done && (urb->status != -DWC_E_IN_PROGRESS))) { -+ -+ hcd->fops->complete(hcd, urb->priv, urb, urb->status); -+ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); -+ -+ if (failed) -+ goto stop_scan; -+ } -+ else if (qh->ep_type == UE_CONTROL) { -+ if (qtd->control_phase == DWC_OTG_CONTROL_SETUP) { -+ if (urb->length > 0) { -+ qtd->control_phase = DWC_OTG_CONTROL_DATA; -+ } else { -+ qtd->control_phase = DWC_OTG_CONTROL_STATUS; -+ } -+ DWC_DEBUGPL(DBG_HCDV, " Control setup transaction done\n"); -+ } -+ else if(qtd->control_phase == DWC_OTG_CONTROL_DATA) { -+ if (xfer_done) { -+ qtd->control_phase = DWC_OTG_CONTROL_STATUS; -+ DWC_DEBUGPL(DBG_HCDV, " Control data transfer done\n"); -+ } else if (i+1 == qtd->n_desc){ -+ /* -+ * Last descriptor for Control data stage which is -+ * not completed yet. -+ */ -+ dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); -+ } -+ } -+ } -+ -+ n_desc++; -+ } -+ -+ } -+ -+stop_scan: -+ -+ if (qh->ep_type != UE_CONTROL) { -+ /* -+ * Resetting the data toggle for bulk -+ * and interrupt endpoints in case of stall. See handle_hc_stall_intr() -+ */ -+ if (halt_status == DWC_OTG_HC_XFER_STALL) { -+ qh->data_toggle = DWC_OTG_HC_PID_DATA0; -+ } -+ else { -+ dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); -+ } -+ } -+ -+ if (halt_status == DWC_OTG_HC_XFER_COMPLETE) { -+ hcint_data_t hcint; -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); -+ if (hcint.b.nyet) { -+ /* -+ * Got a NYET on the last transaction of the transfer. It -+ * means that the endpoint should be in the PING state at the -+ * beginning of the next transfer. -+ */ -+ qh->ping_state = 1; -+ clear_hc_int(hc_regs, nyet); -+ } -+ -+ } -+ -+} -+ -+/** -+ * This function is called from interrupt handlers. -+ * Scans the descriptor list, updates URB's status and -+ * calls completion routine for the URB if it's done. -+ * Releases the channel to be used by other transfers. -+ * In case of Isochronous endpoint the channel is not halted until -+ * the end of the session, i.e. QTD list is empty. -+ * If periodic channel released the FrameList is updated accordingly. -+ * -+ * Calls transaction selection routines to activate pending transfers. -+ * -+ * @param hcd The HCD state structure for the DWC OTG controller. -+ * @param hc Host channel, the transfer is completed on. -+ * @param hc_regs Host channel registers. -+ * @param halt_status Reason the channel is being halted, -+ * or just XferComplete for isochronous transfer -+ */ -+void dwc_otg_hcd_complete_xfer_ddma(dwc_otg_hcd_t *hcd, -+ dwc_hc_t *hc, -+ dwc_otg_hc_regs_t *hc_regs, -+ dwc_otg_halt_status_e halt_status) -+{ -+ uint8_t continue_isoc_xfer = 0; -+ dwc_otg_transaction_type_e tr_type; -+ dwc_otg_qh_t *qh = hc->qh; -+ -+ if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) { -+ -+ complete_isoc_xfer_ddma(hcd, hc, hc_regs, halt_status); -+ -+ /* Release the channel if halted or session completed */ -+ if (halt_status != DWC_OTG_HC_XFER_COMPLETE || -+ DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { -+ -+ /* Halt the channel if session completed */ -+ if (halt_status == DWC_OTG_HC_XFER_COMPLETE) { -+ dwc_otg_hc_halt(hcd->core_if, hc, halt_status); -+ } -+ -+ release_channel_ddma(hcd, qh); -+ dwc_otg_hcd_qh_remove(hcd, qh); -+ } -+ else { -+ /* Keep in assigned schedule to continue transfer */ -+ DWC_LIST_MOVE_HEAD(&hcd->periodic_sched_assigned, -+ &qh->qh_list_entry); -+ continue_isoc_xfer = 1; -+ -+ } -+ /** @todo Consider the case when period exceeds FrameList size. -+ * Frame Rollover interrupt should be used. -+ */ -+ } -+ else { -+ /* Scan descriptor list to complete the URB(s), then release the channel */ -+ complete_non_isoc_xfer_ddma(hcd, hc, hc_regs, halt_status); -+ -+ release_channel_ddma(hcd, qh); -+ -+ dwc_otg_hcd_qh_remove(hcd, qh); -+ -+ if (!DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { -+ /* Add back to inactive non-periodic schedule on normal completion */ -+ dwc_otg_hcd_qh_add(hcd, qh); -+ } -+ -+ -+ } -+ tr_type = dwc_otg_hcd_select_transactions(hcd); -+ if (tr_type != DWC_OTG_TRANSACTION_NONE || continue_isoc_xfer) { -+ if (continue_isoc_xfer) { -+ if (tr_type == DWC_OTG_TRANSACTION_NONE) { -+ tr_type = DWC_OTG_TRANSACTION_PERIODIC; -+ } else if (tr_type == DWC_OTG_TRANSACTION_NON_PERIODIC) { -+ tr_type = DWC_OTG_TRANSACTION_ALL; -+ } -+ } -+ dwc_otg_hcd_queue_transactions(hcd, tr_type); -+ } -+} -+ -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2012-07-15 20:29:19.173085296 +0200 -@@ -0,0 +1,813 @@ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd.h b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +new file mode 100644 +index 0000000..dd30f47 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +@@ -0,0 +1,824 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $ -+ * $Revision: #52 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237472 $ ++ * $Revision: #58 $ ++ * $Date: 2011/09/15 $ ++ * $Change: 1846647 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -55219,7 +65669,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 +#ifndef __DWC_HCD_H__ +#define __DWC_HCD_H__ + -+#include ++#include "dwc_otg_os_dep.h" ++#include "usb.h" +#include "dwc_otg_hcd_if.h" +#include "dwc_otg_core_if.h" +#include "dwc_list.h" @@ -55423,17 +65874,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + DWC_CIRCLEQ_ENTRY(dwc_otg_qtd) qtd_list_entry; + + /** Indicates if this QTD is currently processed by HW. */ -+ uint8_t in_process; ++ uint8_t in_process; + + /** Number of DMA descriptors for this QTD */ -+ uint8_t n_desc; -+ ++ uint8_t n_desc; ++ + /** + * Last activated frame(packet) index. + * Used in Descriptor DMA mode only. + */ + uint16_t isoc_frame_index_last; -+ ++ +} dwc_otg_qtd_t; + +DWC_CIRCLEQ_HEAD(dwc_otg_qtd_list, dwc_otg_qtd); @@ -55516,55 +65967,50 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + */ + uint8_t *dw_align_buf; + dwc_dma_t dw_align_buf_dma; -+ ++ + /** Entry for QH in either the periodic or non-periodic schedule. */ + dwc_list_link_t qh_list_entry; -+ ++ + /** @name Descriptor DMA support */ + /** @{ */ -+ ++ + /** Descriptor List. */ -+ dwc_otg_host_dma_desc_t *desc_list; -+ ++ dwc_otg_host_dma_desc_t *desc_list; ++ + /** Descriptor List physical address. */ + dwc_dma_t desc_list_dma; -+ ++ + /** + * Xfer Bytes array. + * Each element corresponds to a descriptor and indicates + * original XferSize size value for the descriptor. + */ + uint32_t *n_bytes; -+ ++ + /** Actual number of transfer descriptors in a list. */ + uint16_t ntd; -+ ++ + /** First activated isochronous transfer descriptor index. */ + uint8_t td_first; + /** Last activated isochronous transfer descriptor index. */ + uint8_t td_last; -+ ++ + /** @} */ -+ ++ ++ ++ uint16_t speed; ++ uint16_t frame_usecs[8]; +} dwc_otg_qh_t; + +DWC_CIRCLEQ_HEAD(hc_list, dwc_hc); + -+#ifdef HW2937_WORKAROUND -+ -+typedef enum { -+ HW2937_XFER_MODE_IDLE, -+ HW2937_XFER_MODE_IN, -+ HW2937_XFER_MODE_OUT, -+ HW2937_XFER_MODE_PAUSEIN /* Transitioning from IN to IDLE */ -+} hw2937_xfer_mode_t; -+#endif -+ +/** + * This structure holds the state of the HCD, including the non-periodic and + * periodic schedules. + */ +struct dwc_otg_hcd { ++ /** The DWC otg device pointer */ ++ struct dwc_otg_device *otg_dev; + /** DWC OTG Core Interface Layer */ + dwc_otg_core_if_t *core_if; + @@ -55659,12 +66105,30 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + uint16_t periodic_usecs; + + /** ++ * Total bandwidth claimed so far for all periodic transfers ++ * in a frame. ++ * This will include a mixture of HS and FS transfers. ++ * Units are microseconds per (micro)frame. ++ * We have a budget per frame and have to schedule ++ * transactions accordingly. ++ * Watch out for the fact that things are actually scheduled for the ++ * "next frame". ++ */ ++ uint16_t frame_usecs[8]; ++ ++ ++ /** + * Frame number read from the core at SOF. The value ranges from 0 to + * DWC_HFNUM_MAX_FRNUM. + */ + uint16_t frame_number; + + /** ++ * Count of periodic QHs, if using several eps. For SOF enable/disable. ++ */ ++ uint16_t periodic_qh_count; ++ ++ /** + * Free host channels in the controller. This is a list of + * dwc_hc_t items. + */ @@ -55675,12 +66139,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + * transaction and at least one host channel available for + * non-periodic transactions. + */ -+ int periodic_channels; ++ int periodic_channels; /* microframe_schedule==0 */ + + /** + * Number of host channels assigned to non-periodic transfers. + */ -+ int non_periodic_channels; ++ int non_periodic_channels; /* microframe_schedule==0 */ ++ ++ /** ++ * Number of host channels assigned to non-periodic transfers. ++ */ ++ int available_host_channels; + + /** + * Array of pointers to the host channel descriptors. Allows accessing @@ -55728,14 +66197,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + /** Frame List DMA address */ + dma_addr_t frame_list_dma; + -+#ifdef HW2937_WORKAROUND -+ /** Current transfer mode (IN, OUT, or IDLE) */ -+ hw2937_xfer_mode_t hw2937_xfer_mode; -+ -+ /** Mask of channels assigned to the current mode */ -+ uint32_t hw2937_assigned_channels; -+#endif -+ +#ifdef DEBUG + uint32_t frrem_samples; + uint64_t frrem_accum; @@ -55754,15 +66215,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + uint32_t hfnum_other_samples_b; + uint64_t hfnum_other_frrem_accum_b; +#endif -+#ifdef SOF_FIX -+ /** -+ * SOF wakeup timer. We disable the SOF interrupt if there is nothing -+ * to do. However, that eventually gets us into trouble. So, re-enable -+ * the SOF interrupt every tick so we can handle any backlog that does -+ * not trigger any other interrupt. -+ */ -+ dwc_timer_t *sof_timer; -+#endif +}; + +/** @name Transaction Execution Functions */ @@ -55770,14 +66222,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 +extern dwc_otg_transaction_type_e dwc_otg_hcd_select_transactions(dwc_otg_hcd_t + * hcd); +extern void dwc_otg_hcd_queue_transactions(dwc_otg_hcd_t * hcd, -+ dwc_otg_transaction_type_e tr_type); ++ dwc_otg_transaction_type_e tr_type); + +/** @} */ + +/** @name Interrupt Handler Functions */ +/** @{ */ +extern int32_t dwc_otg_hcd_handle_intr(dwc_otg_hcd_t * dwc_otg_hcd); -+extern int32_t dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd_t * dwc_otg_hcd); ++extern int32_t dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd_t * dwc_otg_hcd, int32_t); +extern int32_t dwc_otg_hcd_handle_rx_status_q_level_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_np_tx_fifo_empty_intr(dwc_otg_hcd_t * @@ -55803,7 +66255,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + +/* Implemented in dwc_otg_hcd_queue.c */ +extern dwc_otg_qh_t *dwc_otg_hcd_qh_create(dwc_otg_hcd_t * hcd, -+ dwc_otg_hcd_urb_t * urb); ++ dwc_otg_hcd_urb_t * urb, int atomic_alloc); +extern void dwc_otg_hcd_qh_free(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); @@ -55814,27 +66266,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 +static inline void dwc_otg_hcd_qh_remove_and_free(dwc_otg_hcd_t * hcd, + dwc_otg_qh_t * qh) +{ ++ dwc_irqflags_t flags; ++ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); + dwc_otg_hcd_qh_remove(hcd, qh); ++ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + dwc_otg_hcd_qh_free(hcd, qh); +} + +/** Allocates memory for a QH structure. + * @return Returns the memory allocate or NULL on error. */ -+static inline dwc_otg_qh_t *dwc_otg_hcd_qh_alloc(void) ++static inline dwc_otg_qh_t *dwc_otg_hcd_qh_alloc(int atomic_alloc) +{ -+ return (dwc_otg_qh_t *) dwc_alloc_atomic(sizeof(dwc_otg_qh_t)); ++ if (atomic_alloc) ++ return (dwc_otg_qh_t *) DWC_ALLOC_ATOMIC(sizeof(dwc_otg_qh_t)); ++ else ++ return (dwc_otg_qh_t *) DWC_ALLOC(sizeof(dwc_otg_qh_t)); +} + -+extern dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb); ++extern dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb, ++ int atomic_alloc); +extern void dwc_otg_hcd_qtd_init(dwc_otg_qtd_t * qtd, dwc_otg_hcd_urb_t * urb); +extern int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd, dwc_otg_hcd_t * dwc_otg_hcd, -+ dwc_otg_qh_t ** qh); ++ dwc_otg_qh_t ** qh, int atomic_alloc); + +/** Allocates memory for a QTD structure. + * @return Returns the memory allocate or NULL on error. */ -+static inline dwc_otg_qtd_t *dwc_otg_hcd_qtd_alloc(void) ++static inline dwc_otg_qtd_t *dwc_otg_hcd_qtd_alloc(int atomic_alloc) +{ -+ return (dwc_otg_qtd_t *) dwc_alloc_atomic(sizeof(dwc_otg_qtd_t)); ++ if (atomic_alloc) ++ return (dwc_otg_qtd_t *) DWC_ALLOC_ATOMIC(sizeof(dwc_otg_qtd_t)); ++ else ++ return (dwc_otg_qtd_t *) DWC_ALLOC(sizeof(dwc_otg_qtd_t)); +} + +/** Frees the memory for a QTD structure. QTD should already be removed from @@ -55842,7 +66304,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + * @param qtd QTD to free.*/ +static inline void dwc_otg_hcd_qtd_free(dwc_otg_qtd_t * qtd) +{ -+ dwc_free(qtd); ++ DWC_FREE(qtd); +} + +/** Removes a QTD from list. @@ -55854,13 +66316,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + dwc_otg_qtd_t * qtd, + dwc_otg_qh_t * qh) +{ -+ uint64_t flags; -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); + DWC_CIRCLEQ_REMOVE(&qh->qtd_list, qtd, qtd_list_entry); -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); +} + -+/** Remove and free a QTD */ ++/** Remove and free a QTD ++ * Need to disable IRQ and hold hcd lock while calling this function out of ++ * interrupt servicing chain */ +static inline void dwc_otg_hcd_qtd_remove_and_free(dwc_otg_hcd_t * hcd, + dwc_otg_qtd_t * qtd, + dwc_otg_qh_t * qh) @@ -55876,15 +66337,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + +extern void dwc_otg_hcd_start_xfer_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_complete_xfer_ddma(dwc_otg_hcd_t * hcd, -+ dwc_hc_t * hc, -+ dwc_otg_hc_regs_t * hc_regs, -+ dwc_otg_halt_status_e halt_status); ++ dwc_hc_t * hc, ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_halt_status_e halt_status); + +extern int dwc_otg_hcd_qh_init_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_qh_free_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); + +/** @} */ -+ ++ +/** @name Internal Functions */ +/** @{ */ +dwc_otg_qh_t *dwc_urb_to_qh(dwc_otg_hcd_urb_t * urb); @@ -55955,8 +66416,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 +} + +void dwc_otg_hcd_save_data_toggle(dwc_hc_t * hc, -+ dwc_otg_hc_regs_t * hc_regs, -+ dwc_otg_qtd_t * qtd); ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_qtd_t * qtd); + +#ifdef DEBUG +/** @@ -55974,7 +66435,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 + dwc_otg_qtd_t *qtd; \ + qtd = list_entry(_qh->qtd_list.next, dwc_otg_qtd_t, qtd_list_entry); \ + if (usb_pipeint(qtd->urb->pipe) && _qh->start_split_frame != 0 && !qtd->complete_split) { \ -+ hfnum.d32 = dwc_read_reg32(&_hcd->core_if->host_if->host_global_regs->hfnum); \ ++ hfnum.d32 = DWC_READ_REG32(&_hcd->core_if->host_if->host_global_regs->hfnum); \ + switch (hfnum.b.frnum & 0x7) { \ + case 7: \ + _hcd->hfnum_7_samples_##_letter++; \ @@ -55995,16 +66456,1157 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-rpi-bootc-3 +#define dwc_sample_frrem(_hcd, _qh, _letter) +#endif +#endif -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2012-07-15 20:29:19.209085970 +0200 -@@ -0,0 +1,393 @@ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c +new file mode 100644 +index 0000000..d0d5fa1 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c +@@ -0,0 +1,1133 @@ ++/*========================================================================== ++ * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $ ++ * $Revision: #10 $ ++ * $Date: 2011/10/20 $ ++ * $Change: 1869464 $ ++ * ++ * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, ++ * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless ++ * otherwise expressly agreed to in writing between Synopsys and you. ++ * ++ * The Software IS NOT an item of Licensed Software or Licensed Product under ++ * any End User Software License Agreement or Agreement for Licensed Product ++ * with Synopsys or any supplement thereto. You are permitted to use and ++ * redistribute this Software in source and binary forms, with or without ++ * modification, provided that redistributions of source code must retain this ++ * notice. You may not view, use, disclose, copy or distribute this file or ++ * any information contained herein except pursuant to this license grant from ++ * Synopsys. If you do not agree with this notice, including the disclaimer ++ * below, then you are not authorized to use the Software. ++ * ++ * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS ++ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT, ++ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH ++ * DAMAGE. ++ * ========================================================================== */ ++#ifndef DWC_DEVICE_ONLY ++ ++/** @file ++ * This file contains Descriptor DMA support implementation for host mode. ++ */ ++ ++#include "dwc_otg_hcd.h" ++#include "dwc_otg_regs.h" ++ ++extern bool microframe_schedule; ++ ++static inline uint8_t frame_list_idx(uint16_t frame) ++{ ++ return (frame & (MAX_FRLIST_EN_NUM - 1)); ++} ++ ++static inline uint16_t desclist_idx_inc(uint16_t idx, uint16_t inc, uint8_t speed) ++{ ++ return (idx + inc) & ++ (((speed == ++ DWC_OTG_EP_SPEED_HIGH) ? MAX_DMA_DESC_NUM_HS_ISOC : ++ MAX_DMA_DESC_NUM_GENERIC) - 1); ++} ++ ++static inline uint16_t desclist_idx_dec(uint16_t idx, uint16_t inc, uint8_t speed) ++{ ++ return (idx - inc) & ++ (((speed == ++ DWC_OTG_EP_SPEED_HIGH) ? MAX_DMA_DESC_NUM_HS_ISOC : ++ MAX_DMA_DESC_NUM_GENERIC) - 1); ++} ++ ++static inline uint16_t max_desc_num(dwc_otg_qh_t * qh) ++{ ++ return (((qh->ep_type == UE_ISOCHRONOUS) ++ && (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH)) ++ ? MAX_DMA_DESC_NUM_HS_ISOC : MAX_DMA_DESC_NUM_GENERIC); ++} ++static inline uint16_t frame_incr_val(dwc_otg_qh_t * qh) ++{ ++ return ((qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) ++ ? ((qh->interval + 8 - 1) / 8) ++ : qh->interval); ++} ++ ++static int desc_list_alloc(dwc_otg_qh_t * qh) ++{ ++ int retval = 0; ++ ++ qh->desc_list = (dwc_otg_host_dma_desc_t *) ++ DWC_DMA_ALLOC(sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh), ++ &qh->desc_list_dma); ++ ++ if (!qh->desc_list) { ++ retval = -DWC_E_NO_MEMORY; ++ DWC_ERROR("%s: DMA descriptor list allocation failed\n", __func__); ++ ++ } ++ ++ dwc_memset(qh->desc_list, 0x00, ++ sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh)); ++ ++ qh->n_bytes = ++ (uint32_t *) DWC_ALLOC(sizeof(uint32_t) * max_desc_num(qh)); ++ ++ if (!qh->n_bytes) { ++ retval = -DWC_E_NO_MEMORY; ++ DWC_ERROR ++ ("%s: Failed to allocate array for descriptors' size actual values\n", ++ __func__); ++ ++ } ++ return retval; ++ ++} ++ ++static void desc_list_free(dwc_otg_qh_t * qh) ++{ ++ if (qh->desc_list) { ++ DWC_DMA_FREE(max_desc_num(qh), qh->desc_list, ++ qh->desc_list_dma); ++ qh->desc_list = NULL; ++ } ++ ++ if (qh->n_bytes) { ++ DWC_FREE(qh->n_bytes); ++ qh->n_bytes = NULL; ++ } ++} ++ ++static int frame_list_alloc(dwc_otg_hcd_t * hcd) ++{ ++ int retval = 0; ++ if (hcd->frame_list) ++ return 0; ++ ++ hcd->frame_list = DWC_DMA_ALLOC(4 * MAX_FRLIST_EN_NUM, ++ &hcd->frame_list_dma); ++ if (!hcd->frame_list) { ++ retval = -DWC_E_NO_MEMORY; ++ DWC_ERROR("%s: Frame List allocation failed\n", __func__); ++ } ++ ++ dwc_memset(hcd->frame_list, 0x00, 4 * MAX_FRLIST_EN_NUM); ++ ++ return retval; ++} ++ ++static void frame_list_free(dwc_otg_hcd_t * hcd) ++{ ++ if (!hcd->frame_list) ++ return; ++ ++ DWC_DMA_FREE(4 * MAX_FRLIST_EN_NUM, hcd->frame_list, hcd->frame_list_dma); ++ hcd->frame_list = NULL; ++} ++ ++static void per_sched_enable(dwc_otg_hcd_t * hcd, uint16_t fr_list_en) ++{ ++ ++ hcfg_data_t hcfg; ++ ++ hcfg.d32 = DWC_READ_REG32(&hcd->core_if->host_if->host_global_regs->hcfg); ++ ++ if (hcfg.b.perschedena) { ++ /* already enabled */ ++ return; ++ } ++ ++ DWC_WRITE_REG32(&hcd->core_if->host_if->host_global_regs->hflbaddr, ++ hcd->frame_list_dma); ++ ++ switch (fr_list_en) { ++ case 64: ++ hcfg.b.frlisten = 3; ++ break; ++ case 32: ++ hcfg.b.frlisten = 2; ++ break; ++ case 16: ++ hcfg.b.frlisten = 1; ++ break; ++ case 8: ++ hcfg.b.frlisten = 0; ++ break; ++ default: ++ break; ++ } ++ ++ hcfg.b.perschedena = 1; ++ ++ DWC_DEBUGPL(DBG_HCD, "Enabling Periodic schedule\n"); ++ DWC_WRITE_REG32(&hcd->core_if->host_if->host_global_regs->hcfg, hcfg.d32); ++ ++} ++ ++static void per_sched_disable(dwc_otg_hcd_t * hcd) ++{ ++ hcfg_data_t hcfg; ++ ++ hcfg.d32 = DWC_READ_REG32(&hcd->core_if->host_if->host_global_regs->hcfg); ++ ++ if (!hcfg.b.perschedena) { ++ /* already disabled */ ++ return; ++ } ++ hcfg.b.perschedena = 0; ++ ++ DWC_DEBUGPL(DBG_HCD, "Disabling Periodic schedule\n"); ++ DWC_WRITE_REG32(&hcd->core_if->host_if->host_global_regs->hcfg, hcfg.d32); ++} ++ ++/* ++ * Activates/Deactivates FrameList entries for the channel ++ * based on endpoint servicing period. ++ */ ++void update_frame_list(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, uint8_t enable) ++{ ++ uint16_t i, j, inc; ++ dwc_hc_t *hc = NULL; ++ ++ if (!qh->channel) { ++ DWC_ERROR("qh->channel = %p", qh->channel); ++ return; ++ } ++ ++ if (!hcd) { ++ DWC_ERROR("------hcd = %p", hcd); ++ return; ++ } ++ ++ if (!hcd->frame_list) { ++ DWC_ERROR("-------hcd->frame_list = %p", hcd->frame_list); ++ return; ++ } ++ ++ hc = qh->channel; ++ inc = frame_incr_val(qh); ++ if (qh->ep_type == UE_ISOCHRONOUS) ++ i = frame_list_idx(qh->sched_frame); ++ else ++ i = 0; ++ ++ j = i; ++ do { ++ if (enable) ++ hcd->frame_list[j] |= (1 << hc->hc_num); ++ else ++ hcd->frame_list[j] &= ~(1 << hc->hc_num); ++ j = (j + inc) & (MAX_FRLIST_EN_NUM - 1); ++ } ++ while (j != i); ++ if (!enable) ++ return; ++ hc->schinfo = 0; ++ if (qh->channel->speed == DWC_OTG_EP_SPEED_HIGH) { ++ j = 1; ++ /* TODO - check this */ ++ inc = (8 + qh->interval - 1) / qh->interval; ++ for (i = 0; i < inc; i++) { ++ hc->schinfo |= j; ++ j = j << qh->interval; ++ } ++ } else { ++ hc->schinfo = 0xff; ++ } ++} ++ ++#if 1 ++void dump_frame_list(dwc_otg_hcd_t * hcd) ++{ ++ int i = 0; ++ DWC_PRINTF("--FRAME LIST (hex) --\n"); ++ for (i = 0; i < MAX_FRLIST_EN_NUM; i++) { ++ DWC_PRINTF("%x\t", hcd->frame_list[i]); ++ if (!(i % 8) && i) ++ DWC_PRINTF("\n"); ++ } ++ DWC_PRINTF("\n----\n"); ++ ++} ++#endif ++ ++static void release_channel_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ dwc_irqflags_t flags; ++ dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); ++ ++ dwc_hc_t *hc = qh->channel; ++ if (dwc_qh_is_non_per(qh)) { ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); ++ if (!microframe_schedule) ++ hcd->non_periodic_channels--; ++ else ++ hcd->available_host_channels++; ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); ++ } else ++ update_frame_list(hcd, qh, 0); ++ ++ /* ++ * The condition is added to prevent double cleanup try in case of device ++ * disconnect. See channel cleanup in dwc_otg_hcd_disconnect_cb(). ++ */ ++ if (hc->qh) { ++ dwc_otg_hc_cleanup(hcd->core_if, hc); ++ DWC_CIRCLEQ_INSERT_TAIL(&hcd->free_hc_list, hc, hc_list_entry); ++ hc->qh = NULL; ++ } ++ ++ qh->channel = NULL; ++ qh->ntd = 0; ++ ++ if (qh->desc_list) { ++ dwc_memset(qh->desc_list, 0x00, ++ sizeof(dwc_otg_host_dma_desc_t) * max_desc_num(qh)); ++ } ++ DWC_SPINLOCK_FREE(channel_lock); ++} ++ ++/** ++ * Initializes a QH structure's Descriptor DMA related members. ++ * Allocates memory for descriptor list. ++ * On first periodic QH, allocates memory for FrameList ++ * and enables periodic scheduling. ++ * ++ * @param hcd The HCD state structure for the DWC OTG controller. ++ * @param qh The QH to init. ++ * ++ * @return 0 if successful, negative error code otherwise. ++ */ ++int dwc_otg_hcd_qh_init_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ int retval = 0; ++ ++ if (qh->do_split) { ++ DWC_ERROR("SPLIT Transfers are not supported in Descriptor DMA.\n"); ++ return -1; ++ } ++ ++ retval = desc_list_alloc(qh); ++ ++ if ((retval == 0) ++ && (qh->ep_type == UE_ISOCHRONOUS || qh->ep_type == UE_INTERRUPT)) { ++ if (!hcd->frame_list) { ++ retval = frame_list_alloc(hcd); ++ /* Enable periodic schedule on first periodic QH */ ++ if (retval == 0) ++ per_sched_enable(hcd, MAX_FRLIST_EN_NUM); ++ } ++ } ++ ++ qh->ntd = 0; ++ ++ return retval; ++} ++ ++/** ++ * Frees descriptor list memory associated with the QH. ++ * If QH is periodic and the last, frees FrameList memory ++ * and disables periodic scheduling. ++ * ++ * @param hcd The HCD state structure for the DWC OTG controller. ++ * @param qh The QH to init. ++ */ ++void dwc_otg_hcd_qh_free_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ desc_list_free(qh); ++ ++ /* ++ * Channel still assigned due to some reasons. ++ * Seen on Isoc URB dequeue. Channel halted but no subsequent ++ * ChHalted interrupt to release the channel. Afterwards ++ * when it comes here from endpoint disable routine ++ * channel remains assigned. ++ */ ++ if (qh->channel) ++ release_channel_ddma(hcd, qh); ++ ++ if ((qh->ep_type == UE_ISOCHRONOUS || qh->ep_type == UE_INTERRUPT) ++ && (microframe_schedule || !hcd->periodic_channels) && hcd->frame_list) { ++ ++ per_sched_disable(hcd); ++ frame_list_free(hcd); ++ } ++} ++ ++static uint8_t frame_to_desc_idx(dwc_otg_qh_t * qh, uint16_t frame_idx) ++{ ++ if (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) { ++ /* ++ * Descriptor set(8 descriptors) index ++ * which is 8-aligned. ++ */ ++ return (frame_idx & ((MAX_DMA_DESC_NUM_HS_ISOC / 8) - 1)) * 8; ++ } else { ++ return (frame_idx & (MAX_DMA_DESC_NUM_GENERIC - 1)); ++ } ++} ++ ++/* ++ * Determine starting frame for Isochronous transfer. ++ * Few frames skipped to prevent race condition with HC. ++ */ ++static uint8_t calc_starting_frame(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, ++ uint8_t * skip_frames) ++{ ++ uint16_t frame = 0; ++ hcd->frame_number = dwc_otg_hcd_get_frame_number(hcd); ++ ++ /* sched_frame is always frame number(not uFrame) both in FS and HS !! */ ++ ++ /* ++ * skip_frames is used to limit activated descriptors number ++ * to avoid the situation when HC services the last activated ++ * descriptor firstly. ++ * Example for FS: ++ * Current frame is 1, scheduled frame is 3. Since HC always fetches the descriptor ++ * corresponding to curr_frame+1, the descriptor corresponding to frame 2 ++ * will be fetched. If the number of descriptors is max=64 (or greather) the ++ * list will be fully programmed with Active descriptors and it is possible ++ * case(rare) that the latest descriptor(considering rollback) corresponding ++ * to frame 2 will be serviced first. HS case is more probable because, in fact, ++ * up to 11 uframes(16 in the code) may be skipped. ++ */ ++ if (qh->dev_speed == DWC_OTG_EP_SPEED_HIGH) { ++ /* ++ * Consider uframe counter also, to start xfer asap. ++ * If half of the frame elapsed skip 2 frames otherwise ++ * just 1 frame. ++ * Starting descriptor index must be 8-aligned, so ++ * if the current frame is near to complete the next one ++ * is skipped as well. ++ */ ++ ++ if (dwc_micro_frame_num(hcd->frame_number) >= 5) { ++ *skip_frames = 2 * 8; ++ frame = dwc_frame_num_inc(hcd->frame_number, *skip_frames); ++ } else { ++ *skip_frames = 1 * 8; ++ frame = dwc_frame_num_inc(hcd->frame_number, *skip_frames); ++ } ++ ++ frame = dwc_full_frame_num(frame); ++ } else { ++ /* ++ * Two frames are skipped for FS - the current and the next. ++ * But for descriptor programming, 1 frame(descriptor) is enough, ++ * see example above. ++ */ ++ *skip_frames = 1; ++ frame = dwc_frame_num_inc(hcd->frame_number, 2); ++ } ++ ++ return frame; ++} ++ ++/* ++ * Calculate initial descriptor index for isochronous transfer ++ * based on scheduled frame. ++ */ ++static uint8_t recalc_initial_desc_idx(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ uint16_t frame = 0, fr_idx, fr_idx_tmp; ++ uint8_t skip_frames = 0; ++ /* ++ * With current ISOC processing algorithm the channel is being ++ * released when no more QTDs in the list(qh->ntd == 0). ++ * Thus this function is called only when qh->ntd == 0 and qh->channel == 0. ++ * ++ * So qh->channel != NULL branch is not used and just not removed from the ++ * source file. It is required for another possible approach which is, ++ * do not disable and release the channel when ISOC session completed, ++ * just move QH to inactive schedule until new QTD arrives. ++ * On new QTD, the QH moved back to 'ready' schedule, ++ * starting frame and therefore starting desc_index are recalculated. ++ * In this case channel is released only on ep_disable. ++ */ ++ ++ /* Calculate starting descriptor index. For INTERRUPT endpoint it is always 0. */ ++ if (qh->channel) { ++ frame = calc_starting_frame(hcd, qh, &skip_frames); ++ /* ++ * Calculate initial descriptor index based on FrameList current bitmap ++ * and servicing period. ++ */ ++ fr_idx_tmp = frame_list_idx(frame); ++ fr_idx = ++ (MAX_FRLIST_EN_NUM + frame_list_idx(qh->sched_frame) - ++ fr_idx_tmp) ++ % frame_incr_val(qh); ++ fr_idx = (fr_idx + fr_idx_tmp) % MAX_FRLIST_EN_NUM; ++ } else { ++ qh->sched_frame = calc_starting_frame(hcd, qh, &skip_frames); ++ fr_idx = frame_list_idx(qh->sched_frame); ++ } ++ ++ qh->td_first = qh->td_last = frame_to_desc_idx(qh, fr_idx); ++ ++ return skip_frames; ++} ++ ++#define ISOC_URB_GIVEBACK_ASAP ++ ++#define MAX_ISOC_XFER_SIZE_FS 1023 ++#define MAX_ISOC_XFER_SIZE_HS 3072 ++#define DESCNUM_THRESHOLD 4 ++ ++static void init_isoc_dma_desc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, ++ uint8_t skip_frames) ++{ ++ struct dwc_otg_hcd_iso_packet_desc *frame_desc; ++ dwc_otg_qtd_t *qtd; ++ dwc_otg_host_dma_desc_t *dma_desc; ++ uint16_t idx, inc, n_desc, ntd_max, max_xfer_size; ++ ++ idx = qh->td_last; ++ inc = qh->interval; ++ n_desc = 0; ++ ++ ntd_max = (max_desc_num(qh) + qh->interval - 1) / qh->interval; ++ if (skip_frames && !qh->channel) ++ ntd_max = ntd_max - skip_frames / qh->interval; ++ ++ max_xfer_size = ++ (qh->dev_speed == ++ DWC_OTG_EP_SPEED_HIGH) ? MAX_ISOC_XFER_SIZE_HS : ++ MAX_ISOC_XFER_SIZE_FS; ++ ++ DWC_CIRCLEQ_FOREACH(qtd, &qh->qtd_list, qtd_list_entry) { ++ while ((qh->ntd < ntd_max) ++ && (qtd->isoc_frame_index_last < ++ qtd->urb->packet_count)) { ++ ++ dma_desc = &qh->desc_list[idx]; ++ dwc_memset(dma_desc, 0x00, sizeof(dwc_otg_host_dma_desc_t)); ++ ++ frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index_last]; ++ ++ if (frame_desc->length > max_xfer_size) ++ qh->n_bytes[idx] = max_xfer_size; ++ else ++ qh->n_bytes[idx] = frame_desc->length; ++ dma_desc->status.b_isoc.n_bytes = qh->n_bytes[idx]; ++ dma_desc->status.b_isoc.a = 1; ++ dma_desc->status.b_isoc.sts = 0; ++ ++ dma_desc->buf = qtd->urb->dma + frame_desc->offset; ++ ++ qh->ntd++; ++ ++ qtd->isoc_frame_index_last++; ++ ++#ifdef ISOC_URB_GIVEBACK_ASAP ++ /* ++ * Set IOC for each descriptor corresponding to the ++ * last frame of the URB. ++ */ ++ if (qtd->isoc_frame_index_last == ++ qtd->urb->packet_count) ++ dma_desc->status.b_isoc.ioc = 1; ++ ++#endif ++ idx = desclist_idx_inc(idx, inc, qh->dev_speed); ++ n_desc++; ++ ++ } ++ qtd->in_process = 1; ++ } ++ ++ qh->td_last = idx; ++ ++#ifdef ISOC_URB_GIVEBACK_ASAP ++ /* Set IOC for the last descriptor if descriptor list is full */ ++ if (qh->ntd == ntd_max) { ++ idx = desclist_idx_dec(qh->td_last, inc, qh->dev_speed); ++ qh->desc_list[idx].status.b_isoc.ioc = 1; ++ } ++#else ++ /* ++ * Set IOC bit only for one descriptor. ++ * Always try to be ahead of HW processing, ++ * i.e. on IOC generation driver activates next descriptors but ++ * core continues to process descriptors followed the one with IOC set. ++ */ ++ ++ if (n_desc > DESCNUM_THRESHOLD) { ++ /* ++ * Move IOC "up". Required even if there is only one QTD ++ * in the list, cause QTDs migth continue to be queued, ++ * but during the activation it was only one queued. ++ * Actually more than one QTD might be in the list if this function called ++ * from XferCompletion - QTDs was queued during HW processing of the previous ++ * descriptor chunk. ++ */ ++ idx = dwc_desclist_idx_dec(idx, inc * ((qh->ntd + 1) / 2), qh->dev_speed); ++ } else { ++ /* ++ * Set the IOC for the latest descriptor ++ * if either number of descriptor is not greather than threshold ++ * or no more new descriptors activated. ++ */ ++ idx = dwc_desclist_idx_dec(qh->td_last, inc, qh->dev_speed); ++ } ++ ++ qh->desc_list[idx].status.b_isoc.ioc = 1; ++#endif ++} ++ ++static void init_non_isoc_dma_desc(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ ++ dwc_hc_t *hc; ++ dwc_otg_host_dma_desc_t *dma_desc; ++ dwc_otg_qtd_t *qtd; ++ int num_packets, len, n_desc = 0; ++ ++ hc = qh->channel; ++ ++ /* ++ * Start with hc->xfer_buff initialized in ++ * assign_and_init_hc(), then if SG transfer consists of multiple URBs, ++ * this pointer re-assigned to the buffer of the currently processed QTD. ++ * For non-SG request there is always one QTD active. ++ */ ++ ++ DWC_CIRCLEQ_FOREACH(qtd, &qh->qtd_list, qtd_list_entry) { ++ ++ if (n_desc) { ++ /* SG request - more than 1 QTDs */ ++ hc->xfer_buff = (uint8_t *)qtd->urb->dma + qtd->urb->actual_length; ++ hc->xfer_len = qtd->urb->length - qtd->urb->actual_length; ++ } ++ ++ qtd->n_desc = 0; ++ ++ do { ++ dma_desc = &qh->desc_list[n_desc]; ++ len = hc->xfer_len; ++ ++ if (len > MAX_DMA_DESC_SIZE) ++ len = MAX_DMA_DESC_SIZE - hc->max_packet + 1; ++ ++ if (hc->ep_is_in) { ++ if (len > 0) { ++ num_packets = (len + hc->max_packet - 1) / hc->max_packet; ++ } else { ++ /* Need 1 packet for transfer length of 0. */ ++ num_packets = 1; ++ } ++ /* Always program an integral # of max packets for IN transfers. */ ++ len = num_packets * hc->max_packet; ++ } ++ ++ dma_desc->status.b.n_bytes = len; ++ ++ qh->n_bytes[n_desc] = len; ++ ++ if ((qh->ep_type == UE_CONTROL) ++ && (qtd->control_phase == DWC_OTG_CONTROL_SETUP)) ++ dma_desc->status.b.sup = 1; /* Setup Packet */ ++ ++ dma_desc->status.b.a = 1; /* Active descriptor */ ++ dma_desc->status.b.sts = 0; ++ ++ dma_desc->buf = ++ ((unsigned long)hc->xfer_buff & 0xffffffff); ++ ++ /* ++ * Last descriptor(or single) of IN transfer ++ * with actual size less than MaxPacket. ++ */ ++ if (len > hc->xfer_len) { ++ hc->xfer_len = 0; ++ } else { ++ hc->xfer_buff += len; ++ hc->xfer_len -= len; ++ } ++ ++ qtd->n_desc++; ++ n_desc++; ++ } ++ while ((hc->xfer_len > 0) && (n_desc != MAX_DMA_DESC_NUM_GENERIC)); ++ ++ ++ qtd->in_process = 1; ++ ++ if (qh->ep_type == UE_CONTROL) ++ break; ++ ++ if (n_desc == MAX_DMA_DESC_NUM_GENERIC) ++ break; ++ } ++ ++ if (n_desc) { ++ /* Request Transfer Complete interrupt for the last descriptor */ ++ qh->desc_list[n_desc - 1].status.b.ioc = 1; ++ /* End of List indicator */ ++ qh->desc_list[n_desc - 1].status.b.eol = 1; ++ ++ hc->ntd = n_desc; ++ } ++} ++ ++/** ++ * For Control and Bulk endpoints initializes descriptor list ++ * and starts the transfer. ++ * ++ * For Interrupt and Isochronous endpoints initializes descriptor list ++ * then updates FrameList, marking appropriate entries as active. ++ * In case of Isochronous, the starting descriptor index is calculated based ++ * on the scheduled frame, but only on the first transfer descriptor within a session. ++ * Then starts the transfer via enabling the channel. ++ * For Isochronous endpoint the channel is not halted on XferComplete ++ * interrupt so remains assigned to the endpoint(QH) until session is done. ++ * ++ * @param hcd The HCD state structure for the DWC OTG controller. ++ * @param qh The QH to init. ++ * ++ * @return 0 if successful, negative error code otherwise. ++ */ ++void dwc_otg_hcd_start_xfer_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) ++{ ++ /* Channel is already assigned */ ++ dwc_hc_t *hc = qh->channel; ++ uint8_t skip_frames = 0; ++ ++ switch (hc->ep_type) { ++ case DWC_OTG_EP_TYPE_CONTROL: ++ case DWC_OTG_EP_TYPE_BULK: ++ init_non_isoc_dma_desc(hcd, qh); ++ ++ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); ++ break; ++ case DWC_OTG_EP_TYPE_INTR: ++ init_non_isoc_dma_desc(hcd, qh); ++ ++ update_frame_list(hcd, qh, 1); ++ ++ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); ++ break; ++ case DWC_OTG_EP_TYPE_ISOC: ++ ++ if (!qh->ntd) ++ skip_frames = recalc_initial_desc_idx(hcd, qh); ++ ++ init_isoc_dma_desc(hcd, qh, skip_frames); ++ ++ if (!hc->xfer_started) { ++ ++ update_frame_list(hcd, qh, 1); ++ ++ /* ++ * Always set to max, instead of actual size. ++ * Otherwise ntd will be changed with ++ * channel being enabled. Not recommended. ++ * ++ */ ++ hc->ntd = max_desc_num(qh); ++ /* Enable channel only once for ISOC */ ++ dwc_otg_hc_start_transfer_ddma(hcd->core_if, hc); ++ } ++ ++ break; ++ default: ++ ++ break; ++ } ++} ++ ++static void complete_isoc_xfer_ddma(dwc_otg_hcd_t * hcd, ++ dwc_hc_t * hc, ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_halt_status_e halt_status) ++{ ++ struct dwc_otg_hcd_iso_packet_desc *frame_desc; ++ dwc_otg_qtd_t *qtd, *qtd_tmp; ++ dwc_otg_qh_t *qh; ++ dwc_otg_host_dma_desc_t *dma_desc; ++ uint16_t idx, remain; ++ uint8_t urb_compl; ++ ++ qh = hc->qh; ++ idx = qh->td_first; ++ ++ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { ++ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) ++ qtd->in_process = 0; ++ return; ++ } else if ((halt_status == DWC_OTG_HC_XFER_AHB_ERR) || ++ (halt_status == DWC_OTG_HC_XFER_BABBLE_ERR)) { ++ /* ++ * Channel is halted in these error cases. ++ * Considered as serious issues. ++ * Complete all URBs marking all frames as failed, ++ * irrespective whether some of the descriptors(frames) succeeded or no. ++ * Pass error code to completion routine as well, to ++ * update urb->status, some of class drivers might use it to stop ++ * queing transfer requests. ++ */ ++ int err = (halt_status == DWC_OTG_HC_XFER_AHB_ERR) ++ ? (-DWC_E_IO) ++ : (-DWC_E_OVERFLOW); ++ ++ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { ++ for (idx = 0; idx < qtd->urb->packet_count; idx++) { ++ frame_desc = &qtd->urb->iso_descs[idx]; ++ frame_desc->status = err; ++ } ++ hcd->fops->complete(hcd, qtd->urb->priv, qtd->urb, err); ++ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); ++ } ++ return; ++ } ++ ++ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { ++ ++ if (!qtd->in_process) ++ break; ++ ++ urb_compl = 0; ++ ++ do { ++ ++ dma_desc = &qh->desc_list[idx]; ++ ++ frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index]; ++ remain = hc->ep_is_in ? dma_desc->status.b_isoc.n_bytes : 0; ++ ++ if (dma_desc->status.b_isoc.sts == DMA_DESC_STS_PKTERR) { ++ /* ++ * XactError or, unable to complete all the transactions ++ * in the scheduled micro-frame/frame, ++ * both indicated by DMA_DESC_STS_PKTERR. ++ */ ++ qtd->urb->error_count++; ++ frame_desc->actual_length = qh->n_bytes[idx] - remain; ++ frame_desc->status = -DWC_E_PROTOCOL; ++ } else { ++ /* Success */ ++ ++ frame_desc->actual_length = qh->n_bytes[idx] - remain; ++ frame_desc->status = 0; ++ } ++ ++ if (++qtd->isoc_frame_index == qtd->urb->packet_count) { ++ /* ++ * urb->status is not used for isoc transfers here. ++ * The individual frame_desc status are used instead. ++ */ ++ ++ hcd->fops->complete(hcd, qtd->urb->priv, qtd->urb, 0); ++ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); ++ ++ /* ++ * This check is necessary because urb_dequeue can be called ++ * from urb complete callback(sound driver example). ++ * All pending URBs are dequeued there, so no need for ++ * further processing. ++ */ ++ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { ++ return; ++ } ++ ++ urb_compl = 1; ++ ++ } ++ ++ qh->ntd--; ++ ++ /* Stop if IOC requested descriptor reached */ ++ if (dma_desc->status.b_isoc.ioc) { ++ idx = desclist_idx_inc(idx, qh->interval, hc->speed); ++ goto stop_scan; ++ } ++ ++ idx = desclist_idx_inc(idx, qh->interval, hc->speed); ++ ++ if (urb_compl) ++ break; ++ } ++ while (idx != qh->td_first); ++ } ++stop_scan: ++ qh->td_first = idx; ++} ++ ++uint8_t update_non_isoc_urb_state_ddma(dwc_otg_hcd_t * hcd, ++ dwc_hc_t * hc, ++ dwc_otg_qtd_t * qtd, ++ dwc_otg_host_dma_desc_t * dma_desc, ++ dwc_otg_halt_status_e halt_status, ++ uint32_t n_bytes, uint8_t * xfer_done) ++{ ++ ++ uint16_t remain = hc->ep_is_in ? dma_desc->status.b.n_bytes : 0; ++ dwc_otg_hcd_urb_t *urb = qtd->urb; ++ ++ if (halt_status == DWC_OTG_HC_XFER_AHB_ERR) { ++ urb->status = -DWC_E_IO; ++ return 1; ++ } ++ if (dma_desc->status.b.sts == DMA_DESC_STS_PKTERR) { ++ switch (halt_status) { ++ case DWC_OTG_HC_XFER_STALL: ++ urb->status = -DWC_E_PIPE; ++ break; ++ case DWC_OTG_HC_XFER_BABBLE_ERR: ++ urb->status = -DWC_E_OVERFLOW; ++ break; ++ case DWC_OTG_HC_XFER_XACT_ERR: ++ urb->status = -DWC_E_PROTOCOL; ++ break; ++ default: ++ DWC_ERROR("%s: Unhandled descriptor error status (%d)\n", __func__, ++ halt_status); ++ break; ++ } ++ return 1; ++ } ++ ++ if (dma_desc->status.b.a == 1) { ++ DWC_DEBUGPL(DBG_HCDV, ++ "Active descriptor encountered on channel %d\n", ++ hc->hc_num); ++ return 0; ++ } ++ ++ if (hc->ep_type == DWC_OTG_EP_TYPE_CONTROL) { ++ if (qtd->control_phase == DWC_OTG_CONTROL_DATA) { ++ urb->actual_length += n_bytes - remain; ++ if (remain || urb->actual_length == urb->length) { ++ /* ++ * For Control Data stage do not set urb->status=0 to prevent ++ * URB callback. Set it when Status phase done. See below. ++ */ ++ *xfer_done = 1; ++ } ++ ++ } else if (qtd->control_phase == DWC_OTG_CONTROL_STATUS) { ++ urb->status = 0; ++ *xfer_done = 1; ++ } ++ /* No handling for SETUP stage */ ++ } else { ++ /* BULK and INTR */ ++ urb->actual_length += n_bytes - remain; ++ if (remain || urb->actual_length == urb->length) { ++ urb->status = 0; ++ *xfer_done = 1; ++ } ++ } ++ ++ return 0; ++} ++ ++static void complete_non_isoc_xfer_ddma(dwc_otg_hcd_t * hcd, ++ dwc_hc_t * hc, ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_halt_status_e halt_status) ++{ ++ dwc_otg_hcd_urb_t *urb = NULL; ++ dwc_otg_qtd_t *qtd, *qtd_tmp; ++ dwc_otg_qh_t *qh; ++ dwc_otg_host_dma_desc_t *dma_desc; ++ uint32_t n_bytes, n_desc, i; ++ uint8_t failed = 0, xfer_done; ++ ++ n_desc = 0; ++ ++ qh = hc->qh; ++ ++ if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE) { ++ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &hc->qh->qtd_list, qtd_list_entry) { ++ qtd->in_process = 0; ++ } ++ return; ++ } ++ ++ DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &qh->qtd_list, qtd_list_entry) { ++ ++ urb = qtd->urb; ++ ++ n_bytes = 0; ++ xfer_done = 0; ++ ++ for (i = 0; i < qtd->n_desc; i++) { ++ dma_desc = &qh->desc_list[n_desc]; ++ ++ n_bytes = qh->n_bytes[n_desc]; ++ ++ failed = ++ update_non_isoc_urb_state_ddma(hcd, hc, qtd, ++ dma_desc, ++ halt_status, n_bytes, ++ &xfer_done); ++ ++ if (failed ++ || (xfer_done ++ && (urb->status != -DWC_E_IN_PROGRESS))) { ++ ++ hcd->fops->complete(hcd, urb->priv, urb, ++ urb->status); ++ dwc_otg_hcd_qtd_remove_and_free(hcd, qtd, qh); ++ ++ if (failed) ++ goto stop_scan; ++ } else if (qh->ep_type == UE_CONTROL) { ++ if (qtd->control_phase == DWC_OTG_CONTROL_SETUP) { ++ if (urb->length > 0) { ++ qtd->control_phase = DWC_OTG_CONTROL_DATA; ++ } else { ++ qtd->control_phase = DWC_OTG_CONTROL_STATUS; ++ } ++ DWC_DEBUGPL(DBG_HCDV, " Control setup transaction done\n"); ++ } else if (qtd->control_phase == DWC_OTG_CONTROL_DATA) { ++ if (xfer_done) { ++ qtd->control_phase = DWC_OTG_CONTROL_STATUS; ++ DWC_DEBUGPL(DBG_HCDV, " Control data transfer done\n"); ++ } else if (i + 1 == qtd->n_desc) { ++ /* ++ * Last descriptor for Control data stage which is ++ * not completed yet. ++ */ ++ dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); ++ } ++ } ++ } ++ ++ n_desc++; ++ } ++ ++ } ++ ++stop_scan: ++ ++ if (qh->ep_type != UE_CONTROL) { ++ /* ++ * Resetting the data toggle for bulk ++ * and interrupt endpoints in case of stall. See handle_hc_stall_intr() ++ */ ++ if (halt_status == DWC_OTG_HC_XFER_STALL) ++ qh->data_toggle = DWC_OTG_HC_PID_DATA0; ++ else ++ dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); ++ } ++ ++ if (halt_status == DWC_OTG_HC_XFER_COMPLETE) { ++ hcint_data_t hcint; ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); ++ if (hcint.b.nyet) { ++ /* ++ * Got a NYET on the last transaction of the transfer. It ++ * means that the endpoint should be in the PING state at the ++ * beginning of the next transfer. ++ */ ++ qh->ping_state = 1; ++ clear_hc_int(hc_regs, nyet); ++ } ++ ++ } ++ ++} ++ ++/** ++ * This function is called from interrupt handlers. ++ * Scans the descriptor list, updates URB's status and ++ * calls completion routine for the URB if it's done. ++ * Releases the channel to be used by other transfers. ++ * In case of Isochronous endpoint the channel is not halted until ++ * the end of the session, i.e. QTD list is empty. ++ * If periodic channel released the FrameList is updated accordingly. ++ * ++ * Calls transaction selection routines to activate pending transfers. ++ * ++ * @param hcd The HCD state structure for the DWC OTG controller. ++ * @param hc Host channel, the transfer is completed on. ++ * @param hc_regs Host channel registers. ++ * @param halt_status Reason the channel is being halted, ++ * or just XferComplete for isochronous transfer ++ */ ++void dwc_otg_hcd_complete_xfer_ddma(dwc_otg_hcd_t * hcd, ++ dwc_hc_t * hc, ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_halt_status_e halt_status) ++{ ++ uint8_t continue_isoc_xfer = 0; ++ dwc_otg_transaction_type_e tr_type; ++ dwc_otg_qh_t *qh = hc->qh; ++ ++ if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) { ++ ++ complete_isoc_xfer_ddma(hcd, hc, hc_regs, halt_status); ++ ++ /* Release the channel if halted or session completed */ ++ if (halt_status != DWC_OTG_HC_XFER_COMPLETE || ++ DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { ++ ++ /* Halt the channel if session completed */ ++ if (halt_status == DWC_OTG_HC_XFER_COMPLETE) { ++ dwc_otg_hc_halt(hcd->core_if, hc, halt_status); ++ } ++ ++ release_channel_ddma(hcd, qh); ++ dwc_otg_hcd_qh_remove(hcd, qh); ++ } else { ++ /* Keep in assigned schedule to continue transfer */ ++ DWC_LIST_MOVE_HEAD(&hcd->periodic_sched_assigned, ++ &qh->qh_list_entry); ++ continue_isoc_xfer = 1; ++ ++ } ++ /** @todo Consider the case when period exceeds FrameList size. ++ * Frame Rollover interrupt should be used. ++ */ ++ } else { ++ /* Scan descriptor list to complete the URB(s), then release the channel */ ++ complete_non_isoc_xfer_ddma(hcd, hc, hc_regs, halt_status); ++ ++ release_channel_ddma(hcd, qh); ++ dwc_otg_hcd_qh_remove(hcd, qh); ++ ++ if (!DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { ++ /* Add back to inactive non-periodic schedule on normal completion */ ++ dwc_otg_hcd_qh_add(hcd, qh); ++ } ++ ++ } ++ tr_type = dwc_otg_hcd_select_transactions(hcd); ++ if (tr_type != DWC_OTG_TRANSACTION_NONE || continue_isoc_xfer) { ++ if (continue_isoc_xfer) { ++ if (tr_type == DWC_OTG_TRANSACTION_NONE) { ++ tr_type = DWC_OTG_TRANSACTION_PERIODIC; ++ } else if (tr_type == DWC_OTG_TRANSACTION_NON_PERIODIC) { ++ tr_type = DWC_OTG_TRANSACTION_ALL; ++ } ++ } ++ dwc_otg_hcd_queue_transactions(hcd, tr_type); ++ } ++} ++ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h b/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h +new file mode 100644 +index 0000000..04ca4c2 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h +@@ -0,0 +1,417 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $ -+ * $Revision: #6 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237474 $ ++ * $Revision: #12 $ ++ * $Date: 2011/10/26 $ ++ * $Change: 1873028 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -56115,6 +67717,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + */ +extern int32_t dwc_otg_hcd_handle_intr(dwc_otg_hcd_t * dwc_otg_hcd); + ++/** This function is used to handle the fast interrupt ++ * ++ */ ++extern void __attribute__ ((naked)) dwc_otg_hcd_handle_fiq(void); ++ +/** + * Returns private data set by + * dwc_otg_hcd_set_priv_data function. @@ -56177,6 +67784,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot +extern uint32_t dwc_otg_hcd_otg_port(dwc_otg_hcd_t * hcd); + +/** ++ * Returns OTG version - either 1.3 or 2.0. ++ * ++ * @param core_if The core_if structure pointer ++ */ ++extern uint16_t dwc_otg_get_otg_version(dwc_otg_core_if_t * core_if); ++ ++/** + * Returns 1 if currently core is acting as B host, and 0 otherwise. + * + * @param hcd The HCD @@ -56225,7 +67839,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + +/** + * Allocates memory for dwc_otg_hcd_urb structure. -+ * Allocated memory should be freed by call dwc_free function. ++ * Allocated memory should be freed by call of DWC_FREE. + * + * @param hcd The HCD + * @param iso_desc_count Count of ISOC descriptors @@ -56250,7 +67864,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + uint8_t ep_type, uint8_t ep_dir, + uint16_t mps); + -+/* Transfer flags */ ++/* Transfer flags */ +#define URB_GIVEBACK_ASAP 0x1 +#define URB_SEND_ZERO_PACKET 0x2 + @@ -56327,6 +67941,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + * @param dwc_otg_hcd The HCD + * @param dwc_otg_urb DWC_OTG URB + * @param ep_handle Out parameter for returning endpoint handle ++ * @param atomic_alloc Flag to do atomic allocation if needed + * + * Returns -DWC_E_NO_DEVICE if no device is connected. + * Returns -DWC_E_NO_MEMORY if there is no enough memory. @@ -56334,7 +67949,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + */ +extern int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_t * dwc_otg_hcd, + dwc_otg_hcd_urb_t * dwc_otg_urb, -+ void **ep_handle); ++ void **ep_handle, int atomic_alloc); + +/** De-queue the specified URB + * @@ -56357,6 +67972,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot +extern int dwc_otg_hcd_endpoint_disable(dwc_otg_hcd_t * hcd, void *ep_handle, + int retry); + ++/* Resets the data toggle in qh structure. This function can be called from ++ * usb_clear_halt routine. ++ * ++ * @param hcd The HCD ++ * @param ep_handle Endpoint handle, returned by dwc_otg_hcd_urb_enqueue function ++ * ++ * Returns -DWC_E_INVALID if invalid arguments are passed. ++ * Returns 0 on success ++ */ ++extern int dwc_otg_hcd_endpoint_reset(dwc_otg_hcd_t * hcd, void *ep_handle); ++ +/** Returns 1 if status of specified port is changed and 0 otherwise. + * + * @param hcd The HCD @@ -56391,17 +68017,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-rpi-boot + +/** @} */ + -+#endif /* __DWC_HCD_IF_H__ */ -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2012-07-15 20:29:19.104083997 +0200 -@@ -0,0 +1,2158 @@ ++#endif /* __DWC_HCD_IF_H__ */ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +new file mode 100644 +index 0000000..f1658fa +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +@@ -0,0 +1,2230 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $ -+ * $Revision: #77 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237475 $ ++ * $Revision: #89 $ ++ * $Date: 2011/10/20 $ ++ * $Change: 1869487 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -56431,133 +68059,165 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * ========================================================================== */ +#ifndef DWC_DEVICE_ONLY + -+#include -+#include +#include "dwc_otg_hcd.h" +#include "dwc_otg_regs.h" ++#include "dwc_otg_mphi_fix.h" ++ ++#include ++#include ++ ++ ++extern bool microframe_schedule; + +/** @file + * This file contains the implementation of the HCD Interrupt handlers. + */ + -+/** -+ * SOF_FIX: Reduce SOF interrupt handling by disabling the SOF interrupt except -+ * when there are actual USB transfers pending. MSO 5/31/12 ++/* ++ * Some globals to communicate between the FIQ and INTERRUPT + */ -+#ifdef SOF_FIX -+ extern int sof_setting(void); -+ unsigned int g_dwc_otg_hcd_handle_intr_count = 0; -+ #ifdef DEBUG_SOF_FIX -+ unsigned int g_dwc_otg_interrupt_counts[10] = {0,0,0,0,0,0,0,0,0,0}; -+ extern int g_softintr_ref_cnt; -+ #endif -+#endif ++ ++void * dummy_send; ++mphi_regs_t c_mphi_regs; ++int fiq_done, int_done; ++int g_next_sched_frame, g_np_count, g_np_sent, g_work_expected; ++static int mphi_int_count = 0 ; ++ ++extern bool fiq_fix_enable; ++ ++void __attribute__ ((naked)) dwc_otg_hcd_handle_fiq(void) ++{ ++ gintsts_data_t gintsts; ++ hfnum_data_t hfnum; ++ ++ /* entry takes care to store registers we will be treading on here */ ++ asm __volatile__ ( ++ "mov ip, sp ;" ++ /* stash FIQ and normal regs */ ++ "stmdb sp!, {r0-r12, lr};" ++ /* !! THIS SETS THE FRAME, adjust to > sizeof locals */ ++ "sub fp, ip, #256 ;" ++ ); ++ ++ fiq_done++; ++ gintsts.d32 = FIQ_READ_IO_ADDRESS(USB_BASE + 0x14) & FIQ_READ_IO_ADDRESS(USB_BASE + 0x18); ++ hfnum.d32 = FIQ_READ_IO_ADDRESS(USB_BASE + 0x408); ++ ++ if(gintsts.d32) ++ { ++ if(gintsts.b.sofintr && g_np_count == g_np_sent && dwc_frame_num_gt(g_next_sched_frame, hfnum.b.frnum)) ++ { ++ /* ++ * If np_count != np_sent that means we need to queue non-periodic (bulk) packets this packet ++ * g_next_sched_frame is the next frame we have periodic packets for ++ * ++ * if neither of these are required for this frame then just clear the interrupt ++ */ ++ gintsts.d32 = 0; ++ gintsts.b.sofintr = 1; ++ FIQ_WRITE_IO_ADDRESS((USB_BASE + 0x14), gintsts.d32); ++ ++ g_work_expected = 0; ++ } ++ else ++ { ++ g_work_expected = 1; ++ /* To enable the MPHI interrupt (INT 32) ++ */ ++ FIQ_WRITE( c_mphi_regs.outdda, (int) dummy_send); ++ FIQ_WRITE( c_mphi_regs.outddb, (1 << 29)); ++ ++ mphi_int_count++; ++ /* Clear the USB global interrupt so we don't just sit in the FIQ */ ++ FIQ_MODIFY_IO_ADDRESS((USB_BASE + 0x8),1,0); ++ ++ } ++ } ++ mb(); ++ ++ /* exit back to normal mode restoring everything */ ++ asm __volatile__ ( ++ /* return FIQ regs back to pristine state ++ * and get normal regs back ++ */ ++ "ldmia sp!, {r0-r12, lr};" ++ ++ /* return */ ++ "subs pc, lr, #4;" ++ ); ++} + +/** This function handles interrupts for the HCD. */ +int32_t dwc_otg_hcd_handle_intr(dwc_otg_hcd_t * dwc_otg_hcd) +{ + int retval = 0; ++ static int last_time; + + dwc_otg_core_if_t *core_if = dwc_otg_hcd->core_if; + gintsts_data_t gintsts; -+#ifdef SOF_FIX -+ dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs; -+ gintmsk_data_t gintmsk; -+#endif ++ hfnum_data_t hfnum; + +#ifdef DEBUG -+ //GRAYG: debugging -+ if (NULL == global_regs) { -+ DWC_DEBUGPL(DBG_HCD, "**** NULL regs: dwc_otg_hcd=%p " -+ "core_if=%p\n", -+ dwc_otg_hcd, global_regs); -+ return retval; -+ } -+#endif -+#ifdef SOF_FIX -+ g_dwc_otg_hcd_handle_intr_count++; ++ dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs; ++ +#endif ++ ++ /* Exit from ISR if core is hibernated */ ++ if (core_if->hibernation_suspend == 1) { ++ goto exit_handler_routine; ++ } ++ DWC_SPINLOCK(dwc_otg_hcd->lock); + /* Check if HOST Mode */ + if (dwc_otg_is_host_mode(core_if)) { + gintsts.d32 = dwc_otg_read_core_intr(core_if); + if (!gintsts.d32) { -+ return 0; ++ goto exit_handler_routine; + } +#ifdef DEBUG + /* Don't print debug message in the interrupt handler on SOF */ +#ifndef DEBUG_SOF + if (gintsts.d32 != DWC_SOF_INTR_MASK) +#endif -+ DWC_DEBUGPL(DBG_HCD, "\n"); ++ DWC_DEBUGPL(DBG_HCDI, "\n"); +#endif + +#ifdef DEBUG +#ifndef DEBUG_SOF + if (gintsts.d32 != DWC_SOF_INTR_MASK) +#endif -+ DWC_DEBUGPL(DBG_HCD, ++ DWC_DEBUGPL(DBG_HCDI, + "DWC OTG HCD Interrupt Detected gintsts&gintmsk=0x%08x core_if=%p\n", + gintsts.d32, core_if); +#endif -+ -+ /* -+ * If SOF handle it. If not, it probably means that there is work to do, -+ * so enable SOF for the next micro-frame. -+ */ -+ if (gintsts.b.sofintr) ++ hfnum.d32 = DWC_READ_REG32(&dwc_otg_hcd->core_if->host_if->host_global_regs->hfnum); ++ if (gintsts.b.sofintr && g_np_count == g_np_sent && dwc_frame_num_gt(g_next_sched_frame, hfnum.b.frnum)) + { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[0]++; -+#endif -+ retval |= dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd); ++ /* Note, we should never get here if the FIQ is doing it's job properly*/ ++ retval |= dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd, g_work_expected); + } -+#ifdef SOF_FIX -+ else -+ { -+ // turn on Start-of-Frame interrupt -+ gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk); -+ gintmsk.b.sofintr |= 1; -+ dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32); ++ else if (gintsts.b.sofintr) { ++ retval |= dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd, g_work_expected); + } -+#endif + if (gintsts.b.rxstsqlvl) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[1]++; -+#endif + retval |= + dwc_otg_hcd_handle_rx_status_q_level_intr + (dwc_otg_hcd); + } + if (gintsts.b.nptxfempty) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[2]++; -+#endif + retval |= + dwc_otg_hcd_handle_np_tx_fifo_empty_intr + (dwc_otg_hcd); + } + if (gintsts.b.i2cintr) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[3]++; -+#endif + /** @todo Implement i2cintr handler. */ + } + if (gintsts.b.portintr) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[4]++; -+#endif + retval |= dwc_otg_hcd_handle_port_intr(dwc_otg_hcd); + } + if (gintsts.b.hcintr) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[5]++; -+#endif + retval |= dwc_otg_hcd_handle_hc_intr(dwc_otg_hcd); + } + if (gintsts.b.ptxfempty) { -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[6]++; -+#endif + retval |= + dwc_otg_hcd_handle_perio_tx_fifo_empty_intr + (dwc_otg_hcd); @@ -56567,12 +68227,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + if (gintsts.d32 != DWC_SOF_INTR_MASK) +#endif + { -+ DWC_DEBUGPL(DBG_HCD, ++ DWC_DEBUGPL(DBG_HCDI, + "DWC OTG HCD Finished Servicing Interrupts\n"); + DWC_DEBUGPL(DBG_HCDV, "DWC OTG HCD gintsts=0x%08x\n", -+ dwc_read_reg32(&global_regs->gintsts)); ++ DWC_READ_REG32(&global_regs->gintsts)); + DWC_DEBUGPL(DBG_HCDV, "DWC OTG HCD gintmsk=0x%08x\n", -+ dwc_read_reg32(&global_regs->gintmsk)); ++ DWC_READ_REG32(&global_regs->gintmsk)); + } +#endif + @@ -56580,29 +68240,41 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo +#ifndef DEBUG_SOF + if (gintsts.d32 != DWC_SOF_INTR_MASK) +#endif -+ DWC_DEBUGPL(DBG_HCD, "\n"); ++ DWC_DEBUGPL(DBG_HCDI, "\n"); +#endif + + } -+#if defined(SOF_FIX) && defined(DEBUG_SOF_FIX) -+ if ((g_dwc_otg_hcd_handle_intr_count % 80000) == 0) ++ ++exit_handler_routine: ++ ++ if (fiq_fix_enable) + { -+ printk(KERN_ERR "dwc_otg_hcd_handle_intr: %u handled, %u, %u, %u, %u, %u, %u, %u, %u.\n", -+ g_dwc_otg_hcd_handle_intr_count, -+ g_dwc_otg_interrupt_counts[0], -+ g_dwc_otg_interrupt_counts[1], -+ g_dwc_otg_interrupt_counts[2], -+ g_dwc_otg_interrupt_counts[3], -+ g_dwc_otg_interrupt_counts[4], -+ g_dwc_otg_interrupt_counts[5], -+ g_dwc_otg_interrupt_counts[6], -+ g_dwc_otg_interrupt_counts[7]); ++ /* Clear the MPHI interrupt */ ++ DWC_WRITE_REG32(c_mphi_regs.intstat, (1<<16)); ++ if (mphi_int_count >= 60) ++ { ++ DWC_WRITE_REG32(c_mphi_regs.ctrl, ((1<<31) + (1<<16))); ++ DWC_WRITE_REG32(c_mphi_regs.ctrl, (1<<31)); ++ mphi_int_count = 0; ++ } ++ int_done++; ++ if((jiffies / HZ) > last_time) ++ { ++ /* Once a second output the fiq and irq numbers, useful for debug */ ++ last_time = jiffies / HZ; ++ DWC_DEBUGPL(DBG_USER, "int_done = %d fiq_done = %d\n", int_done, fiq_done); ++ } ++ ++ /* Re-Enable FIQ interrupt from USB peripheral */ ++ DWC_MODIFY_REG32((uint32_t *)IO_ADDRESS(USB_BASE + 0x8), 0 , 1); + } -+#endif ++ ++ DWC_SPINUNLOCK(dwc_otg_hcd->lock); + return retval; +} + +#ifdef DWC_TRACK_MISSED_SOFS ++ +#warning Compiling code to track missed SOFs +#define FRAME_NUM_ARRAY_SIZE 1000 +/** @@ -56642,25 +68314,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * (micro)frame. Periodic transactions may be queued to the controller for the + * next (micro)frame. + */ -+#ifdef SOF_FIX -+#define SOF_INTR_DELAY_COUNT 3 -+static int g_sof_intr_delay_count = SOF_INTR_DELAY_COUNT; -+#endif -+int32_t dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd_t * hcd) ++int32_t dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd_t * hcd, int32_t work_expected) +{ + hfnum_data_t hfnum; + dwc_list_link_t *qh_entry; + dwc_otg_qh_t *qh; + dwc_otg_transaction_type_e tr_type; + gintsts_data_t gintsts = {.d32 = 0 }; -+#ifdef SOF_FIX -+ dwc_otg_core_if_t *core_if = hcd->core_if; -+ gintmsk_data_t gintmsk = {.d32 = 0 }; -+ dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs; -+#endif ++ int did_something = 0; ++ int32_t next_sched_frame = -1; + + hfnum.d32 = -+ dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hfnum); ++ DWC_READ_REG32(&hcd->core_if->host_if->host_global_regs->hfnum); + +#ifdef DEBUG_SOF + DWC_DEBUGPL(DBG_HCD, "--Start of Frame Interrupt--\n"); @@ -56687,31 +68352,34 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + DWC_LIST_MOVE_HEAD(&hcd->periodic_sched_ready, + &qh->qh_list_entry); ++ ++ did_something = 1; + } -+ } -+ tr_type = dwc_otg_hcd_select_transactions(hcd); -+ if (tr_type != DWC_OTG_TRANSACTION_NONE) -+ { -+ dwc_otg_hcd_queue_transactions(hcd, tr_type); -+ } -+#ifdef SOF_FIX -+ else -+ { -+ // turn off Start-of-Frame interrupt -+ if ((sof_setting()) && -+ (g_sof_intr_delay_count-- == 0)) ++ else + { -+ gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk); -+ gintmsk.b.sofintr &= 0; -+ dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32); -+ g_sof_intr_delay_count = SOF_INTR_DELAY_COUNT; ++ if(next_sched_frame < 0 || dwc_frame_num_le(qh->sched_frame, next_sched_frame)) ++ { ++ next_sched_frame = qh->sched_frame; ++ } + } + } -+#endif ++ ++ g_next_sched_frame = next_sched_frame; ++ ++ tr_type = dwc_otg_hcd_select_transactions(hcd); ++ if (tr_type != DWC_OTG_TRANSACTION_NONE) { ++ dwc_otg_hcd_queue_transactions(hcd, tr_type); ++ did_something = 1; ++ } ++ if(work_expected && !did_something) ++ DWC_DEBUGPL(DBG_USER, "Nothing to do !! frame = %x, g_next_sched_frame = %x\n", (int) hfnum.b.frnum, g_next_sched_frame); ++ if(!work_expected && did_something) ++ DWC_DEBUGPL(DBG_USER, "Unexpected work done !! frame = %x, g_next_sched_frame = %x\n", (int) hfnum.b.frnum, g_next_sched_frame); ++ + + /* Clear interrupt */ + gintsts.b.sofintr = 1; -+ dwc_write_reg32(&hcd->core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&hcd->core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -56727,9 +68395,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + DWC_DEBUGPL(DBG_HCD, "--RxStsQ Level Interrupt--\n"); + + grxsts.d32 = -+ dwc_read_reg32(&dwc_otg_hcd->core_if->core_global_regs->grxstsp); ++ DWC_READ_REG32(&dwc_otg_hcd->core_if->core_global_regs->grxstsp); + + hc = dwc_otg_hcd->hc_ptr_array[grxsts.b.chnum]; ++ if (!hc) { ++ DWC_ERROR("Unable to get corresponding channel\n"); ++ return 0; ++ } + + /* Packet Status */ + DWC_DEBUGPL(DBG_HCDV, " Ch num = %d\n", grxsts.b.chnum); @@ -56797,8 +68469,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + hprt0_data_t hprt0; + hprt0_data_t hprt0_modify; + -+ hprt0.d32 = dwc_read_reg32(dwc_otg_hcd->core_if->host_if->hprt0); -+ hprt0_modify.d32 = dwc_read_reg32(dwc_otg_hcd->core_if->host_if->hprt0); ++ hprt0.d32 = DWC_READ_REG32(dwc_otg_hcd->core_if->host_if->hprt0); ++ hprt0_modify.d32 = DWC_READ_REG32(dwc_otg_hcd->core_if->host_if->hprt0); + + /* Clear appropriate bits in HPRT0 to clear the interrupt bit in + * GINTSTS */ @@ -56810,16 +68482,41 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + /* Port Connect Detected + * Set flag and clear if detected */ -+ if (hprt0.b.prtconndet) { -+ DWC_DEBUGPL(DBG_HCD, "--Port Interrupt HPRT0=0x%08x " -+ "Port Connect Detected--\n", hprt0.d32); -+ dwc_otg_hcd->flags.b.port_connect_status_change = 1; -+ dwc_otg_hcd->flags.b.port_connect_status = 1; ++ if (dwc_otg_hcd->core_if->hibernation_suspend == 1) { ++ // Dont modify port status if we are in hibernation state + hprt0_modify.b.prtconndet = 1; ++ hprt0_modify.b.prtenchng = 1; ++ DWC_WRITE_REG32(dwc_otg_hcd->core_if->host_if->hprt0, hprt0_modify.d32); ++ hprt0.d32 = DWC_READ_REG32(dwc_otg_hcd->core_if->host_if->hprt0); ++ return retval; ++ } + -+ /* B-Device has connected, Delete the connection timer. */ -+ DWC_TIMER_CANCEL(dwc_otg_hcd->conn_timer); -+ ++ if (hprt0.b.prtconndet) { ++ /** @todo - check if steps performed in 'else' block should be perfromed regardles adp */ ++ if (dwc_otg_hcd->core_if->adp_enable && ++ dwc_otg_hcd->core_if->adp.vbuson_timer_started == 1) { ++ DWC_PRINTF("PORT CONNECT DETECTED ----------------\n"); ++ DWC_TIMER_CANCEL(dwc_otg_hcd->core_if->adp.vbuson_timer); ++ dwc_otg_hcd->core_if->adp.vbuson_timer_started = 0; ++ /* TODO - check if this is required, as ++ * host initialization was already performed ++ * after initial ADP probing ++ */ ++ /*dwc_otg_hcd->core_if->adp.vbuson_timer_started = 0; ++ dwc_otg_core_init(dwc_otg_hcd->core_if); ++ dwc_otg_enable_global_interrupts(dwc_otg_hcd->core_if); ++ cil_hcd_start(dwc_otg_hcd->core_if);*/ ++ } else { ++ ++ DWC_DEBUGPL(DBG_HCD, "--Port Interrupt HPRT0=0x%08x " ++ "Port Connect Detected--\n", hprt0.d32); ++ dwc_otg_hcd->flags.b.port_connect_status_change = 1; ++ dwc_otg_hcd->flags.b.port_connect_status = 1; ++ hprt0_modify.b.prtconndet = 1; ++ ++ /* B-Device has connected, Delete the connection timer. */ ++ DWC_TIMER_CANCEL(dwc_otg_hcd->conn_timer); ++ } + /* The Hub driver asserts a reset when it sees port connect + * status change flag */ + retval |= 1; @@ -56832,6 +68529,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + "Port Enable Changed--\n", hprt0.d32); + hprt0_modify.b.prtenchng = 1; + if (hprt0.b.prtena == 1) { ++ hfir_data_t hfir; + int do_reset = 0; + dwc_otg_core_params_t *params = + dwc_otg_hcd->core_if->core_params; @@ -56839,6 +68537,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hcd->core_if->core_global_regs; + dwc_otg_host_if_t *host_if = + dwc_otg_hcd->core_if->host_if; ++ ++ /* Every time when port enables calculate ++ * HFIR.FrInterval ++ */ ++ hfir.d32 = DWC_READ_REG32(&host_if->host_global_regs->hfir); ++ hfir.b.frint = calc_frame_interval(dwc_otg_hcd->core_if); ++ DWC_WRITE_REG32(&host_if->host_global_regs->hfir, hfir.d32); + + /* Check if we need to adjust the PHY clock speed for + * low power and adjust it */ @@ -56846,7 +68551,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + gusbcfg_data_t usbcfg; + + usbcfg.d32 = -+ dwc_read_reg32(&global_regs->gusbcfg); ++ DWC_READ_REG32(&global_regs->gusbcfg); + + if (hprt0.b.prtspd == DWC_HPRT0_PRTSPD_LOW_SPEED + || hprt0.b.prtspd == @@ -56858,20 +68563,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + if (usbcfg.b.phylpwrclksel == 0) { + /* Set PHY low power clock select for FS/LS devices */ + usbcfg.b.phylpwrclksel = 1; -+ dwc_write_reg32(&global_regs-> -+ gusbcfg, -+ usbcfg.d32); ++ DWC_WRITE_REG32 ++ (&global_regs->gusbcfg, ++ usbcfg.d32); + do_reset = 1; + } + + hcfg.d32 = -+ dwc_read_reg32(&host_if-> -+ host_global_regs->hcfg); ++ DWC_READ_REG32 ++ (&host_if->host_global_regs->hcfg); + + if (hprt0.b.prtspd == + DWC_HPRT0_PRTSPD_LOW_SPEED -+ && params-> -+ host_ls_low_power_phy_clk == ++ && params->host_ls_low_power_phy_clk ++ == + DWC_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ) + { + /* 6 MHZ */ @@ -56881,10 +68586,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + DWC_HCFG_6_MHZ) { + hcfg.b.fslspclksel = + DWC_HCFG_6_MHZ; -+ dwc_write_reg32 -+ (&host_if-> -+ host_global_regs-> -+ hcfg, hcfg.d32); ++ DWC_WRITE_REG32 ++ (&host_if->host_global_regs->hcfg, ++ hcfg.d32); + do_reset = 1; + } + } else { @@ -56895,10 +68599,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + DWC_HCFG_48_MHZ) { + hcfg.b.fslspclksel = + DWC_HCFG_48_MHZ; -+ dwc_write_reg32 -+ (&host_if-> -+ host_global_regs-> -+ hcfg, hcfg.d32); ++ DWC_WRITE_REG32 ++ (&host_if->host_global_regs->hcfg, ++ hcfg.d32); + do_reset = 1; + } + } @@ -56908,16 +68611,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + if (usbcfg.b.phylpwrclksel == 1) { + usbcfg.b.phylpwrclksel = 0; -+ dwc_write_reg32(&global_regs-> -+ gusbcfg, -+ usbcfg.d32); ++ DWC_WRITE_REG32 ++ (&global_regs->gusbcfg, ++ usbcfg.d32); + do_reset = 1; + } + } + + if (do_reset) { -+ DWC_TASK_SCHEDULE(dwc_otg_hcd-> -+ reset_tasklet); ++ DWC_TASK_SCHEDULE(dwc_otg_hcd->reset_tasklet); + } + } + @@ -56941,7 +68643,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + } + + /* Clear Port Interrupts */ -+ dwc_write_reg32(dwc_otg_hcd->core_if->host_if->hprt0, hprt0_modify.d32); ++ DWC_WRITE_REG32(dwc_otg_hcd->core_if->host_if->hprt0, hprt0_modify.d32); + + return retval; +} @@ -56970,8 +68672,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + return retval; +} + -+ -+ +/** + * Gets the actual length of a transfer after the transfer halts. _halt_status + * holds the reason for the halt. @@ -56994,7 +68694,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + if (short_read != NULL) { + *short_read = 0; + } -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); + + if (halt_status == DWC_OTG_HC_XFER_COMPLETE) { + if (hc->ep_is_in) { @@ -57043,21 +68743,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + int xfer_length; + -+ xfer_length = get_actual_xfer_length(hc, hc_regs, qtd, -+ DWC_OTG_HC_XFER_COMPLETE, -+ &short_read); ++ xfer_length = get_actual_xfer_length(hc, hc_regs, qtd, ++ DWC_OTG_HC_XFER_COMPLETE, ++ &short_read); + + + /* non DWORD-aligned buffer case handling. */ + if (hc->align_buff && xfer_length && hc->ep_is_in) { -+ dwc_memcpy(urb->buf + urb->actual_length, hc->qh->dw_align_buf, xfer_length); ++ dwc_memcpy(urb->buf + urb->actual_length, hc->qh->dw_align_buf, ++ xfer_length); + } + + urb->actual_length += xfer_length; + -+ if(xfer_length && (hc->ep_type == DWC_OTG_EP_TYPE_BULK) && -+ (urb->flags & URB_SEND_ZERO_PACKET) && (urb->actual_length == urb->length) && -+ !(urb->length % hc->max_packet)) { ++ if (xfer_length && (hc->ep_type == DWC_OTG_EP_TYPE_BULK) && ++ (urb->flags & URB_SEND_ZERO_PACKET) ++ && (urb->actual_length == urb->length) ++ && !(urb->length % hc->max_packet)) { + xfer_done = 0; + } else if (short_read || urb->actual_length >= urb->length) { + xfer_done = 1; @@ -57067,7 +68769,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo +#ifdef DEBUG + { + hctsiz_data_t hctsiz; -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); + DWC_DEBUGPL(DBG_HCDV, "DWC_otg: %s: %s, channel %d\n", + __func__, (hc->ep_is_in ? "IN" : "OUT"), + hc->hc_num); @@ -57095,7 +68797,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, dwc_otg_qtd_t * qtd) +{ + hctsiz_data_t hctsiz; -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); + + if (hc->ep_type != DWC_OTG_EP_TYPE_CONTROL) { + dwc_otg_qh_t *qh = hc->qh; @@ -57138,10 +68840,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + frame_desc->status = 0; + frame_desc->actual_length = + get_actual_xfer_length(hc, hc_regs, qtd, halt_status, NULL); -+ ++ + /* non DWORD-aligned buffer case handling. */ + if (hc->align_buff && frame_desc->actual_length && hc->ep_is_in) { -+ dwc_memcpy(urb->buf + frame_desc->offset + qtd->isoc_split_offset, ++ dwc_memcpy(urb->buf + frame_desc->offset + qtd->isoc_split_offset, + hc->qh->dw_align_buf, frame_desc->actual_length); + } + @@ -57165,19 +68867,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + frame_desc->status = -DWC_E_PROTOCOL; + frame_desc->actual_length = + get_actual_xfer_length(hc, hc_regs, qtd, halt_status, NULL); -+ ++ + /* non DWORD-aligned buffer case handling. */ + if (hc->align_buff && frame_desc->actual_length && hc->ep_is_in) { -+ dwc_memcpy(urb->buf + frame_desc->offset + qtd->isoc_split_offset, ++ dwc_memcpy(urb->buf + frame_desc->offset + qtd->isoc_split_offset, + hc->qh->dw_align_buf, frame_desc->actual_length); + } + /* Skip whole frame */ -+ if (hc->qh->do_split && (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) && -+ hc->ep_is_in && hcd->core_if->dma_enable) { ++ if (hc->qh->do_split && (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) && ++ hc->ep_is_in && hcd->core_if->dma_enable) { + qtd->complete_split = 0; + qtd->isoc_split_offset = 0; + } -+ ++ + break; + default: + DWC_ASSERT(1, "Unhandled _halt_status (%d)\n", halt_status); @@ -57246,23 +68948,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo +{ + dwc_otg_transaction_type_e tr_type; + int free_qtd; ++ dwc_irqflags_t flags; ++ dwc_spinlock_t *channel_lock = DWC_SPINLOCK_ALLOC(); + + DWC_DEBUGPL(DBG_HCDV, " %s: channel %d, halt_status %d, xfer_len %d\n", + __func__, hc->hc_num, halt_status, hc->xfer_len); + -+#ifdef HW2937_WORKAROUND -+ if (hcd->hw2937_assigned_channels & (1<hc_num)) -+ { -+ if ((hcd->hw2937_assigned_channels &= ~(1<hc_num)) == 0) -+ hcd->hw2937_xfer_mode = HW2937_XFER_MODE_IDLE; -+ DWC_DEBUGPL(DBG_HW2937, " release %d, hw2937_ac -> %x\n", hc->hc_num, hcd->hw2937_assigned_channels); -+ } -+ else -+ { -+ DWC_DEBUGPL(DBG_ANY, " Unexpected release %d (hw2937_ac = %x)\n", hc->hc_num, hcd->hw2937_assigned_channels); -+ } -+#endif -+ + switch (halt_status) { + case DWC_OTG_HC_XFER_URB_COMPLETE: + free_qtd = 1; @@ -57294,6 +68985,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + case DWC_OTG_HC_XFER_NO_HALT_STATUS: + free_qtd = 0; + break; ++ case DWC_OTG_HC_XFER_PERIODIC_INCOMPLETE: ++ DWC_DEBUGPL(DBG_HCDV, ++ " Complete URB with I/O error\n"); ++ free_qtd = 1; ++ qtd->urb->status = -DWC_E_IO; ++ hcd->fops->complete(hcd, qtd->urb->priv, ++ qtd->urb, -DWC_E_IO); ++ break; + default: + free_qtd = 0; + break; @@ -57301,7 +69000,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + deactivate_qh(hcd, hc->qh, free_qtd); + -+ cleanup: ++cleanup: + /* + * Release the host channel for use by other transfers. The cleanup + * function clears the channel interrupt enables and conditions, so @@ -57310,19 +69009,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_cleanup(hcd->core_if, hc); + DWC_CIRCLEQ_INSERT_TAIL(&hcd->free_hc_list, hc, hc_list_entry); + -+ switch (hc->ep_type) { -+ case DWC_OTG_EP_TYPE_CONTROL: -+ case DWC_OTG_EP_TYPE_BULK: -+ hcd->non_periodic_channels--; -+ break; ++ if (!microframe_schedule) { ++ switch (hc->ep_type) { ++ case DWC_OTG_EP_TYPE_CONTROL: ++ case DWC_OTG_EP_TYPE_BULK: ++ hcd->non_periodic_channels--; ++ break; + -+ default: -+ /* -+ * Don't release reservations for periodic channels here. -+ * That's done when a periodic transfer is descheduled (i.e. -+ * when the QH is removed from the periodic schedule). -+ */ -+ break; ++ default: ++ /* ++ * Don't release reservations for periodic channels here. ++ * That's done when a periodic transfer is descheduled (i.e. ++ * when the QH is removed from the periodic schedule). ++ */ ++ break; ++ } ++ } else { ++ ++ DWC_SPINLOCK_IRQSAVE(channel_lock, &flags); ++ hcd->available_host_channels++; ++ DWC_SPINUNLOCK_IRQRESTORE(channel_lock, flags); + } + + /* Try to queue more transfers now that there's a free channel. */ @@ -57330,9 +69036,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + if (tr_type != DWC_OTG_TRANSACTION_NONE) { + dwc_otg_hcd_queue_transactions(hcd, tr_type); + } ++ DWC_SPINLOCK_FREE(channel_lock); +} + -+ +/** + * Halts a host channel. If the channel cannot be halted immediately because + * the request queue is full, this function ensures that the FIFO empty @@ -57368,7 +69074,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * be processed. + */ + gintmsk.b.nptxfempty = 1; -+ dwc_modify_reg32(&global_regs->gintmsk, 0, gintmsk.d32); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, 0, gintmsk.d32); + } else { + /* + * Move the QH from the periodic queued schedule to @@ -57385,7 +69091,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * processed. + */ + gintmsk.b.ptxfempty = 1; -+ dwc_modify_reg32(&global_regs->gintmsk, 0, gintmsk.d32); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, 0, gintmsk.d32); + } + } +} @@ -57405,7 +69111,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + qtd->error_count = 0; + -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); + if (hcint.b.nyet) { + /* + * Got a NYET on the last transaction of the transfer. This @@ -57456,7 +69162,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + hctsiz_data_t hctsiz; + qtd->error_count = 0; + -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); + if (!hc->ep_is_in || hctsiz.b.pktcnt == 0) { + /* Core halts channel in these cases. */ + release_channel(hcd, hc, qtd, halt_status); @@ -57467,47 +69173,46 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo +} + +static int32_t handle_xfercomp_isoc_split_in(dwc_otg_hcd_t * hcd, -+ dwc_hc_t * hc, -+ dwc_otg_hc_regs_t * hc_regs, -+ dwc_otg_qtd_t * qtd) ++ dwc_hc_t * hc, ++ dwc_otg_hc_regs_t * hc_regs, ++ dwc_otg_qtd_t * qtd) +{ -+ uint32_t len; ++ uint32_t len; + struct dwc_otg_hcd_iso_packet_desc *frame_desc; + frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index]; -+ ++ + len = get_actual_xfer_length(hc, hc_regs, qtd, -+ DWC_OTG_HC_XFER_COMPLETE, -+ NULL); -+ ++ DWC_OTG_HC_XFER_COMPLETE, NULL); ++ + if (!len) { + qtd->complete_split = 0; + qtd->isoc_split_offset = 0; + return 0; + } + frame_desc->actual_length += len; -+ ++ + if (hc->align_buff && len) -+ dwc_memcpy(qtd->urb->buf + frame_desc->offset + qtd->isoc_split_offset, -+ hc->qh->dw_align_buf, -+ len); ++ dwc_memcpy(qtd->urb->buf + frame_desc->offset + ++ qtd->isoc_split_offset, hc->qh->dw_align_buf, len); + qtd->isoc_split_offset += len; -+ ++ + if (frame_desc->length == frame_desc->actual_length) { + frame_desc->status = 0; + qtd->isoc_frame_index++; + qtd->complete_split = 0; + qtd->isoc_split_offset = 0; + } -+ ++ + if (qtd->isoc_frame_index == qtd->urb->packet_count) { + hcd->fops->complete(hcd, qtd->urb->priv, qtd->urb, 0); + release_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_URB_COMPLETE); + } else { + release_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NO_HALT_STATUS); + } -+ -+ return 1; /* Indicates that channel released */ ++ ++ return 1; /* Indicates that channel released */ +} ++ +/** + * Handles a host channel Transfer Complete interrupt. This handler may be + * called in either DMA mode or Slave mode. @@ -57522,13 +69227,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hcd_urb_t *urb = qtd->urb; + int pipe_type = dwc_otg_hcd_get_pipe_type(&urb->pipe_info); + -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Transfer Complete--\n", hc->hc_num); + + if (hcd->core_if->dma_desc_enable) { + dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, halt_status); + if (pipe_type == UE_ISOCHRONOUS) { -+ /* Do not disable the interrupt, just clear it */ ++ /* Do not disable the interrupt, just clear it */ + clear_hc_int(hc_regs, xfercomp); + return 1; + } @@ -57540,13 +69245,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + + if (hc->qh->do_split) { -+ if ((hc->ep_type == DWC_OTG_EP_TYPE_ISOC) && hc->ep_is_in && hcd->core_if->dma_enable) { -+ if (qtd->complete_split && handle_xfercomp_isoc_split_in(hcd, hc, hc_regs, qtd)) ++ if ((hc->ep_type == DWC_OTG_EP_TYPE_ISOC) && hc->ep_is_in ++ && hcd->core_if->dma_enable) { ++ if (qtd->complete_split ++ && handle_xfercomp_isoc_split_in(hcd, hc, hc_regs, ++ qtd)) + goto handle_xfercomp_done; ++ } else { ++ qtd->complete_split = 0; + } -+ else { -+ qtd->complete_split = 0; -+ } + } + + /* Update the QTD and URB states. */ @@ -57606,16 +69313,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + break; + case UE_INTERRUPT: + DWC_DEBUGPL(DBG_HCDV, " Interrupt transfer complete\n"); -+ update_urb_state_xfer_comp(hc, hc_regs, urb, qtd); ++ urb_xfer_done = ++ update_urb_state_xfer_comp(hc, hc_regs, urb, qtd); + + /* + * Interrupt URB is done on the first transfer complete + * interrupt. + */ -+ hcd->fops->complete(hcd, urb->priv, urb, urb->status); ++ if (urb_xfer_done) { ++ hcd->fops->complete(hcd, urb->priv, urb, urb->status); ++ halt_status = DWC_OTG_HC_XFER_URB_COMPLETE; ++ } else { ++ halt_status = DWC_OTG_HC_XFER_COMPLETE; ++ } ++ + dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); -+ complete_periodic_xfer(hcd, hc, hc_regs, qtd, -+ DWC_OTG_HC_XFER_URB_COMPLETE); ++ complete_periodic_xfer(hcd, hc, hc_regs, qtd, halt_status); + break; + case UE_ISOCHRONOUS: + DWC_DEBUGPL(DBG_HCDV, " Isochronous transfer complete\n"); @@ -57694,15 +69407,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + halt_status, NULL); + /* non DWORD-aligned buffer case handling. */ + if (hc->align_buff && bytes_transferred && hc->ep_is_in) { -+ dwc_memcpy(urb->buf + urb->actual_length, hc->qh->dw_align_buf, bytes_transferred); ++ dwc_memcpy(urb->buf + urb->actual_length, hc->qh->dw_align_buf, ++ bytes_transferred); + } -+ ++ + urb->actual_length += bytes_transferred; + +#ifdef DEBUG + { + hctsiz_data_t hctsiz; -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); + DWC_DEBUGPL(DBG_HCDV, "DWC_otg: %s: %s, channel %d\n", + __func__, (hc->ep_is_in ? "IN" : "OUT"), + hc->hc_num); @@ -57729,7 +69443,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "NAK Received--\n", hc->hc_num); + + /* @@ -57749,11 +69463,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + case UE_CONTROL: + case UE_BULK: + if (hcd->core_if->dma_enable && hc->ep_is_in) { -+#ifdef HW2937_WORKAROUND -+ if (hc->halt_status == DWC_OTG_HC_XFER_PAUSE_IN) { -+ halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NAK); -+ } -+#endif + /* + * NAK interrupts are enabled on bulk/control IN + * transfers in DMA mode for the sole purpose of @@ -57779,7 +69488,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + if (hc->speed == DWC_OTG_EP_SPEED_HIGH) + hc->qh->ping_state = 1; -+ } ++ } + + /* + * Halt the channel so the transfer can be re-started from @@ -57793,18 +69502,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NAK); + break; + case UE_ISOCHRONOUS: -+#ifdef HW2937_WORKAROUND -+ if (hc->halt_status == DWC_OTG_HC_XFER_PAUSE_IN) { -+ halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NAK); -+ break; -+ } -+#endif + /* Should never get called for isochronous transfers. */ + DWC_ASSERT(1, "NACK interrupt for ISOC transfer\n"); + break; + } + -+ handle_nak_done: ++handle_nak_done: + disable_hc_int(hc_regs, nak); + + return 1; @@ -57820,7 +69523,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "ACK Received--\n", hc->hc_num); + + if (hc->do_split) { @@ -57854,11 +69557,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + { + struct dwc_otg_hcd_iso_packet_desc -+ *frame_desc; ++ *frame_desc; + + frame_desc = -+ &qtd->urb->iso_descs[qtd-> -+ isoc_frame_index]; ++ &qtd->urb-> ++ iso_descs[qtd->isoc_frame_index]; + qtd->isoc_split_offset += 188; + + if ((frame_desc->length - @@ -57890,14 +69593,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_ACK); + } -+#ifdef HW2937_WORKAROUND -+ else if (hc->halt_status == DWC_OTG_HC_XFER_PAUSE_IN) { -+ dwc_otg_hc_regs_t *hc_regs = hcd->core_if->host_if->hc_regs[hc->hc_num]; -+ update_urb_state_xfer_intr(hc, hc_regs, qtd->urb, qtd, DWC_OTG_HC_XFER_PAUSE_IN); -+ dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd); -+ release_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_PAUSE_IN); -+ } -+#endif + } + + /* @@ -57922,7 +69617,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "NYET Received--\n", hc->hc_num); + + /* @@ -57930,7 +69625,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * re-do the CSPLIT immediately on non-periodic + */ + if (hc->do_split && hc->complete_split) { -+ if (hc->ep_is_in && (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) && hcd->core_if->dma_enable) { ++ if (hc->ep_is_in && (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) ++ && hcd->core_if->dma_enable) { + qtd->complete_split = 0; + qtd->isoc_split_offset = 0; + if (++qtd->isoc_frame_index == qtd->urb->packet_count) { @@ -57986,7 +69682,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + */ + halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_NYET); + -+ handle_nyet_done: ++handle_nyet_done: + disable_hc_int(hc_regs, nyet); + return 1; +} @@ -58000,11 +69696,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Babble Error--\n", hc->hc_num); -+ ++ + if (hcd->core_if->dma_desc_enable) { -+ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, DWC_OTG_HC_XFER_BABBLE_ERR); ++ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, ++ DWC_OTG_HC_XFER_BABBLE_ERR); + goto handle_babble_done; + } + @@ -58018,7 +69715,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + DWC_OTG_HC_XFER_BABBLE_ERR); + halt_channel(hcd, hc, qtd, halt_status); + } -+ ++ +handle_babble_done: + disable_hc_int(hc_regs, bblerr); + return 1; @@ -58041,13 +69738,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + dwc_otg_hcd_urb_t *urb = qtd->urb; + -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "AHB Error--\n", hc->hc_num); + -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); -+ hcsplt.d32 = dwc_read_reg32(&hc_regs->hcsplt); -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); -+ hcdma = dwc_read_reg32(&hc_regs->hcdma); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); ++ hcsplt.d32 = DWC_READ_REG32(&hc_regs->hcsplt); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); ++ hcdma = DWC_READ_REG32(&hc_regs->hcdma); + + DWC_ERROR("AHB ERROR, Channel %d\n", hc->hc_num); + DWC_ERROR(" hcchar 0x%08x, hcsplt 0x%08x\n", hcchar.d32, hcsplt.d32); @@ -58058,45 +69755,44 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + DWC_ERROR(" Endpoint: %d, %s\n", + dwc_otg_hcd_get_ep_num(&urb->pipe_info), + (dwc_otg_hcd_is_pipe_in(&urb->pipe_info) ? "IN" : "OUT")); -+ + + switch (dwc_otg_hcd_get_pipe_type(&urb->pipe_info)) { -+case UE_CONTROL: -+ pipetype = "CONTROL"; -+ break; ++ case UE_CONTROL: ++ pipetype = "CONTROL"; ++ break; + case UE_BULK: -+ pipetype = "BULK"; -+ break; ++ pipetype = "BULK"; ++ break; + case UE_INTERRUPT: -+ pipetype = "INTERRUPT"; -+ break; ++ pipetype = "INTERRUPT"; ++ break; + case UE_ISOCHRONOUS: -+ pipetype = "ISOCHRONOUS"; -+ break; ++ pipetype = "ISOCHRONOUS"; ++ break; + default: -+ pipetype = "UNKNOWN"; ++ pipetype = "UNKNOWN"; + break; + } -+ ++ + DWC_ERROR(" Endpoint type: %s\n", pipetype); + + switch (hc->speed) { + case DWC_OTG_EP_SPEED_HIGH: -+ speed = "HIGH"; -+ break; -+ case DWC_OTG_EP_SPEED_FULL: -+ speed = "FULL"; -+ break; -+ case DWC_OTG_EP_SPEED_LOW: -+ speed = "LOW"; -+ break; -+ default: -+ speed = "UNKNOWN"; ++ speed = "HIGH"; + break; -+ }; ++ case DWC_OTG_EP_SPEED_FULL: ++ speed = "FULL"; ++ break; ++ case DWC_OTG_EP_SPEED_LOW: ++ speed = "LOW"; ++ break; ++ default: ++ speed = "UNKNOWN"; ++ break; ++ }; + + DWC_ERROR(" Speed: %s\n", speed); -+ ++ + DWC_ERROR(" Max packet size: %d\n", + dwc_otg_hcd_get_mps(&urb->pipe_info)); + DWC_ERROR(" Data buffer length: %d\n", urb->length); @@ -58108,7 +69804,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + /* Core haltes the channel for Descriptor DMA mode */ + if (hcd->core_if->dma_desc_enable) { -+ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, DWC_OTG_HC_XFER_AHB_ERR); ++ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, ++ DWC_OTG_HC_XFER_AHB_ERR); + goto handle_ahberr_done; + } + @@ -58133,11 +69830,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Transaction Error--\n", hc->hc_num); + + if (hcd->core_if->dma_desc_enable) { -+ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, DWC_OTG_HC_XFER_XACT_ERR); ++ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, ++ DWC_OTG_HC_XFER_XACT_ERR); + goto handle_xacterr_done; + } + @@ -58195,7 +69893,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Frame Overrun--\n", hc->hc_num); + + switch (dwc_otg_hcd_get_pipe_type(&qtd->urb->pipe_info)) { @@ -58231,7 +69929,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Data Toggle Error--\n", hc->hc_num); + + if (hc->ep_is_in) { @@ -58269,11 +69967,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * This code is here only as a check. This condition should + * never happen. Ignore the halt if it does occur. + */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); -+ hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz); -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); -+ hcintmsk.d32 = dwc_read_reg32(&hc_regs->hcintmsk); -+ hcsplt.d32 = dwc_read_reg32(&hc_regs->hcsplt); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); ++ hctsiz.d32 = DWC_READ_REG32(&hc_regs->hctsiz); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); ++ hcintmsk.d32 = DWC_READ_REG32(&hc_regs->hcintmsk); ++ hcsplt.d32 = DWC_READ_REG32(&hc_regs->hcsplt); + DWC_WARN + ("%s: hc->halt_status == DWC_OTG_HC_XFER_NO_HALT_STATUS, " + "channel %d, hcchar 0x%08x, hctsiz 0x%08x, " @@ -58294,7 +69992,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * never be set when the halt interrupt occurs. Halt the + * channel again if it does occur. + */ -+ hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar); ++ hcchar.d32 = DWC_READ_REG32(&hc_regs->hcchar); + if (hcchar.b.chdis) { + DWC_WARN("%s: hcchar.chdis set unexpectedly, " + "hcchar 0x%08x, trying to halt again\n", @@ -58334,7 +70032,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + } + + if (hc->halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE || -+ (hc->halt_status == DWC_OTG_HC_XFER_AHB_ERR && !hcd->core_if->dma_desc_enable)) { ++ (hc->halt_status == DWC_OTG_HC_XFER_AHB_ERR ++ && !hcd->core_if->dma_desc_enable)) { + /* + * Just release the channel. A dequeue can happen on a + * transfer timeout. In the case of an AHB Error, the channel @@ -58342,15 +70041,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + * recover. + */ + if (hcd->core_if->dma_desc_enable) -+ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, hc->halt_status); ++ dwc_otg_hcd_complete_xfer_ddma(hcd, hc, hc_regs, ++ hc->halt_status); + else + release_channel(hcd, hc, qtd, hc->halt_status); + return; + } + + /* Read the HCINTn register to determine the cause for the halt. */ -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); -+ hcintmsk.d32 = dwc_read_reg32(&hc_regs->hcintmsk); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); ++ hcintmsk.d32 = DWC_READ_REG32(&hc_regs->hcintmsk); + + if (hcint.b.xfercomp) { + /** @todo This is here because of a possible hardware bug. Spec @@ -58383,7 +70083,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + handle_hc_xacterr_intr(hcd, hc, hc_regs, qtd); + } else if (hcint.b.xcs_xact && hcd->core_if->dma_desc_enable) { + handle_hc_xacterr_intr(hcd, hc, hc_regs, qtd); -+ } else if (hcint.b.ahberr && hcd->core_if->dma_desc_enable) { ++ } else if (hcint.b.ahberr && hcd->core_if->dma_desc_enable) { + handle_hc_ahberr_intr(hcd, hc, hc_regs, qtd); + } else if (hcint.b.bblerr) { + handle_hc_babble_intr(hcd, hc, hc_regs, qtd); @@ -58435,10 +70135,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + ("%s: Channel %d, DMA Mode -- ChHltd set, but reason " + "for halting is unknown, hcint 0x%08x, intsts 0x%08x\n", + __func__, hc->hc_num, hcint.d32, -+ dwc_read_reg32(&hcd->core_if-> -+ core_global_regs->gintsts)); ++ DWC_READ_REG32(&hcd-> ++ core_if->core_global_regs-> ++ gintsts)); + } -+ ++ + } + } else { + DWC_PRINTF("NYET/NAK/ACK/other in non-error case, 0x%08x\n", @@ -58462,7 +70163,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd) +{ -+ DWC_DEBUGPL(DBG_HCD, "--Host Channel %d Interrupt: " ++ DWC_DEBUGPL(DBG_HCDI, "--Host Channel %d Interrupt: " + "Channel Halted--\n", hc->hc_num); + + if (hcd->core_if->dma_enable) { @@ -58495,8 +70196,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + hc_regs = dwc_otg_hcd->core_if->host_if->hc_regs[num]; + qtd = DWC_CIRCLEQ_FIRST(&hc->qh->qtd_list); + -+ hcint.d32 = dwc_read_reg32(&hc_regs->hcint); -+ hcintmsk.d32 = dwc_read_reg32(&hc_regs->hcintmsk); ++ hcint.d32 = DWC_READ_REG32(&hc_regs->hcint); ++ hcintmsk.d32 = DWC_READ_REG32(&hc_regs->hcintmsk); + DWC_DEBUGPL(DBG_HCDV, + " hcint 0x%08x, hcintmsk 0x%08x, hcint&hcintmsk 0x%08x\n", + hcint.d32, hcintmsk.d32, (hcint.d32 & hcintmsk.d32)); @@ -58553,17 +70254,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-rpi-bo + + return retval; +} ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +new file mode 100644 +index 0000000..f91c4b1 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +@@ -0,0 +1,938 @@ + -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2012-07-15 20:29:19.190085613 +0200 -@@ -0,0 +1,890 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_linux.c $ -+ * $Revision: #11 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237476 $ ++ * $Revision: #20 $ ++ * $Date: 2011/10/26 $ ++ * $Change: 1872981 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -58611,27 +70314,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b +#include +#include +#include -+ -+#ifdef LM_INTERFACE -+//#include -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#include -+#else -+#include -+#include -+#endif -+#elif defined(PLATFORM_INTERFACE) -+#include -+#endif -+ ++#include +#include ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) ++#include <../drivers/usb/core/hcd.h> ++#else +#include ++#endif ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) ++#define USB_URB_EP_LINKING 1 ++#else ++#define USB_URB_EP_LINKING 0 ++#endif + +#include "dwc_otg_hcd_if.h" +#include "dwc_otg_dbg.h" +#include "dwc_otg_driver.h" +#include "dwc_otg_hcd.h" ++#include "dwc_otg_mphi_fix.h" + +/** + * Gets the endpoint number from a _bEndpointAddress argument. The endpoint is @@ -58642,25 +70343,30 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + +static const char dwc_otg_hcd_name[] = "dwc_otg_hcd"; + ++extern bool fiq_fix_enable; ++ +/** @name Linux HC Driver API Functions */ +/** @{ */ +/* manage i/o requests, device state */ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+static int urb_enqueue(struct usb_hcd *hcd, ++static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) + struct usb_host_endpoint *ep, -+ struct urb *urb, gfp_t mem_flags); -+ -+static int urb_dequeue(struct usb_hcd *hcd, struct urb *urb); -+#else -+static int urb_enqueue(struct usb_hcd *hcd, -+ struct urb *urb, gfp_t mem_flags); -+ -+static int urb_dequeue(struct usb_hcd *hcd, -+ struct urb *urb, int status); +#endif ++ struct urb *urb, gfp_t mem_flags); ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ++static int dwc_otg_urb_dequeue(struct usb_hcd *hcd, struct urb *urb); ++#endif ++#else /* kernels at or post 2.6.30 */ ++static int dwc_otg_urb_dequeue(struct usb_hcd *hcd, ++ struct urb *urb, int status); ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) */ + +static void endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *ep); -+ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) ++static void endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep); ++#endif +static irqreturn_t dwc_otg_hcd_irq(struct usb_hcd *hcd); +extern int hcd_start(struct usb_hcd *hcd); +extern void hcd_stop(struct usb_hcd *hcd); @@ -58692,10 +70398,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + //.resume = + .stop = hcd_stop, + -+ .urb_enqueue = urb_enqueue, -+ .urb_dequeue = urb_dequeue, ++ .urb_enqueue = dwc_otg_urb_enqueue, ++ .urb_dequeue = dwc_otg_urb_dequeue, + .endpoint_disable = endpoint_disable, -+ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) ++ .endpoint_reset = endpoint_reset, ++#endif + .get_frame_number = get_frame_number, + + .hub_status_data = hub_status_data, @@ -58822,21 +70530,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + * Sets the final status of an URB and returns it to the device driver. Any + * required cleanup of the URB is performed. + */ -+#ifdef DEBUG_SOF_FIX -+extern unsigned int g_dwc_otg_interrupt_counts[10]; -+#endif -+ +static int _complete(dwc_otg_hcd_t * hcd, void *urb_handle, + dwc_otg_hcd_urb_t * dwc_otg_urb, int32_t status) +{ -+ uint64_t flags; + struct urb *urb = (struct urb *)urb_handle; + -+#ifdef DEBUG_SOF_FIX -+ g_dwc_otg_interrupt_counts[7]++; -+#endif -+ -+#ifdef DEBUG + if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { + DWC_PRINTF("%s: urb %p, device %d, ep %d %s, status=%d\n", + __func__, urb, usb_pipedevice(urb->pipe), @@ -58850,7 +70548,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + } + } + } -+#endif + + urb->actual_length = dwc_otg_hcd_urb_get_actual_length(dwc_otg_urb); + /* Convert status value. */ @@ -58889,8 +70586,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + dwc_otg_hcd_urb_get_iso_desc_actual_length + (dwc_otg_urb, i); + urb->iso_frame_desc[i].status = -+ dwc_otg_hcd_urb_get_iso_desc_status -+ (dwc_otg_urb, i); ++ dwc_otg_hcd_urb_get_iso_desc_status(dwc_otg_urb, i); + } + } + @@ -58909,21 +70605,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + if (ep) { + free_bus_bandwidth(dwc_otg_hcd_to_hcd(hcd), + dwc_otg_hcd_get_ep_bandwidth(hcd, -+ ep-> -+ hcpriv), ++ ep->hcpriv), + urb); + } + } + -+ dwc_free(dwc_otg_urb); -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) ++ DWC_FREE(dwc_otg_urb); ++ ++#if USB_URB_EP_LINKING ++ usb_hcd_unlink_urb_from_ep(dwc_otg_hcd_to_hcd(hcd), urb); ++#endif ++ DWC_SPINUNLOCK(hcd->lock); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) + usb_hcd_giveback_urb(dwc_otg_hcd_to_hcd(hcd), urb); +#else -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); -+ usb_hcd_unlink_urb_from_ep(dwc_otg_hcd_to_hcd(hcd), urb); -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + usb_hcd_giveback_urb(dwc_otg_hcd_to_hcd(hcd), urb, status); +#endif ++ DWC_SPINLOCK(hcd->lock); ++ + return 0; +} + @@ -58936,34 +70635,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + .get_b_hnp_enable = _get_b_hnp_enable, +}; + ++static struct fiq_handler fh = { ++ .name = "usb_fiq", ++}; ++static uint8_t fiqStack[1024]; ++ ++extern mphi_regs_t c_mphi_regs; +/** + * Initializes the HCD. This function allocates memory for and initializes the + * static parts of the usb_hcd and dwc_otg_hcd structures. It also registers the + * USB bus with the core and calls the hc_driver->start() function. It returns + * a negative error on failure. + */ -+int hcd_init( -+#ifdef LM_INTERFACE -+ struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *_dev -+#endif -+ ) ++int hcd_init(dwc_bus_dev_t *_dev) +{ + struct usb_hcd *hcd = NULL; + dwc_otg_hcd_t *dwc_otg_hcd = NULL; -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = DWC_OTG_BUSDRVDATA(_dev); + int retval = 0; + u64 dmamask; ++ struct pt_regs regs; + + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD INIT otg_dev=%p\n", otg_dev); + @@ -58981,26 +70672,57 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + pci_set_consistent_dma_mask(_dev, dmamask); +#endif + ++ if (fiq_fix_enable) ++ { ++ // Set up fiq ++ claim_fiq(&fh); ++ set_fiq_handler(__FIQ_Branch, 8); ++ memset(®s,0,sizeof(regs)); ++ regs.ARM_r8 = (long)dwc_otg_hcd_handle_fiq; ++ regs.ARM_r9 = (long)0; ++ regs.ARM_sp = (long)fiqStack + sizeof(fiqStack) - 4; ++ set_fiq_regs(®s); ++ } ++ + /* + * Allocate memory for the base HCD plus the DWC OTG HCD. + * Initialize the base HCD. + */ -+ hcd = usb_create_hcd(&dwc_otg_hc_driver, &_dev->dev, -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+ _dev->dev.bus_id); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) ++ hcd = usb_create_hcd(&dwc_otg_hc_driver, &_dev->dev, _dev->dev.bus_id); +#else -+ dev_name(&_dev->dev)); ++ hcd = usb_create_hcd(&dwc_otg_hc_driver, &_dev->dev, dev_name(&_dev->dev)); ++ hcd->has_tt = 1; ++// hcd->uses_new_polling = 1; ++// hcd->poll_rh = 0; +#endif + if (!hcd) { + retval = -ENOMEM; + goto error1; + } + -+ hcd->regs = otg_dev->base; ++ hcd->regs = otg_dev->os_dep.base; + -+ /* Integrate TT in root hub */ -+ hcd->has_tt = 1; ++ if (fiq_fix_enable) ++ { ++ //Set the mphi periph to the required registers ++ c_mphi_regs.base = otg_dev->os_dep.mphi_base; ++ c_mphi_regs.ctrl = otg_dev->os_dep.mphi_base + 0x4c; ++ c_mphi_regs.outdda = otg_dev->os_dep.mphi_base + 0x28; ++ c_mphi_regs.outddb = otg_dev->os_dep.mphi_base + 0x2c; ++ c_mphi_regs.intstat = otg_dev->os_dep.mphi_base + 0x50; + ++ //Enable mphi peripheral ++ writel((1<<31),c_mphi_regs.ctrl); ++#ifdef DEBUG ++ if (readl(c_mphi_regs.ctrl) & 0x80000000) ++ DWC_DEBUGPL(DBG_USER, "MPHI periph has been enabled\n"); ++ else ++ DWC_DEBUGPL(DBG_USER, "MPHI periph has NOT been enabled\n"); ++#endif ++ // Enable FIQ interrupt from USB peripheral ++ enable_fiq(INTERRUPT_VC_USB); ++ } + /* Initialize the DWC OTG HCD. */ + dwc_otg_hcd = dwc_otg_hcd_alloc_hcd(); + if (!dwc_otg_hcd) { @@ -59014,17 +70736,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + goto error2; + } + ++ otg_dev->hcd->otg_dev = otg_dev; + hcd->self.otg_port = dwc_otg_hcd_otg_port(dwc_otg_hcd); -+ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33) //don't support for LM(with 2.6.20.1 kernel) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) //version field absent later ++ hcd->self.otg_version = dwc_otg_get_otg_version(otg_dev->core_if); ++#endif ++ /* Don't support SG list at this point */ ++ hcd->self.sg_tablesize = 0; ++#endif + /* + * Finish generic HCD initialization and start the HCD. This function + * allocates the DMA buffer pool, registers the USB bus, requests the + * IRQ line, and calls hcd_start method. + */ +#ifdef PLATFORM_INTERFACE -+ retval = usb_add_hcd(hcd, platform_get_irq(_dev, 0), IRQF_SHARED); ++ retval = usb_add_hcd(hcd, platform_get_irq(_dev, 0), IRQF_SHARED | IRQF_DISABLED); +#else -+ retval = usb_add_hcd(hcd, _dev->irq, IRQF_SHARED); ++ retval = usb_add_hcd(hcd, _dev->irq, IRQF_SHARED | IRQF_DISABLED); +#endif + if (retval < 0) { + goto error2; @@ -59033,9 +70762,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + dwc_otg_hcd_set_priv_data(dwc_otg_hcd, hcd); + return 0; + -+ error2: ++error2: + usb_put_hcd(hcd); -+ error1: ++error1: + return retval; +} + @@ -59043,24 +70772,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + * Removes the HCD. + * Frees memory and resources associated with the HCD and deregisters the bus. + */ -+void hcd_remove( -+#ifdef LM_INTERFACE -+ struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *_dev -+#endif -+ ) ++void hcd_remove(dwc_bus_dev_t *_dev) +{ -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif -+ ++ dwc_otg_device_t *otg_dev = DWC_OTG_BUSDRVDATA(_dev); + dwc_otg_hcd_t *dwc_otg_hcd; + struct usb_hcd *hcd; + @@ -59186,26 +70900,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + } + } +} -+ +#endif + +/** Starts processing a USB transfer request specified by a USB Request Block + * (URB). mem_flags indicates the type of memory allocation to use while + * processing this URB. */ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+static int urb_enqueue(struct usb_hcd *hcd, ++static int dwc_otg_urb_enqueue(struct usb_hcd *hcd, ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) + struct usb_host_endpoint *ep, ++#endif + struct urb *urb, gfp_t mem_flags) +{ -+#else -+static int urb_enqueue(struct usb_hcd *hcd, -+ struct urb *urb, -+ gfp_t mem_flags) -+{ -+ struct usb_host_endpoint *ep = urb->ep; ++ int retval = 0; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) ++ struct usb_host_endpoint *ep = urb->ep; ++#endif ++#if USB_URB_EP_LINKING ++ dwc_irqflags_t irqflags; +#endif + void **ref_ep_hcpriv = &ep->hcpriv; -+ int retval = 0; + dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); + dwc_otg_hcd_urb_t *dwc_otg_urb; + int i; @@ -59216,7 +70929,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + +#ifdef DEBUG + if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { -+ dump_urb_info(urb, "urb_enqueue"); ++ dump_urb_info(urb, "dwc_otg_urb_enqueue"); + } +#endif + @@ -59245,9 +70958,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + ep_type = USB_ENDPOINT_XFER_INT; + break; + default: -+ DWC_WARN("Wrong ep type\n"); ++ DWC_WARN("Wrong EP type - %d\n", usb_pipetype(urb->pipe)); + } + ++ /* # of packets is often 0 - do we really need to call this then? */ + dwc_otg_urb = dwc_otg_hcd_urb_alloc(dwc_otg_hcd, + urb->number_of_packets, + mem_flags == GFP_ATOMIC ? 1 : 0); @@ -59256,6 +70970,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + return -ENOMEM; + + urb->hcpriv = dwc_otg_urb; ++ if (!dwc_otg_urb && urb->number_of_packets) ++ return -ENOMEM; + + dwc_otg_hcd_urb_set_pipeinfo(dwc_otg_urb, usb_pipedevice(urb->pipe), + usb_pipeendpoint(urb->pipe), ep_type, @@ -59275,7 +70991,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + // DMA addresses are bus addresses not physical addresses! + buf = dma_to_virt(&urb->dev->dev, urb->transfer_dma); + } -+ ++ + if (!(urb->transfer_flags & URB_NO_INTERRUPT)) + flags |= URB_GIVEBACK_ASAP; + if (urb->transfer_flags & URB_ZERO_PACKET) @@ -59284,27 +71000,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + dwc_otg_hcd_urb_set_params(dwc_otg_urb, urb, buf, + urb->transfer_dma, + urb->transfer_buffer_length, -+ urb->setup_packet, -+ urb->setup_dma, -+ flags, -+ urb->interval); ++ urb->setup_packet, ++ urb->setup_dma, flags, urb->interval); + + for (i = 0; i < urb->number_of_packets; ++i) { + dwc_otg_hcd_urb_set_iso_desc_params(dwc_otg_urb, i, -+ urb->iso_frame_desc[i]. -+ offset, -+ urb->iso_frame_desc[i]. -+ length); ++ urb-> ++ iso_frame_desc[i].offset, ++ urb-> ++ iso_frame_desc[i].length); + } + -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) ++#if USB_URB_EP_LINKING ++ DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &irqflags); + retval = usb_hcd_link_urb_to_ep(hcd, urb); ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, irqflags); + if (0 == retval) +#endif + { + retval = dwc_otg_hcd_urb_enqueue(dwc_otg_hcd, dwc_otg_urb, + /*(dwc_otg_qh_t **)*/ -+ ref_ep_hcpriv); ++ ref_ep_hcpriv, ++ mem_flags == GFP_ATOMIC ? 1 : 0); + if (0 == retval) { + if (alloc_bandwidth) { + allocate_bus_bandwidth(hcd, @@ -59313,8 +71030,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + urb); + } + } else { -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) ++#if USB_URB_EP_LINKING ++ dwc_irqflags_t irqflags; ++ DWC_DEBUGPL(DBG_HCD, "DWC OTG dwc_otg_hcd_urb_enqueue failed rc %d\n", retval); ++ DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &irqflags); + usb_hcd_unlink_urb_from_ep(hcd, urb); ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, irqflags); +#endif + if (retval == -DWC_E_NO_DEVICE) { + retval = -ENODEV; @@ -59326,54 +71047,61 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + +/** Aborts/cancels a USB transfer request. Always returns 0 to indicate + * success. */ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+static int urb_dequeue(struct usb_hcd *hcd, struct urb *urb) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ++static int dwc_otg_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) +#else -+static int urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ++static int dwc_otg_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) +#endif +{ -+ int rc; -+ uint64_t flags; ++ dwc_irqflags_t flags; + dwc_otg_hcd_t *dwc_otg_hcd; ++ int rc; ++ + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD URB Dequeue\n"); + + dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); + +#ifdef DEBUG + if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { -+ dump_urb_info(urb, "urb_dequeue"); ++ dump_urb_info(urb, "dwc_otg_urb_dequeue"); + } +#endif -+ if(urb->hcpriv != NULL) { -+ dwc_otg_hcd_urb_dequeue(dwc_otg_hcd, (dwc_otg_hcd_urb_t *)urb->hcpriv); + -+ dwc_free(urb->hcpriv); -+ urb->hcpriv = NULL; -+ } -+ -+ /* Higher layer software sets URB status. */ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+ usb_hcd_giveback_urb(hcd, urb); -+#else + DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &flags); + rc = usb_hcd_check_unlink_urb(hcd, urb, status); -+ if(!rc) -+ { -+ usb_hcd_unlink_urb_from_ep(hcd, urb); -+ } ++ if (0 == rc) { ++ if(urb->hcpriv != NULL) { ++ dwc_otg_hcd_urb_dequeue(dwc_otg_hcd, ++ (dwc_otg_hcd_urb_t *)urb->hcpriv); + -+ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, flags); -+ if (!rc) -+ { -+ usb_hcd_giveback_urb(hcd, urb, status); -+ } ++ DWC_FREE(urb->hcpriv); ++ urb->hcpriv = NULL; ++ } ++ } ++ ++ if (0 == rc) { ++ /* Higher layer software sets URB status. */ ++#if USB_URB_EP_LINKING ++ usb_hcd_unlink_urb_from_ep(hcd, urb); +#endif -+ if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { -+ DWC_PRINTF("Called usb_hcd_giveback_urb()\n"); -+ DWC_PRINTF(" urb->status = %d\n", urb->status); -+ } -+ -+ return 0; ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, flags); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ++ usb_hcd_giveback_urb(hcd, urb); ++#else ++ usb_hcd_giveback_urb(hcd, urb, status); ++#endif ++ if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) { ++ DWC_PRINTF("Called usb_hcd_giveback_urb() \n"); ++ DWC_PRINTF(" 1urb->status = %d\n", urb->status); ++ } ++ DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD URB Dequeue OK\n"); ++ } else { ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, flags); ++ DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD URB Dequeue failed - rc %d\n", ++ rc); ++ } ++ ++ return rc; +} + +/* Frees resources in the DWC_otg controller related to a given endpoint. Also @@ -59391,15 +71119,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + ep->hcpriv = NULL; +} + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) ++/* Resets endpoint specific parameter values, in current version used to reset ++ * the data toggle(as a WA). This function can be called from usb_clear_halt routine */ ++static void endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep) ++{ ++ dwc_irqflags_t flags; ++ struct usb_device *udev = NULL; ++ int epnum = usb_endpoint_num(&ep->desc); ++ int is_out = usb_endpoint_dir_out(&ep->desc); ++ int is_control = usb_endpoint_xfer_control(&ep->desc); ++ dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); ++ struct device *dev = DWC_OTG_OS_GETDEV(dwc_otg_hcd->otg_dev->os_dep); ++ ++ if (dev) ++ udev = to_usb_device(dev); ++ else ++ return; ++ ++ DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD EP RESET: Endpoint Num=0x%02d\n", epnum); ++ ++ DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &flags); ++ usb_settoggle(udev, epnum, is_out, 0); ++ if (is_control) ++ usb_settoggle(udev, epnum, !is_out, 0); ++ ++ if (ep->hcpriv) { ++ dwc_otg_hcd_endpoint_reset(dwc_otg_hcd, ep->hcpriv); ++ } ++ DWC_SPINUNLOCK_IRQRESTORE(dwc_otg_hcd->lock, flags); ++} ++#endif ++ +/** Handles host mode interrupts for the DWC_otg controller. Returns IRQ_NONE if + * there was no interrupt to handle. Returns IRQ_HANDLED if there was a valid + * interrupt. + * + * This function is called by the USB core when an interrupt occurs */ -+ -+#ifdef DEBUG_SOF_FIX -+unsigned int g_dwc_otg_hcd_irq_count = 0; -+#endif +static irqreturn_t dwc_otg_hcd_irq(struct usb_hcd *hcd) +{ + dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); @@ -59407,12 +71163,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + if (retval != 0) { + S3C2410X_CLEAR_EINTPEND(); + } -+ -+#ifdef DEBUG_SOF_FIX -+ ++g_dwc_otg_hcd_irq_count; -+ if ((++g_dwc_otg_hcd_irq_count %10000) == 0) -+ printk(KERN_ERR "dwc_otg_hcd_irq: %u completions.\n", g_dwc_otg_hcd_irq_count); -+#endif + return IRQ_RETVAL(retval); +} + @@ -59448,16 +71198,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-rpi-b + return retval; +} + -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2012-07-15 20:29:19.192085654 +0200 -@@ -0,0 +1,732 @@ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +new file mode 100644 +index 0000000..ac10323 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +@@ -0,0 +1,938 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $ -+ * $Revision: #39 $ -+ * $Date: 2009/04/21 $ -+ * $Change: 1237477 $ ++ * $Revision: #44 $ ++ * $Date: 2011/10/26 $ ++ * $Change: 1873028 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -59497,6 +71249,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b +#include "dwc_otg_hcd.h" +#include "dwc_otg_regs.h" + ++extern bool microframe_schedule; ++ +/** + * Free each QTD in the QH's QTD-list then free the QH. QH should already be + * removed from a list. QTD list should already be empty if called from URB @@ -59508,32 +71262,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b +void dwc_otg_hcd_qh_free(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) +{ + dwc_otg_qtd_t *qtd, *qtd_tmp; -+ uint64_t flags; + + /* Free each QTD in the QTD list */ -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); ++ DWC_SPINLOCK(hcd->lock); + DWC_CIRCLEQ_FOREACH_SAFE(qtd, qtd_tmp, &qh->qtd_list, qtd_list_entry) { + DWC_CIRCLEQ_REMOVE(&qh->qtd_list, qtd, qtd_list_entry); + dwc_otg_hcd_qtd_free(qtd); + } -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + + if (hcd->core_if->dma_desc_enable) { + dwc_otg_hcd_qh_free_ddma(hcd, qh); -+ } -+ else if (qh->dw_align_buf) { ++ } else if (qh->dw_align_buf) { + uint32_t buf_size; -+ if(qh->ep_type == UE_ISOCHRONOUS) { ++ if (qh->ep_type == UE_ISOCHRONOUS) { + buf_size = 4096; + } else { + buf_size = hcd->core_if->core_params->max_transfer_size; + } -+ dwc_dma_free(buf_size, qh->dw_align_buf, qh->dw_align_buf_dma); ++ DWC_DMA_FREE(buf_size, qh->dw_align_buf, qh->dw_align_buf_dma); + } -+ -+ -+ -+ dwc_free(qh); ++ ++ DWC_FREE(qh); ++ DWC_SPINUNLOCK(hcd->lock); + return; +} + @@ -59544,8 +71294,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b +#define NS_TO_US(ns) ((ns + 500) / 1000) + /* convert & round nanoseconds to microseconds */ + -+static uint32_t calc_bus_time(int speed, int is_in, int is_isoc, -+ int bytecount) ++static uint32_t calc_bus_time(int speed, int is_in, int is_isoc, int bytecount) +{ + unsigned long retval; + @@ -59599,7 +71348,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + DWC_WARN("Unknown device speed\n"); + retval = -1; + } -+ ++ + return NS_TO_US(retval); +} + @@ -59612,18 +71361,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * to initialize the QH. + */ +#define SCHEDULE_SLOP 10 -+void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, -+ dwc_otg_hcd_urb_t * urb) ++void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, dwc_otg_hcd_urb_t * urb) +{ + char *speed, *type; + int dev_speed; + uint32_t hub_addr, hub_port; + + dwc_memset(qh, 0, sizeof(dwc_otg_qh_t)); -+ ++ + /* Initialize QH */ + qh->ep_type = dwc_otg_hcd_get_pipe_type(&urb->pipe_info); -+ + qh->ep_is_in = dwc_otg_hcd_is_pipe_in(&urb->pipe_info) ? 1 : 0; + + qh->data_toggle = DWC_OTG_HC_PID_DATA0; @@ -59635,17 +71382,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + /* FS/LS Enpoint on HS Hub + * NOT virtual root hub */ + dev_speed = hcd->fops->speed(hcd, urb->priv); ++ + hcd->fops->hub_info(hcd, urb->priv, &hub_addr, &hub_port); + qh->do_split = 0; ++ if (microframe_schedule) ++ qh->speed = dev_speed; ++ ++ + if (((dev_speed == USB_SPEED_LOW) || + (dev_speed == USB_SPEED_FULL)) && + (hub_addr != 0 && hub_addr != 1)) { -+ + DWC_DEBUGPL(DBG_HCD, + "QH init: EP %d: TT found at hub addr %d, for port %d\n", + dwc_otg_hcd_get_ep_num(&urb->pipe_info), hub_addr, + hub_port); -+ + qh->do_split = 1; + } + @@ -59657,22 +71407,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + int bytecount = + dwc_hb_mult(qh->maxp) * dwc_max_packet(qh->maxp); + -+ qh->usecs = calc_bus_time((qh->do_split ? USB_SPEED_HIGH : dev_speed), -+ qh->ep_is_in, -+ (qh->ep_type == UE_ISOCHRONOUS), -+ bytecount); ++ qh->usecs = ++ calc_bus_time((qh->do_split ? USB_SPEED_HIGH : dev_speed), ++ qh->ep_is_in, (qh->ep_type == UE_ISOCHRONOUS), ++ bytecount); + /* Start in a slightly future (micro)frame. */ + qh->sched_frame = dwc_frame_num_inc(hcd->frame_number, + SCHEDULE_SLOP); + qh->interval = urb->interval; -+ ++ +#if 0 + /* Increase interrupt polling rate for debugging. */ + if (qh->ep_type == UE_INTERRUPT) { + qh->interval = 8; + } +#endif -+ hprt.d32 = dwc_read_reg32(hcd->core_if->host_if->hprt0); ++ hprt.d32 = DWC_READ_REG32(hcd->core_if->host_if->hprt0); + if ((hprt.b.prtspd == DWC_HPRT0_PRTSPD_HIGH_SPEED) && + ((dev_speed == USB_SPEED_LOW) || + (dev_speed == USB_SPEED_FULL))) { @@ -59726,7 +71476,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + type = "?"; + break; + } -+ ++ + DWC_DEBUGPL(DBG_HCDV, "DWC OTG HCD QH - Type = %s\n", type); + +#ifdef DEBUG @@ -59746,30 +71496,35 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * @param hcd The HCD state structure for the DWC OTG controller. + * @param urb Holds the information about the device/endpoint that we need + * to initialize the QH. ++ * @param atomic_alloc Flag to do atomic allocation if needed + * + * @return Returns pointer to the newly allocated QH, or NULL on error. */ +dwc_otg_qh_t *dwc_otg_hcd_qh_create(dwc_otg_hcd_t * hcd, -+ dwc_otg_hcd_urb_t * urb) ++ dwc_otg_hcd_urb_t * urb, int atomic_alloc) +{ + dwc_otg_qh_t *qh; + + /* Allocate memory */ + /** @todo add memflags argument */ -+ qh = dwc_otg_hcd_qh_alloc(); ++ qh = dwc_otg_hcd_qh_alloc(atomic_alloc); + if (qh == NULL) { ++ DWC_ERROR("qh allocation failed"); + return NULL; + } + + qh_init(hcd, qh, urb); -+ -+ if (hcd->core_if->dma_desc_enable && (dwc_otg_hcd_qh_init_ddma(hcd, qh) < 0)) { -+ dwc_otg_hcd_qh_free(hcd, qh); ++ ++ if (hcd->core_if->dma_desc_enable ++ && (dwc_otg_hcd_qh_init_ddma(hcd, qh) < 0)) { ++ dwc_otg_hcd_qh_free(hcd, qh); + return NULL; + } -+ ++ + return qh; +} + ++/* microframe_schedule=0 start */ ++ +/** + * Checks that a channel is available for a periodic transfer. + * @@ -59786,8 +71541,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + int num_channels; + + num_channels = hcd->core_if->core_params->host_channels; -+ if ((hcd->periodic_channels + hcd->non_periodic_channels < num_channels) && -+ (hcd->periodic_channels < num_channels - 1)) { ++ if ((hcd->periodic_channels + hcd->non_periodic_channels < num_channels) ++ && (hcd->periodic_channels < num_channels - 1)) { + status = 0; + } else { + DWC_INFO("%s: Total channels: %d, Periodic: %d, Non-periodic: %d\n", @@ -59838,6 +71593,162 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + return status; +} + ++/* microframe_schedule=0 end */ ++ ++/** ++ * Microframe scheduler ++ * track the total use in hcd->frame_usecs ++ * keep each qh use in qh->frame_usecs ++ * when surrendering the qh then donate the time back ++ */ ++const unsigned short max_uframe_usecs[]={ 100, 100, 100, 100, 100, 100, 30, 0 }; ++ ++/* ++ * called from dwc_otg_hcd.c:dwc_otg_hcd_init ++ */ ++int init_hcd_usecs(dwc_otg_hcd_t *_hcd) ++{ ++ int i; ++ for (i=0; i<8; i++) { ++ _hcd->frame_usecs[i] = max_uframe_usecs[i]; ++ } ++ return 0; ++} ++ ++static int find_single_uframe(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh) ++{ ++ int i; ++ unsigned short utime; ++ int t_left; ++ int ret; ++ int done; ++ ++ ret = -1; ++ utime = _qh->usecs; ++ t_left = utime; ++ i = 0; ++ done = 0; ++ while (done == 0) { ++ /* At the start _hcd->frame_usecs[i] = max_uframe_usecs[i]; */ ++ if (utime <= _hcd->frame_usecs[i]) { ++ _hcd->frame_usecs[i] -= utime; ++ _qh->frame_usecs[i] += utime; ++ t_left -= utime; ++ ret = i; ++ done = 1; ++ return ret; ++ } else { ++ i++; ++ if (i == 8) { ++ done = 1; ++ ret = -1; ++ } ++ } ++ } ++ return ret; ++ } ++ ++/* ++ * use this for FS apps that can span multiple uframes ++ */ ++static int find_multi_uframe(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh) ++{ ++ int i; ++ int j; ++ unsigned short utime; ++ int t_left; ++ int ret; ++ int done; ++ unsigned short xtime; ++ ++ ret = -1; ++ utime = _qh->usecs; ++ t_left = utime; ++ i = 0; ++ done = 0; ++loop: ++ while (done == 0) { ++ if(_hcd->frame_usecs[i] <= 0) { ++ i++; ++ if (i == 8) { ++ done = 1; ++ ret = -1; ++ } ++ goto loop; ++ } ++ ++ /* ++ * we need n consecutive slots ++ * so use j as a start slot j plus j+1 must be enough time (for now) ++ */ ++ xtime= _hcd->frame_usecs[i]; ++ for (j = i+1 ; j < 8 ; j++ ) { ++ /* ++ * if we add this frame remaining time to xtime we may ++ * be OK, if not we need to test j for a complete frame ++ */ ++ if ((xtime+_hcd->frame_usecs[j]) < utime) { ++ if (_hcd->frame_usecs[j] < max_uframe_usecs[j]) { ++ j = 8; ++ ret = -1; ++ continue; ++ } ++ } ++ if (xtime >= utime) { ++ ret = i; ++ j = 8; /* stop loop with a good value ret */ ++ continue; ++ } ++ /* add the frame time to x time */ ++ xtime += _hcd->frame_usecs[j]; ++ /* we must have a fully available next frame or break */ ++ if ((xtime < utime) ++ && (_hcd->frame_usecs[j] == max_uframe_usecs[j])) { ++ ret = -1; ++ j = 8; /* stop loop with a bad value ret */ ++ continue; ++ } ++ } ++ if (ret >= 0) { ++ t_left = utime; ++ for (j = i; (t_left>0) && (j < 8); j++ ) { ++ t_left -= _hcd->frame_usecs[j]; ++ if ( t_left <= 0 ) { ++ _qh->frame_usecs[j] += _hcd->frame_usecs[j] + t_left; ++ _hcd->frame_usecs[j]= -t_left; ++ ret = i; ++ done = 1; ++ } else { ++ _qh->frame_usecs[j] += _hcd->frame_usecs[j]; ++ _hcd->frame_usecs[j] = 0; ++ } ++ } ++ } else { ++ i++; ++ if (i == 8) { ++ done = 1; ++ ret = -1; ++ } ++ } ++ } ++ return ret; ++} ++ ++static int find_uframe(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh) ++{ ++ int ret; ++ ret = -1; ++ ++ if (_qh->speed == USB_SPEED_HIGH) { ++ /* if this is a hs transaction we need a full frame */ ++ ret = find_single_uframe(_hcd, _qh); ++ } else { ++ /* if this is a fs transaction we may need a sequence of frames */ ++ ret = find_multi_uframe(_hcd, _qh); ++ } ++ return ret; ++} ++ +/** + * Checks that the max transfer size allowed in a host channel is large enough + * to handle the maximum data transfer in a single (micro)frame for a periodic @@ -59868,6 +71779,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + return status; +} + ++ ++extern int g_next_sched_frame, g_np_count, g_np_sent; ++ +/** + * Schedules an interrupt or isochronous transfer in the periodic schedule. + * @@ -59881,21 +71795,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b +{ + int status = 0; + -+ status = periodic_channel_available(hcd); ++ if (microframe_schedule) { ++ int frame; ++ status = find_uframe(hcd, qh); ++ frame = -1; ++ if (status == 0) { ++ frame = 7; ++ } else { ++ if (status > 0 ) ++ frame = status-1; ++ } ++ ++ /* Set the new frame up */ ++ if (frame > -1) { ++ qh->sched_frame &= ~0x7; ++ qh->sched_frame |= (frame & 7); ++ } ++ ++ if (status != -1) ++ status = 0; ++ } else { ++ status = periodic_channel_available(hcd); ++ if (status) { ++ DWC_INFO("%s: No host channel available for periodic " "transfer.\n", __func__); //NOTICE ++ return status; ++ } ++ ++ status = check_periodic_bandwidth(hcd, qh); ++ } + if (status) { -+ DWC_INFO("%s: No host channel available for periodic " "transfer.\n", __func__); //NOTICE ++ DWC_INFO("%s: Insufficient periodic bandwidth for " ++ "periodic transfer.\n", __func__); + return status; + } -+ -+ status = check_periodic_bandwidth(hcd, qh); -+ if (status) { -+ DWC_INFO("%s: Insufficient periodic bandwidth for " "periodic transfer.\n", __func__); //NOTICE -+ return status; -+ } -+ + status = check_max_xfer_size(hcd, qh); + if (status) { -+ DWC_INFO("%s: Channel max transfer size too small " "for periodic transfer.\n", __func__); //NOTICE ++ DWC_INFO("%s: Channel max transfer size too small " ++ "for periodic transfer.\n", __func__); + return status; + } + @@ -59904,12 +71840,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + DWC_LIST_INSERT_TAIL(&hcd->periodic_sched_ready, &qh->qh_list_entry); + } + else { -+ /* Always start in the inactive schedule. */ -+ DWC_LIST_INSERT_TAIL(&hcd->periodic_sched_inactive, &qh->qh_list_entry); ++ if(DWC_LIST_EMPTY(&hcd->periodic_sched_inactive) || dwc_frame_num_le(qh->sched_frame, g_next_sched_frame)) ++ { ++ g_next_sched_frame = qh->sched_frame; ++ ++ } ++ /* Always start in the inactive schedule. */ ++ DWC_LIST_INSERT_TAIL(&hcd->periodic_sched_inactive, &qh->qh_list_entry); + } + -+ /* Reserve the periodic channel. */ -+ hcd->periodic_channels++; ++ if (!microframe_schedule) { ++ /* Reserve the periodic channel. */ ++ hcd->periodic_channels++; ++ } + + /* Update claimed usecs per (micro)frame. */ + hcd->periodic_usecs += qh->usecs; @@ -59917,6 +71860,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + return status; +} + ++ +/** + * This function adds a QH to either the non periodic or periodic schedule if + * it is not already in the schedule. If the QH is already in the schedule, no @@ -59927,13 +71871,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b +int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) +{ + int status = 0; -+ uint64_t flags; -+ -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); ++ gintmsk_data_t intr_mask = {.d32 = 0 }; + + if (!DWC_LIST_EMPTY(&qh->qh_list_entry)) { + /* QH already in a schedule. */ -+ goto done; ++ return status; + } + + /* Add the new QH to the appropriate schedule */ @@ -59941,13 +71883,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + /* Always start in the inactive schedule. */ + DWC_LIST_INSERT_TAIL(&hcd->non_periodic_sched_inactive, + &qh->qh_list_entry); ++ g_np_count++; + } else { + status = schedule_periodic(hcd, qh); ++ if ( !hcd->periodic_qh_count ) { ++ intr_mask.b.sofintr = 1; ++ DWC_MODIFY_REG32(&hcd->core_if->core_global_regs->gintmsk, ++ intr_mask.d32, intr_mask.d32); ++ } ++ hcd->periodic_qh_count++; + } + -+ done: -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); -+ + return status; +} + @@ -59959,13 +71905,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + */ +static void deschedule_periodic(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) +{ ++ int i; + DWC_LIST_REMOVE_INIT(&qh->qh_list_entry); + -+ /* Release the periodic channel reservation. */ -+ hcd->periodic_channels--; -+ + /* Update claimed usecs per (micro)frame. */ + hcd->periodic_usecs -= qh->usecs; ++ ++ if (!microframe_schedule) { ++ /* Release the periodic channel reservation. */ ++ hcd->periodic_channels--; ++ } else { ++ for (i = 0; i < 8; i++) { ++ hcd->frame_usecs[i] += qh->frame_usecs[i]; ++ qh->frame_usecs[i] = 0; ++ } ++ } +} + +/** @@ -59976,12 +71930,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * @param qh QH to remove from schedule. */ +void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh) +{ -+ uint64_t flags; -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); ++ gintmsk_data_t intr_mask = {.d32 = 0 }; + + if (DWC_LIST_EMPTY(&qh->qh_list_entry)) { + /* QH is not in a schedule. */ -+ goto done; ++ return; + } + + if (dwc_qh_is_non_per(qh)) { @@ -59992,10 +71945,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + DWC_LIST_REMOVE_INIT(&qh->qh_list_entry); + } else { + deschedule_periodic(hcd, qh); ++ hcd->periodic_qh_count--; ++ if( !hcd->periodic_qh_count ) { ++ intr_mask.b.sofintr = 1; ++ DWC_MODIFY_REG32(&hcd->core_if->core_global_regs->gintmsk, ++ intr_mask.d32, 0); ++ } + } -+ -+ done: -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); +} + +/** @@ -60013,10 +71969,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + */ +void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, + int sched_next_periodic_split) -+{ -+ uint64_t flags; -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); -+ ++{ + if (dwc_qh_is_non_per(qh)) { + dwc_otg_hcd_qh_remove(hcd, qh); + if (!DWC_CIRCLEQ_EMPTY(&qh->qtd_list)) { @@ -60031,10 +71984,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + if (sched_next_periodic_split) { + + qh->sched_frame = frame_number; ++ + if (dwc_frame_num_le(frame_number, -+ dwc_frame_num_inc(qh-> -+ start_split_frame, -+ 1))) { ++ dwc_frame_num_inc ++ (qh->start_split_frame, ++ 1))) { + /* + * Allow one frame to elapse after start + * split microframe before scheduling @@ -60074,18 +72028,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * Remove from periodic_sched_queued and move to + * appropriate queue. + */ -+ if (qh->sched_frame == frame_number) { ++ if ((microframe_schedule && dwc_frame_num_le(qh->sched_frame, frame_number)) || ++ (!microframe_schedule && qh->sched_frame == frame_number)) { + DWC_LIST_MOVE_HEAD(&hcd->periodic_sched_ready, + &qh->qh_list_entry); + } else { -+ DWC_LIST_MOVE_HEAD(&hcd-> -+ periodic_sched_inactive, -+ &qh->qh_list_entry); ++ if(!dwc_frame_num_le(g_next_sched_frame, qh->sched_frame)) ++ { ++ g_next_sched_frame = qh->sched_frame; ++ } ++ ++ DWC_LIST_MOVE_HEAD ++ (&hcd->periodic_sched_inactive, ++ &qh->qh_list_entry); + } + } + } -+ -+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); +} + +/** @@ -60093,13 +72051,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * + * @param urb The URB to create a QTD from. Each URB-QTD pair will end up + * pointing to each other so each pair should have a unique correlation. ++ * @param atomic_alloc Flag to do atomic alloc if needed + * + * @return Returns pointer to the newly allocated QTD, or NULL on error. */ -+dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb) ++dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb, int atomic_alloc) +{ + dwc_otg_qtd_t *qtd; + -+ qtd = dwc_otg_hcd_qtd_alloc(); ++ qtd = dwc_otg_hcd_qtd_alloc(atomic_alloc); + if (qtd == NULL) { + return NULL; + } @@ -60147,53 +72106,409 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-rpi-b + * @param[in] qtd The QTD to add + * @param[in] hcd The DWC HCD structure + * @param[out] qh out parameter to return queue head ++ * @param atomic_alloc Flag to do atomic alloc if needed + * + * @return 0 if successful, negative error code otherwise. + */ +int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd, -+ dwc_otg_hcd_t * hcd, dwc_otg_qh_t ** qh) ++ dwc_otg_hcd_t * hcd, dwc_otg_qh_t ** qh, int atomic_alloc) +{ + int retval = 0; -+ uint64_t flags; ++ dwc_irqflags_t flags; + + dwc_otg_hcd_urb_t *urb = qtd->urb; + -+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); -+ + /* + * Get the QH which holds the QTD-list to insert to. Create QH if it + * doesn't exist. + */ + if (*qh == NULL) { -+ *qh = dwc_otg_hcd_qh_create(hcd, urb); ++ *qh = dwc_otg_hcd_qh_create(hcd, urb, atomic_alloc); + if (*qh == NULL) { + retval = -1; + goto done; + } + } -+ ++ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); + retval = dwc_otg_hcd_qh_add(hcd, *qh); + if (retval == 0) { + DWC_CIRCLEQ_INSERT_TAIL(&((*qh)->qtd_list), qtd, + qtd_list_entry); + } -+ -+ done: + DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + ++done: ++ + return retval; +} + -+#endif /* DWC_DEVICE_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2012-07-15 20:29:19.076083471 +0200 -@@ -0,0 +1,2067 @@ ++#endif /* DWC_DEVICE_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c b/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c +new file mode 100755 +index 0000000..b70ca68 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c +@@ -0,0 +1,113 @@ ++#include "dwc_otg_regs.h" ++#include "dwc_otg_dbg.h" ++ ++void dwc_debug_print_core_int_reg(gintsts_data_t gintsts, const char* function_name) ++{ ++ DWC_DEBUGPL(DBG_USER, "*** Debugging from within the %s function: ***\n" ++ "curmode: %1i Modemismatch: %1i otgintr: %1i sofintr: %1i\n" ++ "rxstsqlvl: %1i nptxfempty : %1i ginnakeff: %1i goutnakeff: %1i\n" ++ "ulpickint: %1i i2cintr: %1i erlysuspend:%1i usbsuspend: %1i\n" ++ "usbreset: %1i enumdone: %1i isooutdrop: %1i eopframe: %1i\n" ++ "restoredone: %1i epmismatch: %1i inepint: %1i outepintr: %1i\n" ++ "incomplisoin:%1i incomplisoout:%1i fetsusp: %1i resetdet: %1i\n" ++ "portintr: %1i hcintr: %1i ptxfempty: %1i lpmtranrcvd:%1i\n" ++ "conidstschng:%1i disconnect: %1i sessreqintr:%1i wkupintr: %1i\n", ++ function_name, ++ gintsts.b.curmode, ++ gintsts.b.modemismatch, ++ gintsts.b.otgintr, ++ gintsts.b.sofintr, ++ gintsts.b.rxstsqlvl, ++ gintsts.b.nptxfempty, ++ gintsts.b.ginnakeff, ++ gintsts.b.goutnakeff, ++ gintsts.b.ulpickint, ++ gintsts.b.i2cintr, ++ gintsts.b.erlysuspend, ++ gintsts.b.usbsuspend, ++ gintsts.b.usbreset, ++ gintsts.b.enumdone, ++ gintsts.b.isooutdrop, ++ gintsts.b.eopframe, ++ gintsts.b.restoredone, ++ gintsts.b.epmismatch, ++ gintsts.b.inepint, ++ gintsts.b.outepintr, ++ gintsts.b.incomplisoin, ++ gintsts.b.incomplisoout, ++ gintsts.b.fetsusp, ++ gintsts.b.resetdet, ++ gintsts.b.portintr, ++ gintsts.b.hcintr, ++ gintsts.b.ptxfempty, ++ gintsts.b.lpmtranrcvd, ++ gintsts.b.conidstschng, ++ gintsts.b.disconnect, ++ gintsts.b.sessreqintr, ++ gintsts.b.wkupintr); ++ return; ++} ++ ++void dwc_debug_core_int_mask(gintmsk_data_t gintmsk, const char* function_name) ++{ ++ DWC_DEBUGPL(DBG_USER, "Interrupt Mask status (called from %s) :\n" ++ "modemismatch: %1i otgintr: %1i sofintr: %1i rxstsqlvl: %1i\n" ++ "nptxfempty: %1i ginnakeff: %1i goutnakeff: %1i ulpickint: %1i\n" ++ "i2cintr: %1i erlysuspend:%1i usbsuspend: %1i usbreset: %1i\n" ++ "enumdone: %1i isooutdrop: %1i eopframe: %1i restoredone: %1i\n" ++ "epmismatch: %1i inepintr: %1i outepintr: %1i incomplisoin:%1i\n" ++ "incomplisoout:%1i fetsusp: %1i resetdet: %1i portintr: %1i\n" ++ "hcintr: %1i ptxfempty: %1i lpmtranrcvd:%1i conidstschng:%1i\n" ++ "disconnect: %1i sessreqintr:%1i wkupintr: %1i\n", ++ function_name, ++ gintmsk.b.modemismatch, ++ gintmsk.b.otgintr, ++ gintmsk.b.sofintr, ++ gintmsk.b.rxstsqlvl, ++ gintmsk.b.nptxfempty, ++ gintmsk.b.ginnakeff, ++ gintmsk.b.goutnakeff, ++ gintmsk.b.ulpickint, ++ gintmsk.b.i2cintr, ++ gintmsk.b.erlysuspend, ++ gintmsk.b.usbsuspend, ++ gintmsk.b.usbreset, ++ gintmsk.b.enumdone, ++ gintmsk.b.isooutdrop, ++ gintmsk.b.eopframe, ++ gintmsk.b.restoredone, ++ gintmsk.b.epmismatch, ++ gintmsk.b.inepintr, ++ gintmsk.b.outepintr, ++ gintmsk.b.incomplisoin, ++ gintmsk.b.incomplisoout, ++ gintmsk.b.fetsusp, ++ gintmsk.b.resetdet, ++ gintmsk.b.portintr, ++ gintmsk.b.hcintr, ++ gintmsk.b.ptxfempty, ++ gintmsk.b.lpmtranrcvd, ++ gintmsk.b.conidstschng, ++ gintmsk.b.disconnect, ++ gintmsk.b.sessreqintr, ++ gintmsk.b.wkupintr); ++ return; ++} ++ ++void dwc_debug_otg_int(gotgint_data_t gotgint, const char* function_name) ++{ ++ DWC_DEBUGPL(DBG_USER, "otg int register (from %s function):\n" ++ "sesenddet:%1i sesreqsucstschung:%2i hstnegsucstschng:%1i\n" ++ "hstnegdet:%1i adevtoutchng: %2i debdone: %1i\n" ++ "mvic: %1i\n", ++ function_name, ++ gotgint.b.sesenddet, ++ gotgint.b.sesreqsucstschng, ++ gotgint.b.hstnegsucstschng, ++ gotgint.b.hstnegdet, ++ gotgint.b.adevtoutchng, ++ gotgint.b.debdone, ++ gotgint.b.mvic); ++ ++ return; ++} +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h b/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h +new file mode 100755 +index 0000000..22f28e1 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h +@@ -0,0 +1,36 @@ ++#ifndef __DWC_OTG_MPHI_FIX_H__ ++#define __DWC_OTG_MPHI_FIX_H__ ++ ++#define FIQ_WRITE_IO_ADDRESS(_addr_,_data_) *(volatile uint32_t *) IO_ADDRESS(_addr_) = _data_ ++#define FIQ_READ_IO_ADDRESS(_addr_) *(volatile uint32_t *) IO_ADDRESS(_addr_) ++#define FIQ_MODIFY_IO_ADDRESS(_addr_,_clear_,_set_) FIQ_WRITE_IO_ADDRESS(_addr_ , (FIQ_READ_IO_ADDRESS(_addr_)&~_clear_)|_set_) ++#define FIQ_WRITE(_addr_,_data_) *(volatile uint32_t *) _addr_ = _data_ ++ ++typedef struct { ++ volatile void* base; ++ volatile void* ctrl; ++ volatile void* outdda; ++ volatile void* outddb; ++ volatile void* intstat; ++} mphi_regs_t; ++ ++void dwc_debug_print_core_int_reg(gintsts_data_t gintsts, const char* function_name); ++void dwc_debug_core_int_mask(gintsts_data_t gintmsk, const char* function_name); ++void dwc_debug_otg_int(gotgint_data_t gotgint, const char* function_name); ++ ++ ++ ++#ifdef DEBUG ++#define DWC_DBG_PRINT_CORE_INT(_arg_) dwc_debug_print_core_int_reg(_arg_,__func__) ++#define DWC_DBG_PRINT_CORE_INT_MASK(_arg_) dwc_debug_core_int_mask(_arg_,__func__) ++#define DWC_DBG_PRINT_OTG_INT(_arg_) dwc_debug_otg_int(_arg_,__func__) ++ ++#else ++#define DWC_DBG_PRINT_CORE_INT(_arg_) ++#define DWC_DBG_PRINT_CORE_INT_MASK(_arg_) ++#define DWC_DBG_PRINT_OTG_INT(_arg_) ++ ++ ++#endif ++ ++#endif +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h b/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h +new file mode 100644 +index 0000000..bb1c42d +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h +@@ -0,0 +1,188 @@ ++#ifndef _DWC_OS_DEP_H_ ++#define _DWC_OS_DEP_H_ ++ ++/** ++ * @file ++ * ++ * This file contains OS dependent structures. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) ++# include ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21) ++# include ++#else ++# include ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) ++# include ++#else ++# include ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) ++# include ++#endif ++ ++#ifdef PCI_INTERFACE ++# include ++#endif ++ ++#ifdef LM_INTERFACE ++# include ++# include ++# include ++# include ++# if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) ++# include ++# include ++# include ++# include ++# else ++/* in 2.6.31, at least, we seem to have lost the generic LM infrastructure - ++ here we assume that the machine architecture provides definitions ++ in its own header ++*/ ++# include ++# include ++# endif ++#endif ++ ++#ifdef PLATFORM_INTERFACE ++#include ++#include ++#endif ++ ++/** The OS page size */ ++#define DWC_OS_PAGE_SIZE PAGE_SIZE ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) ++typedef int gfp_t; ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) ++# define IRQF_SHARED SA_SHIRQ ++#endif ++ ++typedef struct os_dependent { ++ /** Base address returned from ioremap() */ ++ void *base; ++ ++ /** Register offset for Diagnostic API */ ++ uint32_t reg_offset; ++ ++ /** Base address for MPHI peripheral */ ++ void *mphi_base; ++ ++#ifdef LM_INTERFACE ++ struct lm_device *lmdev; ++#elif defined(PCI_INTERFACE) ++ struct pci_dev *pcidev; ++ ++ /** Start address of a PCI region */ ++ resource_size_t rsrc_start; ++ ++ /** Length address of a PCI region */ ++ resource_size_t rsrc_len; ++#elif defined(PLATFORM_INTERFACE) ++ struct platform_device *platformdev; ++#endif ++ ++} os_dependent_t; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++ ++ ++/* Type for the our device on the chosen bus */ ++#if defined(LM_INTERFACE) ++typedef struct lm_device dwc_bus_dev_t; ++#elif defined(PCI_INTERFACE) ++typedef struct pci_dev dwc_bus_dev_t; ++#elif defined(PLATFORM_INTERFACE) ++typedef struct platform_device dwc_bus_dev_t; ++#endif ++ ++/* Helper macro to retrieve drvdata from the device on the chosen bus */ ++#if defined(LM_INTERFACE) ++#define DWC_OTG_BUSDRVDATA(_dev) lm_get_drvdata(_dev) ++#elif defined(PCI_INTERFACE) ++#define DWC_OTG_BUSDRVDATA(_dev) pci_get_drvdata(_dev) ++#elif defined(PLATFORM_INTERFACE) ++#define DWC_OTG_BUSDRVDATA(_dev) platform_get_drvdata(_dev) ++#endif ++ ++/** ++ * Helper macro returning the otg_device structure of a given struct device ++ * ++ * c.f. static dwc_otg_device_t *dwc_otg_drvdev(struct device *_dev) ++ */ ++#ifdef LM_INTERFACE ++#define DWC_OTG_GETDRVDEV(_var, _dev) do { \ ++ struct lm_device *lm_dev = \ ++ container_of(_dev, struct lm_device, dev); \ ++ _var = lm_get_drvdata(lm_dev); \ ++ } while (0) ++ ++#elif defined(PCI_INTERFACE) ++#define DWC_OTG_GETDRVDEV(_var, _dev) do { \ ++ _var = dev_get_drvdata(_dev); \ ++ } while (0) ++ ++#elif defined(PLATFORM_INTERFACE) ++#define DWC_OTG_GETDRVDEV(_var, _dev) do { \ ++ struct platform_device *platform_dev = \ ++ container_of(_dev, struct platform_device, dev); \ ++ _var = platform_get_drvdata(platform_dev); \ ++ } while (0) ++#endif ++ ++ ++/** ++ * Helper macro returning the struct dev of the given struct os_dependent ++ * ++ * c.f. static struct device *dwc_otg_getdev(struct os_dependent *osdep) ++ */ ++#ifdef LM_INTERFACE ++#define DWC_OTG_OS_GETDEV(_osdep) \ ++ ((_osdep).lmdev == NULL? NULL: &(_osdep).lmdev->dev) ++#elif defined(PCI_INTERFACE) ++#define DWC_OTG_OS_GETDEV(_osdep) \ ++ ((_osdep).pci_dev == NULL? NULL: &(_osdep).pci_dev->dev) ++#elif defined(PLATFORM_INTERFACE) ++#define DWC_OTG_OS_GETDEV(_osdep) \ ++ ((_osdep).platformdev == NULL? NULL: &(_osdep).platformdev->dev) ++#endif ++ ++ ++ ++ ++#endif /* _DWC_OS_DEP_H_ */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_pcd.c b/drivers/usb/host/dwc_otg/dwc_otg_pcd.c +new file mode 100644 +index 0000000..c97d65c +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_pcd.c +@@ -0,0 +1,2708 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $ -+ * $Revision: #79 $ -+ * $Date: 2009/04/10 $ -+ * $Change: 1230501 $ ++ * $Revision: #101 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -60224,7 +72539,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +#ifndef DWC_HOST_ONLY + +/** @file -+ * This file implements PCD Core. All code in this file is portable and don't ++ * This file implements PCD Core. All code in this file is portable and doesn't + * use any OS specific functions. + * PCD Core provides Interface, defined in + * header file, which can be used to implement OS specific PCD interface. @@ -60247,6 +72562,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +extern int init_cfi(cfiobject_t * cfiobj); +#endif + ++/** ++ * Choose endpoint from ep arrays using usb_ep structure. ++ */ +static dwc_otg_pcd_ep_t *get_ep_from_handle(dwc_otg_pcd_t * pcd, void *handle) +{ + int i; @@ -60270,23 +72588,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + int32_t status) +{ + unsigned stopped = ep->stopped; -+ -+ DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, ep); ++ ++ DWC_DEBUGPL(DBG_PCDV, "%s(ep %p req %p)\n", __func__, ep, req); + DWC_CIRCLEQ_REMOVE_INIT(&ep->queue, req, queue_entry); + + /* don't modify queue heads during completion callback */ + ep->stopped = 1; -+ DWC_SPINUNLOCK(ep->pcd->lock); ++ /* spin_unlock/spin_lock now done in fops->complete() */ + ep->pcd->fops->complete(ep->pcd, ep->priv, req->priv, status, + req->actual); -+ DWC_SPINLOCK(ep->pcd->lock); + + if (ep->pcd->request_pending > 0) { + --ep->pcd->request_pending; + } + + ep->stopped = stopped; -+ dwc_free(req); ++ DWC_FREE(req); +} + +/** @@ -60320,12 +72637,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +static int32_t dwc_otg_pcd_start_cb(void *p) +{ + dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *) p; ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + + /* + * Initialized the Core for Device mode. + */ -+ if (dwc_otg_is_device_mode(GET_CORE_IF(pcd))) { -+ dwc_otg_core_dev_init(GET_CORE_IF(pcd)); ++ if (dwc_otg_is_device_mode(core_if)) { ++ dwc_otg_core_dev_init(core_if); ++ /* Set core_if's lock pointer to the pcd->lock */ ++ core_if->lock = pcd->lock; + } + return 1; +} @@ -60337,6 +72657,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +{ + dwc_otg_pcd_ep_t *ep; + ep = get_ep_from_handle(pcd, pep); ++ if (!ep) { ++ DWC_WARN("bad ep\n"); ++ return -DWC_E_INVALID; ++ } ++ + return pcd->cfi->ops.ep_alloc_buf(pcd->cfi, pcd, ep, addr, buflen, + flags); +} @@ -60364,7 +72689,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + || (!GET_CORE_IF(pcd)->core_params->i2c_enable)) { + if (GET_CORE_IF(pcd)->srp_timer_started) { + GET_CORE_IF(pcd)->srp_timer_started = 0; -+ DWC_TIMER_CANCEL(pcd->srp_timer); ++ DWC_TIMER_CANCEL(GET_CORE_IF(pcd)->srp_timer); + } + } + return 1; @@ -60380,7 +72705,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_otg_pcd_t *pcd = (dwc_otg_pcd_t *) p; + + if (pcd->fops->suspend) { ++ DWC_SPINUNLOCK(pcd->lock); + pcd->fops->suspend(pcd); ++ DWC_SPINLOCK(pcd->lock); + } + + return 1; @@ -60413,14 +72740,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +}; + +/** -+ * This function allocates a DMA Descriptor chain for the Endpoint ++ * This function allocates a DMA Descriptor chain for the Endpoint + * buffer to be used for a transfer to/from the specified endpoint. + */ -+dwc_otg_dev_dma_desc_t *dwc_otg_ep_alloc_desc_chain(uint32_t * dma_desc_addr, -+ uint32_t count) ++dwc_otg_dev_dma_desc_t *dwc_otg_ep_alloc_desc_chain(dwc_dma_t * dma_desc_addr, ++ uint32_t count) +{ -+ -+ return dwc_dma_alloc(count * sizeof(dwc_otg_dev_dma_desc_t), dma_desc_addr); ++ return DWC_DMA_ALLOC_ATOMIC(count * sizeof(dwc_otg_dev_dma_desc_t), ++ dma_desc_addr); +} + +/** @@ -60429,7 +72756,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +void dwc_otg_ep_free_desc_chain(dwc_otg_dev_dma_desc_t * desc_addr, + uint32_t dma_desc_addr, uint32_t count) +{ -+ dwc_dma_free(count * sizeof(dwc_otg_dev_dma_desc_t), desc_addr, ++ DWC_DMA_FREE(count * sizeof(dwc_otg_dev_dma_desc_t), desc_addr, + dma_desc_addr); +} + @@ -60450,6 +72777,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + depctl_data_t depctl = {.d32 = 0 }; + volatile uint32_t *addr; + int i, j; ++ uint32_t len; + + if (dwc_ep->is_in) + dwc_ep->desc_cnt = dwc_ep->buf_proc_intrvl / dwc_ep->bInterval; @@ -60467,7 +72795,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + return; + } + -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + + /** ISO OUT EP */ + if (dwc_ep->is_in == 0) { @@ -60480,7 +72808,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + int offset; + + addr = &core_if->dev_if->out_ep_regs[dwc_ep->num]->doepctl; -+ dma_ad = (dma_addr_t) dwc_read_reg32(&(out_regs->doepdma)); ++ dma_ad = (dma_addr_t) DWC_READ_REG32(&(out_regs->doepdma)); + + /** Buffer 0 descriptors setup */ + dma_ad = dwc_ep->dma_addr0; @@ -60498,16 +72826,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + i += dwc_ep->pkt_per_frm) { + + for (j = 0; j < dwc_ep->pkt_per_frm; ++j) { -+ data_per_desc = -+ ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep-> -+ data_per_frame - -+ j * dwc_ep->maxpacket : dwc_ep->maxpacket; ++ uint32_t len = (j + 1) * dwc_ep->maxpacket; ++ if (len > dwc_ep->data_per_frame) ++ data_per_desc = ++ dwc_ep->data_per_frame - ++ j * dwc_ep->maxpacket; ++ else ++ data_per_desc = dwc_ep->maxpacket; ++ len = data_per_desc % 4; ++ if (len) ++ data_per_desc += 4 - len; + -+ data_per_desc += -+ (data_per_desc % 4) ? (4 - -+ data_per_desc % -+ 4) : 0; + sts.b_iso_out.rxbytes = data_per_desc; + dma_desc->buf = dma_ad; + dma_desc->status.d32 = sts.d32; @@ -60519,12 +72848,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + + for (j = 0; j < dwc_ep->pkt_per_frm - 1; ++j) { -+ data_per_desc = -+ ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep->data_per_frame - -+ j * dwc_ep->maxpacket : dwc_ep->maxpacket; -+ data_per_desc += -+ (data_per_desc % 4) ? (4 - data_per_desc % 4) : 0; ++ uint32_t len = (j + 1) * dwc_ep->maxpacket; ++ if (len > dwc_ep->data_per_frame) ++ data_per_desc = ++ dwc_ep->data_per_frame - ++ j * dwc_ep->maxpacket; ++ else ++ data_per_desc = dwc_ep->maxpacket; ++ len = data_per_desc % 4; ++ if (len) ++ data_per_desc += 4 - len; + sts.b_iso_out.rxbytes = data_per_desc; + dma_desc->buf = dma_ad; + dma_desc->status.d32 = sts.d32; @@ -60535,12 +72868,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + + sts.b_iso_out.ioc = 1; -+ data_per_desc = -+ ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep->data_per_frame - -+ j * dwc_ep->maxpacket : dwc_ep->maxpacket; -+ data_per_desc += -+ (data_per_desc % 4) ? (4 - data_per_desc % 4) : 0; ++ len = (j + 1) * dwc_ep->maxpacket; ++ if (len > dwc_ep->data_per_frame) ++ data_per_desc = ++ dwc_ep->data_per_frame - j * dwc_ep->maxpacket; ++ else ++ data_per_desc = dwc_ep->maxpacket; ++ len = data_per_desc % 4; ++ if (len) ++ data_per_desc += 4 - len; + sts.b_iso_out.rxbytes = data_per_desc; + + dma_desc->buf = dma_ad; @@ -60555,16 +72891,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + for (i = 0; i < dwc_ep->desc_cnt - dwc_ep->pkt_per_frm; + i += dwc_ep->pkt_per_frm) { + for (j = 0; j < dwc_ep->pkt_per_frm; ++j) { ++ uint32_t len = (j + 1) * dwc_ep->maxpacket; ++ if (len > dwc_ep->data_per_frame) ++ data_per_desc = ++ dwc_ep->data_per_frame - ++ j * dwc_ep->maxpacket; ++ else ++ data_per_desc = dwc_ep->maxpacket; ++ len = data_per_desc % 4; ++ if (len) ++ data_per_desc += 4 - len; ++ + data_per_desc = -+ ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep-> -+ data_per_frame - -+ j * dwc_ep->maxpacket : dwc_ep->maxpacket; -+ data_per_desc += -+ (data_per_desc % 4) ? (4 - -+ data_per_desc % -+ 4) : 0; -+ sts.b_iso_out.rxbytes = data_per_desc; ++ sts.b_iso_out.rxbytes = data_per_desc; + dma_desc->buf = dma_ad; + dma_desc->status.d32 = sts.d32; + @@ -60605,7 +72944,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_ep->next_frame = 0; + + /** Write dma_ad into DOEPDMA register */ -+ dwc_write_reg32(&(out_regs->doepdma), ++ DWC_WRITE_REG32(&(out_regs->doepdma), + (uint32_t) dwc_ep->iso_dma_desc_addr); + + } @@ -60620,17 +72959,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + fifosize_data_t txfifosize, rxfifosize; + + txfifosize.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[dwc_ep->num]-> ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[dwc_ep->num]-> + dtxfsts); + rxfifosize.d32 = -+ dwc_read_reg32(&core_if->core_global_regs->grxfsiz); ++ DWC_READ_REG32(&core_if->core_global_regs->grxfsiz); + + addr = &core_if->dev_if->in_ep_regs[dwc_ep->num]->diepctl; + + dma_ad = dwc_ep->dma_addr0; + + dsts.d32 = -+ dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + + sts.b_iso_in.bs = BS_HOST_READY; + sts.b_iso_in.txsts = 0; @@ -60684,7 +73023,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_ep->next_frame = sts.b_iso_in.framenum + dwc_ep->bInterval; + + /** Write dma_ad into diepdma register */ -+ dwc_write_reg32(&(in_regs->diepdma), ++ DWC_WRITE_REG32(&(in_regs->diepdma), + (uint32_t) dwc_ep->iso_dma_desc_addr); + } + /** Enable endpoint, clear nak */ @@ -60693,8 +73032,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + depctl.b.usbactep = 1; + depctl.b.cnak = 1; + -+ dwc_modify_reg32(addr, depctl.d32, depctl.d32); -+ depctl.d32 = dwc_read_reg32(addr); ++ DWC_MODIFY_REG32(addr, depctl.d32, depctl.d32); ++ depctl.d32 = DWC_READ_REG32(addr); +} + +/** @@ -60704,7 +73043,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + * @param ep The EP to start the transfer on. + * + */ -+ +void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t * core_if, + dwc_ep_t * ep) +{ @@ -60736,17 +73074,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet -+ * exist ? 1 : 0) ++ * exist ? 1 : 0) + */ + deptsiz.b.mc = ep->pkt_per_frm; + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = + (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; -+ dwc_write_reg32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> + dieptsiz, deptsiz.d32); + + /* Write the DMA register */ -+ dwc_write_reg32(& ++ DWC_WRITE_REG32(& + (core_if->dev_if->in_ep_regs[ep->num]-> + diepdma), (uint32_t) ep->dma_addr); + @@ -60756,31 +73094,29 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + -+ dwc_write_reg32(&core_if->dev_if->out_ep_regs[ep->num]-> ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[ep->num]-> + doeptsiz, deptsiz.d32); + + /* Write the DMA register */ -+ dwc_write_reg32(& ++ DWC_WRITE_REG32(& + (core_if->dev_if->out_ep_regs[ep->num]-> + doepdma), (uint32_t) ep->dma_addr); + + } + /** Enable endpoint, clear nak */ + depctl.d32 = 0; -+ dwc_modify_reg32(addr, depctl.d32, depctl.d32); -+ + depctl.b.epena = 1; + depctl.b.cnak = 1; + -+ dwc_modify_reg32(addr, depctl.d32, depctl.d32); ++ DWC_MODIFY_REG32(addr, depctl.d32, depctl.d32); + } +} + +/** + * This function does the setup for a data transfer for an EP and -+ * starts the transfer. For an IN transfer, the packets will be ++ * starts the transfer. For an IN transfer, the packets will be + * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers, -+ * the packets are unloaded from the Rx FIFO in the ISR. the ISR. ++ * the packets are unloaded from the Rx FIFO in the ISR. + * + * @param core_if Programming view of DWC_otg controller. + * @param ep The EP to start the transfer on. @@ -60820,10 +73156,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +} + +/** -+ * This function does the setup for a data transfer for an EP and -+ * starts the transfer. For an IN transfer, the packets will be -+ * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers, -+ * the packets are unloaded from the Rx FIFO in the ISR. the ISR. ++ * This function stops transfer for an EP and ++ * resets the ep's variables. + * + * @param core_if Programming view of DWC_otg controller. + * @param ep The EP to start the transfer on. @@ -60841,12 +73175,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + + /* disable the ep */ -+ depctl.d32 = dwc_read_reg32(addr); ++ depctl.d32 = DWC_READ_REG32(addr); + + depctl.b.epdis = 1; + depctl.b.snak = 1; + -+ dwc_write_reg32(addr, depctl.d32); ++ DWC_WRITE_REG32(addr, depctl.d32); + + if (core_if->dma_desc_enable && + ep->iso_desc_addr && ep->iso_dma_desc_addr) { @@ -60881,7 +73215,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + int atomic_alloc) +{ + dwc_otg_pcd_ep_t *ep; -+ uint64_t flags = 0; ++ dwc_irqflags_t flags = 0; + dwc_ep_t *dwc_ep; + int32_t frm_data; + dsts_data_t dsts; @@ -60889,7 +73223,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + ep = get_ep_from_handle(pcd, ep_handle); + -+ if (!ep->desc || ep->dwc_ep.num == 0) { ++ if (!ep || !ep->desc || ep->dwc_ep.num == 0) { + DWC_WARN("bad ep\n"); + return -DWC_E_INVALID; + } @@ -60927,7 +73261,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + frm_data -= ep->dwc_ep.maxpacket; + } + -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + + if (start_frame == -1) { + dwc_ep->next_frame = dsts.b.soffn + 1; @@ -60960,10 +73294,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + if (atomic_alloc) { + dwc_ep->pkt_info = -+ dwc_alloc_atomic(sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt); ++ DWC_ALLOC_ATOMIC(sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt); + } else { + dwc_ep->pkt_info = -+ dwc_alloc(sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt); ++ DWC_ALLOC(sizeof(iso_pkt_info_t) * dwc_ep->pkt_cnt); + } + if (!dwc_ep->pkt_info) { + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); @@ -60985,7 +73319,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +int dwc_otg_pcd_iso_ep_stop(dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle) +{ -+ uint64_t flags = 0; ++ dwc_irqflags_t flags = 0; + dwc_otg_pcd_ep_t *ep; + dwc_ep_t *dwc_ep; + @@ -60998,7 +73332,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + dwc_otg_iso_ep_stop_transfer(GET_CORE_IF(pcd), dwc_ep); + -+ dwc_free(dwc_ep->pkt_info); ++ DWC_FREE(dwc_ep->pkt_info); + DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); + if (ep->iso_req_handle != req_handle) { + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); @@ -61015,7 +73349,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + * This function is used for perodical data exchnage between PCD and gadget drivers. + * for Isochronous EPs + * -+ * - Every time a sync period completes this function is called to ++ * - Every time a sync period completes this function is called to + * perform data exchange between PCD and gadget + */ +void dwc_otg_iso_buffer_done(dwc_otg_pcd_t * pcd, dwc_otg_pcd_ep_t * ep, @@ -61045,6 +73379,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_ep_t *dwc_ep; + + ep = get_ep_from_handle(pcd, ep_handle); ++ if (!ep->desc || ep->dwc_ep.num == 0) { ++ DWC_WARN("bad ep\n"); ++ return -DWC_E_INVALID; ++ } + dwc_ep = &ep->dwc_ep; + + return dwc_ep->pkt_cnt; @@ -61058,6 +73396,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_ep_t *dwc_ep; + + ep = get_ep_from_handle(pcd, ep_handle); ++ if (!ep) ++ DWC_WARN("bad ep\n"); ++ + dwc_ep = &ep->dwc_ep; + + *status = dwc_ep->pkt_info[packet].status; @@ -61065,7 +73406,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + *offset = dwc_ep->pkt_info[packet].offset; +} + -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ + +static void dwc_otg_pcd_init_ep(dwc_otg_pcd_t * pcd, dwc_otg_pcd_ep_t * pcd_ep, + uint32_t is_in, uint32_t ep_num) @@ -61097,7 +73438,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +} + +/** -+ * Initialise ep's ++ * Initialize ep's + */ +static void dwc_otg_pcd_reinit(dwc_otg_pcd_t * pcd) +{ @@ -61155,7 +73496,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +} + +/** -+ * This function is called when the SRP timer expires. The SRP should ++ * This function is called when the SRP timer expires. The SRP should + * complete within 6 seconds. + */ +static void srp_timeout(void *ptr) @@ -61164,9 +73505,36 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_otg_core_if_t *core_if = (dwc_otg_core_if_t *) ptr; + volatile uint32_t *addr = &core_if->core_global_regs->gotgctl; + -+ gotgctl.d32 = dwc_read_reg32(addr); ++ gotgctl.d32 = DWC_READ_REG32(addr); + + core_if->srp_timer_started = 0; ++ ++ if (core_if->adp_enable) { ++ if (gotgctl.b.bsesvld == 0) { ++ gpwrdn_data_t gpwrdn = {.d32 = 0 }; ++ DWC_PRINTF("SRP Timeout BSESSVLD = 0\n"); ++ /* Power off the core */ ++ if (core_if->power_down == 2) { ++ gpwrdn.b.pwrdnswtch = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gpwrdn, ++ gpwrdn.d32, 0); ++ } ++ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuintsel = 1; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gpwrdn, 0, ++ gpwrdn.d32); ++ dwc_otg_adp_probe_start(core_if); ++ } else { ++ DWC_PRINTF("SRP Timeout BSESSVLD = 1\n"); ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ } ++ } + + if ((core_if->core_params->phy_type == DWC_PHY_TYPE_PARAM_FS) && + (core_if->core_params->i2c_enable)) { @@ -61174,28 +73542,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + if ((core_if->srp_success) && (gotgctl.b.bsesvld)) { + if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { -+ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb-> -+ p); ++ core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); + } + + /* Clear Session Request */ + gotgctl.d32 = 0; + gotgctl.b.sesreq = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gotgctl, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gotgctl, + gotgctl.d32, 0); + + core_if->srp_success = 0; + } else { + __DWC_ERROR("Device not connected/responding\n"); + gotgctl.b.sesreq = 0; -+ dwc_write_reg32(addr, gotgctl.d32); ++ DWC_WRITE_REG32(addr, gotgctl.d32); + } + } else if (gotgctl.b.sesreq) { + DWC_PRINTF("SRP Timeout\n"); + + __DWC_ERROR("Device not connected/responding\n"); + gotgctl.b.sesreq = 0; -+ dwc_write_reg32(addr, gotgctl.d32); ++ DWC_WRITE_REG32(addr, gotgctl.d32); + } else { + DWC_PRINTF(" SRP GOTGCTL=%0x\n", gotgctl.d32); + } @@ -61217,7 +73584,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + DWC_DEBUGPL(DBG_PCDV, "Start xfer tasklet\n"); + -+ diepctl.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[0]->diepctl); ++ diepctl.d32 = DWC_READ_REG32(&core_if->dev_if->in_ep_regs[0]->diepctl); + + if (pcd->ep0.queue_sof) { + pcd->ep0.queue_sof = 0; @@ -61228,7 +73595,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + for (i = 0; i < core_if->dev_if->num_in_eps; i++) { + depctl_data_t diepctl; + diepctl.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[i]->diepctl); ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[i]->diepctl); + + if (pcd->in_ep[i].queue_sof) { + pcd->in_ep[i].queue_sof = 0; @@ -61246,28 +73613,33 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + */ +dwc_otg_pcd_t *dwc_otg_pcd_init(dwc_otg_core_if_t * core_if) +{ -+ dwc_otg_pcd_t *pcd = 0; ++ dwc_otg_pcd_t *pcd = NULL; + dwc_otg_dev_if_t *dev_if; ++ int i; + + /* + * Allocate PCD structure + */ -+ pcd = dwc_alloc(sizeof(dwc_otg_pcd_t)); ++ pcd = DWC_ALLOC(sizeof(dwc_otg_pcd_t)); + -+ if (pcd == 0) { ++ if (pcd == NULL) { + return NULL; + } + + pcd->lock = DWC_SPINLOCK_ALLOC(); + DWC_DEBUGPL(DBG_HCDV, "Init of PCD %p given core_if %p\n", + pcd, core_if);//GRAYG -+ pcd->core_if = core_if; + if (!pcd->lock) { + DWC_ERROR("Could not allocate lock for pcd"); -+ dwc_free(pcd); ++ DWC_FREE(pcd); + return NULL; + } ++ /* Set core_if's lock pointer to hcd->lock */ ++ core_if->lock = pcd->lock; ++ pcd->core_if = core_if; ++ + dev_if = core_if->dev_if; ++ dev_if->isoc_ep = NULL; + + if (core_if->hwcfg4.b.ded_fifo_en) { + DWC_PRINTF("Dedicated Tx FIFOs mode\n"); @@ -61276,9 +73648,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + + /* -+ * Initialized the Core for Device mode. -+ */ -+ if (dwc_otg_is_device_mode(core_if)) { ++ * Initialized the Core for Device mode here if there is nod ADP support. ++ * Otherwise it will be done later in dwc_otg_adp_start routine. ++ */ ++ if (dwc_otg_is_device_mode(core_if) /*&& !core_if->adp_enable*/) { + dwc_otg_core_dev_init(core_if); + } + @@ -61292,38 +73665,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + */ + if (GET_CORE_IF(pcd)->dma_enable) { + pcd->setup_pkt = -+ dwc_dma_alloc(sizeof(*pcd->setup_pkt) * 5, ++ DWC_DMA_ALLOC(sizeof(*pcd->setup_pkt) * 5, + &pcd->setup_pkt_dma_handle); -+ if (pcd->setup_pkt == 0) { -+ dwc_free(pcd); ++ if (pcd->setup_pkt == NULL) { ++ DWC_FREE(pcd); + return NULL; + } + + pcd->status_buf = -+ dwc_dma_alloc(sizeof(uint16_t), ++ DWC_DMA_ALLOC(sizeof(uint16_t), + &pcd->status_buf_dma_handle); -+ if (pcd->status_buf == 0) { -+ dwc_dma_free(sizeof(*pcd->setup_pkt) * 5, ++ if (pcd->status_buf == NULL) { ++ DWC_DMA_FREE(sizeof(*pcd->setup_pkt) * 5, + pcd->setup_pkt, pcd->setup_pkt_dma_handle); -+ dwc_free(pcd); ++ DWC_FREE(pcd); + return NULL; + } + + if (GET_CORE_IF(pcd)->dma_desc_enable) { + dev_if->setup_desc_addr[0] = -+ dwc_otg_ep_alloc_desc_chain(&dev_if-> -+ dma_setup_desc_addr[0], -+ 1); ++ dwc_otg_ep_alloc_desc_chain ++ (&dev_if->dma_setup_desc_addr[0], 1); + dev_if->setup_desc_addr[1] = -+ dwc_otg_ep_alloc_desc_chain(&dev_if-> -+ dma_setup_desc_addr[1], -+ 1); ++ dwc_otg_ep_alloc_desc_chain ++ (&dev_if->dma_setup_desc_addr[1], 1); + dev_if->in_desc_addr = -+ dwc_otg_ep_alloc_desc_chain(&dev_if-> -+ dma_in_desc_addr, 1); ++ dwc_otg_ep_alloc_desc_chain ++ (&dev_if->dma_in_desc_addr, 1); + dev_if->out_desc_addr = -+ dwc_otg_ep_alloc_desc_chain(&dev_if-> -+ dma_out_desc_addr, 1); ++ dwc_otg_ep_alloc_desc_chain ++ (&dev_if->dma_out_desc_addr, 1); ++ pcd->data_terminated = 0; + + if (dev_if->setup_desc_addr[0] == 0 + || dev_if->setup_desc_addr[1] == 0 @@ -61331,55 +73703,45 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + || dev_if->out_desc_addr == 0) { + + if (dev_if->out_desc_addr) -+ dwc_otg_ep_free_desc_chain(dev_if-> -+ out_desc_addr, -+ dev_if-> -+ dma_out_desc_addr, -+ 1); ++ dwc_otg_ep_free_desc_chain ++ (dev_if->out_desc_addr, ++ dev_if->dma_out_desc_addr, 1); + if (dev_if->in_desc_addr) -+ dwc_otg_ep_free_desc_chain(dev_if-> -+ in_desc_addr, -+ dev_if-> -+ dma_in_desc_addr, -+ 1); ++ dwc_otg_ep_free_desc_chain ++ (dev_if->in_desc_addr, ++ dev_if->dma_in_desc_addr, 1); + if (dev_if->setup_desc_addr[1]) -+ dwc_otg_ep_free_desc_chain(dev_if-> -+ setup_desc_addr -+ [1], -+ dev_if-> -+ dma_setup_desc_addr -+ [1], 1); ++ dwc_otg_ep_free_desc_chain ++ (dev_if->setup_desc_addr[1], ++ dev_if->dma_setup_desc_addr[1], 1); + if (dev_if->setup_desc_addr[0]) -+ dwc_otg_ep_free_desc_chain(dev_if-> -+ setup_desc_addr -+ [0], -+ dev_if-> -+ dma_setup_desc_addr -+ [0], 1); ++ dwc_otg_ep_free_desc_chain ++ (dev_if->setup_desc_addr[0], ++ dev_if->dma_setup_desc_addr[0], 1); + -+ dwc_dma_free(sizeof(*pcd->setup_pkt) * 5, ++ DWC_DMA_FREE(sizeof(*pcd->setup_pkt) * 5, + pcd->setup_pkt, + pcd->setup_pkt_dma_handle); -+ dwc_dma_free(sizeof(*pcd->status_buf), ++ DWC_DMA_FREE(sizeof(*pcd->status_buf), + pcd->status_buf, + pcd->status_buf_dma_handle); + -+ dwc_free(pcd); ++ DWC_FREE(pcd); + + return NULL; + } + } + } else { -+ pcd->setup_pkt = dwc_alloc(sizeof(*pcd->setup_pkt) * 5); -+ if (pcd->setup_pkt == 0) { -+ dwc_free(pcd); ++ pcd->setup_pkt = DWC_ALLOC(sizeof(*pcd->setup_pkt) * 5); ++ if (pcd->setup_pkt == NULL) { ++ DWC_FREE(pcd); + return NULL; + } + -+ pcd->status_buf = dwc_alloc(sizeof(uint16_t)); -+ if (pcd->status_buf == 0) { -+ dwc_free(pcd->setup_pkt); -+ dwc_free(pcd); ++ pcd->status_buf = DWC_ALLOC(sizeof(uint16_t)); ++ if (pcd->status_buf == NULL) { ++ DWC_FREE(pcd->setup_pkt); ++ DWC_FREE(pcd); + return NULL; + } + } @@ -61388,39 +73750,80 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + /* Allocate the cfi object for the PCD */ +#ifdef DWC_UTE_CFI -+ pcd->cfi = dwc_alloc(sizeof(cfiobject_t)); ++ pcd->cfi = DWC_ALLOC(sizeof(cfiobject_t)); + if (NULL == pcd->cfi) -+ return NULL; ++ goto fail; + if (init_cfi(pcd->cfi)) { + CFI_INFO("%s: Failed to init the CFI object\n", __func__); -+ return NULL; ++ goto fail; + } +#endif + + /* Initialize tasklets */ -+ pcd->start_xfer_tasklet = DWC_TASK_ALLOC(start_xfer_tasklet_func, pcd); -+ pcd->test_mode_tasklet = DWC_TASK_ALLOC(do_test_mode, pcd); -+ /* Initialize timer */ -+ pcd->srp_timer = DWC_TIMER_ALLOC("SRP TIMER", srp_timeout, core_if); ++ pcd->start_xfer_tasklet = DWC_TASK_ALLOC("xfer_tasklet", ++ start_xfer_tasklet_func, pcd); ++ pcd->test_mode_tasklet = DWC_TASK_ALLOC("test_mode_tasklet", ++ do_test_mode, pcd); ++ ++ /* Initialize SRP timer */ ++ core_if->srp_timer = DWC_TIMER_ALLOC("SRP TIMER", srp_timeout, core_if); ++ ++ if (core_if->core_params->dev_out_nak) { ++ /** ++ * Initialize xfer timeout timer. Implemented for ++ * 2.93a feature "Device DDMA OUT NAK Enhancement" ++ */ ++ for(i = 0; i < MAX_EPS_CHANNELS; i++) { ++ pcd->core_if->ep_xfer_timer[i] = ++ DWC_TIMER_ALLOC("ep timer", ep_xfer_timeout, ++ &pcd->core_if->ep_xfer_info[i]); ++ } ++ } ++ + return pcd; ++#ifdef DWC_UTE_CFI ++fail: ++#endif ++ if (pcd->setup_pkt) ++ DWC_FREE(pcd->setup_pkt); ++ if (pcd->status_buf) ++ DWC_FREE(pcd->status_buf); ++#ifdef DWC_UTE_CFI ++ if (pcd->cfi) ++ DWC_FREE(pcd->cfi); ++#endif ++ if (pcd) ++ DWC_FREE(pcd); ++ return NULL; ++ +} + ++/** ++ * Remove PCD specific data ++ */ +void dwc_otg_pcd_remove(dwc_otg_pcd_t * pcd) +{ + dwc_otg_dev_if_t *dev_if = GET_CORE_IF(pcd)->dev_if; ++ int i; ++ if (pcd->core_if->core_params->dev_out_nak) { ++ for (i = 0; i < MAX_EPS_CHANNELS; i++) { ++ DWC_TIMER_CANCEL(pcd->core_if->ep_xfer_timer[i]); ++ pcd->core_if->ep_xfer_info[i].state = 0; ++ } ++ } + + if (GET_CORE_IF(pcd)->dma_enable) { -+ dwc_dma_free(sizeof(*pcd->setup_pkt) * 5, pcd->setup_pkt, ++ DWC_DMA_FREE(sizeof(*pcd->setup_pkt) * 5, pcd->setup_pkt, + pcd->setup_pkt_dma_handle); -+ dwc_dma_free(sizeof(uint16_t), pcd->status_buf, ++ DWC_DMA_FREE(sizeof(uint16_t), pcd->status_buf, + pcd->status_buf_dma_handle); + if (GET_CORE_IF(pcd)->dma_desc_enable) { + dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[0], -+ dev_if-> -+ dma_setup_desc_addr[0], 1); ++ dev_if->dma_setup_desc_addr ++ [0], 1); + dwc_otg_ep_free_desc_chain(dev_if->setup_desc_addr[1], -+ dev_if-> -+ dma_setup_desc_addr[1], 1); ++ dev_if->dma_setup_desc_addr ++ [1], 1); + dwc_otg_ep_free_desc_chain(dev_if->in_desc_addr, + dev_if->dma_in_desc_addr, 1); + dwc_otg_ep_free_desc_chain(dev_if->out_desc_addr, @@ -61428,13 +73831,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + 1); + } + } else { -+ dwc_free(pcd->setup_pkt); -+ dwc_free(pcd->status_buf); ++ DWC_FREE(pcd->setup_pkt); ++ DWC_FREE(pcd->status_buf); + } + DWC_SPINLOCK_FREE(pcd->lock); ++ /* Set core_if's lock pointer to NULL */ ++ pcd->core_if->lock = NULL; ++ + DWC_TASK_FREE(pcd->start_xfer_tasklet); + DWC_TASK_FREE(pcd->test_mode_tasklet); -+ DWC_TIMER_FREE(pcd->srp_timer); ++ if (pcd->core_if->core_params->dev_out_nak) { ++ for (i = 0; i < MAX_EPS_CHANNELS; i++) { ++ if (pcd->core_if->ep_xfer_timer[i]) { ++ DWC_TIMER_FREE(pcd->core_if->ep_xfer_timer[i]); ++ } ++ } ++ } + +/* Release the CFI object's dynamic memory */ +#ifdef DWC_UTE_CFI @@ -61443,9 +73855,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } +#endif + -+ dwc_free(pcd); ++ DWC_FREE(pcd); +} + ++/** ++ * Returns whether registered pcd is dual speed or not ++ */ +uint32_t dwc_otg_pcd_is_dualspeed(dwc_otg_pcd_t * pcd) +{ + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); @@ -61460,12 +73875,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + return 1; +} + ++/** ++ * Returns whether registered pcd is OTG capable or not ++ */ +uint32_t dwc_otg_pcd_is_otg(dwc_otg_pcd_t * pcd) +{ + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + gusbcfg_data_t usbcfg = {.d32 = 0 }; + -+ usbcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->gusbcfg); ++ usbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); + if (!usbcfg.b.srpcap || !usbcfg.b.hnpcap) { + return 0; + } @@ -61531,14 +73949,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + (core_if->tx_msk & (1 << (fifo_num - 1))) ^ core_if->tx_msk; +} + ++/** ++ * This function is being called from gadget ++ * to enable PCD endpoint. ++ */ +int dwc_otg_pcd_ep_enable(dwc_otg_pcd_t * pcd, + const uint8_t * ep_desc, void *usb_ep) +{ + int num, dir; -+ dwc_otg_pcd_ep_t *ep = 0; ++ dwc_otg_pcd_ep_t *ep = NULL; + const usb_endpoint_descriptor_t *desc; -+ uint64_t flags; ++ dwc_irqflags_t flags; ++ fifosize_data_t dptxfsiz = {.d32 = 0 }; ++ gdfifocfg_data_t gdfifocfg = {.d32 = 0 }; ++ gdfifocfg_data_t gdfifocfgbase = {.d32 = 0 }; + int retval = 0; ++ int i, epcount; + + desc = (const usb_endpoint_descriptor_t *)ep_desc; + @@ -61559,9 +73985,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + + if (dir == UE_DIR_IN) { -+ ep = &pcd->in_ep[num - 1]; ++ epcount = pcd->core_if->dev_if->num_in_eps; ++ for (i = 0; i < epcount; i++) { ++ if (num == pcd->in_ep[i].dwc_ep.num) { ++ ep = &pcd->in_ep[i]; ++ break; ++ } ++ } + } else { -+ ep = &pcd->out_ep[num - 1]; ++ epcount = pcd->core_if->dev_if->num_out_eps; ++ for (i = 0; i < epcount; i++) { ++ if (num == pcd->out_ep[i].dwc_ep.num) { ++ ep = &pcd->out_ep[i]; ++ break; ++ } ++ } ++ } ++ ++ if (!ep) { ++ DWC_WARN("bad address\n"); ++ retval = -DWC_E_INVALID; ++ goto out; + } + + DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); @@ -61596,7 +74040,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + */ + ep->dwc_ep.tx_fifo_num = + assign_tx_fifo(GET_CORE_IF(pcd)); ++ } + ++ /* Calculating EP info controller base address */ ++ if (ep->dwc_ep.tx_fifo_num ++ && GET_CORE_IF(pcd)->en_multiple_tx_fifo) { ++ gdfifocfg.d32 = ++ DWC_READ_REG32(&GET_CORE_IF(pcd)-> ++ core_global_regs->gdfifocfg); ++ gdfifocfgbase.d32 = gdfifocfg.d32 >> 16; ++ dptxfsiz.d32 = ++ (DWC_READ_REG32 ++ (&GET_CORE_IF(pcd)->core_global_regs-> ++ dtxfsiz[ep->dwc_ep.tx_fifo_num - 1]) >> 16); ++ gdfifocfg.b.epinfobase = ++ gdfifocfgbase.d32 + dptxfsiz.d32; ++ if (GET_CORE_IF(pcd)->snpsid <= OTG_CORE_REV_2_94a) { ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)-> ++ core_global_regs->gdfifocfg, ++ gdfifocfg.d32); ++ } + } + } + /* Set initial data PID. */ @@ -61606,10 +74069,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + /* Alloc DMA Descriptors */ + if (GET_CORE_IF(pcd)->dma_desc_enable) { ++#ifndef DWC_UTE_PER_IO + if (ep->dwc_ep.type != UE_ISOCHRONOUS) { ++#endif + ep->dwc_ep.desc_addr = -+ dwc_otg_ep_alloc_desc_chain(&ep->dwc_ep. -+ dma_desc_addr, ++ dwc_otg_ep_alloc_desc_chain(&ep-> ++ dwc_ep.dma_desc_addr, + MAX_DMA_DESC_CNT); + if (!ep->dwc_ep.desc_addr) { + DWC_WARN("%s, can't allocate DMA descriptor\n", @@ -61618,12 +74083,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + goto out; + } ++#ifndef DWC_UTE_PER_IO + } ++#endif + } + + DWC_DEBUGPL(DBG_PCD, "Activate %s: type=%d, mps=%d desc=%p\n", + (ep->dwc_ep.is_in ? "IN" : "OUT"), + ep->dwc_ep.type, ep->dwc_ep.maxpacket, ep->desc); ++#ifdef DWC_UTE_PER_IO ++ ep->dwc_ep.xiso_bInterval = 1 << (ep->desc->bInterval - 1); ++#endif ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { ++ ep->dwc_ep.bInterval = 1 << (ep->desc->bInterval - 1); ++ ep->dwc_ep.frame_num = 0xFFFFFFFF; ++ } + + dwc_otg_ep_activate(GET_CORE_IF(pcd), &ep->dwc_ep); + @@ -61635,22 +74109,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + -+ out: ++out: + return retval; +} + ++/** ++ * This function is being called from gadget ++ * to disable PCD endpoint. ++ */ +int dwc_otg_pcd_ep_disable(dwc_otg_pcd_t * pcd, void *ep_handle) +{ + dwc_otg_pcd_ep_t *ep; -+ uint64_t flags; ++ dwc_irqflags_t flags; + dwc_otg_dev_dma_desc_t *desc_addr; + dwc_dma_t dma_desc_addr; ++ gdfifocfg_data_t gdfifocfgbase = {.d32 = 0 }; ++ gdfifocfg_data_t gdfifocfg = {.d32 = 0 }; ++ fifosize_data_t dptxfsiz = {.d32 = 0 }; + + ep = get_ep_from_handle(pcd, ep_handle); + + if (!ep || !ep->desc) { -+ DWC_DEBUGPL(DBG_PCD, "%s, %d %s not enabled\n", __func__, -+ ep->dwc_ep.num, ep->dwc_ep.is_in ? "IN" : "OUT"); ++ DWC_DEBUGPL(DBG_PCD, "bad ep address\n"); + return -DWC_E_INVALID; + } + @@ -61659,13 +74139,37 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_otg_request_nuke(ep); + + dwc_otg_ep_deactivate(GET_CORE_IF(pcd), &ep->dwc_ep); -+ ep->desc = 0; ++ if (pcd->core_if->core_params->dev_out_nak) { ++ DWC_TIMER_CANCEL(pcd->core_if->ep_xfer_timer[ep->dwc_ep.num]); ++ pcd->core_if->ep_xfer_info[ep->dwc_ep.num].state = 0; ++ } ++ ep->desc = NULL; + ep->stopped = 1; + ++ gdfifocfg.d32 = ++ DWC_READ_REG32(&GET_CORE_IF(pcd)->core_global_regs->gdfifocfg); ++ gdfifocfgbase.d32 = gdfifocfg.d32 >> 16; ++ + if (ep->dwc_ep.is_in) { -+ dwc_otg_flush_tx_fifo(GET_CORE_IF(pcd), ep->dwc_ep.tx_fifo_num); ++ if (GET_CORE_IF(pcd)->en_multiple_tx_fifo) { ++ /* Flush the Tx FIFO */ ++ dwc_otg_flush_tx_fifo(GET_CORE_IF(pcd), ++ ep->dwc_ep.tx_fifo_num); ++ } + release_perio_tx_fifo(GET_CORE_IF(pcd), ep->dwc_ep.tx_fifo_num); + release_tx_fifo(GET_CORE_IF(pcd), ep->dwc_ep.tx_fifo_num); ++ if (GET_CORE_IF(pcd)->en_multiple_tx_fifo) { ++ /* Decreasing EPinfo Base Addr */ ++ dptxfsiz.d32 = ++ (DWC_READ_REG32 ++ (&GET_CORE_IF(pcd)-> ++ core_global_regs->dtxfsiz[ep->dwc_ep.tx_fifo_num-1]) >> 16); ++ gdfifocfg.b.epinfobase = gdfifocfgbase.d32 - dptxfsiz.d32; ++ if (GET_CORE_IF(pcd)->snpsid <= OTG_CORE_REV_2_94a) { ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gdfifocfg, ++ gdfifocfg.d32); ++ } ++ } + } + + /* Free DMA Descriptors */ @@ -61682,36 +74186,416 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + goto out_unlocked; + } + } -+ + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + -+ out_unlocked: ++out_unlocked: + DWC_DEBUGPL(DBG_PCD, "%d %s disabled\n", ep->dwc_ep.num, + ep->dwc_ep.is_in ? "IN" : "OUT"); + return 0; + +} + ++/******************************************************************************/ ++#ifdef DWC_UTE_PER_IO ++ ++/** ++ * Free the request and its extended parts ++ * ++ */ ++void dwc_pcd_xiso_ereq_free(dwc_otg_pcd_ep_t * ep, dwc_otg_pcd_request_t * req) ++{ ++ DWC_FREE(req->ext_req.per_io_frame_descs); ++ DWC_FREE(req); ++} ++ ++/** ++ * Start the next request in the endpoint's queue. ++ * ++ */ ++int dwc_otg_pcd_xiso_start_next_request(dwc_otg_pcd_t * pcd, ++ dwc_otg_pcd_ep_t * ep) ++{ ++ int i; ++ dwc_otg_pcd_request_t *req = NULL; ++ dwc_ep_t *dwcep = NULL; ++ struct dwc_iso_xreq_port *ereq = NULL; ++ struct dwc_iso_pkt_desc_port *ddesc_iso; ++ uint16_t nat; ++ depctl_data_t diepctl; ++ ++ dwcep = &ep->dwc_ep; ++ ++ if (dwcep->xiso_active_xfers > 0) { ++#if 0 //Disable this to decrease s/w overhead that is crucial for Isoc transfers ++ DWC_WARN("There are currently active transfers for EP%d \ ++ (active=%d; queued=%d)", dwcep->num, dwcep->xiso_active_xfers, ++ dwcep->xiso_queued_xfers); ++#endif ++ return 0; ++ } ++ ++ nat = UGETW(ep->desc->wMaxPacketSize); ++ nat = (nat >> 11) & 0x03; ++ ++ if (!DWC_CIRCLEQ_EMPTY(&ep->queue)) { ++ req = DWC_CIRCLEQ_FIRST(&ep->queue); ++ ereq = &req->ext_req; ++ ep->stopped = 0; ++ ++ /* Get the frame number */ ++ dwcep->xiso_frame_num = ++ dwc_otg_get_frame_number(GET_CORE_IF(pcd)); ++ DWC_DEBUG("FRM_NUM=%d", dwcep->xiso_frame_num); ++ ++ ddesc_iso = ereq->per_io_frame_descs; ++ ++ if (dwcep->is_in) { ++ /* Setup DMA Descriptor chain for IN Isoc request */ ++ for (i = 0; i < ereq->pio_pkt_count; i++) { ++ //if ((i % (nat + 1)) == 0) ++ if ( i > 0 ) ++ dwcep->xiso_frame_num = ++ (dwcep->xiso_bInterval + ++ dwcep->xiso_frame_num) & 0x3FFF; ++ dwcep->desc_addr[i].buf = ++ req->dma + ddesc_iso[i].offset; ++ dwcep->desc_addr[i].status.b_iso_in.txbytes = ++ ddesc_iso[i].length; ++ dwcep->desc_addr[i].status.b_iso_in.framenum = ++ dwcep->xiso_frame_num; ++ dwcep->desc_addr[i].status.b_iso_in.bs = ++ BS_HOST_READY; ++ dwcep->desc_addr[i].status.b_iso_in.txsts = 0; ++ dwcep->desc_addr[i].status.b_iso_in.sp = ++ (ddesc_iso[i].length % ++ dwcep->maxpacket) ? 1 : 0; ++ dwcep->desc_addr[i].status.b_iso_in.ioc = 0; ++ dwcep->desc_addr[i].status.b_iso_in.pid = nat + 1; ++ dwcep->desc_addr[i].status.b_iso_in.l = 0; ++ ++ /* Process the last descriptor */ ++ if (i == ereq->pio_pkt_count - 1) { ++ dwcep->desc_addr[i].status.b_iso_in.ioc = 1; ++ dwcep->desc_addr[i].status.b_iso_in.l = 1; ++ } ++ } ++ ++ /* Setup and start the transfer for this endpoint */ ++ dwcep->xiso_active_xfers++; ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->dev_if-> ++ in_ep_regs[dwcep->num]->diepdma, ++ dwcep->dma_desc_addr); ++ diepctl.d32 = 0; ++ diepctl.b.epena = 1; ++ diepctl.b.cnak = 1; ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->dev_if-> ++ in_ep_regs[dwcep->num]->diepctl, 0, ++ diepctl.d32); ++ } else { ++ /* Setup DMA Descriptor chain for OUT Isoc request */ ++ for (i = 0; i < ereq->pio_pkt_count; i++) { ++ //if ((i % (nat + 1)) == 0) ++ dwcep->xiso_frame_num = (dwcep->xiso_bInterval + ++ dwcep->xiso_frame_num) & 0x3FFF; ++ dwcep->desc_addr[i].buf = ++ req->dma + ddesc_iso[i].offset; ++ dwcep->desc_addr[i].status.b_iso_out.rxbytes = ++ ddesc_iso[i].length; ++ dwcep->desc_addr[i].status.b_iso_out.framenum = ++ dwcep->xiso_frame_num; ++ dwcep->desc_addr[i].status.b_iso_out.bs = ++ BS_HOST_READY; ++ dwcep->desc_addr[i].status.b_iso_out.rxsts = 0; ++ dwcep->desc_addr[i].status.b_iso_out.sp = ++ (ddesc_iso[i].length % ++ dwcep->maxpacket) ? 1 : 0; ++ dwcep->desc_addr[i].status.b_iso_out.ioc = 0; ++ dwcep->desc_addr[i].status.b_iso_out.pid = nat + 1; ++ dwcep->desc_addr[i].status.b_iso_out.l = 0; ++ ++ /* Process the last descriptor */ ++ if (i == ereq->pio_pkt_count - 1) { ++ dwcep->desc_addr[i].status.b_iso_out.ioc = 1; ++ dwcep->desc_addr[i].status.b_iso_out.l = 1; ++ } ++ } ++ ++ /* Setup and start the transfer for this endpoint */ ++ dwcep->xiso_active_xfers++; ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)-> ++ dev_if->out_ep_regs[dwcep->num]-> ++ doepdma, dwcep->dma_desc_addr); ++ diepctl.d32 = 0; ++ diepctl.b.epena = 1; ++ diepctl.b.cnak = 1; ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)-> ++ dev_if->out_ep_regs[dwcep->num]-> ++ doepctl, 0, diepctl.d32); ++ } ++ ++ } else { ++ ep->stopped = 1; ++ } ++ ++ return 0; ++} ++ ++/** ++ * - Remove the request from the queue ++ */ ++void complete_xiso_ep(dwc_otg_pcd_ep_t * ep) ++{ ++ dwc_otg_pcd_request_t *req = NULL; ++ struct dwc_iso_xreq_port *ereq = NULL; ++ struct dwc_iso_pkt_desc_port *ddesc_iso = NULL; ++ dwc_ep_t *dwcep = NULL; ++ int i; ++ ++ //DWC_DEBUG(); ++ dwcep = &ep->dwc_ep; ++ ++ /* Get the first pending request from the queue */ ++ if (!DWC_CIRCLEQ_EMPTY(&ep->queue)) { ++ req = DWC_CIRCLEQ_FIRST(&ep->queue); ++ if (!req) { ++ DWC_PRINTF("complete_ep 0x%p, req = NULL!\n", ep); ++ return; ++ } ++ dwcep->xiso_active_xfers--; ++ dwcep->xiso_queued_xfers--; ++ /* Remove this request from the queue */ ++ DWC_CIRCLEQ_REMOVE_INIT(&ep->queue, req, queue_entry); ++ } else { ++ DWC_PRINTF("complete_ep 0x%p, ep->queue empty!\n", ep); ++ return; ++ } ++ ++ ep->stopped = 1; ++ ereq = &req->ext_req; ++ ddesc_iso = ereq->per_io_frame_descs; ++ ++ if (dwcep->xiso_active_xfers < 0) { ++ DWC_WARN("EP#%d (xiso_active_xfers=%d)", dwcep->num, ++ dwcep->xiso_active_xfers); ++ } ++ ++ /* Fill the Isoc descs of portable extended req from dma descriptors */ ++ for (i = 0; i < ereq->pio_pkt_count; i++) { ++ if (dwcep->is_in) { /* IN endpoints */ ++ ddesc_iso[i].actual_length = ddesc_iso[i].length - ++ dwcep->desc_addr[i].status.b_iso_in.txbytes; ++ ddesc_iso[i].status = ++ dwcep->desc_addr[i].status.b_iso_in.txsts; ++ } else { /* OUT endpoints */ ++ ddesc_iso[i].actual_length = ddesc_iso[i].length - ++ dwcep->desc_addr[i].status.b_iso_out.rxbytes; ++ ddesc_iso[i].status = ++ dwcep->desc_addr[i].status.b_iso_out.rxsts; ++ } ++ } ++ ++ DWC_SPINUNLOCK(ep->pcd->lock); ++ ++ /* Call the completion function in the non-portable logic */ ++ ep->pcd->fops->xisoc_complete(ep->pcd, ep->priv, req->priv, 0, ++ &req->ext_req); ++ ++ DWC_SPINLOCK(ep->pcd->lock); ++ ++ /* Free the request - specific freeing needed for extended request object */ ++ dwc_pcd_xiso_ereq_free(ep, req); ++ ++ /* Start the next request */ ++ dwc_otg_pcd_xiso_start_next_request(ep->pcd, ep); ++ ++ return; ++} ++ ++/** ++ * Create and initialize the Isoc pkt descriptors of the extended request. ++ * ++ */ ++static int dwc_otg_pcd_xiso_create_pkt_descs(dwc_otg_pcd_request_t * req, ++ void *ereq_nonport, ++ int atomic_alloc) ++{ ++ struct dwc_iso_xreq_port *ereq = NULL; ++ struct dwc_iso_xreq_port *req_mapped = NULL; ++ struct dwc_iso_pkt_desc_port *ipds = NULL; /* To be created in this function */ ++ uint32_t pkt_count; ++ int i; ++ ++ ereq = &req->ext_req; ++ req_mapped = (struct dwc_iso_xreq_port *)ereq_nonport; ++ pkt_count = req_mapped->pio_pkt_count; ++ ++ /* Create the isoc descs */ ++ if (atomic_alloc) { ++ ipds = DWC_ALLOC_ATOMIC(sizeof(*ipds) * pkt_count); ++ } else { ++ ipds = DWC_ALLOC(sizeof(*ipds) * pkt_count); ++ } ++ ++ if (!ipds) { ++ DWC_ERROR("Failed to allocate isoc descriptors"); ++ return -DWC_E_NO_MEMORY; ++ } ++ ++ /* Initialize the extended request fields */ ++ ereq->per_io_frame_descs = ipds; ++ ereq->error_count = 0; ++ ereq->pio_alloc_pkt_count = pkt_count; ++ ereq->pio_pkt_count = pkt_count; ++ ereq->tr_sub_flags = req_mapped->tr_sub_flags; ++ ++ /* Init the Isoc descriptors */ ++ for (i = 0; i < pkt_count; i++) { ++ ipds[i].length = req_mapped->per_io_frame_descs[i].length; ++ ipds[i].offset = req_mapped->per_io_frame_descs[i].offset; ++ ipds[i].status = req_mapped->per_io_frame_descs[i].status; /* 0 */ ++ ipds[i].actual_length = ++ req_mapped->per_io_frame_descs[i].actual_length; ++ } ++ ++ return 0; ++} ++ ++static void prn_ext_request(struct dwc_iso_xreq_port *ereq) ++{ ++ struct dwc_iso_pkt_desc_port *xfd = NULL; ++ int i; ++ ++ DWC_DEBUG("per_io_frame_descs=%p", ereq->per_io_frame_descs); ++ DWC_DEBUG("tr_sub_flags=%d", ereq->tr_sub_flags); ++ DWC_DEBUG("error_count=%d", ereq->error_count); ++ DWC_DEBUG("pio_alloc_pkt_count=%d", ereq->pio_alloc_pkt_count); ++ DWC_DEBUG("pio_pkt_count=%d", ereq->pio_pkt_count); ++ DWC_DEBUG("res=%d", ereq->res); ++ ++ for (i = 0; i < ereq->pio_pkt_count; i++) { ++ xfd = &ereq->per_io_frame_descs[0]; ++ DWC_DEBUG("FD #%d", i); ++ ++ DWC_DEBUG("xfd->actual_length=%d", xfd->actual_length); ++ DWC_DEBUG("xfd->length=%d", xfd->length); ++ DWC_DEBUG("xfd->offset=%d", xfd->offset); ++ DWC_DEBUG("xfd->status=%d", xfd->status); ++ } ++} ++ ++/** ++ * ++ */ ++int dwc_otg_pcd_xiso_ep_queue(dwc_otg_pcd_t * pcd, void *ep_handle, ++ uint8_t * buf, dwc_dma_t dma_buf, uint32_t buflen, ++ int zero, void *req_handle, int atomic_alloc, ++ void *ereq_nonport) ++{ ++ dwc_otg_pcd_request_t *req = NULL; ++ dwc_otg_pcd_ep_t *ep; ++ dwc_irqflags_t flags; ++ int res; ++ ++ ep = get_ep_from_handle(pcd, ep_handle); ++ if (!ep) { ++ DWC_WARN("bad ep\n"); ++ return -DWC_E_INVALID; ++ } ++ ++ /* We support this extension only for DDMA mode */ ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) ++ if (!GET_CORE_IF(pcd)->dma_desc_enable) ++ return -DWC_E_INVALID; ++ ++ /* Create a dwc_otg_pcd_request_t object */ ++ if (atomic_alloc) { ++ req = DWC_ALLOC_ATOMIC(sizeof(*req)); ++ } else { ++ req = DWC_ALLOC(sizeof(*req)); ++ } ++ ++ if (!req) { ++ return -DWC_E_NO_MEMORY; ++ } ++ ++ /* Create the Isoc descs for this request which shall be the exact match ++ * of the structure sent to us from the non-portable logic */ ++ res = ++ dwc_otg_pcd_xiso_create_pkt_descs(req, ereq_nonport, atomic_alloc); ++ if (res) { ++ DWC_WARN("Failed to init the Isoc descriptors"); ++ DWC_FREE(req); ++ return res; ++ } ++ ++ DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); ++ ++ DWC_CIRCLEQ_INIT_ENTRY(req, queue_entry); ++ req->buf = buf; ++ req->dma = dma_buf; ++ req->length = buflen; ++ req->sent_zlp = zero; ++ req->priv = req_handle; ++ ++ //DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); ++ ep->dwc_ep.dma_addr = dma_buf; ++ ep->dwc_ep.start_xfer_buff = buf; ++ ep->dwc_ep.xfer_buff = buf; ++ ep->dwc_ep.xfer_len = 0; ++ ep->dwc_ep.xfer_count = 0; ++ ep->dwc_ep.sent_zlp = 0; ++ ep->dwc_ep.total_len = buflen; ++ ++ /* Add this request to the tail */ ++ DWC_CIRCLEQ_INSERT_TAIL(&ep->queue, req, queue_entry); ++ ep->dwc_ep.xiso_queued_xfers++; ++ ++//DWC_DEBUG("CP_0"); ++//DWC_DEBUG("req->ext_req.tr_sub_flags=%d", req->ext_req.tr_sub_flags); ++//prn_ext_request((struct dwc_iso_xreq_port *) ereq_nonport); ++//prn_ext_request(&req->ext_req); ++ ++ //DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); ++ ++ /* If the req->status == ASAP then check if there is any active transfer ++ * for this endpoint. If no active transfers, then get the first entry ++ * from the queue and start that transfer ++ */ ++ if (req->ext_req.tr_sub_flags == DWC_EREQ_TF_ASAP) { ++ res = dwc_otg_pcd_xiso_start_next_request(pcd, ep); ++ if (res) { ++ DWC_WARN("Failed to start the next Isoc transfer"); ++ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); ++ DWC_FREE(req); ++ return res; ++ } ++ } ++ ++ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); ++ return 0; ++} ++ ++#endif ++/* END ifdef DWC_UTE_PER_IO ***************************************************/ +int dwc_otg_pcd_ep_queue(dwc_otg_pcd_t * pcd, void *ep_handle, + uint8_t * buf, dwc_dma_t dma_buf, uint32_t buflen, + int zero, void *req_handle, int atomic_alloc) +{ -+ int prevented = 0; -+ uint64_t flags; ++ dwc_irqflags_t flags; + dwc_otg_pcd_request_t *req; + dwc_otg_pcd_ep_t *ep; + uint32_t max_transfer; + + ep = get_ep_from_handle(pcd, ep_handle); -+ if ((!ep->desc && ep->dwc_ep.num != 0)) { ++ if (!ep || (!ep->desc && ep->dwc_ep.num != 0)) { + DWC_WARN("bad ep\n"); + return -DWC_E_INVALID; + } + + if (atomic_alloc) { -+ req = dwc_alloc_atomic(sizeof(*req)); ++ req = DWC_ALLOC_ATOMIC(sizeof(*req)); + } else { -+ req = dwc_alloc(sizeof(*req)); ++ req = DWC_ALLOC(sizeof(*req)); + } + + if (!req) { @@ -61730,10 +74614,41 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + req->length = buflen; + req->sent_zlp = zero; + req->priv = req_handle; -+ ++ req->dw_align_buf = NULL; ++ if ((dma_buf & 0x3) && GET_CORE_IF(pcd)->dma_enable ++ && !GET_CORE_IF(pcd)->dma_desc_enable) ++ req->dw_align_buf = DWC_DMA_ALLOC(buflen, ++ &req->dw_align_buf_dma); + DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); + + /* ++ * After adding request to the queue for IN ISOC wait for In Token Received ++ * when TX FIFO is empty interrupt and for OUT ISOC wait for OUT Token ++ * Received when EP is disabled interrupt to obtain starting microframe ++ * (odd/even) start transfer ++ */ ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { ++ if (req != 0) { ++ depctl_data_t depctl = {.d32 = ++ DWC_READ_REG32(&pcd->core_if->dev_if-> ++ in_ep_regs[ep->dwc_ep.num]-> ++ diepctl) }; ++ ++pcd->request_pending; ++ ++ DWC_CIRCLEQ_INSERT_TAIL(&ep->queue, req, queue_entry); ++ if (ep->dwc_ep.is_in) { ++ depctl.b.cnak = 1; ++ DWC_WRITE_REG32(&pcd->core_if->dev_if-> ++ in_ep_regs[ep->dwc_ep.num]-> ++ diepctl, depctl.d32); ++ } ++ ++ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); ++ } ++ return 0; ++ } ++ ++ /* + * For EP0 IN without premature status, zlp is required? + */ + if (ep->dwc_ep.num == 0 && ep->dwc_ep.is_in) { @@ -61803,53 +74718,65 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + ep->dwc_ep.cfi_req_len = buflen; + pcd->cfi->ops.build_descriptors(pcd->cfi, pcd, + ep, req); -+ } else { ++ } else { +#endif + max_transfer = + GET_CORE_IF(ep->pcd)->core_params-> + max_transfer_size; + -+ /* Setup and start the Transfer */ -+ ep->dwc_ep.dma_addr = dma_buf; -+ ep->dwc_ep.start_xfer_buff = buf; -+ ep->dwc_ep.xfer_buff = buf; -+ ep->dwc_ep.xfer_len = 0; -+ ep->dwc_ep.xfer_count = 0; -+ ep->dwc_ep.sent_zlp = 0; -+ ep->dwc_ep.total_len = buflen; ++ /* Setup and start the Transfer */ ++ if (req->dw_align_buf){ ++ if (ep->dwc_ep.is_in) ++ dwc_memcpy(req->dw_align_buf, ++ buf, buflen); ++ ep->dwc_ep.dma_addr = ++ req->dw_align_buf_dma; ++ ep->dwc_ep.start_xfer_buff = ++ req->dw_align_buf; ++ ep->dwc_ep.xfer_buff = ++ req->dw_align_buf; ++ } else { ++ ep->dwc_ep.dma_addr = dma_buf; ++ ep->dwc_ep.start_xfer_buff = buf; ++ ep->dwc_ep.xfer_buff = buf; ++ } ++ ep->dwc_ep.xfer_len = 0; ++ ep->dwc_ep.xfer_count = 0; ++ ep->dwc_ep.sent_zlp = 0; ++ ep->dwc_ep.total_len = buflen; + -+ ep->dwc_ep.maxxfer = max_transfer; -+ if (GET_CORE_IF(pcd)->dma_desc_enable) { ++ ep->dwc_ep.maxxfer = max_transfer; ++ if (GET_CORE_IF(pcd)->dma_desc_enable) { + uint32_t out_max_xfer = + DDMA_MAX_TRANSFER_SIZE - + (DDMA_MAX_TRANSFER_SIZE % 4); -+ if (ep->dwc_ep.is_in) { -+ if (ep->dwc_ep.maxxfer > -+ DDMA_MAX_TRANSFER_SIZE) { -+ ep->dwc_ep.maxxfer = -+ DDMA_MAX_TRANSFER_SIZE; -+ } -+ } else { ++ if (ep->dwc_ep.is_in) { ++ if (ep->dwc_ep.maxxfer > ++ DDMA_MAX_TRANSFER_SIZE) { ++ ep->dwc_ep.maxxfer = ++ DDMA_MAX_TRANSFER_SIZE; ++ } ++ } else { + if (ep->dwc_ep.maxxfer > + out_max_xfer) { -+ ep->dwc_ep.maxxfer = -+ out_max_xfer; ++ ep->dwc_ep.maxxfer = ++ out_max_xfer; ++ } + } + } -+ } -+ if (ep->dwc_ep.maxxfer < ep->dwc_ep.total_len) { -+ ep->dwc_ep.maxxfer -= ++ if (ep->dwc_ep.maxxfer < ep->dwc_ep.total_len) { ++ ep->dwc_ep.maxxfer -= + (ep->dwc_ep.maxxfer % + ep->dwc_ep.maxpacket); -+ } ++ } + -+ if (zero) { -+ if ((ep->dwc_ep.total_len % ++ if (zero) { ++ if ((ep->dwc_ep.total_len % + ep->dwc_ep.maxpacket == 0) + && (ep->dwc_ep.total_len != 0)) { -+ ep->dwc_ep.sent_zlp = 1; ++ ep->dwc_ep.sent_zlp = 1; ++ } + } -+ } +#ifdef DWC_UTE_CFI + } +#endif @@ -61858,7 +74785,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + } + } + -+ if ((req != 0) || prevented) { ++ if (req != 0) { + ++pcd->request_pending; + DWC_CIRCLEQ_INSERT_TAIL(&ep->queue, req, queue_entry); + if (ep->dwc_ep.is_in && ep->stopped @@ -61867,32 +74794,32 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + diepmsk_data_t diepmsk = {.d32 = 0 }; + diepmsk.b.intktxfemp = 1; + if (GET_CORE_IF(pcd)->multiproc_int_enable) { -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->dev_if-> -+ dev_global_regs-> -+ diepeachintmsk[ep->dwc_ep.num], -+ 0, diepmsk.d32); -+ } else { -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->dev_if-> -+ dev_global_regs->diepmsk, 0, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)-> ++ dev_if->dev_global_regs->diepeachintmsk ++ [ep->dwc_ep.num], 0, + diepmsk.d32); ++ } else { ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)-> ++ dev_if->dev_global_regs-> ++ diepmsk, 0, diepmsk.d32); + } + + } + } -+ + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + + return 0; +} ++ +int dwc_otg_pcd_ep_dequeue(dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle) +{ -+ uint64_t flags; ++ dwc_irqflags_t flags; + dwc_otg_pcd_request_t *req; + dwc_otg_pcd_ep_t *ep; + + ep = get_ep_from_handle(pcd, ep_handle); -+ if (!ep->desc && ep->dwc_ep.num != 0) { ++ if (!ep || (!ep->desc && ep->dwc_ep.num != 0)) { + DWC_WARN("bad argument\n"); + return -DWC_E_INVALID; + } @@ -61914,7 +74841,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + if (!DWC_CIRCLEQ_EMPTY_ENTRY(req, queue_entry)) { + dwc_otg_request_done(ep, req, -DWC_E_RESTART); + } else { -+ req = 0; ++ req = NULL; + } + + DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); @@ -61935,7 +74862,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +int dwc_otg_pcd_ep_wedge(dwc_otg_pcd_t * pcd, void *ep_handle) +{ + dwc_otg_pcd_ep_t *ep; -+ uint64_t flags; ++ dwc_irqflags_t flags; + int retval = 0; + + ep = get_ep_from_handle(pcd, ep_handle); @@ -61958,12 +74885,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + fifosize_data_t txfifosize; + + txfifosize.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->core_global_regs-> -+ dptxfsiz_dieptxf[ep->dwc_ep. -+ tx_fifo_num]); ++ DWC_READ_REG32(&GET_CORE_IF(pcd)-> ++ core_global_regs->dtxfsiz[ep->dwc_ep. ++ tx_fifo_num]); + txstatus.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->dev_if-> -+ in_ep_regs[ep->dwc_ep.num]->dtxfsts); ++ DWC_READ_REG32(&GET_CORE_IF(pcd)-> ++ dev_if->in_ep_regs[ep->dwc_ep.num]-> ++ dtxfsts); + + if (txstatus.b.txfspcavail < txfifosize.b.depth) { + DWC_WARN("%s() Data In Tx Fifo\n", __func__); @@ -61995,12 +74923,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +int dwc_otg_pcd_ep_halt(dwc_otg_pcd_t * pcd, void *ep_handle, int value) +{ + dwc_otg_pcd_ep_t *ep; -+ uint64_t flags; ++ dwc_irqflags_t flags; + int retval = 0; + + ep = get_ep_from_handle(pcd, ep_handle); + -+ if ((!ep->desc && ep != &pcd->ep0) || ++ if (!ep || (!ep->desc && ep != &pcd->ep0) || + (ep->desc && (ep->desc->bmAttributes == UE_ISOCHRONOUS))) { + DWC_WARN("%s, bad ep\n", __func__); + return -DWC_E_INVALID; @@ -62019,11 +74947,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + fifosize_data_t txfifosize; + + txfifosize.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->core_global_regs-> -+ dptxfsiz_dieptxf[ep->dwc_ep. -+ tx_fifo_num]); ++ DWC_READ_REG32(&GET_CORE_IF(pcd)->core_global_regs-> ++ dtxfsiz[ep->dwc_ep.tx_fifo_num]); + txstatus.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->dev_if-> ++ DWC_READ_REG32(&GET_CORE_IF(pcd)->dev_if-> + in_ep_regs[ep->dwc_ep.num]->dtxfsts); + + if (txstatus.b.txfspcavail < txfifosize.b.depth) { @@ -62066,19 +74993,51 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + dsts_data_t dsts; + -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + if (!dsts.b.suspsts) { + DWC_WARN("Remote wakeup while is not in suspend state\n"); + } + /* Check if DEVICE_REMOTE_WAKEUP feature enabled */ + if (pcd->remote_wakeup_enable) { + if (set) { ++ ++ if (core_if->adp_enable) { ++ gpwrdn_data_t gpwrdn; ++ ++ dwc_otg_adp_probe_stop(core_if); ++ ++ /* Mask SRP detected interrupt from Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.srp_det_msk = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gpwrdn, ++ gpwrdn.d32, 0); ++ ++ /* Disable Power Down Logic */ ++ gpwrdn.d32 = 0; ++ gpwrdn.b.pmuactv = 1; ++ DWC_MODIFY_REG32(&core_if-> ++ core_global_regs->gpwrdn, ++ gpwrdn.d32, 0); ++ ++ /* ++ * Initialize the Core for Device mode. ++ */ ++ core_if->op_state = B_PERIPHERAL; ++ dwc_otg_core_init(core_if); ++ dwc_otg_enable_global_interrupts(core_if); ++ cil_pcd_start(core_if); ++ ++ dwc_otg_initiate_srp(core_if); ++ } ++ + dctl.b.rmtwkupsig = 1; -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + dctl, 0, dctl.d32); + DWC_DEBUGPL(DBG_PCD, "Set Remote Wakeup\n"); ++ + dwc_mdelay(2); -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + dctl, dctl.d32, 0); + DWC_DEBUGPL(DBG_PCD, "Clear Remote Wakeup\n"); + } @@ -62096,7 +75055,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + glpmcfg_data_t lpmcfg; + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + + /* Check if we are in L1 state */ + if (!lpmcfg.b.prt_sleep_sts) { @@ -62116,10 +75075,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + return; + } + -+ lpmcfg.d32 = dwc_read_reg32(&core_if->core_global_regs->glpmcfg); ++ lpmcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->glpmcfg); + lpmcfg.b.en_utmi_sleep = 0; + lpmcfg.b.hird_thres &= (~(1 << 4)); -+ dwc_write_reg32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->glpmcfg, lpmcfg.d32); + + if (set) { + dctl_data_t dctl = {.d32 = 0 }; @@ -62127,7 +75086,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + /* Set RmtWkUpSig bit to start remote wakup signaling. + * Hardware will automatically clear this bit. + */ -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dctl, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, + 0, dctl.d32); + DWC_DEBUGPL(DBG_PCD, "Set Remote Wakeup\n"); + } @@ -62141,7 +75100,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +void dwc_otg_pcd_remote_wakeup(dwc_otg_pcd_t * pcd, int set) +{ + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); ++ dwc_irqflags_t flags; + if (dwc_otg_is_device_mode(core_if)) { ++ DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); +#ifdef CONFIG_USB_DWC_OTG_LPM + if (core_if->lx_state == DWC_OTG_L1) { + dwc_otg_pcd_rem_wkup_from_sleep(pcd, set); @@ -62151,17 +75112,34 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 +#ifdef CONFIG_USB_DWC_OTG_LPM + } +#endif ++ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + } + return; +} + ++void dwc_otg_pcd_disconnect_us(dwc_otg_pcd_t * pcd, int no_of_usecs) ++{ ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); ++ dctl_data_t dctl = { 0 }; ++ ++ if (dwc_otg_is_device_mode(core_if)) { ++ dctl.b.sftdiscon = 1; ++ DWC_PRINTF("Soft disconnect for %d useconds\n",no_of_usecs); ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32); ++ dwc_udelay(no_of_usecs); ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32,0); ++ ++ } else{ ++ DWC_PRINTF("NOT SUPPORTED IN HOST MODE\n"); ++ } ++ return; ++ ++} ++ +int dwc_otg_pcd_wakeup(dwc_otg_pcd_t * pcd) +{ + dsts_data_t dsts; + gotgctl_data_t gotgctl; -+ uint64_t flags; -+ -+ DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); + + /* + * This function starts the Protocol if no session is in progress. If @@ -62171,13 +75149,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + + /* Check if valid session */ + gotgctl.d32 = -+ dwc_read_reg32(&(GET_CORE_IF(pcd)->core_global_regs->gotgctl)); ++ DWC_READ_REG32(&(GET_CORE_IF(pcd)->core_global_regs->gotgctl)); + if (gotgctl.b.bsesvld) { + /* Check if suspend state */ + dsts.d32 = -+ dwc_read_reg32(& -+ (GET_CORE_IF(pcd)->dev_if->dev_global_regs-> -+ dsts)); ++ DWC_READ_REG32(& ++ (GET_CORE_IF(pcd)->dev_if-> ++ dev_global_regs->dsts)); + if (dsts.b.suspsts) { + dwc_otg_pcd_remote_wakeup(pcd, 1); + } @@ -62185,7 +75163,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + dwc_otg_pcd_initiate_srp(pcd); + } + -+ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); + return 0; + +} @@ -62196,33 +75173,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + * + * @param pcd the pcd structure. + */ -+void dwc_otg_pcd_start_srp_timer(dwc_otg_pcd_t * pcd) -+{ -+ GET_CORE_IF(pcd)->srp_timer_started = 1; -+ DWC_TIMER_SCHEDULE(pcd->srp_timer, 6000 /* 6 secs */ ); -+} -+ +void dwc_otg_pcd_initiate_srp(dwc_otg_pcd_t * pcd) +{ -+ uint32_t *addr = -+ (uint32_t *) & (GET_CORE_IF(pcd)->core_global_regs->gotgctl); -+ gotgctl_data_t mem; -+ gotgctl_data_t val; -+ -+ val.d32 = dwc_read_reg32(addr); -+ if (val.b.sesreq) { -+ DWC_ERROR("Session Request Already active!\n"); -+ return; -+ } -+ -+ DWC_INFO("Session Request Initated\n"); //NOTICE -+ mem.d32 = dwc_read_reg32(addr); -+ mem.b.sesreq = 1; -+ dwc_write_reg32(addr, mem.d32); -+ -+ /* Start the SRP timer */ -+ dwc_otg_pcd_start_srp_timer(pcd); -+ return; ++ dwc_irqflags_t flags; ++ DWC_SPINLOCK_IRQSAVE(pcd->lock, &flags); ++ dwc_otg_initiate_srp(GET_CORE_IF(pcd)); ++ DWC_SPINUNLOCK_IRQRESTORE(pcd->lock, flags); +} + +int dwc_otg_pcd_get_frame_number(dwc_otg_pcd_t * pcd) @@ -62255,16 +75211,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-rpi-bootc-3 + return pcd->remote_wakeup_enable; +} + -+#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2012-07-15 20:29:19.046082944 +0200 -@@ -0,0 +1,216 @@ ++#endif /* DWC_HOST_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_pcd.h b/drivers/usb/host/dwc_otg/dwc_otg_pcd.h +new file mode 100644 +index 0000000..8ef7ba6 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_pcd.h +@@ -0,0 +1,266 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $ -+ * $Revision: #39 $ -+ * $Date: 2008/12/16 $ -+ * $Change: 1153731 $ ++ * $Revision: #48 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -62296,6 +75254,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 +#if !defined(__DWC_PCD_H__) +#define __DWC_PCD_H__ + ++#include "dwc_otg_os_dep.h" +#include "usb.h" +#include "dwc_otg_cil.h" +#include "dwc_otg_pcd_if.h" @@ -62308,7 +75267,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + * the Perpherial Contoller Driver (PCD). + * + * The Peripheral Controller Driver (PCD) for Linux will implement the -+ * Gadget API, so that the existing Gadget drivers can be used. For ++ * Gadget API, so that the existing Gadget drivers can be used. For + * the Mass Storage Function driver the File-backed USB Storage Gadget + * (FBS) driver will be used. The FBS driver supports the + * Control-Bulk (CB), Control-Bulk-Interrupt (CBI), and Bulk-Only @@ -62316,12 +75275,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + * + */ + ++/** Invalid DMA Address */ ++#define DWC_DMA_ADDR_INVALID (~(dwc_dma_t)0) ++ +/** Max Transfer size for any EP */ +#define DDMA_MAX_TRANSFER_SIZE 65535 + -+/** Max DMA Descriptor count for any EP */ -+#define MAX_DMA_DESC_CNT 64 -+ +/** + * Get the pointer to the core_if from the pcd pointer. + */ @@ -62348,6 +75307,42 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + */ +typedef struct usb_iso_request dwc_otg_pcd_iso_request_t; + ++#ifdef DWC_UTE_PER_IO ++ ++/** ++ * This shall be the exact analogy of the same type structure defined in the ++ * usb_gadget.h. Each descriptor contains ++ */ ++struct dwc_iso_pkt_desc_port { ++ uint32_t offset; ++ uint32_t length; /* expected length */ ++ uint32_t actual_length; ++ uint32_t status; ++}; ++ ++struct dwc_iso_xreq_port { ++ /** transfer/submission flag */ ++ uint32_t tr_sub_flags; ++ /** Start the request ASAP */ ++#define DWC_EREQ_TF_ASAP 0x00000002 ++ /** Just enqueue the request w/o initiating a transfer */ ++#define DWC_EREQ_TF_ENQUEUE 0x00000004 ++ ++ /** ++ * count of ISO packets attached to this request - shall ++ * not exceed the pio_alloc_pkt_count ++ */ ++ uint32_t pio_pkt_count; ++ /** count of ISO packets allocated for this request */ ++ uint32_t pio_alloc_pkt_count; ++ /** number of ISO packet errors */ ++ uint32_t error_count; ++ /** reserved for future extension */ ++ uint32_t res; ++ /** Will be allocated and freed in the UTE gadget and based on the CFC value */ ++ struct dwc_iso_pkt_desc_port *per_io_frame_descs; ++}; ++#endif +/** DWC_otg request structure. + * This structure is a list of requests. + */ @@ -62358,8 +75353,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + uint32_t length; + uint32_t actual; + unsigned sent_zlp:1; ++ /** ++ * Used instead of original buffer if ++ * it(physical address) is not dword-aligned. ++ **/ ++ uint8_t *dw_align_buf; ++ dwc_dma_t dw_align_buf_dma; + + DWC_CIRCLEQ_ENTRY(dwc_otg_pcd_request) queue_entry; ++#ifdef DWC_UTE_PER_IO ++ struct dwc_iso_xreq_port ext_req; ++ //void *priv_ereq_nport; /* */ ++#endif +} dwc_otg_pcd_request_t; + +DWC_CIRCLEQ_HEAD(req_list, dwc_otg_pcd_request); @@ -62398,6 +75403,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + */ +struct dwc_otg_pcd { + const struct dwc_otg_pcd_function_ops *fops; ++ /** The DWC otg device pointer */ ++ struct dwc_otg_device *otg_dev; + /** Core Interface */ + dwc_otg_core_if_t *core_if; + /** State of EP0 */ @@ -62428,6 +75435,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + + dwc_dma_t setup_pkt_dma_handle; + ++ /* Additional buffer and flag for CTRL_WR premature case */ ++ uint8_t *backup_buf; ++ unsigned data_terminated; ++ + /** 2-byte dma buffer used to return status from GET_STATUS */ + uint16_t *status_buf; + dwc_dma_t status_buf_dma_handle; @@ -62442,9 +75453,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + /** number of valid EPs in the above array. */ +// unsigned num_eps : 4; + dwc_spinlock_t *lock; -+ /** Timer for SRP. If it expires before SRP is successful -+ * clear the SRP. */ -+ dwc_timer_t *srp_timer; + + /** Tasklet to defer starting of TEST mode transmissions until + * Status Phase has been completed. @@ -62457,7 +75465,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + /** The test mode to enter when the tasklet is executed. */ + unsigned test_mode; + /** The cfi_api structure that implements most of the CFI API -+ * and OTG specific core configuration functionality ++ * and OTG specific core configuration functionality + */ +#ifdef DWC_UTE_CFI + struct cfiobject *cfi; @@ -62475,16 +75483,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-rpi-bootc-3 + +extern void do_test_mode(void *data); +#endif -+#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2012-07-15 20:29:19.179085409 +0200 -@@ -0,0 +1,333 @@ ++#endif /* DWC_HOST_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h b/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h +new file mode 100644 +index 0000000..c8d2e0e +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h +@@ -0,0 +1,360 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $ -+ * $Revision: #6 $ -+ * $Date: 2009/04/03 $ -+ * $Change: 1225059 $ ++ * $Revision: #11 $ ++ * $Date: 2011/10/26 $ ++ * $Change: 1873028 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -62517,10 +75527,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot +#if !defined(__DWC_PCD_IF_H__) +#define __DWC_PCD_IF_H__ + -+#include "dwc_os.h" ++//#include "dwc_os.h" +#include "dwc_otg_core_if.h" + -+/** @file ++/** @file + * This file defines DWC_OTG PCD Core API. + */ + @@ -62585,6 +75595,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot + +typedef int (*cfi_setup_cb_t) (dwc_otg_pcd_t * pcd, void *ctrl_req_bytes); + ++/** ++ * ++ * @param ep_handle Void pointer to the usb_ep structure ++ * @param ereq_port Pointer to the extended request structure created in the ++ * portable part. ++ */ ++typedef int (*xiso_completion_cb_t) (dwc_otg_pcd_t * pcd, void *ep_handle, ++ void *req_handle, int32_t status, ++ void *ereq_port); +/** Function Driver Ops Data Structure */ +struct dwc_otg_pcd_function_ops { + dwc_connect_cb_t connect; @@ -62598,6 +75617,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot + dwc_reset_cb_t reset; + dwc_hnp_params_changed_cb_t hnp_changed; + cfi_setup_cb_t cfi_setup; ++#ifdef DWC_UTE_PER_IO ++ xiso_completion_cb_t xisoc_complete; ++#endif +}; +/** @} */ + @@ -62638,15 +75660,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot + * + * @param pcd The PCD + * @param ep_desc Endpoint descriptor -+ * @param ep_handle Handle on endpoint, that will be used to identify endpoint. ++ * @param usb_ep Handle on endpoint, that will be used to identify endpoint. + */ +extern int dwc_otg_pcd_ep_enable(dwc_otg_pcd_t * pcd, -+ const uint8_t * ep_desc, void *ep_handle); ++ const uint8_t * ep_desc, void *usb_ep); + +/** Disable the endpoint referenced by ep_handle. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. -+ * Returns -DWC_E_SHUTDOWN if any other error ocurred. ++ * Returns -DWC_E_SHUTDOWN if any other error occurred. + * Returns 0 on success. */ +extern int dwc_otg_pcd_ep_disable(dwc_otg_pcd_t * pcd, void *ep_handle); + @@ -62672,6 +75694,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot + uint8_t * buf, dwc_dma_t dma_buf, + uint32_t buflen, int zero, void *req_handle, + int atomic_alloc); ++#ifdef DWC_UTE_PER_IO ++/** ++ * ++ * @param ereq_nonport Pointer to the extended request part of the ++ * usb_request structure defined in usb_gadget.h file. ++ */ ++extern int dwc_otg_pcd_xiso_ep_queue(dwc_otg_pcd_t * pcd, void *ep_handle, ++ uint8_t * buf, dwc_dma_t dma_buf, ++ uint32_t buflen, int zero, ++ void *req_handle, int atomic_alloc, ++ void *ereq_nonport); ++ ++#endif + +/** De-queue the specified data transfer that has not yet completed. + * @@ -62789,6 +75824,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot +/** Starts remote wakeup signaling. */ +extern void dwc_otg_pcd_remote_wakeup(dwc_otg_pcd_t * pcd, int set); + ++/** Starts micorsecond soft disconnect. */ ++extern void dwc_otg_pcd_disconnect_us(dwc_otg_pcd_t * pcd, int no_of_usecs); +/** This function returns whether device is dualspeed.*/ +extern uint32_t dwc_otg_pcd_is_dualspeed(dwc_otg_pcd_t * pcd); + @@ -62813,15 +75850,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-rpi-boot +#endif /* __DWC_PCD_IF_H__ */ + +#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2012-07-15 20:29:19.078083509 +0200 -@@ -0,0 +1,4077 @@ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c b/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c +new file mode 100644 +index 0000000..27061d3 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c +@@ -0,0 +1,5147 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $ -+ * $Revision: #93 $ -+ * $Date: 2009/04/02 $ -+ * $Change: 1224216 $ ++ * $Revision: #116 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -62857,6 +75896,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#include "dwc_otg_cfi.h" +#endif + ++#ifdef DWC_UTE_PER_IO ++extern void complete_xiso_ep(dwc_otg_pcd_ep_t * ep); ++#endif +//#define PRINT_CFI_DMA_DESCS + +#define DEBUG_EP0 @@ -62927,6 +75969,40 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#endif +} + ++/** ++ * This function calculate the size of the payload in the memory ++ * for out endpoints and prints size for debug purposes(used in ++ * 2.93a DevOutNak feature). ++ */ ++static inline void print_memory_payload(dwc_otg_pcd_t * pcd, dwc_ep_t * ep) ++{ ++#ifdef DEBUG ++ deptsiz_data_t deptsiz_init = {.d32 = 0 }; ++ deptsiz_data_t deptsiz_updt = {.d32 = 0 }; ++ int pack_num; ++ unsigned payload; ++ ++ deptsiz_init.d32 = pcd->core_if->start_doeptsiz_val[ep->num]; ++ deptsiz_updt.d32 = ++ DWC_READ_REG32(&pcd->core_if->dev_if-> ++ out_ep_regs[ep->num]->doeptsiz); ++ /* Payload will be */ ++ payload = deptsiz_init.b.xfersize - deptsiz_updt.b.xfersize; ++ /* Packet count is decremented every time a packet ++ * is written to the RxFIFO not in to the external memory ++ * So, if payload == 0, then it means no packet was sent to ext memory*/ ++ pack_num = (!payload) ? 0 : (deptsiz_init.b.pktcnt - deptsiz_updt.b.pktcnt); ++ DWC_DEBUGPL(DBG_PCDV, ++ "Payload for EP%d-%s\n", ++ ep->num, (ep->is_in ? "IN" : "OUT")); ++ DWC_DEBUGPL(DBG_PCDV, ++ "Number of transfered bytes = 0x%08x\n", payload); ++ DWC_DEBUGPL(DBG_PCDV, ++ "Number of transfered packets = %d\n", pack_num); ++#endif ++} ++ ++ +#ifdef DWC_UTE_CFI +static inline void print_desc(struct dwc_otg_dma_desc *ddesc, + const uint8_t * epname, int descnum) @@ -63019,48 +76095,57 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + pcd->cfi->ops.build_descriptors(pcd->cfi, pcd, ep, req); + } else { +#endif -+ /* Setup and start the Transfer */ -+ ep->dwc_ep.dma_addr = req->dma; -+ ep->dwc_ep.start_xfer_buff = req->buf; -+ ep->dwc_ep.xfer_buff = req->buf; -+ ep->dwc_ep.sent_zlp = 0; -+ ep->dwc_ep.total_len = req->length; -+ ep->dwc_ep.xfer_len = 0; -+ ep->dwc_ep.xfer_count = 0; ++ /* Setup and start the Transfer */ ++ if (req->dw_align_buf) { ++ ep->dwc_ep.dma_addr = req->dw_align_buf_dma; ++ ep->dwc_ep.start_xfer_buff = req->dw_align_buf; ++ ep->dwc_ep.xfer_buff = req->dw_align_buf; ++ } else { ++ ep->dwc_ep.dma_addr = req->dma; ++ ep->dwc_ep.start_xfer_buff = req->buf; ++ ep->dwc_ep.xfer_buff = req->buf; ++ } ++ ep->dwc_ep.sent_zlp = 0; ++ ep->dwc_ep.total_len = req->length; ++ ep->dwc_ep.xfer_len = 0; ++ ep->dwc_ep.xfer_count = 0; + -+ ep->dwc_ep.maxxfer = max_transfer; -+ if (GET_CORE_IF(ep->pcd)->dma_desc_enable) { -+ uint32_t out_max_xfer = DDMA_MAX_TRANSFER_SIZE -+ - (DDMA_MAX_TRANSFER_SIZE % 4); -+ if (ep->dwc_ep.is_in) { ++ ep->dwc_ep.maxxfer = max_transfer; ++ if (GET_CORE_IF(ep->pcd)->dma_desc_enable) { ++ uint32_t out_max_xfer = DDMA_MAX_TRANSFER_SIZE ++ - (DDMA_MAX_TRANSFER_SIZE % 4); ++ if (ep->dwc_ep.is_in) { + if (ep->dwc_ep.maxxfer > + DDMA_MAX_TRANSFER_SIZE) { -+ ep->dwc_ep.maxxfer = -+ DDMA_MAX_TRANSFER_SIZE; -+ } -+ } else { -+ if (ep->dwc_ep.maxxfer > out_max_xfer) { ++ ep->dwc_ep.maxxfer = ++ DDMA_MAX_TRANSFER_SIZE; ++ } ++ } else { ++ if (ep->dwc_ep.maxxfer > out_max_xfer) { + ep->dwc_ep.maxxfer = + out_max_xfer; ++ } + } + } -+ } -+ if (ep->dwc_ep.maxxfer < ep->dwc_ep.total_len) { -+ ep->dwc_ep.maxxfer -= -+ (ep->dwc_ep.maxxfer % ep->dwc_ep.maxpacket); -+ } -+ if (req->sent_zlp) { ++ if (ep->dwc_ep.maxxfer < ep->dwc_ep.total_len) { ++ ep->dwc_ep.maxxfer -= ++ (ep->dwc_ep.maxxfer % ep->dwc_ep.maxpacket); ++ } ++ if (req->sent_zlp) { + if ((ep->dwc_ep.total_len % + ep->dwc_ep.maxpacket == 0) + && (ep->dwc_ep.total_len != 0)) { -+ ep->dwc_ep.sent_zlp = 1; -+ } ++ ep->dwc_ep.sent_zlp = 1; ++ } + -+ } ++ } +#ifdef DWC_UTE_CFI + } +#endif + dwc_otg_ep_start_transfer(GET_CORE_IF(ep->pcd), &ep->dwc_ep); ++ } else if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { ++ DWC_PRINTF("There are no more ISOC requests \n"); ++ ep->dwc_ep.frame_num = 0xFFFFFFFF; + } +} + @@ -63079,7 +76164,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sofintr = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -63116,10 +76201,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + //DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, _pcd); + /* Disable the Rx Status Queue Level interrupt */ + gintmask.b.rxstsqlvl = 1; -+ dwc_modify_reg32(&global_regs->gintmsk, gintmask.d32, 0); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, gintmask.d32, 0); + + /* Get the Status from the top of the FIFO */ -+ status.d32 = dwc_read_reg32(&global_regs->grxstsp); ++ status.d32 = DWC_READ_REG32(&global_regs->grxstsp); + + DWC_DEBUGPL(DBG_PCD, "EP:%d BCnt:%d DPID:%s " + "pktsts:%x Frame:%d(0x%0x)\n", @@ -63172,11 +76257,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + + /* Enable the Rx Status Queue Level interrupt */ -+ dwc_modify_reg32(&global_regs->gintmsk, 0, gintmask.d32); ++ DWC_MODIFY_REG32(&global_regs->gintmsk, 0, gintmask.d32); + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.rxstsqlvl = 1; -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + //DWC_DEBUGPL(DBG_PCDV, "EXIT: %s\n", __func__); + return 1; @@ -63212,7 +76297,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* Read the DTKNQ Registers */ + for (i = 0; i < DTKNQ_REG_CNT; i++) { -+ in_tkn_epnums[i] = dwc_read_reg32(addr); ++ in_tkn_epnums[i] = DWC_READ_REG32(addr); + DWC_DEBUGPL(DBG_PCDV, "DTKNQR%d=0x%08x\n", i + 1, + in_tkn_epnums[i]); + if (addr == &dev_global_regs->dvbusdis) { @@ -63296,7 +76381,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* While there is space in the queue and space in the FIFO and + * More data to tranfer, Write packets to the Tx FIFO */ -+ txstatus.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ txstatus.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + DWC_DEBUGPL(DBG_PCDV, "b4 GNPTXSTS=0x%08x\n", txstatus.d32); + + while (txstatus.b.nptxqspcavail > 0 && @@ -63311,17 +76396,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + + dwords = (len + 3) / 4; -+ txstatus.d32 = dwc_read_reg32(&global_regs->gnptxsts); ++ txstatus.d32 = DWC_READ_REG32(&global_regs->gnptxsts); + DWC_DEBUGPL(DBG_PCDV, "GNPTXSTS=0x%08x\n", txstatus.d32); + } + + DWC_DEBUGPL(DBG_PCDV, "GNPTXSTS=0x%08x\n", -+ dwc_read_reg32(&global_regs->gnptxsts)); ++ DWC_READ_REG32(&global_regs->gnptxsts)); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.nptxfempty = 1; -+ dwc_write_reg32(&global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -63357,7 +76442,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* While there is space in the queue and space in the FIFO and + * More data to tranfer, Write packets to the Tx FIFO */ -+ txstatus.d32 = dwc_read_reg32(&dev_if->in_ep_regs[epnum]->dtxfsts); ++ txstatus.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts); + DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n", epnum, txstatus.d32); + + while (txstatus.b.txfspcavail > dwords && @@ -63373,13 +76458,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + dwords = (len + 3) / 4; + txstatus.d32 = -+ dwc_read_reg32(&dev_if->in_ep_regs[epnum]->dtxfsts); ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts); + DWC_DEBUGPL(DBG_PCDV, "dtxfsts[%d]=0x%08x\n", epnum, + txstatus.d32); + } + + DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n", epnum, -+ dwc_read_reg32(&dev_if->in_ep_regs[epnum]->dtxfsts)); ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dtxfsts)); + + return 1; +} @@ -63405,6 +76490,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* don't disconnect drivers more than once */ + if (pcd->ep0state == EP0_DISCONNECT) { + DWC_DEBUGPL(DBG_ANY, "%s() Already Disconnected\n", __func__); ++ DWC_SPINUNLOCK(pcd->lock); + return; + } + pcd->ep0state = EP0_DISCONNECT; @@ -63414,7 +76500,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* Disable the NP Tx Fifo Empty Interrupt. */ + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, + intr_mask.d32, 0); + + /* Flush the FIFOs */ @@ -63455,13 +76541,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", "i2cintr"); + intr_mask.b.i2cintr = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, + intr_mask.d32, 0); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.i2cintr = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + return 1; +} @@ -63475,10 +76561,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#if defined(VERBOSE) + DWC_PRINTF("Early Suspend Detected\n"); +#endif ++ + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.erlysuspend = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + return 1; +} @@ -63510,8 +76597,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + +#ifdef VERBOSE + DWC_DEBUGPL(DBG_PCDV, "%s() doepctl0=%0x\n", __func__, -+ dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl)); ++ DWC_READ_REG32(&dev_if->out_ep_regs[0]->doepctl)); +#endif ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ doepctl.d32 = DWC_READ_REG32(&dev_if->out_ep_regs[0]->doepctl); ++ if (doepctl.b.epena) { ++ return; ++ } ++ } + + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; @@ -63520,11 +76613,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (core_if->dma_enable) { + if (!core_if->dma_desc_enable) { + /** put here as for Hermes mode deptisz register should not be written */ -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doeptsiz, ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doeptsiz, + doeptsize0.d32); + + /** @todo dma needs to handle multiple setup packets (up to 3) */ -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doepdma, ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doepdma, + pcd->setup_pkt_dma_handle); + } else { + dev_if->setup_desc_index = @@ -63534,39 +76627,49 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /** DMA Descriptor Setup */ + dma_desc->status.b.bs = BS_HOST_BUSY; ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ dma_desc->status.b.sr = 0; ++ dma_desc->status.b.mtrf = 0; ++ } + dma_desc->status.b.l = 1; + dma_desc->status.b.ioc = 1; + dma_desc->status.b.bytes = pcd->ep0.dwc_ep.maxpacket; + dma_desc->buf = pcd->setup_pkt_dma_handle; ++ dma_desc->status.b.sts = 0; + dma_desc->status.b.bs = BS_HOST_READY; + + /** DOEPDMA0 Register write */ -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doepdma, -+ dev_if->dma_setup_desc_addr[dev_if-> -+ setup_desc_index]); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doepdma, ++ dev_if->dma_setup_desc_addr ++ [dev_if->setup_desc_index]); + } + + } else { + /** put here as for Hermes mode deptisz register should not be written */ -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doeptsiz, ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doeptsiz, + doeptsize0.d32); + } + -+ /** DOEPCTL0 Register write */ ++ /** DOEPCTL0 Register write cnak will be set after setup interrupt */ ++ doepctl.d32 = 0; + doepctl.b.epena = 1; ++ if (core_if->snpsid <= OTG_CORE_REV_2_94a) { + doepctl.b.cnak = 1; -+ dwc_write_reg32(&dev_if->out_ep_regs[0]->doepctl, doepctl.d32); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[0]->doepctl, doepctl.d32); ++ } else { ++ DWC_MODIFY_REG32(&dev_if->out_ep_regs[0]->doepctl, 0, doepctl.d32); ++ } + +#ifdef VERBOSE + DWC_DEBUGPL(DBG_PCDV, "doepctl0=%0x\n", -+ dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl)); ++ DWC_READ_REG32(&dev_if->out_ep_regs[0]->doepctl)); + DWC_DEBUGPL(DBG_PCDV, "diepctl0=%0x\n", -+ dwc_read_reg32(&dev_if->in_ep_regs[0]->diepctl)); ++ DWC_READ_REG32(&dev_if->in_ep_regs[0]->diepctl)); +#endif +} + +/** -+ * This interrupt occurs when a USB Reset is detected. When the USB ++ * This interrupt occurs when a USB Reset is detected. When the USB + * Reset Interrupt occurs the device state is set to DEFAULT and the + * EP0 state is set to IDLE. + * -# Set the NAK bit for all OUT endpoints (DOEPCTLn.SNAK = 1) @@ -63593,6 +76696,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + dwc_otg_dev_if_t *dev_if = core_if->dev_if; + depctl_data_t doepctl = {.d32 = 0 }; ++ depctl_data_t diepctl = {.d32 = 0 }; + daint_data_t daintmsk = {.d32 = 0 }; + doepmsk_data_t doepmsk = {.d32 = 0 }; + diepmsk_data_t diepmsk = {.d32 = 0 }; @@ -63603,17 +76707,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + gintsts_data_t gintsts; + pcgcctl_data_t power = {.d32 = 0 }; + -+ power.d32 = dwc_read_reg32(core_if->pcgcctl); ++ power.d32 = DWC_READ_REG32(core_if->pcgcctl); + if (power.b.stoppclk) { + power.d32 = 0; + power.b.stoppclk = 1; -+ dwc_modify_reg32(core_if->pcgcctl, power.d32, 0); ++ DWC_MODIFY_REG32(core_if->pcgcctl, power.d32, 0); + + power.b.pwrclmp = 1; -+ dwc_modify_reg32(core_if->pcgcctl, power.d32, 0); ++ DWC_MODIFY_REG32(core_if->pcgcctl, power.d32, 0); + + power.b.rstpdwnmodule = 1; -+ dwc_modify_reg32(core_if->pcgcctl, power.d32, 0); ++ DWC_MODIFY_REG32(core_if->pcgcctl, power.d32, 0); + } + + core_if->lx_state = DWC_OTG_L0; @@ -63629,31 +76733,55 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_ep->next_frame = 0xffffffff; + } + } -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ + + /* reset the HNP settings */ + dwc_otg_pcd_update_otg(pcd, 1); + + /* Clear the Remote Wakeup Signalling */ + dctl.b.rmtwkupsig = 1; -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32, 0); ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32, 0); + + /* Set NAK for all OUT EPs */ + doepctl.b.snak = 1; + for (i = 0; i <= dev_if->num_out_eps; i++) { -+ dwc_write_reg32(&dev_if->out_ep_regs[i]->doepctl, doepctl.d32); ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doepctl, doepctl.d32); + } + + /* Flush the NP Tx FIFO */ + dwc_otg_flush_tx_fifo(core_if, 0x10); + /* Flush the Learning Queue */ + resetctl.b.intknqflsh = 1; -+ dwc_write_reg32(&core_if->core_global_regs->grstctl, resetctl.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->grstctl, resetctl.d32); ++ ++ if (!core_if->core_params->en_multiple_tx_fifo && core_if->dma_enable) { ++ core_if->start_predict = 0; ++ for (i = 0; i<= core_if->dev_if->num_in_eps; ++i) { ++ core_if->nextep_seq[i] = 0xff; // 0xff - EP not active ++ } ++ core_if->nextep_seq[0] = 0; ++ core_if->first_in_nextep_seq = 0; ++ diepctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[0]->diepctl); ++ diepctl.b.nextep = 0; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[0]->diepctl, diepctl.d32); ++ ++ /* Update IN Endpoint Mismatch Count by active IN NP EP count + 1 */ ++ dcfg.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dcfg); ++ dcfg.b.epmscnt = 2; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dcfg, dcfg.d32); ++ ++ DWC_DEBUGPL(DBG_PCDV, ++ "%s first_in_nextep_seq= %2d; nextep_seq[]:\n", ++ __func__, core_if->first_in_nextep_seq); ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_DEBUGPL(DBG_PCDV, "%2d\n", core_if->nextep_seq[i]); ++ } ++ } + + if (core_if->multiproc_int_enable) { + daintmsk.b.inep0 = 1; + daintmsk.b.outep0 = 1; -+ dwc_write_reg32(&dev_if->dev_global_regs->deachintmsk, ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->deachintmsk, + daintmsk.d32); + + doepmsk.b.setup = 1; @@ -63661,41 +76789,47 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + doepmsk.b.ahberr = 1; + doepmsk.b.epdisabled = 1; + -+ if (core_if->dma_desc_enable) { ++ if ((core_if->dma_desc_enable) || ++ (core_if->dma_enable ++ && core_if->snpsid >= OTG_CORE_REV_3_00a)) { + doepmsk.b.stsphsercvd = 1; -+ doepmsk.b.bna = 1; + } ++ if (core_if->dma_desc_enable) ++ doepmsk.b.bna = 1; +/* + doepmsk.b.babble = 1; + doepmsk.b.nyet = 1; + -+ if(core_if->dma_enable) { ++ if (core_if->dma_enable) { + doepmsk.b.nak = 1; + } +*/ -+ dwc_write_reg32(&dev_if->dev_global_regs->doepeachintmsk[0], ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->doepeachintmsk[0], + doepmsk.d32); + + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + diepmsk.b.ahberr = 1; -+ diepmsk.b.intknepmis = 1; ++ diepmsk.b.intknepmis = 1; ++ if (!core_if->en_multiple_tx_fifo && core_if->dma_enable) ++ diepmsk.b.intknepmis = 0; + -+ if (core_if->dma_desc_enable) { ++/* if (core_if->dma_desc_enable) { + diepmsk.b.bna = 1; + } ++*/ +/* -+ if(core_if->dma_enable) { ++ if (core_if->dma_enable) { + diepmsk.b.nak = 1; + } +*/ -+ dwc_write_reg32(&dev_if->dev_global_regs->diepeachintmsk[0], ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->diepeachintmsk[0], + diepmsk.d32); + } else { + daintmsk.b.inep0 = 1; + daintmsk.b.outep0 = 1; -+ dwc_write_reg32(&dev_if->dev_global_regs->daintmsk, ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->daintmsk, + daintmsk.d32); + + doepmsk.b.setup = 1; @@ -63703,37 +76837,43 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + doepmsk.b.ahberr = 1; + doepmsk.b.epdisabled = 1; + -+ if (core_if->dma_desc_enable) { ++ if ((core_if->dma_desc_enable) || ++ (core_if->dma_enable ++ && core_if->snpsid >= OTG_CORE_REV_3_00a)) { + doepmsk.b.stsphsercvd = 1; -+ doepmsk.b.bna = 1; + } -+ dwc_write_reg32(&dev_if->dev_global_regs->doepmsk, doepmsk.d32); ++ if (core_if->dma_desc_enable) ++ doepmsk.b.bna = 1; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->doepmsk, doepmsk.d32); + + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + diepmsk.b.ahberr = 1; -+ diepmsk.b.intknepmis = 1; -+ ++ if (!core_if->en_multiple_tx_fifo && core_if->dma_enable) ++ diepmsk.b.intknepmis = 0; ++/* + if (core_if->dma_desc_enable) { + diepmsk.b.bna = 1; + } ++*/ + -+ dwc_write_reg32(&dev_if->dev_global_regs->diepmsk, diepmsk.d32); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->diepmsk, diepmsk.d32); + } + + /* Reset Device Address */ -+ dcfg.d32 = dwc_read_reg32(&dev_if->dev_global_regs->dcfg); ++ dcfg.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dcfg); + dcfg.b.devaddr = 0; -+ dwc_write_reg32(&dev_if->dev_global_regs->dcfg, dcfg.d32); ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dcfg, dcfg.d32); + + /* setup EP0 to receive SETUP packets */ -+ ep0_out_start(core_if, pcd); ++ if (core_if->snpsid <= OTG_CORE_REV_2_94a) ++ ep0_out_start(core_if, pcd); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} @@ -63748,7 +76888,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +{ + dsts_data_t dsts; + int speed = 0; -+ dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts); ++ dsts.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dsts); + + switch (dsts.b.enumspd) { + case DWC_DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: @@ -63784,13 +76924,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + DWC_DEBUGPL(DBG_PCD, "SPEED ENUM\n"); + + if (GET_CORE_IF(pcd)->snpsid >= OTG_CORE_REV_2_60a) { -+ utmi16b = 6; ++ utmi16b = 6; //vahrama old value was 6; + utmi8b = 9; + } else { + utmi16b = 4; + utmi8b = 8; + } + dwc_otg_ep0_activate(GET_CORE_IF(pcd), &ep0->dwc_ep); ++ if (GET_CORE_IF(pcd)->snpsid >= OTG_CORE_REV_3_00a) { ++ ep0_out_start(GET_CORE_IF(pcd), pcd); ++ } + +#ifdef DEBUG_EP0 + print_ep0_state(pcd); @@ -63810,7 +76953,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + pcd->fops->connect(pcd, speed); + + /* Set USB turnaround time based on device speed and PHY interface. */ -+ gusbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg); ++ gusbcfg.d32 = DWC_READ_REG32(&global_regs->gusbcfg); + if (speed == USB_SPEED_HIGH) { + if (GET_CORE_IF(pcd)->hwcfg2.b.hs_phy_type == + DWC_HWCFG2_HS_PHY_TYPE_ULPI) { @@ -63822,11 +76965,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* UTMI+ interface */ + if (GET_CORE_IF(pcd)->hwcfg4.b.utmi_phy_data_width == 0) { + gusbcfg.b.usbtrdtim = utmi8b; -+ } else if (GET_CORE_IF(pcd)->hwcfg4.b. -+ utmi_phy_data_width == 1) { ++ } else if (GET_CORE_IF(pcd)->hwcfg4. ++ b.utmi_phy_data_width == 1) { + gusbcfg.b.usbtrdtim = utmi16b; -+ } else if (GET_CORE_IF(pcd)->core_params-> -+ phy_utmi_width == 8) { ++ } else if (GET_CORE_IF(pcd)-> ++ core_params->phy_utmi_width == 8) { + gusbcfg.b.usbtrdtim = utmi8b; + } else { + gusbcfg.b.usbtrdtim = utmi16b; @@ -63840,8 +76983,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + gusbcfg.b.usbtrdtim = 9; + } else { + /* UTMI+ interface */ -+ if (GET_CORE_IF(pcd)->core_params-> -+ phy_utmi_width == 16) { ++ if (GET_CORE_IF(pcd)-> ++ core_params->phy_utmi_width == 16) { + gusbcfg.b.usbtrdtim = utmi16b; + } else { + gusbcfg.b.usbtrdtim = utmi8b; @@ -63852,12 +76995,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* Full or low speed */ + gusbcfg.b.usbtrdtim = 9; + } -+ dwc_write_reg32(&global_regs->gusbcfg, gusbcfg.d32); ++ DWC_WRITE_REG32(&global_regs->gusbcfg, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + return 1; +} @@ -63872,17 +77015,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + gintmsk_data_t intr_mask = {.d32 = 0 }; + gintsts_data_t gintsts; + -+ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", -+ "ISOC Out Dropped"); ++ DWC_WARN("INTERRUPT Handler not implemented for %s\n", ++ "ISOC Out Dropped"); + + intr_mask.b.isooutdrop = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, + intr_mask.d32, 0); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.isooutdrop = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -63900,13 +77043,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", "EOP"); + + intr_mask.b.eopframe = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, + intr_mask.d32, 0); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.eopframe = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -63917,24 +77060,84 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + * non-periodic Tx FIFO does not match EP of the IN Token received. + * + * The "Device IN Token Queue" Registers are read to determine the -+ * order the IN Tokens have been received. The non-periodic Tx FIFO ++ * order the IN Tokens have been received. The non-periodic Tx FIFO + * is flushed, so it can be reloaded in the order seen in the IN Token + * Queue. + */ -+int32_t dwc_otg_pcd_handle_ep_mismatch_intr(dwc_otg_core_if_t * core_if) ++int32_t dwc_otg_pcd_handle_ep_mismatch_intr(dwc_otg_pcd_t * pcd) +{ + gintsts_data_t gintsts; -+ DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, core_if); ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); ++ dctl_data_t dctl; ++ gintmsk_data_t intr_mask = {.d32 = 0 }; + ++ if (!core_if->en_multiple_tx_fifo && core_if->dma_enable) { ++ core_if->start_predict = 1; ++ ++ DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, core_if); ++ ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ if (!gintsts.b.ginnakeff) { ++ /* Disable EP Mismatch interrupt */ ++ intr_mask.d32 = 0; ++ intr_mask.b.epmismatch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, intr_mask.d32, 0); ++ /* Enable the Global IN NAK Effective Interrupt */ ++ intr_mask.d32 = 0; ++ intr_mask.b.ginnakeff = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, 0, intr_mask.d32); ++ /* Set the global non-periodic IN NAK handshake */ ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl); ++ dctl.b.sgnpinnak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32); ++ } else { ++ DWC_PRINTF("gintsts.b.ginnakeff = 1! dctl.b.sgnpinnak not set\n"); ++ } ++ /* Disabling of all EP's will be done in dwc_otg_pcd_handle_in_nak_effective() ++ * handler after Global IN NAK Effective interrupt will be asserted */ ++ } + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.epmismatch = 1; -+ dwc_write_reg32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); + + return 1; +} + +/** ++ * This interrupt is valid only in DMA mode. This interrupt indicates that the ++ * core has stopped fetching data for IN endpoints due to the unavailability of ++ * TxFIFO space or Request Queue space. This interrupt is used by the ++ * application for an endpoint mismatch algorithm. ++ * ++ * @param pcd The PCD ++ */ ++int32_t dwc_otg_pcd_handle_ep_fetsusp_intr(dwc_otg_pcd_t * pcd) ++{ ++ gintsts_data_t gintsts; ++ gintmsk_data_t gintmsk_data; ++ dctl_data_t dctl; ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); ++ DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, core_if); ++ ++ /* Clear the global non-periodic IN NAK handshake */ ++ dctl.d32 = 0; ++ dctl.b.cgnpinnak = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); ++ ++ /* Mask GINTSTS.FETSUSP interrupt */ ++ gintmsk_data.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintmsk); ++ gintmsk_data.b.fetsusp = 0; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, gintmsk_data.d32); ++ ++ /* Clear interrupt */ ++ gintsts.d32 = 0; ++ gintsts.b.fetsusp = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, gintsts.d32); ++ ++ return 1; ++} ++/** + * This funcion stalls EP0. + */ +static inline void ep0_do_stall(dwc_otg_pcd_t * pcd, const int err_val) @@ -63968,12 +77171,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /** @todo This is a g_file_storage gadget driver specific + * workaround: a DELAYED_STATUS result from the fsg_setup + * routine will result in the gadget queueing a EP0 IN status -+ * phase for a two-stage control transfer. Exactly the same as ++ * phase for a two-stage control transfer. Exactly the same as + * a SET_CONFIGURATION/SET_INTERFACE except that this is a class + * specific request. Need a generic way to know when the gadget -+ * driver will queue the status phase. Can we assume when we ++ * driver will queue the status phase. Can we assume when we + * call the gadget driver setup() function that it will always -+ * queue and require the following flag? Need to look into ++ * queue and require the following flag? Need to look into + * this. + */ + @@ -64021,6 +77224,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* Prepare for more SETUP Packets */ + DWC_DEBUGPL(DBG_PCD, "EP0 IN ZLP\n"); ++ if ((GET_CORE_IF(pcd)->snpsid >= OTG_CORE_REV_3_00a) ++ && (pcd->core_if->dma_desc_enable) ++ && (ep0->dwc_ep.xfer_count < ep0->dwc_ep.total_len)) { ++ DWC_DEBUGPL(DBG_PCDV, ++ "Data terminated wait next packet in out_desc_addr\n"); ++ pcd->backup_buf = phys_to_virt(ep0->dwc_ep.dma_addr); ++ pcd->data_terminated = 1; ++ } + ep0->dwc_ep.xfer_len = 0; + ep0->dwc_ep.xfer_count = 0; + ep0->dwc_ep.is_in = 1; @@ -64109,7 +77320,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + +// DWC_WARN("%s() has not been tested since being rewritten!\n", __func__); + -+ dctl.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dctl); ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl); + switch (test_mode) { + case 1: // TEST_J + dctl.b.tstctl = 1; @@ -64131,7 +77342,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dctl.b.tstctl = 5; + break; + } -+ dwc_write_reg32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32); ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32); +} + +/** @@ -64143,6 +77354,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_pcd_ep_t *ep; + dwc_otg_pcd_ep_t *ep0 = &pcd->ep0; + uint16_t *status = pcd->status_buf; ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + +#ifdef DEBUG_EP0 + DWC_DEBUGPL(DBG_PCD, @@ -64154,10 +77366,39 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + switch (UT_GET_RECIPIENT(ctrl.bmRequestType)) { + case UT_DEVICE: -+ *status = 0x1; /* Self powered */ -+ *status |= pcd->remote_wakeup_enable << 1; -+ break; -+ ++ if(UGETW(ctrl.wIndex) == 0xF000) { /* OTG Status selector */ ++ DWC_PRINTF("wIndex - %d\n", UGETW(ctrl.wIndex)); ++ DWC_PRINTF("OTG VERSION - %d\n", core_if->otg_ver); ++ DWC_PRINTF("OTG CAP - %d, %d\n", ++ core_if->core_params->otg_cap, ++ DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE); ++ if (core_if->otg_ver == 1 ++ && core_if->core_params->otg_cap == ++ DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE) { ++ uint8_t *otgsts = (uint8_t*)pcd->status_buf; ++ *otgsts = (core_if->otg_sts & 0x1); ++ pcd->ep0_pending = 1; ++ ep0->dwc_ep.start_xfer_buff = ++ (uint8_t *) otgsts; ++ ep0->dwc_ep.xfer_buff = (uint8_t *) otgsts; ++ ep0->dwc_ep.dma_addr = ++ pcd->status_buf_dma_handle; ++ ep0->dwc_ep.xfer_len = 1; ++ ep0->dwc_ep.xfer_count = 0; ++ ep0->dwc_ep.total_len = ep0->dwc_ep.xfer_len; ++ dwc_otg_ep0_start_transfer(GET_CORE_IF(pcd), ++ &ep0->dwc_ep); ++ return; ++ } else { ++ ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; ++ } ++ break; ++ } else { ++ *status = 0x1; /* Self powered */ ++ *status |= pcd->remote_wakeup_enable << 1; ++ break; ++ } + case UT_INTERFACE: + *status = 0; + break; @@ -64232,10 +77473,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + * by a USB Reset? */ + gotgctl.b.devhnpen = 1; + gotgctl.b.hnpreq = 1; -+ dwc_write_reg32(&global_regs->gotgctl, ++ DWC_WRITE_REG32(&global_regs->gotgctl, + gotgctl.d32); + } else { + ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; + } + break; + @@ -64248,6 +77490,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_pcd_update_otg(pcd, 0); + } else { + ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; + } + break; + @@ -64260,8 +77503,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_pcd_update_otg(pcd, 0); + } else { + ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; + } + break; ++ ++ default: ++ ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; ++ + } + do_setup_in_status_phase(pcd); + break; @@ -64309,6 +77558,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + case UF_TEST_MODE: + /** @todo Add CLEAR_FEATURE for TEST modes. */ + break; ++ ++ default: ++ ep0_do_stall(pcd, -DWC_E_NOT_SUPPORTED); ++ return; + } + do_setup_in_status_phase(pcd); + break; @@ -64341,13 +77594,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +// DWC_DEBUGPL(DBG_PCDV, "SET_ADDRESS:%d\n", ctrl.wValue); +#endif + dcfg.b.devaddr = UGETW(ctrl.wValue); -+ dwc_modify_reg32(&dev_if->dev_global_regs->dcfg, 0, dcfg.d32); ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dcfg, 0, dcfg.d32); + do_setup_in_status_phase(pcd); + } +} + +/** -+ * This function processes SETUP commands. In Linux, the USB Command ++ * This function processes SETUP commands. In Linux, the USB Command + * processing is done in two places - the first being the PCD and the + * second in the Gadget Driver (for example, the File-Backed Storage + * Gadget Driver). @@ -64410,6 +77663,22 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + struct cfi_usb_ctrlrequest cfi_req; +#endif + ++ doeptsize0.d32 = DWC_READ_REG32(&dev_if->out_ep_regs[0]->doeptsiz); ++ ++ /** In BDMA more then 1 setup packet is not supported till 3.00a */ ++ if (core_if->dma_enable && core_if->dma_desc_enable == 0 ++ && (doeptsize0.b.supcnt < 2) ++ && (core_if->snpsid < OTG_CORE_REV_2_94a)) { ++ DWC_ERROR ++ ("\n\n----------- CANNOT handle > 1 setup packet in DMA mode\n\n"); ++ } ++ if ((core_if->snpsid >= OTG_CORE_REV_3_00a) ++ && (core_if->dma_enable == 1) && (core_if->dma_desc_enable == 0)) { ++ ctrl = ++ (pcd->setup_pkt + ++ (3 - doeptsize0.b.supcnt - 1 + ++ ep0->dwc_ep.stp_rollover))->req; ++ } +#ifdef DEBUG_EP0 + DWC_DEBUGPL(DBG_PCD, "SETUP %02x.%02x v%04x i%04x l%04x\n", + ctrl.bmRequestType, ctrl.bRequest, @@ -64417,16 +77686,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + UGETW(ctrl.wLength)); +#endif + -+ doeptsize0.d32 = dwc_read_reg32(&dev_if->out_ep_regs[0]->doeptsiz); -+ -+ /** @todo handle > 1 setup packet , assert error for now */ -+ -+ if (core_if->dma_enable && core_if->dma_desc_enable == 0 -+ && (doeptsize0.b.supcnt < 2)) { -+ DWC_ERROR -+ ("\n\n----------- CANNOT handle > 1 setup packet in DMA mode\n\n"); -+ } -+ + /* Clean up the request queue */ + dwc_otg_request_nuke(ep0); + ep0->stopped = 0; @@ -64449,7 +77708,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#ifdef DWC_UTE_CFI + DWC_MEMCPY(&cfi_req, &ctrl, sizeof(usb_device_request_t)); + -+ //printk(KERN_ALERT "CFI: req_type=0x%02x; req=0x%02x\n", ctrl.bRequestType, ctrl.bRequest); ++ //printk(KERN_ALERT "CFI: req_type=0x%02x; req=0x%02x\n", ++ ctrl.bRequestType, ctrl.bRequest); + if (UT_GET_TYPE(cfi_req.bRequestType) == UT_VENDOR) { + if (cfi_req.bRequest > 0xB0 && cfi_req.bRequest < 0xBF) { + retval = cfi_setup(pcd, &cfi_req); @@ -64463,8 +77723,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (pcd->cfi->need_gadget_att) { + retval = + cfi_gadget_setup(pcd, -+ &pcd->cfi-> -+ ctrl_req); ++ &pcd-> ++ cfi->ctrl_req); + if (retval < 0) { + pcd->ep0_pending = 0; + return; @@ -64547,6 +77807,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + int retval = -DWC_E_NOT_SUPPORTED; +#endif + ++ desc_sts.b.bytes = 0; ++ + if (pcd->ep0_pending && DWC_CIRCLEQ_EMPTY(&ep->queue)) { + if (ep->dwc_ep.is_in) { +#ifdef DEBUG_EP0 @@ -64628,7 +77890,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + || pcd->ep0state == EP0_IN_STATUS_PHASE) { + is_last = 1; + } else if (ep->dwc_ep.is_in) { -+ deptsiz.d32 = dwc_read_reg32(&in_ep_regs->dieptsiz); ++ deptsiz.d32 = DWC_READ_REG32(&in_ep_regs->dieptsiz); + if (core_if->dma_desc_enable != 0) + desc_sts = dev_if->in_desc_addr->status; +#ifdef DEBUG_EP0 @@ -64654,7 +77916,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } else { + /* ep0-OUT */ +#ifdef DEBUG_EP0 -+ deptsiz.d32 = dwc_read_reg32(&out_ep_regs->doeptsiz); ++ deptsiz.d32 = DWC_READ_REG32(&out_ep_regs->doeptsiz); + DWC_DEBUGPL(DBG_PCDV, "%d len=%d xsize=%d pktcnt=%d\n", + ep->dwc_ep.num, ep->dwc_ep.xfer_len, + deptsiz.b.xfersize, deptsiz.b.pktcnt); @@ -64668,8 +77930,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#endif + req->sent_zlp = 0; + } -+ if (core_if->dma_desc_enable == 0) ++ /* For older cores do setup in status phase in Slave/BDMA modes, ++ * starting from 3.00 do that only in slave, and for DMA modes ++ * just re-enable ep 0 OUT here*/ ++ if (core_if->dma_enable == 0 ++ || (core_if->dma_desc_enable == 0 ++ && core_if->snpsid <= OTG_CORE_REV_2_94a)) { + do_setup_in_status_phase(pcd); ++ } else if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ DWC_DEBUGPL(DBG_PCDV, ++ "Enable out ep before in status phase\n"); ++ ep0_out_start(core_if, pcd); ++ } + } + + /* Complete the request */ @@ -64724,7 +77996,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#endif + +/** -+ * This function completes the request for the EP. If there are ++ * This function completes the request for the EP. If there are + * additional requests for the EP in the queue they will be started. + */ +static void complete_ep(dwc_otg_pcd_ep_t * ep) @@ -64759,7 +78031,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + DWC_DEBUGPL(DBG_PCD, "Requests %d\n", ep->pcd->request_pending); + + if (ep->dwc_ep.is_in) { -+ deptsiz.d32 = dwc_read_reg32(&in_ep_regs->dieptsiz); ++ deptsiz.d32 = DWC_READ_REG32(&in_ep_regs->dieptsiz); + + if (core_if->dma_enable) { + if (core_if->dma_desc_enable == 0) { @@ -64787,20 +78059,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_ep_start_transfer + (core_if, &ep->dwc_ep); + } else if (ep->dwc_ep.sent_zlp) { -+ /* -+ * This fragment of code should initiate 0 -+ * length trasfer in case if it is queued -+ * a trasfer with size divisible to EPs max -+ * packet size and with usb_request zero field -+ * is set, which means that after data is transfered, -+ * it is also should be transfered -+ * a 0 length packet at the end. For Slave and -+ * Buffer DMA modes in this case SW has -+ * to initiate 2 transfers one with transfer size, -+ * and the second with 0 size. For Desriptor -+ * DMA mode SW is able to initiate a transfer, -+ * which will handle all the packets including -+ * the last 0 legth. ++ /* ++ * This fragment of code should initiate 0 ++ * length transfer in case if it is queued ++ * a transfer with size divisible to EPs max ++ * packet size and with usb_request zero field ++ * is set, which means that after data is transfered, ++ * it is also should be transfered ++ * a 0 length packet at the end. For Slave and ++ * Buffer DMA modes in this case SW has ++ * to initiate 2 transfers one with transfer size, ++ * and the second with 0 size. For Descriptor ++ * DMA mode SW is able to initiate a transfer, ++ * which will handle all the packets including ++ * the last 0 length. + */ + ep->dwc_ep.sent_zlp = 0; + dwc_otg_ep_start_zl_transfer @@ -64809,12 +78081,24 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + is_last = 1; + } + } else { -+ DWC_WARN -+ ("Incomplete transfer (%d - %s [siz=%d pkt=%d])\n", -+ ep->dwc_ep.num, -+ (ep->dwc_ep.is_in ? "IN" : "OUT"), -+ deptsiz.b.xfersize, -+ deptsiz.b.pktcnt); ++ if (ep->dwc_ep.type == ++ DWC_OTG_EP_TYPE_ISOC) { ++ req->actual = 0; ++ dwc_otg_request_done(ep, req, 0); ++ ++ ep->dwc_ep.start_xfer_buff = 0; ++ ep->dwc_ep.xfer_buff = 0; ++ ep->dwc_ep.xfer_len = 0; ++ ++ /* If there is a request in the queue start it. */ ++ start_next_request(ep); ++ } else ++ DWC_WARN ++ ("Incomplete transfer (%d - %s [siz=%d pkt=%d])\n", ++ ep->dwc_ep.num, ++ (ep->dwc_ep.is_in ? "IN" : "OUT"), ++ deptsiz.b.xfersize, ++ deptsiz.b.pktcnt); + } + } else { + dma_desc = ep->dwc_ep.desc_addr; @@ -64861,32 +78145,31 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + deptsiz.b.xfersize, + deptsiz.b.pktcnt); + -+ /* Check if the whole transfer was completed, ++ /* Check if the whole transfer was completed, + * if no, setup transfer for next portion of data + */ + if (ep->dwc_ep.xfer_len < ep->dwc_ep.total_len) { + dwc_otg_ep_start_transfer(core_if, + &ep->dwc_ep); + } else if (ep->dwc_ep.sent_zlp) { -+ /* -+ * This fragment of code should initiate 0 ++ /* ++ * This fragment of code should initiate 0 + * length trasfer in case if it is queued -+ * a trasfer with size divisible to EPs max -+ * packet size and with usb_request zero field -+ * is set, which means that after data is transfered, -+ * it is also should be transfered -+ * a 0 length packet at the end. For Slave and -+ * Buffer DMA modes in this case SW has -+ * to initiate 2 transfers one with transfer size, -+ * and the second with 0 size. For Desriptor -+ * DMA mode SW is able to initiate a transfer, -+ * which will handle all the packets including ++ * a trasfer with size divisible to EPs max ++ * packet size and with usb_request zero field ++ * is set, which means that after data is transfered, ++ * it is also should be transfered ++ * a 0 length packet at the end. For Slave and ++ * Buffer DMA modes in this case SW has ++ * to initiate 2 transfers one with transfer size, ++ * and the second with 0 size. For Desriptor ++ * DMA mode SW is able to initiate a transfer, ++ * which will handle all the packets including + * the last 0 legth. + */ + ep->dwc_ep.sent_zlp = 0; + dwc_otg_ep_start_zl_transfer(core_if, -+ &ep-> -+ dwc_ep); ++ &ep->dwc_ep); + } else { + is_last = 1; + } @@ -64922,22 +78205,53 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + for (i = 0; i < ep->dwc_ep.desc_cnt; + ++i) { -+ desc_sts = dma_desc->status; -+ byte_count += desc_sts.b.bytes; -+ dma_desc++; -+ } ++ desc_sts = dma_desc->status; ++ byte_count += desc_sts.b.bytes; ++ dma_desc++; ++ } + +#ifdef DWC_UTE_CFI + } +#endif -+ ep->dwc_ep.xfer_count = ep->dwc_ep.total_len -+ - byte_count + -+ ((4 - (ep->dwc_ep.total_len & 0x3)) & 0x3); -+ is_last = 1; ++ /* Checking for interrupt Out transfers with not ++ * dword aligned mps sizes ++ */ ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_INTR && ++ (ep->dwc_ep.maxpacket%4)) { ++ ep->dwc_ep.xfer_count = ++ ep->dwc_ep.total_len - byte_count; ++ if ((ep->dwc_ep.xfer_len % ++ ep->dwc_ep.maxpacket) ++ && (ep->dwc_ep.xfer_len / ++ ep->dwc_ep.maxpacket < ++ MAX_DMA_DESC_CNT)) ++ ep->dwc_ep.xfer_len -= ++ (ep->dwc_ep.desc_cnt - ++ 1) * ep->dwc_ep.maxpacket + ++ ep->dwc_ep.xfer_len % ++ ep->dwc_ep.maxpacket; ++ else ++ ep->dwc_ep.xfer_len -= ++ ep->dwc_ep.desc_cnt * ++ ep->dwc_ep.maxpacket; ++ if (ep->dwc_ep.xfer_len > 0) { ++ dwc_otg_ep_start_transfer ++ (core_if, &ep->dwc_ep); ++ } else { ++ is_last = 1; ++ } ++ } else { ++ ep->dwc_ep.xfer_count = ++ ep->dwc_ep.total_len - byte_count + ++ ((4 - ++ (ep->dwc_ep. ++ total_len & 0x3)) & 0x3); ++ is_last = 1; ++ } + } else { + deptsiz.d32 = 0; + deptsiz.d32 = -+ dwc_read_reg32(&out_ep_regs->doeptsiz); ++ DWC_READ_REG32(&out_ep_regs->doeptsiz); + + byte_count = (ep->dwc_ep.xfer_len - + ep->dwc_ep.xfer_count - @@ -64946,57 +78260,56 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + ep->dwc_ep.dma_addr += byte_count; + ep->dwc_ep.xfer_count += byte_count; + -+ /* Check if the whole transfer was completed, ++ /* Check if the whole transfer was completed, + * if no, setup transfer for next portion of data + */ + if (ep->dwc_ep.xfer_len < ep->dwc_ep.total_len) { + dwc_otg_ep_start_transfer(core_if, + &ep->dwc_ep); + } else if (ep->dwc_ep.sent_zlp) { -+ /* -+ * This fragment of code should initiate 0 ++ /* ++ * This fragment of code should initiate 0 + * length trasfer in case if it is queued -+ * a trasfer with size divisible to EPs max -+ * packet size and with usb_request zero field -+ * is set, which means that after data is transfered, -+ * it is also should be transfered -+ * a 0 length packet at the end. For Slave and -+ * Buffer DMA modes in this case SW has -+ * to initiate 2 transfers one with transfer size, -+ * and the second with 0 size. For Desriptor -+ * DMA mode SW is able to initiate a transfer, -+ * which will handle all the packets including ++ * a trasfer with size divisible to EPs max ++ * packet size and with usb_request zero field ++ * is set, which means that after data is transfered, ++ * it is also should be transfered ++ * a 0 length packet at the end. For Slave and ++ * Buffer DMA modes in this case SW has ++ * to initiate 2 transfers one with transfer size, ++ * and the second with 0 size. For Desriptor ++ * DMA mode SW is able to initiate a transfer, ++ * which will handle all the packets including + * the last 0 legth. + */ + ep->dwc_ep.sent_zlp = 0; + dwc_otg_ep_start_zl_transfer(core_if, -+ &ep-> -+ dwc_ep); ++ &ep->dwc_ep); + } else { + is_last = 1; + } + } + } else { -+ /* Check if the whole transfer was completed, ++ /* Check if the whole transfer was completed, + * if no, setup transfer for next portion of data + */ + if (ep->dwc_ep.xfer_len < ep->dwc_ep.total_len) { + dwc_otg_ep_start_transfer(core_if, &ep->dwc_ep); + } else if (ep->dwc_ep.sent_zlp) { -+ /* -+ * This fragment of code should initiate 0 -+ * length trasfer in case if it is queued -+ * a trasfer with size divisible to EPs max -+ * packet size and with usb_request zero field -+ * is set, which means that after data is transfered, -+ * it is also should be transfered -+ * a 0 length packet at the end. For Slave and -+ * Buffer DMA modes in this case SW has -+ * to initiate 2 transfers one with transfer size, -+ * and the second with 0 size. For Desriptor -+ * DMA mode SW is able to initiate a transfer, -+ * which will handle all the packets including -+ * the last 0 legth. ++ /* ++ * This fragment of code should initiate 0 ++ * length transfer in case if it is queued ++ * a transfer with size divisible to EPs max ++ * packet size and with usb_request zero field ++ * is set, which means that after data is transfered, ++ * it is also should be transfered ++ * a 0 length packet at the end. For Slave and ++ * Buffer DMA modes in this case SW has ++ * to initiate 2 transfers one with transfer size, ++ * and the second with 0 size. For Descriptor ++ * DMA mode SW is able to initiate a transfer, ++ * which will handle all the packets including ++ * the last 0 length. + */ + ep->dwc_ep.sent_zlp = 0; + dwc_otg_ep_start_zl_transfer(core_if, @@ -65021,10 +78334,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + req->actual = ep->dwc_ep.cfi_req_len - byte_count; + } else { +#endif -+ req->actual = ep->dwc_ep.xfer_count; ++ req->actual = ep->dwc_ep.xfer_count; +#ifdef DWC_UTE_CFI + } +#endif ++ if (req->dw_align_buf) { ++ if (!ep->dwc_ep.is_in) { ++ dwc_memcpy(req->buf, req->dw_align_buf, req->length); ++ } ++ DWC_DMA_FREE(req->length, req->dw_align_buf, ++ req->dw_align_buf_dma); ++ } + + dwc_otg_request_done(ep, req, 0); + @@ -65073,14 +78393,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + if (dwc_ep->is_in == 0) { + addr = -+ &GET_CORE_IF(pcd)->dev_if->out_ep_regs[dwc_ep->num]-> -+ doepctl; ++ &GET_CORE_IF(pcd)->dev_if->out_ep_regs[dwc_ep-> ++ num]->doepctl; + } else { + addr = + &GET_CORE_IF(pcd)->dev_if->in_ep_regs[dwc_ep->num]->diepctl; + } + depctl.b.epena = 1; -+ dwc_modify_reg32(addr, depctl.d32, depctl.d32); ++ DWC_MODIFY_REG32(addr, depctl.d32, depctl.d32); +} + +/** @@ -65103,13 +78423,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + if (ep->is_in) { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]-> -+ dieptsiz); ++ DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[ep->num]->dieptsiz); + offset = ep->data_per_frame; + } else { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if->out_ep_regs[ep->num]-> -+ doeptsiz); ++ DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->num]->doeptsiz); + offset = + ep->data_per_frame + + (0x4 & (0x4 - (ep->data_per_frame & 0x3))); @@ -65163,8 +78483,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + for (j = 0; j < dwc_ep->pkt_per_frm; ++j) { + data_per_desc = + ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep-> -+ data_per_frame - ++ dwc_ep-> ++ data_per_frame) ? dwc_ep->data_per_frame - + j * dwc_ep->maxpacket : dwc_ep->maxpacket; + data_per_desc += + (data_per_desc % 4) ? (4 - @@ -65190,8 +78510,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + iso_packet->length = + data_per_desc - + sts.b_iso_out.rxbytes + (4 - -+ dwc_ep-> -+ data_per_frame ++ dwc_ep->data_per_frame + % 4); + } + @@ -65345,8 +78664,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + for (j = 0; j < dwc_ep->pkt_per_frm; ++j) { + data_per_desc = + ((j + 1) * dwc_ep->maxpacket > -+ dwc_ep->data_per_frame) ? dwc_ep-> -+ data_per_frame - ++ dwc_ep-> ++ data_per_frame) ? dwc_ep->data_per_frame - + j * dwc_ep->maxpacket : dwc_ep->maxpacket; + data_per_desc += + (data_per_desc % 4) ? (4 - @@ -65447,8 +78766,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + int i; + + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if->out_ep_regs[dwc_ep->num]-> -+ doeptsiz); ++ DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[dwc_ep->num]->doeptsiz); + + drp_pkt = dwc_ep->pkt_cnt - deptsiz.b.pktcnt; + drp_pkt_cnt = dwc_ep->pkt_per_frm - (drp_pkt % dwc_ep->pkt_per_frm); @@ -65469,7 +78788,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + deptsiz.b.pktcnt = 0; + } + -+ dwc_write_reg32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doeptsiz, ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doeptsiz, + deptsiz.d32); + + if (deptsiz.b.pktcnt > 0) { @@ -65483,16 +78802,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + deptsiz.b.xfersize;; + } + -+ dwc_write_reg32(&core_if->dev_if->out_ep_regs[dwc_ep->num]-> -+ doepdma, dma_addr); ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ out_ep_regs[dwc_ep->num]->doepdma, dma_addr); + + /** Re-enable endpoint, clear nak */ + depctl.d32 = 0; + depctl.b.epena = 1; + depctl.b.cnak = 1; + -+ dwc_modify_reg32(&core_if->dev_if->out_ep_regs[dwc_ep->num]-> -+ doepctl, depctl.d32, depctl.d32); ++ DWC_MODIFY_REG32(&core_if->dev_if-> ++ out_ep_regs[dwc_ep->num]->doepctl, depctl.d32, ++ depctl.d32); + return 0; + } else { + return 1; @@ -65525,11 +78845,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + if (ep->is_in) { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]-> ++ DWC_READ_REG32(&core_if->dev_if->in_ep_regs[ep->num]-> + dieptsiz); + } else { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if->out_ep_regs[ep->num]-> ++ DWC_READ_REG32(&core_if->dev_if->out_ep_regs[ep->num]-> + doeptsiz); + } + @@ -65539,8 +78859,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + frame_data = ep->data_per_frame; + for (j = 0; j < ep->pkt_per_frm; ++j) { + -+ /* Packet status - is not set as initially -+ * it is set to 0 and if packet was sent ++ /* Packet status - is not set as initially ++ * it is set to 0 and if packet was sent + successfully, status field will remain 0*/ + + /* Bytes has been transfered */ @@ -65558,11 +78878,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + return 1; + } else { -+ /* This is a workaround for in case of Transfer Complete with -+ * PktDrpSts interrupts merging - in this case Transfer complete -+ * interrupt for Isoc Out Endpoint is asserted without PktDrpSts ++ /* This is a workaround for in case of Transfer Complete with ++ * PktDrpSts interrupts merging - in this case Transfer complete ++ * interrupt for Isoc Out Endpoint is asserted without PktDrpSts + * set and with DOEPTSIZ register non zero. Investigations showed, -+ * that this happens when Out packet is dropped, but because of ++ * that this happens when Out packet is dropped, but because of + * interrupts merging during first interrupt handling PktDrpSts + * bit is cleared and for next merged interrupts it is not reset. + * In this case SW hadles the interrupt as if PktDrpSts bit is set. @@ -65588,7 +78908,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_ep_t *dwc_ep = &ep->dwc_ep; + uint8_t is_last = 0; + -+ if(ep->dwc_ep.next_frame == 0xffffffff) { ++ if (ep->dwc_ep.next_frame == 0xffffffff) { + DWC_WARN("Next frame is not set!\n"); + return; + } @@ -65651,12 +78971,64 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (is_last) + dwc_otg_iso_buffer_done(pcd, ep, ep->iso_req_handle); +} -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ ++ ++/** ++ * This function handle BNA interrupt for Non Isochronous EPs ++ * ++ */ ++static void dwc_otg_pcd_handle_noniso_bna(dwc_otg_pcd_ep_t * ep) ++{ ++ dwc_ep_t *dwc_ep = &ep->dwc_ep; ++ volatile uint32_t *addr; ++ depctl_data_t depctl = {.d32 = 0 }; ++ dwc_otg_pcd_t *pcd = ep->pcd; ++ dwc_otg_dev_dma_desc_t *dma_desc; ++ dev_dma_desc_sts_t sts = {.d32 = 0 }; ++ dwc_otg_core_if_t *core_if = ep->pcd->core_if; ++ int i, start; ++ ++ if (!dwc_ep->desc_cnt) ++ DWC_WARN("Ep%d %s Descriptor count = %d \n", dwc_ep->num, ++ (dwc_ep->is_in ? "IN" : "OUT"), dwc_ep->desc_cnt); ++ ++ if (core_if->core_params->cont_on_bna && !dwc_ep->is_in ++ && dwc_ep->type != DWC_OTG_EP_TYPE_CONTROL) { ++ uint32_t doepdma; ++ dwc_otg_dev_out_ep_regs_t *out_regs = ++ core_if->dev_if->out_ep_regs[dwc_ep->num]; ++ doepdma = DWC_READ_REG32(&(out_regs->doepdma)); ++ start = (doepdma - dwc_ep->dma_desc_addr)/sizeof(dwc_otg_dev_dma_desc_t); ++ dma_desc = &(dwc_ep->desc_addr[start]); ++ } else { ++ start = 0; ++ dma_desc = dwc_ep->desc_addr; ++ } ++ ++ ++ for (i = start; i < dwc_ep->desc_cnt; ++i, ++dma_desc) { ++ sts.d32 = dma_desc->status.d32; ++ sts.b.bs = BS_HOST_READY; ++ dma_desc->status.d32 = sts.d32; ++ } ++ ++ if (dwc_ep->is_in == 0) { ++ addr = ++ &GET_CORE_IF(pcd)->dev_if->out_ep_regs[dwc_ep->num]-> ++ doepctl; ++ } else { ++ addr = ++ &GET_CORE_IF(pcd)->dev_if->in_ep_regs[dwc_ep->num]->diepctl; ++ } ++ depctl.b.epena = 1; ++ depctl.b.cnak = 1; ++ DWC_MODIFY_REG32(addr, 0, depctl.d32); ++} + +/** + * This function handles EP0 Control transfers. + * -+ * The state of the control tranfers are tracked in ++ * The state of the control transfers are tracked in + * ep0state. + */ +static void handle_ep0(dwc_otg_pcd_t * pcd) @@ -65701,8 +79073,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + */ + if (core_if->dma_desc_enable == 0) { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if-> -+ in_ep_regs[0]->dieptsiz); ++ DWC_READ_REG32(&core_if-> ++ dev_if->in_ep_regs[0]-> ++ dieptsiz); + byte_count = + ep0->dwc_ep.xfer_len - deptsiz.b.xfersize; + } else { @@ -65723,7 +79096,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_ep0_continue_transfer(GET_CORE_IF(pcd), + &ep0->dwc_ep); + ep0->dwc_ep.sent_zlp = 0; -+ DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER\n"); ++ DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER sent zlp\n"); + } else { + ep0_complete_request(ep0); + DWC_DEBUGPL(DBG_PCD, "COMPLETE TRANSFER\n"); @@ -65738,8 +79111,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (core_if->dma_enable != 0) { + if (core_if->dma_desc_enable == 0) { + deptsiz.d32 = -+ dwc_read_reg32(&core_if->dev_if-> -+ out_ep_regs[0]->doeptsiz); ++ DWC_READ_REG32(&core_if-> ++ dev_if->out_ep_regs[0]-> ++ doeptsiz); + byte_count = + ep0->dwc_ep.maxpacket - deptsiz.b.xfersize; + } else { @@ -65760,7 +79134,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_ep0_continue_transfer(GET_CORE_IF(pcd), + &ep0->dwc_ep); + ep0->dwc_ep.sent_zlp = 0; -+ DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER\n"); ++ DWC_DEBUGPL(DBG_PCD, "CONTINUE TRANSFER sent zlp\n"); + } else { + ep0_complete_request(ep0); + DWC_DEBUGPL(DBG_PCD, "COMPLETE TRANSFER\n"); @@ -65806,12 +79180,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { + return; + } -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ + + core_if = GET_CORE_IF(pcd); + dev_if = core_if->dev_if; + -+ dieptsiz.d32 = dwc_read_reg32(&dev_if->in_ep_regs[epnum]->dieptsiz); ++ dieptsiz.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dieptsiz); + + DWC_DEBUGPL(DBG_PCD, "xfer_buff=%p xfer_count=%0x xfer_len=%0x" + " stopped=%d\n", ep->dwc_ep.xfer_buff, @@ -65845,6 +79219,177 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } +} + ++/* ++ * This function create new nextep sequnce based on Learn Queue. ++ * ++ * @param core_if Programming view of DWC_otg controller ++ */ ++void predict_nextep_seq( dwc_otg_core_if_t * core_if) ++{ ++ dwc_otg_device_global_regs_t *dev_global_regs = ++ core_if->dev_if->dev_global_regs; ++ const uint32_t TOKEN_Q_DEPTH = core_if->hwcfg2.b.dev_token_q_depth; ++ /* Number of Token Queue Registers */ ++ const int DTKNQ_REG_CNT = (TOKEN_Q_DEPTH + 7) / 8; ++ dtknq1_data_t dtknqr1; ++ uint32_t in_tkn_epnums[4]; ++ uint8_t seqnum[MAX_EPS_CHANNELS]; ++ uint8_t intkn_seq[TOKEN_Q_DEPTH]; ++ grstctl_t resetctl = {.d32 = 0 }; ++ uint8_t temp; ++ int ndx = 0; ++ int start = 0; ++ int end = 0; ++ int sort_done = 0; ++ int i = 0; ++ volatile uint32_t *addr = &dev_global_regs->dtknqr1; ++ ++ ++ DWC_DEBUGPL(DBG_PCD,"dev_token_q_depth=%d\n",TOKEN_Q_DEPTH); ++ ++ /* Read the DTKNQ Registers */ ++ for (i = 0; i < DTKNQ_REG_CNT; i++) { ++ in_tkn_epnums[i] = DWC_READ_REG32(addr); ++ DWC_DEBUGPL(DBG_PCDV, "DTKNQR%d=0x%08x\n", i + 1, ++ in_tkn_epnums[i]); ++ if (addr == &dev_global_regs->dvbusdis) { ++ addr = &dev_global_regs->dtknqr3_dthrctl; ++ } else { ++ ++addr; ++ } ++ ++ } ++ ++ /* Copy the DTKNQR1 data to the bit field. */ ++ dtknqr1.d32 = in_tkn_epnums[0]; ++ if (dtknqr1.b.wrap_bit) { ++ ndx = dtknqr1.b.intknwptr; ++ end = ndx -1; ++ if (end < 0) ++ end = TOKEN_Q_DEPTH -1; ++ } else { ++ ndx = 0; ++ end = dtknqr1.b.intknwptr -1; ++ if (end < 0) ++ end = 0; ++ } ++ start = ndx; ++ ++ /* Fill seqnum[] by initial values: EP number + 31 */ ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ seqnum[i] = i +31; ++ } ++ ++ /* Fill intkn_seq[] from in_tkn_epnums[0] */ ++ for (i=0; i < 6; i++) ++ intkn_seq[i] = (in_tkn_epnums[0] >> ((7-i) * 4)) & 0xf; ++ ++ if (TOKEN_Q_DEPTH > 6) { ++ /* Fill intkn_seq[] from in_tkn_epnums[1] */ ++ for (i=6; i < 14; i++) ++ intkn_seq[i] = ++ (in_tkn_epnums[1] >> ((7 - (i - 6)) * 4)) & 0xf; ++ } ++ ++ if (TOKEN_Q_DEPTH > 14) { ++ /* Fill intkn_seq[] from in_tkn_epnums[1] */ ++ for (i=14; i < 22; i++) ++ intkn_seq[i] = ++ (in_tkn_epnums[2] >> ((7 - (i - 14)) * 4)) & 0xf; ++ } ++ ++ if (TOKEN_Q_DEPTH > 22) { ++ /* Fill intkn_seq[] from in_tkn_epnums[1] */ ++ for (i=22; i < 30; i++) ++ intkn_seq[i] = ++ (in_tkn_epnums[3] >> ((7 - (i - 22)) * 4)) & 0xf; ++ } ++ ++ DWC_DEBUGPL(DBG_PCDV, "%s start=%d end=%d intkn_seq[]:\n", __func__, ++ start, end); ++ for (i=0; idev_if->num_in_eps; i++) { ++ if (core_if->nextep_seq[i] == 0xff ) ++ seqnum[i] = 0xff; ++ } ++ ++ /* Sort seqnum[] */ ++ sort_done = 0; ++ while (!sort_done) { ++ sort_done = 1; ++ for (i=0; idev_if->num_in_eps; i++) { ++ if (seqnum[i] > seqnum[i+1]) { ++ temp = seqnum[i]; ++ seqnum[i] = seqnum[i+1]; ++ seqnum[i+1] = temp; ++ sort_done = 0; ++ } ++ } ++ } ++ ++ ndx = start + seqnum[0]; ++ if (ndx >= TOKEN_Q_DEPTH) ++ ndx = ndx % TOKEN_Q_DEPTH; ++ core_if->first_in_nextep_seq = intkn_seq[ndx]; ++ ++ /* Update seqnum[] by EP numbers */ ++ for (i=0; i<=core_if->dev_if->num_in_eps; i++) { ++ ndx = start + i; ++ if (seqnum[i] < 31) { ++ ndx = start + seqnum[i]; ++ if (ndx >= TOKEN_Q_DEPTH) ++ ndx = ndx % TOKEN_Q_DEPTH; ++ seqnum[i] = intkn_seq[ndx]; ++ } else { ++ if (seqnum[i] < 0xff) { ++ seqnum[i] = seqnum[i] - 31; ++ } else { ++ break; ++ } ++ } ++ } ++ ++ /* Update nextep_seq[] based on seqnum[] */ ++ for (i=0; idev_if->num_in_eps; i++) { ++ if (seqnum[i] != 0xff) { ++ if (seqnum[i+1] != 0xff) { ++ core_if->nextep_seq[seqnum[i]] = seqnum[i+1]; ++ } else { ++ core_if->nextep_seq[seqnum[i]] = core_if->first_in_nextep_seq; ++ break; ++ } ++ } else { ++ break; ++ } ++ } ++ ++ DWC_DEBUGPL(DBG_PCDV, "%s first_in_nextep_seq= %2d; nextep_seq[]:\n", ++ __func__, core_if->first_in_nextep_seq); ++ for (i=0; i <= core_if->dev_if->num_in_eps; i++) { ++ DWC_DEBUGPL(DBG_PCDV,"%2d\n", core_if->nextep_seq[i]); ++ } ++ ++ /* Flush the Learning Queue */ ++ resetctl.d32 = DWC_READ_REG32(&core_if->core_global_regs->grstctl); ++ resetctl.b.intknqflsh = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->grstctl, resetctl.d32); ++ ++ ++} ++ +/** + * handle the IN EP disable interrupt. + */ @@ -65857,40 +79402,136 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dctl_data_t dctl = {.d32 = 0 }; + dwc_otg_pcd_ep_t *ep; + dwc_ep_t *dwc_ep; -+ ++ gintmsk_data_t gintmsk_data; ++ depctl_data_t depctl; ++ uint32_t diepdma; ++ uint32_t remain_to_transfer = 0; ++ uint8_t i; ++ uint32_t xfer_size; ++ + ep = get_in_ep(pcd, epnum); + dwc_ep = &ep->dwc_ep; + + if (dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { + dwc_otg_flush_tx_fifo(core_if, dwc_ep->tx_fifo_num); ++ complete_ep(ep); + return; + } + + DWC_DEBUGPL(DBG_PCD, "diepctl%d=%0x\n", epnum, -+ dwc_read_reg32(&dev_if->in_ep_regs[epnum]->diepctl)); -+ dieptsiz.d32 = dwc_read_reg32(&dev_if->in_ep_regs[epnum]->dieptsiz); ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->diepctl)); ++ dieptsiz.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->dieptsiz); ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->diepctl); + + DWC_DEBUGPL(DBG_ANY, "pktcnt=%d size=%d\n", + dieptsiz.b.pktcnt, dieptsiz.b.xfersize); ++ ++ if ((core_if->start_predict == 0) || (depctl.b.eptype & 1)) { ++ if (ep->stopped) { ++ if (core_if->en_multiple_tx_fifo) ++ /* Flush the Tx FIFO */ ++ dwc_otg_flush_tx_fifo(core_if, dwc_ep->tx_fifo_num); ++ /* Clear the Global IN NP NAK */ ++ dctl.d32 = 0; ++ dctl.b.cgnpinnak = 1; ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); ++ /* Restart the transaction */ ++ if (dieptsiz.b.pktcnt != 0 || dieptsiz.b.xfersize != 0) { ++ restart_transfer(pcd, epnum); ++ } ++ } else { ++ /* Restart the transaction */ ++ if (dieptsiz.b.pktcnt != 0 || dieptsiz.b.xfersize != 0) { ++ restart_transfer(pcd, epnum); ++ } ++ DWC_DEBUGPL(DBG_ANY, "STOPPED!!!\n"); ++ } ++ return; ++ } + -+ if (ep->stopped) { -+ /* Flush the Tx FIFO */ -+ dwc_otg_flush_tx_fifo(core_if, dwc_ep->tx_fifo_num); -+ /* Clear the Global IN NP NAK */ ++ if (core_if->start_predict > 2) { // NP IN EP ++ core_if->start_predict--; ++ return; ++ } ++ ++ core_if->start_predict--; ++ ++ if (core_if->start_predict == 1) { // All NP IN Ep's disabled now ++ ++ predict_nextep_seq(core_if); ++ ++ /* Update all active IN EP's NextEP field based of nextep_seq[] */ ++ for ( i = 0; i <= core_if->dev_if->num_in_eps; i++) { ++ depctl.d32 = ++ DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ if (core_if->nextep_seq[i] != 0xff) { // Active NP IN EP ++ depctl.b.nextep = core_if->nextep_seq[i]; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32); ++ } ++ } ++ /* Flush Shared NP TxFIFO */ ++ dwc_otg_flush_tx_fifo(core_if, 0); ++ /* Rewind buffers */ ++ if (!core_if->dma_desc_enable) { ++ i = core_if->first_in_nextep_seq; ++ do { ++ ep = get_in_ep(pcd, i); ++ dieptsiz.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->dieptsiz); ++ xfer_size = ep->dwc_ep.total_len - ep->dwc_ep.xfer_count; ++ if (xfer_size > ep->dwc_ep.maxxfer) ++ xfer_size = ep->dwc_ep.maxxfer; ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ if (dieptsiz.b.pktcnt != 0) { ++ if (xfer_size == 0) { ++ remain_to_transfer = 0; ++ } else { ++ if ((xfer_size % ep->dwc_ep.maxpacket) == 0) { ++ remain_to_transfer = ++ dieptsiz.b.pktcnt * ep->dwc_ep.maxpacket; ++ } else { ++ remain_to_transfer = ((dieptsiz.b.pktcnt -1) * ep->dwc_ep.maxpacket) ++ + (xfer_size % ep->dwc_ep.maxpacket); ++ } ++ } ++ diepdma = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepdma); ++ dieptsiz.b.xfersize = remain_to_transfer; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->dieptsiz, dieptsiz.d32); ++ diepdma = ep->dwc_ep.dma_addr + (xfer_size - remain_to_transfer); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepdma, diepdma); ++ } ++ i = core_if->nextep_seq[i]; ++ } while (i != core_if->first_in_nextep_seq); ++ } else { // dma_desc_enable ++ DWC_PRINTF("%s Learning Queue not supported in DDMA\n", __func__); ++ } ++ ++ /* Restart transfers in predicted sequences */ ++ i = core_if->first_in_nextep_seq; ++ do { ++ dieptsiz.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->dieptsiz); ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ if (dieptsiz.b.pktcnt != 0) { ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ depctl.b.epena = 1; ++ depctl.b.cnak = 1; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32); ++ } ++ i = core_if->nextep_seq[i]; ++ } while (i != core_if->first_in_nextep_seq); ++ ++ /* Clear the global non-periodic IN NAK handshake */ + dctl.d32 = 0; + dctl.b.cgnpinnak = 1; -+ dwc_modify_reg32(&dev_if->dev_global_regs->dctl, dctl.d32, 0); -+ /* Restart the transaction */ -+ if (dieptsiz.b.pktcnt != 0 || dieptsiz.b.xfersize != 0) { -+ restart_transfer(pcd, epnum); -+ } -+ } else { -+ /* Restart the transaction */ -+ if (dieptsiz.b.pktcnt != 0 || dieptsiz.b.xfersize != 0) { -+ restart_transfer(pcd, epnum); -+ } -+ DWC_DEBUGPL(DBG_ANY, "STOPPED!!!\n"); -+ } ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); ++ ++ /* Unmask EP Mismatch interrupt */ ++ gintmsk_data.d32 = 0; ++ gintmsk_data.b.epmismatch = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, 0, gintmsk_data.d32); ++ ++ core_if->start_predict = 0; ++ ++ } +} + +/** @@ -65916,7 +79557,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* Disable the NP Tx Fifo Empty Interrrupt */ + if (!core_if->dma_enable) { + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, + intr_mask.d32, 0); + } + /** @todo NGS Check EP type. @@ -65926,16 +79567,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + */ + /* Enable the Global IN NAK Effective Interrupt */ + intr_mask.b.ginnakeff = 1; -+ dwc_modify_reg32(&core_if->core_global_regs->gintmsk, 0, intr_mask.d32); ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, 0, intr_mask.d32); + + /* Set Global IN NAK */ + dctl.b.sgnpinnak = 1; -+ dwc_modify_reg32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); ++ DWC_MODIFY_REG32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32); + + ep->stopped = 1; + +#ifdef DEBUG -+ dieptsiz.d32 = dwc_read_reg32(&dev_if->in_ep_regs[num]->dieptsiz); ++ dieptsiz.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[num]->dieptsiz); + DWC_DEBUGPL(DBG_ANY, "pktcnt=%d size=%d\n", + dieptsiz.b.pktcnt, dieptsiz.b.xfersize); +#endif @@ -65947,7 +79588,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + */ + diepctl.d32 = 0; + diepctl.b.snak = 1; -+ dwc_modify_reg32(&dev_if->in_ep_regs[num]->diepctl, diepctl.d32, ++ DWC_MODIFY_REG32(&dev_if->in_ep_regs[num]->diepctl, diepctl.d32, + diepctl.d32); + ep->disabling = 1; + ep->stopped = 1; @@ -65955,7 +79596,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +} + +/** -+ * Handler for the IN EP NAK interrupt. ++ * Handler for the IN EP NAK interrupt. + */ +static inline int32_t handle_in_ep_nak_intr(dwc_otg_pcd_t * pcd, + const uint32_t epnum) @@ -65969,10 +79610,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + intr_mask.b.nak = 1; + + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + diepeachintmsk[epnum], intr_mask.d32, 0); + } else { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->diepmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->diepmsk, + intr_mask.d32, 0); + } + @@ -65980,7 +79621,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +} + +/** -+ * Handler for the OUT EP Babble interrupt. ++ * Handler for the OUT EP Babble interrupt. + */ +static inline int32_t handle_out_ep_babble_intr(dwc_otg_pcd_t * pcd, + const uint32_t epnum) @@ -65995,10 +79636,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + intr_mask.b.babble = 1; + + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + doepeachintmsk[epnum], intr_mask.d32, 0); + } else { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->doepmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->doepmsk, + intr_mask.d32, 0); + } + @@ -66006,7 +79647,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +} + +/** -+ * Handler for the OUT EP NAK interrupt. ++ * Handler for the OUT EP NAK interrupt. + */ +static inline int32_t handle_out_ep_nak_intr(dwc_otg_pcd_t * pcd, + const uint32_t epnum) @@ -66015,15 +79656,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_core_if_t *core_if; + doepmsk_data_t intr_mask = {.d32 = 0 }; + -+ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", "OUT EP NAK"); ++ DWC_DEBUGPL(DBG_ANY, "INTERRUPT Handler not implemented for %s\n", "OUT EP NAK"); + core_if = GET_CORE_IF(pcd); + intr_mask.b.nak = 1; + + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + doepeachintmsk[epnum], intr_mask.d32, 0); + } else { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->doepmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->doepmsk, + intr_mask.d32, 0); + } + @@ -66031,7 +79672,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +} + +/** -+ * Handler for the OUT EP NYET interrupt. ++ * Handler for the OUT EP NYET interrupt. + */ +static inline int32_t handle_out_ep_nyet_intr(dwc_otg_pcd_t * pcd, + const uint32_t epnum) @@ -66045,10 +79686,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + intr_mask.b.nyet = 1; + + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs-> ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs-> + doepeachintmsk[epnum], intr_mask.d32, 0); + } else { -+ dwc_modify_reg32(&core_if->dev_if->dev_global_regs->doepmsk, ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->doepmsk, + intr_mask.d32, 0); + } + @@ -66077,14 +79718,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +do { \ + diepint_data_t diepint = {.d32=0}; \ + diepint.b.__intr = 1; \ -+ dwc_write_reg32(&__core_if->dev_if->in_ep_regs[__epnum]->diepint, \ ++ DWC_WRITE_REG32(&__core_if->dev_if->in_ep_regs[__epnum]->diepint, \ + diepint.d32); \ +} while (0) + + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + dwc_otg_dev_if_t *dev_if = core_if->dev_if; + diepint_data_t diepint = {.d32 = 0 }; -+ dctl_data_t dctl = {.d32 = 0 }; + depctl_data_t depctl = {.d32 = 0 }; + uint32_t ep_intr; + uint32_t epnum = 0; @@ -66106,10 +79746,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_ep = &ep->dwc_ep; + + depctl.d32 = -+ dwc_read_reg32(&dev_if->in_ep_regs[epnum]->diepctl); ++ DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->diepctl); + empty_msk = -+ dwc_read_reg32(&dev_if->dev_global_regs-> -+ dtknqr4_fifoemptymsk); ++ DWC_READ_REG32(&dev_if-> ++ dev_global_regs->dtknqr4_fifoemptymsk); + + DWC_DEBUGPL(DBG_PCDV, + "IN EP INTERRUPT - %d\nepmty_msk - %8x diepctl - %8x\n", @@ -66129,20 +79769,18 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + /* Transfer complete */ + if (diepint.b.xfercompl) { + /* Disable the NP Tx FIFO Empty -+ * Interrrupt */ ++ * Interrupt */ + if (core_if->en_multiple_tx_fifo == 0) { + intr_mask.b.nptxfempty = 1; -+ dwc_modify_reg32(&core_if-> -+ core_global_regs-> -+ gintmsk, intr_mask.d32, -+ 0); ++ DWC_MODIFY_REG32 ++ (&core_if->core_global_regs->gintmsk, ++ intr_mask.d32, 0); + } else { + /* Disable the Tx FIFO Empty Interrupt for this EP */ + uint32_t fifoemptymsk = + 0x1 << dwc_ep->num; -+ dwc_modify_reg32(&core_if->dev_if-> -+ dev_global_regs-> -+ dtknqr4_fifoemptymsk, ++ DWC_MODIFY_REG32(&core_if-> ++ dev_if->dev_global_regs->dtknqr4_fifoemptymsk, + fifoemptymsk, 0); + } + /* Clear the bit in DIEPINTn for this interrupt */ @@ -66157,10 +79795,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (!ep->stopped) + complete_iso_ep(pcd, ep); + } -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ ++#ifdef DWC_UTE_PER_IO ++ else if (dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ if (!ep->stopped) ++ complete_xiso_ep(ep); ++ } ++#endif /* DWC_UTE_PER_IO */ + else { -+ ++ if (dwc_ep->type == DWC_OTG_EP_TYPE_ISOC && ++ dwc_ep->bInterval > 1) { ++ dwc_ep->frame_num += dwc_ep->bInterval; ++ if (dwc_ep->frame_num > 0x3FFF) ++ { ++ dwc_ep->frm_overrun = 1; ++ dwc_ep->frame_num &= 0x3FFF; ++ } else ++ dwc_ep->frm_overrun = 0; ++ } + complete_ep(ep); ++ if(diepint.b.nak) ++ CLEAR_IN_EP_INTR(core_if, epnum, nak); + } + } + /* Endpoint disable */ @@ -66174,15 +79829,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + /* AHB Error */ + if (diepint.b.ahberr) { -+ DWC_DEBUGPL(DBG_ANY, "EP%d IN AHB Error\n", -+ epnum); ++ DWC_ERROR("EP%d IN AHB Error\n", epnum); + /* Clear the bit in DIEPINTn for this interrupt */ + CLEAR_IN_EP_INTR(core_if, epnum, ahberr); + } + /* TimeOUT Handshake (non-ISOC IN EPs) */ + if (diepint.b.timeout) { -+ DWC_DEBUGPL(DBG_ANY, "EP%d IN Time-out\n", -+ epnum); ++ DWC_ERROR("EP%d IN Time-out\n", epnum); + handle_in_ep_timeout_intr(pcd, epnum); + + CLEAR_IN_EP_INTR(core_if, epnum, timeout); @@ -66198,18 +79851,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + diepmsk.b.intktxfemp = 1; + + if (core_if->multiproc_int_enable) { -+ dwc_modify_reg32(&dev_if-> -+ dev_global_regs-> -+ diepeachintmsk -+ [epnum], -+ diepmsk.d32, -+ 0); ++ DWC_MODIFY_REG32 ++ (&dev_if->dev_global_regs->diepeachintmsk ++ [epnum], diepmsk.d32, 0); + } else { -+ dwc_modify_reg32(&dev_if-> -+ dev_global_regs-> -+ diepmsk, -+ diepmsk.d32, -+ 0); ++ DWC_MODIFY_REG32 ++ (&dev_if->dev_global_regs->diepmsk, ++ diepmsk.d32, 0); + } + } else if (core_if->dma_desc_enable + && epnum == 0 @@ -66217,18 +79865,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + EP0_OUT_STATUS_PHASE) { + // EP0 IN set STALL + depctl.d32 = -+ dwc_read_reg32(&dev_if-> -+ in_ep_regs[epnum]-> -+ diepctl); ++ DWC_READ_REG32(&dev_if->in_ep_regs ++ [epnum]->diepctl); + + /* set the disable and stall bits */ + if (depctl.b.epena) { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; -+ dwc_write_reg32(&dev_if-> -+ in_ep_regs[epnum]-> -+ diepctl, depctl.d32); ++ DWC_WRITE_REG32(&dev_if->in_ep_regs ++ [epnum]->diepctl, ++ depctl.d32); + } + CLEAR_IN_EP_INTR(core_if, epnum, intktxfemp); + } @@ -66236,7 +79883,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (diepint.b.intknepmis) { + DWC_DEBUGPL(DBG_ANY, + "EP%d IN TKN EP Mismatch\n", epnum); -+ CLEAR_IN_EP_INTR(core_if, epnum, intknepmis); ++ CLEAR_IN_EP_INTR(core_if, epnum, intknepmis); + } + /** IN Endpoint NAK Effective */ + if (diepint.b.inepnakeff) { @@ -66248,9 +79895,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + depctl.d32 = 0; + depctl.b.snak = 1; + depctl.b.epdis = 1; -+ dwc_modify_reg32(&dev_if-> -+ in_ep_regs[epnum]-> -+ diepctl, depctl.d32, ++ DWC_MODIFY_REG32(&dev_if->in_ep_regs ++ [epnum]->diepctl, ++ depctl.d32, + depctl.d32); + } + CLEAR_IN_EP_INTR(core_if, epnum, inepnakeff); @@ -66276,35 +79923,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (dwc_ep->type == + DWC_OTG_EP_TYPE_ISOC) { + /* -+ * This checking is performed to prevent first "false" BNA -+ * handling occuring right after reconnect ++ * This checking is performed to prevent first "false" BNA ++ * handling occuring right after reconnect + */ + if (dwc_ep->next_frame != + 0xffffffff) -+ dwc_otg_pcd_handle_iso_bna -+ (ep); ++ dwc_otg_pcd_handle_iso_bna(ep); + } else +#endif /* DWC_EN_ISOC */ + { -+ dctl.d32 = -+ dwc_read_reg32(&dev_if-> -+ dev_global_regs-> -+ dctl); -+ -+ /* If Global Continue on BNA is disabled - disable EP */ -+ if (!dctl.b.gcontbna) { -+ depctl.d32 = 0; -+ depctl.b.snak = 1; -+ depctl.b.epdis = 1; -+ dwc_modify_reg32 -+ (&dev_if-> -+ in_ep_regs[epnum]-> -+ diepctl, -+ depctl.d32, -+ depctl.d32); -+ } else { -+ start_next_request(ep); -+ } ++ dwc_otg_pcd_handle_noniso_bna(ep); + } + } + } @@ -66312,7 +79940,31 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (diepint.b.nak) { + DWC_DEBUGPL(DBG_ANY, "EP%d IN NAK Interrupt\n", + epnum); -+ handle_in_ep_nak_intr(pcd, epnum); ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { ++ depctl_data_t depctl; ++ if (ep->dwc_ep.frame_num == 0xFFFFFFFF) { ++ ep->dwc_ep.frame_num = core_if->frame_num; ++ if (ep->dwc_ep.bInterval > 1) { ++ depctl.d32 = 0; ++ depctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[epnum]->diepctl); ++ if (ep->dwc_ep.frame_num & 0x1) { ++ depctl.b.setd1pid = 1; ++ depctl.b.setd0pid = 0; ++ } else { ++ depctl.b.setd0pid = 1; ++ depctl.b.setd1pid = 0; ++ } ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[epnum]->diepctl, depctl.d32); ++ } ++ start_next_request(ep); ++ } ++ ep->dwc_ep.frame_num += ep->dwc_ep.bInterval; ++ if (dwc_ep->frame_num > 0x3FFF) { ++ dwc_ep->frm_overrun = 1; ++ dwc_ep->frame_num &= 0x3FFF; ++ } else ++ dwc_ep->frm_overrun = 0; ++ } + + CLEAR_IN_EP_INTR(core_if, epnum, nak); + } @@ -66344,19 +79996,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +do { \ + doepint_data_t doepint = {.d32=0}; \ + doepint.b.__intr = 1; \ -+ dwc_write_reg32(&__core_if->dev_if->out_ep_regs[__epnum]->doepint, \ ++ DWC_WRITE_REG32(&__core_if->dev_if->out_ep_regs[__epnum]->doepint, \ + doepint.d32); \ +} while (0) + + dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); -+ dwc_otg_dev_if_t *dev_if = core_if->dev_if; + uint32_t ep_intr; + doepint_data_t doepint = {.d32 = 0 }; -+ dctl_data_t dctl = {.d32 = 0 }; -+ depctl_data_t doepctl = {.d32 = 0 }; + uint32_t epnum = 0; + dwc_otg_pcd_ep_t *ep; + dwc_ep_t *dwc_ep; ++ dctl_data_t dctl = {.d32 = 0 }; ++ gintmsk_data_t gintmsk = {.d32 = 0 }; ++ + + DWC_DEBUGPL(DBG_PCDV, "%s()\n", __func__); + @@ -66377,17 +80029,290 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#endif + doepint.d32 = + dwc_otg_read_dev_out_ep_intr(core_if, dwc_ep); -+ ++ /* Moved this interrupt upper due to core deffect of asserting ++ * OUT EP 0 xfercompl along with stsphsrcvd in BDMA */ ++ if (doepint.b.stsphsercvd) { ++ deptsiz0_data_t deptsiz; ++ CLEAR_OUT_EP_INTR(core_if, epnum, stsphsercvd); ++ deptsiz.d32 = ++ DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[0]->doeptsiz); ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a ++ && core_if->dma_enable ++ && core_if->dma_desc_enable == 0 ++ && doepint.b.xfercompl ++ && deptsiz.b.xfersize == 24) { ++ CLEAR_OUT_EP_INTR(core_if, epnum, ++ xfercompl); ++ doepint.b.xfercompl = 0; ++ ep0_out_start(core_if, pcd); ++ } ++ if ((core_if->dma_desc_enable) || ++ (core_if->dma_enable ++ && core_if->snpsid >= ++ OTG_CORE_REV_3_00a)) { ++ do_setup_in_status_phase(pcd); ++ } ++ } + /* Transfer complete */ + if (doepint.b.xfercompl) { + + if (epnum == 0) { + /* Clear the bit in DOEPINTn for this interrupt */ -+ CLEAR_OUT_EP_INTR(core_if, epnum, -+ xfercompl); ++ CLEAR_OUT_EP_INTR(core_if, epnum, xfercompl); ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a) { ++ DWC_DEBUGPL(DBG_PCDV, "DOEPINT=%x doepint=%x\n", ++ DWC_READ_REG32(&core_if->dev_if->out_ep_regs[0]->doepint), ++ doepint.d32); ++ DWC_DEBUGPL(DBG_PCDV, "DOEPCTL=%x \n", ++ DWC_READ_REG32(&core_if->dev_if->out_ep_regs[0]->doepctl)); ++ ++ if (core_if->snpsid >= OTG_CORE_REV_3_00a ++ && core_if->dma_enable == 0) { ++ doepint_data_t doepint; ++ doepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[0]->doepint); ++ if (pcd->ep0state == EP0_IDLE && doepint.b.sr) { ++ CLEAR_OUT_EP_INTR(core_if, epnum, sr); ++ goto exit_xfercompl; ++ } ++ } ++ /* In case of DDMA look at SR bit to go to the Data Stage */ ++ if (core_if->dma_desc_enable) { ++ dev_dma_desc_sts_t status = {.d32 = 0}; ++ if (pcd->ep0state == EP0_IDLE) { ++ status.d32 = core_if->dev_if->setup_desc_addr[core_if-> ++ dev_if->setup_desc_index]->status.d32; ++ if(pcd->data_terminated) { ++ pcd->data_terminated = 0; ++ status.d32 = core_if->dev_if->out_desc_addr->status.d32; ++ dwc_memcpy(&pcd->setup_pkt->req, pcd->backup_buf, 8); ++ } ++ if (status.b.sr) { ++ if (doepint.b.setup) { ++ DWC_DEBUGPL(DBG_PCDV, "DMA DESC EP0_IDLE SR=1 setup=1\n"); ++ /* Already started data stage, clear setup */ ++ CLEAR_OUT_EP_INTR(core_if, epnum, setup); ++ doepint.b.setup = 0; ++ handle_ep0(pcd); ++ /* Prepare for more setup packets */ ++ if (pcd->ep0state == EP0_IN_STATUS_PHASE || ++ pcd->ep0state == EP0_IN_DATA_PHASE) { ++ ep0_out_start(core_if, pcd); ++ } ++ ++ goto exit_xfercompl; ++ } else { ++ /* Prepare for more setup packets */ ++ DWC_DEBUGPL(DBG_PCDV, ++ "EP0_IDLE SR=1 setup=0 new setup comes\n"); ++ ep0_out_start(core_if, pcd); ++ } ++ } ++ } else { ++ dwc_otg_pcd_request_t *req; ++ dev_dma_desc_sts_t status = {.d32 = 0}; ++ diepint_data_t diepint0; ++ diepint0.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint); ++ ++ if (pcd->ep0state == EP0_STALL || pcd->ep0state == EP0_DISCONNECT) { ++ DWC_ERROR("EP0 is stalled/disconnected\n"); ++ } ++ ++ /* Clear IN xfercompl if set */ ++ if (diepint0.b.xfercompl && (pcd->ep0state == EP0_IN_STATUS_PHASE ++ || pcd->ep0state == EP0_IN_DATA_PHASE)) { ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint, diepint0.d32); ++ } ++ ++ status.d32 = core_if->dev_if->setup_desc_addr[core_if-> ++ dev_if->setup_desc_index]->status.d32; ++ ++ if (ep->dwc_ep.xfer_count != ep->dwc_ep.total_len ++ && (pcd->ep0state == EP0_OUT_DATA_PHASE)) ++ status.d32 = core_if->dev_if->out_desc_addr->status.d32; ++ if (pcd->ep0state == EP0_OUT_STATUS_PHASE) ++ status.d32 = status.d32 = core_if->dev_if-> ++ out_desc_addr->status.d32; ++ ++ if (status.b.sr) { ++ if (DWC_CIRCLEQ_EMPTY(&ep->queue)) { ++ DWC_DEBUGPL(DBG_PCDV, "Request queue empty!!\n"); ++ } else { ++ DWC_DEBUGPL(DBG_PCDV, "complete req!!\n"); ++ req = DWC_CIRCLEQ_FIRST(&ep->queue); ++ if (ep->dwc_ep.xfer_count != ep->dwc_ep.total_len && ++ pcd->ep0state == EP0_OUT_DATA_PHASE) { ++ /* Read arrived setup packet from req->buf */ ++ dwc_memcpy(&pcd->setup_pkt->req, ++ req->buf + ep->dwc_ep.xfer_count, 8); ++ } ++ req->actual = ep->dwc_ep.xfer_count; ++ dwc_otg_request_done(ep, req, -ECONNRESET); ++ ep->dwc_ep.start_xfer_buff = 0; ++ ep->dwc_ep.xfer_buff = 0; ++ ep->dwc_ep.xfer_len = 0; ++ } ++ pcd->ep0state = EP0_IDLE; ++ if (doepint.b.setup) { ++ DWC_DEBUGPL(DBG_PCDV, "EP0_IDLE SR=1 setup=1\n"); ++ /* Data stage started, clear setup */ ++ CLEAR_OUT_EP_INTR(core_if, epnum, setup); ++ doepint.b.setup = 0; ++ handle_ep0(pcd); ++ /* Prepare for setup packets if ep0in was enabled*/ ++ if (pcd->ep0state == EP0_IN_STATUS_PHASE) { ++ ep0_out_start(core_if, pcd); ++ } ++ ++ goto exit_xfercompl; ++ } else { ++ /* Prepare for more setup packets */ ++ DWC_DEBUGPL(DBG_PCDV, ++ "EP0_IDLE SR=1 setup=0 new setup comes 2\n"); ++ ep0_out_start(core_if, pcd); ++ } ++ } ++ } ++ } ++ if (core_if->snpsid >= OTG_CORE_REV_2_94a && core_if->dma_enable ++ && core_if->dma_desc_enable == 0) { ++ doepint_data_t doepint_temp = {.d32 = 0}; ++ deptsiz0_data_t doeptsize0 = {.d32 = 0 }; ++ doepint_temp.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->dwc_ep.num]->doepint); ++ doeptsize0.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->dwc_ep.num]->doeptsiz); ++ if (pcd->ep0state == EP0_IDLE) { ++ if (doepint_temp.b.sr) { ++ CLEAR_OUT_EP_INTR(core_if, epnum, sr); ++ } ++ doepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[0]->doepint); ++ if (doeptsize0.b.supcnt == 3) { ++ DWC_DEBUGPL(DBG_ANY, "Rolling over!!!!!!!\n"); ++ ep->dwc_ep.stp_rollover = 1; ++ } ++ if (doepint.b.setup) { ++retry: ++ /* Already started data stage, clear setup */ ++ CLEAR_OUT_EP_INTR(core_if, epnum, setup); ++ doepint.b.setup = 0; ++ handle_ep0(pcd); ++ ep->dwc_ep.stp_rollover = 0; ++ /* Prepare for more setup packets */ ++ if (pcd->ep0state == EP0_IN_STATUS_PHASE || ++ pcd->ep0state == EP0_IN_DATA_PHASE) { ++ ep0_out_start(core_if, pcd); ++ } ++ goto exit_xfercompl; ++ } else { ++ /* Prepare for more setup packets */ ++ DWC_DEBUGPL(DBG_ANY, ++ "EP0_IDLE SR=1 setup=0 new setup comes\n"); ++ doepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[0]->doepint); ++ if(doepint.b.setup) ++ goto retry; ++ ep0_out_start(core_if, pcd); ++ } ++ } else { ++ dwc_otg_pcd_request_t *req; ++ diepint_data_t diepint0 = {.d32 = 0}; ++ doepint_data_t doepint_temp = {.d32 = 0}; ++ depctl_data_t diepctl0; ++ diepint0.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint); ++ diepctl0.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepctl); ++ ++ if (pcd->ep0state == EP0_IN_DATA_PHASE ++ || pcd->ep0state == EP0_IN_STATUS_PHASE) { ++ if (diepint0.b.xfercompl) { ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint, diepint0.d32); ++ } ++ if (diepctl0.b.epena) { ++ diepint_data_t diepint = {.d32 = 0}; ++ diepctl0.b.snak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepctl, diepctl0.d32); ++ do { ++ dwc_udelay(10); ++ diepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint); ++ } while (!diepint.b.inepnakeff); ++ diepint.b.inepnakeff = 1; ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint, diepint.d32); ++ diepctl0.d32 = 0; ++ diepctl0.b.epdis = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[0]->diepctl, ++ diepctl0.d32); ++ do { ++ dwc_udelay(10); ++ diepint.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ in_ep_regs[0]->diepint); ++ } while (!diepint.b.epdisabled); ++ diepint.b.epdisabled = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->in_ep_regs[0]->diepint, ++ diepint.d32); ++ } ++ } ++ doepint_temp.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[ep->dwc_ep.num]->doepint); ++ if (doepint_temp.b.sr) { ++ CLEAR_OUT_EP_INTR(core_if, epnum, sr); ++ if (DWC_CIRCLEQ_EMPTY(&ep->queue)) { ++ DWC_DEBUGPL(DBG_PCDV, "Request queue empty!!\n"); ++ } else { ++ DWC_DEBUGPL(DBG_PCDV, "complete req!!\n"); ++ req = DWC_CIRCLEQ_FIRST(&ep->queue); ++ if (ep->dwc_ep.xfer_count != ep->dwc_ep.total_len && ++ pcd->ep0state == EP0_OUT_DATA_PHASE) { ++ /* Read arrived setup packet from req->buf */ ++ dwc_memcpy(&pcd->setup_pkt->req, ++ req->buf + ep->dwc_ep.xfer_count, 8); ++ } ++ req->actual = ep->dwc_ep.xfer_count; ++ dwc_otg_request_done(ep, req, -ECONNRESET); ++ ep->dwc_ep.start_xfer_buff = 0; ++ ep->dwc_ep.xfer_buff = 0; ++ ep->dwc_ep.xfer_len = 0; ++ } ++ pcd->ep0state = EP0_IDLE; ++ if (doepint.b.setup) { ++ DWC_DEBUGPL(DBG_PCDV, "EP0_IDLE SR=1 setup=1\n"); ++ /* Data stage started, clear setup */ ++ CLEAR_OUT_EP_INTR(core_if, epnum, setup); ++ doepint.b.setup = 0; ++ handle_ep0(pcd); ++ /* Prepare for setup packets if ep0in was enabled*/ ++ if (pcd->ep0state == EP0_IN_STATUS_PHASE) { ++ ep0_out_start(core_if, pcd); ++ } ++ goto exit_xfercompl; ++ } else { ++ /* Prepare for more setup packets */ ++ DWC_DEBUGPL(DBG_PCDV, ++ "EP0_IDLE SR=1 setup=0 new setup comes 2\n"); ++ ep0_out_start(core_if, pcd); ++ } ++ } ++ } ++ } ++ if (core_if->dma_enable == 0 || pcd->ep0state != EP0_IDLE) ++ handle_ep0(pcd); ++exit_xfercompl: ++ DWC_DEBUGPL(DBG_PCDV, "DOEPINT=%x doepint=%x\n", ++ dwc_otg_read_dev_out_ep_intr(core_if, dwc_ep), doepint.d32); ++ } else { + if (core_if->dma_desc_enable == 0 + || pcd->ep0state != EP0_IDLE) + handle_ep0(pcd); ++ } +#ifdef DWC_EN_ISOC + } else if (dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { + if (doepint.b.pktdrpsts == 0) { @@ -66398,28 +80323,39 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + complete_iso_ep(pcd, ep); + } else { + -+ doepint_data_t doepint = {.d32 = -+ 0 }; ++ doepint_data_t doepint = {.d32 = 0 }; + doepint.b.xfercompl = 1; + doepint.b.pktdrpsts = 1; -+ dwc_write_reg32(&core_if-> -+ dev_if-> -+ out_ep_regs -+ [epnum]-> -+ doepint, -+ doepint.d32); ++ DWC_WRITE_REG32 ++ (&core_if->dev_if->out_ep_regs ++ [epnum]->doepint, ++ doepint.d32); + if (handle_iso_out_pkt_dropped + (core_if, dwc_ep)) { + complete_iso_ep(pcd, + ep); + } + } -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ ++#ifdef DWC_UTE_PER_IO ++ } else if (dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ CLEAR_OUT_EP_INTR(core_if, epnum, xfercompl); ++ if (!ep->stopped) ++ complete_xiso_ep(ep); ++#endif /* DWC_UTE_PER_IO */ + } else { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(core_if, epnum, + xfercompl); -+ complete_ep(ep); ++ ++ if (core_if->core_params->dev_out_nak) { ++ DWC_TIMER_CANCEL(pcd->core_if->ep_xfer_timer[epnum]); ++ pcd->core_if->ep_xfer_info[epnum].state = 0; ++#ifdef DEBUG ++ print_memory_payload(pcd, dwc_ep); ++#endif ++ } ++ complete_ep(ep); + } + + } @@ -66429,21 +80365,66 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(core_if, epnum, epdisabled); ++ if (core_if->core_params->dev_out_nak) { ++#ifdef DEBUG ++ print_memory_payload(pcd, dwc_ep); ++#endif ++ /* In case of timeout condition */ ++ if (core_if->ep_xfer_info[epnum].state == 2) { ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->dctl); ++ dctl.b.cgoutnak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, ++ dctl.d32); ++ /* Unmask goutnakeff interrupt which was masked ++ * during handle nak out interrupt */ ++ gintmsk.b.goutnakeff = 1; ++ DWC_MODIFY_REG32(&core_if->core_global_regs->gintmsk, ++ 0, gintmsk.d32); ++ ++ complete_ep(ep); ++ } ++ } ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) ++ { ++ dctl_data_t dctl; ++ gintmsk_data_t intr_mask = {.d32 = 0}; ++ dwc_otg_pcd_request_t *req = 0; ++ ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ dev_global_regs->dctl); ++ dctl.b.cgoutnak = 1; ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, ++ dctl.d32); ++ ++ intr_mask.d32 = 0; ++ intr_mask.b.incomplisoout = 1; ++ ++ /* Get any pending requests */ ++ if (!DWC_CIRCLEQ_EMPTY(&ep->queue)) { ++ req = DWC_CIRCLEQ_FIRST(&ep->queue); ++ if (!req) { ++ DWC_PRINTF("complete_ep 0x%p, req = NULL!\n", ep); ++ } else { ++ dwc_otg_request_done(ep, req, 0); ++ start_next_request(ep); ++ } ++ } else { ++ DWC_PRINTF("complete_ep 0x%p, ep->queue empty!\n", ep); ++ } ++ } + } + /* AHB Error */ + if (doepint.b.ahberr) { -+ DWC_DEBUGPL(DBG_PCD, "EP%d OUT AHB Error\n", -+ epnum); -+ DWC_DEBUGPL(DBG_PCD, "EP DMA REG %d \n", -+ core_if->dev_if-> -+ out_ep_regs[epnum]->doepdma); ++ DWC_ERROR("EP%d OUT AHB Error\n", epnum); ++ DWC_ERROR("EP%d DEPDMA=0x%08x \n", ++ epnum, core_if->dev_if->out_ep_regs[epnum]->doepdma); + CLEAR_OUT_EP_INTR(core_if, epnum, ahberr); + } + /* Setup Phase Done (contorl EPs) */ + if (doepint.b.setup) { +#ifdef DEBUG_EP0 -+ DWC_DEBUGPL(DBG_PCD, "EP%d SETUP Done\n", -+ epnum); ++ DWC_DEBUGPL(DBG_PCD, "EP%d SETUP Done\n", epnum); +#endif + CLEAR_OUT_EP_INTR(core_if, epnum, setup); + @@ -66458,45 +80439,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (dwc_ep->type == + DWC_OTG_EP_TYPE_ISOC) { + /* -+ * This checking is performed to prevent first "false" BNA -+ * handling occuring right after reconnect ++ * This checking is performed to prevent first "false" BNA ++ * handling occuring right after reconnect + */ + if (dwc_ep->next_frame != + 0xffffffff) -+ dwc_otg_pcd_handle_iso_bna -+ (ep); ++ dwc_otg_pcd_handle_iso_bna(ep); + } else +#endif /* DWC_EN_ISOC */ + { -+ dctl.d32 = -+ dwc_read_reg32(&dev_if-> -+ dev_global_regs-> -+ dctl); -+ -+ /* If Global Continue on BNA is disabled - disable EP */ -+ if (!dctl.b.gcontbna) { -+ doepctl.d32 = 0; -+ doepctl.b.snak = 1; -+ doepctl.b.epdis = 1; -+ dwc_modify_reg32 -+ (&dev_if-> -+ out_ep_regs -+ [epnum]->doepctl, -+ doepctl.d32, -+ doepctl.d32); -+ } else { -+ start_next_request(ep); -+ } ++ dwc_otg_pcd_handle_noniso_bna(ep); + } + } + } -+ if (doepint.b.stsphsercvd) { -+ CLEAR_OUT_EP_INTR(core_if, epnum, stsphsercvd); -+ if (core_if->dma_desc_enable) { -+ do_setup_in_status_phase(pcd); -+ } -+ } -+ /* Babble Interrutp */ ++ /* Babble Interrupt */ + if (doepint.b.babble) { + DWC_DEBUGPL(DBG_ANY, "EP%d OUT Babble\n", + epnum); @@ -66504,6 +80460,34 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + + CLEAR_OUT_EP_INTR(core_if, epnum, babble); + } ++ if (doepint.b.outtknepdis) { ++ DWC_DEBUGPL(DBG_ANY, "EP%d OUT Token received when EP is \ ++ disabled\n",epnum); ++ if (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { ++ doepmsk_data_t doepmsk = {.d32 = 0}; ++ ep->dwc_ep.frame_num = core_if->frame_num; ++ if (ep->dwc_ep.bInterval > 1) { ++ depctl_data_t depctl; ++ depctl.d32 = DWC_READ_REG32(&core_if->dev_if-> ++ out_ep_regs[epnum]->doepctl); ++ if (ep->dwc_ep.frame_num & 0x1) { ++ depctl.b.setd1pid = 1; ++ depctl.b.setd0pid = 0; ++ } else { ++ depctl.b.setd0pid = 1; ++ depctl.b.setd1pid = 0; ++ } ++ DWC_WRITE_REG32(&core_if->dev_if-> ++ out_ep_regs[epnum]->doepctl, depctl.d32); ++ } ++ start_next_request(ep); ++ doepmsk.b.outtknepdis = 1; ++ DWC_MODIFY_REG32(&core_if->dev_if->dev_global_regs->doepmsk, ++ doepmsk.d32, 0); ++ } ++ CLEAR_OUT_EP_INTR(core_if, epnum, outtknepdis); ++ } ++ + /* NAK Interrutp */ + if (doepint.b.nak) { + DWC_DEBUGPL(DBG_ANY, "EP%d OUT NAK\n", epnum); @@ -66528,7 +80512,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + +#undef CLEAR_OUT_EP_INTR +} -+ ++static int drop_transfer(uint32_t trgt_fr, uint32_t curr_fr, uint8_t frm_overrun) ++{ ++ int retval = 0; ++ if(!frm_overrun && curr_fr >= trgt_fr) ++ retval = 1; ++ else if (frm_overrun ++ && (curr_fr >= trgt_fr && ((curr_fr - trgt_fr) < 0x3FFF / 2))) ++ retval = 1; ++ return retval; ++} +/** + * Incomplete ISO IN Transfer Interrupt. + * This interrupt indicates one of the following conditions occurred @@ -66559,9 +80552,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_ep = &pcd->in_ep[i].dwc_ep; + if (dwc_ep->active && dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { + deptsiz.d32 = -+ dwc_read_reg32(&dev_if->in_ep_regs[i]->dieptsiz); ++ DWC_READ_REG32(&dev_if->in_ep_regs[i]->dieptsiz); + depctl.d32 = -+ dwc_read_reg32(&dev_if->in_ep_regs[i]->diepctl); ++ DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); + + if (depctl.b.epdis && deptsiz.d32) { + set_current_pkt_info(GET_CORE_IF(pcd), dwc_ep); @@ -66585,7 +80578,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + + dsts.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->dev_if-> ++ DWC_READ_REG32(&GET_CORE_IF(pcd)->dev_if-> + dev_global_regs->dsts); + dwc_ep->next_frame = dsts.b.soffn; + @@ -66597,19 +80590,40 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + +#else -+ gintmsk_data_t intr_mask = {.d32 = 0 }; -+ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", -+ "IN ISOC Incomplete"); ++ depctl_data_t depctl = {.d32 = 0 }; ++ dwc_ep_t *dwc_ep; ++ dwc_otg_dev_if_t *dev_if; ++ int i; ++ dev_if = GET_CORE_IF(pcd)->dev_if; + -+ intr_mask.b.incomplisoin = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, -+ intr_mask.d32, 0); ++ DWC_DEBUGPL(DBG_PCD,"Incomplete ISO IN \n"); ++ ++ for (i = 1; i <= dev_if->num_in_eps; ++i) { ++ dwc_ep = &pcd->in_ep[i-1].dwc_ep; ++ depctl.d32 = ++ DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ if (depctl.b.epena && dwc_ep->type == DWC_OTG_EP_TYPE_ISOC) { ++ if (drop_transfer(dwc_ep->frame_num, GET_CORE_IF(pcd)->frame_num, ++ dwc_ep->frm_overrun)) ++ { ++ depctl.d32 = ++ DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ depctl.b.snak = 1; ++ depctl.b.epdis = 1; ++ DWC_MODIFY_REG32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32, depctl.d32); ++ } ++ } ++ } ++ ++ /*intr_mask.b.incomplisoin = 1; ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ intr_mask.d32, 0); */ +#endif //DWC_EN_ISOC + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.incomplisoin = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -66619,7 +80633,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + * Incomplete ISO OUT Transfer Interrupt. + * + * This interrupt indicates that the core has dropped an ISO OUT -+ * packet. The following conditions can be the cause: ++ * packet. The following conditions can be the cause: + * - FIFO Full, the entire packet would not fit in the FIFO. + * - CRC Error + * - Corrupted Token @@ -66627,7 +80641,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + * -# Determine the EP + * -# Set incomplete flag in dwc_ep structure + * -# Read any data from the FIFO -+ * -# Disable EP. when "Endpoint Disabled" interrupt is received ++ * -# Disable EP. When "Endpoint Disabled" interrupt is received + * re-enable EP. + */ +int32_t dwc_otg_pcd_handle_incomplete_isoc_out_intr(dwc_otg_pcd_t * pcd) @@ -66650,9 +80664,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (pcd->out_ep[i].dwc_ep.active && + pcd->out_ep[i].dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) { + deptsiz.d32 = -+ dwc_read_reg32(&dev_if->out_ep_regs[i]->doeptsiz); ++ DWC_READ_REG32(&dev_if->out_ep_regs[i]->doeptsiz); + depctl.d32 = -+ dwc_read_reg32(&dev_if->out_ep_regs[i]->doepctl); ++ DWC_READ_REG32(&dev_if->out_ep_regs[i]->doepctl); + + if (depctl.b.epdis && deptsiz.d32) { + set_current_pkt_info(GET_CORE_IF(pcd), @@ -66677,7 +80691,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } + + dsts.d32 = -+ dwc_read_reg32(&GET_CORE_IF(pcd)->dev_if-> ++ DWC_READ_REG32(&GET_CORE_IF(pcd)->dev_if-> + dev_global_regs->dsts); + dwc_ep->next_frame = dsts.b.soffn; + @@ -66690,20 +80704,55 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#else + /** @todo implement ISR */ + gintmsk_data_t intr_mask = {.d32 = 0 }; ++ dwc_otg_core_if_t *core_if; ++ deptsiz_data_t deptsiz = {.d32 = 0 }; ++ depctl_data_t depctl = {.d32 = 0 }; ++ dctl_data_t dctl = {.d32 = 0 }; ++ dwc_ep_t *dwc_ep = NULL; ++ int i; ++ core_if = GET_CORE_IF(pcd); + -+ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", -+ "OUT ISOC Incomplete"); ++ for (i = 0; i < core_if->dev_if->num_out_eps; ++i) { ++ dwc_ep = &pcd->out_ep[i].dwc_ep; ++ depctl.d32 = ++ DWC_READ_REG32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doepctl); ++ if (depctl.b.epena && depctl.b.dpid == (core_if->frame_num & 0x1)) { ++ core_if->dev_if->isoc_ep = dwc_ep; ++ deptsiz.d32 = ++ DWC_READ_REG32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doeptsiz); ++ break; ++ } ++ } ++ dctl.d32 = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl); ++ gintsts.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintsts); ++ intr_mask.d32 = DWC_READ_REG32(&core_if->core_global_regs->gintmsk); + ++ if (!intr_mask.b.goutnakeff) { ++ /* Unmask it */ ++ intr_mask.b.goutnakeff = 1; ++ DWC_WRITE_REG32(&core_if->core_global_regs->gintmsk, intr_mask.d32); ++ } ++ if (!gintsts.b.goutnakeff) { ++ dctl.b.sgoutnak = 1; ++ } ++ DWC_WRITE_REG32(&core_if->dev_if->dev_global_regs->dctl, dctl.d32); ++ ++ depctl.d32 = DWC_READ_REG32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doepctl); ++ if (depctl.b.epena) { ++ depctl.b.epdis = 1; ++ depctl.b.snak = 1; ++ } ++ DWC_WRITE_REG32(&core_if->dev_if->out_ep_regs[dwc_ep->num]->doepctl, depctl.d32); ++ ++ intr_mask.d32 = 0; + intr_mask.b.incomplisoout = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, -+ intr_mask.d32, 0); -+ -+#endif /* DWC_EN_ISOC */ ++ ++#endif /* DWC_EN_ISOC */ + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.incomplisoout = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -66717,34 +80766,35 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +{ + dwc_otg_dev_if_t *dev_if = GET_CORE_IF(pcd)->dev_if; + depctl_data_t diepctl = {.d32 = 0 }; -+ depctl_data_t diepctl_rd = {.d32 = 0 }; + gintmsk_data_t intr_mask = {.d32 = 0 }; + gintsts_data_t gintsts; ++ dwc_otg_core_if_t *core_if = GET_CORE_IF(pcd); + int i; + + DWC_DEBUGPL(DBG_PCD, "Global IN NAK Effective\n"); + + /* Disable all active IN EPs */ -+ diepctl.b.epdis = 1; -+ diepctl.b.snak = 1; -+ + for (i = 0; i <= dev_if->num_in_eps; i++) { -+ diepctl_rd.d32 = -+ dwc_read_reg32(&dev_if->in_ep_regs[i]->diepctl); -+ if (diepctl_rd.b.epena) { -+ dwc_write_reg32(&dev_if->in_ep_regs[i]->diepctl, -+ diepctl.d32); -+ } ++ diepctl.d32 = DWC_READ_REG32(&dev_if->in_ep_regs[i]->diepctl); ++ if (!(diepctl.b.eptype & 1) && diepctl.b.epena) { ++ if (core_if->start_predict > 0) ++ core_if->start_predict++; ++ diepctl.b.epdis = 1; ++ diepctl.b.snak = 1; ++ DWC_WRITE_REG32(&dev_if->in_ep_regs[i]->diepctl, diepctl.d32); ++ } + } ++ ++ + /* Disable the Global IN NAK Effective Interrupt */ + intr_mask.b.ginnakeff = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, + intr_mask.d32, 0); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.ginnakeff = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -66756,20 +80806,72 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + */ +int32_t dwc_otg_pcd_handle_out_nak_effective(dwc_otg_pcd_t * pcd) +{ ++ dwc_otg_dev_if_t *dev_if = GET_CORE_IF(pcd)->dev_if; + gintmsk_data_t intr_mask = {.d32 = 0 }; + gintsts_data_t gintsts; ++ depctl_data_t doepctl; ++ int i; + -+ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", -+ "Global IN NAK Effective\n"); -+ /* Disable the Global IN NAK Effective Interrupt */ ++ /* Disable the Global OUT NAK Effective Interrupt */ + intr_mask.b.goutnakeff = 1; -+ dwc_modify_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, -+ intr_mask.d32, 0); ++ DWC_MODIFY_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintmsk, ++ intr_mask.d32, 0); ++ ++ /* If DEV OUT NAK enabled*/ ++ if (pcd->core_if->core_params->dev_out_nak) { ++ /* Run over all out endpoints to determine the ep number on ++ * which the timeout has happened ++ */ ++ for (i = 0; i <= dev_if->num_out_eps; i++) { ++ if ( pcd->core_if->ep_xfer_info[i].state == 2 ) ++ break; ++ } ++ if (i > dev_if->num_out_eps) { ++ dctl_data_t dctl; ++ dctl.d32 = ++ DWC_READ_REG32(&dev_if->dev_global_regs->dctl); ++ dctl.b.cgoutnak = 1; ++ DWC_WRITE_REG32(&dev_if->dev_global_regs->dctl, ++ dctl.d32); ++ goto out; ++ } + ++ /* Disable the endpoint */ ++ doepctl.d32 = DWC_READ_REG32(&dev_if->out_ep_regs[i]->doepctl); ++ if (doepctl.b.epena) { ++ doepctl.b.epdis = 1; ++ doepctl.b.snak = 1; ++ } ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[i]->doepctl, doepctl.d32); ++ return 1; ++ } ++ /* We come here from Incomplete ISO OUT handler */ ++ if (dev_if->isoc_ep) { ++ dwc_ep_t *dwc_ep = (dwc_ep_t *)dev_if->isoc_ep; ++ uint32_t epnum = dwc_ep->num; ++ doepint_data_t doepint; ++ doepint.d32 = ++ DWC_READ_REG32(&dev_if->out_ep_regs[dwc_ep->num]->doepint); ++ dev_if->isoc_ep = NULL; ++ doepctl.d32 = ++ DWC_READ_REG32(&dev_if->out_ep_regs[epnum]->doepctl); ++ DWC_PRINTF("Before disable DOEPCTL = %08x\n", doepctl.d32); ++ if (doepctl.b.epena) { ++ doepctl.b.epdis = 1; ++ doepctl.b.snak = 1; ++ } ++ DWC_WRITE_REG32(&dev_if->out_ep_regs[epnum]->doepctl, ++ doepctl.d32); ++ return 1; ++ } else ++ DWC_PRINTF("INTERRUPT Handler not implemented for %s\n", ++ "Global OUT NAK Effective\n"); ++ ++out: + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.goutnakeff = 1; -+ dwc_write_reg32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, ++ DWC_WRITE_REG32(&GET_CORE_IF(pcd)->core_global_regs->gintsts, + gintsts.d32); + + return 1; @@ -66796,11 +80898,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + gintsts_data_t gintr_status; + int32_t retval = 0; + ++ /* Exit from ISR if core is hibernated */ ++ if (core_if->hibernation_suspend == 1) { ++ return retval; ++ } +#ifdef VERBOSE + DWC_DEBUGPL(DBG_ANY, "%s() gintsts=%08x gintmsk=%08x\n", + __func__, -+ dwc_read_reg32(&global_regs->gintsts), -+ dwc_read_reg32(&global_regs->gintmsk)); ++ DWC_READ_REG32(&global_regs->gintsts), ++ DWC_READ_REG32(&global_regs->gintmsk)); +#endif + + if (dwc_otg_is_device_mode(core_if)) { @@ -66808,8 +80914,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo +#ifdef VERBOSE + DWC_DEBUGPL(DBG_PCDV, "%s() gintsts=%08x gintmsk=%08x\n", + __func__, -+ dwc_read_reg32(&global_regs->gintsts), -+ dwc_read_reg32(&global_regs->gintmsk)); ++ DWC_READ_REG32(&global_regs->gintsts), ++ DWC_READ_REG32(&global_regs->gintmsk)); +#endif + + gintr_status.d32 = dwc_otg_read_core_intr(core_if); @@ -66827,9 +80933,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + if (gintr_status.b.nptxfempty) { + retval |= dwc_otg_pcd_handle_np_tx_fifo_empty_intr(pcd); + } -+ if (gintr_status.b.ginnakeff) { -+ retval |= dwc_otg_pcd_handle_in_nak_effective(pcd); -+ } + if (gintr_status.b.goutnakeff) { + retval |= dwc_otg_pcd_handle_out_nak_effective(pcd); + } @@ -66854,9 +80957,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + retval |= + dwc_otg_pcd_handle_end_periodic_frame_intr(pcd); + } -+ if (gintr_status.b.epmismatch) { -+ retval |= dwc_otg_pcd_handle_ep_mismatch_intr(core_if); -+ } + if (gintr_status.b.inepint) { + if (!core_if->multiproc_int_enable) { + retval |= dwc_otg_pcd_handle_in_ep_intr(pcd); @@ -66867,6 +80967,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + retval |= dwc_otg_pcd_handle_out_ep_intr(pcd); + } + } ++ if (gintr_status.b.epmismatch) { ++ retval |= dwc_otg_pcd_handle_ep_mismatch_intr(pcd); ++ } ++ if (gintr_status.b.fetsusp) { ++ retval |= dwc_otg_pcd_handle_ep_fetsusp_intr(pcd); ++ } ++ if (gintr_status.b.ginnakeff) { ++ retval |= dwc_otg_pcd_handle_in_nak_effective(pcd); ++ } + if (gintr_status.b.incomplisoin) { + retval |= + dwc_otg_pcd_handle_incomplete_isoc_in_intr(pcd); @@ -66876,7 +80985,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + dwc_otg_pcd_handle_incomplete_isoc_out_intr(pcd); + } + -+ /* In MPI mode De vice Endpoints intterrupts are asserted ++ /* In MPI mode Device Endpoints interrupts are asserted + * without setting outepintr and inepint bits set, so these + * Interrupt handlers are called without checking these bit-fields + */ @@ -66886,23 +80995,25 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-rpi-bo + } +#ifdef VERBOSE + DWC_DEBUGPL(DBG_PCDV, "%s() gintsts=%0x\n", __func__, -+ dwc_read_reg32(&global_regs->gintsts)); ++ DWC_READ_REG32(&global_regs->gintsts)); +#endif + DWC_SPINUNLOCK(pcd->lock); + } + return retval; +} + -+#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2012-07-15 20:29:19.092083771 +0200 -@@ -0,0 +1,1288 @@ ++#endif /* DWC_HOST_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c b/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c +new file mode 100644 +index 0000000..9289fc0 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c +@@ -0,0 +1,1374 @@ + /* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $ -+ * $Revision: #7 $ -+ * $Date: 2009/04/03 $ -+ * $Change: 1225160 $ ++ * $Revision: #21 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless @@ -66953,47 +81064,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + * + */ + -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if defined(LM_INTERFACE) -+//# include -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#else -+/* by 2.6.31, at least, the location of some headers has changed -+*/ -+#include -+#endif -+ -+#elif defined(PLATFORM_INTERFACE) -+#include -+#endif -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) -+#include -+#include -+#include -+#else -+/* by 2.6.31, at least, the location of some headers has changed -+*/ -+#include -+#include -+#include -+#endif -+ -+#include -+ ++#include "dwc_otg_os_dep.h" +#include "dwc_otg_pcd_if.h" ++#include "dwc_otg_pcd.h" +#include "dwc_otg_driver.h" +#include "dwc_otg_dbg.h" + @@ -67011,6 +81084,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + +/* Display the contents of the buffer */ +extern void dump_msg(const u8 * buf, unsigned int length); ++/** ++ * Get the dwc_otg_pcd_ep_t* from usb_ep* pointer - NULL in case ++ * if the endpoint is not found ++ */ ++static struct dwc_otg_pcd_ep *ep_from_handle(dwc_otg_pcd_t * pcd, void *handle) ++{ ++ int i; ++ if (pcd->ep0.priv == handle) { ++ return &pcd->ep0; ++ } ++ ++ for (i = 0; i < MAX_EPS_CHANNELS - 1; i++) { ++ if (pcd->in_ep[i].priv == handle) ++ return &pcd->in_ep[i]; ++ if (pcd->out_ep[i].priv == handle) ++ return &pcd->out_ep[i]; ++ } ++ ++ return NULL; ++} + +/* USB Endpoint Operations */ +/* @@ -67064,6 +81157,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + return -ESHUTDOWN; + } + ++ /* Delete after check - MAS */ ++#if 0 ++ nat = (uint32_t) ep_desc->wMaxPacketSize; ++ printk(KERN_ALERT "%s: nat (before) =%d\n", __func__, nat); ++ nat = (nat >> 11) & 0x03; ++ printk(KERN_ALERT "%s: nat (after) =%d\n", __func__, nat); ++#endif + retval = dwc_otg_pcd_ep_enable(gadget_wrapper->pcd, + (const uint8_t *)ep_desc, + (void *)usb_ep); @@ -67127,7 +81227,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + return 0; + } + memset(usb_req, 0, sizeof(*usb_req)); -+ usb_req->dma = DWC_INVALID_DMA_ADDR; ++ usb_req->dma = DWC_DMA_ADDR_INVALID; + + return usb_req; +} @@ -67151,7 +81251,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + kfree(req); +} + -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) +/** + * This function allocates an I/O buffer to be used for a transfer + * to/from the specified endpoint. @@ -67229,7 +81329,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + gfp_t gfp_flags) +{ + dwc_otg_pcd_t *pcd; -+ int retval; ++ struct dwc_otg_pcd_ep *ep = NULL; ++ int retval = 0, is_isoc_ep = 0; ++ dma_addr_t dma_addr = DWC_DMA_ADDR_INVALID; + + DWC_DEBUGPL(DBG_PCDV, "%s(%p,%p,%d)\n", + __func__, usb_ep, usb_req, gfp_flags); @@ -67259,7 +81361,44 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + usb_req->status = -EINPROGRESS; + usb_req->actual = 0; + -+ retval = dwc_otg_pcd_ep_queue(pcd, usb_ep, usb_req->buf, usb_req->dma, ++ ep = ep_from_handle(pcd, usb_ep); ++ if (ep == NULL) ++ is_isoc_ep = 0; ++ else ++ is_isoc_ep = (ep->dwc_ep.type == DWC_OTG_EP_TYPE_ISOC) ? 1 : 0; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) ++ dma_addr = usb_req->dma; ++#else ++ if (GET_CORE_IF(pcd)->dma_enable) { ++ dwc_otg_device_t *otg_dev = gadget_wrapper->pcd->otg_dev; ++ struct device *dev = NULL; ++ ++ if (otg_dev != NULL) ++ dev = DWC_OTG_OS_GETDEV(otg_dev->os_dep); ++ ++ if (usb_req->length != 0 && ++ usb_req->dma == DWC_DMA_ADDR_INVALID) { ++ dma_addr = dma_map_single(dev, usb_req->buf, ++ usb_req->length, ++ ep->dwc_ep.is_in ? ++ DMA_TO_DEVICE: ++ DMA_FROM_DEVICE); ++ } ++ } ++#endif ++ ++#ifdef DWC_UTE_PER_IO ++ if (is_isoc_ep == 1) { ++ retval = dwc_otg_pcd_xiso_ep_queue(pcd, usb_ep, usb_req->buf, dma_addr, ++ usb_req->length, usb_req->zero, usb_req, ++ gfp_flags == GFP_ATOMIC ? 1 : 0, &usb_req->ext_req); ++ if (retval) ++ return -EINVAL; ++ ++ return 0; ++ } ++#endif ++ retval = dwc_otg_pcd_ep_queue(pcd, usb_ep, usb_req->buf, dma_addr, + usb_req->length, usb_req->zero, usb_req, + gfp_flags == GFP_ATOMIC ? 1 : 0); + if (retval) { @@ -67397,9 +81536,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + req->buf1, req->dma0, req->dma1, + req->sync_frame, req->data_pattern_frame, + req->data_per_frame, -+ req->flags & USB_REQ_ISO_ASAP ? -1 : req-> -+ start_frame, req->buf_proc_intrvl, req, -+ gfp_flags == GFP_ATOMIC ? 1 : 0); ++ req-> ++ flags & USB_REQ_ISO_ASAP ? -1 : ++ req->start_frame, req->buf_proc_intrvl, ++ req, gfp_flags == GFP_ATOMIC ? 1 : 0); + + if (retval) { + return -EINVAL; @@ -67468,8 +81608,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + .alloc_request = dwc_otg_pcd_alloc_request, + .free_request = dwc_otg_pcd_free_request, + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) + .alloc_buffer = dwc_otg_pcd_alloc_buffer, + .free_buffer = dwc_otg_pcd_free_buffer, ++#endif + + .queue = ep_queue, + .dequeue = ep_dequeue, @@ -67510,7 +81652,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + .alloc_request = dwc_otg_pcd_alloc_request, + .free_request = dwc_otg_pcd_free_request, + -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) + .alloc_buffer = dwc_otg_pcd_alloc_buffer, + .free_buffer = dwc_otg_pcd_free_buffer, +#else @@ -67527,7 +81669,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + +}; + -+#endif /* _EN_ISOC_ */ ++#endif /* _EN_ISOC_ */ +/* Gadget Operations */ +/** + * The following gadget operations will be implemented in the DWC_otg @@ -67661,12 +81803,78 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + + return 0; +} -+#endif /* DWC_EN_ISOC */ ++#endif /* DWC_EN_ISOC */ ++ ++#ifdef DWC_UTE_PER_IO ++/** ++ * Copy the contents of the extended request to the Linux usb_request's ++ * extended part and call the gadget's completion. ++ * ++ * @param pcd Pointer to the pcd structure ++ * @param ep_handle Void pointer to the usb_ep structure ++ * @param req_handle Void pointer to the usb_request structure ++ * @param status Request status returned from the portable logic ++ * @param ereq_port Void pointer to the extended request structure ++ * created in the the portable part that contains the ++ * results of the processed iso packets. ++ */ ++static int _xisoc_complete(dwc_otg_pcd_t * pcd, void *ep_handle, ++ void *req_handle, int32_t status, void *ereq_port) ++{ ++ struct dwc_ute_iso_req_ext *ereqorg = NULL; ++ struct dwc_iso_xreq_port *ereqport = NULL; ++ struct dwc_ute_iso_packet_descriptor *desc_org = NULL; ++ int i; ++ struct usb_request *req; ++ //struct dwc_ute_iso_packet_descriptor * ++ //int status = 0; ++ ++ req = (struct usb_request *)req_handle; ++ ereqorg = &req->ext_req; ++ ereqport = (struct dwc_iso_xreq_port *)ereq_port; ++ desc_org = ereqorg->per_io_frame_descs; ++ ++ if (req && req->complete) { ++ /* Copy the request data from the portable logic to our request */ ++ for (i = 0; i < ereqport->pio_pkt_count; i++) { ++ desc_org[i].actual_length = ++ ereqport->per_io_frame_descs[i].actual_length; ++ desc_org[i].status = ++ ereqport->per_io_frame_descs[i].status; ++ } ++ ++ switch (status) { ++ case -DWC_E_SHUTDOWN: ++ req->status = -ESHUTDOWN; ++ break; ++ case -DWC_E_RESTART: ++ req->status = -ECONNRESET; ++ break; ++ case -DWC_E_INVALID: ++ req->status = -EINVAL; ++ break; ++ case -DWC_E_TIMEOUT: ++ req->status = -ETIMEDOUT; ++ break; ++ default: ++ req->status = status; ++ } ++ ++ /* And call the gadget's completion */ ++ req->complete(ep_handle, req); ++ } ++ ++ return 0; ++} ++#endif /* DWC_UTE_PER_IO */ + +static int _complete(dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle, int32_t status, uint32_t actual) +{ + struct usb_request *req = (struct usb_request *)req_handle; ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27) ++ struct dwc_otg_pcd_ep *ep = NULL; ++#endif + + if (req && req->complete) { + switch (status) { @@ -67686,9 +81894,28 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + req->status = status; + + } ++ + req->actual = actual; ++ DWC_SPINUNLOCK(pcd->lock); + req->complete(ep_handle, req); ++ DWC_SPINLOCK(pcd->lock); + } ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27) ++ ep = ep_from_handle(pcd, ep_handle); ++ if (GET_CORE_IF(pcd)->dma_enable) { ++ if (req->length != 0) { ++ dwc_otg_device_t *otg_dev = gadget_wrapper->pcd->otg_dev; ++ struct device *dev = NULL; ++ ++ if (otg_dev != NULL) ++ dev = DWC_OTG_OS_GETDEV(otg_dev->os_dep); ++ ++ dma_unmap_single(dev, req->dma, req->length, ++ ep->dwc_ep.is_in ? ++ DMA_TO_DEVICE: DMA_FROM_DEVICE); ++ } ++ } ++#endif + + return 0; +} @@ -67750,11 +81977,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + int retval = -DWC_E_INVALID; + if (gadget_wrapper->driver->cfi_feature_setup) { + retval = -+ gadget_wrapper->driver->cfi_feature_setup(&gadget_wrapper-> -+ gadget, -+ (struct -+ cfi_usb_ctrlrequest -+ *)cfi_req); ++ gadget_wrapper->driver-> ++ cfi_feature_setup(&gadget_wrapper->gadget, ++ (struct cfi_usb_ctrlrequest *)cfi_req); + } + + return retval; @@ -67776,6 +82001,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b +#ifdef DWC_UTE_CFI + .cfi_setup = _cfi_setup, +#endif ++#ifdef DWC_UTE_PER_IO ++ .xisoc_complete = _xisoc_complete, ++#endif +}; + +/** @@ -67838,6 +82066,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + + int i; + struct usb_ep *ep; ++ int8_t dev_endpoints; + + DWC_DEBUGPL(DBG_PCDV, "%s\n", __func__); + @@ -67868,12 +82097,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + /** + * Initialize the EP structures. + */ ++ dev_endpoints = d->pcd->core_if->dev_if->num_in_eps; + -+ for (i = 0; i < 15; i++) { ++ for (i = 0; i < dev_endpoints; i++) { + ep = &d->in_ep[i]; + + /* Init the usb_ep structure. */ -+ ep->name = names[i + 1]; ++ ep->name = names[d->pcd->in_ep[i].dwc_ep.num]; + ep->ops = (struct usb_ep_ops *)&dwc_otg_pcd_ep_ops; + + /** @@ -67884,11 +82114,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + list_add_tail(&ep->ep_list, &d->gadget.ep_list); + } + -+ for (i = 0; i < 15; i++) { ++ dev_endpoints = d->pcd->core_if->dev_if->num_out_eps; ++ ++ for (i = 0; i < dev_endpoints; i++) { + ep = &d->out_ep[i]; + + /* Init the usb_ep structure. */ -+ ep->name = names[15 + i + 1]; ++ ep->name = names[15 + d->pcd->out_ep[i].dwc_ep.num]; + ep->ops = (struct usb_ep_ops *)&dwc_otg_pcd_ep_ops; + + /** @@ -67917,29 +82149,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + DWC_DEBUGPL(DBG_PCDV, "%s(%p)\n", __func__, dev); +} + -+static struct gadget_wrapper *alloc_wrapper( -+#ifdef LM_INTERFACE -+ struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *_dev -+#endif -+ ) ++static struct gadget_wrapper *alloc_wrapper(dwc_bus_dev_t *_dev) +{ -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif + static char pcd_name[] = "dwc_otg_pcd"; -+ ++ dwc_otg_device_t *otg_dev = DWC_OTG_BUSDRVDATA(_dev); + struct gadget_wrapper *d; + int retval; + -+ d = dwc_alloc(sizeof(*d)); ++ d = DWC_ALLOC(sizeof(*d)); + if (d == NULL) { + return NULL; + } @@ -67948,12 +82165,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + + d->gadget.name = pcd_name; + d->pcd = otg_dev->pcd; -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) + strcpy(d->gadget.dev.bus_id, "gadget"); +#else -+ /*d->gadget.dev.bus = NULL;*/ -+ d->gadget.dev.init_name = "gadget"; ++ dev_set_name(&d->gadget.dev, "%s", "gadget"); +#endif ++ + d->gadget.dev.parent = &_dev->dev; + d->gadget.dev.release = dwc_otg_pcd_gadget_release; + d->gadget.ops = &dwc_otg_pcd_ops; @@ -67965,7 +82183,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + retval = device_register(&d->gadget.dev); + if (retval != 0) { + DWC_ERROR("device_register failed\n"); -+ dwc_free(d); ++ DWC_FREE(d); + return NULL; + } + @@ -67982,33 +82200,16 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + } + + device_unregister(&d->gadget.dev); -+ dwc_free(d); ++ DWC_FREE(d); +} + +/** + * This function initialized the PCD portion of the driver. + * + */ -+int pcd_init( -+#ifdef LM_INTERFACE -+ struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *_dev -+#endif -+ ) -+ ++int pcd_init(dwc_bus_dev_t *_dev) +{ -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif -+ int devirq; -+ ++ dwc_otg_device_t *otg_dev = DWC_OTG_BUSDRVDATA(_dev); + int retval = 0; + + DWC_DEBUGPL(DBG_PCDV, "%s(%p) otg_dev=%p\n", __func__, _dev, otg_dev); @@ -68020,30 +82221,40 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + return -ENOMEM; + } + ++ otg_dev->pcd->otg_dev = otg_dev; + gadget_wrapper = alloc_wrapper(_dev); + + /* + * Initialize EP structures + */ + gadget_add_eps(gadget_wrapper); -+ + /* + * Setup interupt handler + */ +#ifdef PLATFORM_INTERFACE -+ devirq = platform_get_irq(_dev, 0); -+#else -+ devirq = _dev->irq; -+#endif -+ DWC_DEBUGPL(DBG_ANY, "registering handler for irq%d\n", devirq); -+ retval = request_irq(devirq, dwc_otg_pcd_irq, ++ DWC_DEBUGPL(DBG_ANY, "registering handler for irq%d\n", ++ platform_get_irq(_dev, 0)); ++ retval = request_irq(platform_get_irq(_dev, 0), dwc_otg_pcd_irq, + IRQF_SHARED, gadget_wrapper->gadget.name, + otg_dev->pcd); + if (retval != 0) { -+ DWC_ERROR("request of irq%d failed\n", devirq); ++ DWC_ERROR("request of irq%d failed\n", ++ platform_get_irq(_dev, 0)); + free_wrapper(gadget_wrapper); + return -EBUSY; + } ++#else ++ DWC_DEBUGPL(DBG_ANY, "registering handler for irq%d\n", ++ _dev->irq); ++ retval = request_irq(_dev->irq, dwc_otg_pcd_irq, ++ IRQF_SHARED | IRQF_DISABLED, ++ gadget_wrapper->gadget.name, otg_dev->pcd); ++ if (retval != 0) { ++ DWC_ERROR("request of irq%d failed\n", _dev->irq); ++ free_wrapper(gadget_wrapper); ++ return -EBUSY; ++ } ++#endif + + dwc_otg_pcd_start(gadget_wrapper->pcd, &fops); + @@ -68053,23 +82264,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b +/** + * Cleanup the PCD. + */ -+void pcd_remove( -+#ifdef LM_INTERFACE -+ struct lm_device *_dev -+#elif defined(PCI_INTERFACE) -+ struct pci_dev *_dev -+#elif defined(PLATFORM_INTERFACE) -+ struct platform_device *_dev -+#endif -+ ) ++void pcd_remove(dwc_bus_dev_t *_dev) +{ -+#ifdef LM_INTERFACE -+ dwc_otg_device_t *otg_dev = lm_get_drvdata(_dev); -+#elif defined(PCI_INTERFACE) -+ dwc_otg_device_t *otg_dev = pci_get_drvdata(_dev); -+#elif defined(PLATFORM_INTERFACE) -+ dwc_otg_device_t *otg_dev = platform_get_drvdata(_dev); -+#endif ++ dwc_otg_device_t *otg_dev = DWC_OTG_BUSDRVDATA(_dev); + dwc_otg_pcd_t *pcd = otg_dev->pcd; + + DWC_DEBUGPL(DBG_PCDV, "%s(%p) otg_dev %p\n", __func__, _dev, otg_dev); @@ -68096,6 +82293,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + * then a host may connect again, or the driver might get unbound. + * + * @param driver The driver being registered ++ * @param bind The bind function of gadget driver + */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) +int usb_gadget_register_driver(struct usb_gadget_driver *driver) @@ -68113,7 +82311,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) + !driver->bind || +#else -+ !bind || ++ !bind || +#endif + !driver->unbind || !driver->disconnect || !driver->setup) { + DWC_DEBUGPL(DBG_PCDV, "EINVAL\n"); @@ -68149,7 +82347,6 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + driver->driver.name); + return 0; +} -+ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) +EXPORT_SYMBOL(usb_gadget_register_driver); +#else @@ -68185,21 +82382,23 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-rpi-b + +EXPORT_SYMBOL(usb_gadget_unregister_driver); + -+#endif /* DWC_HOST_ONLY */ -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h ---- linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2012-07-15 20:29:19.077083490 +0200 -@@ -0,0 +1,2237 @@ ++#endif /* DWC_HOST_ONLY */ +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_regs.h b/drivers/usb/host/dwc_otg/dwc_otg_regs.h +new file mode 100644 +index 0000000..0572642 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/dwc_otg_regs.h +@@ -0,0 +1,2550 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $ -+ * $Revision: #76 $ -+ * $Date: 2009/04/02 $ -+ * $Change: 1224216 $ ++ * $Revision: #98 $ ++ * $Date: 2012/08/10 $ ++ * $Change: 2047372 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. -+ * ++ * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and @@ -68209,7 +82408,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. -+ * ++ * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -68256,7 +82455,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + */ + +/****************************************************************************/ -+/** DWC_otg Core registers . ++/** DWC_otg Core registers . + * The dwc_otg_core_global_regs structure defines the size + * and relative field offsets for the Core Global registers. + */ @@ -68324,21 +82523,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + volatile uint32_t ghwcfg3; + /**User HW Config4 Register (Read Only). Offset: 050h*/ + volatile uint32_t ghwcfg4; -+ /** Core LPM Configuration register */ ++ /** Core LPM Configuration register Offset: 054h*/ + volatile uint32_t glpmcfg; -+ /** Reserved Offset: 058h-0FFh */ -+ volatile uint32_t reserved[42]; ++ /** Global PowerDn Register Offset: 058h */ ++ volatile uint32_t gpwrdn; ++ /** Global DFIFO SW Config Register Offset: 05Ch */ ++ volatile uint32_t gdfifocfg; ++ /** ADP Control Register Offset: 060h */ ++ volatile uint32_t adpctl; ++ /** Reserved Offset: 064h-0FFh */ ++ volatile uint32_t reserved39[39]; + /** Host Periodic Transmit FIFO Size Register. Offset: 100h */ + volatile uint32_t hptxfsiz; -+ /** Device Periodic Transmit FIFO#n Register if dedicated fifos are disabled, -+ otherwise Device Transmit FIFO#n Register. ++ /** Device Periodic Transmit FIFO#n Register if dedicated fifos are disabled, ++ otherwise Device Transmit FIFO#n Register. + * Offset: 104h + (FIFO_Number-1)*04h, 1 <= FIFO Number <= 15 (1<=n<=15). */ -+ volatile uint32_t dptxfsiz_dieptxf[15]; ++ volatile uint32_t dtxfsiz[15]; +} dwc_otg_core_global_regs_t; + +/** + * This union represents the bit fields of the Core OTG Control -+ * and Status Register (GOTGCTL). Set the bits using the bit ++ * and Status Register (GOTGCTL). Set the bits using the bit + * fields then write the d32 value to the register. + */ +typedef union gotgctl_data { @@ -68348,18 +82553,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + struct { + unsigned sesreqscs:1; + unsigned sesreq:1; -+ unsigned reserved2_7:6; ++ unsigned vbvalidoven:1; ++ unsigned vbvalidovval:1; ++ unsigned avalidoven:1; ++ unsigned avalidovval:1; ++ unsigned bvalidoven:1; ++ unsigned bvalidovval:1; + unsigned hstnegscs:1; + unsigned hnpreq:1; + unsigned hstsethnpen:1; + unsigned devhnpen:1; + unsigned reserved12_15:4; + unsigned conidsts:1; -+ unsigned reserved17:1; ++ unsigned dbnctime:1; + unsigned asesvld:1; + unsigned bsesvld:1; -+ unsigned currmod:1; -+ unsigned reserved21_31:11; ++ unsigned otgver:1; ++ unsigned reserved1:1; ++ unsigned multvalidbc:5; ++ unsigned chirpen:1; ++ unsigned reserved28_31:4; + } b; +} gotgctl_data_t; + @@ -68386,7 +82599,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Host Negotiation Success Status Change */ + unsigned hstnegsucstschng:1; + -+ unsigned reserver10_16:7; ++ unsigned reserved10_16:7; + + /** Host Negotiation Detected */ + unsigned hstnegdet:1; @@ -68394,15 +82607,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned adevtoutchng:1; + /** Debounce Done */ + unsigned debdone:1; ++ /** Multi-Valued input changed */ ++ unsigned mvic:1; + -+ unsigned reserved31_20:12; ++ unsigned reserved31_21:11; + + } b; +} gotgint_data_t; + +/** + * This union represents the bit fields of the Core AHB Configuration -+ * Register (GAHBCFG). Set/clear the bits using the bit fields then ++ * Register (GAHBCFG). Set/clear the bits using the bit fields then + * write the d32 value to the register. + */ +typedef union gahbcfg_data { @@ -68427,13 +82642,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned ptxfemplvl:1; +#define DWC_GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define DWC_GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 -+ unsigned reserved9_31:23; ++ unsigned reserved9_20:12; ++ unsigned remmemsupp:1; ++ unsigned notialldmawrit:1; ++ unsigned ahbsingle:1; ++ unsigned reserved24_31:8; + } b; +} gahbcfg_data_t; + +/** + * This union represents the bit fields of the Core USB Configuration -+ * Register (GUSBCFG). Set the bits using the bit fields then write ++ * Register (GUSBCFG). Set the bits using the bit fields then write + * the d32 value to the register. + */ +typedef union gusbcfg_data { @@ -68450,7 +82669,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned srpcap:1; + unsigned hnpcap:1; + unsigned usbtrdtim:4; -+ unsigned nptxfrwnden:1; ++ unsigned reserved1:1; + unsigned phylpwrclksel:1; + unsigned otgutmifssel:1; + unsigned ulpi_fsls:1; @@ -68459,120 +82678,19 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned ulpi_ext_vbus_drv:1; + unsigned ulpi_int_vbus_indicator:1; + unsigned term_sel_dl_pulse:1; -+ unsigned reserved23_25:3; ++ unsigned indicator_complement:1; ++ unsigned indicator_pass_through:1; ++ unsigned ulpi_int_prot_dis:1; + unsigned ic_usb_cap:1; + unsigned ic_traffic_pull_remove:1; + unsigned tx_end_delay:1; -+ unsigned reserved29_31:3; ++ unsigned force_host_mode:1; ++ unsigned force_dev_mode:1; ++ unsigned reserved31:1; + } b; +} gusbcfg_data_t; + +/** -+ * This union represents the bit fields of the Core LPM Configuration -+ * Register (GLPMCFG). Set the bits using bit fields then write -+ * the d32 value to the register. -+ */ -+typedef union glpmctl_data { -+ /** raw register data */ -+ uint32_t d32; -+ /** register bits */ -+ struct { -+ /** LPM-Capable (LPMCap) (Device and Host) -+ * The application uses this bit to control -+ * the DWC_otg core LPM capabilities. -+ */ -+ unsigned lpm_cap_en:1; -+ /** LPM response programmed by application (AppL1Res) (Device) -+ * Handshake response to LPM token pre-programmed -+ * by device application software. -+ */ -+ unsigned appl_resp:1; -+ /** Host Initiated Resume Duration (HIRD) (Device and Host) -+ * In Host mode this field indicates the value of HIRD -+ * to be sent in an LPM transaction. -+ * In Device mode this field is updated with the -+ * Received LPM Token HIRD bmAttribute -+ * when an ACK/NYET/STALL response is sent -+ * to an LPM transaction. -+ */ -+ unsigned hird:4; -+ /** RemoteWakeEnable (bRemoteWake) (Device and Host) -+ * In Host mode this bit indicates the value of remote -+ * wake up to be sent in wIndex field of LPM transaction. -+ * In Device mode this field is updated with the -+ * Received LPM Token bRemoteWake bmAttribute -+ * when an ACK/NYET/STALL response is sent -+ * to an LPM transaction. -+ */ -+ unsigned rem_wkup_en:1; -+ /** Enable utmi_sleep_n (EnblSlpM) (Device and Host) -+ * The application uses this bit to control -+ * the utmi_sleep_n assertion to the PHY when in L1 state. -+ */ -+ unsigned en_utmi_sleep:1; -+ /** HIRD Threshold (HIRD_Thres) (Device and Host) -+ */ -+ unsigned hird_thres:5; -+ /** LPM Response (CoreL1Res) (Device and Host) -+ * In Host mode this bit contains handsake response to -+ * LPM transaction. -+ * In Device mode the response of the core to -+ * LPM transaction received is reflected in these two bits. -+ - 0x0 : ERROR (No handshake response) -+ - 0x1 : STALL -+ - 0x2 : NYET -+ - 0x3 : ACK -+ */ -+ unsigned lpm_resp:2; -+ /** Port Sleep Status (SlpSts) (Device and Host) -+ * This bit is set as long as a Sleep condition -+ * is present on the USB bus. -+ */ -+ unsigned prt_sleep_sts:1; -+ /** Sleep State Resume OK (L1ResumeOK) (Device and Host) -+ * Indicates that the application or host -+ * can start resume from Sleep state. -+ */ -+ unsigned sleep_state_resumeok:1; -+ /** LPM channel Index (LPM_Chnl_Indx) (Host) -+ * The channel number on which the LPM transaction -+ * has to be applied while sending -+ * an LPM transaction to the local device. -+ */ -+ unsigned lpm_chan_index:4; -+ /** LPM Retry Count (LPM_Retry_Cnt) (Host) -+ * Number host retries that would be performed -+ * if the device response was not valid response. -+ */ -+ unsigned retry_count:3; -+ /** Send LPM Transaction (SndLPM) (Host) -+ * When set by application software, -+ * an LPM transaction containing two tokens -+ * is sent. -+ */ -+ unsigned send_lpm:1; -+ /** LPM Retry status (LPM_RetryCnt_Sts) (Host) -+ * Number of LPM Host Retries still remaining -+ * to be transmitted for the current LPM sequence -+ */ -+ unsigned retry_count_sts:3; -+ unsigned reserved28_29:2; -+ /** In host mode once this bit is set, the host -+ * configures to drive the HSIC Idle state on the bus. -+ * It then waits for the device to initiate the Connect sequence. -+ * In device mode once this bit is set, the device waits for -+ * the HSIC Idle line state on the bus. Upon receving the Idle -+ * line state, it initiates the HSIC Connect sequence. -+ */ -+ unsigned hsic_connect:1; -+ /** This bit overrides and functionally inverts -+ * the if_select_hsic input port signal. -+ */ -+ unsigned inv_sel_hsic:1; -+ } b; -+} glpmcfg_data_t; -+ -+/** + * This union represents the bit fields of the Core Reset Register + * (GRSTCTL). Set/clear the bits using the bit fields then write the + * d32 value to the register. @@ -68626,7 +82744,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + */ + unsigned hsftrst:1; + /** Host Frame Counter Reset (Host Only)
-+ * ++ * + * The application can reset the (micro)frame number + * counter inside the core, using this bit. When the + * (micro)frame counter is reset, the subsequent SOF @@ -68641,27 +82759,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** RxFIFO Flush (RxFFlsh) (Device and Host) + * + * The application can flush the entire Receive FIFO -+ * using this bit.

The application must first ++ * using this bit. The application must first + * ensure that the core is not in the middle of a -+ * transaction.

The application should write into ++ * transaction. The application should write into + * this bit, only after making sure that neither the + * DMA engine is reading from the RxFIFO nor the MAC -+ * is writing the data in to the FIFO.

The ++ * is writing the data in to the FIFO. The + * application should wait until the bit is cleared + * before performing any other operations. This bit + * will takes 8 clocks (slowest of PHY or AHB clock) + * to clear. + */ + unsigned rxfflsh:1; -+ /** TxFIFO Flush (TxFFlsh) (Device and Host). ++ /** TxFIFO Flush (TxFFlsh) (Device and Host). + * + * This bit is used to selectively flush a single or -+ * all transmit FIFOs. The application must first ++ * all transmit FIFOs. The application must first + * ensure that the core is not in the middle of a -+ * transaction.

The application should write into ++ * transaction. The application should write into + * this bit, only after making sure that neither the + * DMA engine is writing into the TxFIFO nor the MAC -+ * is reading the data out of the FIFO.

The ++ * is reading the data out of the FIFO. The + * application should wait until the core clears this + * bit, before performing any operations. This bit + * will takes 8 clocks (slowest of PHY or AHB clock) @@ -68670,7 +82788,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned txfflsh:1; + + /** TxFIFO Number (TxFNum) (Device and Host). -+ * ++ * + * This is the FIFO number which needs to be flushed, + * using the TxFIFO Flush bit. This field should not + * be changed until the TxFIFO Flush bit is cleared by @@ -68688,7 +82806,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Reserved */ + unsigned reserved11_29:19; + /** DMA Request Signal. Indicated DMA request is in -+ * probress. Used for debug purpose. */ ++ * probress. Used for debug purpose. */ + unsigned dmareq:1; + /** AHB Master Idle. Indicates the AHB Master State + * Machine is in IDLE condition. */ @@ -68698,7 +82816,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + +/** + * This union represents the bit fields of the Core Interrupt Mask -+ * Register (GINTMSK). Set/clear the bits using the bit fields then ++ * Register (GINTMSK). Set/clear the bits using the bit fields then + * write the d32 value to the register. + */ +typedef union gintmsk_data { @@ -68714,7 +82832,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned nptxfempty:1; + unsigned ginnakeff:1; + unsigned goutnakeff:1; -+ unsigned reserved8:1; ++ unsigned ulpickint:1; + unsigned i2cintr:1; + unsigned erlysuspend:1; + unsigned usbsuspend:1; @@ -68722,13 +82840,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned enumdone:1; + unsigned isooutdrop:1; + unsigned eopframe:1; -+ unsigned reserved16:1; ++ unsigned restoredone:1; + unsigned epmismatch:1; + unsigned inepintr:1; + unsigned outepintr:1; + unsigned incomplisoin:1; + unsigned incomplisoout:1; -+ unsigned reserved22_23:2; ++ unsigned fetsusp:1; ++ unsigned resetdet:1; + unsigned portintr:1; + unsigned hcintr:1; + unsigned ptxfempty:1; @@ -68759,7 +82878,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned nptxfempty:1; + unsigned ginnakeff:1; + unsigned goutnakeff:1; -+ unsigned reserved8:1; ++ unsigned ulpickint:1; + unsigned i2cintr:1; + unsigned erlysuspend:1; + unsigned usbsuspend:1; @@ -68767,13 +82886,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned enumdone:1; + unsigned isooutdrop:1; + unsigned eopframe:1; -+ unsigned intokenrx:1; ++ unsigned restoredone:1; + unsigned epmismatch:1; + unsigned inepint:1; + unsigned outepintr:1; + unsigned incomplisoin:1; + unsigned incomplisoout:1; -+ unsigned reserved22_23:2; ++ unsigned fetsusp:1; ++ unsigned resetdet:1; + unsigned portintr:1; + unsigned hcintr:1; + unsigned ptxfempty:1; @@ -68786,8 +82906,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +} gintsts_data_t; + +/** -+ * This union represents the bit fields in the Device Receive Status Read and -+ * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 ++ * This union represents the bit fields in the Device Receive Status Read and ++ * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 + * element then read out the bits using the bit elements. + */ +typedef union device_grxsts_data { @@ -68807,13 +82927,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +#define DWC_DSTS_SETUP_UPDT 0x6 // SETUP Packet + unsigned pktsts:4; + unsigned fn:4; -+ unsigned reserved:7; ++ unsigned reserved25_31:7; + } b; +} device_grxsts_data_t; + +/** -+ * This union represents the bit fields in the Host Receive Status Read and -+ * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 ++ * This union represents the bit fields in the Host Receive Status Read and ++ * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 + * element then read out the bits using the bit elements. + */ +typedef union host_grxsts_data { @@ -68831,14 +82951,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +#define DWC_GRXSTS_PKTSTS_DATA_TOGGLE_ERR 0x5 +#define DWC_GRXSTS_PKTSTS_CH_HALTED 0x7 + -+ unsigned reserved:11; ++ unsigned reserved21_31:11; + } b; +} host_grxsts_data_t; + +/** + * This union represents the bit fields in the FIFO Size Registers (HPTXFSIZ, -+ * GNPTXFSIZ, DPTXFSIZn, DIEPTXFn). Read the register into the d32 element then -+ * read out the bits using the bit elements. ++ * GNPTXFSIZ, DPTXFSIZn, DIEPTXFn). Read the register into the d32 element ++ * then read out the bits using the bit elements. + */ +typedef union fifosize_data { + /** raw register data */ @@ -68863,10 +82983,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + struct { + unsigned nptxfspcavail:16; + unsigned nptxqspcavail:8; -+ /** Top of the Non-Periodic Transmit Request Queue ++ /** Top of the Non-Periodic Transmit Request Queue + * - bit 24 - Terminate (Last entry for the selected + * channel/EP) -+ * - bits 26:25 - Token Type ++ * - bits 26:25 - Token Type + * - 2'b00 - IN/OUT + * - 2'b01 - Zero Length OUT + * - 2'b10 - PING/Complete Split @@ -68913,13 +83033,81 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned ack:1; + unsigned i2csuspctl:1; + unsigned i2cdevaddr:2; -+ unsigned reserved:2; ++ unsigned i2cdatse0:1; ++ unsigned reserved:1; + unsigned rw:1; + unsigned bsydne:1; + } b; +} gi2cctl_data_t; + +/** ++ * This union represents the bit fields in the PHY Vendor Control Register ++ * (GPVNDCTL). Read the register into the d32 element then read out the ++ * bits using the bit elements. ++ */ ++typedef union gpvndctl_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ unsigned regdata:8; ++ unsigned vctrl:8; ++ unsigned regaddr16_21:6; ++ unsigned regwr:1; ++ unsigned reserved23_24:2; ++ unsigned newregreq:1; ++ unsigned vstsbsy:1; ++ unsigned vstsdone:1; ++ unsigned reserved28_30:3; ++ unsigned disulpidrvr:1; ++ } b; ++} gpvndctl_data_t; ++ ++/** ++ * This union represents the bit fields in the General Purpose ++ * Input/Output Register (GGPIO). ++ * Read the register into the d32 element then read out the ++ * bits using the bit elements. ++ */ ++typedef union ggpio_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ unsigned gpi:16; ++ unsigned gpo:16; ++ } b; ++} ggpio_data_t; ++ ++/** ++ * This union represents the bit fields in the User ID Register ++ * (GUID). Read the register into the d32 element then read out the ++ * bits using the bit elements. ++ */ ++typedef union guid_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ unsigned rwdata:32; ++ } b; ++} guid_data_t; ++ ++/** ++ * This union represents the bit fields in the Synopsys ID Register ++ * (GSNPSID). Read the register into the d32 element then read out the ++ * bits using the bit elements. ++ */ ++typedef union gsnpsid_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ unsigned rwdata:32; ++ } b; ++} gsnpsid_data_t; ++ ++/** + * This union represents the bit fields in the User HW Config1 + * Register. Read the register into the d32 element then read + * out the bits using the bit elements. @@ -68986,7 +83174,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned nonperio_tx_q_depth:2; + unsigned host_perio_tx_q_depth:2; + unsigned dev_token_q_depth:5; -+ unsigned reserved31:1; ++ unsigned otg_enable_ic_usb:1; + } b; +} hwcfg2_data_t; + @@ -69008,9 +83196,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned vendor_ctrl_if:1; + unsigned optional_features:1; + unsigned synch_reset_type:1; -+ unsigned otg_enable_ic_usb:1; ++ unsigned adp_supp:1; + unsigned otg_enable_hsic:1; -+ unsigned reserved14:1; ++ unsigned bc_support:1; + unsigned otg_lpm_en:1; + unsigned dfifo_depth:16; + } b; @@ -69028,7 +83216,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + struct { + unsigned num_dev_perio_in_ep:4; + unsigned power_optimiz:1; -+ unsigned min_ahb_freq:9; ++ unsigned min_ahb_freq:1; ++ unsigned hiber:1; ++ unsigned xhiber:1; ++ unsigned reserved:6; + unsigned utmi_phy_data_width:2; + unsigned num_dev_mode_ctrl_ep:4; + unsigned iddig_filt_en:1; @@ -69043,6 +83234,229 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + } b; +} hwcfg4_data_t; + ++/** ++ * This union represents the bit fields of the Core LPM Configuration ++ * Register (GLPMCFG). Set the bits using bit fields then write ++ * the d32 value to the register. ++ */ ++typedef union glpmctl_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ /** LPM-Capable (LPMCap) (Device and Host) ++ * The application uses this bit to control ++ * the DWC_otg core LPM capabilities. ++ */ ++ unsigned lpm_cap_en:1; ++ /** LPM response programmed by application (AppL1Res) (Device) ++ * Handshake response to LPM token pre-programmed ++ * by device application software. ++ */ ++ unsigned appl_resp:1; ++ /** Host Initiated Resume Duration (HIRD) (Device and Host) ++ * In Host mode this field indicates the value of HIRD ++ * to be sent in an LPM transaction. ++ * In Device mode this field is updated with the ++ * Received LPM Token HIRD bmAttribute ++ * when an ACK/NYET/STALL response is sent ++ * to an LPM transaction. ++ */ ++ unsigned hird:4; ++ /** RemoteWakeEnable (bRemoteWake) (Device and Host) ++ * In Host mode this bit indicates the value of remote ++ * wake up to be sent in wIndex field of LPM transaction. ++ * In Device mode this field is updated with the ++ * Received LPM Token bRemoteWake bmAttribute ++ * when an ACK/NYET/STALL response is sent ++ * to an LPM transaction. ++ */ ++ unsigned rem_wkup_en:1; ++ /** Enable utmi_sleep_n (EnblSlpM) (Device and Host) ++ * The application uses this bit to control ++ * the utmi_sleep_n assertion to the PHY when in L1 state. ++ */ ++ unsigned en_utmi_sleep:1; ++ /** HIRD Threshold (HIRD_Thres) (Device and Host) ++ */ ++ unsigned hird_thres:5; ++ /** LPM Response (CoreL1Res) (Device and Host) ++ * In Host mode this bit contains handsake response to ++ * LPM transaction. ++ * In Device mode the response of the core to ++ * LPM transaction received is reflected in these two bits. ++ - 0x0 : ERROR (No handshake response) ++ - 0x1 : STALL ++ - 0x2 : NYET ++ - 0x3 : ACK ++ */ ++ unsigned lpm_resp:2; ++ /** Port Sleep Status (SlpSts) (Device and Host) ++ * This bit is set as long as a Sleep condition ++ * is present on the USB bus. ++ */ ++ unsigned prt_sleep_sts:1; ++ /** Sleep State Resume OK (L1ResumeOK) (Device and Host) ++ * Indicates that the application or host ++ * can start resume from Sleep state. ++ */ ++ unsigned sleep_state_resumeok:1; ++ /** LPM channel Index (LPM_Chnl_Indx) (Host) ++ * The channel number on which the LPM transaction ++ * has to be applied while sending ++ * an LPM transaction to the local device. ++ */ ++ unsigned lpm_chan_index:4; ++ /** LPM Retry Count (LPM_Retry_Cnt) (Host) ++ * Number host retries that would be performed ++ * if the device response was not valid response. ++ */ ++ unsigned retry_count:3; ++ /** Send LPM Transaction (SndLPM) (Host) ++ * When set by application software, ++ * an LPM transaction containing two tokens ++ * is sent. ++ */ ++ unsigned send_lpm:1; ++ /** LPM Retry status (LPM_RetryCnt_Sts) (Host) ++ * Number of LPM Host Retries still remaining ++ * to be transmitted for the current LPM sequence ++ */ ++ unsigned retry_count_sts:3; ++ unsigned reserved28_29:2; ++ /** In host mode once this bit is set, the host ++ * configures to drive the HSIC Idle state on the bus. ++ * It then waits for the device to initiate the Connect sequence. ++ * In device mode once this bit is set, the device waits for ++ * the HSIC Idle line state on the bus. Upon receving the Idle ++ * line state, it initiates the HSIC Connect sequence. ++ */ ++ unsigned hsic_connect:1; ++ /** This bit overrides and functionally inverts ++ * the if_select_hsic input port signal. ++ */ ++ unsigned inv_sel_hsic:1; ++ } b; ++} glpmcfg_data_t; ++ ++/** ++ * This union represents the bit fields of the Core ADP Timer, Control and ++ * Status Register (ADPTIMCTLSTS). Set the bits using bit fields then write ++ * the d32 value to the register. ++ */ ++typedef union adpctl_data { ++ /** raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ /** Probe Discharge (PRB_DSCHG) ++ * These bits set the times for TADP_DSCHG. ++ * These bits are defined as follows: ++ * 2'b00 - 4 msec ++ * 2'b01 - 8 msec ++ * 2'b10 - 16 msec ++ * 2'b11 - 32 msec ++ */ ++ unsigned prb_dschg:2; ++ /** Probe Delta (PRB_DELTA) ++ * These bits set the resolution for RTIM value. ++ * The bits are defined in units of 32 kHz clock cycles as follows: ++ * 2'b00 - 1 cycles ++ * 2'b01 - 2 cycles ++ * 2'b10 - 3 cycles ++ * 2'b11 - 4 cycles ++ * For example if this value is chosen to 2'b01, it means that RTIM ++ * increments for every 3(three) 32Khz clock cycles. ++ */ ++ unsigned prb_delta:2; ++ /** Probe Period (PRB_PER) ++ * These bits sets the TADP_PRD as shown in Figure 4 as follows: ++ * 2'b00 - 0.625 to 0.925 sec (typical 0.775 sec) ++ * 2'b01 - 1.25 to 1.85 sec (typical 1.55 sec) ++ * 2'b10 - 1.9 to 2.6 sec (typical 2.275 sec) ++ * 2'b11 - Reserved ++ */ ++ unsigned prb_per:2; ++ /** These bits capture the latest time it took for VBUS to ramp from ++ * VADP_SINK to VADP_PRB. ++ * 0x000 - 1 cycles ++ * 0x001 - 2 cycles ++ * 0x002 - 3 cycles ++ * etc ++ * 0x7FF - 2048 cycles ++ * A time of 1024 cycles at 32 kHz corresponds to a time of 32 msec. ++ */ ++ unsigned rtim:11; ++ /** Enable Probe (EnaPrb) ++ * When programmed to 1'b1, the core performs a probe operation. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned enaprb:1; ++ /** Enable Sense (EnaSns) ++ * When programmed to 1'b1, the core performs a Sense operation. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned enasns:1; ++ /** ADP Reset (ADPRes) ++ * When set, ADP controller is reset. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adpres:1; ++ /** ADP Enable (ADPEn) ++ * When set, the core performs either ADP probing or sensing ++ * based on EnaPrb or EnaSns. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adpen:1; ++ /** ADP Probe Interrupt (ADP_PRB_INT) ++ * When this bit is set, it means that the VBUS ++ * voltage is greater than VADP_PRB or VADP_PRB is reached. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_prb_int:1; ++ /** ++ * ADP Sense Interrupt (ADP_SNS_INT) ++ * When this bit is set, it means that the VBUS voltage is greater than ++ * VADP_SNS value or VADP_SNS is reached. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_sns_int:1; ++ /** ADP Tomeout Interrupt (ADP_TMOUT_INT) ++ * This bit is relevant only for an ADP probe. ++ * When this bit is set, it means that the ramp time has ++ * completed ie ADPCTL.RTIM has reached its terminal value ++ * of 0x7FF. This is a debug feature that allows software ++ * to read the ramp time after each cycle. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_tmout_int:1; ++ /** ADP Probe Interrupt Mask (ADP_PRB_INT_MSK) ++ * When this bit is set, it unmasks the interrupt due to ADP_PRB_INT. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_prb_int_msk:1; ++ /** ADP Sense Interrupt Mask (ADP_SNS_INT_MSK) ++ * When this bit is set, it unmasks the interrupt due to ADP_SNS_INT. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_sns_int_msk:1; ++ /** ADP Timoeout Interrupt Mask (ADP_TMOUT_MSK) ++ * When this bit is set, it unmasks the interrupt due to ADP_TMOUT_INT. ++ * This bit is valid only if OTG_Ver = 1'b1. ++ */ ++ unsigned adp_tmout_int_msk:1; ++ /** Access Request ++ * 2'b00 - Read/Write Valid (updated by the core) ++ * 2'b01 - Read ++ * 2'b00 - Write ++ * 2'b00 - Reserved ++ */ ++ unsigned ar:2; ++ /** Reserved */ ++ unsigned reserved29_31:3; ++ } b; ++} adpctl_data_t; ++ +//////////////////////////////////////////// +// Device Registers +/** @@ -69123,7 +83537,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned nzstsouthshk:1; +#define DWC_DCFG_SEND_STALL 1 + -+ unsigned reserved3:1; ++ unsigned ena32khzs:1; + /** Device Addresses */ + unsigned devaddr:7; + /** Periodic Frame Interval */ @@ -69132,12 +83546,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +#define DWC_DCFG_FRAME_INTERVAL_85 1 +#define DWC_DCFG_FRAME_INTERVAL_90 2 +#define DWC_DCFG_FRAME_INTERVAL_95 3 ++ ++ /** Enable Device OUT NAK for bulk in DDMA mode */ ++ unsigned endevoutnak:1; + -+ unsigned reserved13_17:5; ++ unsigned reserved14_17:4; + /** In Endpoint Mis-match count */ + unsigned epmscnt:5; + /** Enable Descriptor DMA in Device mode */ + unsigned descdma:1; ++ unsigned perschintvl:2; ++ unsigned resvalid:6; + } b; +} dcfg_data_t; + @@ -69169,19 +83588,20 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned sgoutnak:1; + /** Clear Global OUT NAK */ + unsigned cgoutnak:1; -+ + /** Power-On Programming Done */ + unsigned pwronprgdone:1; -+ /** Global Continue on BNA */ -+ unsigned gcontbna:1; ++ /** Reserved */ ++ unsigned reserved:1; + /** Global Multi Count */ + unsigned gmc:2; + /** Ignore Frame Number for ISOC EPs */ + unsigned ifrmnum:1; + /** NAK on Babble */ + unsigned nakonbble:1; ++ /** Enable Continue on BNA */ ++ unsigned encontonbna:1; + -+ unsigned reserved17_31:15; ++ unsigned reserved18_31:14; + } b; +} dctl_data_t; + @@ -69236,9 +83656,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned intktxfemp:1; + /** IN Token Received with EP mismatch mask */ + unsigned intknepmis:1; -+ /** IN Endpoint HAK Effective mask */ ++ /** IN Endpoint NAK Effective mask */ + unsigned inepnakeff:1; -+ /** IN Endpoint HAK Effective mask */ ++ /** Reserved */ + unsigned emptyintr:1; + + unsigned txfifoundrn:1; @@ -69255,7 +83675,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +} diepint_data_t; + +/** -+ * This union represents the bit fields in the Device IN EP ++ * This union represents the bit fields in the Device IN EP + * Common/Dedicated Interrupt Mask Register. + */ +typedef union diepint_data diepmsk_data_t; @@ -69302,13 +83722,15 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned nak:1; + /** NYET Interrupt */ + unsigned nyet:1; ++ /** Bit indicating setup packet received */ ++ unsigned sr:1; + -+ unsigned reserved15_31:17; ++ unsigned reserved16_31:16; + } b; +} doepint_data_t; + +/** -+ * This union represents the bit fields in the Device OUT EP ++ * This union represents the bit fields in the Device OUT EP + * Common/Dedicated Interrupt Mask Register. + */ +typedef union doepint_data doepmsk_data_t; @@ -69413,8 +83835,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned rx_thr_en:1; + /** Rx Thr. Length */ + unsigned rx_thr_len:9; ++ unsigned reserved26:1; ++ /** Arbiter Parking Enable*/ ++ unsigned arbprken:1; + /** Reserved */ -+ unsigned reserved26_31:6; ++ unsigned reserved28_31:4; + } b; +} dthrctl_data_t; + @@ -69467,9 +83892,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Device OUT Endpoint Control Register. Offset:B00h + + * (ep_num * 20h) + 00h */ + volatile uint32_t doepctl; -+ /** Device OUT Endpoint Frame number Register. Offset: -+ * B00h + (ep_num * 20h) + 04h */ -+ volatile uint32_t doepfn; ++ /** Reserved. Offset:B00h + (ep_num * 20h) + 04h */ ++ uint32_t reserved04; + /** Device OUT Endpoint Interrupt Register. Offset:B00h + + * (ep_num * 20h) + 08h */ + volatile uint32_t doepint; @@ -69498,7 +83922,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + uint32_t d32; + /** register bits */ + struct { -+ /** Maximum Packet Size ++ /** Maximum Packet Size + * IN/OUT EPn + * IN/OUT EP0 - 2 bits + * 2'b00: 64 Bytes @@ -69511,8 +83935,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +#define DWC_DEP0CTL_MPS_16 2 +#define DWC_DEP0CTL_MPS_8 3 + -+ /** Next Endpoint -+ * IN EPn/IN EP0 ++ /** Next Endpoint ++ * IN EPn/IN EP0 + * OUT EPn/OUT EP0 - reserved */ + unsigned nextep:4; + @@ -69528,7 +83952,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * activated. Application use the SetD1PID and + * SetD0PID fields of this register to program either + * D0 or D1 PID. -+ * ++ * + * The encoding for this field is + * - 0: D0 + * - 1: D1 @@ -69538,14 +83962,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** NAK Status */ + unsigned naksts:1; + -+ /** Endpoint Type ++ /** Endpoint Type + * 2'b00: Control + * 2'b01: Isochronous + * 2'b10: Bulk + * 2'b11: Interrupt */ + unsigned eptype:2; + -+ /** Snoop Mode ++ /** Snoop Mode + * OUT EPn/OUT EP0 + * IN EPn/IN EP0 - reserved */ + unsigned snp:1; @@ -69553,7 +83977,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Stall Handshake */ + unsigned stall:1; + -+ /** Tx Fifo Number ++ /** Tx Fifo Number + * IN EPn/IN EP0 + * OUT EPn/OUT EP0 - reserved */ + unsigned txfnum:4; @@ -69599,6 +84023,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + struct { + /** Transfer size */ + unsigned xfersize:19; ++/** Max packet count for EP (pow(2,10)-1) */ ++#define MAX_PKT_CNT 1023 + /** Packet Count */ + unsigned pktcnt:10; + /** Multi Count - Periodic IN endpoints */ @@ -69622,9 +84048,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Reserved */ + unsigned reserved7_18:12; + /** Packet Count */ -+ unsigned pktcnt:1; ++ unsigned pktcnt:2; + /** Reserved */ -+ unsigned reserved20_28:9; ++ unsigned reserved21_28:8; + /**Setup Packet Count (DOEPTSIZ0 Only) */ + unsigned supcnt:2; + unsigned reserved31; @@ -69652,7 +84078,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +/** + * This union represents the bit fields in the DMA Descriptor + * status quadlet. Read the quadlet into the d32 member then -+ * set/clear the bits using the bit, b_iso_out and ++ * set/clear the bits using the bit, b_iso_out and + * b_iso_in elements. + */ +typedef union dev_dma_desc_sts { @@ -69662,8 +84088,9 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + struct { + /** Received number of bytes */ + unsigned bytes:16; -+ -+ unsigned reserved16_22:7; ++ /** NAK bit - only for OUT EPs */ ++ unsigned nak:1; ++ unsigned reserved17_22:6; + /** Multiple Transfer - only for OUT EPs */ + unsigned mtrf:1; + /** Setup Packet received - only for OUT EPs */ @@ -69680,7 +84107,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned bs:2; + } b; + -+#ifdef DWC_EN_ISOC ++//#ifdef DWC_EN_ISOC + /** iso out quadlet bits */ + struct { + /** Received number of bytes */ @@ -69722,11 +84149,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Buffer Status */ + unsigned bs:2; + } b_iso_in; -+#endif /* DWC_EN_ISOC */ ++//#endif /* DWC_EN_ISOC */ +} dev_dma_desc_sts_t; + -+/** -+ * DMA Descriptor structure ++/** ++ * DMA Descriptor structure + * + * DMA Descriptor structure contains two quadlets: + * Status quadlet and Data buffer pointer. @@ -69750,8 +84177,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + dwc_otg_device_global_regs_t *dev_global_regs; +#define DWC_DEV_GLOBAL_REG_OFFSET 0x800 + -+ /** -+ * Device Logical IN Endpoint-Specific Registers 900h-AFCh ++ /** ++ * Device Logical IN Endpoint-Specific Registers 900h-AFCh + */ + dwc_otg_dev_in_ep_regs_t *in_ep_regs[MAX_EPS_CHANNELS]; +#define DWC_DEV_IN_EP_REG_OFFSET 0x900 @@ -69805,6 +84232,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + + /** Setup Packet Detected - if set clear NAK when queueing */ + uint32_t spd; ++ /** Isoc ep pointer on which incomplete happens */ ++ void *isoc_ep; + +} dwc_otg_dev_if_t; + @@ -69835,20 +84264,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + volatile uint32_t hflbaddr; +} dwc_otg_host_global_regs_t; + -+ +/** + * This union represents the bit fields in the Host Configuration Register. + * Read the register into the d32 member then set/clear the bits using + * the bit elements. Write the d32 member to the hcfg register. + */ -+typedef union hcfg_data -+{ ++typedef union hcfg_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ -+ struct -+ { ++ struct { + /** FS/LS Phy Clock Select */ + unsigned fslspclksel:2; +#define DWC_HCFG_30_60_MHZ 0 @@ -69857,21 +84283,26 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + + /** FS/LS Only Support */ + unsigned fslssupp:1; -+ unsigned reserved3_22 : 20; ++ unsigned reserved3_6:4; ++ /** Enable 32-KHz Suspend Mode */ ++ unsigned ena32khzs:1; ++ /** Resume Validation Periiod */ ++ unsigned resvalid:8; ++ unsigned reserved16_22:7; + /** Enable Scatter/gather DMA in Host mode */ -+ unsigned descdma : 1; ++ unsigned descdma:1; + /** Frame List Entries */ -+ unsigned frlisten: 2; ++ unsigned frlisten:2; + /** Enable Periodic Scheduling */ -+ unsigned perschedena: 1; -+ /** Periodic Scheduling Enabled Status */ -+ unsigned perschedstat: 1; ++ unsigned perschedena:1; ++ unsigned reserved27_30:4; ++ unsigned modechtimen:1; + } b; +} hcfg_data_t; + +/** + * This union represents the bit fields in the Host Frame Remaing/Number -+ * Register. ++ * Register. + */ +typedef union hfir_data { + /** raw register data */ @@ -69880,13 +84311,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** register bits */ + struct { + unsigned frint:16; -+ unsigned reserved:16; ++ unsigned hfirrldctrl:1; ++ unsigned reserved:15; + } b; +} hfir_data_t; + +/** + * This union represents the bit fields in the Host Frame Remaing/Number -+ * Register. ++ * Register. + */ +typedef union hfnum_data { + /** raw register data */ @@ -69957,8 +84389,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +} hprt0_data_t; + +/** -+ * This union represents the bit fields in the Host All Interrupt -+ * Register. ++ * This union represents the bit fields in the Host All Interrupt ++ * Register. + */ +typedef union haint_data { + /** raw register data */ @@ -69991,8 +84423,8 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +} haint_data_t; + +/** -+ * This union represents the bit fields in the Host All Interrupt -+ * Register. ++ * This union represents the bit fields in the Host All Interrupt ++ * Register. + */ +typedef union haintmsk_data { + /** raw register data */ @@ -70024,11 +84456,10 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + } b2; +} haintmsk_data_t; + -+/** ++/** + * Host Channel Specific Registers. 500h-5FCh + */ -+typedef struct dwc_otg_hc_regs -+{ ++typedef struct dwc_otg_hc_regs { + /** Host Channel 0 Characteristic Register. Offset: 500h + (chan_num * 20h) + 00h */ + volatile uint32_t hcchar; + /** Host Channel 0 Split Control Register. Offset: 500h + (chan_num * 20h) + 04h */ @@ -70126,16 +84557,14 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +} hcsplt_data_t; + +/** -+ * This union represents the bit fields in the Host All Interrupt -+ * Register. ++ * This union represents the bit fields in the Host All Interrupt ++ * Register. + */ -+typedef union hcint_data -+{ ++typedef union hcint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ -+ struct -+ { ++ struct { + /** Transfer Complete */ + unsigned xfercomp:1; + /** Channel Halted */ @@ -70159,13 +84588,13 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Data Toggle Error */ + unsigned datatglerr:1; + /** Buffer Not Available (only for DDMA mode) */ -+ unsigned bna : 1; ++ unsigned bna:1; + /** Exessive transaction error (only for DDMA mode) */ -+ unsigned xcs_xact : 1; ++ unsigned xcs_xact:1; + /** Frame List Rollover interrupt */ -+ unsigned frm_list_roll : 1; ++ unsigned frm_list_roll:1; + /** Reserved */ -+ unsigned reserved14_31 : 18; ++ unsigned reserved14_31:18; + } b; +} hcint_data_t; + @@ -70175,29 +84604,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * bits using the bit elements. Write the d32 member to the + * hcintmsk register. + */ -+typedef union hcintmsk_data -+{ ++typedef union hcintmsk_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ -+ struct -+ { -+ unsigned xfercompl : 1; -+ unsigned chhltd : 1; -+ unsigned ahberr : 1; -+ unsigned stall : 1; -+ unsigned nak : 1; -+ unsigned ack : 1; -+ unsigned nyet : 1; -+ unsigned xacterr : 1; -+ unsigned bblerr : 1; -+ unsigned frmovrun : 1; -+ unsigned datatglerr : 1; -+ unsigned bna : 1; -+ unsigned xcs_xact : 1; -+ unsigned frm_list_roll : 1; -+ unsigned reserved14_31 : 18; ++ struct { ++ unsigned xfercompl:1; ++ unsigned chhltd:1; ++ unsigned ahberr:1; ++ unsigned stall:1; ++ unsigned nak:1; ++ unsigned ack:1; ++ unsigned nyet:1; ++ unsigned xacterr:1; ++ unsigned bblerr:1; ++ unsigned frmovrun:1; ++ unsigned datatglerr:1; ++ unsigned bna:1; ++ unsigned xcs_xact:1; ++ unsigned frm_list_roll:1; ++ unsigned reserved14_31:18; + } b; +} hcintmsk_data_t; + @@ -70208,14 +84635,12 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * hcchar register. + */ + -+typedef union hctsiz_data -+{ ++typedef union hctsiz_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ -+ struct -+ { ++ struct { + /** Total transfer size in bytes */ + unsigned xfersize:19; + @@ -70239,22 +84664,21 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /** Do PING protocol when 1 */ + unsigned dopng:1; + } b; -+ ++ + /** register bits */ -+ struct -+ { ++ struct { + /** Scheduling information */ -+ unsigned schinfo : 8; -+ -+ /** Number of transfer descriptors. ++ unsigned schinfo:8; ++ ++ /** Number of transfer descriptors. + * Max value: -+ * 64 in general, ++ * 64 in general, + * 256 only for HS isochronous endpoint. + */ -+ unsigned ntd : 8; ++ unsigned ntd:8; + + /** Data packets to transfer */ -+ unsigned reserved16_28 : 13; ++ unsigned reserved16_28:13; + + /** + * Packet ID for next data packet @@ -70263,30 +84687,27 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * 2: DATA1 + * 3: MDATA (non-Control) + */ -+ unsigned pid : 2; ++ unsigned pid:2; + + /** Do PING protocol when 1 */ -+ unsigned dopng : 1; ++ unsigned dopng:1; + } b_ddma; +} hctsiz_data_t; + -+ +/** -+ * This union represents the bit fields in the Host DMA Address ++ * This union represents the bit fields in the Host DMA Address + * Register used in Descriptor DMA mode. + */ -+typedef union hcdma_data -+{ ++typedef union hcdma_data { + /** raw register data */ + uint32_t d32; + /** register bits */ -+ struct -+ { -+ unsigned reserved0_2 : 3; ++ struct { ++ unsigned reserved0_2:3; + /** Current Transfer Descriptor. Not used for ISOC */ -+ unsigned ctd : 8; ++ unsigned ctd:8; + /** Start Address of Descriptor List */ -+ unsigned dma_addr : 21; ++ unsigned dma_addr:21; + } b; +} hcdma_data_t; + @@ -70295,8 +84716,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + * status quadlet for host mode. Read the quadlet into the d32 member then + * set/clear the bits using the bit elements. + */ -+typedef union host_dma_desc_sts -+{ ++typedef union host_dma_desc_sts { + /** raw register data */ + uint32_t d32; + /** quadlet bits */ @@ -70304,44 +84724,44 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + /* for non-isochronous */ + struct { + /** Number of bytes */ -+ unsigned n_bytes : 17; ++ unsigned n_bytes:17; + /** QTD offset to jump when Short Packet received - only for IN EPs */ -+ unsigned qtd_offset : 6; -+ /** -+ * Set to request the core to jump to alternate QTD if -+ * Short Packet received - only for IN EPs ++ unsigned qtd_offset:6; ++ /** ++ * Set to request the core to jump to alternate QTD if ++ * Short Packet received - only for IN EPs + */ -+ unsigned a_qtd : 1; -+ /** ++ unsigned a_qtd:1; ++ /** + * Setup Packet bit. When set indicates that buffer contains -+ * setup packet. ++ * setup packet. + */ -+ unsigned sup : 1; ++ unsigned sup:1; + /** Interrupt On Complete */ -+ unsigned ioc : 1; ++ unsigned ioc:1; + /** End of List */ -+ unsigned eol : 1; -+ unsigned reserved27 : 1; ++ unsigned eol:1; ++ unsigned reserved27:1; + /** Rx/Tx Status */ -+ unsigned sts : 2; -+ #define DMA_DESC_STS_PKTERR 1 -+ unsigned reserved30 : 1; ++ unsigned sts:2; ++#define DMA_DESC_STS_PKTERR 1 ++ unsigned reserved30:1; + /** Active Bit */ -+ unsigned a : 1; ++ unsigned a:1; + } b; + /* for isochronous */ + struct { + /** Number of bytes */ -+ unsigned n_bytes : 12; -+ unsigned reserved12_24 : 13; ++ unsigned n_bytes:12; ++ unsigned reserved12_24:13; + /** Interrupt On Complete */ -+ unsigned ioc : 1; -+ unsigned reserved26_27 : 2; ++ unsigned ioc:1; ++ unsigned reserved26_27:2; + /** Rx/Tx Status */ -+ unsigned sts : 2; -+ unsigned reserved30 : 1; ++ unsigned sts:2; ++ unsigned reserved30:1; + /** Active Bit */ -+ unsigned a : 1; ++ unsigned a:1; + } b_isoc; +} host_dma_desc_sts_t; + @@ -70349,18 +84769,17 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +#define MAX_DMA_DESC_NUM_GENERIC 64 +#define MAX_DMA_DESC_NUM_HS_ISOC 256 +#define MAX_FRLIST_EN_NUM 64 -+/** -+ * Host-mode DMA Descriptor structure ++/** ++ * Host-mode DMA Descriptor structure + * + * DMA Descriptor structure contains two quadlets: + * Status quadlet and Data buffer pointer. + */ -+typedef struct dwc_otg_host_dma_desc -+{ ++typedef struct dwc_otg_host_dma_desc { + /** DMA Descriptor status quadlet */ -+ host_dma_desc_sts_t status; ++ host_dma_desc_sts_t status; + /** DMA Descriptor data buffer pointer */ -+ uint32_t buf; ++ uint32_t buf; +} dwc_otg_host_dma_desc_t; + +/** OTG Host Interface Structure. @@ -70397,7 +84816,7 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- +/** + * This union represents the bit fields in the Power and Clock Gating Control + * Register. Read the register into the d32 member then set/clear the -+ * bits using the bit elements. ++ * bits using the bit elements. + */ +typedef union pcgcctl_data { + /** raw register data */ @@ -70413,112 +84832,140 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-rpi-bootc- + unsigned pwrclmp:1; + /** Reset Power Down Modules */ + unsigned rstpdwnmodule:1; -+ /** PHY Suspended */ -+ unsigned physuspended:1; ++ /** Reserved */ ++ unsigned reserved:1; + /** Enable Sleep Clock Gating (Enbl_L1Gating) */ + unsigned enbl_sleep_gating:1; + /** PHY In Sleep (PhySleep) */ + unsigned phy_in_sleep:1; + /** Deep Sleep*/ + unsigned deep_sleep:1; -+ -+ unsigned reserved31_8:24; ++ unsigned resetaftsusp:1; ++ unsigned restoremode:1; ++ unsigned enbl_extnd_hiber:1; ++ unsigned extnd_hiber_pwrclmp:1; ++ unsigned extnd_hiber_switch:1; ++ unsigned ess_reg_restored:1; ++ unsigned prt_clk_sel:2; ++ unsigned port_power:1; ++ unsigned max_xcvrselect:2; ++ unsigned max_termsel:1; ++ unsigned mac_dev_addr:7; ++ unsigned p2hd_dev_enum_spd:2; ++ unsigned p2hd_prt_spd:2; ++ unsigned if_dev_mode:1; + } b; +} pcgcctl_data_t; + ++/** ++ * This union represents the bit fields in the Global Data FIFO Software ++ * Configuration Register. Read the register into the d32 member then ++ * set/clear the bits using the bit elements. ++ */ ++typedef union gdfifocfg_data { ++ /* raw register data */ ++ uint32_t d32; ++ /** register bits */ ++ struct { ++ /** OTG Data FIFO depth */ ++ unsigned gdfifocfg:16; ++ /** Start address of EP info controller */ ++ unsigned epinfobase:16; ++ } b; ++} gdfifocfg_data_t; ++ ++/** ++ * This union represents the bit fields in the Global Power Down Register ++ * Register. Read the register into the d32 member then set/clear the ++ * bits using the bit elements. ++ */ ++typedef union gpwrdn_data { ++ /* raw register data */ ++ uint32_t d32; ++ ++ /** register bits */ ++ struct { ++ /** PMU Interrupt Select */ ++ unsigned pmuintsel:1; ++ /** PMU Active */ ++ unsigned pmuactv:1; ++ /** Restore */ ++ unsigned restore:1; ++ /** Power Down Clamp */ ++ unsigned pwrdnclmp:1; ++ /** Power Down Reset */ ++ unsigned pwrdnrstn:1; ++ /** Power Down Switch */ ++ unsigned pwrdnswtch:1; ++ /** Disable VBUS */ ++ unsigned dis_vbus:1; ++ /** Line State Change */ ++ unsigned lnstschng:1; ++ /** Line state change mask */ ++ unsigned lnstchng_msk:1; ++ /** Reset Detected */ ++ unsigned rst_det:1; ++ /** Reset Detect mask */ ++ unsigned rst_det_msk:1; ++ /** Disconnect Detected */ ++ unsigned disconn_det:1; ++ /** Disconnect Detect mask */ ++ unsigned disconn_det_msk:1; ++ /** Connect Detected*/ ++ unsigned connect_det:1; ++ /** Connect Detected Mask*/ ++ unsigned connect_det_msk:1; ++ /** SRP Detected */ ++ unsigned srp_det:1; ++ /** SRP Detect mask */ ++ unsigned srp_det_msk:1; ++ /** Status Change Interrupt */ ++ unsigned sts_chngint:1; ++ /** Status Change Interrupt Mask */ ++ unsigned sts_chngint_msk:1; ++ /** Line State */ ++ unsigned linestate:2; ++ /** Indicates current mode(status of IDDIG signal) */ ++ unsigned idsts:1; ++ /** B Session Valid signal status*/ ++ unsigned bsessvld:1; ++ /** ADP Event Detected */ ++ unsigned adp_int:1; ++ /** Multi Valued ID pin */ ++ unsigned mult_val_id_bc:5; ++ /** Reserved 24_31 */ ++ unsigned reserved29_31:3; ++ } b; ++} gpwrdn_data_t; ++ +#endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/Makefile linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/Makefile ---- linux-3.2.23/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/Makefile 2012-07-15 20:29:19.058083099 +0200 -@@ -0,0 +1,85 @@ -+# -+# Makefile for DWC_otg Highspeed USB controller driver -+# +diff --git a/drivers/usb/host/dwc_otg/test/Makefile b/drivers/usb/host/dwc_otg/test/Makefile +new file mode 100644 +index 0000000..fc45375 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/test/Makefile +@@ -0,0 +1,16 @@ + -+ifneq ($(KERNELRELEASE),) ++PERL=/usr/bin/perl ++PL_TESTS=test_sysfs.pl test_mod_param.pl + -+ifeq ($(BUS_INTERFACE),) -+ # BUS_INTERFACE = -DLM_INTERFACE -+ BUS_INTERFACE = -DPLATFORM_INTERFACE=1 -+endif ++.PHONY : test ++test : perl_tests + -+ifeq ($(CONFIG_USB_DEBUG),y) -+CPPFLAGS += -DDEBUG -+endif -+ -+# Use one of the following flags to compile the software in host-only or -+# device-only mode. -+ifeq ($(CONFIG_USB_GADGET_DWCOTG),) -+CPPFLAGS += -DDWC_HOST_ONLY -+endif -+#CPPFLAGS += -DDWC_DEVICE_ONLY -+ -+# Use this flag to reduce SOF interrupt service overhead -+CPPFLAGS += -DSOF_FIX -+ -+CPPFLAGS += -Dlinux -DDWC_HS_ELECT_TST -+#CGG: CPPFLAGS += -DDWC_EN_ISOC -+CPPFLAGS += -I$(obj)/../dwc_common_port -+#CPPFLAGS += -I$(PORTLIB) -+CPPFLAGS += -DDWC_LINUX -+CPPFLAGS += $(CFI) -+CPPFLAGS += $(BUS_INTERFACE) -+ -+obj-$(CONFIG_USB_DWCOTG) += dwc_otg.o -+ -+dwc_otg-objs := dwc_otg_driver.o dwc_otg_attr.o -+dwc_otg-objs += dwc_otg_cil.o dwc_otg_cil_intr.o -+dwc_otg-objs += dwc_otg_pcd_linux.o dwc_otg_pcd.o dwc_otg_pcd_intr.o -+dwc_otg-objs += dwc_otg_hcd.o dwc_otg_hcd_linux.o dwc_otg_hcd_intr.o dwc_otg_hcd_queue.o dwc_otg_hcd_ddma.o -+ifneq ($(CFI),) -+dwc_otg-objs += dwc_otg_cfi.o -+endif -+ -+kernrelwd := $(subst ., ,$(KERNELRELEASE)) -+kernrel3 := $(word 1,$(kernrelwd)).$(word 2,$(kernrelwd)).$(word 3,$(kernrelwd)) -+ -+ifneq ($(kernrel3),2.6.20) -+EXTRA_CFLAGS += $(CPPFLAGS) -+endif -+ -+else -+ -+PWD := $(shell pwd) -+PORTLIB := $(PWD)/../dwc_common_port -+ -+# Command paths -+CTAGS := $(CTAGS) -+DOXYGEN := $(DOXYGEN) -+ -+default: portlib -+ $(MAKE) -C$(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules -+ -+install: default -+ifneq ($(INSTALL_MOD_PATH),) -+ $(MAKE) -C$(KDIR) M=$(PORTLIB) modules_install -+ $(MAKE) -C$(KDIR) M=$(PWD) modules_install -+else -+ @echo "No install path defined" -+endif -+ -+portlib: -+ $(MAKE) -C$(KDIR) M=$(PORTLIB) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules -+ cp $(PORTLIB)/Module.symvers $(PWD)/ -+ -+docs: $(wildcard *.[hc]) doc/doxygen.cfg -+ $(DOXYGEN) doc/doxygen.cfg -+ -+tags: $(wildcard *.[hc]) -+ $(CTAGS) -e $(wildcard *.[hc]) $(wildcard linux/*.[hc]) $(wildcard $(KDIR)/include/linux/usb*.h) -+ -+ -+clean: -+ rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions -+ -+endif -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm ---- linux-3.2.23/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2012-07-15 20:29:19.079083527 +0200 ++perl_tests : ++ @echo ++ @echo Running perl tests ++ @for test in $(PL_TESTS); do \ ++ if $(PERL) ./$$test ; then \ ++ echo "=======> $$test, PASSED" ; \ ++ else echo "=======> $$test, FAILED" ; \ ++ fi \ ++ done +diff --git a/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm b/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm +new file mode 100644 +index 0000000..233b04a +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm @@ -0,0 +1,337 @@ +package dwc_otg_test; + @@ -70857,29 +85304,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-rpi- +); + +1; -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/Makefile linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/Makefile ---- linux-3.2.23/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/Makefile 2012-07-15 20:29:19.079083527 +0200 -@@ -0,0 +1,16 @@ -+ -+PERL=/usr/bin/perl -+PL_TESTS=test_sysfs.pl test_mod_param.pl -+ -+.PHONY : test -+test : perl_tests -+ -+perl_tests : -+ @echo -+ @echo Running perl tests -+ @for test in $(PL_TESTS); do \ -+ if $(PERL) ./$$test ; then \ -+ echo "=======> $$test, PASSED" ; \ -+ else echo "=======> $$test, FAILED" ; \ -+ fi \ -+ done -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/test_mod_param.pl ---- linux-3.2.23/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2012-07-15 20:29:19.079083527 +0200 +diff --git a/drivers/usb/host/dwc_otg/test/test_mod_param.pl b/drivers/usb/host/dwc_otg/test/test_mod_param.pl +new file mode 100644 +index 0000000..e887dce +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/test/test_mod_param.pl @@ -0,0 +1,133 @@ +#!/usr/bin/perl -w +# @@ -71014,9 +85443,11 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-rp + +test_main(); +0; -diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/test_sysfs.pl ---- linux-3.2.23/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2012-07-15 20:29:19.079083527 +0200 +diff --git a/drivers/usb/host/dwc_otg/test/test_sysfs.pl b/drivers/usb/host/dwc_otg/test/test_sysfs.pl +new file mode 100644 +index 0000000..abcf284 +--- /dev/null ++++ b/drivers/usb/host/dwc_otg/test/test_sysfs.pl @@ -0,0 +1,193 @@ +#!/usr/bin/perl -w +# @@ -71211,55 +85642,48 @@ diff -Naur linux-3.2.23/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-rpi-bo + +test_main(); +0; -diff -Naur linux-3.2.23/drivers/usb/host/Kconfig linux-rpi-bootc-3.2.23/drivers/usb/host/Kconfig ---- linux-3.2.23/drivers/usb/host/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/Kconfig 2012-07-15 20:29:18.995081945 +0200 -@@ -556,6 +556,19 @@ - To compile this driver a module, choose M here: the module - will be called "hwa-hc". +diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig +index d83e967..a488cd7 100644 +--- a/drivers/video/Kconfig ++++ b/drivers/video/Kconfig +@@ -312,6 +312,20 @@ config FB_PM2_FIFO_DISCONNECT + help + Support the Permedia2 FIFO disconnect feature. -+config USB_DWCOTG -+ tristate "Synopsis DWC host support" -+ depends on USB ++config FB_BCM2708 ++ tristate "BCM2708 framebuffer support" ++ depends on FB && ARM ++ select FB_CFB_FILLRECT ++ select FB_CFB_COPYAREA ++ select FB_CFB_IMAGEBLIT + help -+ The Synopsis DWC controller is a dual-role -+ host/peripheral/OTG ("On The Go") USB controllers. ++ This framebuffer device driver is for the BCM2708 framebuffer. + -+ Enable this option to support this IP in host controller mode. -+ If unsure, say N. ++ If you want to compile this as a module (=code which can be ++ inserted into and removed from the running kernel), say M ++ here and read . The module ++ will be called bcm2708_fb. + -+ To compile this driver as a module, choose M here: the -+ modules built will be called dwc_otg and dwc_common_port. -+ - config USB_IMX21_HCD - tristate "i.MX21 HCD support" - depends on USB && ARM && ARCH_MXC -diff -Naur linux-3.2.23/drivers/usb/host/Makefile linux-rpi-bootc-3.2.23/drivers/usb/host/Makefile ---- linux-3.2.23/drivers/usb/host/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/host/Makefile 2012-07-15 20:29:18.988081815 +0200 -@@ -33,6 +33,8 @@ - obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o - obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o - obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o -+ -+obj-$(CONFIG_USB_DWCOTG) += dwc_otg/ dwc_common_port/ - obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o - obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o - obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o -diff -Naur linux-3.2.23/drivers/usb/Makefile linux-rpi-bootc-3.2.23/drivers/usb/Makefile ---- linux-3.2.23/drivers/usb/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/usb/Makefile 2012-07-15 20:29:18.536073310 +0200 -@@ -23,6 +23,7 @@ - obj-$(CONFIG_USB_R8A66597_HCD) += host/ - obj-$(CONFIG_USB_HWA_HCD) += host/ - obj-$(CONFIG_USB_ISP1760_HCD) += host/ -+obj-$(CONFIG_USB_DWCOTG) += host/ - obj-$(CONFIG_USB_IMX21_HCD) += host/ - obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ - -diff -Naur linux-3.2.23/drivers/video/bcm2708_fb.c linux-rpi-bootc-3.2.23/drivers/video/bcm2708_fb.c ---- linux-3.2.23/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/video/bcm2708_fb.c 2012-07-15 20:29:07.886872929 +0200 + config FB_ARMCLCD + tristate "ARM PrimeCell PL110 support" + depends on FB && ARM && ARM_AMBA +diff --git a/drivers/video/Makefile b/drivers/video/Makefile +index 9b9d8ff..6e9e8e9 100644 +--- a/drivers/video/Makefile ++++ b/drivers/video/Makefile +@@ -96,6 +96,7 @@ obj-$(CONFIG_FB_ATMEL) += atmel_lcdfb.o + obj-$(CONFIG_FB_PVR2) += pvr2fb.o + obj-$(CONFIG_FB_VOODOO1) += sstfb.o + obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o ++obj-$(CONFIG_FB_BCM2708) += bcm2708_fb.o + obj-$(CONFIG_FB_68328) += 68328fb.o + obj-$(CONFIG_FB_GBE) += gbefb.o + obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o +diff --git a/drivers/video/bcm2708_fb.c b/drivers/video/bcm2708_fb.c +new file mode 100644 +index 0000000..5ca8aca +--- /dev/null ++++ b/drivers/video/bcm2708_fb.c @@ -0,0 +1,487 @@ +/* + * linux/drivers/video/bcm2708_fb.c @@ -71637,8 +86061,8 @@ diff -Naur linux-3.2.23/drivers/video/bcm2708_fb.c linux-rpi-bootc-3.2.23/driver + fb->fb.var.vmode = FB_VMODE_NONINTERLACED; + fb->fb.var.activate = FB_ACTIVATE_NOW; + fb->fb.var.nonstd = 0; -+ fb->fb.var.height = fbwidth; -+ fb->fb.var.width = fbheight; ++ fb->fb.var.height = -1; /* height of picture in mm */ ++ fb->fb.var.width = -1; /* width of picture in mm */ + fb->fb.var.accel_flags = 0; + + fb->fb.monspecs.hfmin = 0; @@ -71748,33 +86172,10 @@ diff -Naur linux-3.2.23/drivers/video/bcm2708_fb.c linux-rpi-bootc-3.2.23/driver +MODULE_PARM_DESC(fbwidth, "Width of ARM Framebuffer"); +MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer"); +MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer"); -diff -Naur linux-3.2.23/drivers/video/Kconfig linux-rpi-bootc-3.2.23/drivers/video/Kconfig ---- linux-3.2.23/drivers/video/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/video/Kconfig 2012-07-15 20:29:07.824871765 +0200 -@@ -312,6 +312,20 @@ - help - Support the Permedia2 FIFO disconnect feature. - -+config FB_BCM2708 -+ tristate "BCM2708 framebuffer support" -+ depends on FB && ARM -+ select FB_CFB_FILLRECT -+ select FB_CFB_COPYAREA -+ select FB_CFB_IMAGEBLIT -+ help -+ This framebuffer device driver is for the BCM2708 framebuffer. -+ -+ If you want to compile this as a module (=code which can be -+ inserted into and removed from the running kernel), say M -+ here and read . The module -+ will be called bcm2708_fb. -+ - config FB_ARMCLCD - tristate "ARM PrimeCell PL110 support" - depends on FB && ARM && ARM_AMBA -diff -Naur linux-3.2.23/drivers/video/logo/logo_linux_clut224.ppm linux-rpi-bootc-3.2.23/drivers/video/logo/logo_linux_clut224.ppm ---- linux-3.2.23/drivers/video/logo/logo_linux_clut224.ppm 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/video/logo/logo_linux_clut224.ppm 2012-07-15 20:29:05.160821635 +0200 +diff --git a/drivers/video/logo/logo_linux_clut224.ppm b/drivers/video/logo/logo_linux_clut224.ppm +index 3c14e43..7626beb 100644 +--- a/drivers/video/logo/logo_linux_clut224.ppm ++++ b/drivers/video/logo/logo_linux_clut224.ppm @@ -1,1604 +1,883 @@ P3 -# Standard 224-color Linux logo @@ -74261,20 +88662,40 @@ diff -Naur linux-3.2.23/drivers/video/logo/logo_linux_clut224.ppm linux-rpi-boot +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 -diff -Naur linux-3.2.23/drivers/video/Makefile linux-rpi-bootc-3.2.23/drivers/video/Makefile ---- linux-3.2.23/drivers/video/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/video/Makefile 2012-07-15 20:29:03.534791038 +0200 -@@ -96,6 +96,7 @@ - obj-$(CONFIG_FB_PVR2) += pvr2fb.o - obj-$(CONFIG_FB_VOODOO1) += sstfb.o - obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o -+obj-$(CONFIG_FB_BCM2708) += bcm2708_fb.o - obj-$(CONFIG_FB_68328) += 68328fb.o - obj-$(CONFIG_FB_GBE) += gbefb.o - obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o -diff -Naur linux-3.2.23/drivers/watchdog/bcm2708_wdog.c linux-rpi-bootc-3.2.23/drivers/watchdog/bcm2708_wdog.c ---- linux-3.2.23/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/drivers/watchdog/bcm2708_wdog.c 2012-07-15 20:29:50.389672677 +0200 +diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig +index 79fd606..bd76a65 100644 +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -343,6 +343,12 @@ config IMX2_WDT + To compile this driver as a module, choose M here: the + module will be called imx2_wdt. + ++config BCM2708_WDT ++ tristate "BCM2708 Watchdog" ++ depends on ARCH_BCM2708 ++ help ++ Enables BCM2708 watchdog support. ++ + # AVR32 Architecture + + config AT32AP700X_WDT +diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile +index fe893e9..897ab01 100644 +--- a/drivers/watchdog/Makefile ++++ b/drivers/watchdog/Makefile +@@ -53,6 +53,7 @@ obj-$(CONFIG_STMP3XXX_WATCHDOG) += stmp3xxx_wdt.o + obj-$(CONFIG_NUC900_WATCHDOG) += nuc900_wdt.o + obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o + obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o ++obj-$(CONFIG_BCM2708_WDT) += bcm2708_wdog.o + + # AVR32 Architecture + obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o +diff --git a/drivers/watchdog/bcm2708_wdog.c b/drivers/watchdog/bcm2708_wdog.c +new file mode 100644 +index 0000000..dd33c35 +--- /dev/null ++++ b/drivers/watchdog/bcm2708_wdog.c @@ -0,0 +1,385 @@ +/* + * Broadcom BCM2708 watchdog driver. @@ -74661,37 +89082,31 @@ diff -Naur linux-3.2.23/drivers/watchdog/bcm2708_wdog.c linux-rpi-bootc-3.2.23/d +MODULE_ALIAS_MISCDEV(TEMP_MINOR); +MODULE_LICENSE("GPL"); + -diff -Naur linux-3.2.23/drivers/watchdog/Kconfig linux-rpi-bootc-3.2.23/drivers/watchdog/Kconfig ---- linux-3.2.23/drivers/watchdog/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/watchdog/Kconfig 2012-07-15 20:29:50.364672206 +0200 -@@ -343,6 +343,12 @@ - To compile this driver as a module, choose M here: the - module will be called imx2_wdt. +diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h +index deb6282..e97b341 100644 +--- a/include/linux/mmc/host.h ++++ b/include/linux/mmc/host.h +@@ -242,6 +242,7 @@ struct mmc_host { + #define MMC_CAP2_CACHE_CTRL (1 << 1) /* Allow cache control */ + #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2) /* Notify poweroff supported */ + #define MMC_CAP2_NO_MULTI_READ (1 << 3) /* Multiblock reads don't work */ ++#define MMC_CAP2_FORCE_MULTIBLOCK (1 << 4) /* Always use multiblock transfers */ -+config BCM2708_WDT -+ tristate "BCM2708 Watchdog" -+ depends on ARCH_BCM2708 -+ help -+ Enables BCM2708 watchdog support. -+ - # AVR32 Architecture + mmc_pm_flag_t pm_caps; /* supported pm features */ + unsigned int power_notify_type; +diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h +index e4b6935..d307033 100644 +--- a/include/linux/mmc/sdhci.h ++++ b/include/linux/mmc/sdhci.h +@@ -93,6 +93,7 @@ struct sdhci_host { + #define SDHCI_QUIRK2_OWN_CARD_DETECTION (1<<0) - config AT32AP700X_WDT -diff -Naur linux-3.2.23/drivers/watchdog/Makefile linux-rpi-bootc-3.2.23/drivers/watchdog/Makefile ---- linux-3.2.23/drivers/watchdog/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/drivers/watchdog/Makefile 2012-07-15 20:29:50.262670287 +0200 -@@ -53,6 +53,7 @@ - obj-$(CONFIG_NUC900_WATCHDOG) += nuc900_wdt.o - obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_wdt.o - obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o -+obj-$(CONFIG_BCM2708_WDT) += bcm2708_wdog.o + int irq; /* Device IRQ */ ++ int second_irq; /* Additional IRQ to disable/enable in low-latency mode */ + void __iomem *ioaddr; /* Mapped address */ - # AVR32 Architecture - obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o -diff -Naur linux-3.2.23/include/linux/mmc/sdhci.h linux-rpi-bootc-3.2.23/include/linux/mmc/sdhci.h ---- linux-3.2.23/include/linux/mmc/sdhci.h 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/include/linux/mmc/sdhci.h 2012-07-15 20:28:57.500677501 +0200 -@@ -121,6 +121,7 @@ + const struct sdhci_ops *ops; /* Low level hw interface */ +@@ -121,6 +122,7 @@ struct sdhci_host { #define SDHCI_AUTO_CMD23 (1<<7) /* Auto CMD23 support */ #define SDHCI_PV_ENABLED (1<<8) /* Preset value enabled */ #define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO irq enabled */ @@ -74699,7 +89114,7 @@ diff -Naur linux-3.2.23/include/linux/mmc/sdhci.h linux-rpi-bootc-3.2.23/include unsigned int version; /* SDHCI spec. version */ -@@ -135,6 +136,7 @@ +@@ -135,6 +137,7 @@ struct sdhci_host { struct mmc_request *mrq; /* Current request */ struct mmc_command *cmd; /* Current command */ @@ -74707,9 +89122,1543 @@ diff -Naur linux-3.2.23/include/linux/mmc/sdhci.h linux-rpi-bootc-3.2.23/include struct mmc_data *data; /* Current data request */ unsigned int data_early:1; /* Data finished before cmd */ -diff -Naur linux-3.2.23/sound/arm/bcm2835.c linux-rpi-bootc-3.2.23/sound/arm/bcm2835.c ---- linux-3.2.23/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/bcm2835.c 2012-07-15 20:28:25.381073128 +0200 +diff --git a/kernel/module.c b/kernel/module.c +index 6969ef0..0a64968 100644 +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -2604,20 +2604,23 @@ static int move_module(struct module *mod, struct load_info *info) + memset(ptr, 0, mod->core_size); + mod->module_core = ptr; + +- ptr = module_alloc_update_bounds(mod->init_size); +- /* +- * The pointer to this block is stored in the module structure +- * which is inside the block. This block doesn't need to be +- * scanned as it contains data and code that will be freed +- * after the module is initialized. +- */ +- kmemleak_ignore(ptr); +- if (!ptr && mod->init_size) { +- module_free(mod, mod->module_core); +- return -ENOMEM; ++ if (mod->init_size) { ++ ptr = module_alloc_update_bounds(mod->init_size); ++ /* ++ * The pointer to this block is stored in the module structure ++ * which is inside the block. This block doesn't need to be ++ * scanned as it contains data and code that will be freed ++ * after the module is initialized. ++ */ ++ kmemleak_ignore(ptr); ++ if (!ptr && mod->init_size) { ++ module_free(mod, mod->module_core); ++ return -ENOMEM; ++ } ++ memset(ptr, 0, mod->init_size); ++ mod->module_init = ptr; + } +- memset(ptr, 0, mod->init_size); +- mod->module_init = ptr; ++ else mod->module_init = NULL; + + /* Transfer each section which specifies SHF_ALLOC */ + DEBUGP("final section addresses:\n"); +diff --git a/sound/arm/Kconfig b/sound/arm/Kconfig +index 885683a..3577572 100644 +--- a/sound/arm/Kconfig ++++ b/sound/arm/Kconfig +@@ -39,5 +39,12 @@ config SND_PXA2XX_AC97 + Say Y or M if you want to support any AC97 codec attached to + the PXA2xx AC97 interface. + ++config SND_BCM2835 ++ tristate "BCM2835 ALSA driver" ++ depends on ARCH_BCM2708 && SND ++ select SND_PCM ++ help ++ Say Y or M if you want to support BCM2835 Alsa pcm card driver ++ + endif # SND_ARM + +diff --git a/sound/arm/Makefile b/sound/arm/Makefile +index 8c0c851..181cb57 100644 +--- a/sound/arm/Makefile ++++ b/sound/arm/Makefile +@@ -14,3 +14,9 @@ snd-pxa2xx-lib-$(CONFIG_SND_PXA2XX_LIB_AC97) += pxa2xx-ac97-lib.o + + obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o + snd-pxa2xx-ac97-objs := pxa2xx-ac97.o ++ ++obj-$(CONFIG_SND_BCM2835) += snd-bcm2835.o ++snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o ++ ++EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000 ++ +diff --git a/sound/arm/bcm2835-ctl.c b/sound/arm/bcm2835-ctl.c +new file mode 100755 +index 0000000..0c1b80a +--- /dev/null ++++ b/sound/arm/bcm2835-ctl.c +@@ -0,0 +1,200 @@ ++/***************************************************************************** ++* Copyright 2011 Broadcom Corporation. All rights reserved. ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2, available at ++* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a ++* license other than the GPL, without Broadcom's express prior written ++* consent. ++*****************************************************************************/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "bcm2835.h" ++ ++/* volume maximum and minimum in terms of 0.01dB */ ++#define CTRL_VOL_MAX 400 ++#define CTRL_VOL_MIN -10239 /* originally -10240 */ ++ ++ ++static int snd_bcm2835_ctl_info(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_info *uinfo) ++{ ++ audio_info(" ... IN "); ++ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) { ++ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; ++ uinfo->count = 1; ++ uinfo->value.integer.min = CTRL_VOL_MIN; ++ uinfo->value.integer.max = CTRL_VOL_MAX; /* 2303 */ ++ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) { ++ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; ++ uinfo->count = 1; ++ uinfo->value.integer.min = 0; ++ uinfo->value.integer.max = 1; ++ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) { ++ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; ++ uinfo->count = 1; ++ uinfo->value.integer.min = 0; ++ uinfo->value.integer.max = AUDIO_DEST_MAX-1; ++ } ++ audio_info(" ... OUT "); ++ return 0; ++} ++ ++/* toggles mute on or off depending on the value of nmute, and returns ++ * 1 if the mute value was changed, otherwise 0 ++ */ ++static int toggle_mute(struct bcm2835_chip *chip, int nmute) ++{ ++ /* if settings are ok, just return 0 */ ++ if(chip->mute == nmute) ++ return 0; ++ ++ /* if the sound is muted then we need to unmute */ ++ if(chip->mute == CTRL_VOL_MUTE) ++ { ++ chip->volume = chip->old_volume; /* copy the old volume back */ ++ audio_info("Unmuting, old_volume = %d, volume = %d ...", chip->old_volume, chip->volume); ++ } ++ else /* otherwise we mute */ ++ { ++ chip->old_volume = chip->volume; ++ chip->volume = 26214; /* set volume to minimum level AKA mute */ ++ audio_info("Muting, old_volume = %d, volume = %d ...", chip->old_volume, chip->volume); ++ } ++ ++ chip->mute = nmute; ++ return 1; ++} ++ ++static int snd_bcm2835_ctl_get(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol); ++ ++ BUG_ON(!chip && !(chip->avail_substreams & AVAIL_SUBSTREAMS_MASK)); ++ ++ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) ++ ucontrol->value.integer.value[0] = chip2alsa(chip->volume); ++ else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) ++ ucontrol->value.integer.value[0] = chip->mute; ++ else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) ++ ucontrol->value.integer.value[0] = chip->dest; ++ ++ return 0; ++} ++ ++static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol, ++ struct snd_ctl_elem_value *ucontrol) ++{ ++ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol); ++ int changed = 0; ++ ++ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) { ++ audio_info("Volume change attempted.. volume = %d new_volume = %d", chip->volume, (int)ucontrol->value.integer.value[0]); ++ if (chip->mute == CTRL_VOL_MUTE) { ++ /* changed = toggle_mute(chip, CTRL_VOL_UNMUTE); */ ++ return 1; /* should return 0 to signify no change but the mixer takes this as the opposite sign (no idea why) */ ++ } ++ if (changed ++ || (ucontrol->value.integer.value[0] != chip2alsa(chip->volume))) { ++ ++ chip->volume = alsa2chip(ucontrol->value.integer.value[0]); ++ changed = 1; ++ } ++ ++ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) { ++ /* Now implemented */ ++ audio_info(" Mute attempted"); ++ changed = toggle_mute(chip, ucontrol->value.integer.value[0]); ++ ++ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) { ++ if (ucontrol->value.integer.value[0] != chip->dest) { ++ chip->dest = ucontrol->value.integer.value[0]; ++ changed = 1; ++ } ++ } ++ ++ if (changed) { ++ if (bcm2835_audio_set_ctls(chip)) ++ printk(KERN_ERR "Failed to set ALSA controls..\n"); ++ } ++ ++ return changed; ++} ++ ++static DECLARE_TLV_DB_SCALE(snd_bcm2835_db_scale, CTRL_VOL_MIN, 1, 1); ++ ++static struct snd_kcontrol_new snd_bcm2835_ctl[] __devinitdata = { ++ { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .name = "PCM Playback Volume", ++ .index = 0, ++ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, ++ .private_value = PCM_PLAYBACK_VOLUME, ++ .info = snd_bcm2835_ctl_info, ++ .get = snd_bcm2835_ctl_get, ++ .put = snd_bcm2835_ctl_put, ++ .count = 1, ++ .tlv = {.p = snd_bcm2835_db_scale} ++ }, ++ { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .name = "PCM Playback Switch", ++ .index = 0, ++ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, ++ .private_value = PCM_PLAYBACK_MUTE, ++ .info = snd_bcm2835_ctl_info, ++ .get = snd_bcm2835_ctl_get, ++ .put = snd_bcm2835_ctl_put, ++ .count = 1, ++ }, ++ { ++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, ++ .name = "PCM Playback Route", ++ .index = 0, ++ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, ++ .private_value = PCM_PLAYBACK_DEVICE, ++ .info = snd_bcm2835_ctl_info, ++ .get = snd_bcm2835_ctl_get, ++ .put = snd_bcm2835_ctl_put, ++ .count = 1, ++ }, ++}; ++ ++int __devinit snd_bcm2835_new_ctl(bcm2835_chip_t * chip) ++{ ++ int err; ++ unsigned int idx; ++ ++ strcpy(chip->card->mixername, "Broadcom Mixer"); ++ for (idx = 0; idx < ARRAY_SIZE(snd_bcm2835_ctl); idx++) { ++ err = ++ snd_ctl_add(chip->card, ++ snd_ctl_new1(&snd_bcm2835_ctl[idx], chip)); ++ if (err < 0) ++ return err; ++ } ++ return 0; ++} +diff --git a/sound/arm/bcm2835-pcm.c b/sound/arm/bcm2835-pcm.c +new file mode 100755 +index 0000000..bc146a2 +--- /dev/null ++++ b/sound/arm/bcm2835-pcm.c +@@ -0,0 +1,408 @@ ++/***************************************************************************** ++* Copyright 2011 Broadcom Corporation. All rights reserved. ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2, available at ++* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a ++* license other than the GPL, without Broadcom's express prior written ++* consent. ++*****************************************************************************/ ++ ++#include ++#include ++ ++#include "bcm2835.h" ++ ++/* hardware definition */ ++static struct snd_pcm_hardware snd_bcm2835_playback_hw = { ++ .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER), ++ .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE, ++ .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, ++ .rate_min = 8000, ++ .rate_max = 48000, ++ .channels_min = 1, ++ .channels_max = 2, ++ .buffer_bytes_max = 32 * 1024, /* Needs to be less than audioplay buffer size */ ++ .period_bytes_min = 1 * 1024, ++ .period_bytes_max = 32 * 1024, ++ .periods_min = 1, ++ .periods_max = 32, ++}; ++ ++static void snd_bcm2835_playback_free(struct snd_pcm_runtime *runtime) ++{ ++ audio_info("Freeing up alsa stream here ..\n"); ++ if (runtime->private_data) ++ kfree(runtime->private_data); ++ runtime->private_data = NULL; ++} ++ ++static irqreturn_t bcm2835_playback_fifo_irq(int irq, void *dev_id) ++{ ++ bcm2835_alsa_stream_t *alsa_stream = (bcm2835_alsa_stream_t *) dev_id; ++ uint32_t consumed = 0; ++ int new_period = 0; ++ ++ audio_info(" .. IN\n"); ++ ++ audio_info("alsa_stream=%p substream=%p\n", alsa_stream, ++ alsa_stream ? alsa_stream->substream : 0); ++ ++ if (alsa_stream->open) ++ consumed = bcm2835_audio_retrieve_buffers(alsa_stream); ++ ++ /* We get called only if playback was triggered, So, the number of buffers we retrieve in ++ * each iteration are the buffers that have been played out already ++ */ ++ ++ if (alsa_stream->period_size) { ++ if ((alsa_stream->pos / alsa_stream->period_size) != ++ ((alsa_stream->pos + consumed) / alsa_stream->period_size)) ++ new_period = 1; ++ } ++ audio_debug("updating pos cur: %d + %d max:%d period_bytes:%d, hw_ptr: %d new_period:%d\n", ++ alsa_stream->pos, ++ consumed, ++ alsa_stream->buffer_size, ++ (int)(alsa_stream->period_size*alsa_stream->substream->runtime->periods), ++ frames_to_bytes(alsa_stream->substream->runtime, alsa_stream->substream->runtime->status->hw_ptr), ++ new_period); ++ if (alsa_stream->buffer_size) { ++ alsa_stream->pos += consumed &~ (1<<30); ++ alsa_stream->pos %= alsa_stream->buffer_size; ++ } ++ ++ if (alsa_stream->substream) { ++ if (new_period) ++ snd_pcm_period_elapsed(alsa_stream->substream); ++ } else { ++ audio_warning(" unexpected NULL substream\n"); ++ } ++ audio_info(" .. OUT\n"); ++ ++ return IRQ_HANDLED; ++} ++ ++/* open callback */ ++static int snd_bcm2835_playback_open(struct snd_pcm_substream *substream) ++{ ++ bcm2835_chip_t *chip = snd_pcm_substream_chip(substream); ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream; ++ int idx; ++ int err; ++ ++ audio_info(" .. IN (%d)\n", substream->number); ++ ++ audio_warning("Alsa open (%d)\n", substream->number); ++ idx = substream->number; ++ ++ if (idx > MAX_SUBSTREAMS) { ++ audio_error ++ ("substream(%d) device doesn't exist max(%d) substreams allowed\n", ++ idx, MAX_SUBSTREAMS); ++ err = -ENODEV; ++ goto out; ++ } ++ ++ /* Check if we are ready */ ++ if (!(chip->avail_substreams & (1 << idx))) { ++ /* We are not ready yet */ ++ audio_error("substream(%d) device is not ready yet\n", idx); ++ err = -EAGAIN; ++ goto out; ++ } ++ ++ alsa_stream = kzalloc(sizeof(bcm2835_alsa_stream_t), GFP_KERNEL); ++ if (alsa_stream == NULL) { ++ return -ENOMEM; ++ } ++ ++ /* Initialise alsa_stream */ ++ alsa_stream->chip = chip; ++ alsa_stream->substream = substream; ++ alsa_stream->idx = idx; ++ chip->alsa_stream[idx] = alsa_stream; ++ ++ sema_init(&alsa_stream->buffers_update_sem, 0); ++ sema_init(&alsa_stream->control_sem, 0); ++ spin_lock_init(&alsa_stream->lock); ++ ++ /* Enabled in start trigger, called on each "fifo irq" after that */ ++ alsa_stream->enable_fifo_irq = 0; ++ alsa_stream->fifo_irq_handler = bcm2835_playback_fifo_irq; ++ ++ runtime->private_data = alsa_stream; ++ runtime->private_free = snd_bcm2835_playback_free; ++ runtime->hw = snd_bcm2835_playback_hw; ++ /* minimum 16 bytes alignment (for vchiq bulk transfers) */ ++ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, ++ 16); ++ ++ err = bcm2835_audio_open(alsa_stream); ++ if (err != 0) { ++ kfree(alsa_stream); ++ return err; ++ } ++ ++ alsa_stream->open = 1; ++ alsa_stream->draining = 1; ++ ++out: ++ audio_info(" .. OUT =%d\n", err); ++ ++ return err; ++} ++ ++/* close callback */ ++static int snd_bcm2835_playback_close(struct snd_pcm_substream *substream) ++{ ++ /* the hardware-specific codes will be here */ ++ ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; ++ ++ audio_info(" .. IN\n"); ++ audio_warning("Alsa close\n"); ++ ++ /* ++ * Call stop if it's still running. This happens when app ++ * is force killed and we don't get a stop trigger. ++ */ ++ if (alsa_stream->running) { ++ int err; ++ err = bcm2835_audio_stop(alsa_stream); ++ alsa_stream->running = 0; ++ if (err != 0) ++ audio_error(" Failed to STOP alsa device\n"); ++ } ++ ++ alsa_stream->period_size = 0; ++ alsa_stream->buffer_size = 0; ++ ++ if (alsa_stream->open) { ++ alsa_stream->open = 0; ++ bcm2835_audio_close(alsa_stream); ++ } ++ if (alsa_stream->chip) ++ alsa_stream->chip->alsa_stream[alsa_stream->idx] = NULL; ++ /* ++ * Do not free up alsa_stream here, it will be freed up by ++ * runtime->private_free callback we registered in *_open above ++ */ ++ ++ audio_info(" .. OUT\n"); ++ ++ return 0; ++} ++ ++/* hw_params callback */ ++static int snd_bcm2835_pcm_hw_params(struct snd_pcm_substream *substream, ++ struct snd_pcm_hw_params *params) ++{ ++ int err; ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = ++ (bcm2835_alsa_stream_t *) runtime->private_data; ++ ++ audio_info(" .. IN\n"); ++ ++ err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); ++ if (err < 0) { ++ audio_error ++ (" pcm_lib_malloc failed to allocated pages for buffers\n"); ++ return err; ++ } ++ ++ err = bcm2835_audio_set_params(alsa_stream, params_channels(params), ++ params_rate(params), ++ snd_pcm_format_width(params_format ++ (params))); ++ if (err < 0) { ++ audio_error(" error setting hw params\n"); ++ } ++ ++ bcm2835_audio_setup(alsa_stream); ++ ++ /* in preparation of the stream, set the controls (volume level) of the stream */ ++ bcm2835_audio_set_ctls(alsa_stream->chip); ++ ++ audio_info(" .. OUT\n"); ++ ++ return err; ++} ++ ++/* hw_free callback */ ++static int snd_bcm2835_pcm_hw_free(struct snd_pcm_substream *substream) ++{ ++ audio_info(" .. IN\n"); ++ return snd_pcm_lib_free_pages(substream); ++} ++ ++/* prepare callback */ ++static int snd_bcm2835_pcm_prepare(struct snd_pcm_substream *substream) ++{ ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; ++ ++ audio_info(" .. IN\n"); ++ ++ alsa_stream->buffer_size = snd_pcm_lib_buffer_bytes(substream); ++ alsa_stream->period_size = snd_pcm_lib_period_bytes(substream); ++ alsa_stream->pos = 0; ++ ++ audio_debug("buffer_size=%d, period_size=%d pos=%d frame_bits=%d\n", ++ alsa_stream->buffer_size, alsa_stream->period_size, ++ alsa_stream->pos, runtime->frame_bits); ++ ++ audio_info(" .. OUT\n"); ++ return 0; ++} ++ ++/* trigger callback */ ++static int snd_bcm2835_pcm_trigger(struct snd_pcm_substream *substream, int cmd) ++{ ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; ++ int err = 0; ++ ++ audio_info(" .. IN\n"); ++ ++ switch (cmd) { ++ case SNDRV_PCM_TRIGGER_START: ++ audio_debug("bcm2835_AUDIO_TRIGGER_START running=%d\n", ++ alsa_stream->running); ++ if (!alsa_stream->running) { ++ err = bcm2835_audio_start(alsa_stream); ++ if (err == 0) { ++ alsa_stream->running = 1; ++ alsa_stream->draining = 1; ++ } ++ } ++ break; ++ case SNDRV_PCM_TRIGGER_STOP: ++ audio_debug ++ ("bcm2835_AUDIO_TRIGGER_STOP running=%d draining=%d\n", ++ runtime->status->state == SNDRV_PCM_STATE_DRAINING, ++ alsa_stream->running); ++ if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { ++ audio_info("DRAINING\n"); ++ alsa_stream->draining = 1; ++ } else { ++ audio_info("DROPPING\n"); ++ alsa_stream->draining = 0; ++ } ++ if (alsa_stream->running) { ++ err = bcm2835_audio_stop(alsa_stream); ++ if (err != 0) ++ audio_error(" Failed to STOP alsa device\n"); ++ alsa_stream->running = 0; ++ } ++ break; ++ default: ++ err = -EINVAL; ++ } ++ ++ audio_info(" .. OUT\n"); ++ return err; ++} ++ ++/* pointer callback */ ++static snd_pcm_uframes_t ++snd_bcm2835_pcm_pointer(struct snd_pcm_substream *substream) ++{ ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; ++ ++ audio_info(" .. IN\n"); ++ ++ audio_debug("pcm_pointer... (%d) hwptr=%d appl=%d pos=%d\n", 0, ++ frames_to_bytes(runtime, runtime->status->hw_ptr), ++ frames_to_bytes(runtime, runtime->control->appl_ptr), ++ alsa_stream->pos); ++ ++ audio_info(" .. OUT\n"); ++ return bytes_to_frames(runtime, alsa_stream->pos); ++} ++ ++static int snd_bcm2835_pcm_copy(struct snd_pcm_substream *substream, ++ int channel, snd_pcm_uframes_t pos, void *src, ++ snd_pcm_uframes_t count) ++{ ++ int ret; ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; ++ ++ audio_info(" .. IN\n"); ++ audio_debug("copy.......... (%d) hwptr=%d appl=%d pos=%d\n", ++ frames_to_bytes(runtime, count), frames_to_bytes(runtime, ++ runtime-> ++ status-> ++ hw_ptr), ++ frames_to_bytes(runtime, runtime->control->appl_ptr), ++ alsa_stream->pos); ++ ret = ++ bcm2835_audio_write(alsa_stream, frames_to_bytes(runtime, count), ++ src); ++ audio_info(" .. OUT\n"); ++ return ret; ++} ++ ++static int snd_bcm2835_pcm_lib_ioctl(struct snd_pcm_substream *substream, ++ unsigned int cmd, void *arg) ++{ ++ int ret = snd_pcm_lib_ioctl(substream, cmd, arg); ++ audio_info(" .. substream=%p, cmd=%d, arg=%p (%x) ret=%d\n", substream, ++ cmd, arg, arg ? *(unsigned *)arg : 0, ret); ++ return ret; ++} ++ ++/* operators */ ++static struct snd_pcm_ops snd_bcm2835_playback_ops = { ++ .open = snd_bcm2835_playback_open, ++ .close = snd_bcm2835_playback_close, ++ .ioctl = snd_bcm2835_pcm_lib_ioctl, ++ .hw_params = snd_bcm2835_pcm_hw_params, ++ .hw_free = snd_bcm2835_pcm_hw_free, ++ .prepare = snd_bcm2835_pcm_prepare, ++ .trigger = snd_bcm2835_pcm_trigger, ++ .pointer = snd_bcm2835_pcm_pointer, ++ .copy = snd_bcm2835_pcm_copy, ++}; ++ ++/* create a pcm device */ ++int __devinit snd_bcm2835_new_pcm(bcm2835_chip_t * chip) ++{ ++ struct snd_pcm *pcm; ++ int err; ++ ++ audio_info(" .. IN\n"); ++ err = ++ snd_pcm_new(chip->card, "bcm2835 ALSA", 0, MAX_SUBSTREAMS, 0, &pcm); ++ if (err < 0) ++ return err; ++ pcm->private_data = chip; ++ strcpy(pcm->name, "bcm2835 ALSA"); ++ chip->pcm = pcm; ++ chip->dest = AUDIO_DEST_AUTO; ++ chip->volume = alsa2chip(0); ++ chip->mute = CTRL_VOL_UNMUTE; /*disable mute on startup */ ++ /* set operators */ ++ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, ++ &snd_bcm2835_playback_ops); ++ ++ /* pre-allocation of buffers */ ++ /* NOTE: this may fail */ ++ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, ++ snd_dma_continuous_data ++ (GFP_KERNEL), 64 * 1024, ++ 64 * 1024); ++ ++ audio_info(" .. OUT\n"); ++ ++ return 0; ++} +diff --git a/sound/arm/bcm2835-vchiq.c b/sound/arm/bcm2835-vchiq.c +new file mode 100755 +index 0000000..68d838d +--- /dev/null ++++ b/sound/arm/bcm2835-vchiq.c +@@ -0,0 +1,834 @@ ++/***************************************************************************** ++* Copyright 2011 Broadcom Corporation. All rights reserved. ++* ++* Unless you and Broadcom execute a separate written software license ++* agreement governing use of this software, this software is licensed to you ++* under the terms of the GNU General Public License version 2, available at ++* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). ++* ++* Notwithstanding the above, under no circumstances may you combine this ++* software in any way with any other Broadcom software provided under a ++* license other than the GPL, without Broadcom's express prior written ++* consent. ++*****************************************************************************/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "bcm2835.h" ++ ++/* ---- Include Files -------------------------------------------------------- */ ++ ++#include "interface/vchi/vchi.h" ++#include "interface/vcos/vcos.h" ++#include "interface/vcos/vcos_logging.h" ++#include "vc_vchi_audioserv_defs.h" ++ ++/* ---- Private Constants and Types ------------------------------------------ */ ++ ++/* VCOS logging category for this service */ ++#define VCOS_LOG_CATEGORY (&audio_log_category) ++ ++/* Default VCOS logging level */ ++#define LOG_LEVEL VCOS_LOG_WARN ++/* Logging macros (for remapping to other logging mechanisms, i.e., printf) */ ++#ifdef AUDIO_DEBUG_ENABLE ++ #define LOG_ERR( fmt, arg... ) pr_err( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_WARN( fmt, arg... ) pr_info( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_INFO( fmt, arg... ) pr_info( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_DBG( fmt, arg... ) pr_info( "%s:%d " fmt, __func__, __LINE__, ##arg) ++#else ++ #define LOG_ERR( fmt, arg... ) vcos_log_error( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_WARN( fmt, arg... ) vcos_log_warn( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_INFO( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg) ++ #define LOG_DBG( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg) ++#endif ++ ++typedef struct opaque_AUDIO_INSTANCE_T { ++ uint32_t num_connections; ++ VCHI_SERVICE_HANDLE_T vchi_handle[VCHI_MAX_NUM_CONNECTIONS]; ++ VCOS_EVENT_T msg_avail_event; ++ VCOS_MUTEX_T vchi_mutex; ++ bcm2835_alsa_stream_t *alsa_stream; ++ int32_t result, got_result; ++} AUDIO_INSTANCE_T; ++ ++/* ---- Private Variables ---------------------------------------------------- */ ++ ++/* VCOS logging category for this service */ ++static VCOS_LOG_CAT_T audio_log_category; ++ ++/* ---- Private Function Prototypes ------------------------------------------ */ ++ ++/* ---- Private Functions ---------------------------------------------------- */ ++ ++static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream); ++static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream); ++ ++typedef struct { ++ struct work_struct my_work; ++ bcm2835_alsa_stream_t *alsa_stream; ++ int x; ++} my_work_t; ++ ++static void my_wq_function(struct work_struct *work) ++{ ++ my_work_t *w = (my_work_t *) work; ++ int ret = -9; ++ LOG_DBG(" .. IN %p:%d\n", w->alsa_stream, w->x); ++ switch (w->x) { ++ case 1: ++ ret = bcm2835_audio_start_worker(w->alsa_stream); ++ break; ++ case 2: ++ ret = bcm2835_audio_stop_worker(w->alsa_stream); ++ break; ++ default: ++ LOG_ERR(" Unexpected work: %p:%d\n", w->alsa_stream, w->x); ++ break; ++ } ++ kfree((void *)work); ++ LOG_DBG(" .. OUT %d\n", ret); ++} ++ ++int bcm2835_audio_start(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ int ret = -1; ++ LOG_DBG(" .. IN\n"); ++ if (alsa_stream->my_wq) { ++ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_ATOMIC); ++ /*--- Queue some work (item 1) ---*/ ++ if (work) { ++ INIT_WORK((struct work_struct *)work, my_wq_function); ++ work->alsa_stream = alsa_stream; ++ work->x = 1; ++ if (queue_work ++ (alsa_stream->my_wq, (struct work_struct *)work)) ++ ret = 0; ++ } else ++ LOG_ERR(" .. Error: NULL work kmalloc\n"); ++ } ++ LOG_DBG(" .. OUT %d\n", ret); ++ return ret; ++} ++ ++int bcm2835_audio_stop(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ int ret = -1; ++ LOG_DBG(" .. IN\n"); ++ if (alsa_stream->my_wq) { ++ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_ATOMIC); ++ /*--- Queue some work (item 1) ---*/ ++ if (work) { ++ INIT_WORK((struct work_struct *)work, my_wq_function); ++ work->alsa_stream = alsa_stream; ++ work->x = 2; ++ if (queue_work ++ (alsa_stream->my_wq, (struct work_struct *)work)) ++ ret = 0; ++ } else ++ LOG_ERR(" .. Error: NULL work kmalloc\n"); ++ } ++ LOG_DBG(" .. OUT %d\n", ret); ++ return ret; ++} ++ ++void my_workqueue_init(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ alsa_stream->my_wq = create_workqueue("my_queue"); ++ return; ++} ++ ++void my_workqueue_quit(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ if (alsa_stream->my_wq) { ++ flush_workqueue(alsa_stream->my_wq); ++ destroy_workqueue(alsa_stream->my_wq); ++ alsa_stream->my_wq = NULL; ++ } ++ return; ++} ++ ++static void audio_vchi_callback(void *param, ++ const VCHI_CALLBACK_REASON_T reason, ++ void *msg_handle) ++{ ++ AUDIO_INSTANCE_T *instance = (AUDIO_INSTANCE_T *) param; ++ int32_t status; ++ int32_t msg_len; ++ VC_AUDIO_MSG_T m; ++ bcm2835_alsa_stream_t *alsa_stream = 0; ++ LOG_DBG(" .. IN instance=%p, param=%p, reason=%d, handle=%p\n", ++ instance, param, reason, msg_handle); ++ ++ if (!instance || reason != VCHI_CALLBACK_MSG_AVAILABLE) { ++ return; ++ } ++ alsa_stream = instance->alsa_stream; ++ status = vchi_msg_dequeue(instance->vchi_handle[0], ++ &m, sizeof m, &msg_len, VCHI_FLAGS_NONE); ++ if (m.type == VC_AUDIO_MSG_TYPE_RESULT) { ++ LOG_DBG ++ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_RESULT, success=%d\n", ++ instance, m.u.result.success); ++ BUG_ON(instance->got_result); ++ instance->result = m.u.result.success; ++ instance->got_result = 1; ++ vcos_event_signal(&instance->msg_avail_event); ++ } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) { ++ irq_handler_t callback = (irq_handler_t) m.u.complete.callback; ++ LOG_DBG ++ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_COMPLETE, complete=%d\n", ++ instance, m.u.complete.count); ++ if (alsa_stream && callback) { ++ atomic_add(m.u.complete.count, &alsa_stream->retrieved); ++ callback(0, alsa_stream); ++ } else { ++ LOG_DBG(" .. unexpected alsa_stream=%p, callback=%p\n", ++ alsa_stream, callback); ++ } ++ vcos_event_signal(&instance->msg_avail_event); ++ } else { ++ LOG_DBG(" .. unexpected m.type=%d\n", m.type); ++ } ++} ++ ++static AUDIO_INSTANCE_T *vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance, ++ VCHI_CONNECTION_T ** ++ vchi_connections, ++ uint32_t num_connections) ++{ ++ uint32_t i; ++ AUDIO_INSTANCE_T *instance; ++ VCOS_STATUS_T status; ++ ++ LOG_DBG("%s: start", __func__); ++ ++ if (num_connections > VCHI_MAX_NUM_CONNECTIONS) { ++ LOG_ERR("%s: unsupported number of connections %u (max=%u)", ++ __func__, num_connections, VCHI_MAX_NUM_CONNECTIONS); ++ ++ return NULL; ++ } ++ /* Allocate memory for this instance */ ++ instance = vcos_malloc(sizeof(*instance), "audio_instance"); ++ memset(instance, 0, sizeof(*instance)); ++ ++ instance->num_connections = num_connections; ++ /* Create the message available event */ ++ status = ++ vcos_event_create(&instance->msg_avail_event, "audio_msg_avail"); ++ if (status != VCOS_SUCCESS) { ++ LOG_ERR("%s: failed to create event (status=%d)", __func__, ++ status); ++ ++ goto err_free_mem; ++ } ++ /* Create a lock for exclusive, serialized VCHI connection access */ ++ status = vcos_mutex_create(&instance->vchi_mutex, "audio_vchi_mutex"); ++ if (status != VCOS_SUCCESS) { ++ LOG_ERR("%s: failed to create event (status=%d)", __func__, ++ status); ++ ++ goto err_delete_event; ++ } ++ /* Open the VCHI service connections */ ++ for (i = 0; i < num_connections; i++) { ++ SERVICE_CREATION_T params = { ++ VC_AUDIO_SERVER_NAME, // 4cc service code ++ vchi_connections[i], // passed in fn pointers ++ 0, // rx fifo size (unused) ++ 0, // tx fifo size (unused) ++ audio_vchi_callback, // service callback ++ instance, // service callback parameter ++ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk recieves ++ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk transmits ++ VCOS_FALSE // want crc check on bulk transfers ++ }; ++ ++ status = vchi_service_open(vchi_instance, ¶ms, ++ &instance->vchi_handle[i]); ++ if (status != VCOS_SUCCESS) { ++ LOG_ERR ++ ("%s: failed to open VCHI service connection (status=%d)", ++ __func__, status); ++ ++ goto err_close_services; ++ } ++ /* Finished with the service for now */ ++ vchi_service_release(instance->vchi_handle[i]); ++ } ++ ++ return instance; ++ ++err_close_services: ++ for (i = 0; i < instance->num_connections; i++) { ++ vchi_service_close(instance->vchi_handle[i]); ++ } ++ ++ vcos_mutex_delete(&instance->vchi_mutex); ++ ++err_delete_event: ++ vcos_event_delete(&instance->msg_avail_event); ++ ++err_free_mem: ++ vcos_free(instance); ++ ++ return NULL; ++} ++ ++static int32_t vc_vchi_audio_deinit(AUDIO_INSTANCE_T * instance) ++{ ++ uint32_t i; ++ ++ LOG_DBG(" .. IN\n"); ++ ++ if (instance == NULL) { ++ LOG_ERR("%s: invalid handle %p", __func__, instance); ++ ++ return -1; ++ } ++ ++ LOG_DBG(" .. about to lock (%d)\n", instance->num_connections); ++ vcos_mutex_lock(&instance->vchi_mutex); ++ ++ /* Close all VCHI service connections */ ++ for (i = 0; i < instance->num_connections; i++) { ++ int32_t success; ++ LOG_DBG(" .. %i:closing %p\n", i, instance->vchi_handle[i]); ++ vchi_service_use(instance->vchi_handle[i]); ++ ++ success = vchi_service_close(instance->vchi_handle[i]); ++ if (success != 0) { ++ LOG_ERR ++ ("%s: failed to close VCHI service connection (status=%d)", ++ __func__, success); ++ } ++ } ++ ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ ++ vcos_mutex_delete(&instance->vchi_mutex); ++ ++ vcos_event_delete(&instance->msg_avail_event); ++ ++ vcos_free(instance); ++ ++ /* Unregister the log category so we can add it back next time */ ++ vcos_log_unregister(&audio_log_category); ++ ++ LOG_DBG(" .. OUT\n"); ++ ++ return 0; ++} ++ ++static int bcm2835_audio_open_connection(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ static VCHI_INSTANCE_T vchi_instance; ++ static VCHI_CONNECTION_T *vchi_connection; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ LOG_INFO("%s: start", __func__); ++ //BUG_ON(instance); ++ if (instance) { ++ LOG_ERR("%s: VCHI instance already open (%p)", ++ __func__, instance); ++ instance->alsa_stream = alsa_stream; ++ alsa_stream->instance = instance; ++ ret = 0; // xxx todo -1; ++ goto err_free_mem; ++ } ++ ++ /* Initialize and create a VCHI connection */ ++ ret = vchi_initialise(&vchi_instance); ++ if (ret != 0) { ++ LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)", ++ __func__, ret); ++ ++ ret = -EIO; ++ goto err_free_mem; ++ } ++ ret = vchi_connect(NULL, 0, vchi_instance); ++ if (ret != 0) { ++ LOG_ERR("%s: failed to connect VCHI instance (ret=%d)", ++ __func__, ret); ++ ++ ret = -EIO; ++ goto err_free_mem; ++ } ++ ++ /* Set up the VCOS logging */ ++ vcos_log_set_level(VCOS_LOG_CATEGORY, LOG_LEVEL); ++ vcos_log_register("audio", VCOS_LOG_CATEGORY); ++ ++ /* Initialize an instance of the audio service */ ++ instance = vc_vchi_audio_init(vchi_instance, &vchi_connection, 1); ++ ++ if (instance == NULL /*|| audio_handle != instance */ ) { ++ LOG_ERR("%s: failed to initialize audio service", __func__); ++ ++ ret = -EPERM; ++ goto err_free_mem; ++ } ++ ++ instance->alsa_stream = alsa_stream; ++ alsa_stream->instance = instance; ++ ++ LOG_DBG(" success !\n"); ++err_free_mem: ++ LOG_DBG(" .. OUT\n"); ++ ++ return ret; ++} ++ ++int bcm2835_audio_open(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ AUDIO_INSTANCE_T *instance; ++ VC_AUDIO_MSG_T m; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ my_workqueue_init(alsa_stream); ++ ++ ret = bcm2835_audio_open_connection(alsa_stream); ++ if (ret != 0) { ++ ret = -1; ++ goto exit; ++ } ++ instance = alsa_stream->instance; ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ m.type = VC_AUDIO_MSG_TYPE_OPEN; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++exit: ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++static int bcm2835_audio_set_ctls_chan(bcm2835_alsa_stream_t * alsa_stream, ++ bcm2835_chip_t * chip) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ LOG_INFO ++ (" Setting ALSA dest(%d), volume(%d)\n", chip->dest, chip->volume); ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ instance->got_result = 0; ++ instance->result = -1; ++ ++ m.type = VC_AUDIO_MSG_TYPE_CONTROL; ++ m.u.control.dest = chip->dest; ++ m.u.control.volume = chip->volume; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ /* We are expecting a reply from the videocore */ ++ while (!instance->got_result) { ++ success = vcos_event_wait(&instance->msg_avail_event); ++ if (success != VCOS_SUCCESS) { ++ LOG_ERR("%s: failed on waiting for event (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ } ++ ++ if (instance->result != 0) { ++ LOG_ERR("%s: result=%d", __func__, instance->result); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++int bcm2835_audio_set_ctls(bcm2835_chip_t * chip) ++{ ++ int i; ++ int ret = 0; ++ LOG_DBG(" .. IN\n"); ++ ++ /* change ctls for all substreams */ ++ for (i = 0; i < MAX_SUBSTREAMS; i++) { ++ if (chip->avail_substreams & (1 << i)) { ++ if (!chip->alsa_stream[i]) ++ { ++ LOG_DBG(" No ALSA stream available?! "); ++ ret = 0; ++ } ++ else if (bcm2835_audio_set_ctls_chan /* returns 0 on success */ ++ (chip->alsa_stream[i], chip) != 0) ++ { ++ LOG_DBG("Couldn't set the controls for stream %d", i); ++ ret = -1; ++ } ++ LOG_DBG(" Controls set for stream %d", i); ++ } ++ } ++ LOG_DBG(" .. OUT ret=%d\n", ret); ++ return ret; ++} ++ ++int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream, ++ uint32_t channels, uint32_t samplerate, ++ uint32_t bps) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ LOG_INFO ++ (" Setting ALSA channels(%d), samplerate(%d), bits-per-sample(%d)\n", ++ channels, samplerate, bps); ++ ++ /* resend ctls - alsa_stream may not have been open when first send */ ++ ret = bcm2835_audio_set_ctls_chan(alsa_stream, alsa_stream->chip); ++ if (ret != 0) { ++ LOG_ERR(" Alsa controls not supported\n"); ++ return -EINVAL; ++ } ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ instance->got_result = 0; ++ instance->result = -1; ++ ++ m.type = VC_AUDIO_MSG_TYPE_CONFIG; ++ m.u.config.channels = channels; ++ m.u.config.samplerate = samplerate; ++ m.u.config.bps = bps; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ /* We are expecting a reply from the videocore */ ++ while (!instance->got_result) { ++ success = vcos_event_wait(&instance->msg_avail_event); ++ if (success != VCOS_SUCCESS) { ++ LOG_ERR("%s: failed on waiting for event (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ } ++ ++ if (instance->result != 0) { ++ LOG_ERR("%s: result=%d", __func__, instance->result); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++int bcm2835_audio_setup(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ LOG_DBG(" .. IN\n"); ++ ++ LOG_DBG(" .. OUT\n"); ++ ++ return 0; ++} ++ ++static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ m.type = VC_AUDIO_MSG_TYPE_START; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ m.type = VC_AUDIO_MSG_TYPE_STOP; ++ m.u.stop.draining = alsa_stream->draining; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ LOG_DBG(" .. IN\n"); ++ ++ my_workqueue_quit(alsa_stream); ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ m.type = VC_AUDIO_MSG_TYPE_CLOSE; ++ instance->got_result = 0; ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ret = -1; ++ goto unlock; ++ } ++ while (!instance->got_result) { ++ success = vcos_event_wait(&instance->msg_avail_event); ++ if (success != VCOS_SUCCESS) { ++ LOG_ERR("%s: failed on waiting for event (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ } ++ if (instance->result != 0) { ++ LOG_ERR("%s: failed result (status=%d)", ++ __func__, instance->result); ++ ++ ret = -1; ++ goto unlock; ++ } ++ ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ ++ /* Stop the audio service */ ++ if (instance) { ++ vc_vchi_audio_deinit(instance); ++ alsa_stream->instance = NULL; ++ } ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count, ++ void *src) ++{ ++ VC_AUDIO_MSG_T m; ++ AUDIO_INSTANCE_T *instance = alsa_stream->instance; ++ int32_t success; ++ int ret; ++ ++ LOG_DBG(" .. IN\n"); ++ ++ LOG_INFO(" Writing %d bytes from %p\n", count, src); ++ ++ vcos_mutex_lock(&instance->vchi_mutex); ++ vchi_service_use(instance->vchi_handle[0]); ++ ++ m.type = VC_AUDIO_MSG_TYPE_WRITE; ++ m.u.write.count = count; ++ m.u.write.callback = alsa_stream->fifo_irq_handler; ++ m.u.write.cookie = alsa_stream; ++ m.u.write.silence = src == NULL; ++ ++ /* Send the message to the videocore */ ++ success = vchi_msg_queue(instance->vchi_handle[0], ++ &m, sizeof m, ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); ++ ++ if (success != 0) { ++ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ LOG_DBG(" ... sent header\n"); ++ if (!m.u.write.silence) { ++ /* Send the message to the videocore */ ++ success = vchi_bulk_queue_transmit(instance->vchi_handle[0], ++ src, count, ++ 0 * ++ VCHI_FLAGS_BLOCK_UNTIL_QUEUED ++ + ++ 1 * ++ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ, ++ NULL); ++ if (success != 0) { ++ LOG_ERR ++ ("%s: failed on vchi_bulk_queue_transmit (status=%d)", ++ __func__, success); ++ ++ ret = -1; ++ goto unlock; ++ } ++ } ++ ret = 0; ++ ++unlock: ++ vchi_service_release(instance->vchi_handle[0]); ++ vcos_mutex_unlock(&instance->vchi_mutex); ++ LOG_DBG(" .. OUT\n"); ++ return ret; ++} ++ ++/** ++ * Returns all buffers from arm->vc ++ */ ++void bcm2835_audio_flush_buffers(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ LOG_DBG(" .. IN\n"); ++ LOG_DBG(" .. OUT\n"); ++ return; ++} ++ ++/** ++ * Forces VC to flush(drop) its filled playback buffers and ++ * return them the us. (VC->ARM) ++ */ ++void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ LOG_DBG(" .. IN\n"); ++ LOG_DBG(" .. OUT\n"); ++} ++ ++uint32_t bcm2835_audio_retrieve_buffers(bcm2835_alsa_stream_t * alsa_stream) ++{ ++ uint32_t count = atomic_read(&alsa_stream->retrieved); ++ atomic_sub(count, &alsa_stream->retrieved); ++ return count; ++} +diff --git a/sound/arm/bcm2835.c b/sound/arm/bcm2835.c +new file mode 100755 +index 0000000..3f6b0ea +--- /dev/null ++++ b/sound/arm/bcm2835.c @@ -0,0 +1,424 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -75135,186 +91084,12 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.c linux-rpi-bootc-3.2.23/sound/arm/bcm +MODULE_DESCRIPTION("Alsa driver for BCM2835 chip"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm2835_alsa"); -diff -Naur linux-3.2.23/sound/arm/bcm2835-ctl.c linux-rpi-bootc-3.2.23/sound/arm/bcm2835-ctl.c ---- linux-3.2.23/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/bcm2835-ctl.c 2012-07-15 20:28:25.380073109 +0200 -@@ -0,0 +1,172 @@ -+/***************************************************************************** -+* Copyright 2011 Broadcom Corporation. All rights reserved. -+* -+* Unless you and Broadcom execute a separate written software license -+* agreement governing use of this software, this software is licensed to you -+* under the terms of the GNU General Public License version 2, available at -+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). -+* -+* Notwithstanding the above, under no circumstances may you combine this -+* software in any way with any other Broadcom software provided under a -+* license other than the GPL, without Broadcom's express prior written -+* consent. -+*****************************************************************************/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "bcm2835.h" -+ -+static int snd_bcm2835_ctl_info(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_info *uinfo) -+{ -+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) { -+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; -+ uinfo->count = 1; -+ uinfo->value.integer.min = -10240; -+ uinfo->value.integer.max = 2303; -+ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) { -+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; -+ uinfo->count = 1; -+ uinfo->value.integer.min = 0; -+ uinfo->value.integer.max = 1; -+ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) { -+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; -+ uinfo->count = 1; -+ uinfo->value.integer.min = 0; -+ uinfo->value.integer.max = AUDIO_DEST_MAX-0; -+ } -+ -+ return 0; -+} -+ -+static int snd_bcm2835_ctl_get(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol); -+ -+ BUG_ON(!chip && !(chip->avail_substreams & AVAIL_SUBSTREAMS_MASK)); -+ -+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) -+ ucontrol->value.integer.value[0] = chip->volume; -+ else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) -+ ucontrol->value.integer.value[0] = chip->mute; -+ else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) -+ ucontrol->value.integer.value[0] = chip->dest; -+ -+ return 0; -+} -+ -+static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_value *ucontrol) -+{ -+ struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol); -+ int changed = 0; -+ -+ if (kcontrol->private_value == PCM_PLAYBACK_VOLUME) { -+ if (chip->mute) { -+ chip->mute = 0; -+ changed = 1; -+ } -+ if (changed -+ || (ucontrol->value.integer.value[0] != chip->volume)) { -+ int atten; -+ -+ chip->volume = ucontrol->value.integer.value[0]; -+ changed = 1; -+ atten = -((chip->volume << 8) / 100); -+ chip->volume = atten; -+ } -+ -+ } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) { -+ /* Not implemented */ -+ if (ucontrol->value.integer.value[0] != chip->mute) { -+ chip->mute = ucontrol->value.integer.value[0]; -+ changed = 0; -+ } -+ } else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE) { -+ if (ucontrol->value.integer.value[0] != chip->dest) { -+ chip->dest = ucontrol->value.integer.value[0]; -+ changed = 1; -+ } -+ } -+ -+ if (changed) { -+ if (bcm2835_audio_set_ctls(chip)) -+ printk(KERN_ERR "Failed to set ALSA controls..\n"); -+ } -+ -+ return changed; -+} -+ -+static DECLARE_TLV_DB_SCALE(snd_bcm2835_db_scale, -10240, 1, 1); -+ -+static struct snd_kcontrol_new snd_bcm2835_ctl[] __devinitdata = { -+ { -+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, -+ .name = "PCM Playback Volume", -+ .index = 0, -+ .access = -+ SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE, -+ .private_value = PCM_PLAYBACK_VOLUME, -+ .info = snd_bcm2835_ctl_info, -+ .get = snd_bcm2835_ctl_get, -+ .put = snd_bcm2835_ctl_put, -+ .count = 1, -+ .tlv = {.p = snd_bcm2835_db_scale} -+ }, -+ { -+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, -+ .name = "PCM Playback Switch", -+ .index = 0, -+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, -+ .private_value = PCM_PLAYBACK_MUTE, -+ .info = snd_bcm2835_ctl_info, -+ .get = snd_bcm2835_ctl_get, -+ .put = snd_bcm2835_ctl_put, -+ .count = 1, -+ }, -+ { -+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, -+ .name = "PCM Playback Route", -+ .index = 0, -+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, -+ .private_value = PCM_PLAYBACK_DEVICE, -+ .info = snd_bcm2835_ctl_info, -+ .get = snd_bcm2835_ctl_get, -+ .put = snd_bcm2835_ctl_put, -+ .count = 1, -+ }, -+}; -+ -+int __devinit snd_bcm2835_new_ctl(bcm2835_chip_t * chip) -+{ -+ int err; -+ unsigned int idx; -+ -+ strcpy(chip->card->mixername, "Broadcom Mixer"); -+ for (idx = 0; idx < ARRAY_SIZE(snd_bcm2835_ctl); idx++) { -+ err = -+ snd_ctl_add(chip->card, -+ snd_ctl_new1(&snd_bcm2835_ctl[idx], chip)); -+ if (err < 0) -+ return err; -+ } -+ return 0; -+} -diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm2835.h ---- linux-3.2.23/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/bcm2835.h 2012-07-15 20:28:25.381073128 +0200 -@@ -0,0 +1,242 @@ +diff --git a/sound/arm/bcm2835.h b/sound/arm/bcm2835.h +new file mode 100755 +index 0000000..b966e28 +--- /dev/null ++++ b/sound/arm/bcm2835.h +@@ -0,0 +1,155 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. +* @@ -75332,8 +91107,6 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm +#ifndef __SOUND_ARM_BCM2835_H +#define __SOUND_ARM_BCM2835_H + -+#define SUBSTREAM_NUM 1 -+ +#include +#include +#include @@ -75344,13 +91117,14 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm +#include +#include + -+/* #define DUMP_RAW_DATA */ -+//#define AUDIO_DEBUG_ENABLE -+//#define AUDIO_VERBOSE_DEBUG_ENABLE ++/* ++#define AUDIO_DEBUG_ENABLE ++#define AUDIO_VERBOSE_DEBUG_ENABLE ++*/ + +/* Debug macros */ -+#ifdef AUDIO_DEBUG_ENABLE + ++#ifdef AUDIO_DEBUG_ENABLE +#ifdef AUDIO_VERBOSE_DEBUG_ENABLE + +#define audio_debug(fmt, arg...) \ @@ -75361,17 +91135,17 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm + +#else + -+#define audio_debug(fmt, arg...) do {} while (0) ++#define audio_debug(fmt, arg...) + -+#define audio_info(fmt, arg...) do {} while (0) ++#define audio_info(fmt, arg...) + +#endif /* AUDIO_VERBOSE_DEBUG_ENABLE */ + +#else + -+#define audio_debug(fmt, arg...) do {} while (0) ++#define audio_debug(fmt, arg...) + -+#define audio_info(fmt, arg...) do {} while (0) ++#define audio_info(fmt, arg...) + +#endif /* AUDIO_DEBUG_ENABLE */ + @@ -75386,75 +91160,15 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm + +#define MAX_SUBSTREAMS (8) +#define AVAIL_SUBSTREAMS_MASK (0xff) ++enum { ++ CTRL_VOL_MUTE, ++ CTRL_VOL_UNMUTE ++}; + -+#define AUDIO_IPC_BLOCK_NUM_BUFFERS (8) -+#define AUDIO_IPC_BLOCK_BUFFER_SIZE (1024*8) ++/* macros for alsa2chip and chip2alsa, instead of functions */ + -+#define AUDIO_CONTROL_OFFSET (0x00) -+#define CTRL_EN_SHIFT (0) -+#define CTRL_EN_MASK (0x00000001) -+#define CTRL_PLAY_SHIFT (1) -+#define CTRL_PLAY_MASK (0x00000002) -+#define CTRL_MUTE_SHIFT (2) -+#define CTRL_MUTE_MASK (0x00000004) -+#define CTRL_SETUP_SHIFT (3) -+#define CTRL_SETUP_MASK (0x00000008) -+#define CTRL_FLUSH_SHIFT (4) -+#define CTRL_FLUSH_MASK (0x00000010) -+#define CTRL_STOPMODE_SHIFT (5) -+#define CTRL_STOPMODE_MASK (0x00000020) -+ -+#define AUDIO_STATUS_OFFSET (0x04) -+#define STAT_EN_SHIFT (0) -+#define STAT_EN_MASK (0x00000001) -+#define STAT_PLAY_SHIFT (1) -+#define STAT_PLAY_MASK (0x00000002) -+#define STAT_MUTE_SHIFT (2) -+#define STAT_MUTE_MASK (0x00000004) -+#define STAT_SETUP_SHIFT (3) -+#define STAT_SETUP_MASK (0x00000008) -+#define STAT_FLUSH_SHIFT (4) -+#define STAT_FLUSH_MASK (0x00000010) -+#define STAT_STOPMODE_SHIFT (5) -+#define STAT_STOPMODE_MASK (0x00000020) -+ -+/* Interrupt status */ -+#define AUDIO_INTSTAT_OFFSET (0x08) -+#define INTSTAT_CONTROL_SHIFT (0) -+#define INTSTAT_CONTROL_MASK (0x0000000f) -+#define INTSTAT_FIFO_SHIFT (4) -+#define INTSTAT_FIFO_MASK (0x000000f0) -+ -+/* Configuration */ -+#define AUDIO_DESTINATION_OFFSET (0x0C) -+#define AUDIO_SAMPLE_RATE_OFFSET (0x10) -+#define AUDIO_BIT_RATE_OFFSET (0x14) -+#define AUDIO_VOLUME_OFFSET (0x18) -+#define AUDIO_CHANNELS_OFFSET (0x1C) -+ -+/* Implemention of peterson's algorithm for shared memory semaphores */ -+#define AUDIO_FLAG0_OFFSET (0x20) -+#define AUDIO_FLAG1_OFFSET (0x24) -+#define AUDIO_TURN_OFFSET (0x28) -+ -+/* Fifo registers */ -+#define AUDIO_IN_WRITE_PTR_OFFSET (0x30) -+#define AUDIO_IN_READ_PTR_OFFSET (0x34) -+#define AUDIO_IN_FIFO_SIZE_OFFSET (0x38) -+#define AUDIO_IN_FIFO_ENTRY_OFFSET (0x3C) -+#define AUDIO_IN_FIFO_START_OFFSET (0x40) -+ -+/* 8 entries here of 4 words each = 0x80 gap from 0x50 */ -+#define AUDIO_IN_FIFO_OFFSET (0x50) -+ -+#define AUDIO_OUT_WRITE_PTR_OFFSET (0xD0) -+#define AUDIO_OUT_READ_PTR_OFFSET (0xD4) -+#define AUDIO_OUT_FIFO_SIZE_OFFSET (0xD8) -+#define AUDIO_OUT_FIFO_ENTRY_OFFSET (0xDC) -+#define AUDIO_OUT_FIFO_START_OFFSET (0xE0) -+ -+/* 8 entries here of 4 words each = 0x80 gap from 0xF0 */ -+#define AUDIO_OUT_FIFO_OFFSET (0xF0) ++#define alsa2chip(vol) (uint)(-((vol << 8) / 100)) /* convert alsa to chip volume (defined as macro rather than function call) */ ++#define chip2alsa(vol) -((vol * 100) >> 8) /* convert chip to alsa volume */ + +/* Some constants for values .. */ +typedef enum { @@ -75470,15 +91184,6 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm + PCM_PLAYBACK_DEVICE, +} SND_BCM2835_CTRL_T; + -+/* this struct is tightly packed - its size is 16bytes */ -+typedef struct { -+ uint32_t buffer_id; -+ uint32_t buffer_size; -+ uint32_t buffer_ptr; -+ uint32_t spare; -+ -+} AUDIO_FIFO_ENTRY_T; -+ +/* definition of the chip-specific record */ +typedef struct bcm2835_chip { + struct snd_card *card; @@ -75489,20 +91194,11 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm + struct bcm2835_alsa_stream *alsa_stream[MAX_SUBSTREAMS]; + + int volume; ++ int old_volume; /* stores the volume value whist muted */ + int dest; + int mute; +} bcm2835_chip_t; + -+typedef struct bcm2835_audio_buffer { -+ uint32_t buffer_id; -+ phys_addr_t bus_addr; -+ uint8_t __iomem *start; -+ uint32_t size; -+ uint32_t data_left; -+ struct list_head link; -+ -+} bcm2835_audio_buffer_t; -+ +typedef struct bcm2835_alsa_stream { + bcm2835_chip_t *chip; + struct snd_pcm_substream *substream; @@ -75517,10 +91213,6 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm + int running; + int draining; + -+#ifdef DUMP_RAW_DATA -+ /* for debug */ -+ int file; -+#endif + unsigned int pos; + unsigned int buffer_size; + unsigned int period_size; @@ -75537,9 +91229,6 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm +int snd_bcm2835_new_ctl(bcm2835_chip_t * chip); +int snd_bcm2835_new_pcm(bcm2835_chip_t * chip); + -+void bcm2835_audio_fifo_get_lock(bcm2835_alsa_stream_t * alsa_stream); -+void bcm2835_audio_fifo_put_lock(bcm2835_alsa_stream_t * alsa_stream); -+ +int bcm2835_audio_open(bcm2835_alsa_stream_t * alsa_stream); +int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream); +int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream, @@ -75551,1270 +91240,16 @@ diff -Naur linux-3.2.23/sound/arm/bcm2835.h linux-rpi-bootc-3.2.23/sound/arm/bcm +int bcm2835_audio_set_ctls(bcm2835_chip_t * chip); +int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count, + void *src); -+//uint32_t bcm2835_audio_buffers_consumed_bytes(bcm2835_alsa_stream_t *alsa_stream); +uint32_t bcm2835_audio_retrieve_buffers(bcm2835_alsa_stream_t * alsa_stream); +void bcm2835_audio_flush_buffers(bcm2835_alsa_stream_t * alsa_stream); +void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream); + +#endif /* __SOUND_ARM_BCM2835_H */ -diff -Naur linux-3.2.23/sound/arm/bcm2835-pcm.c linux-rpi-bootc-3.2.23/sound/arm/bcm2835-pcm.c ---- linux-3.2.23/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/bcm2835-pcm.c 2012-07-15 20:28:25.380073109 +0200 -@@ -0,0 +1,400 @@ -+/***************************************************************************** -+* Copyright 2011 Broadcom Corporation. All rights reserved. -+* -+* Unless you and Broadcom execute a separate written software license -+* agreement governing use of this software, this software is licensed to you -+* under the terms of the GNU General Public License version 2, available at -+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). -+* -+* Notwithstanding the above, under no circumstances may you combine this -+* software in any way with any other Broadcom software provided under a -+* license other than the GPL, without Broadcom's express prior written -+* consent. -+*****************************************************************************/ -+ -+#include -+#include -+ -+#include "bcm2835.h" -+ -+/* hardware definition */ -+static struct snd_pcm_hardware snd_bcm2835_playback_hw = { -+ .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER), -+ .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE, -+ .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, -+ .rate_min = 8000, -+ .rate_max = 48000, -+ .channels_min = 1, -+ .channels_max = 2, -+ .buffer_bytes_max = (4 * 8 - 1) * 1024, /* Needs to be less than audioplay buffer size */ -+ .period_bytes_min = 1 * 1024, -+ .period_bytes_max = (4 * 8 - 1) * 1024, -+ .periods_min = 1, -+ .periods_max = 4 * 8 - 1, -+}; -+ -+static void snd_bcm2835_playback_free(struct snd_pcm_runtime *runtime) -+{ -+ audio_info("Freeing up alsa stream here ..\n"); -+ if (runtime->private_data) -+ kfree(runtime->private_data); -+ runtime->private_data = NULL; -+} -+ -+static irqreturn_t bcm2835_playback_fifo_irq(int irq, void *dev_id) -+{ -+ bcm2835_alsa_stream_t *alsa_stream = (bcm2835_alsa_stream_t *) dev_id; -+ uint32_t consumed = 0; -+ int new_period = 0; -+ -+ audio_info(" .. IN\n"); -+ -+ audio_info("alsa_stream=%p substream=%p\n", alsa_stream, -+ alsa_stream ? alsa_stream->substream : 0); -+ -+ if (alsa_stream->open) -+ consumed = bcm2835_audio_retrieve_buffers(alsa_stream); -+ -+ /* We get called only if playback was triggered, So, the number of buffers we retrieve in -+ * each iteration are the buffers that have been played out already -+ */ -+ -+ if (alsa_stream->period_size) { -+ if ((alsa_stream->pos / alsa_stream->period_size) != -+ ((alsa_stream->pos + consumed) / alsa_stream->period_size)) -+ new_period = 1; -+ } -+ audio_debug("updating pos cur: %d + %d max:%d new_period:%d\n", -+ alsa_stream->pos, -+ (consumed /** AUDIO_IPC_BLOCK_BUFFER_SIZE*/ ), -+ alsa_stream->buffer_size, new_period); -+ if (alsa_stream->buffer_size) { -+ alsa_stream->pos += consumed; -+ alsa_stream->pos %= alsa_stream->buffer_size; -+ } -+ if (alsa_stream->substream) { -+ if (new_period) -+ snd_pcm_period_elapsed(alsa_stream->substream); -+ } else { -+ audio_warning(" unexpected NULL substream\n"); -+ } -+ audio_info(" .. OUT\n"); -+ -+ return IRQ_HANDLED; -+} -+ -+/* open callback */ -+static int snd_bcm2835_playback_open(struct snd_pcm_substream *substream) -+{ -+ bcm2835_chip_t *chip = snd_pcm_substream_chip(substream); -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream; -+ int idx; -+ int err; -+ -+ audio_info(" .. IN (%d)\n", substream->number); -+ -+ audio_warning("Alsa open (%d)\n", substream->number); -+ idx = substream->number; -+ -+ if (idx > MAX_SUBSTREAMS) { -+ audio_error -+ ("substream(%d) device doesn't exist max(%d) substreams allowed\n", -+ idx, MAX_SUBSTREAMS); -+ err = -ENODEV; -+ goto out; -+ } -+ -+ /* Check if we are ready */ -+ if (!(chip->avail_substreams & (1 << idx))) { -+ /* We are not ready yet */ -+ audio_error("substream(%d) device is not ready yet\n", idx); -+ err = -EAGAIN; -+ goto out; -+ } -+ -+ alsa_stream = kzalloc(sizeof(bcm2835_alsa_stream_t), GFP_KERNEL); -+ if (alsa_stream == NULL) { -+ return -ENOMEM; -+ } -+ -+ /* Initialise alsa_stream */ -+ alsa_stream->chip = chip; -+ alsa_stream->substream = substream; -+ alsa_stream->idx = idx; -+ chip->alsa_stream[idx] = alsa_stream; -+ -+ sema_init(&alsa_stream->buffers_update_sem, 0); -+ sema_init(&alsa_stream->control_sem, 0); -+ spin_lock_init(&alsa_stream->lock); -+ -+ /* Enabled in start trigger, called on each "fifo irq" after that */ -+ alsa_stream->enable_fifo_irq = 0; -+ alsa_stream->fifo_irq_handler = bcm2835_playback_fifo_irq; -+ -+ runtime->private_data = alsa_stream; -+ runtime->private_free = snd_bcm2835_playback_free; -+ runtime->hw = snd_bcm2835_playback_hw; -+ -+ /* minimum 16 bytes alignment (for vchiq bulk transfers) */ -+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, -+ 16); -+ -+ err = bcm2835_audio_open(alsa_stream); -+ if (err != 0) { -+ kfree(alsa_stream); -+ return err; -+ } -+ -+ alsa_stream->open = 1; -+ alsa_stream->draining = 1; -+ -+out: -+ audio_info(" .. OUT =%d\n", err); -+ -+ return err; -+} -+ -+/* close callback */ -+static int snd_bcm2835_playback_close(struct snd_pcm_substream *substream) -+{ -+ /* the hardware-specific codes will be here */ -+ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; -+ -+ audio_info(" .. IN\n"); -+ audio_warning("Alsa close\n"); -+ -+ /* -+ * Call stop if it's still running. This happens when app -+ * is force killed and we don't get a stop trigger. -+ */ -+ if (alsa_stream->running) { -+ int err; -+ err = bcm2835_audio_stop(alsa_stream); -+ alsa_stream->running = 0; -+ if (err != 0) -+ audio_error(" Failed to STOP alsa device\n"); -+ } -+ -+ alsa_stream->period_size = 0; -+ alsa_stream->buffer_size = 0; -+ -+ if (alsa_stream->open) { -+ alsa_stream->open = 0; -+ bcm2835_audio_close(alsa_stream); -+ } -+ if (alsa_stream->chip) -+ alsa_stream->chip->alsa_stream[alsa_stream->idx] = NULL; -+ /* -+ * Do not free up alsa_stream here, it will be freed up by -+ * runtime->private_free callback we registered in *_open above -+ */ -+ -+ audio_info(" .. OUT\n"); -+ -+ return 0; -+} -+ -+/* hw_params callback */ -+static int snd_bcm2835_pcm_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ int err; -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = -+ (bcm2835_alsa_stream_t *) runtime->private_data; -+ -+ audio_info(" .. IN\n"); -+ -+ err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); -+ if (err < 0) { -+ audio_error -+ (" pcm_lib_malloc failed to allocated pages for buffers\n"); -+ return err; -+ } -+ -+ err = bcm2835_audio_set_params(alsa_stream, params_channels(params), -+ params_rate(params), -+ snd_pcm_format_width(params_format -+ (params))); -+ if (err < 0) { -+ audio_error(" error setting hw params\n"); -+ } -+ -+ bcm2835_audio_setup(alsa_stream); -+ audio_info(" .. OUT\n"); -+ -+ return err; -+} -+ -+/* hw_free callback */ -+static int snd_bcm2835_pcm_hw_free(struct snd_pcm_substream *substream) -+{ -+ audio_info(" .. IN\n"); -+ return snd_pcm_lib_free_pages(substream); -+} -+ -+/* prepare callback */ -+static int snd_bcm2835_pcm_prepare(struct snd_pcm_substream *substream) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; -+ -+ audio_info(" .. IN\n"); -+ -+ alsa_stream->buffer_size = snd_pcm_lib_buffer_bytes(substream); -+ alsa_stream->period_size = snd_pcm_lib_period_bytes(substream); -+ alsa_stream->pos = 0; -+ -+ audio_debug("buffer_size=%d, period_size=%d pos=%d frame_bits=%d\n", -+ alsa_stream->buffer_size, alsa_stream->period_size, -+ alsa_stream->pos, runtime->frame_bits); -+ -+ audio_info(" .. OUT\n"); -+ return 0; -+} -+ -+/* trigger callback */ -+static int snd_bcm2835_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; -+ int err = 0; -+ -+ audio_info(" .. IN\n"); -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ audio_debug("bcm2835_AUDIO_TRIGGER_START running=%d\n", -+ alsa_stream->running); -+ if (!alsa_stream->running) { -+ err = bcm2835_audio_start(alsa_stream); -+ if (err == 0) { -+ alsa_stream->running = 1; -+ alsa_stream->draining = 1; -+ } -+ } -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ audio_debug -+ ("bcm2835_AUDIO_TRIGGER_STOP running=%d draining=%d\n", -+ runtime->status->state == SNDRV_PCM_STATE_DRAINING, -+ alsa_stream->running); -+ if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { -+ audio_info("DRAINING\n"); -+ alsa_stream->draining = 1; -+ } else { -+ audio_info("DROPPING\n"); -+ alsa_stream->draining = 0; -+ } -+ if (alsa_stream->running) { -+ err = bcm2835_audio_stop(alsa_stream); -+ if (err != 0) -+ audio_error(" Failed to STOP alsa device\n"); -+ alsa_stream->running = 0; -+ } -+ break; -+ default: -+ err = -EINVAL; -+ } -+ -+ audio_info(" .. OUT\n"); -+ return err; -+} -+ -+/* pointer callback */ -+static snd_pcm_uframes_t -+snd_bcm2835_pcm_pointer(struct snd_pcm_substream *substream) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; -+ -+ audio_info(" .. IN\n"); -+ -+ audio_debug("pcm_pointer... (%d) hwptr=%d appl=%d pos=%d\n", 0, -+ frames_to_bytes(runtime, runtime->status->hw_ptr), -+ frames_to_bytes(runtime, runtime->control->appl_ptr), -+ alsa_stream->pos); -+ -+ audio_info(" .. OUT\n"); -+ return bytes_to_frames(runtime, alsa_stream->pos); -+} -+ -+static int snd_bcm2835_pcm_copy(struct snd_pcm_substream *substream, -+ int channel, snd_pcm_uframes_t pos, void *src, -+ snd_pcm_uframes_t count) -+{ -+ int ret; -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; -+ -+ audio_info(" .. IN\n"); -+ audio_debug("copy.......... (%d) hwptr=%d appl=%d pos=%d\n", -+ frames_to_bytes(runtime, count), frames_to_bytes(runtime, -+ runtime-> -+ status-> -+ hw_ptr), -+ frames_to_bytes(runtime, runtime->control->appl_ptr), -+ alsa_stream->pos); -+ ret = -+ bcm2835_audio_write(alsa_stream, frames_to_bytes(runtime, count), -+ src); -+ audio_info(" .. OUT\n"); -+ return ret; -+} -+ -+static int snd_bcm2835_pcm_lib_ioctl(struct snd_pcm_substream *substream, -+ unsigned int cmd, void *arg) -+{ -+ int ret = snd_pcm_lib_ioctl(substream, cmd, arg); -+ audio_info(" .. substream=%p, cmd=%d, arg=%p (%x) ret=%d\n", substream, -+ cmd, arg, arg ? *(unsigned *)arg : 0, ret); -+ return ret; -+} -+ -+/* operators */ -+static struct snd_pcm_ops snd_bcm2835_playback_ops = { -+ .open = snd_bcm2835_playback_open, -+ .close = snd_bcm2835_playback_close, -+ .ioctl = snd_bcm2835_pcm_lib_ioctl, -+ .hw_params = snd_bcm2835_pcm_hw_params, -+ .hw_free = snd_bcm2835_pcm_hw_free, -+ .prepare = snd_bcm2835_pcm_prepare, -+ .trigger = snd_bcm2835_pcm_trigger, -+ .pointer = snd_bcm2835_pcm_pointer, -+ .copy = snd_bcm2835_pcm_copy, -+}; -+ -+/* create a pcm device */ -+int __devinit snd_bcm2835_new_pcm(bcm2835_chip_t * chip) -+{ -+ struct snd_pcm *pcm; -+ int err; -+ -+ audio_info(" .. IN\n"); -+ err = -+ snd_pcm_new(chip->card, "bcm2835 ALSA", 0, MAX_SUBSTREAMS, 0, &pcm); -+ if (err < 0) -+ return err; -+ pcm->private_data = chip; -+ strcpy(pcm->name, "bcm2835 ALSA"); -+ chip->pcm = pcm; -+ chip->dest = AUDIO_DEST_AUTO; -+ chip->volume = 100; -+ /* set operators */ -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, -+ &snd_bcm2835_playback_ops); -+ -+ /* pre-allocation of buffers */ -+ /* NOTE: this may fail */ -+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, -+ snd_dma_continuous_data -+ (GFP_KERNEL), 64 * 1024, -+ 64 * 1024); -+ -+ audio_info(" .. OUT\n"); -+ -+ return 0; -+} -diff -Naur linux-3.2.23/sound/arm/bcm2835-vchiq.c linux-rpi-bootc-3.2.23/sound/arm/bcm2835-vchiq.c ---- linux-3.2.23/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/bcm2835-vchiq.c 2012-07-15 20:28:25.381073128 +0200 -@@ -0,0 +1,818 @@ -+/***************************************************************************** -+* Copyright 2011 Broadcom Corporation. All rights reserved. -+* -+* Unless you and Broadcom execute a separate written software license -+* agreement governing use of this software, this software is licensed to you -+* under the terms of the GNU General Public License version 2, available at -+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL"). -+* -+* Notwithstanding the above, under no circumstances may you combine this -+* software in any way with any other Broadcom software provided under a -+* license other than the GPL, without Broadcom's express prior written -+* consent. -+*****************************************************************************/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "bcm2835.h" -+ -+/* ---- Include Files -------------------------------------------------------- */ -+ -+#include "interface/vchi/vchi.h" -+#include "interface/vcos/vcos.h" -+#include "interface/vcos/vcos_logging.h" -+#include "vc_vchi_audioserv_defs.h" -+ -+/* ---- Private Constants and Types ------------------------------------------ */ -+ -+/* VCOS logging category for this service */ -+#define VCOS_LOG_CATEGORY (&audio_log_category) -+ -+/* Default VCOS logging level */ -+#define LOG_LEVEL VCOS_LOG_WARN -+ -+/* Logging macros (for remapping to other logging mechanisms, i.e., printf) */ -+#define LOG_ERR( fmt, arg... ) vcos_log_error( "%s:%d " fmt, __func__, __LINE__, ##arg) -+#define LOG_WARN( fmt, arg... ) vcos_log_warn( "%s:%d " fmt, __func__, __LINE__, ##arg) -+#define LOG_INFO( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg) -+#define LOG_DBG( fmt, arg... ) vcos_log_info( "%s:%d " fmt, __func__, __LINE__, ##arg) -+ -+typedef struct opaque_AUDIO_INSTANCE_T { -+ uint32_t num_connections; -+ VCHI_SERVICE_HANDLE_T vchi_handle[VCHI_MAX_NUM_CONNECTIONS]; -+ VCOS_EVENT_T msg_avail_event; -+ VCOS_MUTEX_T vchi_mutex; -+ bcm2835_alsa_stream_t *alsa_stream; -+ int32_t result, got_result; -+} AUDIO_INSTANCE_T; -+ -+/* ---- Private Variables ---------------------------------------------------- */ -+ -+/* VCOS logging category for this service */ -+static VCOS_LOG_CAT_T audio_log_category; -+ -+/* ---- Private Function Prototypes ------------------------------------------ */ -+ -+/* ---- Private Functions ---------------------------------------------------- */ -+ -+static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream); -+static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream); -+ -+typedef struct { -+ struct work_struct my_work; -+ bcm2835_alsa_stream_t *alsa_stream; -+ int x; -+} my_work_t; -+ -+static void my_wq_function(struct work_struct *work) -+{ -+ my_work_t *w = (my_work_t *) work; -+ int ret = -9; -+ LOG_DBG(" .. IN %p:%d\n", w->alsa_stream, w->x); -+ switch (w->x) { -+ case 1: -+ ret = bcm2835_audio_start_worker(w->alsa_stream); -+ break; -+ case 2: -+ ret = bcm2835_audio_stop_worker(w->alsa_stream); -+ break; -+ default: -+ LOG_ERR(" Unexpected work: %p:%d\n", w->alsa_stream, w->x); -+ break; -+ } -+ kfree((void *)work); -+ LOG_DBG(" .. OUT %d\n", ret); -+} -+ -+int bcm2835_audio_start(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ int ret = -1; -+ LOG_DBG(" .. IN\n"); -+ if (alsa_stream->my_wq) { -+ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_ATOMIC); -+ /* Queue some work (item 1) */ -+ if (work) { -+ INIT_WORK((struct work_struct *)work, my_wq_function); -+ work->alsa_stream = alsa_stream; -+ work->x = 1; -+ if (queue_work -+ (alsa_stream->my_wq, (struct work_struct *)work)) -+ ret = 0; -+ } else -+ LOG_ERR(" .. Error: NULL work kmalloc\n"); -+ } -+ LOG_DBG(" .. OUT %d\n", ret); -+ return ret; -+} -+ -+int bcm2835_audio_stop(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ int ret = -1; -+ LOG_DBG(" .. IN\n"); -+ if (alsa_stream->my_wq) { -+ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_ATOMIC); -+ /* Queue some work (item 1) */ -+ if (work) { -+ INIT_WORK((struct work_struct *)work, my_wq_function); -+ work->alsa_stream = alsa_stream; -+ work->x = 2; -+ if (queue_work -+ (alsa_stream->my_wq, (struct work_struct *)work)) -+ ret = 0; -+ } else -+ LOG_ERR(" .. Error: NULL work kmalloc\n"); -+ } -+ LOG_DBG(" .. OUT %d\n", ret); -+ return ret; -+} -+ -+void my_workqueue_init(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ alsa_stream->my_wq = create_workqueue("my_queue"); -+} -+ -+void my_workqueue_quit(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ if (alsa_stream->my_wq) { -+ flush_workqueue(alsa_stream->my_wq); -+ destroy_workqueue(alsa_stream->my_wq); -+ alsa_stream->my_wq = NULL; -+ } -+} -+ -+static void audio_vchi_callback(void *param, -+ const VCHI_CALLBACK_REASON_T reason, -+ void *msg_handle) -+{ -+ AUDIO_INSTANCE_T *instance = (AUDIO_INSTANCE_T *) param; -+ int32_t status; -+ int32_t msg_len; -+ VC_AUDIO_MSG_T m; -+ bcm2835_alsa_stream_t *alsa_stream = 0; -+ LOG_DBG(" .. IN instance=%p, param=%p, reason=%d, handle=%p\n", -+ instance, param, reason, msg_handle); -+ -+ if (!instance || reason != VCHI_CALLBACK_MSG_AVAILABLE) { -+ return; -+ } -+ alsa_stream = instance->alsa_stream; -+ status = vchi_msg_dequeue(instance->vchi_handle[0], -+ &m, sizeof m, &msg_len, VCHI_FLAGS_NONE); -+ if (m.type == VC_AUDIO_MSG_TYPE_RESULT) { -+ LOG_DBG -+ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_RESULT, success=%d\n", -+ instance, m.u.result.success); -+ BUG_ON(instance->got_result); -+ instance->result = m.u.result.success; -+ instance->got_result = 1; -+ vcos_event_signal(&instance->msg_avail_event); -+ } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) { -+ irq_handler_t callback = (irq_handler_t) m.u.complete.callback; -+ LOG_DBG -+ (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_COMPLETE, complete=%d\n", -+ instance, m.u.complete.count); -+ if (alsa_stream && callback) { -+ atomic_add(m.u.complete.count, &alsa_stream->retrieved); -+ callback(0, alsa_stream); -+ } else { -+ LOG_DBG(" .. unexpected alsa_stream=%p, callback=%p\n", -+ alsa_stream, callback); -+ } -+ vcos_event_signal(&instance->msg_avail_event); -+ } else { -+ LOG_DBG(" .. unexpected m.type=%d\n", m.type); -+ } -+} -+ -+static AUDIO_INSTANCE_T *vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance, -+ VCHI_CONNECTION_T ** -+ vchi_connections, -+ uint32_t num_connections) -+{ -+ uint32_t i; -+ AUDIO_INSTANCE_T *instance; -+ VCOS_STATUS_T status; -+ -+ LOG_DBG("%s: start", __func__); -+ -+ if (num_connections > VCHI_MAX_NUM_CONNECTIONS) { -+ LOG_ERR("%s: unsupported number of connections %u (max=%u)", -+ __func__, num_connections, VCHI_MAX_NUM_CONNECTIONS); -+ -+ return NULL; -+ } -+ /* Allocate memory for this instance */ -+ instance = vcos_malloc(sizeof(*instance), "audio_instance"); -+ memset(instance, 0, sizeof(*instance)); -+ -+ instance->num_connections = num_connections; -+ /* Create the message available event */ -+ status = -+ vcos_event_create(&instance->msg_avail_event, "audio_msg_avail"); -+ if (status != VCOS_SUCCESS) { -+ LOG_ERR("%s: failed to create event (status=%d)", __func__, -+ status); -+ -+ goto err_free_mem; -+ } -+ /* Create a lock for exclusive, serialized VCHI connection access */ -+ status = vcos_mutex_create(&instance->vchi_mutex, "audio_vchi_mutex"); -+ if (status != VCOS_SUCCESS) { -+ LOG_ERR("%s: failed to create event (status=%d)", __func__, -+ status); -+ -+ goto err_delete_event; -+ } -+ /* Open the VCHI service connections */ -+ for (i = 0; i < num_connections; i++) { -+ SERVICE_CREATION_T params = { -+ VC_AUDIO_SERVER_NAME, // 4cc service code -+ vchi_connections[i], // passed in fn pointers -+ 0, // rx fifo size (unused) -+ 0, // tx fifo size (unused) -+ audio_vchi_callback, // service callback -+ instance, // service callback parameter -+ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk recieves -+ VCOS_TRUE, //TODO: remove VCOS_FALSE, // unaligned bulk transmits -+ VCOS_FALSE // want crc check on bulk transfers -+ }; -+ -+ status = vchi_service_open(vchi_instance, ¶ms, -+ &instance->vchi_handle[i]); -+ if (status != VCOS_SUCCESS) { -+ LOG_ERR -+ ("%s: failed to open VCHI service connection (status=%d)", -+ __func__, status); -+ -+ goto err_close_services; -+ } -+ /* Finished with the service for now */ -+ vchi_service_release(instance->vchi_handle[i]); -+ } -+ -+ return instance; -+ -+err_close_services: -+ for (i = 0; i < instance->num_connections; i++) { -+ vchi_service_close(instance->vchi_handle[i]); -+ } -+ -+ vcos_mutex_delete(&instance->vchi_mutex); -+ -+err_delete_event: -+ vcos_event_delete(&instance->msg_avail_event); -+ -+err_free_mem: -+ vcos_free(instance); -+ -+ return NULL; -+} -+ -+static int32_t vc_vchi_audio_deinit(AUDIO_INSTANCE_T * instance) -+{ -+ uint32_t i; -+ -+ LOG_DBG(" .. IN\n"); -+ -+ if (instance == NULL) { -+ LOG_ERR("%s: invalid handle %p", __func__, instance); -+ -+ return -1; -+ } -+ -+ LOG_DBG(" .. about to lock (%d)\n", instance->num_connections); -+ vcos_mutex_lock(&instance->vchi_mutex); -+ -+ /* Close all VCHI service connections */ -+ for (i = 0; i < instance->num_connections; i++) { -+ int32_t success; -+ LOG_DBG(" .. %i:closing %p\n", i, instance->vchi_handle[i]); -+ vchi_service_use(instance->vchi_handle[i]); -+ -+ success = vchi_service_close(instance->vchi_handle[i]); -+ if (success != 0) { -+ LOG_ERR -+ ("%s: failed to close VCHI service connection (status=%d)", -+ __func__, success); -+ } -+ } -+ -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ -+ vcos_mutex_delete(&instance->vchi_mutex); -+ -+ vcos_event_delete(&instance->msg_avail_event); -+ -+ vcos_free(instance); -+ -+ /* Unregister the log category so we can add it back next time */ -+ vcos_log_unregister(&audio_log_category); -+ -+ LOG_DBG(" .. OUT\n"); -+ -+ return 0; -+} -+ -+static int bcm2835_audio_open_connection(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ static VCHI_INSTANCE_T vchi_instance; -+ static VCHI_CONNECTION_T *vchi_connection; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ LOG_INFO("%s: start", __func__); -+ //BUG_ON(instance); -+ if (instance) { -+ LOG_ERR("%s: VCHI instance already open (%p)", -+ __func__, instance); -+ instance->alsa_stream = alsa_stream; -+ alsa_stream->instance = instance; -+ ret = 0; // xxx todo -1; -+ goto err_free_mem; -+ } -+ -+ /* Initialize and create a VCHI connection */ -+ ret = vchi_initialise(&vchi_instance); -+ if (ret != 0) { -+ LOG_ERR("%s: failed to initialise VCHI instance (ret=%d)", -+ __func__, ret); -+ -+ ret = -EIO; -+ goto err_free_mem; -+ } -+ ret = vchi_connect(NULL, 0, vchi_instance); -+ if (ret != 0) { -+ LOG_ERR("%s: failed to connect VCHI instance (ret=%d)", -+ __func__, ret); -+ -+ ret = -EIO; -+ goto err_free_mem; -+ } -+ -+ /* Set up the VCOS logging */ -+ vcos_log_set_level(VCOS_LOG_CATEGORY, LOG_LEVEL); -+ vcos_log_register("audio", VCOS_LOG_CATEGORY); -+ -+ /* Initialize an instance of the audio service */ -+ instance = vc_vchi_audio_init(vchi_instance, &vchi_connection, 1); -+ -+ if (instance == NULL /*|| audio_handle != instance */ ) { -+ LOG_ERR("%s: failed to initialize audio service", __func__); -+ -+ ret = -EPERM; -+ goto err_free_mem; -+ } -+ -+ instance->alsa_stream = alsa_stream; -+ alsa_stream->instance = instance; -+ -+ LOG_DBG(" success !\n"); -+err_free_mem: -+ LOG_DBG(" .. OUT\n"); -+ -+ return ret; -+} -+ -+int bcm2835_audio_open(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ AUDIO_INSTANCE_T *instance; -+ VC_AUDIO_MSG_T m; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ my_workqueue_init(alsa_stream); -+ -+ ret = bcm2835_audio_open_connection(alsa_stream); -+ if (ret != 0) { -+ ret = -1; -+ goto exit; -+ } -+ instance = alsa_stream->instance; -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ m.type = VC_AUDIO_MSG_TYPE_OPEN; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+exit: -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+static int bcm2835_audio_set_ctls_chan(bcm2835_alsa_stream_t * alsa_stream, -+ bcm2835_chip_t * chip) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ LOG_INFO -+ (" Setting ALSA dest(%d), volume(%d)\n", chip->dest, chip->volume); -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ instance->got_result = 0; -+ instance->result = -1; -+ -+ m.type = VC_AUDIO_MSG_TYPE_CONTROL; -+ m.u.control.dest = chip->dest; -+ m.u.control.volume = chip->volume; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ /* We are expecting a reply from the videocore */ -+ while (!instance->got_result) { -+ success = vcos_event_wait(&instance->msg_avail_event); -+ if (success != VCOS_SUCCESS) { -+ LOG_ERR("%s: failed on waiting for event (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ } -+ -+ if (instance->result != 0) { -+ LOG_ERR("%s: result=%d", __func__, instance->result); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+int bcm2835_audio_set_ctls(bcm2835_chip_t * chip) -+{ -+ int i; -+ int ret = 0; -+ LOG_DBG(" .. IN\n"); -+ /* change ctls for all substreams */ -+ for (i = 0; i < MAX_SUBSTREAMS; i++) { -+ if (chip->avail_substreams & (1 << i)) { -+ if (!chip->alsa_stream[i]) -+ ret = 0; -+ else if (bcm2835_audio_set_ctls_chan -+ (chip->alsa_stream[i], chip) != 0) -+ ret = -1; -+ } -+ } -+ LOG_DBG(" .. OUT ret=%d\n", ret); -+ return ret; -+} -+ -+int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream, -+ uint32_t channels, uint32_t samplerate, -+ uint32_t bps) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ LOG_INFO -+ (" Setting ALSA channels(%d), samplerate(%d), bits-per-sample(%d)\n", -+ channels, samplerate, bps); -+ -+ /* resend ctls - alsa_stream may not have been open when first send */ -+ ret = bcm2835_audio_set_ctls_chan(alsa_stream, alsa_stream->chip); -+ if (ret != 0) { -+ LOG_ERR(" Alsa controls not supported\n"); -+ return -EINVAL; -+ } -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ instance->got_result = 0; -+ instance->result = -1; -+ -+ m.type = VC_AUDIO_MSG_TYPE_CONFIG; -+ m.u.config.channels = channels; -+ m.u.config.samplerate = samplerate; -+ m.u.config.bps = bps; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ /* We are expecting a reply from the videocore */ -+ while (!instance->got_result) { -+ success = vcos_event_wait(&instance->msg_avail_event); -+ if (success != VCOS_SUCCESS) { -+ LOG_ERR("%s: failed on waiting for event (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ } -+ -+ if (instance->result != 0) { -+ LOG_ERR("%s: result=%d", __func__, instance->result); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+int bcm2835_audio_setup(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ LOG_DBG(" .. IN\n"); -+ -+ LOG_DBG(" .. OUT\n"); -+ -+ return 0; -+} -+ -+static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ m.type = VC_AUDIO_MSG_TYPE_START; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ m.type = VC_AUDIO_MSG_TYPE_STOP; -+ m.u.stop.draining = alsa_stream->draining; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ LOG_DBG(" .. IN\n"); -+ -+ my_workqueue_quit(alsa_stream); -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ m.type = VC_AUDIO_MSG_TYPE_CLOSE; -+ instance->got_result = 0; -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ ret = -1; -+ goto unlock; -+ } -+ while (!instance->got_result) { -+ success = vcos_event_wait(&instance->msg_avail_event); -+ if (success != VCOS_SUCCESS) { -+ LOG_ERR("%s: failed on waiting for event (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ } -+ if (instance->result != 0) { -+ LOG_ERR("%s: failed result (status=%d)", -+ __func__, instance->result); -+ -+ ret = -1; -+ goto unlock; -+ } -+ -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ -+ /* Stop the audio service */ -+ if (instance) { -+ vc_vchi_audio_deinit(instance); -+ alsa_stream->instance = NULL; -+ } -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count, -+ void *src) -+{ -+ VC_AUDIO_MSG_T m; -+ AUDIO_INSTANCE_T *instance = alsa_stream->instance; -+ int32_t success; -+ int ret; -+ -+ LOG_DBG(" .. IN\n"); -+ -+ LOG_INFO(" Writing %d bytes from %p\n", count, src); -+ -+ vcos_mutex_lock(&instance->vchi_mutex); -+ vchi_service_use(instance->vchi_handle[0]); -+ -+ m.type = VC_AUDIO_MSG_TYPE_WRITE; -+ m.u.write.count = count; -+ m.u.write.callback = alsa_stream->fifo_irq_handler; -+ m.u.write.cookie = alsa_stream; -+ m.u.write.silence = src == NULL; -+ -+ /* Send the message to the videocore */ -+ success = vchi_msg_queue(instance->vchi_handle[0], -+ &m, sizeof m, -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED, NULL); -+ -+ if (success != 0) { -+ LOG_ERR("%s: failed on vchi_msg_queue (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ LOG_DBG(" ... sent header\n"); -+ if (!m.u.write.silence) { -+ /* Send the message to the videocore */ -+ success = vchi_bulk_queue_transmit(instance->vchi_handle[0], -+ src, count, -+ 0 * -+ VCHI_FLAGS_BLOCK_UNTIL_QUEUED -+ + -+ 1 * -+ VCHI_FLAGS_BLOCK_UNTIL_DATA_READ, -+ NULL); -+ if (success != 0) { -+ LOG_ERR -+ ("%s: failed on vchi_bulk_queue_transmit (status=%d)", -+ __func__, success); -+ -+ ret = -1; -+ goto unlock; -+ } -+ } -+ ret = 0; -+ -+unlock: -+ vchi_service_release(instance->vchi_handle[0]); -+ vcos_mutex_unlock(&instance->vchi_mutex); -+ LOG_DBG(" .. OUT\n"); -+ return ret; -+} -+ -+/** -+ * Returns all buffers from arm->vc -+ */ -+void bcm2835_audio_flush_buffers(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ LOG_DBG(" .. IN\n"); -+ LOG_DBG(" .. OUT\n"); -+ return; -+} -+ -+/** -+ * Forces VC to flush(drop) its filled playback buffers and -+ * return them the us. (VC->ARM) -+ */ -+void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ LOG_DBG(" .. IN\n"); -+ LOG_DBG(" .. OUT\n"); -+} -+ -+uint32_t bcm2835_audio_retrieve_buffers(bcm2835_alsa_stream_t * alsa_stream) -+{ -+ uint32_t count = atomic_read(&alsa_stream->retrieved); -+ atomic_sub(count, &alsa_stream->retrieved); -+ return count; -+} -diff -Naur linux-3.2.23/sound/arm/Kconfig linux-rpi-bootc-3.2.23/sound/arm/Kconfig ---- linux-3.2.23/sound/arm/Kconfig 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/sound/arm/Kconfig 2012-07-15 20:28:25.381073128 +0200 -@@ -39,5 +39,12 @@ - Say Y or M if you want to support any AC97 codec attached to - the PXA2xx AC97 interface. - -+config SND_BCM2835 -+ tristate "BCM2835 ALSA driver" -+ depends on ARCH_BCM2708 && SND -+ select SND_PCM -+ help -+ Say Y or M if you want to support BCM2835 Alsa pcm card driver -+ - endif # SND_ARM - -diff -Naur linux-3.2.23/sound/arm/Makefile linux-rpi-bootc-3.2.23/sound/arm/Makefile ---- linux-3.2.23/sound/arm/Makefile 2012-07-12 05:32:21.000000000 +0200 -+++ linux-rpi-bootc-3.2.23/sound/arm/Makefile 2012-07-15 20:28:25.380073109 +0200 -@@ -14,3 +14,9 @@ - - obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o - snd-pxa2xx-ac97-objs := pxa2xx-ac97.o -+ -+obj-$(CONFIG_SND_BCM2835) += snd-bcm2835.o -+snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o -+ -+EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000 -+ -diff -Naur linux-3.2.23/sound/arm/vc_vchi_audioserv_defs.h linux-rpi-bootc-3.2.23/sound/arm/vc_vchi_audioserv_defs.h ---- linux-3.2.23/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-rpi-bootc-3.2.23/sound/arm/vc_vchi_audioserv_defs.h 2012-07-15 20:28:25.381073128 +0200 +diff --git a/sound/arm/vc_vchi_audioserv_defs.h b/sound/arm/vc_vchi_audioserv_defs.h +new file mode 100644 +index 0000000..d610734 +--- /dev/null ++++ b/sound/arm/vc_vchi_audioserv_defs.h @@ -0,0 +1,112 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. diff --git a/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch b/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch new file mode 100644 index 0000000000..1f9db71463 --- /dev/null +++ b/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch @@ -0,0 +1,59 @@ +From cca7718a9902a4d5cffbf158b5853980a08ef930 Mon Sep 17 00:00:00 2001 +From: Alexandre Lissy +Date: Sun, 2 Sep 2012 20:35:20 +0200 +Subject: [PATCH] fix: iMon Knob event interpretation issues + +Events for the iMon Knob pad where not correctly interpreted, resulting +in buggy mouse movements (cursor going straight out of the screen), key +pad only generating KEY_RIGHT and KEY_DOWN events. A reproducer is: + +int main(int argc, char ** argv) +{ + char rel_x = 0x00; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + rel_x = 0x0f; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + rel_x |= ~0x0f; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + + return 0; +} + +(running on x86 or amd64) +$ ./test +rel_x:0 @test.c:6 +rel_x:15 @test.c:7 +rel_x:-1 @test.c:8 + +(running on armv6) +rel_x:0 @test.c:6 +rel_x:15 @test.c:7 +rel_x:255 @test.c:8 + +Forcing the rel_x and rel_y variables as signed char fixes the issue. +--- + drivers/media/rc/imon.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c +index 5dd0386..9d30ca9 100644 +--- a/drivers/media/rc/imon.c ++++ b/drivers/media/rc/imon.c +@@ -1225,7 +1225,7 @@ static u32 imon_panel_key_lookup(u64 code) + static bool imon_mouse_event(struct imon_context *ictx, + unsigned char *buf, int len) + { +- char rel_x = 0x00, rel_y = 0x00; ++ signed char rel_x = 0x00, rel_y = 0x00; + u8 right_shift = 1; + bool mouse_input = true; + int dir = 0; +@@ -1301,7 +1301,7 @@ static void imon_touch_event(struct imon_context *ictx, unsigned char *buf) + static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf) + { + int dir = 0; +- char rel_x = 0x00, rel_y = 0x00; ++ signed char rel_x = 0x00, rel_y = 0x00; + u16 timeout, threshold; + u32 scancode = KEY_RESERVED; + unsigned long flags; +-- +1.7.9.5 + diff --git a/packages/linux/unpack b/packages/linux/unpack index 3c1b474b92..2c17e0354d 100755 --- a/packages/linux/unpack +++ b/packages/linux/unpack @@ -41,12 +41,6 @@ cp $KERNEL_CFG_FILE $LINUX/.config sed -i -e "s|^CONFIG_INITRAMFS_SOURCE=.*$|CONFIG_INITRAMFS_SOURCE=\"$ROOT/$BUILD/image/initramfs.cpio\"|" \ $LINUX/.config -# wipe out DVB and TV stuff if not building PVR version - if [ ! "$PVR" = yes ]; then - sed -i -e "s|^CONFIG_DVB_CORE=.*$|# CONFIG_DVB_CORE is not set|" $LINUX/.config - sed -i -e "s|^CONFIG_VIDEO_DEV=.*$|# CONFIG_VIDEO_DEV is not set|" $LINUX/.config - fi - # disable PPP support if not enabled if [ ! "$PPTP_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_PPP=.*$|# CONFIG_PPP is not set|" $LINUX/.config diff --git a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta index 09803245d3..625beb834e 100644 --- a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo-theme-Confluence" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-1c5ca99" -else - PKG_VERSION="58abd46" -fi +PKG_VERSION="c49247d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-frodo/build b/packages/mediacenter/xbmc-frodo/build index 755c8f31d7..e36b24db7e 100755 --- a/packages/mediacenter/xbmc-frodo/build +++ b/packages/mediacenter/xbmc-frodo/build @@ -85,6 +85,9 @@ fi if [ "$CEC_SUPPORT" = yes ]; then XBMC_CEC="--enable-libcec" + if [ "$OPENMAX" = "bcm2835-driver" ]; then + XBMC_CEC="$XBMC_CEC --enable-rpi-cec-api" + fi else XBMC_CEC="--disable-libcec" fi @@ -172,6 +175,7 @@ if [ "$OPENMAX_SUPPORT" = yes ]; then XBMC_OPENMAX="--enable-openmax" if [ "$OPENMAX" = "bcm2835-driver" ]; then XBMC_PLATFORM_SUPPORT="--with-platform=raspberry-pi" + XBMC_PLAYER="--enable-player=omxplayer" CFLAGS="$CFLAGS -I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/" CXXFLAGS="$CXXFLAGS -I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/" fi @@ -298,6 +302,7 @@ cd $PKG_BUILD --disable-external-libraries \ --enable-external-ffmpeg \ $XBMC_PLATFORM_SUPPORT \ + $XBMC_PLAYER \ # setup default skin inside the sources sed -i -e "s|skin.confluence|$SKIN_DIR|g" xbmc/settings/Settings.h diff --git a/packages/mediacenter/xbmc-frodo/install b/packages/mediacenter/xbmc-frodo/install index 134e62c73e..d17d97fccb 100755 --- a/packages/mediacenter/xbmc-frodo/install +++ b/packages/mediacenter/xbmc-frodo/install @@ -29,9 +29,7 @@ mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin mkdir -p $INSTALL/usr/lib/xbmc cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc @@ -74,7 +72,6 @@ mkdir -p $INSTALL/usr/share/xbmc/media # fi # cleanup and python addon fixes - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pil rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite rm -rf $INSTALL/usr/share/xbmc/addons/script.module.simplejson diff --git a/packages/mediacenter/xbmc-frodo/meta b/packages/mediacenter/xbmc-frodo/meta index a5d071041f..7dd5f64eb6 100644 --- a/packages/mediacenter/xbmc-frodo/meta +++ b/packages/mediacenter/xbmc-frodo/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-1c5ca99" -else - PKG_VERSION="58abd46" -fi +PKG_VERSION="c49247d" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" @@ -46,6 +42,12 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS Imaging" PKG_DEPENDS="$PKG_DEPENDS simplejson" +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-pvr-addons" +# PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-vuplus" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr" + if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" @@ -89,9 +91,6 @@ fi if [ "$CEC_SUPPORT" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libcec" PKG_DEPENDS="$PKG_DEPENDS libcec" - if [ "$OPENMAX" = "bcm2835-driver" ]; then - PKG_DEPENDS="$PKG_DEPENDS rpi-cecd" - fi fi if [ "$XBMC_SCR_RSXS" = yes ]; then @@ -176,8 +175,3 @@ fi if [ "$XVBA" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch deleted file mode 100644 index cbe5891222..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch +++ /dev/null @@ -1,190 +0,0 @@ -diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in ---- xbmc-frodo-433f681/configure.in 2012-06-15 02:52:26.000000000 +0200 -+++ xbmc-frodo-433f681.patch/configure.in 2012-06-19 05:26:41.472596903 +0200 -@@ -405,6 +405,12 @@ - [use_texturepacker=$enableval], - [use_texturepacker=auto]) - -+AC_ARG_WITH([texturepacker-root], -+ [AS_HELP_STRING([--with-texturepacker-root], -+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], -+ [use_texturepacker_root=$withval], -+ [use_texturepacker_root=$prefix]) -+ - AC_ARG_WITH([lirc-device], - [AS_HELP_STRING([--with-lirc-device=file], - [specify the default LIRC device (default is /dev/lircd)])], -@@ -516,8 +522,7 @@ - use_cpu=cortex-a8 - check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] - if test "x$check_sdl_arch" = "xi386"; then -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" -+ use_texturepacker_root="/opt/local" - else - use_texturepacker=no - fi -@@ -533,8 +538,6 @@ - *86*-apple-darwin*) - use_joystick=no - use_vtbdecoder=no -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" - ARCH="x86-osx" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") - ;; -@@ -1756,13 +1759,13 @@ - - USE_TEXTUREPACKER_NATIVE=0 - if test "x$use_texturepacker" != "xno"; then -- final_message="$final_message\n TexturePacker:Yes" - USE_TEXTUREPACKER=1 -- if test "x$use_texturepacker_native" = "xyes"; then -+ if test "x$cross_compiling" = "xyes"; then - USE_TEXTUREPACKER_NATIVE=1 -- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then -- USE_TEXTUREPACKER_NATIVE_ROOT= -- fi -+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" -+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" -+ else -+ final_message="$final_message\n TexturePacker:Yes" - fi - else - final_message="$final_message\n TexturePacker:No" -diff -Naur xbmc-frodo-433f681/lib/libsquish/Makefile.in xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in ---- xbmc-frodo-433f681/lib/libsquish/Makefile.in 2012-06-15 02:51:53.000000000 +0200 -+++ xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in 2012-06-19 05:42:20.313119617 +0200 -@@ -11,31 +11,34 @@ - singlecolourfit.cpp \ - squish.cpp - --CXXFLAGS+=-I. -+LIB = libsquish.a -+NATIVE_LIB = libsquish-native.so -+CLEAN_FILES += $(NATIVE_LIB) -+ -+HOST_CXX ?= g++ -+CXXFLAGS += -I. -+HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif - --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -- - ifeq ($(findstring osx,$(ARCH)),osx) --NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) -+ HOST_CXXFLAGS += $(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) - endif - --all: $(LIB) $(NATIVE_LIB) -+$(LIB): $(SRCS) -+ - # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. - $(NATIVE_LIB): $(SRCS) - ifeq ($(findstring osx,$(ARCH)),osx) -- g++ $(NATIVE_ARCH) -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ - else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ --endif -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ - endif - - include ../../Makefile.include -diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in ---- xbmc-frodo-433f681/tools/TexturePacker/Makefile.in 2012-06-15 02:52:20.000000000 +0200 -+++ xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in 2012-06-19 05:35:15.349564918 +0200 -@@ -1,48 +1,51 @@ --DEFINES += -D_LINUX -DUSE_LZO_PACKING -+DEFINES += -D_LINUX -DUSE_LZO_PACKING - ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) --DEFINES += -DHOST_BIGENDIAN -+DEFINES += -DHOST_BIGENDIAN - endif - --CXXFLAGS+= \ -+SRCS = \ -+ md5.cpp \ -+ SDL_anigif.cpp \ -+ XBTFWriter.cpp \ -+ XBMCTex.cpp \ -+ @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -+ -+TARGET = TexturePacker -+CLEAN_FILES = $(TARGET) -+ -+all: $(TARGET) -+ -+HOST_CXX ?= g++ -+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ -+ -+LIBS += -lSDL_image -lSDL -llzo2 -+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish -+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 -+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native -+ -+CXXFLAGS += \ - -I. \ - -I@abs_top_srcdir@/lib \ - -I@abs_top_srcdir@/xbmc \ - -I@abs_top_srcdir@/xbmc/linux - --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@ --ifdef NATIVE_ROOT_PATH -+HOST_CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux \ -+ -I$(HOST_ROOT_PATH)/include -+ - ifeq ($(findstring osx,@ARCH@),osx) - DEFINES += -DTARGET_DARWIN - NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) - endif --CXXFLAGS+= -I$(NATIVE_ROOT_PATH)/include --LIBS += -L$(NATIVE_ROOT_PATH)/lib --endif --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native --else --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish --endif -- --LIBS += -lSDL_image -lSDL -llzo2 -- --SRCS = \ -- md5.cpp \ -- SDL_anigif.cpp \ -- XBTFWriter.cpp \ -- XBMCTex.cpp \ -- @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -- -- --TARGET = TexturePacker --CLEAN_FILES=$(TARGET) -- --all: $(TARGET) - - ifeq (@USE_TEXTUREPACKER_NATIVE@,1) - # TexturePacker run native on build system, build it with native tools - $(TARGET): $(SRCS) -- g++ $(DEFINES) $(NATIVE_ARCH) $(CXXFLAGS) $(SRCS) $(LIBS) -o $(TARGET) -+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) - clean: - rm -f $(TARGET) - else diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch deleted file mode 100644 index 0edef5a7a5..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -Naur xbmc-pvr-3513480/system/Lircmap.xml xbmc-pvr-3513480.patch/system/Lircmap.xml ---- xbmc-pvr-3513480/system/Lircmap.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/system/Lircmap.xml 2011-04-25 05:31:39.632429078 +0200 -@@ -409,4 +409,48 @@ - KEY_YELLOW - KEY_BLUE - -+ -+ pause -+ stop -+ fwd -+ rew -+ left -+ right -+ up -+ down -+ -+ ch+ -+ ch- -+ back -+

clear -+ play -+ info -+ next -+ prev -+ teletext -+ ehome -+ rec -+ vol+ -+ vol- -+ mute -+ power -+ video -+ music -+ pictures -+ tv -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 0 -+ red -+ green -+ yellow -+ blue -+ - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-321-texturepacker-hostflags-and-rework.patch similarity index 74% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-321-texturepacker-hostflags-and-rework.patch index ef8b6f5640..db7d6f6c61 100644 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-321-texturepacker-hostflags-and-rework.patch +++ b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-321-texturepacker-hostflags-and-rework.patch @@ -1,7 +1,7 @@ -diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in ---- xbmc-frodo-433f681/configure.in 2012-06-15 02:52:26.000000000 +0200 -+++ xbmc-frodo-433f681.patch/configure.in 2012-06-19 05:26:41.472596903 +0200 -@@ -430,6 +430,12 @@ +diff -Naur xbmc-frodo-5ea1d22/configure.in xbmc-frodo-5ea1d22.patch/configure.in +--- xbmc-frodo-5ea1d22/configure.in 2012-09-05 13:27:56.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/configure.in 2012-09-05 17:55:46.727316107 +0200 +@@ -437,6 +437,12 @@ [use_texturepacker=$enableval], [use_texturepacker=auto]) @@ -14,7 +14,7 @@ diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in AC_ARG_WITH([lirc-device], [AS_HELP_STRING([--with-lirc-device=file], [specify the default LIRC device (default is /dev/lircd)])], -@@ -563,8 +569,7 @@ +@@ -570,8 +576,7 @@ use_cpu=cortex-a8 check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] if test "x$check_sdl_arch" = "xi386"; then @@ -24,7 +24,16 @@ diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in else use_texturepacker=no fi -@@ -1869,13 +1874,13 @@ +@@ -587,8 +592,6 @@ + *86*-apple-darwin*) + use_joystick=no + use_vtbdecoder=no +- use_texturepacker_native=yes +- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" + ARCH="x86-osx" + AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") + ;; +@@ -1938,13 +1941,13 @@ USE_TEXTUREPACKER_NATIVE=0 if test "x$use_texturepacker" != "xno"; then @@ -43,14 +52,20 @@ diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in fi else final_message="$final_message\n TexturePacker:No" -diff -Naur xbmc-frodo-433f681/lib/libsquish/Makefile.in xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in ---- xbmc-frodo-433f681/lib/libsquish/Makefile.in 2012-06-15 02:51:53.000000000 +0200 -+++ xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in 2012-06-19 05:42:20.313119617 +0200 -@@ -11,31 +11,34 @@ +diff -Naur xbmc-frodo-5ea1d22/lib/libsquish/Makefile.in xbmc-frodo-5ea1d22.patch/lib/libsquish/Makefile.in +--- xbmc-frodo-5ea1d22/lib/libsquish/Makefile.in 2012-09-05 13:28:31.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/lib/libsquish/Makefile.in 2012-09-05 17:56:05.017178267 +0200 +@@ -11,26 +11,25 @@ singlecolourfit.cpp \ squish.cpp -CXXFLAGS+=-I. +- +-LIB=libsquish.a +- +-ifeq (@USE_TEXTUREPACKER_NATIVE@,1) +-NATIVE_LIB=libsquish-native.so +-CLEAN_FILES+=$(NATIVE_LIB) +LIB = libsquish.a +NATIVE_LIB = libsquish-native.so +CLEAN_FILES += $(NATIVE_LIB) @@ -58,47 +73,30 @@ diff -Naur xbmc-frodo-433f681/lib/libsquish/Makefile.in xbmc-frodo-433f681.patch +HOST_CXX ?= g++ +CXXFLAGS += -I. +HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -- ifeq ($(findstring Darwin,$(shell uname -s)),Darwin) -NATIVE_ARCH=@DARWIN_NATIVE_ARCH@ -+ HOST_CXXFLAGS += $(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) ++ HOST_CXXFLAGS += @DARWIN_NATIVE_ARCH@ endif -all: $(LIB) $(NATIVE_LIB) +$(LIB): $(SRCS) -+ # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. $(NATIVE_LIB): $(SRCS) ifeq ($(findstring Darwin,$(shell uname -s)),Darwin) -- g++ $(NATIVE_ARCH) -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ +- g++ $(NATIVE_ARCH) -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ + $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ +- g++ -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ -endif + $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ endif include ../../Makefile.include -diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in ---- xbmc-frodo-433f681/tools/TexturePacker/Makefile.in 2012-06-15 02:52:20.000000000 +0200 -+++ xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in 2012-06-19 05:35:15.349564918 +0200 -@@ -1,56 +1,52 @@ +diff -Naur xbmc-frodo-5ea1d22/tools/TexturePacker/Makefile.in xbmc-frodo-5ea1d22.patch/tools/TexturePacker/Makefile.in +--- xbmc-frodo-5ea1d22/tools/TexturePacker/Makefile.in 2012-09-05 13:28:16.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/tools/TexturePacker/Makefile.in 2012-09-05 17:55:49.927291649 +0200 +@@ -1,56 +1,54 @@ -DEFINES += -D_LINUX -DUSE_LZO_PACKING +DEFINES += -D_LINUX -DUSE_LZO_PACKING ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) @@ -140,6 +138,8 @@ diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681 + -I@abs_top_srcdir@/xbmc \ + -I@abs_top_srcdir@/xbmc/linux \ + -I$(HOST_ROOT_PATH)/include ++ ++RPATH=-Wl,-rpath=$(HOST_ROOT_PATH)/lib -ifeq (@USE_TEXTUREPACKER_NATIVE@,1) -NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@ @@ -182,7 +182,7 @@ diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681 $(TARGET): $(SRCS) - g++ $(DEFINES) $(NATIVE_ARCH) $(NATIVE_CXXFLAGS) $(SRCS) $(NATIVE_LIBS) $(RPATH) -o $(TARGET) + make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) ++ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) $(RPATH) -o $(TARGET) clean: rm -f $(TARGET) else diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 68% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch index dc800818b0..c320f3cacc 100644 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch @@ -1,7 +1,7 @@ -diff -Naur xbmc-334f9c6/xbmc/interfaces/python/XBPython.cpp xbmc-334f9c6.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-334f9c6/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-334f9c6.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -523,11 +523,9 @@ +diff -Naur xbmc-frodo-5ea1d22/xbmc/interfaces/python/XBPython.cpp xbmc-frodo-5ea1d22.patch/xbmc/interfaces/python/XBPython.cpp +--- xbmc-frodo-5ea1d22/xbmc/interfaces/python/XBPython.cpp 2012-09-05 13:28:20.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/xbmc/interfaces/python/XBPython.cpp 2012-09-05 15:50:42.642317031 +0200 +@@ -525,11 +525,10 @@ // at http://docs.python.org/using/cmdline.html#environment-variables #if !defined(_WIN32) && !defined(TARGET_ANDROID) @@ -12,6 +12,7 @@ diff -Naur xbmc-334f9c6/xbmc/interfaces/python/XBPython.cpp xbmc-334f9c6.patch/x - // check if we are running as real xbmc.app or just binary + // Required for python to find optimized code (pyo) files + setenv("PYTHONOPTIMIZE", "1", 1); ++ + // check if we are running as real xbmc.app or just binary if (!CUtil::GetFrameworksPath(true).IsEmpty()) { diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-464-add_eject_keymapping_for_lirc-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-464-add_eject_keymapping_for_lirc-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-464-add_eject_keymapping_for_lirc-0.1.patch diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-601-dont_show_unneeded_sysinfo.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-601-dont_show_unneeded_sysinfo.patch similarity index 100% rename from packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-601-dont_show_unneeded_sysinfo.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-601-dont_show_unneeded_sysinfo.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-981-toggleButtonState.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-981-toggleButtonState.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-c49247d-981-toggleButtonState.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index aabb1d02f1..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-334f9c6/configure.in xbmc-pvr-334f9c6.patch/configure.in ---- xbmc-pvr-334f9c6/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-334f9c6.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -1493,6 +1493,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # VDPAU -@@ -2378,6 +2381,7 @@ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - `if test "$use_neon" = "yes"; then echo --enable-neon; else echo --disable-neon; fi`\ - --target-os=$ffmpeg_target_os \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-457-fix_connection_check-0.1.patch deleted file mode 100644 index 9488def289..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-457-fix_connection_check-0.1.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Naur a/xbmc/filesystem/CurlFile.cpp b/xbmc/filesystem/CurlFile.cpp ---- a/xbmc/filesystem/CurlFile.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ b/xbmc/filesystem/CurlFile.cpp 2011-10-17 19:21:04.180783870 +0200 -@@ -803,9 +803,9 @@ - // Detect whether we are "online" or not! Very simple and dirty! - bool CFileCurl::IsInternet(bool checkDNS /* = true */) - { -- CStdString strURL = "http://www.google.com"; -+ CStdString strURL = "http://www.openelec.tv"; - if (!checkDNS) -- strURL = "http://74.125.19.103"; // www.google.com ip -+ strURL = "http://212.101.13.10"; // www.openelec.tv ip - - bool found = Exists(strURL); - Close(); diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-462-add_remote_irtrans_mediacenter-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-462-add_remote_irtrans_mediacenter-0.1.patch deleted file mode 100644 index 0edef5a7a5..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-462-add_remote_irtrans_mediacenter-0.1.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -Naur xbmc-pvr-3513480/system/Lircmap.xml xbmc-pvr-3513480.patch/system/Lircmap.xml ---- xbmc-pvr-3513480/system/Lircmap.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/system/Lircmap.xml 2011-04-25 05:31:39.632429078 +0200 -@@ -409,4 +409,48 @@ - KEY_YELLOW - KEY_BLUE - -+ -+ pause -+ stop -+ fwd -+ rew -+ left -+ right -+ up -+ down -+ -+ ch+ -+ ch- -+ back -+ clear -+ play -+ info -+ next -+ prev -+ teletext -+ ehome -+ rec -+ vol+ -+ vol- -+ mute -+ power -+ video -+ music -+ pictures -+ tv -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 0 -+ red -+ green -+ yellow -+ blue -+ - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-464-add_eject_keymapping_for_lirc-0.1.patch deleted file mode 100644 index 56c56016b5..0000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-464-add_eject_keymapping_for_lirc-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/keymaps/remote.xml xbmc-10.1-Dharma.patch/system/keymaps/remote.xml ---- xbmc-10.1-Dharma/system/keymaps/remote.xml 2011-03-08 02:49:23.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/system/keymaps/remote.xml 2011-06-18 01:48:26.887811969 +0200 -@@ -63,6 +63,7 @@ - VolumeDown - Mute - XBMC.ShutDown() -+ XBMC.EjectTray() - XBMC.ActivateWindow(MyVideos) - XBMC.ActivateWindow(MyMusic) - XBMC.ActivateWindow(MyPictures) diff --git a/packages/mediacenter/xbmc-frodo/profile.d/xbmc.conf b/packages/mediacenter/xbmc-frodo/profile.d/xbmc.conf index 77808bd02c..7029bf1bd3 100644 --- a/packages/mediacenter/xbmc-frodo/profile.d/xbmc.conf +++ b/packages/mediacenter/xbmc-frodo/profile.d/xbmc.conf @@ -24,7 +24,7 @@ ################################################################################ if [ -z "$XBMC_STARTDELAY" ]; then - XBMC_STARTDELAY="1500000" + XBMC_STARTDELAY="1000000" fi XBMC_HOME="/usr/share/xbmc" diff --git a/packages/sysutils/rpi-cecd/build b/packages/mediacenter/xbmc-pvr-addons/build similarity index 86% rename from packages/sysutils/rpi-cecd/build rename to packages/mediacenter/xbmc-pvr-addons/build index 9b7b91b510..511952d615 100755 --- a/packages/sysutils/rpi-cecd/build +++ b/packages/mediacenter/xbmc-pvr-addons/build @@ -22,8 +22,12 @@ . config/options $1 -CXXFLAGS="$CXXFLAGS -I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/" - cd $PKG_BUILD -make SYSROOT=$SYSROOT_PREFIX +./configure --host=$TARGET_NAME \ + --build=$HOST_NAME \ + --prefix=/usr/share/xbmc \ + --disable-static \ + --enable-shared + +make diff --git a/packages/mediacenter/xbmc-rpi/unpack b/packages/mediacenter/xbmc-pvr-addons/install similarity index 75% rename from packages/mediacenter/xbmc-rpi/unpack rename to packages/mediacenter/xbmc-pvr-addons/install index 58c11116fd..dac787ca1c 100755 --- a/packages/mediacenter/xbmc-rpi/unpack +++ b/packages/mediacenter/xbmc-pvr-addons/install @@ -22,9 +22,11 @@ . config/options $1 -echo "### Applying project based patches ###" +for addon in `find $PKG_BUILD/addons/ -type d -name "pvr.*"`; do + ADDON=`basename $addon` + mkdir -p $INSTALL/usr/share/xbmc/addons/$ADDON + cp -PRf $PKG_BUILD/addons/$ADDON/addon/* $INSTALL/usr/share/xbmc/addons/$ADDON -for patch in `ls $PROJECT_DIR/$PROJECT/patches/$1`; do - cat $PROJECT_DIR/$PROJECT/patches/$1/$patch | patch -d \ - `echo $PKG_BUILD | cut -f1 -d\ ` -p1 + mkdir -p $INSTALL/usr/lib/xbmc/addons/$ADDON + cp -Pf $PKG_BUILD/addons/$ADDON/*.pvr $INSTALL/usr/lib/xbmc/addons/$ADDON done diff --git a/packages/sysutils/rpi-cecd/meta b/packages/mediacenter/xbmc-pvr-addons/meta similarity index 74% rename from packages/sysutils/rpi-cecd/meta rename to packages/mediacenter/xbmc-pvr-addons/meta index be0ebae5a8..a4f2132f4a 100644 --- a/packages/sysutils/rpi-cecd/meta +++ b/packages/mediacenter/xbmc-pvr-addons/meta @@ -18,19 +18,18 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -PKG_NAME="rpi-cecd" -PKG_VERSION="0741e56" +PKG_NAME="xbmc-pvr-addons" +PKG_VERSION="3d83728" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" -PKG_SITE="https://github.com/olajep/rpi-cecd" +PKG_SITE="https://github.com/opdenkamp/xbmc-pvr-addons" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="bcm2835-driver" -PKG_BUILD_DEPENDS="toolchain bcm2835-driver" +PKG_DEPENDS="curl" +PKG_BUILD_DEPENDS="toolchain curl" PKG_PRIORITY="optional" -PKG_SECTION="system" -PKG_SHORTDESC="rpi-cecd: This is a temporary hack to make HDMI-CEC work with OpenElec on Raspberry Pi." -PKG_LONGDESC="rpi-cecd: This is a temporary hack to make HDMI-CEC work with OpenElec on Raspberry Pi." +PKG_SECTION="mediacenter" +PKG_SHORTDESC="Various PVR addons for XBMC" +PKG_LONGDESC="This addons allows XBMC PVR to connect to various TV/PVR backends and tuners." PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" +PKG_AUTORECONF="yes" diff --git a/packages/mediacenter/xbmc-rpi-theme-Confluence/build b/packages/mediacenter/xbmc-rpi-theme-Confluence/build deleted file mode 100755 index b35b583807..0000000000 --- a/packages/mediacenter/xbmc-rpi-theme-Confluence/build +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -cd $PKG_BUILD -TexturePacker -input media/ \ - -output Textures.xbt \ - -dupecheck \ - -use_none diff --git a/packages/mediacenter/xbmc-rpi-theme-Confluence/install b/packages/mediacenter/xbmc-rpi-theme-Confluence/install deleted file mode 100755 index 9e1aeaacb8..0000000000 --- a/packages/mediacenter/xbmc-rpi-theme-Confluence/install +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/share/xbmc/addons/skin.confluence - cp -R $PKG_BUILD/*/ $INSTALL/usr/share/xbmc/addons/skin.confluence - cp $PKG_BUILD/*.txt $INSTALL/usr/share/xbmc/addons/skin.confluence - cp $PKG_BUILD/*.xml $INSTALL/usr/share/xbmc/addons/skin.confluence - cp $PKG_BUILD/*.png $INSTALL/usr/share/xbmc/addons/skin.confluence - rm -rf $INSTALL/usr/share/xbmc/addons/skin.confluence/media - -mkdir -p $INSTALL/usr/share/xbmc/addons/skin.confluence/media - cp $PKG_BUILD/Textures.xbt $INSTALL/usr/share/xbmc/addons/skin.confluence/media diff --git a/packages/mediacenter/xbmc-rpi-theme-Confluence/meta b/packages/mediacenter/xbmc-rpi-theme-Confluence/meta deleted file mode 100644 index 97453fd805..0000000000 --- a/packages/mediacenter/xbmc-rpi-theme-Confluence/meta +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc-rpi-theme-Confluence" -PKG_VERSION="efef226" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.xbmc.org" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="" -PKG_BUILD_DEPENDS="toolchain" -PKG_PRIORITY="optional" -PKG_SECTION="mediacenter" -PKG_SHORTDESC="xbmc-theme-Confluence: XBMC Mediacenter default theme" -PKG_LONGDESC="XBMC Media Center (which was formerly named Xbox Media Center) is a free and open source cross-platform media player and home entertainment system software with a 10-foot user interface designed for the living-room TV. Its graphical user interface allows the user to easily manage video, photos, podcasts, and music from a computer, optical disk, local network, and the internet using a remote control." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" diff --git a/packages/mediacenter/xbmc-rpi/build b/packages/mediacenter/xbmc-rpi/build deleted file mode 100755 index a75bf405ef..0000000000 --- a/packages/mediacenter/xbmc-rpi/build +++ /dev/null @@ -1,313 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - XBMC_XORG="--enable-x11 --enable-xrandr" -else - XBMC_XORG="--disable-x11 --disable-xrandr" -fi - -if [ "$OPENGL_SUPPORT" = yes ]; then - XBMC_OPENGL="--enable-gl" -else - XBMC_OPENGL="--disable-gl" -fi - -if [ "$OPENGLES_SUPPORT" = yes ]; then - XBMC_OPENGLES="--enable-gles" -else - XBMC_OPENGLES="--disable-gles" -fi - -if [ "$SDL_SUPPORT" = yes ]; then - XBMC_SDL="--enable-sdl" -else - XBMC_SDL="--disable-sdl" -fi - -if [ "$XBMC_SCR_RSXS" = yes ]; then - XBMC_RSXS="--enable-rsxs" - # fix build of RSXS Screensaver support if not using libiconv - if [ ! "$ICONV" = "libiconv" ]; then - export jm_cv_func_gettimeofday_clobber=no - fi -else - XBMC_RSXS="--disable-rsxs" -fi - -if [ "$XBMC_VIS_PROJECTM" = yes ]; then - XBMC_PROJECTM="--enable-projectm" -else - XBMC_PROJECTM="--disable-projectm" -fi - -if [ "$XBMC_VIS_GOOM" = yes ]; then - XBMC_GOOM="--enable-goom" -else - XBMC_GOOM="--disable-goom" -fi - -if [ "$ALSA_SUPPORT" = yes ]; then - XBMC_ALSA="--enable-alsa" -else - XBMC_ALSA="--disable-alsa" -fi - -if [ "$PULSEAUDIO_SUPPORT" = yes ]; then - XBMC_PULSEAUDIO="--enable-pulse" -else - XBMC_PULSEAUDIO="--disable-pulse" -fi - -if [ "$CEC_SUPPORT" = yes ]; then - XBMC_CEC="--enable-libcec" - if [ "$OPENMAX" = "bcm2835-driver" ]; then - XBMC_CEC="$XBMC_CEC --enable-rpi-cec-api" - fi -else - XBMC_CEC="--disable-libcec" -fi - -if [ "$JOYSTICK_SUPPORT" = yes ]; then - XBMC_JOYSTICK="--enable-joystick" -else - XBMC_JOYSTICK="--disable-joystick" -fi - -if [ "$NONFREE_SUPPORT" = yes ]; then - XBMC_NONFREE="--enable-non-free" -else - XBMC_NONFREE="--disable-non-free" -fi - -if [ "$AIRPLAY_SUPPORT" = yes ]; then - XBMC_AIRPLAY="--enable-airplay" -else - XBMC_AIRPLAY="--disable-airplay" -fi - -if [ "$AIRTUNES_SUPPORT" = yes ]; then - XBMC_AIRTUNES="--enable-airtunes" -else - XBMC_AIRTUNES="--disable-airtunes" -fi - -if [ "$DVDCSS_SUPPORT" = yes ]; then - XBMC_DVDCSS="--enable-dvdcss" -else - XBMC_DVDCSS="--disable-dvdcss" -fi - -if [ "$ENCODER_LAME" = yes ]; then - XBMC_LAMEENC="--enable-libmp3lame" -else - XBMC_LAMEENC="--disable-libmp3lame" -fi - -if [ "$ENCODER_VORBIS" = yes ]; then - XBMC_VORBISENC="--enable-libvorbisenc" -else - XBMC_VORBISENC="--disable-libvorbisenc" -fi - -if [ "$BLURAY_SUPPORT" = yes ]; then - XBMC_BLURAY="--enable-libbluray" -else - XBMC_BLURAY="--disable-libbluray" -fi - -if [ "$AVAHI_DAEMON" = yes ]; then - XBMC_AVAHI="--enable-avahi" -else - XBMC_AVAHI="--disable-avahi" -fi - -if [ "$NFS_SUPPORT" = yes ]; then - XBMC_NFS="--enable-nfs" -else - XBMC_NFS="--disable-nfs" -fi - -if [ "$AFP_SUPPORT" = yes ]; then - XBMC_AFP="--enable-afpclient" -else - XBMC_AFP="--disable-afpclient" -fi - -if [ "$SAMBA_CLIENT" = yes ]; then - XBMC_SAMBA="--enable-samba" - export LIBS="$LIBS -ltalloc -ltdb -lwbclient" -else - XBMC_SAMBA="--disable-samba" -fi - -if [ "$WEBSERVER" = yes ]; then - XBMC_WEBSERVER="--enable-webserver" -else - XBMC_WEBSERVER="--disable-webserver" -fi - -if [ "$OPENMAX_SUPPORT" = yes ]; then - XBMC_OPENMAX="--enable-openmax" - if [ "$OPENMAX" = "bcm2835-driver" ]; then - XBMC_PLATFORM_SUPPORT="--with-platform=raspberry-pi" - CFLAGS="$CFLAGS -I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/" - CXXFLAGS="$CXXFLAGS -I$SYSROOT_PREFIX/usr/include/interface/vcos/pthreads/" - fi -else - XBMC_OPENMAX="--disable-openmax" -fi - -if [ "$VDPAU" = yes ]; then - XBMC_VDPAU="--enable-vdpau" -else - XBMC_VDPAU="--disable-vdpau" -fi - -if [ "$VAAPI" = yes ]; then - XBMC_VAAPI="--enable-vaapi" -else - XBMC_VAAPI="--disable-vaapi" -fi - -if [ "$XVBA" = yes ]; then - XBMC_XVBA="--enable-xvba" -else - XBMC_XVBA="--disable-xvba" -fi - -if [ "$CRYSTALHD" = yes ]; then - XBMC_CRYSTALHD="--enable-crystalhd" -else - XBMC_CRYSTALHD="--disable-crystalhd" -fi - -# xbmc fails to build with LTO optimization - strip_lto - -# dont use some optimizations because of build problems - LDFLAGS=`echo $LDFLAGS | sed -e "s|-Wl,--as-needed||"` - -# dont build parallel - MAKEFLAGS=-j1 - - export PYTHON_VERSION="2.7" - export PYTHON_CPPFLAGS="-I$SYSROOT_PREFIX/usr/include/python$PYTHON_VERSION" - export PYTHON_LDFLAGS="-L$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION -lpython$PYTHON_VERSION" - export PYTHON_SITE_PKG="$SYSROOT_PREFIX/usr/lib/python$PYTHON_VERSION/site-packages" - export ac_python_version="$PYTHON_VERSION" - -# setup skin dir from default skin - SKIN_DIR="skin.`tolower $SKIN_DEFAULT`" - -cd $PKG_BUILD - -# adding fake Makefile for stripped skin - mkdir -p addons/skin.confluence/media - touch addons/skin.confluence/media/Makefile.in - -# autoreconf - do_autoreconf - do_autoreconf lib/libid3tag/libid3tag - do_autoreconf xbmc/screensavers/rsxs-0.9 - do_autoreconf xbmc/visualizations/Goom/goom2k4-0 - do_autoreconf lib/libapetag - do_autoreconf lib/cpluff - # order matters with libdvd and friends - [ -d lib/libdvd/libdvdcss ] && do_autoreconf lib/libdvd/libdvdcss - do_autoreconf lib/libdvd/libdvdread - do_autoreconf lib/libdvd/libdvdnav - -# Clean the generated files - find . -depth -type d -name "autom4te.cache" -exec rm -rf {} \; - -./configure --host=$TARGET_NAME \ - --build=$HOST_NAME \ - --with-arch=$TARGET_ARCH \ - --with-cpu=$TARGET_CPU \ - --prefix=/usr \ - --exec-prefix=/usr \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - GIT_REV=`cat git.version` \ - --disable-debug \ - --disable-optimizations \ - $XBMC_OPENGL \ - $XBMC_OPENGLES \ - $XBMC_SDL \ - $XBMC_OPENMAX \ - $XBMC_VDPAU \ - $XBMC_VAAPI \ - $XBMC_CRYSTALHD \ - $XBMC_XVBA \ - --disable-vdadecoder \ - --disable-vtbdecoder \ - --disable-tegra \ - --disable-profiling \ - $XBMC_JOYSTICK \ - $XBMC_CEC \ - --enable-udev \ - --disable-libusb \ - $XBMC_GOOM \ - $XBMC_RSXS \ - $XBMC_PROJECTM \ - $XBMC_XORG \ - --disable-ccache \ - $XBMC_ALSA \ - $XBMC_PULSEAUDIO \ - --enable-rtmp \ - $XBMC_SAMBA \ - $XBMC_NFS \ - $XBMC_AFP \ - $XBMC_VORBISENC \ - --enable-ffmpeg-libvorbis \ - $XBMC_LAMEENC \ - $XBMC_DVDCSS \ - --disable-mid \ - --disable-hal \ - $XBMC_AVAHI \ - $XBMC_AIRPLAY \ - $XBMC_AIRTUNES \ - $XBMC_NONFREE \ - --disable-asap-codec \ - $XBMC_WEBSERVER \ - --enable-optical-drive \ - $XBMC_BLURAY \ - --enable-texturepacker --with-texturepacker-root="$ROOT/$TOOLCHAIN" \ - --disable-external-libraries \ - --enable-external-ffmpeg \ - $XBMC_PLATFORM_SUPPORT \ - -# setup default skin inside the sources - sed -i -e "s|skin.confluence|$SKIN_DIR|g" xbmc/settings/Settings.h - -make externals -make xbmc.bin - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - make xbmc-xrandr -fi - -make -C tools/TexturePacker -cp -PR tools/TexturePacker/TexturePacker $ROOT/$TOOLCHAIN/bin diff --git a/packages/mediacenter/xbmc-rpi/config/advancedsettings.xml b/packages/mediacenter/xbmc-rpi/config/advancedsettings.xml deleted file mode 100644 index c6f22f0a3a..0000000000 --- a/packages/mediacenter/xbmc-rpi/config/advancedsettings.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - false - false - cputemp - gputemp - - 30 - - diff --git a/packages/mediacenter/xbmc-rpi/config/os.openelec.tv/addon.xml b/packages/mediacenter/xbmc-rpi/config/os.openelec.tv/addon.xml deleted file mode 100644 index b1ed65be99..0000000000 --- a/packages/mediacenter/xbmc-rpi/config/os.openelec.tv/addon.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/addon.xml b/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/addon.xml deleted file mode 100644 index d715467e85..0000000000 --- a/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/addon.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - @ADDON_URL@/addons.xml - @ADDON_URL@/addons.xml.md5 - @ADDON_URL@ - - - Install Add-ons, Plugins, Games and Programs from [COLOR FF757677]Open[/COLOR][COLOR FF8ABEE2]ELEC[/COLOR] - Download and install Add-ons, Plugins, Games and Programs from the Official [COLOR FF757677]Open[/COLOR][COLOR FF8ABEE2]ELEC[/COLOR] addon repository.[CR] By using the official Repository you will be able to take advantage of our extensive file mirror service to help get you faster downloads from a region close to you.[CR] All addons on this repository have under gone basic testing, if you find a broken or not working addon please report it to [COLOR FF757677]Open[/COLOR][COLOR FF8ABEE2]ELEC[/COLOR] so we can take any action needed. - all - - diff --git a/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/icon.png b/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/icon.png deleted file mode 100644 index 1147ae1d37..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/config/repository.openelec.tv/icon.png and /dev/null differ diff --git a/packages/mediacenter/xbmc-rpi/fonts/DejaVuSans.ttf b/packages/mediacenter/xbmc-rpi/fonts/DejaVuSans.ttf deleted file mode 100644 index 84ca1d7503..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/packages/mediacenter/xbmc-rpi/fonts/Trebuchet MS Bold.ttf b/packages/mediacenter/xbmc-rpi/fonts/Trebuchet MS Bold.ttf deleted file mode 100644 index 867f56d776..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/fonts/Trebuchet MS Bold.ttf and /dev/null differ diff --git a/packages/mediacenter/xbmc-rpi/fonts/YanoneKaffeesatz-Bold.ttf b/packages/mediacenter/xbmc-rpi/fonts/YanoneKaffeesatz-Bold.ttf deleted file mode 100644 index e9964b0809..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/fonts/YanoneKaffeesatz-Bold.ttf and /dev/null differ diff --git a/packages/mediacenter/xbmc-rpi/init.d/91_cleanup-logfiles b/packages/mediacenter/xbmc-rpi/init.d/91_cleanup-logfiles deleted file mode 100644 index 7f479fe516..0000000000 --- a/packages/mediacenter/xbmc-rpi/init.d/91_cleanup-logfiles +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -# starting XBMC -# -# runlevels: openelec - -progress "clean up log files" - rm -f /storage/.xbmc/userdata/addon_data/*/*.log 2>/dev/null - rm -rf /storage/.xbmc/userdata/addon_data/*/log/* 2>/dev/null diff --git a/packages/mediacenter/xbmc-rpi/init.d/92_setup-xbmc b/packages/mediacenter/xbmc-rpi/init.d/92_setup-xbmc deleted file mode 100644 index 7075f3d3fe..0000000000 --- a/packages/mediacenter/xbmc-rpi/init.d/92_setup-xbmc +++ /dev/null @@ -1,123 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -# setup XBMC -# -# runlevels: openelec - -progress "setup XBMC" - -# -# clean temp dir -# - rm -rf $HOME/.xbmc/temp/* - -# -# add some default settings -# - mkdir -p $HOME/.xbmc/userdata - -# -# setup directories for XBMC sources -# - - [ ! -d "$HOME/music" ] && mkdir -p $HOME/music - [ ! -d "$HOME/pictures" ] && mkdir -p $HOME/pictures - [ ! -d "$HOME/tvshows" ] && mkdir -p $HOME/tvshows - [ ! -d "$HOME/videos" ] && mkdir -p $HOME/videos - - mkdir -p $HOME/.xbmc/userdata - - if [ ! -f $HOME/.xbmc/userdata/sources.xml ]; then - if [ -f /usr/share/xbmc/config/sources.xml ]; then - # include project specific sources - cp /usr/share/xbmc/config/sources.xml $HOME/.xbmc/userdata - else - cat > $HOME/.xbmc/userdata/sources.xml << EOF - - - - - - Music - $HOME/music/ - - - - - - Pictures - $HOME/pictures/ - - - -EOF - fi - fi - -# -# common setup guisettings -# - - mkdir -p $HOME/.xbmc/userdata - - [ ! -d "$HOME/screenshots" ] && mkdir -p $HOME/screenshots - - if [ ! -f $HOME/.xbmc/userdata/guisettings.xml ] ; then - echo "" > $HOME/.xbmc/userdata/guisettings.xml - - cat >> $HOME/.xbmc/userdata/guisettings.xml << EOF - - $HOME/screenshots/ - -EOF - - # - # include project specific options - # - - if [ -f /usr/share/xbmc/config/guisettings.xml ]; then - cat /usr/share/xbmc/config/guisettings.xml >> $HOME/.xbmc/userdata/guisettings.xml - fi - - # - # common setup for amd and nvidia graphic - # - - # Always sync to vblank - if [ "$GPUTYPE" = "NVIDIA" -o "$GPUTYPE" = "AMD" ] ; then - cat >> $HOME/.xbmc/userdata/guisettings.xml << EOF - - 2 - -EOF - fi - echo "" >> $HOME/.xbmc/userdata/guisettings.xml - fi diff --git a/packages/mediacenter/xbmc-rpi/init.d/93_xbmc b/packages/mediacenter/xbmc-rpi/init.d/93_xbmc deleted file mode 100644 index 6fb03041e9..0000000000 --- a/packages/mediacenter/xbmc-rpi/init.d/93_xbmc +++ /dev/null @@ -1,116 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -# starting XBMC -# -# runlevels: openelec - -LIRCDEV="/var/run/lirc/lircd" -[ -e /var/run/lirc/lircd.irtrans ] && LIRCDEV="/var/run/lirc/lircd.irtrans" -XBMC_ARGS="--standalone -fs --lircdev $LIRCDEV" - -progress "starting XBMC" - -# hack for Boxee Remote -if grep -q "Vendor=0471 Product=20d9" /proc/bus/input/devices; then - export SDL_MOUSE_RELATIVE=0 -fi - -# hack: make addon-bins executable - chmod +x /storage/.xbmc/addons/*/bin/* > /dev/null 2>&1 - -# hack to support user installed fonts - SUBFONTS="/storage/.xbmc/userdata/fonts" - if [ -d "$SUBFONTS" ]; then - files=$(ls $SUBFONTS/*.[tT][tT][fF] 2>/dev/null | wc -l) - if [ "$files" = "0" ]; then - cp /usr/share/xbmc/media/Fonts/*.[tT][tT][fF] $SUBFONTS/ - fi - mount --bind $SUBFONTS /usr/share/xbmc/media/Fonts/ - fi - -# starting autostart script (will be removed later again, dont use it!!!) - AUTOSTART="/storage/.config/autostart.sh" - if [ -f $AUTOSTART ]; then - echo "!!! AUTOSTART script detected !!!" >> /var/log/messages - cat "$AUTOSTART" >> /var/log/messages - echo "!!! -End of autostart script- !!!" >> /var/log/messages - - sh $AUTOSTART - fi - -# starting autoupdate - [ -f /usr/bin/autoupdate ] && /usr/bin/autoupdate & - -# waiting for Xorg to start - wait_for_xorg - -# set cpu's to 'conservative' - ( usleep 15000000 - progress "set cpu's to 'conservative'" - cpupower frequency-set -g conservative > /dev/null 2>&1 - )& - -# prevent restrating XBMC at reboot or shutdown - LOCKDIR="/var/lock/" - LOCKFILE="xbmc.disabled" - [ -f "$LOCKDIR/$LOCKFILE" ] && rm -f "$LOCKDIR/$LOCKFILE" & - -# starting XBMC - usleep $XBMC_STARTDELAY - while true; do - - while [ -f "$LOCKDIR/$LOCKFILE" ]; do - usleep 250000 - done - - DISPLAY=:0.0 /usr/lib/xbmc/xbmc.bin $XBMC_ARGS > /dev/null 2>&1 - RET=$? - - case "$RET" in - 0) - if [ ! $(pidof console-kit-daemon) ]; then - touch "$LOCKDIR/$LOCKFILE" - poweroff -f - fi - ;; - 64) - if [ ! $(pidof console-kit-daemon) ]; then - touch "$LOCKDIR/$LOCKFILE" - poweroff -f - fi - ;; - 66) - if [ ! $(pidof console-kit-daemon) ]; then - touch "$LOCKDIR/$LOCKFILE" - reboot - fi - ;; - 255) - echo "Abnormal Exit. Exited with code $RET" - echo "is Xorg running? check /var/log/Xorg.log" - ;; - *) - echo "Abnormal Exit. Exited with code $RET" - ;; - esac - - usleep 250000 - done diff --git a/packages/mediacenter/xbmc-rpi/install b/packages/mediacenter/xbmc-rpi/install deleted file mode 100755 index 134e62c73e..0000000000 --- a/packages/mediacenter/xbmc-rpi/install +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -PYTHON_LIBDIR="`ls -d $INSTALL/usr/lib/python*`" - -mkdir -p $INSTALL/usr/bin - cp $PKG_DIR/scripts/cputemp $INSTALL/usr/bin - cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin - cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin - cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi - -mkdir -p $INSTALL/usr/lib/xbmc - cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc - if [ "$DISPLAYSERVER" = "xorg-server" ]; then - cp $PKG_BUILD/xbmc-xrandr $INSTALL/usr/lib/xbmc - fi - -cd $PKG_BUILD - find system addons \ - -regextype posix-extended -type f \ - -not -iregex ".*svn.*|.*win32(dx)?\.vis|.*osx\.vis" \ - -iregex ".*-linux.*|.*-arm.*|.*\.vis|.*\.xbs" \ - -exec install -D "{}" $ROOT/$INSTALL/usr/lib/xbmc/"{}" ";" - - find addons language media sounds userdata system \ - -regextype posix-extended -type f \ - -not -iregex ".*-linux.*|.*-arm.*|.*\.vis|.*\.xbs|.*svn.*|.*\.orig|.*\.so|.*\.dll|.*\.pyd|.*python/.*\.zlib" \ - -exec install -D -m 0644 "{}" $ROOT/$INSTALL/usr/share/xbmc/"{}" ";" -cd - - -if [ ! "$XBMC_SCR_RSXS" = yes ]; then - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/screensaver.rsxs.* -fi - -if [ ! "$XBMC_VIS_PROJECTM" = yes ]; then - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.projectm -fi - -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.dxspectrum -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.itunes -rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.milkdrop - -# overriding Splash image -mkdir -p $INSTALL/usr/share/xbmc/media - rm -rf $INSTALL/usr/share/xbmc/media/Splash.png -# if [ -f $PROJECT_DIR/$PROJECT/splash/splash.png ]; then -# cp $PROJECT_DIR/$PROJECT/splash/splash.png $INSTALL/usr/share/xbmc/media/Splash.png -# else -# cp $PKG_DIR/splash/splash.png $INSTALL/usr/share/xbmc/media/Splash.png -# fi - -# cleanup and python addon fixes - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pil - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.simplejson - -mkdir -p $INSTALL/usr/share/xbmc/addons - cp -R $PKG_DIR/config/os.openelec.tv $INSTALL/usr/share/xbmc/addons - $SED "s|@OS_VERSION@|$OS_VERSION|g" -i $INSTALL/usr/share/xbmc/addons/os.openelec.tv/addon.xml - cp -R $PKG_DIR/config/repository.openelec.tv $INSTALL/usr/share/xbmc/addons - $SED "s|@ADDON_URL@|$ADDON_URL|g" -i $INSTALL/usr/share/xbmc/addons/repository.openelec.tv/addon.xml - -mkdir -p $PYTHON_LIBDIR/site-packages/xbmc - cp -R $PKG_BUILD/tools/EventClients/lib/python/* $PYTHON_LIBDIR/site-packages/xbmc - -# install powermanagement hooks - mkdir -p $INSTALL/etc/pm/sleep.d - cp $PKG_DIR/sleep.d/* $INSTALL/etc/pm/sleep.d - -# install project specific configs - mkdir -p $INSTALL/usr/share/xbmc/config - if [ -f $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml ]; then - cp -R $PROJECT_DIR/$PROJECT/xbmc/guisettings.xml $INSTALL/usr/share/xbmc/config - fi - - if [ -f $PROJECT_DIR/$PROJECT/xbmc/sources.xml ]; then - cp -R $PROJECT_DIR/$PROJECT/xbmc/sources.xml $INSTALL/usr/share/xbmc/config - fi - - mkdir -p $INSTALL/usr/share/xbmc/system/ - if [ -f $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml ]; then - cp $PROJECT_DIR/$PROJECT/xbmc/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ - else - cp $PKG_DIR/config/advancedsettings.xml $INSTALL/usr/share/xbmc/system/ - fi - -if [ "$XBMC_EXTRA_FONTS" = yes ]; then - mkdir -p $INSTALL/usr/share/xbmc/media/Fonts - cp $PKG_DIR/fonts/*.ttf $INSTALL/usr/share/xbmc/media/Fonts -fi diff --git a/packages/mediacenter/xbmc-rpi/meta b/packages/mediacenter/xbmc-rpi/meta deleted file mode 100644 index 41fd39d83b..0000000000 --- a/packages/mediacenter/xbmc-rpi/meta +++ /dev/null @@ -1,176 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc-rpi" -PKG_VERSION="efef226" -PKG_REV="1" -PKG_ARCH="any" -PKG_LICENSE="GPL" -PKG_SITE="http://www.xbmc.org" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="boost Python zlib bzip2 systemd pcre ffmpeg libass curl libssh rtmpdump fontconfig tinyxml freetype libmad libogg libmodplug faad2 flac libmpeg2 yajl sqlite bc xbmc-addon-settings" -PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi tinyxml libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libcdio libmodplug faad2 flac libmpeg2 yajl sqlite mysql" -PKG_PRIORITY="optional" -PKG_SECTION="mediacenter" -PKG_SHORTDESC="xbmc: XBMC Mediacenter" -PKG_LONGDESC="XBMC Media Center (which was formerly named Xbox Media Center) is a free and open source cross-platform media player and home entertainment system software with a 10-foot user interface designed for the living-room TV. Its graphical user interface allows the user to easily manage video, photos, podcasts, and music from a computer, optical disk, local network, and the internet using a remote control." -PKG_IS_ADDON="no" - -PKG_AUTORECONF="no" - -# needed for hosttools (Texturepacker) - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS lzo-host SDL-host SDL_image-host" - -# some python stuff needed for various addons - PKG_DEPENDS="$PKG_DEPENDS Imaging" - PKG_DEPENDS="$PKG_DEPENDS simplejson" - -if [ "$DISPLAYSERVER" = "xorg-server" ]; then - # for libX11 support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" - PKG_DEPENDS="$PKG_DEPENDS libX11 libXext" - - # for libXrandr support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXrandr" - PKG_DEPENDS="$PKG_DEPENDS libXrandr" - - # for SDL support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS SDL SDL_image" - PKG_DEPENDS="$PKG_DEPENDS SDL SDL_image" -fi - -if [ "$OPENGL_SUPPORT" = yes ]; then - # for OpenGL (GLX) support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS $OPENGL glew" - PKG_DEPENDS="$PKG_DEPENDS $OPENGL glew" -fi - -if [ "$OPENGLES_SUPPORT" = yes ]; then - # for OpenGL-ES support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS $OPENGLES" - PKG_DEPENDS="$PKG_DEPENDS $OPENGLES" -fi - -# for dbus support - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS dbus" - PKG_DEPENDS="$PKG_DEPENDS dbus" - -if [ "$ALSA_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS alsa-lib" - PKG_DEPENDS="$PKG_DEPENDS alsa alsa-lib" -fi - -if [ "$PULSEAUDIO_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS pulseaudio" - PKG_DEPENDS="$PKG_DEPENDS pulseaudio" -fi - -if [ "$CEC_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libcec" - PKG_DEPENDS="$PKG_DEPENDS libcec" -fi - -if [ "$XBMC_SCR_RSXS" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libXt libXmu" - PKG_DEPENDS="$PKG_DEPENDS libXt libXmu" -fi - -if [ "$FAAC_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS faac" - PKG_DEPENDS="$PKG_DEPENDS faac" -fi - -if [ "$ENCODER_LAME" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS lame" - PKG_DEPENDS="$PKG_DEPENDS lame" -fi - -if [ "$ENCODER_VORBIS" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libvorbis" - PKG_DEPENDS="$PKG_DEPENDS libvorbis" -fi - -if [ "$BLURAY_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libbluray" - PKG_DEPENDS="$PKG_DEPENDS libbluray" -fi - -if [ "$AVAHI_DAEMON" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS avahi" - PKG_DEPENDS="$PKG_DEPENDS avahi" -fi - -if [ "$AIRPLAY_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libplist" - PKG_DEPENDS="$PKG_DEPENDS libplist" -fi - -if [ "$AIRTUNES_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libshairport" - PKG_DEPENDS="$PKG_DEPENDS libshairport" -fi - -if [ "$NFS_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libnfs" - PKG_DEPENDS="$PKG_DEPENDS libnfs" -fi - -if [ "$AFP_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS afpfs-ng" - PKG_DEPENDS="$PKG_DEPENDS afpfs-ng" -fi - -if [ "$SAMBA_CLIENT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS samba" - PKG_DEPENDS="$PKG_DEPENDS samba" -fi - -if [ "$WEBSERVER" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libmicrohttpd" -fi - -if [ "$OPENMAX_SUPPORT" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS $OPENMAX" - PKG_DEPENDS="$PKG_DEPENDS $OPENMAX" -fi - -if [ "$VDPAU" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libvdpau" - PKG_DEPENDS="$PKG_DEPENDS libvdpau" -fi - -if [ "$VAAPI" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libva" - PKG_DEPENDS="$PKG_DEPENDS libva" -fi - -if [ "$CRYSTALHD" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS crystalhd" - PKG_DEPENDS="$PKG_DEPENDS crystalhd" -fi - -if [ "$XVBA" = yes ]; then - PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" -fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi diff --git a/packages/mediacenter/xbmc-rpi/patches/rename.sh b/packages/mediacenter/xbmc-rpi/patches/rename.sh deleted file mode 100755 index 21b155f7be..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/rename.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -for i in `ls xbmc-*.patch`; do - mv $i `echo $i | sed "s,$1,$2,g"` -done diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-001-add_support_to_specify_GIT_REV-0.1.patch deleted file mode 100644 index c013e0ae3a..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-001-add_support_to_specify_GIT_REV-0.1.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur xbmc-9389dc8/configure.in xbmc-9389dc8.patch/configure.in ---- xbmc-9389dc8/configure.in 2011-09-01 17:21:47.000000000 +0200 -+++ xbmc-9389dc8.patch/configure.in 2011-09-01 23:30:40.419399392 +0200 -@@ -428,6 +428,14 @@ - esac - AC_SUBST([ARCH]) - -+AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) -+if test "$HAVE_GIT" = "yes" -a "$GIT_REV" = ""; then -+ GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') -+elif test "$GIT_REV" = ""; then -+ GIT_REV="Unknown" -+fi -+final_message="$final_message\n git Rev.:\t${GIT_REV}" -+ - # platform debug flags - if test "$use_debug" = "yes"; then - final_message="$final_message\n Debugging:\tYes" -@@ -1177,7 +1185,6 @@ - fi - fi - --AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) - - # Checks for header files. - AC_HEADER_DIRENT -@@ -1408,12 +1415,6 @@ - final_message="$final_message\n Avahi:\tNo" - fi - --if test "$HAVE_GIT" = "yes"; then -- GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') --fi --if test "$GIT_REV" = ""; then -- GIT_REV="Unknown" --fi - if test "$host_vendor" = "apple"; then - echo "#define GIT_REV \"$GIT_REV\"" > git_revision.h - else diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-303-fix_libdvd_xFLAGS-0.1.patch deleted file mode 100644 index 5e76acefe4..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-303-fix_libdvd_xFLAGS-0.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 05:01:20.091837122 +0200 -@@ -6,5 +6,5 @@ - Name: libdvdcss - Description: DVD access and decryption library. - Version: @VERSION@ --Libs: -L${libdir} -ldvdcss --Cflags: -I{includedir} -I${includedir}/@PACKAGE@ -+Libs: -ldvdcss -+Cflags: -I. -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 05:01:20.549828701 +0200 -@@ -56,17 +56,17 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $dvdread_cflags $extracflags $threadcflags -+ echo $dvdread_cflags $extracflags $threadcflags - fi - - if test "$echo_minicflags" = "yes"; then -- echo -I$prefix/include -I$prefix/include/dvdnav $extracflags $threadcflags -+ echo $extracflags $threadcflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir -ldvdnav $dvdread_libs $threadlib -+ echo -ldvdnav $dvdread_libs $threadlib - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L$libdir -ldvdnavmini $threadlib -+ echo -ldvdnavmini $threadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 05:01:20.624827321 +0200 -@@ -76,13 +76,13 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -I@includedir@/libdvdread @THREAD_CFLAGS@ -+ echo @THREAD_CFLAGS@ - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdnav -ldvdread @THREAD_LIBS@ -+ echo -ldvdnav -ldvdread @THREAD_LIBS@ - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L@libdir@ -ldvdnavmini @THREAD_LIBS@ -+ echo -ldvdnavmini @THREAD_LIBS@ - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 05:01:21.042819641 +0200 -@@ -7,5 +7,5 @@ - Description: DVD Navigation mini library - Version: @VERSION@ - --Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 05:01:21.262815601 +0200 -@@ -8,5 +8,5 @@ - Version: @VERSION@ - - Requires.private: dvdread >= 4.1.2 --Cflags: -I${includedir} @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 05:01:21.278815307 +0200 -@@ -72,9 +72,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -+ echo "" - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdread -+ echo -ldvdread - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 05:01:21.278815307 +0200 -@@ -48,9 +48,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $extracflags -+ echo $extracflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir $dvdreadlib -+ echo $dvdreadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 05:01:21.279815289 +0200 -@@ -7,5 +7,5 @@ - Description: Low level DVD access library - Version: @VERSION@ - --Cflags: -I${includedir} --Libs: -L${libdir} -ldvdread -+Cflags: -I. -+Libs: -ldvdread diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-311-fix_rsxs_build-0.1.patch deleted file mode 100644 index fe0ee49cab..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-311-fix_rsxs_build-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h ---- xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-09-27 15:56:19.000000000 +0200 -+++ xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-10-16 02:13:13.805433847 +0200 -@@ -17,7 +17,7 @@ - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - --#if !_LIBC -+#if 0 - /* This code is written for inclusion in gnu-libc, and uses names in the - namespace reserved for libc. If we're not compiling in libc, define those - names to be the normal ones instead. */ diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-321-texturepacker-hostflags-and-rework.patch deleted file mode 100644 index cbe5891222..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-321-texturepacker-hostflags-and-rework.patch +++ /dev/null @@ -1,190 +0,0 @@ -diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in ---- xbmc-frodo-433f681/configure.in 2012-06-15 02:52:26.000000000 +0200 -+++ xbmc-frodo-433f681.patch/configure.in 2012-06-19 05:26:41.472596903 +0200 -@@ -405,6 +405,12 @@ - [use_texturepacker=$enableval], - [use_texturepacker=auto]) - -+AC_ARG_WITH([texturepacker-root], -+ [AS_HELP_STRING([--with-texturepacker-root], -+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], -+ [use_texturepacker_root=$withval], -+ [use_texturepacker_root=$prefix]) -+ - AC_ARG_WITH([lirc-device], - [AS_HELP_STRING([--with-lirc-device=file], - [specify the default LIRC device (default is /dev/lircd)])], -@@ -516,8 +522,7 @@ - use_cpu=cortex-a8 - check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] - if test "x$check_sdl_arch" = "xi386"; then -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" -+ use_texturepacker_root="/opt/local" - else - use_texturepacker=no - fi -@@ -533,8 +538,6 @@ - *86*-apple-darwin*) - use_joystick=no - use_vtbdecoder=no -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" - ARCH="x86-osx" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") - ;; -@@ -1756,13 +1759,13 @@ - - USE_TEXTUREPACKER_NATIVE=0 - if test "x$use_texturepacker" != "xno"; then -- final_message="$final_message\n TexturePacker:Yes" - USE_TEXTUREPACKER=1 -- if test "x$use_texturepacker_native" = "xyes"; then -+ if test "x$cross_compiling" = "xyes"; then - USE_TEXTUREPACKER_NATIVE=1 -- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then -- USE_TEXTUREPACKER_NATIVE_ROOT= -- fi -+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" -+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" -+ else -+ final_message="$final_message\n TexturePacker:Yes" - fi - else - final_message="$final_message\n TexturePacker:No" -diff -Naur xbmc-frodo-433f681/lib/libsquish/Makefile.in xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in ---- xbmc-frodo-433f681/lib/libsquish/Makefile.in 2012-06-15 02:51:53.000000000 +0200 -+++ xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in 2012-06-19 05:42:20.313119617 +0200 -@@ -11,31 +11,34 @@ - singlecolourfit.cpp \ - squish.cpp - --CXXFLAGS+=-I. -+LIB = libsquish.a -+NATIVE_LIB = libsquish-native.so -+CLEAN_FILES += $(NATIVE_LIB) -+ -+HOST_CXX ?= g++ -+CXXFLAGS += -I. -+HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif - --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -- - ifeq ($(findstring osx,$(ARCH)),osx) --NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) -+ HOST_CXXFLAGS += $(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) - endif - --all: $(LIB) $(NATIVE_LIB) -+$(LIB): $(SRCS) -+ - # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. - $(NATIVE_LIB): $(SRCS) - ifeq ($(findstring osx,$(ARCH)),osx) -- g++ $(NATIVE_ARCH) -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ - else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ --endif -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ - endif - - include ../../Makefile.include -diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in ---- xbmc-frodo-433f681/tools/TexturePacker/Makefile.in 2012-06-15 02:52:20.000000000 +0200 -+++ xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in 2012-06-19 05:35:15.349564918 +0200 -@@ -1,48 +1,51 @@ --DEFINES += -D_LINUX -DUSE_LZO_PACKING -+DEFINES += -D_LINUX -DUSE_LZO_PACKING - ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) --DEFINES += -DHOST_BIGENDIAN -+DEFINES += -DHOST_BIGENDIAN - endif - --CXXFLAGS+= \ -+SRCS = \ -+ md5.cpp \ -+ SDL_anigif.cpp \ -+ XBTFWriter.cpp \ -+ XBMCTex.cpp \ -+ @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -+ -+TARGET = TexturePacker -+CLEAN_FILES = $(TARGET) -+ -+all: $(TARGET) -+ -+HOST_CXX ?= g++ -+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ -+ -+LIBS += -lSDL_image -lSDL -llzo2 -+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish -+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 -+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native -+ -+CXXFLAGS += \ - -I. \ - -I@abs_top_srcdir@/lib \ - -I@abs_top_srcdir@/xbmc \ - -I@abs_top_srcdir@/xbmc/linux - --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@ --ifdef NATIVE_ROOT_PATH -+HOST_CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux \ -+ -I$(HOST_ROOT_PATH)/include -+ - ifeq ($(findstring osx,@ARCH@),osx) - DEFINES += -DTARGET_DARWIN - NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) - endif --CXXFLAGS+= -I$(NATIVE_ROOT_PATH)/include --LIBS += -L$(NATIVE_ROOT_PATH)/lib --endif --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native --else --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish --endif -- --LIBS += -lSDL_image -lSDL -llzo2 -- --SRCS = \ -- md5.cpp \ -- SDL_anigif.cpp \ -- XBTFWriter.cpp \ -- XBMCTex.cpp \ -- @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -- -- --TARGET = TexturePacker --CLEAN_FILES=$(TARGET) -- --all: $(TARGET) - - ifeq (@USE_TEXTUREPACKER_NATIVE@,1) - # TexturePacker run native on build system, build it with native tools - $(TARGET): $(SRCS) -- g++ $(DEFINES) $(NATIVE_ARCH) $(CXXFLAGS) $(SRCS) $(LIBS) -o $(TARGET) -+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) - clean: - rm -f $(TARGET) - else diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index b8f5b8afcf..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -885,6 +885,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # Python -@@ -1547,6 +1550,7 @@ - `if test "$use_arch" != "no"; then echo --arch=$use_arch; fi`\ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - --target-os=$(tolower $(uname -s)) \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch deleted file mode 100644 index 821c1cc7bd..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -Naur xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -335,11 +335,9 @@ - // at http://docs.python.org/using/cmdline.html#environment-variables - - #if !defined(_WIN32) -- /* PYTHONOPTIMIZE is set off intentionally when using external Python. -- Reason for this is because we cannot be sure what version of Python -- was used to compile the various Python object files (i.e. .pyo, -- .pyc, etc.). */ -- // check if we are running as real xbmc.app or just binary -+ // Required for python to find optimized code (pyo) files -+ setenv("PYTHONOPTIMIZE", "1", 1); -+ // check if we are running as real xbmc.app or just binary - if (!CUtil::GetFrameworksPath(true).IsEmpty()) - { - // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-452-change_lcd_content-0.1.patch deleted file mode 100644 index 0427b534f9..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-452-change_lcd_content-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-pvr-3513480/userdata/LCD.xml xbmc-pvr-3513480.patch/userdata/LCD.xml ---- xbmc-pvr-3513480/userdata/LCD.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/userdata/LCD.xml 2011-04-25 05:27:34.956125133 +0200 -@@ -21,7 +21,7 @@ - Freemem: $INFO[System.FreeMemory] - - -- XBMC running... -+ *** OpenELEC *** - $INFO[System.Time] $INFO[System.Date] - Freemem: $INFO[System.FreeMemory] - $INFO[System.ScreenWidth]x$INFO[System.ScreenHeight] $INFO[System.ScreenMode] diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-453-add_openelec.tv_RSS_news-0.1.patch deleted file mode 100644 index 5b32c0cce7..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-453-add_openelec.tv_RSS_news-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/userdata/RssFeeds.xml xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml ---- xbmc-10.1-Dharma/userdata/RssFeeds.xml 2011-03-08 02:49:24.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml 2011-06-14 17:07:08.450880123 +0200 -@@ -3,6 +3,7 @@ - - - -+ http://openelec.tv/news?format=feed&type=rss - http://feeds.feedburner.com/xbmc - - diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-454-disable_backslash-0.1.patch deleted file mode 100644 index 0888920258..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-454-disable_backslash-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-30a9070/system/keymaps/keyboard.xml xbmc-30a9070.patch/system/keymaps/keyboard.xml ---- xbmc-30a9070/system/keymaps/keyboard.xml 2011-07-28 06:20:13.000000000 +0200 -+++ xbmc-30a9070.patch/system/keymaps/keyboard.xml 2011-07-28 09:39:57.210973380 +0200 -@@ -90,7 +90,7 @@ - Number7 - Number8 - Number9 -- ToggleFullScreen -+ - FirstPage - LastPage - diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-457-fix_connection_check-0.1.patch deleted file mode 100644 index 9488def289..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-457-fix_connection_check-0.1.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Naur a/xbmc/filesystem/CurlFile.cpp b/xbmc/filesystem/CurlFile.cpp ---- a/xbmc/filesystem/CurlFile.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ b/xbmc/filesystem/CurlFile.cpp 2011-10-17 19:21:04.180783870 +0200 -@@ -803,9 +803,9 @@ - // Detect whether we are "online" or not! Very simple and dirty! - bool CFileCurl::IsInternet(bool checkDNS /* = true */) - { -- CStdString strURL = "http://www.google.com"; -+ CStdString strURL = "http://www.openelec.tv"; - if (!checkDNS) -- strURL = "http://74.125.19.103"; // www.google.com ip -+ strURL = "http://212.101.13.10"; // www.openelec.tv ip - - bool found = Exists(strURL); - Close(); diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-462-add_remote_irtrans_mediacenter-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-462-add_remote_irtrans_mediacenter-0.1.patch deleted file mode 100644 index 0edef5a7a5..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-462-add_remote_irtrans_mediacenter-0.1.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -Naur xbmc-pvr-3513480/system/Lircmap.xml xbmc-pvr-3513480.patch/system/Lircmap.xml ---- xbmc-pvr-3513480/system/Lircmap.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/system/Lircmap.xml 2011-04-25 05:31:39.632429078 +0200 -@@ -409,4 +409,48 @@ - KEY_YELLOW - KEY_BLUE - -+ -+ pause -+ stop -+ fwd -+ rew -+ left -+ right -+ up -+ down -+ -+ ch+ -+ ch- -+ back -+ clear -+ play -+ info -+ next -+ prev -+ teletext -+ ehome -+ rec -+ vol+ -+ vol- -+ mute -+ power -+ video -+ music -+ pictures -+ tv -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 0 -+ red -+ green -+ yellow -+ blue -+ - diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-463-add_remote_devinput-0.1.patch deleted file mode 100644 index 85d635b61b..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-463-add_remote_devinput-0.1.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/Lircmap.xml xbmc-10.1-Dharma.patch/system/Lircmap.xml ---- xbmc-10.1-Dharma/system/Lircmap.xml 2011-06-18 01:43:43.132101246 +0200 -+++ xbmc-10.1-Dharma.patch/system/Lircmap.xml 2011-06-18 01:44:53.777025290 +0200 -@@ -365,7 +365,6 @@ - - - cx23885_remote -- devinput - KEY_LEFT - KEY_RIGHT - KEY_UP -@@ -452,4 +451,59 @@ - yellow - blue - -+ -+ -+ KEY_LEFT -+ KEY_RIGHT -+ KEY_UP -+ KEY_DOWN -+ -+ KEY_ENTER -+ KEY_DELETE -+ KEY_PROG1 -+ KEY_EXIT -+ KEY_RECORD -+ KEY_PLAY -+ KEY_PAUSE -+ KEY_STOP -+ KEY_FASTFORWARD -+ KEY_REWIND -+ KEY_VOLUMEUP -+ KEY_VOLUMEDOWN -+ KEY_CHANNELUP -+ KEY_CHANNELDOWN -+ KEY_NEXT -+ KEY_PREVIOUS -+ KEY_EPG -+ KEY_SUBTITLE -+ KEY_LANGUAGE -+ KEY_INFO -+ KEY_ZOOM -+ KEY_MUTE -+ KEY_POWER -+ KEY_EJECT -+ KEY_DVD -+ KEY_MENU -+ KEY_VIDEO -+ KEY_AUDIO -+ KEY_CAMERA -+ KEY_TUNER -+ KEY_TEXT -+ KEY_NUMERIC_1 -+ KEY_NUMERIC_2 -+ KEY_NUMERIC_3 -+ KEY_NUMERIC_4 -+ KEY_NUMERIC_5 -+ KEY_NUMERIC_6 -+ KEY_NUMERIC_7 -+ KEY_NUMERIC_8 -+ KEY_NUMERIC_9 -+ KEY_NUMERIC_0 -+ KEY_NUMERIC_STAR -+ KEY_NUMERIC_POUND -+ KEY_RED -+ KEY_GREEN -+ KEY_YELLOW -+ KEY_BLUE -+ - diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-464-add_eject_keymapping_for_lirc-0.1.patch deleted file mode 100644 index 56c56016b5..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-464-add_eject_keymapping_for_lirc-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/keymaps/remote.xml xbmc-10.1-Dharma.patch/system/keymaps/remote.xml ---- xbmc-10.1-Dharma/system/keymaps/remote.xml 2011-03-08 02:49:23.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/system/keymaps/remote.xml 2011-06-18 01:48:26.887811969 +0200 -@@ -63,6 +63,7 @@ - VolumeDown - Mute - XBMC.ShutDown() -+ XBMC.EjectTray() - XBMC.ActivateWindow(MyVideos) - XBMC.ActivateWindow(MyMusic) - XBMC.ActivateWindow(MyPictures) diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-607-enable_ae_for_movie_gui.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-607-enable_ae_for_movie_gui.patch deleted file mode 100644 index 521b40d724..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-607-enable_ae_for_movie_gui.patch +++ /dev/null @@ -1,154 +0,0 @@ -diff -Naur xbmc-rpi-2acdae7/configure.in xbmc-rpi-2acdae7.patch/configure.in ---- xbmc-rpi-2acdae7/configure.in 2012-07-20 00:27:10.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/configure.in 2012-07-20 03:55:07.680124127 +0200 -@@ -591,7 +591,7 @@ - use_armv6="yes" - use_armvfp="yes" - use_hardcoded_tables="yes" -- use_alsa="no" -+ use_alsa="yes" - USE_TEXTUREPACKER_NATIVE_ROOT="$TEXTUREPACKER_NATIVE_ROOT" - ARCH="arm" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI") -diff -Naur xbmc-rpi-2acdae7/xbmc/cores/AudioEngine/AEFactory.cpp xbmc-rpi-2acdae7.patch/xbmc/cores/AudioEngine/AEFactory.cpp ---- xbmc-rpi-2acdae7/xbmc/cores/AudioEngine/AEFactory.cpp 2012-07-20 00:27:35.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/xbmc/cores/AudioEngine/AEFactory.cpp 2012-07-20 03:55:07.680124127 +0200 -@@ -119,10 +119,6 @@ - - bool CAEFactory::StartEngine() - { --#if defined(TARGET_RASPBERRY_PI) -- return true; --#endif -- - if (!AE) - return false; - -diff -Naur xbmc-rpi-2acdae7/xbmc/cores/AudioEngine/AESinkFactory.cpp xbmc-rpi-2acdae7.patch/xbmc/cores/AudioEngine/AESinkFactory.cpp ---- xbmc-rpi-2acdae7/xbmc/cores/AudioEngine/AESinkFactory.cpp 2012-07-20 00:27:35.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/xbmc/cores/AudioEngine/AESinkFactory.cpp 2012-07-20 03:55:07.723124715 +0200 -@@ -28,7 +28,7 @@ - #if defined(TARGET_WINDOWS) - #include "Sinks/AESinkWASAPI.h" - #include "Sinks/AESinkDirectSound.h" --#elif (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) && !defined(TARGET_RASPBERRY_PI) -+#elif (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) - #if defined(HAS_ALSA) - #include "Sinks/AESinkALSA.h" - #endif -@@ -106,7 +106,7 @@ - else - TRY_SINK(DirectSound) /* Always fall back to DirectSound */ - --#elif (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) && !defined(TARGET_RASPBERRY_PI) -+#elif (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) - - #if defined(HAS_ALSA) - if (driver.empty() || driver == "ALSA") -@@ -154,7 +154,7 @@ - ENUMERATE_SINK(ALSA); - #endif - --#if (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) && !defined(TARGET_RASPBERRY_PI) -+#if (defined(TARGET_LINUX) || defined(TARGET_FREEBSD)) - ENUMERATE_SINK(OSS); - #endif - -diff -Naur xbmc-rpi-2acdae7/xbmc/cores/omxplayer/OMXPlayer.cpp xbmc-rpi-2acdae7.patch/xbmc/cores/omxplayer/OMXPlayer.cpp ---- xbmc-rpi-2acdae7/xbmc/cores/omxplayer/OMXPlayer.cpp 2012-07-20 00:27:35.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/xbmc/cores/omxplayer/OMXPlayer.cpp 2012-07-20 03:55:07.743124988 +0200 -@@ -73,6 +73,9 @@ - - #include "LangInfo.h" - -+#include "cores/AudioEngine/AEFactory.h" -+#include "cores/AudioEngine/Utils/AEUtil.h" -+ - using namespace XFILE; - - // **************************************************************** -@@ -920,6 +923,9 @@ - return; - } - -+ /* shutdown AE */ -+ CAEFactory::Shutdown(); -+ - m_player_video.EnableFullscreen(true); - - OpenDefaultStreams(); -@@ -1862,6 +1868,13 @@ - - // set event to inform openfile something went wrong in case openfile is still waiting for this event - m_ready.Set(); -+ -+ /* start AE again */ -+ CAEFactory::LoadEngine(); -+ CAEFactory::StartEngine(); -+ -+ CAEFactory::SetMute (g_settings.m_bMute); -+ CAEFactory::SetSoundMode(g_guiSettings.GetInt("audiooutput.guisoundmode")); - } - - void COMXPlayer::HandleMessages() -diff -Naur xbmc-rpi-2acdae7/xbmc/settings/GUISettings.cpp xbmc-rpi-2acdae7.patch/xbmc/settings/GUISettings.cpp ---- xbmc-rpi-2acdae7/xbmc/settings/GUISettings.cpp 2012-07-20 00:27:26.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/xbmc/settings/GUISettings.cpp 2012-07-20 03:55:07.745125016 +0200 -@@ -476,7 +476,7 @@ - #if !defined(TARGET_DARWIN_IOS) && !defined(TARGET_RASPBERRY_PI) - AddBool(aocat, "audiooutput.multichannellpcm" , 348, true ); - #endif --#if !defined(TARGET_DARWIN) && !defined(TARGET_RASPBERRY_PI) -+#if !defined(TARGET_DARWIN) - AddBool(aocat, "audiooutput.truehdpassthrough", 349, true ); - AddBool(aocat, "audiooutput.dtshdpassthrough" , 347, true ); - #endif -@@ -490,11 +490,6 @@ - #endif - AddString(ao, "audiooutput.audiodevice", 545, defaultDeviceName.c_str(), SPIN_CONTROL_TEXT); - AddString(NULL, "audiooutput.passthroughdevice", 546, defaultDeviceName.c_str(), SPIN_CONTROL_TEXT); --#elif defined(TARGET_RASPBERRY_PI) -- CStdString defaultDeviceName = "Default"; -- AddString(NULL, "audiooutput.audiodevice", 545, defaultDeviceName.c_str(), SPIN_CONTROL_TEXT); -- AddString(NULL, "audiooutput.passthroughdevice", 546, defaultDeviceName.c_str(), SPIN_CONTROL_TEXT); --#else - AddSeparator(ao, "audiooutput.sep1"); - AddString (ao, "audiooutput.audiodevice" , 545, CStdString(CAEFactory::GetDefaultDevice(false)), SPIN_CONTROL_TEXT); - AddString (ao, "audiooutput.passthroughdevice", 546, CStdString(CAEFactory::GetDefaultDevice(true )), SPIN_CONTROL_TEXT); -diff -Naur xbmc-rpi-2acdae7/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-rpi-2acdae7.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-rpi-2acdae7/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-07-20 00:27:26.000000000 +0200 -+++ xbmc-rpi-2acdae7.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-07-20 03:55:07.746125030 +0200 -@@ -1849,13 +1849,13 @@ - if (strSetting.Equals("audiooutput.audiodevice")) - { - CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID()); --#if defined(TARGET_DARWIN) || defined(TARGET_RASPBERRY_PI) -+#if defined(TARGET_DARWIN) - g_guiSettings.SetString("audiooutput.audiodevice", pControl->GetCurrentLabel()); - #else - g_guiSettings.SetString("audiooutput.audiodevice", m_AnalogAudioSinkMap[pControl->GetCurrentLabel()]); - #endif - } --#if !defined(TARGET_DARWIN) && !defined(TARGET_RASPBERRY_PI) -+#if !defined(TARGET_DARWIN) - else if (strSetting.Equals("audiooutput.passthroughdevice")) - { - CGUISpinControlEx *pControl = (CGUISpinControlEx *)GetControl(pSettingControl->GetID()); -@@ -2719,7 +2719,7 @@ - int selectedValue = -1; - AEDeviceList sinkList; - CAEFactory::EnumerateOutputDevices(sinkList, Passthrough); --#if !defined(TARGET_DARWIN) && !defined(TARGET_RASPBERRY_PI) -+#if !defined(TARGET_DARWIN) - if (sinkList.size()==0) - { - pControl->AddLabel("Error - no devices found", 0); -@@ -2748,7 +2748,7 @@ - } - - numberSinks = sinkList.size(); --#if !defined(TARGET_DARWIN) && !defined(TARGET_RASPBERRY_PI) -+#if !defined(TARGET_DARWIN) - } - #endif - diff --git a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-981-toggleButtonState.patch b/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-981-toggleButtonState.patch deleted file mode 100644 index 17a606f1b1..0000000000 --- a/packages/mediacenter/xbmc-rpi/patches/xbmc-rpi-efef226-981-toggleButtonState.patch +++ /dev/null @@ -1,304 +0,0 @@ -diff -Naur xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h ---- xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h 2011-12-10 22:16:22.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h 2011-12-17 18:43:42.183704449 +0100 -@@ -57,6 +57,7 @@ - virtual CStdString GetDescription() const; - void SetToggleSelect(const CStdString &toggleSelect); - void SetAltClickActions(const CGUIAction &clickActions); -+ bool IsSelected() const { return m_bSelected; }; - - protected: - virtual bool UpdateColors(); -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-17 18:43:42.216705084 +0100 -@@ -135,6 +135,11 @@ - - typedef struct { - PyObject_HEAD_XBMC_CONTROL -+ bool bIsSelected; -+ } ControlToggle; -+ -+ typedef struct { -+ PyObject_HEAD_XBMC_CONTROL - std::string strFont; - color_t textColor; - std::vector vecLabels; -@@ -263,7 +268,8 @@ - extern PyTypeObject ControlRadioButton_Type; - extern PyTypeObject ControlSlider_Type; - extern PyTypeObject ControlEdit_Type; -- -+ extern PyTypeObject ControlToggle_Type; -+ - CGUIControl* ControlLabel_Create(ControlLabel* pControl); - CGUIControl* ControlFadeLabel_Create(ControlFadeLabel* pControl); - CGUIControl* ControlTextBox_Create(ControlTextBox* pControl); -@@ -276,6 +282,7 @@ - CGUIControl* ControlRadioButton_Create(ControlRadioButton* pControl); - CGUIControl* ControlSlider_Create(ControlSlider* pControl); - CGUIControl* ControlEdit_Create(ControlEdit* pControl); -+ CGUIControl* ControlToggle_Create(ControlToggle* pControl); - - void initControl_Type(); - void initControlSpin_Type(); -@@ -291,6 +298,7 @@ - void initControlRadioButton_Type(); - void initControlSlider_Type(); - void initControlEdit_Type(); -+ void initControlToggle_Type(); - } - - #ifdef __cplusplus -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 2011-12-17 18:43:42.217705104 +0100 -@@ -0,0 +1,181 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include -+ -+#include "guilib/GUIToggleButtonControl.h" -+#include "guilib/GUIFontManager.h" -+#include "control.h" -+#include "pyutil.h" -+ -+using namespace std; -+ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+namespace PYXBMC -+{ -+ PyObject* ControlToggle_New( -+ PyTypeObject *type, -+ PyObject *args, -+ PyObject *kwds ) -+ { -+ static const char *keywords[] = { -+ "x", "y", "width", "height", "label", -+ "focusTexture", "noFocusTexture", -+ "textOffsetX", "textOffsetY", "alignment", -+ "font", "textColor", "disabledColor", "angle", "shadowColor", "focusedColor", NULL }; -+ ControlToggle *self; -+ char* cFont = NULL; -+ char* cTextureFocus = NULL; -+ char* cTextureNoFocus = NULL; -+ char* cTextColor = NULL; -+ char* cDisabledColor = NULL; -+ char* cShadowColor = NULL; -+ char* cFocusedColor = NULL; -+ -+ PyObject* pObjectText; -+ -+ self = (ControlToggle*)type->tp_alloc(type, 0); -+ if (!self) return NULL; -+ new(&self->bIsSelected) bool(); -+ -+ if (!PyArg_ParseTupleAndKeywords( -+ args, -+ kwds, -+ (char*)"llllO|sslllssslss", -+ (char**)keywords, -+ &self->dwPosX, -+ &self->dwPosY, -+ &self->dwWidth, -+ &self->dwHeight, -+ &pObjectText, -+ &cTextureFocus, -+ &cTextureNoFocus, -+ &cFont, -+ &cTextColor, -+ &cDisabledColor, -+ &cShadowColor, -+ &cFocusedColor)) -+ { -+ Py_DECREF( self ); -+ return NULL; -+ } -+ -+ -+ cTextureFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturefocus", (char*)"button-focus.png"); -+ cTextureNoFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturenofocus", (char*)"button-nofocus.jpg"); -+ -+ return (PyObject*)self; -+ } -+ -+ void ControlToggle_Dealloc(ControlToggle* self) -+ { -+ self->ob_type->tp_free((PyObject*)self); -+ } -+ -+ -+ // isSelected() Method -+ PyDoc_STRVAR(isSelected__doc__, -+ "isSelected() -- Returns the toggle buttons's selected status.\n" -+ "\n" -+ "example:\n" -+ " - is = self.togglebutton.isSelected()\n"); -+ -+ PyObject* ControlToggle_IsSelected(ControlToggle *self, PyObject *args) -+ { -+ bool isSelected = false; -+ -+ PyXBMCGUILock(); -+ if (self->pGUIControl) -+ isSelected = ((CGUIToggleButtonControl*)self->pGUIControl)->IsSelected(); -+ PyXBMCGUIUnlock(); -+ -+ return Py_BuildValue((char*)"b", isSelected); -+ } -+ -+ -+ PyMethodDef ControlToggle_methods[] = { -+ {(char*)"isSelected", (PyCFunction)ControlToggle_IsSelected, METH_VARARGS, isSelected__doc__}, -+ {NULL, NULL, 0, NULL} -+ }; -+ -+ // ControlRadioButton class -+ PyDoc_STRVAR(ControlToggle__doc__, -+ "ControlRadioButton class.\n" -+ "\n" -+ "ControlRadioButton(x, y, width, height, label[, focusTexture, noFocusTexture, textOffsetX, textOffsetY,\n" -+ " alignment, font, textColor, disabledColor, angle, shadowColor, focusedColor,\n" -+ " radioFocusTexture, noRadioFocusTexture])\n" -+ "\n" -+ "x : integer - x coordinate of control.\n" -+ "y : integer - y coordinate of control.\n" -+ "width : integer - width of control.\n" -+ "height : integer - height of control.\n" -+ "label : string or unicode - text string.\n" -+ "focusTexture : [opt] string - filename for focus texture.\n" -+ "noFocusTexture : [opt] string - filename for no focus texture.\n" -+ "textOffsetX : [opt] integer - x offset of label.\n" -+ "textOffsetY : [opt] integer - y offset of label.\n" -+ "alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n" -+ "font : [opt] string - font used for label text. (e.g. 'font13')\n" -+ "textColor : [opt] hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')\n" -+ "disabledColor : [opt] hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')\n" -+ "angle : [opt] integer - angle of control. (+ rotates CCW, - rotates CW)\n" -+ "shadowColor : [opt] hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')\n" -+ "focusedColor : [opt] hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')\n" -+ "radioFocusTexture : [opt] string - filename for radio focus texture.\n" -+ "noRadioFocusTexture : [opt] string - filename for radio no focus texture.\n" -+ "\n" -+ "*Note, You can use the above as keywords for arguments and skip certain optional arguments.\n" -+ " Once you use a keyword, all following arguments require the keyword.\n" -+ " After you create the control, you need to add it to the window with addControl().\n" -+ "\n" -+ "example:\n" -+ " - self.radiobutton = xbmcgui.ControlToggleButton(100, 250, 200, 50, 'Status', font='font14')\n"); -+ -+ // Restore code and data sections to normal. -+ -+ PyTypeObject ControlToggle_Type; -+ -+ void initControlToggle_Type() -+ { -+ PyXBMCInitializeTypeObject(&ControlToggle_Type); -+ -+ ControlToggle_Type.tp_name = (char*)"xbmcgui.ControlToggleButton"; -+ ControlToggle_Type.tp_basicsize = sizeof(ControlToggle); -+ ControlToggle_Type.tp_dealloc = (destructor)ControlToggle_Dealloc; -+ ControlToggle_Type.tp_compare = 0; -+ ControlToggle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; -+ ControlToggle_Type.tp_doc = ControlToggle__doc__; -+ ControlToggle_Type.tp_methods = ControlToggle_methods; -+ ControlToggle_Type.tp_base = &Control_Type; -+ ControlToggle_Type.tp_new = ControlToggle_New; -+ } -+} -+ -+#ifdef __cplusplus -+} -+#endif -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-17 18:44:47.447960296 +0100 -@@ -13,6 +13,7 @@ - controlslider.cpp \ - controlspin.cpp \ - controltextbox.cpp \ -+ controltogglebutton.cpp \ - dialog.cpp \ - GUIPythonWindow.cpp \ - GUIPythonWindowDialog.cpp \ -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-17 18:43:42.218705123 +0100 -@@ -277,6 +277,12 @@ - if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); - ((ControlButton*)pControl)->align = li.align; - break; -+ case CGUIControl::GUICONTROL_TOGGLEBUTTON: -+ pControl = (Control*)ControlToggle_Type.tp_alloc(&ControlToggle_Type, 0); -+ new(&((ControlToggle*)pControl)->bIsSelected) bool(); -+ -+ break; -+ - default: - break; - } -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-17 18:43:42.219705142 +0100 -@@ -138,6 +138,7 @@ - initAction_Type(); - initControlRadioButton_Type(); - initControlEdit_Type(); -+ initControlToggle_Type(); - - if (PyType_Ready(&Window_Type) < 0 || - PyType_Ready(&WindowDialog_Type) < 0 || -@@ -160,7 +161,8 @@ - PyType_Ready(&ControlSlider_Type) < 0 || - PyType_Ready(&ControlRadioButton_Type) < 0 || - PyType_Ready(&ControlEdit_Type) < 0 || -- PyType_Ready(&Action_Type) < 0) -+ PyType_Ready(&Action_Type) < 0 || -+ PyType_Ready(&ControlToggle_Type) < 0) - return; - - } -@@ -200,6 +202,7 @@ - Py_INCREF(&Action_Type); - Py_INCREF(&ControlRadioButton_Type); - Py_INCREF(&ControlEdit_Type); -+ Py_INCREF(&ControlToggle_Type); - - pXbmcGuiModule = Py_InitModule3((char*)"xbmcgui", xbmcGuiMethods, xbmcgui_module_documentation); - -@@ -227,7 +230,8 @@ - PyModule_AddObject(pXbmcGuiModule, (char*)"Action", (PyObject *)&Action_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlRadioButton", (PyObject*)&ControlRadioButton_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlEdit", (PyObject*)&ControlEdit_Type); -- -+ PyModule_AddObject(pXbmcGuiModule, (char*)"ControlToggle", (PyObject*)&ControlToggle_Type); -+ - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__author__", (char*)PY_XBMC_AUTHOR); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__date__", (char*)"14 July 2006"); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__version__", (char*)"1.2"); -diff -Naur xbmc-f3b0020/XBMC.xcodeproj/project.pbxproj xbmc-f3b0020.patch/XBMC.xcodeproj/project.pbxproj diff --git a/packages/mediacenter/xbmc-rpi/profile.d/xbmc.conf b/packages/mediacenter/xbmc-rpi/profile.d/xbmc.conf deleted file mode 100644 index 7029bf1bd3..0000000000 --- a/packages/mediacenter/xbmc-rpi/profile.d/xbmc.conf +++ /dev/null @@ -1,44 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ -# Mediacenter environment variables. -# -# This file contains non-OpenELEC evironment variables as well as OpenELEC -# evironment variables that are not user defined. -################################################################################ - -if [ -z "$XBMC_STARTDELAY" ]; then - XBMC_STARTDELAY="1000000" -fi - -XBMC_HOME="/usr/share/xbmc" - -export XBMC_HOME - -GPUTYPE="OTHER" - -if [ -x /usr/bin/lspci ]; then - GPUDEVICE=$(lspci -n | grep 0300) - - [ "$(echo $GPUDEVICE | grep 8086)" ] && GPUTYPE="INTEL" # 8086 == INTEL - [ "$(echo $GPUDEVICE | grep 10de)" ] && GPUTYPE="NVIDIA" # 10de == NVIDIA - [ "$(echo $GPUDEVICE | grep 1002)" ] && GPUTYPE="AMD" # 1002 == AMD -fi - -export GPUTYPE diff --git a/packages/mediacenter/xbmc-rpi/scripts/cputemp b/packages/mediacenter/xbmc-rpi/scripts/cputemp deleted file mode 100755 index 10a3683262..0000000000 --- a/packages/mediacenter/xbmc-rpi/scripts/cputemp +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -# inspired by -# https://github.com/xtranophilist/gnome-shell-extension-cpu-temperature/blob/master/extension.js - -TEMP=0 - -if [ -f /sys/devices/platform/coretemp.0/temp1_input ]; then - # used with coretemp - TEMP=`cat /sys/devices/platform/coretemp.0/temp1_input` -elif [ -f /sys/devices/platform/coretemp.0/temp2_input ]; then - # used with coretemp - TEMP=`cat /sys/devices/platform/coretemp.0/temp2_input` -elif [ -f /sys/bus/acpi/devices/LNXTHERM\:00/thermal_zone/temp ]; then - # used on some intel systems - TEMP=`cat /sys/bus/acpi/devices/LNXTHERM\:00/thermal_zone/temp` -elif [ -f /sys/devices/virtual/thermal/thermal_zone0/temp ]; then - # used on some intel systems - TEMP=`cat /sys/devices/virtual/thermal/thermal_zone0/temp` -elif [ -f /sys/class/hwmon/hwmon0/temp1_input ]; then - # hwmon for new 2.6.39, 3.0 linux kernels - TEMP=`cat /sys/class/hwmon/hwmon0/temp1_input` -elif [ -f /sys/class/hwmon/hwmon0/device/temp1_input ]; then - # used on AMD systems - TEMP=`cat /sys/class/hwmon/hwmon0/device/temp1_input` -elif [ -f /sys/class/hwmon/hwmon0/device/temp2_input ]; then - # used on ION systems - TEMP=`cat /sys/class/hwmon/hwmon0/device/temp2_input` -fi - -echo "$(( $TEMP / 1000 )) C" diff --git a/packages/mediacenter/xbmc-rpi/scripts/setwakeup.sh b/packages/mediacenter/xbmc-rpi/scripts/setwakeup.sh deleted file mode 100755 index 557abff270..0000000000 --- a/packages/mediacenter/xbmc-rpi/scripts/setwakeup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -if [ -f /sys/class/rtc/rtc0/wakealarm ]; then - logger -t setwakeup.sh "### Setting system wakeup time ###" - echo 0 > /sys/class/rtc/rtc0/wakealarm - echo $1 > /sys/class/rtc/rtc0/wakealarm - logger -t setwakeup.sh "### $(cat /proc/driver/rtc) ###" -fi diff --git a/packages/mediacenter/xbmc-rpi/scripts/wait_on_xbmc_exit b/packages/mediacenter/xbmc-rpi/scripts/wait_on_xbmc_exit deleted file mode 100755 index 60efb36402..0000000000 --- a/packages/mediacenter/xbmc-rpi/scripts/wait_on_xbmc_exit +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -count=0 - -while [ $(pidof xbmc.bin) -a $count -le 20 ]; do - usleep 250000 - logger -t wait_on_xbmc_exit "### Waiting for XBMC to Exit - $count ###" - count=$((count+1)) -done diff --git a/packages/mediacenter/xbmc-rpi/sleep.d/00_addon-sleep b/packages/mediacenter/xbmc-rpi/sleep.d/00_addon-sleep deleted file mode 100755 index 01c9653b45..0000000000 --- a/packages/mediacenter/xbmc-rpi/sleep.d/00_addon-sleep +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. /etc/profile - -for script in $HOME/.xbmc/addons/*/sleep.d/*.power; do - progress "running addon sleep script $script ($1)..." - sh $script $1 -done diff --git a/packages/mediacenter/xbmc-rpi/sleep.d/61_xbmc_lirc b/packages/mediacenter/xbmc-rpi/sleep.d/61_xbmc_lirc deleted file mode 100755 index 0cb99c757e..0000000000 --- a/packages/mediacenter/xbmc-rpi/sleep.d/61_xbmc_lirc +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. /etc/profile - -case "$1" in - hibernate|suspend) - xbmc-send --host=127.0.0.1 -a "LIRC.Stop" - ;; - thaw|resume) - xbmc-send --host=127.0.0.1 -a "LIRC.Start" - ;; - *) exit $NA - ;; -esac diff --git a/packages/mediacenter/xbmc-rpi/sleep.d/62_xbmc_lcd b/packages/mediacenter/xbmc-rpi/sleep.d/62_xbmc_lcd deleted file mode 100755 index a3f8e358a4..0000000000 --- a/packages/mediacenter/xbmc-rpi/sleep.d/62_xbmc_lcd +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. /etc/profile - -case "$1" in - hibernate|suspend) - xbmc-send --host=127.0.0.1 -a "LCD.Suspend" - ;; - thaw|resume) - xbmc-send --host=127.0.0.1 -a "LCD.Resume" - ;; - *) exit $NA - ;; -esac diff --git a/packages/mediacenter/xbmc-rpi/splash/splash.png b/packages/mediacenter/xbmc-rpi/splash/splash.png deleted file mode 100644 index 6b2897b0a1..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/splash/splash.png and /dev/null differ diff --git a/packages/mediacenter/xbmc-rpi/splash/splash1.png b/packages/mediacenter/xbmc-rpi/splash/splash1.png deleted file mode 100644 index ac0aa0052f..0000000000 Binary files a/packages/mediacenter/xbmc-rpi/splash/splash1.png and /dev/null differ diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 5a2d5cbf30..10debe2adc 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-theme-Confluence" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.1" -else - PKG_VERSION="11.0.1" -fi +PKG_VERSION="11.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-001-add_oe_settings_to_homescreen.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-001-add_oe_settings_to_homescreen.patch similarity index 100% rename from packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-001-add_oe_settings_to_homescreen.patch rename to packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-001-add_oe_settings_to_homescreen.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-801.04-cec-PR887.patch similarity index 100% rename from packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-801.04-cec-PR887.patch rename to packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-801.04-cec-PR887.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch deleted file mode 100644 index d12175ed71..0000000000 --- a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- xbmc-theme-Confluence-11.0.1/720p/IncludesHomeMenuItems.xml 2012-03-31 08:37:23.304505434 +0400 -+++ xbmc-theme-Confluence-11.0.1/720p/IncludesHomeMenuItems.patch.xml 2012-03-31 08:39:57.894660377 +0400 -@@ -183,6 +183,11 @@ - - ActivateWindow(Settings) - -+ -+ ButtonHomeSubCommonValues -+ -+ RunAddon(os.openelec.settings) -+ - - ButtonHomeSubCommonValues - diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index ee93a64678..0000000000 --- a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 3e1367b680b26123e9e1aa09f8caf2a932d47572 Mon Sep 17 00:00:00 2001 -From: Lars Op den Kamp -Date: Tue, 17 Apr 2012 01:57:43 +0200 -Subject: [PATCH 2/2] cec: libCEC 1.6 support and fixes. libCEC 1.6+ is needed - when using firmware v2 on the CEC adapter, which adds - wake over CEC * added a new setting to control - whether to put the TV in standby when the player is put - in standby. * added some button mappings: all menu - related buttons -> menu, previous channel -> teletext, - added support for the channels list on samsung, mapped - next fav -> menu (when available) * display the - firmware version in the peripheral manager (if - available) * handle the new CEC alert callback - (libCEC 1.6+) * replaced 'Put this PC in standby mode - when the TV is switched off' with an enum that allows - the user to chose between 'Ignore', 'Suspend' and - 'Shutdown' * fixed - crash when changing settings - without libCEC started. * fixed - range of wake and - power-off devices * fixed - update the correct - standby device setting ('standby_devices' not - 'wake_devices') * fixed - don't get the settings from - the eeprom, but always use the settings provided in - xbmc - ---- - .../720p/DialogPeripheralManager.xml | 4 +- - configure.in | 2 +- - language/English/strings.xml | 5 +- - project/BuildDependencies/scripts/libcec_d.txt | 2 +- - system/peripherals.xml | 15 +- - tools/darwin/depends/libcec/Makefile | 2 +- - xbmc/peripherals/bus/PeripheralBus.cpp | 1 + - xbmc/peripherals/devices/Peripheral.h | 2 + - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 160 ++++++++++++++++---- - xbmc/peripherals/devices/PeripheralCecAdapter.h | 4 + - 10 files changed, 152 insertions(+), 45 deletions(-) - -diff --git a/720p/DialogPeripheralManager.xml b/720p/DialogPeripheralManager.xml -index 07954d0..5717017 100644 ---- a/720p/DialogPeripheralManager.xml -+++ b/720p/DialogPeripheralManager.xml -@@ -117,7 +117,7 @@ - 50 - 520 - 20 -- -+ - left - center - font12 -@@ -173,7 +173,7 @@ - 50 - 520 - 20 -- -+ - left - center - font12 --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/build b/packages/mediacenter/xbmc/build index 946ddd9e80..479f94d1cd 100755 --- a/packages/mediacenter/xbmc/build +++ b/packages/mediacenter/xbmc/build @@ -172,7 +172,7 @@ fi LDFLAGS=`echo $LDFLAGS | sed -e "s|-Wl,--as-needed||"` # dont build parallel - MAKEFLAGS=-j1 +# MAKEFLAGS=-j1 export PYTHON_VERSION="2.7" export PYTHON_CPPFLAGS="-I$SYSROOT_PREFIX/usr/include/python$PYTHON_VERSION" diff --git a/packages/mediacenter/xbmc/install b/packages/mediacenter/xbmc/install index 31b716c5d0..9f7e80a580 100755 --- a/packages/mediacenter/xbmc/install +++ b/packages/mediacenter/xbmc/install @@ -29,9 +29,7 @@ mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin mkdir -p $INSTALL/usr/lib/xbmc cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc @@ -64,10 +62,6 @@ rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.dxspectrum rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.itunes rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/visualization.milkdrop -# remove broken addons - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/metadata.*.allmusic.com - rm -rf $ROOT/$INSTALL/usr/share/xbmc/addons/metadata.yahoomusic.com - # overriding Splash image mkdir -p $INSTALL/usr/share/xbmc/media rm -rf $INSTALL/usr/share/xbmc/media/Splash.png @@ -78,7 +72,6 @@ mkdir -p $INSTALL/usr/share/xbmc/media # fi # cleanup and python addon fixes - rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pil rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite rm -rf $INSTALL/usr/share/xbmc/addons/script.module.simplejson diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta index 5b72a64b00..9691da35bc 100644 --- a/packages/mediacenter/xbmc/meta +++ b/packages/mediacenter/xbmc/meta @@ -19,18 +19,14 @@ ################################################################################ PKG_NAME="xbmc" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.1" -else - PKG_VERSION="11.0.1" -fi +PKG_VERSION="11.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.xbmc.org" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="boost Python zlib bzip2 systemd pcre ffmpeg alsa-lib libass curl libssh rtmpdump fontconfig freetype libmad libogg libvorbis libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite alsa bc xbmc-addon-settings" -PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre alsa-lib ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libvorbis libcdio libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite mysql" +PKG_DEPENDS="boost Python zlib bzip2 systemd pcre ffmpeg alsa-lib libass curl libssh rtmpdump fontconfig tinyxml freetype libmad libogg libvorbis libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite alsa bc xbmc-addon-settings" +PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre alsa-lib ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi tinyxml libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libvorbis libcdio libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite mysql" PKG_PRIORITY="optional" PKG_SECTION="mediacenter" PKG_SHORTDESC="xbmc: XBMC Mediacenter" @@ -46,6 +42,10 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS Imaging" PKG_DEPENDS="$PKG_DEPENDS simplejson" +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" + if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" @@ -149,8 +149,3 @@ fi if [ "$XVBA" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch deleted file mode 100644 index c013e0ae3a..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur xbmc-9389dc8/configure.in xbmc-9389dc8.patch/configure.in ---- xbmc-9389dc8/configure.in 2011-09-01 17:21:47.000000000 +0200 -+++ xbmc-9389dc8.patch/configure.in 2011-09-01 23:30:40.419399392 +0200 -@@ -428,6 +428,14 @@ - esac - AC_SUBST([ARCH]) - -+AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) -+if test "$HAVE_GIT" = "yes" -a "$GIT_REV" = ""; then -+ GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') -+elif test "$GIT_REV" = ""; then -+ GIT_REV="Unknown" -+fi -+final_message="$final_message\n git Rev.:\t${GIT_REV}" -+ - # platform debug flags - if test "$use_debug" = "yes"; then - final_message="$final_message\n Debugging:\tYes" -@@ -1177,7 +1185,6 @@ - fi - fi - --AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) - - # Checks for header files. - AC_HEADER_DIRENT -@@ -1408,12 +1415,6 @@ - final_message="$final_message\n Avahi:\tNo" - fi - --if test "$HAVE_GIT" = "yes"; then -- GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') --fi --if test "$GIT_REV" = ""; then -- GIT_REV="Unknown" --fi - if test "$host_vendor" = "apple"; then - echo "#define GIT_REV \"$GIT_REV\"" > git_revision.h - else diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch deleted file mode 100644 index 5e76acefe4..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 05:01:20.091837122 +0200 -@@ -6,5 +6,5 @@ - Name: libdvdcss - Description: DVD access and decryption library. - Version: @VERSION@ --Libs: -L${libdir} -ldvdcss --Cflags: -I{includedir} -I${includedir}/@PACKAGE@ -+Libs: -ldvdcss -+Cflags: -I. -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 05:01:20.549828701 +0200 -@@ -56,17 +56,17 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $dvdread_cflags $extracflags $threadcflags -+ echo $dvdread_cflags $extracflags $threadcflags - fi - - if test "$echo_minicflags" = "yes"; then -- echo -I$prefix/include -I$prefix/include/dvdnav $extracflags $threadcflags -+ echo $extracflags $threadcflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir -ldvdnav $dvdread_libs $threadlib -+ echo -ldvdnav $dvdread_libs $threadlib - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L$libdir -ldvdnavmini $threadlib -+ echo -ldvdnavmini $threadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 05:01:20.624827321 +0200 -@@ -76,13 +76,13 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -I@includedir@/libdvdread @THREAD_CFLAGS@ -+ echo @THREAD_CFLAGS@ - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdnav -ldvdread @THREAD_LIBS@ -+ echo -ldvdnav -ldvdread @THREAD_LIBS@ - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L@libdir@ -ldvdnavmini @THREAD_LIBS@ -+ echo -ldvdnavmini @THREAD_LIBS@ - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 05:01:21.042819641 +0200 -@@ -7,5 +7,5 @@ - Description: DVD Navigation mini library - Version: @VERSION@ - --Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 05:01:21.262815601 +0200 -@@ -8,5 +8,5 @@ - Version: @VERSION@ - - Requires.private: dvdread >= 4.1.2 --Cflags: -I${includedir} @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 05:01:21.278815307 +0200 -@@ -72,9 +72,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -+ echo "" - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdread -+ echo -ldvdread - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 05:01:21.278815307 +0200 -@@ -48,9 +48,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $extracflags -+ echo $extracflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir $dvdreadlib -+ echo $dvdreadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 05:01:21.279815289 +0200 -@@ -7,5 +7,5 @@ - Description: Low level DVD access library - Version: @VERSION@ - --Cflags: -I${includedir} --Libs: -L${libdir} -ldvdread -+Cflags: -I. -+Libs: -ldvdread diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-311-fix_rsxs_build-0.1.patch deleted file mode 100644 index fe0ee49cab..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-311-fix_rsxs_build-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h ---- xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-09-27 15:56:19.000000000 +0200 -+++ xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-10-16 02:13:13.805433847 +0200 -@@ -17,7 +17,7 @@ - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - --#if !_LIBC -+#if 0 - /* This code is written for inclusion in gnu-libc, and uses names in the - namespace reserved for libc. If we're not compiling in libc, define those - names to be the normal ones instead. */ diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index b8f5b8afcf..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -885,6 +885,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # Python -@@ -1547,6 +1550,7 @@ - `if test "$use_arch" != "no"; then echo --arch=$use_arch; fi`\ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - --target-os=$(tolower $(uname -s)) \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch deleted file mode 100644 index 821c1cc7bd..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -Naur xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -335,11 +335,9 @@ - // at http://docs.python.org/using/cmdline.html#environment-variables - - #if !defined(_WIN32) -- /* PYTHONOPTIMIZE is set off intentionally when using external Python. -- Reason for this is because we cannot be sure what version of Python -- was used to compile the various Python object files (i.e. .pyo, -- .pyc, etc.). */ -- // check if we are running as real xbmc.app or just binary -+ // Required for python to find optimized code (pyo) files -+ setenv("PYTHONOPTIMIZE", "1", 1); -+ // check if we are running as real xbmc.app or just binary - if (!CUtil::GetFrameworksPath(true).IsEmpty()) - { - // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-452-change_lcd_content-0.1.patch deleted file mode 100644 index 0427b534f9..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-452-change_lcd_content-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-pvr-3513480/userdata/LCD.xml xbmc-pvr-3513480.patch/userdata/LCD.xml ---- xbmc-pvr-3513480/userdata/LCD.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/userdata/LCD.xml 2011-04-25 05:27:34.956125133 +0200 -@@ -21,7 +21,7 @@ - Freemem: $INFO[System.FreeMemory] - - -- XBMC running... -+ *** OpenELEC *** - $INFO[System.Time] $INFO[System.Date] - Freemem: $INFO[System.FreeMemory] - $INFO[System.ScreenWidth]x$INFO[System.ScreenHeight] $INFO[System.ScreenMode] diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch deleted file mode 100644 index 5b32c0cce7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/userdata/RssFeeds.xml xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml ---- xbmc-10.1-Dharma/userdata/RssFeeds.xml 2011-03-08 02:49:24.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml 2011-06-14 17:07:08.450880123 +0200 -@@ -3,6 +3,7 @@ - - - -+ http://openelec.tv/news?format=feed&type=rss - http://feeds.feedburner.com/xbmc - - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-454-disable_backslash-0.1.patch deleted file mode 100644 index 0888920258..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-454-disable_backslash-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-30a9070/system/keymaps/keyboard.xml xbmc-30a9070.patch/system/keymaps/keyboard.xml ---- xbmc-30a9070/system/keymaps/keyboard.xml 2011-07-28 06:20:13.000000000 +0200 -+++ xbmc-30a9070.patch/system/keymaps/keyboard.xml 2011-07-28 09:39:57.210973380 +0200 -@@ -90,7 +90,7 @@ - Number7 - Number8 - Number9 -- ToggleFullScreen -+ - FirstPage - LastPage - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-463-add_remote_devinput-0.1.patch deleted file mode 100644 index 85d635b61b..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-463-add_remote_devinput-0.1.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/Lircmap.xml xbmc-10.1-Dharma.patch/system/Lircmap.xml ---- xbmc-10.1-Dharma/system/Lircmap.xml 2011-06-18 01:43:43.132101246 +0200 -+++ xbmc-10.1-Dharma.patch/system/Lircmap.xml 2011-06-18 01:44:53.777025290 +0200 -@@ -365,7 +365,6 @@ - - - cx23885_remote -- devinput - KEY_LEFT - KEY_RIGHT - KEY_UP -@@ -452,4 +451,59 @@ - yellow - blue - -+ -+ -+ KEY_LEFT -+ KEY_RIGHT -+ KEY_UP -+ KEY_DOWN -+ -+ KEY_ENTER -+ KEY_DELETE -+ KEY_PROG1 -+ KEY_EXIT -+ KEY_RECORD -+ KEY_PLAY -+ KEY_PAUSE -+ KEY_STOP -+ KEY_FASTFORWARD -+ KEY_REWIND -+ KEY_VOLUMEUP -+ KEY_VOLUMEDOWN -+ KEY_CHANNELUP -+ KEY_CHANNELDOWN -+ KEY_NEXT -+ KEY_PREVIOUS -+ KEY_EPG -+ KEY_SUBTITLE -+ KEY_LANGUAGE -+ KEY_INFO -+ KEY_ZOOM -+ KEY_MUTE -+ KEY_POWER -+ KEY_EJECT -+ KEY_DVD -+ KEY_MENU -+ KEY_VIDEO -+ KEY_AUDIO -+ KEY_CAMERA -+ KEY_TUNER -+ KEY_TEXT -+ KEY_NUMERIC_1 -+ KEY_NUMERIC_2 -+ KEY_NUMERIC_3 -+ KEY_NUMERIC_4 -+ KEY_NUMERIC_5 -+ KEY_NUMERIC_6 -+ KEY_NUMERIC_7 -+ KEY_NUMERIC_8 -+ KEY_NUMERIC_9 -+ KEY_NUMERIC_0 -+ KEY_NUMERIC_STAR -+ KEY_NUMERIC_POUND -+ KEY_RED -+ KEY_GREEN -+ KEY_YELLOW -+ KEY_BLUE -+ - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch deleted file mode 100644 index ec91a7327d..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch +++ /dev/null @@ -1,1976 +0,0 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-04-17 14:47:57.830482197 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.1.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-11.0.1/language/English/strings.xml xbmc-11.0.1.patch/language/English/strings.xml ---- xbmc-11.0.1/language/English/strings.xml 2012-03-21 23:57:54.000000000 +0100 -+++ xbmc-11.0.1.patch/language/English/strings.xml 2012-04-17 14:47:57.881483158 +0200 -@@ -2378,6 +2378,7 @@ - Device removed - Keymap to use for this device - Keymap enabled -+ Do not use the custom keymap for this device - - Location - Class -@@ -2392,16 +2393,23 @@ - Press "user" button command - Enable switch side commands - Could not open the adapter -- Power on the TV when starting XBMC -- Power off devices when stopping XBMC -+ Devices to power on the TV when starting XBMC -+ Devices to power off devices when stopping XBMC - Put devices in standby mode when activating screensaver - - Could not detect the CEC port. Set it up manually. -- Could not detect the CEC adapter. -- Unsupported libcec interface version. %d is greater than the version XBMC supports (%d) -+ Could not initialise the CEC adapter. Check your settings. -+ Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) - Put this PC in standby mode when the TV is switched off - HDMI port number - Connected -- Adapter found, but libcec is not available -+ Adapter found, but libCEC is not available - Use the TV's language setting -+ Connected to HDMI device -+ Make XBMC the active source when starting -+ Physical address (overrules HDMI port) -+ COM port (leave empty unless needed) -+ Configuration updated -+ Failed to set the new configuration. Please check your settings. -+ Send 'inactive source' command when stopping XBMC - -diff -Naur xbmc-11.0.1/lib/libcec/Makefile xbmc-11.0.1.patch/lib/libcec/Makefile ---- xbmc-11.0.1/lib/libcec/Makefile 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/libcec/Makefile 2012-04-17 14:47:58.899502388 +0200 -@@ -7,17 +7,17 @@ - - # lib name, version - LIBNAME=libcec --VERSION=1.2.0 -+VERSION=latest - SOURCE=$(LIBNAME)-$(VERSION) - - # download location and format --BASE_URL=http://mirrors.xbmc.org/build-deps/darwin-libs --ARCHIVE=$(SOURCE).tar.gz -+BASE_URL=http://packages.pulse-eight.net/pulse/sources/libcec -+ARCHIVE=$(SOURCE).tar.bz2 - TARBALLS_LOCATION=. - RETRIEVE_TOOL=/usr/bin/curl - RETRIEVE_TOOL_FLAGS=-Ls --create-dirs --output $(TARBALLS_LOCATION)/$(ARCHIVE) - ARCHIVE_TOOL=tar --ARCHIVE_TOOL_FLAGS=xf -+ARCHIVE_TOOL_FLAGS=jxf - - PREFIX ?= /usr/local - LIBCEC_CONFIGOPTS ?= --prefix=$(PREFIX) -@@ -25,30 +25,30 @@ - # configuration settings - CONFIGURE=./configure CFLAGS=-D_FILE_OFFSET_BITS=64 $(LIBCEC_CONFIGOPTS) - --SO_NAME=$(SOURCE)/.libs/$(LIBNAME).so -+SO_NAME=$(LIBNAME)/.libs/$(LIBNAME).so - - all: $(SO_NAME) - - $(TARBALLS_LOCATION)/$(ARCHIVE): - $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - --$(SOURCE): $(TARBALLS_LOCATION)/$(ARCHIVE) -- rm -rf $(SOURCE) -+$(LIBNAME): $(TARBALLS_LOCATION)/$(ARCHIVE) -+ rm -rf $(LIBNAME) - $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -- echo $(SOURCE) > .gitignore -- cd $(SOURCE); autoreconf -vif -- cd $(SOURCE); $(CONFIGURE) -+ echo $(LIBNAME) > .gitignore -+ cd $(LIBNAME); autoreconf -vif -+ cd $(LIBNAME); $(CONFIGURE) - --$(SO_NAME): $(SOURCE) -- make -j 1 -C $(SOURCE) -+$(SO_NAME): $(LIBNAME) -+ make -j 1 -C $(LIBNAME) - - install: -- make -C $(SOURCE) install -+ make -C $(LIBNAME) install - ldconfig - - clean: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - - distclean:: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - -diff -Naur xbmc-11.0.1/system/peripherals.xml xbmc-11.0.1.patch/system/peripherals.xml ---- xbmc-11.0.1/system/peripherals.xml 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/system/peripherals.xml 2012-04-17 14:47:58.899502388 +0200 -@@ -1,22 +1,29 @@ - - -- -+ - -- -- -- -- -+ -+ -+ -+ - - -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -diff -Naur xbmc-11.0.1/xbmc/Application.cpp xbmc-11.0.1.patch/xbmc/Application.cpp ---- xbmc-11.0.1/xbmc/Application.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/Application.cpp 2012-04-17 14:48:56.437589161 +0200 -@@ -160,9 +160,6 @@ - #endif - #include "interfaces/AnnouncementManager.h" - #include "peripherals/Peripherals.h" --#ifdef HAVE_LIBCEC --#include "peripherals/devices/PeripheralCecAdapter.h" --#endif - #include "peripherals/dialogs/GUIDialogPeripheralManager.h" - #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" - -@@ -2556,6 +2553,10 @@ - } - } - } -+ -+ if (g_peripherals.OnAction(action)) -+ return true; -+ - if (action.GetID() == ACTION_MUTE) - { - ToggleMute(); -@@ -2831,23 +2832,9 @@ - - bool CApplication::ProcessPeripherals(float frameTime) - { --#ifdef HAVE_LIBCEC -- vector peripherals; -- if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -- { -- for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -- { -- CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -- if (cecDevice && cecDevice->GetButton()) -- { -- CKey key(cecDevice->GetButton(), cecDevice->GetHoldTime()); -- cecDevice->ResetButton(); -- return OnKey(key); -- } -- } -- } --#endif -- -+ CKey key; -+ if (g_peripherals.GetNextKeypress(frameTime, key)) -+ return OnKey(key); - return false; - } - -@@ -3288,7 +3275,8 @@ - { - try - { -- CAnnouncementManager::Announce(System, "xbmc", "OnQuit"); -+ CVariant vExitCode(exitCode); -+ CAnnouncementManager::Announce(System, "xbmc", "OnQuit", vExitCode); - - // cancel any jobs from the jobmanager - CJobManager::GetInstance().CancelJobs(); -@@ -5027,6 +5015,8 @@ - - bool CApplication::IsMuted() const - { -+ if (g_peripherals.IsMuted()) -+ return true; - return g_settings.m_bMute; - } - -@@ -5040,6 +5030,9 @@ - - void CApplication::Mute() - { -+ if (g_peripherals.Mute()) -+ return; -+ - g_settings.m_iPreMuteVolumeLevel = GetVolume(); - SetVolume(0); - g_settings.m_bMute = true; -@@ -5047,6 +5040,9 @@ - - void CApplication::UnMute() - { -+ if (g_peripherals.UnMute()) -+ return; -+ - SetVolume(g_settings.m_iPreMuteVolumeLevel); - g_settings.m_iPreMuteVolumeLevel = 0; - g_settings.m_bMute = false; -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:47:59.547514629 +0200 -@@ -18,8 +18,8 @@ - * http://www.gnu.org/copyleft/gpl.html - * - */ --#include "system.h" - -+#include "system.h" - #if defined(HAVE_LIBCEC) - #include "PeripheralCecAdapter.h" - #include "input/XBIRRemote.h" -@@ -31,36 +31,40 @@ - #include "peripherals/Peripherals.h" - #include "peripherals/bus/PeripheralBus.h" - #include "settings/GUISettings.h" -+#include "settings/Settings.h" - #include "utils/log.h" -+#include "utils/Variant.h" - --#include -+#include - - using namespace PERIPHERALS; - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 1 -+#define CEC_LIB_SUPPORTED_VERSION 0x1500 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -+#define VOLUME_CHANGE_TIMEOUT 250 -+#define VOLUME_REFRESH_TIMEOUT 100 - - class DllLibCECInterface - { - public: - virtual ~DllLibCECInterface() {} -- virtual ICECAdapter* CECInit(const char *interfaceName, cec_device_type_list types)=0; -- virtual void* CECDestroy(ICECAdapter *adapter)=0; -+ virtual ICECAdapter* CECInitialise(libcec_configuration *configuration)=0; -+ virtual void* CECDestroy(ICECAdapter *adapter)=0; - }; - - class DllLibCEC : public DllDynamic, DllLibCECInterface - { - DECLARE_DLL_WRAPPER(DllLibCEC, DLL_PATH_LIBCEC) - -- DEFINE_METHOD2(ICECAdapter*, CECInit, (const char *p1, cec_device_type_list p2)) -- DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) -+ DEFINE_METHOD1(ICECAdapter*, CECInitialise, (libcec_configuration *p1)) -+ DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) - - BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD_RENAME(CECInit, CECInit) -+ RESOLVE_METHOD_RENAME(CECInitialise, CECInitialise) - RESOLVE_METHOD_RENAME(CECDestroy, CECDestroy) - END_METHOD_RESOLVE() - }; -@@ -71,41 +75,19 @@ - m_bStarted(false), - m_bHasButton(false), - m_bIsReady(false), -+ m_bHasConnectedAudioSystem(false), - m_strMenuLanguage("???"), -- m_lastKeypress(0) -+ m_lastKeypress(0), -+ m_lastChange(VOLUME_CHANGE_NONE), -+ m_iExitCode(0), -+ m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC - { - m_button.iButton = 0; - m_button.iDuration = 0; - m_screensaverLastActivated.SetValid(false); -- m_dll = new DllLibCEC; -- if (m_dll->Load() && m_dll->IsLoaded()) -- { -- cec_device_type_list typeList; -- typeList.clear(); -- typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE); -- m_cecAdapter = m_dll->CECInit("XBMC", typeList); -- } -- else -- m_cecAdapter = NULL; -- -- if (!m_cecAdapter || m_cecAdapter->GetMinLibVersion() > CEC_LIB_SUPPORTED_VERSION) -- { -- /* unsupported libcec version */ -- CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); - -- CStdString strMessage; -- strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -- m_bError = true; -- if (m_cecAdapter) -- m_dll->CECDestroy(m_cecAdapter); -- m_cecAdapter = NULL; -- } -- else -- { -- CLog::Log(LOGDEBUG, "%s - using libCEC v%d.%d", __FUNCTION__, m_cecAdapter->GetLibVersionMajor(), m_cecAdapter->GetLibVersionMinor()); -- m_features.push_back(FEATURE_CEC); -- } -+ m_configuration.Clear(); -+ m_features.push_back(FEATURE_CEC); - } - - CPeripheralCecAdapter::~CPeripheralCecAdapter(void) -@@ -117,7 +99,6 @@ - - if (m_dll && m_cecAdapter) - { -- FlushLog(); - m_dll->CECDestroy(m_cecAdapter); - m_cecAdapter = NULL; - delete m_dll; -@@ -129,60 +110,94 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_cecAdapter->SetInactiveView(); -- if (GetSettingBool("cec_power_off_shutdown")) -- m_cecAdapter->StandbyDevices(); -+ m_iExitCode = data.asInteger(0); -+ StopThread(false); - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && GetSettingBool("cec_standby_screensaver") && m_bIsReady) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) - { -- m_cecAdapter->PowerOnDevices(); -+ if (m_configuration.bPowerOffScreensaver == 1) -+ { -+ // power off/on on screensaver is set, and devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); -+ } - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && GetSettingBool("cec_standby_screensaver")) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && m_bIsReady) - { - // Don't put devices to standby if application is currently playing -- if (!g_application.IsPlaying() || g_application.IsPaused()) -+ if ((!g_application.IsPlaying() || g_application.IsPaused()) && m_configuration.bPowerOffScreensaver == 1) - { - m_screensaverLastActivated = CDateTime::GetCurrentDateTime(); -- m_cecAdapter->StandbyDevices(); -+ // only power off when we're the active source -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ m_cecAdapter->StandbyDevices(CECDEVICE_BROADCAST); - } - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { -- if (GetSettingBool("cec_power_off_shutdown") && m_bIsReady) -- m_cecAdapter->StandbyDevices(); -+ // this will also power off devices when we're the active source - CSingleLock lock(m_critSection); - m_bStop = true; - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -+ // reconnect to the device - CSingleLock lock(m_critSection); - CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ -+ // close the previous connection - m_cecAdapter->Close(); - -- CStdString strPort = GetComPort(); -- if (!strPort.empty()) -- { -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__); -- FlushLog(); -- m_bStop = true; -- } -- else -- { -- if (GetSettingBool("cec_power_on_startup")) -- PowerOnCecDevices(CECDEVICE_TV); -- m_cecAdapter->SetActiveView(); -- } -- } -+ // and open a new one -+ m_bStop = false; -+ Create(); - } - } - - bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature) - { -- if (feature == FEATURE_CEC && !m_bStarted) -+ if (feature == FEATURE_CEC && !m_bStarted && GetSettingBool("enabled")) - { -+ SetConfigurationFromSettings(); -+ m_callbacks.CBCecLogMessage = &CecLogMessage; -+ m_callbacks.CBCecKeyPress = &CecKeyPress; -+ m_callbacks.CBCecCommand = &CecCommand; -+ m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_configuration.callbackParam = this; -+ m_configuration.callbacks = &m_callbacks; -+ -+ m_dll = new DllLibCEC; -+ if (m_dll->Load() && m_dll->IsLoaded()) -+ m_cecAdapter = m_dll->CECInitialise(&m_configuration); -+ else -+ return false; -+ -+ if (m_configuration.serverVersion < CEC_LIB_SUPPORTED_VERSION) -+ { -+ /* unsupported libcec version */ -+ CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ -+ CStdString strMessage; -+ strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -+ m_bError = true; -+ if (m_cecAdapter) -+ m_dll->CECDestroy(m_cecAdapter); -+ m_cecAdapter = NULL; -+ -+ m_features.clear(); -+ return false; -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ } -+ - m_bStarted = true; - Create(); - } -@@ -221,23 +236,20 @@ - return strPort; - } - --void CPeripheralCecAdapter::Process(void) -+bool CPeripheralCecAdapter::OpenConnection(void) - { -+ bool bIsOpen(false); -+ - if (!GetSettingBool("enabled")) - { - CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__); - m_bStarted = false; -- return; -+ return bIsOpen; - } - - CStdString strPort = GetComPort(); - if (strPort.empty()) -- return; -- -- // set correct physical address from peripheral settings -- int iHdmiPort = GetSettingInt("cec_hdmi_port"); -- SetHdmiPort(iHdmiPort); -- FlushLog(); -+ return bIsOpen; - - // open the CEC adapter - CLog::Log(LOGDEBUG, "%s - opening a connection to the CEC adapter: %s", __FUNCTION__, strPort.c_str()); -@@ -247,100 +259,221 @@ - strMessage.Format(g_localizeStrings.Get(21336), g_localizeStrings.Get(36000)); - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strMessage); - -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- FlushLog(); -- CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -- m_bStarted = false; -- return; -- } -+ bool bConnectionFailedDisplayed(false); - -- CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -- m_bIsReady = true; -- CAnnouncementManager::AddAnnouncer(this); -- -- if (GetSettingBool("cec_power_on_startup")) -+ while (!m_bStop && !bIsOpen) - { -- PowerOnCecDevices(CECDEVICE_TV); -- FlushLog(); -+ if ((bIsOpen = m_cecAdapter->Open(strPort.c_str(), 10000)) == false) -+ { -+ CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -+ if (!bConnectionFailedDisplayed) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -+ bConnectionFailedDisplayed = true; -+ -+ Sleep(10000); -+ } - } - -- if (GetSettingBool("use_tv_menu_language")) -+ if (bIsOpen) - { -- cec_menu_language language; -- if (m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -- SetMenuLanguage(language.language); -+ CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -+ -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); - } - -- m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(36016)); -+ return bIsOpen; -+} -+ -+void CPeripheralCecAdapter::Process(void) -+{ -+ if (!OpenConnection()) -+ return; -+ -+ CAnnouncementManager::AddAnnouncer(this); -+ -+ m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -+ m_queryThread->Create(false); - - while (!m_bStop) - { -- FlushLog(); - if (!m_bStop) -- ProcessNextCommand(); -+ ProcessVolumeChange(); -+ - if (!m_bStop) - Sleep(5); - } - -+ delete m_queryThread; -+ -+ if (m_iExitCode != EXITCODE_REBOOT) -+ { -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ { -+ if (!m_configuration.powerOffDevices.IsEmpty()) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending standby commands", __FUNCTION__); -+ m_cecAdapter->StandbyDevices(); -+ } -+ else if (m_configuration.bSendInactiveSource == 1) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__); -+ m_cecAdapter->SetInactiveView(); -+ } -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - XBMC is not the active source, not sending any standby commands", __FUNCTION__); -+ } -+ } -+ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); - m_bStarted = false; - } - --bool CPeripheralCecAdapter::PowerOnCecDevices(cec_logical_address iLogicalAddress) -+bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) - { -- bool bReturn(false); -+ CSingleLock lock(m_critSection); -+ return m_bHasConnectedAudioSystem; -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::SetAudioSystemConnected(bool bSetTo) -+{ -+ CSingleLock lock(m_critSection); -+ m_bHasConnectedAudioSystem = bSetTo; -+} -+ -+void CPeripheralCecAdapter::ScheduleVolumeUp(void) -+{ - { -- CLog::Log(LOGDEBUG, "%s - powering on CEC capable device with address %1x", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->PowerOnDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+ Sleep(5); -+} - -- return bReturn; -+void CPeripheralCecAdapter::ScheduleVolumeDown(void) -+{ -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } -+ Sleep(5); - } - --bool CPeripheralCecAdapter::StandbyCecDevices(cec_logical_address iLogicalAddress) -+void CPeripheralCecAdapter::ScheduleMute(void) - { -- bool bReturn(false); -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); -+ } -+ Sleep(5); -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::ProcessVolumeChange(void) -+{ -+ bool bSendRelease(false); -+ CecVolumeChange pendingVolumeChange = VOLUME_CHANGE_NONE; - { -- CLog::Log(LOGDEBUG, "%s - putting CEC capable devices with address %1x in standby mode", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->StandbyDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ if (m_volumeChangeQueue.size() > 0) -+ { -+ /* get the first change from the queue */ -+ pendingVolumeChange = m_volumeChangeQueue.front(); -+ m_volumeChangeQueue.pop(); -+ -+ /* remove all dupe entries */ -+ while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange) -+ m_volumeChangeQueue.pop(); -+ -+ /* send another keypress after VOLUME_REFRESH_TIMEOUT ms */ -+ bool bRefresh(m_lastKeypress + VOLUME_REFRESH_TIMEOUT < XbmcThreads::SystemClockMillis()); -+ -+ /* only send the keypress when it hasn't been sent yet */ -+ if (pendingVolumeChange != m_lastChange) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ m_lastChange = pendingVolumeChange; -+ } -+ else if (bRefresh) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ pendingVolumeChange = m_lastChange; -+ } -+ else -+ pendingVolumeChange = VOLUME_CHANGE_NONE; -+ } -+ else if (m_lastKeypress > 0 && m_lastKeypress + VOLUME_CHANGE_TIMEOUT < XbmcThreads::SystemClockMillis()) -+ { -+ /* send a key release */ -+ m_lastKeypress = 0; -+ bSendRelease = true; -+ m_lastChange = VOLUME_CHANGE_NONE; -+ } - } - -- return bReturn; -+ switch (pendingVolumeChange) -+ { -+ case VOLUME_CHANGE_UP: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_UP, false); -+ break; -+ case VOLUME_CHANGE_DOWN: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_DOWN, false); -+ break; -+ case VOLUME_CHANGE_MUTE: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_MUTE, false); -+ { -+ CSingleLock lock(m_critSection); -+ m_bIsMuted = !m_bIsMuted; -+ } -+ break; -+ case VOLUME_CHANGE_NONE: -+ if (bSendRelease) -+ m_cecAdapter->SendKeyRelease(CECDEVICE_AUDIOSYSTEM, false); -+ break; -+ } - } - --bool CPeripheralCecAdapter::SendPing(void) -+void CPeripheralCecAdapter::VolumeUp(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- CLog::Log(LOGDEBUG, "%s - sending ping to the CEC adapter", __FUNCTION__); -- bReturn = m_cecAdapter->PingAdapter(); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+} - -- return bReturn; -+void CPeripheralCecAdapter::VolumeDown(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } - } - --bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort) -+void CPeripheralCecAdapter::Mute(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- if (iHdmiPort <= 0 || iHdmiPort > 16) -- iHdmiPort = 1; -- CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d", __FUNCTION__, iHdmiPort); -- bReturn = m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); - } -+} - -- return bReturn; -+bool CPeripheralCecAdapter::IsMuted(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ return m_bIsMuted; -+ } -+ return false; - } - - void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage) -@@ -404,10 +537,13 @@ - CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage); - } - --void CPeripheralCecAdapter::ProcessNextCommand(void) -+int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command &command) - { -- cec_command command; -- if (m_cecAdapter && m_bIsReady && m_cecAdapter->GetNextCommand(&command)) -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ if (adapter->m_bIsReady) - { - CLog::Log(LOGDEBUG, "%s - processing command: initiator=%1x destination=%1x opcode=%02x", __FUNCTION__, command.initiator, command.destination, command.opcode); - -@@ -416,21 +552,21 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && GetSettingBool("standby_pc_on_tv_standby") && -- (!m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) -+ if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { -- m_bStarted = false; -+ adapter->m_bStarted = false; - g_application.getApplicationMessenger().Suspend(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -- if (GetSettingBool("use_tv_menu_language") && command.initiator == CECDEVICE_TV && command.parameters.size == 3) -+ if (adapter->m_configuration.bUseTVMenuLanguage == 1 && command.initiator == CECDEVICE_TV && command.parameters.size == 3) - { - char strNewLanguage[4]; - for (int iPtr = 0; iPtr < 3; iPtr++) - strNewLanguage[iPtr] = command.parameters[iPtr]; - strNewLanguage[3] = 0; -- SetMenuLanguage(strNewLanguage); -+ adapter->SetMenuLanguage(strNewLanguage); - } - break; - case CEC_OPCODE_DECK_CONTROL: -@@ -438,11 +574,11 @@ - command.parameters.size == 1 && - command.parameters[0] == CEC_DECK_CONTROL_MODE_STOP) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_STOP; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - break; - case CEC_OPCODE_PLAY: -@@ -451,26 +587,58 @@ - { - if (command.parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PLAY; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - else if (command.parameters[0] == CEC_PLAY_MODE_PLAY_STILL) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PAUSE; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - } - break; -+ case CEC_OPCODE_REPORT_POWER_STATUS: -+ if (command.initiator == CECDEVICE_TV && -+ command.parameters.size == 1 && -+ command.parameters[0] == CEC_POWER_STATUS_ON && -+ adapter->m_queryThread) -+ { -+ adapter->m_queryThread->Signal(); -+ } -+ break; - default: - break; - } - } -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration &config) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->SetConfigurationFromLibCEC(config); -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->m_buttonQueue.push(key); -+ return 1; - } - - bool CPeripheralCecAdapter::GetNextCecKey(cec_keypress &key) -@@ -483,10 +651,6 @@ - m_buttonQueue.pop(); - bReturn = true; - } -- else if (m_cecAdapter->GetNextKeypress(&key)) -- { -- bReturn = true; -- } - - return bReturn; - } -@@ -726,41 +890,43 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else if (strChangedSetting.Equals("cec_hdmi_port")) -+ else - { -- SetHdmiPort(GetSettingInt("cec_hdmi_port")); -+ SetConfigurationFromSettings(); -+ m_queryThread->UpdateConfiguration(&m_configuration); - } - } - --void CPeripheralCecAdapter::FlushLog(void) -+int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) - { -- cec_log_message message; -- while (m_cecAdapter && m_cecAdapter->GetNextLogMessage(&message)) -- { -- int iLevel = -1; -- switch (message.level) -- { -- case CEC_LOG_ERROR: -- iLevel = LOGERROR; -- break; -- case CEC_LOG_WARNING: -- iLevel = LOGWARNING; -- break; -- case CEC_LOG_NOTICE: -- iLevel = LOGDEBUG; -- break; -- case CEC_LOG_TRAFFIC: -- case CEC_LOG_DEBUG: -- if (GetSettingBool("cec_debug_logging")) -- iLevel = LOGDEBUG; -- break; -- default: -- break; -- } -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; - -- if (iLevel >= 0) -- CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ int iLevel = -1; -+ switch (message.level) -+ { -+ case CEC_LOG_ERROR: -+ iLevel = LOGERROR; -+ break; -+ case CEC_LOG_WARNING: -+ iLevel = LOGWARNING; -+ break; -+ case CEC_LOG_NOTICE: -+ iLevel = LOGDEBUG; -+ break; -+ case CEC_LOG_TRAFFIC: -+ case CEC_LOG_DEBUG: -+ iLevel = LOGDEBUG; -+ break; -+ default: -+ break; - } -+ -+ if (iLevel >= 0) -+ CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ -+ return 1; - } - - bool CPeripheralCecAdapter::TranslateComPort(CStdString &strLocation) -@@ -774,4 +940,301 @@ - - return false; - } -+ -+void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configuration &config) -+{ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ m_configuration.deviceTypes.Add(config.deviceTypes[0]); -+ SetSetting("device_type", (int)config.deviceTypes[0]); -+ -+ // set the connected device -+ m_configuration.baseDevice = config.baseDevice; -+ SetSetting("connected_device", (int)config.baseDevice); -+ -+ // set the HDMI port number -+ m_configuration.iHDMIPort = config.iHDMIPort; -+ SetSetting("cec_hdmi_port", config.iHDMIPort); -+ -+ // set the physical address, when baseDevice or iHDMIPort are not set -+ if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ { -+ m_configuration.iPhysicalAddress = config.iPhysicalAddress; -+ CStdString strPhysicalAddress; -+ strPhysicalAddress.Format("%x", config.iPhysicalAddress); -+ SetSetting("physical_address", strPhysicalAddress); -+ } -+ -+ // set the tv vendor override -+ m_configuration.tvVendor = config.tvVendor; -+ SetSetting("tv_vendor", (int)config.tvVendor); -+ -+ // set the devices to wake when starting -+ m_configuration.wakeDevices = config.wakeDevices; -+ CStdString strWakeDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.wakeDevices[iPtr]) -+ strWakeDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strWakeDevices.Trim()); -+ -+ // set the devices to power off when stopping -+ m_configuration.powerOffDevices = config.powerOffDevices; -+ CStdString strPowerOffDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.powerOffDevices[iPtr]) -+ strPowerOffDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ -+ // set the boolean settings -+ m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -+ SetSetting("use_tv_menu_language", m_configuration.bUseTVMenuLanguage == 1); -+ -+ m_configuration.bActivateSource = config.bActivateSource; -+ SetSetting("activate_source", m_configuration.bActivateSource == 1); -+ -+ m_configuration.bPowerOffScreensaver = config.bPowerOffScreensaver; -+ SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); -+ -+ m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -+ SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) -+ m_configuration.bSendInactiveSource = config.bSendInactiveSource; -+ SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+} -+ -+void CPeripheralCecAdapter::SetConfigurationFromSettings(void) -+{ -+ // client version 1.5.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ -+ // device name 'XBMC' -+ snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -+ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ int iDeviceType = GetSettingInt("device_type"); -+ if (iDeviceType != (int)CEC_DEVICE_TYPE_RECORDING_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_PLAYBACK_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_TUNER) -+ iDeviceType = (int)CEC_DEVICE_TYPE_RECORDING_DEVICE; -+ m_configuration.deviceTypes.Add((cec_device_type)iDeviceType); -+ -+ // always try to autodetect the address. -+ // when the firmware supports this, it will override the physical address, connected device and hdmi port settings -+ m_configuration.bAutodetectAddress = 1; -+ -+ // set the physical address -+ // when set, it will override the connected device and hdmi port settings -+ CStdString strPhysicalAddress = GetSettingString("physical_address"); -+ int iPhysicalAddress; -+ if (sscanf(strPhysicalAddress.c_str(), "%x", &iPhysicalAddress) == 1 && iPhysicalAddress > 0 && iPhysicalAddress < 0xFFFF) -+ m_configuration.iPhysicalAddress = iPhysicalAddress; -+ -+ // set the connected device -+ int iConnectedDevice = GetSettingInt("connected_device"); -+ if (iConnectedDevice == 0 || iConnectedDevice == 5) -+ m_configuration.baseDevice = (cec_logical_address)iConnectedDevice; -+ -+ // set the HDMI port number -+ int iHDMIPort = GetSettingInt("cec_hdmi_port"); -+ if (iHDMIPort >= 0 && iHDMIPort <= 4) -+ m_configuration.iHDMIPort = iHDMIPort; -+ -+ // set the tv vendor override -+ int iVendor = GetSettingInt("tv_vendor"); -+ if (iVendor > 0 && iVendor < 0xFFFFFF) -+ m_configuration.tvVendor = iVendor; -+ -+ // read the devices to wake when starting -+ CStdString strWakeDevices = CStdString(GetSettingString("wake_devices")).Trim(); -+ m_configuration.wakeDevices.Clear(); -+ ReadLogicalAddresses(strWakeDevices, m_configuration.wakeDevices); -+ -+ // read the devices to power off when stopping -+ CStdString strStandbyDevices = CStdString(GetSettingString("standby_devices")).Trim(); -+ m_configuration.powerOffDevices.Clear(); -+ ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); -+ -+ // always get the settings from the rom, when supported by the firmware -+ m_configuration.bGetSettingsFromROM = 1; -+ -+ // read the boolean settings -+ m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; -+ m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; -+ m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -+ m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; -+ m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+} -+ -+void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -+{ -+ for (size_t iPtr = 0; iPtr < strString.size(); iPtr++) -+ { -+ CStdString strDevice = CStdString(strString.substr(iPtr, 1)).Trim(); -+ if (!strDevice.IsEmpty()) -+ { -+ int iDevice(0); -+ if (sscanf(strDevice.c_str(), "%x", &iDevice) == 1 && iDevice >= 0 && iDevice <= 0xF) -+ addresses.Set((cec_logical_address)iDevice); -+ } -+ } -+} -+ -+CPeripheralCecAdapterUpdateThread::CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, libcec_configuration *configuration) : -+ CThread("CEC Adapter Update Thread"), -+ m_adapter(adapter), -+ m_configuration(*configuration), -+ m_bNextConfigurationScheduled(false), -+ m_bIsUpdating(true) -+{ -+ m_nextConfiguration.Clear(); -+ m_event.Reset(); -+} -+ -+CPeripheralCecAdapterUpdateThread::~CPeripheralCecAdapterUpdateThread(void) -+{ -+ StopThread(false); -+ m_event.Set(); -+ StopThread(true); -+} -+ -+void CPeripheralCecAdapterUpdateThread::Signal(void) -+{ -+ m_event.Set(); -+} -+ -+bool CPeripheralCecAdapterUpdateThread::UpdateConfiguration(libcec_configuration *configuration) -+{ -+ CSingleLock lock(m_critSection); -+ if (m_bIsUpdating) -+ { -+ m_bNextConfigurationScheduled = true; -+ m_nextConfiguration = *configuration; -+ } -+ else -+ { -+ m_configuration = *configuration; -+ m_event.Set(); -+ } -+ return true; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::WaitReady(void) -+{ -+ // don't wait if we're not powering up anything -+ if (m_configuration.wakeDevices.IsEmpty() && m_configuration.bActivateSource == 0) -+ return true; -+ -+ // wait for the TV if we're configured to become the active source. -+ // wait for the first device in the wake list otherwise. -+ cec_logical_address waitFor = (m_configuration.bActivateSource == 1) ? -+ CECDEVICE_TV : -+ m_configuration.wakeDevices.primary; -+ -+ cec_power_status powerStatus(CEC_POWER_STATUS_UNKNOWN); -+ bool bContinue(true); -+ while (bContinue && !m_adapter->m_bStop && !m_bStop && powerStatus != CEC_POWER_STATUS_ON) -+ { -+ powerStatus = m_adapter->m_cecAdapter->GetDevicePowerStatus(waitFor); -+ if (powerStatus != CEC_POWER_STATUS_ON) -+ bContinue = !m_event.WaitMSec(1000); -+ } -+ -+ return powerStatus == CEC_POWER_STATUS_ON; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::SetInitialConfiguration(void) -+{ -+ // devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_adapter->m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_adapter->m_cecAdapter->SetActiveSource(); -+ -+ // wait until devices are powered up -+ if (!WaitReady()) -+ return false; -+ -+ // request the menu language of the TV -+ if (m_configuration.bUseTVMenuLanguage == 1) -+ { -+ cec_menu_language language; -+ if (m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -+ m_adapter->SetMenuLanguage(language.language); -+ } -+ -+ // request the OSD name of the TV -+ CStdString strNotification; -+ cec_osd_name tvName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV); -+ strNotification.Format("%s: %s", g_localizeStrings.Get(36016), tvName.name); -+ -+ /* disable the mute setting when an amp is found, because the amp handles the mute setting and -+ set PCM output to 100% */ -+ if (m_adapter->m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM)) -+ { -+ // request the OSD name of the amp -+ cec_osd_name ampName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM); -+ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name); -+ strNotification.AppendFormat(" - %s", ampName.name); -+ -+ // set amp present -+ m_adapter->SetAudioSystemConnected(true); -+ g_settings.m_bMute = false; -+ g_settings.m_nVolumeLevel = VOLUME_MAXIMUM; -+ } -+ -+ m_adapter->m_bIsReady = true; -+ -+ // try to send an OSD string to the TV -+ m_adapter->m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -+ // and let the gui know that we're done -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strNotification); -+ -+ CSingleLock lock(m_critSection); -+ m_bIsUpdating = false; -+ return true; -+} -+ -+void CPeripheralCecAdapterUpdateThread::Process(void) -+{ -+ // set the initial configuration -+ if (!SetInitialConfiguration()) -+ return; -+ -+ // and wait for updates -+ bool bUpdate(false); -+ while (!m_bStop) -+ { -+ // update received -+ if (m_event.WaitMSec(500) || bUpdate) -+ { -+ if (m_bStop) -+ return; -+ // set the new configuration -+ bool bConfigSet(m_adapter->m_cecAdapter->SetConfiguration(&m_configuration)); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(bConfigSet ? 36023 : 36024)); -+ { -+ CSingleLock lock(m_critSection); -+ bUpdate = m_bNextConfigurationScheduled; -+ if (bUpdate) -+ { -+ // another update is scheduled -+ m_bNextConfigurationScheduled = false; -+ m_configuration = m_nextConfiguration; -+ } -+ else -+ { -+ // nothing left to do, wait for updates -+ m_bIsUpdating = false; -+ m_event.Reset(); -+ } -+ } -+ } -+ } -+} -+ - #endif -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:47:59.563514930 +0200 -@@ -20,7 +20,28 @@ - * - */ - --#if defined(HAVE_LIBCEC) -+#if !defined(HAVE_LIBCEC) -+#include "Peripheral.h" -+ -+// an empty implementation, so CPeripherals can be compiled without a bunch of #ifdef's when libCEC is not available -+namespace PERIPHERALS -+{ -+ class CPeripheralCecAdapter : public CPeripheral -+ { -+ public: -+ bool HasConnectedAudioSystem(void) { return false; } -+ void ScheduleVolumeUp(void) {} -+ void ScheduleVolumeDown(void) {} -+ bool IsMuted(void) { return false; } -+ void ScheduleMute(void) {} -+ -+ WORD GetButton(void) { return 0; } -+ unsigned int GetHoldTime(void) { return 0; } -+ void ResetButton(void) {} -+ }; -+} -+ -+#else - - #include "PeripheralHID.h" - #include "interfaces/AnnouncementManager.h" -@@ -32,7 +53,7 @@ - #ifdef isset - #undef isset - #endif --#include -+#include - - class DllLibCEC; - -@@ -43,25 +64,40 @@ - - namespace PERIPHERALS - { -+ class CPeripheralCecAdapterUpdateThread; -+ - typedef struct - { - WORD iButton; - unsigned int iDuration; - } CecButtonPress; - -+ typedef enum -+ { -+ VOLUME_CHANGE_NONE, -+ VOLUME_CHANGE_UP, -+ VOLUME_CHANGE_DOWN, -+ VOLUME_CHANGE_MUTE -+ } CecVolumeChange; - - class CPeripheralCecAdapter : public CPeripheralHID, public ANNOUNCEMENT::IAnnouncer, private CThread - { -+ friend class CPeripheralCecAdapterUpdateThread; -+ - public: - CPeripheralCecAdapter(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId); - virtual ~CPeripheralCecAdapter(void); - - virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); -- virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress); -- virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress); -- -- virtual bool SendPing(void); -- virtual bool SetHdmiPort(int iHdmiPort); -+ virtual bool HasConnectedAudioSystem(void); -+ virtual void SetAudioSystemConnected(bool bSetTo); -+ virtual void ScheduleVolumeUp(void); -+ virtual void VolumeUp(void); -+ virtual void ScheduleVolumeDown(void); -+ virtual void VolumeDown(void); -+ virtual void ScheduleMute(void); -+ virtual void Mute(void); -+ virtual bool IsMuted(void); - - virtual void OnSettingChanged(const CStdString &strChangedSetting); - -@@ -71,27 +107,66 @@ - virtual CStdString GetComPort(void); - - protected: -- virtual void FlushLog(void); -- virtual bool GetNextCecKey(CEC::cec_keypress &key); -+ virtual bool OpenConnection(void); -+ virtual void SetConfigurationFromSettings(void); -+ virtual void SetConfigurationFromLibCEC(const CEC::libcec_configuration &config); -+ static void ReadLogicalAddresses(const CStdString &strString, CEC::cec_logical_addresses &addresses); -+ static int CecKeyPress(void *cbParam, const CEC::cec_keypress &key); -+ static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); -+ static int CecCommand(void *cbParam, const CEC::cec_command &command); -+ static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ - virtual bool GetNextKey(void); -+ virtual bool GetNextCecKey(CEC::cec_keypress &key); - virtual bool InitialiseFeature(const PeripheralFeature feature); - virtual void Process(void); -- virtual void ProcessNextCommand(void); -+ virtual void ProcessVolumeChange(void); - virtual void SetMenuLanguage(const char *strLanguage); - static bool FindConfigLocation(CStdString &strString); - static bool TranslateComPort(CStdString &strPort); - -- DllLibCEC* m_dll; -- CEC::ICECAdapter* m_cecAdapter; -- bool m_bStarted; -- bool m_bHasButton; -- bool m_bIsReady; -- CStdString m_strMenuLanguage; -- CDateTime m_screensaverLastActivated; -- CecButtonPress m_button; -- std::queue m_buttonQueue; -- unsigned int m_lastKeypress; -- CCriticalSection m_critSection; -+ DllLibCEC* m_dll; -+ CEC::ICECAdapter* m_cecAdapter; -+ bool m_bStarted; -+ bool m_bHasButton; -+ bool m_bIsReady; -+ bool m_bHasConnectedAudioSystem; -+ CStdString m_strMenuLanguage; -+ CDateTime m_screensaverLastActivated; -+ CecButtonPress m_button; -+ std::queue m_buttonQueue; -+ std::queue m_volumeChangeQueue; -+ unsigned int m_lastKeypress; -+ CecVolumeChange m_lastChange; -+ int m_iExitCode; -+ bool m_bIsMuted; -+ CPeripheralCecAdapterUpdateThread*m_queryThread; -+ CEC::ICECCallbacks m_callbacks; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ }; -+ -+ class CPeripheralCecAdapterUpdateThread : public CThread -+ { -+ public: -+ CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, CEC::libcec_configuration *configuration); -+ virtual ~CPeripheralCecAdapterUpdateThread(void); -+ -+ virtual void Signal(void); -+ virtual bool UpdateConfiguration(CEC::libcec_configuration *configuration); -+ -+ protected: -+ virtual bool WaitReady(void); -+ virtual bool SetInitialConfiguration(void); -+ virtual void Process(void); -+ -+ CPeripheralCecAdapter * m_adapter; -+ CEvent m_event; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ CEC::libcec_configuration m_nextConfiguration; -+ bool m_bNextConfigurationScheduled; -+ bool m_bIsUpdating; - }; - } - -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:47:59.570515061 +0200 -@@ -30,6 +30,14 @@ - using namespace PERIPHERALS; - using namespace std; - -+struct SortBySettingsOrder -+{ -+ bool operator()(const CSetting *left, const CSetting *right) -+ { -+ return left->GetOrder() < right->GetOrder(); -+ } -+}; -+ - CPeripheral::CPeripheral(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId) : - m_type(type), - m_busType(busType), -@@ -168,6 +176,15 @@ - return m_subDevices.size() > 0; - } - -+vector CPeripheral::GetSettings(void) const -+{ -+ vector settings; -+ for (map::const_iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ settings.push_back(it->second); -+ sort(settings.begin(), settings.end(), SortBySettingsOrder()); -+ return settings; -+} -+ - void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) - { - if (!setting) -@@ -183,7 +200,7 @@ - case SETTINGS_TYPE_BOOL: - { - const CSettingBool *mappedSetting = (const CSettingBool *) setting; -- CSettingBool *boolSetting = new CSettingBool(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); -+ CSettingBool *boolSetting = new CSettingBool(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); - if (boolSetting) - { - boolSetting->SetVisible(mappedSetting->IsVisible()); -@@ -194,7 +211,7 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -@@ -205,7 +222,7 @@ - case SETTINGS_TYPE_FLOAT: - { - const CSettingFloat *mappedSetting = (const CSettingFloat *) setting; -- CSettingFloat *floatSetting = new CSettingFloat(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); -+ CSettingFloat *floatSetting = new CSettingFloat(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); - if (floatSetting) - { - floatSetting->SetVisible(mappedSetting->IsVisible()); -@@ -216,7 +233,7 @@ - case SETTINGS_TYPE_STRING: - { - const CSettingString *mappedSetting = (const CSettingString *) setting; -- CSettingString *stringSetting = new CSettingString(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); -+ CSettingString *stringSetting = new CSettingString(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); - if (stringSetting) - { - stringSetting->SetVisible(mappedSetting->IsVisible()); -@@ -323,7 +340,7 @@ - bool bChanged(boolSetting->GetData() != bValue); - boolSetting->SetData(bValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -339,7 +356,7 @@ - bool bChanged(intSetting->GetData() != iValue); - intSetting->SetData(iValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -355,11 +372,26 @@ - bool bChanged(floatSetting->GetData() != fValue); - floatSetting->SetData(fValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } - -+void CPeripheral::SetSettingVisible(const CStdString &strKey, bool bSetTo) -+{ -+ map::iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ (*it).second->SetVisible(bSetTo); -+} -+ -+bool CPeripheral::IsSettingVisible(const CStdString &strKey) const -+{ -+ map::const_iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ return (*it).second->IsVisible(); -+ return false; -+} -+ - void CPeripheral::SetSetting(const CStdString &strKey, const CStdString &strValue) - { - map::iterator it = m_settings.find(strKey); -@@ -373,7 +405,7 @@ - bool bChanged(!stringSetting->GetData().Equals(strValue)); - stringSetting->SetData(strValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - else if ((*it).second->GetType() == SETTINGS_TYPE_INT) -@@ -436,7 +468,7 @@ - - if (!bExiting) - { -- for (vector::iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) -+ for (set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) - OnSettingChanged(*it); - } - m_changedSettings.clear(); -@@ -467,7 +499,7 @@ - map::iterator it = m_settings.begin(); - while (it != m_settings.end()) - { -- m_changedSettings.push_back((*it).first); -+ m_changedSettings.insert((*it).first); - ++it; - } - -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:47:59.589515425 +0200 -@@ -20,7 +20,7 @@ - * - */ - --#include -+#include - #include "utils/StdString.h" - #include "peripherals/PeripheralTypes.h" - -@@ -128,6 +128,8 @@ - */ - virtual const CStdString GetSettingString(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, const CStdString &strValue); -+ virtual void SetSettingVisible(const CStdString &strKey, bool bSetTo); -+ virtual bool IsSettingVisible(const CStdString &strKey) const; - - virtual int GetSettingInt(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, int iValue); -@@ -142,6 +144,8 @@ - virtual void LoadPersistedSettings(void); - virtual void ResetDefaultSettings(void); - -+ virtual std::vector GetSettings(void) const; -+ - virtual bool ErrorOccured(void) const { return m_bError; } - - protected: -@@ -163,6 +167,6 @@ - std::vector m_features; - std::vector m_subDevices; - std::map m_settings; -- std::vector m_changedSettings; -+ std::set m_changedSettings; - }; - } -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp 2012-04-17 14:47:59.589515425 +0200 -@@ -37,7 +37,7 @@ - - CPeripheralHID::~CPeripheralHID(void) - { -- if (!m_strKeymap.IsEmpty() && GetSettingBool("keymap_enabled")) -+ if (!m_strKeymap.IsEmpty() && !GetSettingBool("do_not_use_custom_keymap")) - { - CLog::Log(LOGDEBUG, "%s - switching active keymapping to: default", __FUNCTION__); - CButtonTranslator::GetInstance().RemoveDevice(m_strKeymap); -@@ -59,9 +59,12 @@ - SetSetting("keymap", m_strKeymap); - } - -+ if (!IsSettingVisible("keymap")) -+ SetSettingVisible("do_not_use_custom_keymap", false); -+ - if (!m_strKeymap.IsEmpty()) - { -- bool bKeymapEnabled(GetSettingBool("keymap_enabled")); -+ bool bKeymapEnabled(!GetSettingBool("do_not_use_custom_keymap")); - if (bKeymapEnabled) - { - CLog::Log(LOGDEBUG, "%s - adding keymapping for: %s", __FUNCTION__, m_strKeymap.c_str()); -@@ -82,7 +85,7 @@ - - void CPeripheralHID::OnSettingChanged(const CStdString &strChangedSetting) - { -- if (m_bInitialised && ((strChangedSetting.Equals("keymap") && GetSettingBool("keymap_enabled")) || strChangedSetting.Equals("keymap_enabled"))) -+ if (m_bInitialised && ((strChangedSetting.Equals("keymap") && !GetSettingBool("do_not_use_custom_keymap")) || strChangedSetting.Equals("keymap_enabled"))) - { - m_bInitialised = false; - InitialiseFeature(FEATURE_HID); -diff -Naur xbmc-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:47:59.590515442 +0200 -@@ -66,17 +66,15 @@ - - if (m_item) - { -- int iIndex = 1; - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (peripheral) - { -- map::iterator it = peripheral->m_settings.begin(); -- while (it != peripheral->m_settings.end()) -+ vector settings = peripheral->GetSettings(); -+ for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) - { -- CSetting *setting = (*it).second; -+ CSetting *setting = settings[iPtr]; - if (!setting->IsVisible()) - { -- ++it; - CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); - continue; - } -@@ -89,7 +87,7 @@ - if (boolSetting) - { - m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData())); -- AddBool(iIndex++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); -+ AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); - } - } - break; -@@ -99,7 +97,7 @@ - if (intSetting) - { - m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(iIndex++, intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); - } - } - break; -@@ -109,7 +107,7 @@ - if (floatSetting) - { - m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData())); -- AddSlider(iIndex++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); -+ AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); - } - } - break; -@@ -119,7 +117,7 @@ - if (stringSetting) - { - m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData())); -- AddString(iIndex, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); -+ AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); - } - } - break; -@@ -128,7 +126,6 @@ - CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); - break; - } -- ++it; - } - } - else -diff -Naur xbmc-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:47:59.647516518 +0200 -@@ -27,9 +27,7 @@ - #include "devices/PeripheralNIC.h" - #include "devices/PeripheralNyxboard.h" - #include "devices/PeripheralTuner.h" --#if defined(HAVE_LIBCEC) - #include "devices/PeripheralCecAdapter.h" --#endif - #include "bus/PeripheralBusUSB.h" - #include "dialogs/GUIDialogPeripheralManager.h" - -@@ -43,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "guilib/Key.h" - - using namespace PERIPHERALS; - using namespace XFILE; -@@ -447,6 +446,8 @@ - void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, map &m_settings) - { - TiXmlElement *currentNode = xmlNode->FirstChildElement("setting"); -+ int iMaxOrder(0); -+ - while (currentNode) - { - CSetting *setting = NULL; -@@ -492,10 +493,32 @@ - } - - //TODO add more types if needed -+ -+ /* set the visibility */ - setting->SetVisible(bConfigurable); -+ -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; -+ -+ /* and add this new setting */ - m_settings[strKey] = setting; -+ - currentNode = currentNode->NextSiblingElement("setting"); - } -+ -+ /* add the settings without an order attribute or an invalid order attribute set at the end */ -+ for (map::iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ { -+ if (it->second->GetOrder() == 0) -+ it->second->SetOrder(++iMaxOrder); -+ } - } - - void CPeripherals::GetDirectory(const CStdString &strPath, CFileItemList &items) const -@@ -531,3 +554,89 @@ - - return NULL; - } -+ -+bool CPeripherals::OnAction(const CAction &action) -+{ -+ if (action.GetID() == ACTION_MUTE) -+ { -+ return ToggleMute(); -+ } -+ -+ if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) -+ { -+ vector peripherals; -+ if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ if (action.GetID() == ACTION_VOLUME_UP) -+ cecDevice->ScheduleVolumeUp(); -+ else -+ cecDevice->ScheduleVolumeDown(); -+ return true; -+ } -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::IsMuted(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->IsMuted()) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::ToggleMute(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ cecDevice->ScheduleMute(); -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::GetNextKeypress(float frameTime, CKey &key) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->GetButton()) -+ { -+ CKey newKey(cecDevice->GetButton(), cecDevice->GetHoldTime()); -+ cecDevice->ResetButton(); -+ key = newKey; -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -diff -Naur xbmc-11.0.1/xbmc/peripherals/Peripherals.h xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.h ---- xbmc-11.0.1/xbmc/peripherals/Peripherals.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.h 2012-04-17 14:47:59.648516536 +0200 -@@ -29,6 +29,8 @@ - class CSetting; - class CSettingsCategory; - class TiXmlElement; -+class CAction; -+class CKey; - - namespace PERIPHERALS - { -@@ -147,6 +149,54 @@ - */ - virtual CPeripheral *GetByPath(const CStdString &strPath) const; - -+ /*! -+ * @brief Try to let one of the peripherals handle an action. -+ * @param action The change to handle. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool OnAction(const CAction &action); -+ -+ /*! -+ * @brief Check whether there's a peripheral that reports to be muted. -+ * @return True when at least one peripheral reports to be muted, false otherwise. -+ */ -+ virtual bool IsMuted(void); -+ -+ /*! -+ * @brief Try to toggle the mute status via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool ToggleMute(void); -+ -+ /*! -+ * @brief Try to mute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool Mute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to unmute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool UnMute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to get a keypress from a peripheral. -+ * @param frameTime The current frametime. -+ * @param key The fetched key. -+ * @return True when a keypress was fetched, false otherwise. -+ */ -+ virtual bool GetNextKeypress(float frameTime, CKey &key); -+ -+ bool SupportsCEC(void) const -+ { -+#if defined(HAVE_LIBCEC) -+ return true; -+#else -+ return false; -+#endif -+ } -+ - private: - CPeripherals(void); - bool LoadMappings(void); diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch deleted file mode 100644 index d08d45ece7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 35e4a2eb5515fe72d87b6d78b0567609df79df2b Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:30:25 +0200 -Subject: [PATCH] fixed: possible deadlock - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 0cb6602..1c91341 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -140,8 +140,10 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { - // this will also power off devices when we're the active source -- CSingleLock lock(m_critSection); -- m_bStop = true; -+ { -+ CSingleLock lock(m_critSection); -+ m_bStop = true; -+ } - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch deleted file mode 100644 index c186e4d62a..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch +++ /dev/null @@ -1,41 +0,0 @@ -From de4cd8d63257af1cb9060c4b2b304a82655adb99 Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:31:46 +0200 -Subject: [PATCH] fixed: make sure the old thread is stopped before starting a - new one, fixes throwing an exception in the main thread - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 14 ++++++++------ - 1 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 1c91341..a898a16 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -148,15 +148,17 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -- // reconnect to the device -- CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ { -+ // reconnect to the device -+ CSingleLock lock(m_critSection); -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); - -- // close the previous connection -- m_cecAdapter->Close(); -+ // close the previous connection -+ m_cecAdapter->Close(); -+ } - - // and open a new one -- m_bStop = false; -+ StopThread(); - Create(); - } - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index f870fbb3b6..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,630 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-04-17 14:08:05.972587511 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:18:39.755586920 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.6.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-04-17 14:08:05.974587546 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -2853,7 +2853,7 @@ - Could not detect the CEC port. Set it up manually. - Could not initialise the CEC adapter. Check your settings. - Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) -- Put this PC in standby mode when the TV is switched off -+ When the TV is switched off - HDMI port number - Connected - Adapter found, but libCEC is not available -@@ -2865,4 +2865,7 @@ - Configuration updated - Failed to set the new configuration. Please check your settings. - Send 'inactive source' command when stopping XBMC -+ Put devices in standby mode when putting the PC in standby -+ This device needs servicing -+ Ignore - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-04-17 14:08:05.975587564 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -14,13 +14,14 @@ - - - -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ - - - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp 2012-04-17 14:18:39.758586977 +0200 -@@ -323,6 +323,7 @@ - peripheralFile->SetProperty("bus", PeripheralTypeTranslator::BusTypeToString(peripheral->GetBusType())); - peripheralFile->SetProperty("location", peripheral->Location()); - peripheralFile->SetProperty("class", PeripheralTypeTranslator::TypeToString(peripheral->Type())); -+ peripheralFile->SetProperty("version", peripheral->GetVersionInfo()); - items.Add(peripheralFile); - } - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:17:35.207364830 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:18:39.760587015 +0200 -@@ -41,7 +41,7 @@ - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 0x1500 -+#define CEC_LIB_SUPPORTED_VERSION 0x1600 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -@@ -80,7 +80,9 @@ - m_lastKeypress(0), - m_lastChange(VOLUME_CHANGE_NONE), - m_iExitCode(0), -- m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bIsMuted(false), // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bGoingToStandby(false), -+ m_bIsRunning(false) - { - m_button.iButton = 0; - m_button.iDuration = 0; -@@ -96,6 +98,7 @@ - - m_bStop = true; - StopThread(true); -+ CAnnouncementManager::RemoveAnnouncer(this); - - if (m_dll && m_cecAdapter) - { -@@ -110,7 +113,11 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_iExitCode = data.asInteger(0); -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = data.asInteger(0); -+ } -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(false); - } - else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) -@@ -142,23 +149,22 @@ - // this will also power off devices when we're the active source - { - CSingleLock lock(m_critSection); -- m_bStop = true; -+ m_bGoingToStandby = false; - } -- WaitForThreadExit(0); -+ StopThread(); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { - { -- // reconnect to the device - CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -- -- // close the previous connection -- m_cecAdapter->Close(); -+ m_iExitCode = EXITCODE_RESTARTAPP; - } - -- // and open a new one -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(); -+ -+ // and open a new one - Create(); - } - } -@@ -172,6 +178,7 @@ - m_callbacks.CBCecKeyPress = &CecKeyPress; - m_callbacks.CBCecCommand = &CecCommand; - m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_callbacks.CBCecAlert = &CecAlert; - m_configuration.callbackParam = this; - m_configuration.callbacks = &m_callbacks; - -@@ -200,6 +207,8 @@ - else - { - CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ if (m_configuration.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); - } - - m_bStarted = true; -@@ -297,6 +306,13 @@ - if (!OpenConnection()) - return; - -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = EXITCODE_QUIT; -+ m_bGoingToStandby = false; -+ m_bIsRunning = true; -+ } -+ - CAnnouncementManager::AddAnnouncer(this); - - m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -@@ -312,8 +328,17 @@ - } - - delete m_queryThread; -+ m_queryThread = NULL; -+ -+ bool bSendStandbyCommands(false); -+ { -+ CSingleLock lock(m_critSection); -+ bSendStandbyCommands = m_iExitCode != EXITCODE_REBOOT && -+ m_iExitCode != EXITCODE_RESTARTAPP && -+ (!m_bGoingToStandby || GetSettingBool("standby_tv_on_pc_standby")); -+ } - -- if (m_iExitCode != EXITCODE_REBOOT) -+ if (bSendStandbyCommands) - { - if (m_cecAdapter->IsLibCECActiveSource()) - { -@@ -337,7 +362,12 @@ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); -- m_bStarted = false; -+ -+ { -+ CSingleLock lock(m_critSection); -+ m_bStarted = false; -+ m_bIsRunning = false; -+ } - } - - bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) -@@ -556,11 +586,15 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ if (command.initiator == CECDEVICE_TV && -+ (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_configuration.bShutdownOnStandby == 1) && - (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { - adapter->m_bStarted = false; -- g_application.getApplicationMessenger().Suspend(); -+ if (adapter->m_configuration.bPowerOffOnStandby == 1) -+ g_application.getApplicationMessenger().Suspend(); -+ else if (adapter->m_configuration.bShutdownOnStandby == 1) -+ g_application.getApplicationMessenger().Shutdown(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -@@ -634,6 +668,30 @@ - return 1; - } - -+int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter &data) -+{ -+ (void)data; -+ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ int iAlertString(0); -+ switch (alert) -+ { -+ case CEC_ALERT_SERVICE_DEVICE: -+ iAlertString = 36027; -+ break; -+ default: -+ break; -+ } -+ -+ if (iAlertString) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(iAlertString)); -+ -+ return 1; -+} -+ - int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) - { - CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -@@ -695,6 +753,10 @@ - case CEC_USER_CONTROL_CODE_RIGHT_DOWN: - iButton = XINPUT_IR_REMOTE_RIGHT; - break; -+ case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: -+ case CEC_USER_CONTROL_CODE_SETUP_MENU: -+ case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -+ case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_ROOT_MENU: - iButton = XINPUT_IR_REMOTE_MENU; - break; -@@ -711,7 +773,11 @@ - iButton = XINPUT_IR_REMOTE_CHANNEL_PLUS; - break; - case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: -+#if defined(XINPUT_IR_REMOTE_TELETEXT) -+ iButton = XINPUT_IR_REMOTE_TELETEXT; // only supported by the pvr branch -+#else - iButton = XINPUT_IR_REMOTE_BACK; -+#endif - break; - case CEC_USER_CONTROL_CODE_SOUND_SELECT: - iButton = XINPUT_IR_REMOTE_LANGUAGE; -@@ -806,13 +872,23 @@ - case CEC_USER_CONTROL_CODE_F4_YELLOW: - iButton = XINPUT_IR_REMOTE_YELLOW; - break; -+ case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: -+#if defined(XINPUT_IR_REMOTE_GUIDE) -+ iButton = XINPUT_IR_REMOTE_GUIDE; -+#else -+ bHasButton = false; -+#endif -+ break; -+ case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: -+#if defined(XINPUT_IR_REMOTE_LIVE_TV) -+ iButton = XINPUT_IR_REMOTE_LIVE_TV; -+#else -+ bHasButton = false; -+#endif -+ break; - case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: - case CEC_USER_CONTROL_CODE_EJECT: -- case CEC_USER_CONTROL_CODE_SETUP_MENU: -- case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -- case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_DOT: -- case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: - case CEC_USER_CONTROL_CODE_INPUT_SELECT: - case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: - case CEC_USER_CONTROL_CODE_HELP: -@@ -821,7 +897,6 @@ - case CEC_USER_CONTROL_CODE_ANGLE: - case CEC_USER_CONTROL_CODE_SUB_PICTURE: - case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: -- case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: - case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: - case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: - case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: -@@ -894,11 +969,15 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else -+ else if (IsRunning()) - { - SetConfigurationFromSettings(); - m_queryThread->UpdateConfiguration(&m_configuration); - } -+ else -+ { -+ InitialiseFeature(FEATURE_CEC); -+ } - } - - int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) -@@ -962,7 +1041,7 @@ - - // set the physical address, when baseDevice or iHDMIPort are not set - if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -- m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 15) - { - m_configuration.iPhysicalAddress = config.iPhysicalAddress; - CStdString strPhysicalAddress; -@@ -977,7 +1056,7 @@ - // set the devices to wake when starting - m_configuration.wakeDevices = config.wakeDevices; - CStdString strWakeDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.wakeDevices[iPtr]) - strWakeDevices.AppendFormat(" %X", iPtr); - SetSetting("wake_devices", strWakeDevices.Trim()); -@@ -985,10 +1064,10 @@ - // set the devices to power off when stopping - m_configuration.powerOffDevices = config.powerOffDevices; - CStdString strPowerOffDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.powerOffDevices[iPtr]) - strPowerOffDevices.AppendFormat(" %X", iPtr); -- SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ SetSetting("standby_devices", strPowerOffDevices.Trim()); - - // set the boolean settings - m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -@@ -1001,17 +1080,27 @@ - SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); - - m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -- SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); - - if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) - m_configuration.bSendInactiveSource = config.bSendInactiveSource; - SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ { -+ m_configuration.iFirmwareVersion = config.iFirmwareVersion; -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); -+ m_configuration.bShutdownOnStandby = config.bShutdownOnStandby; -+ } -+ -+ SetSetting("standby_pc_on_tv_standby", -+ m_configuration.bPowerOffOnStandby == 1 ? 13011 : -+ m_configuration.bShutdownOnStandby == 1 ? 13005 : 36028); - } - - void CPeripheralCecAdapter::SetConfigurationFromSettings(void) - { -- // client version 1.5.0 -- m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ // client version 1.6.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_6_0; - - // device name 'XBMC' - snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -@@ -1061,15 +1150,16 @@ - m_configuration.powerOffDevices.Clear(); - ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); - -- // always get the settings from the rom, when supported by the firmware -- m_configuration.bGetSettingsFromROM = 1; -- - // read the boolean settings - m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; - m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; - m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -- m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; - m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+ -+ // read the mutually exclusive boolean settings -+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby")); -+ m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0; -+ m_configuration.bShutdownOnStandby = iStandbyAction == 13005 ? 1 : 0; - } - - void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -@@ -1203,6 +1293,12 @@ - return true; - } - -+bool CPeripheralCecAdapter::IsRunning(void) const -+{ -+ CSingleLock lock(m_critSection); -+ return m_bIsRunning; -+} -+ - void CPeripheralCecAdapterUpdateThread::Process(void) - { - // set the initial configuration -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:08:06.071589381 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:18:39.761587034 +0200 -@@ -115,6 +115,8 @@ - static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); - static int CecCommand(void *cbParam, const CEC::cec_command &command); - static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ static int CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter &data); -+ bool IsRunning(void) const; - - virtual bool GetNextKey(void); - virtual bool GetNextCecKey(CEC::cec_keypress &key); -@@ -140,6 +142,8 @@ - CecVolumeChange m_lastChange; - int m_iExitCode; - bool m_bIsMuted; -+ bool m_bGoingToStandby; -+ bool m_bIsRunning; - CPeripheralCecAdapterUpdateThread*m_queryThread; - CEC::ICECCallbacks m_callbacks; - CCriticalSection m_critSection; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -211,7 +211,15 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting(NULL); -+ if (mappedSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ } -+ else if (mappedSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_entries, mappedSetting->GetControlType()); -+ } - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:18:39.758586977 +0200 -@@ -53,6 +53,7 @@ - const CStdString &DeviceName(void) const { return m_strDeviceName; } - bool IsHidden(void) const { return m_bHidden; } - void SetHidden(bool bSetTo = true) { m_bHidden = bSetTo; } -+ const CStdString &GetVersionInfo(void) const { return m_strVersionInfo; } - - /*! - * @brief Check whether this device has the given feature. -@@ -161,6 +162,7 @@ - CStdString m_strVendorId; - int m_iProductId; - CStdString m_strProductId; -+ CStdString m_strVersionInfo; - bool m_bInitialised; - bool m_bHidden; - bool m_bError; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:08:06.105590023 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:18:39.753586884 +0200 -@@ -51,6 +51,7 @@ - delete m_item; - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -@@ -96,8 +97,23 @@ - CSettingInt *intSetting = (CSettingInt *) setting; - if (intSetting) - { -- m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ if (intSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ } -+ else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData())); -+ vector > entries; -+ map::iterator entriesItr = intSetting->m_entries.begin(); -+ while (entriesItr != intSetting->m_entries.end()) -+ { -+ entries.push_back(make_pair(entriesItr->first, entriesItr->second)); -+ ++entriesItr; -+ } -+ AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries); -+ } - } - } - break; -@@ -160,6 +176,13 @@ - ++intItr; - } - -+ map::iterator intTextItr = m_intTextSettings.begin(); -+ while (intTextItr != m_intTextSettings.end()) -+ { -+ peripheral->SetSetting((*intTextItr).first, (*intTextItr).second); -+ ++intTextItr; -+ } -+ - map::iterator floatItr = m_floatSettings.begin(); - while (floatItr != m_floatSettings.end()) - { -@@ -210,6 +233,7 @@ - /* clear the settings */ - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-04-17 14:18:39.753586884 +0200 -@@ -44,6 +44,7 @@ - bool m_bIsInitialising; - std::map m_boolSettings; - std::map m_intSettings; -+ std::map m_intTextSettings; - std::map m_floatSettings; - std::map m_stringSettings; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:08:06.106590043 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -41,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "Util.h" - #include "guilib/Key.h" - - using namespace PERIPHERALS; -@@ -486,29 +487,46 @@ - float fMax = currentNode->Attribute("max") ? (float) atof(currentNode->Attribute("max")) : 0; - setting = new CSettingFloat(0, strKey, iLabelId, fValue, fMin, fStep, fMax, SPIN_CONTROL_FLOAT); - } -+ else if (strSettingsType.Equals("enum")) -+ { -+ CStdString strEnums(currentNode->Attribute("lvalues")); -+ if (!strEnums.IsEmpty()) -+ { -+ map enums; -+ vector valuesVec; -+ CUtil::Tokenize(strEnums, valuesVec, "|"); -+ for (unsigned int i = 0; i < valuesVec.size(); i++) -+ enums.insert(make_pair(atoi(valuesVec[i]), atoi(valuesVec[i]))); -+ int iValue = currentNode->Attribute("value") ? atoi(currentNode->Attribute("value")) : 0; -+ setting = new CSettingInt(0, strKey, iLabelId, iValue, enums, SPIN_CONTROL_TEXT); -+ } -+ } - else - { - CStdString strValue(currentNode->Attribute("value")); - setting = new CSettingString(0, strKey, iLabelId, strValue, EDIT_CONTROL_INPUT, !bConfigurable, -1); - } - -- //TODO add more types if needed -+ if (setting) -+ { -+ //TODO add more types if needed - -- /* set the visibility */ -- setting->SetVisible(bConfigurable); -+ /* set the visibility */ -+ setting->SetVisible(bConfigurable); - -- /* set the order */ -- int iOrder(0); -- currentNode->Attribute("order", &iOrder); -- /* if the order attribute is invalid or 0, then the setting will be added at the end */ -- if (iOrder < 0) -- iOrder = 0; -- setting->SetOrder(iOrder); -- if (iOrder > iMaxOrder) -- iMaxOrder = iOrder; -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; - -- /* and add this new setting */ -- m_settings[strKey] = setting; -+ /* and add this new setting */ -+ m_settings[strKey] = setting; -+ } - - currentNode = currentNode->NextSiblingElement("setting"); - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch deleted file mode 100644 index d505fdb2d6..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch +++ /dev/null @@ -1,3193 +0,0 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-06-05 15:19:23.820493772 +0200 -@@ -2024,7 +2024,7 @@ - --disable-amd3dnow \ - --disable-armv5te \ - --disable-armv6t2 \ -- --disable-static \ -+ --enable-static \ - `if test "$use_debug" = "no"; then echo --disable-debug; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ -@@ -2038,7 +2038,6 @@ - --disable-ffplay \ - --disable-ffserver \ - --disable-ffmpeg \ -- --enable-shared \ - --disable-doc \ - --disable-decoder=mpeg_xvmc \ - --enable-postproc \ -@@ -2046,6 +2045,7 @@ - --enable-protocol=http \ - --enable-pthreads \ - --enable-runtime-cpudetect \ -+ --disable-openmp \ - --cc="$CC" && - sed -ie "s#YASM=yasm#YASM=${prefix}/bin/yasm#" config.mak && - sed -ie "s#YASMDEP=yasm#YASMDEP=${prefix}/bin/yasm#" config.mak && -diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h ---- xbmc-11.0.1/lib/DllAvCodec.h 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCodec.h 2012-06-05 15:19:23.822493812 +0200 -@@ -24,7 +24,7 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" -+#include "DllAvUtil.h" - #include "utils/log.h" - - extern "C" { -@@ -76,28 +76,6 @@ - #endif - } - --/* Some convenience macros introduced at this particular revision of libavcodec. -- */ --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,25,0) --#define CH_LAYOUT_5POINT0_BACK (CH_LAYOUT_SURROUND|CH_BACK_LEFT|CH_BACK_RIGHT) --#define CH_LAYOUT_5POINT1_BACK (CH_LAYOUT_5POINT0_BACK|CH_LOW_FREQUENCY) --#undef CH_LAYOUT_7POINT1_WIDE --#define CH_LAYOUT_7POINT1_WIDE (CH_LAYOUT_5POINT1_BACK|\ -- CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER) --#endif -- --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,64,0) --// API added on: 2010-03-31 --#define AVMediaType CodecType --#define AVMEDIA_TYPE_UNKNOWN CODEC_TYPE_UNKNOWN --#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO --#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO --#define AVMEDIA_TYPE_DATA CODEC_TYPE_DATA --#define AVMEDIA_TYPE_SUBTITLE CODEC_TYPE_SUBTITLE --#define AVMEDIA_TYPE_ATTACHMENT CODEC_TYPE_ATTACHMENT --#define AVMEDIA_TYPE_NB CODEC_TYPE_NB --#endif -- - #include "threads/SingleLock.h" - - class DllAvCodecInterface -@@ -106,20 +84,20 @@ - virtual ~DllAvCodecInterface() {} - virtual void avcodec_register_all(void)=0; - virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0; -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec)=0; -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)=0; - virtual AVCodec *avcodec_find_decoder(enum CodecID id)=0; - virtual AVCodec *avcodec_find_encoder(enum CodecID id)=0; - virtual int avcodec_close_dont_call(AVCodecContext *avctx)=0; - virtual AVFrame *avcodec_alloc_frame(void)=0; - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height)=0; - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)=0; -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt)=0; -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)=0; - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)=0; - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples)=0; - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height)=0; -- virtual AVCodecContext *avcodec_alloc_context(void)=0; -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec)=0; - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)=0; -- virtual void avcodec_get_context_defaults(AVCodecContext *s)=0; -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec)=0; - virtual AVCodecParserContext *av_parser_init(int codec_id)=0; - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, -@@ -137,7 +115,6 @@ - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt)=0; - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)=0; - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)=0; -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count)=0; - virtual AVCodec *av_codec_next(AVCodec *c)=0; - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -151,7 +128,7 @@ - virtual int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct layer - class DllAvCodec : public DllDynamic, DllAvCodecInterface -@@ -166,12 +143,12 @@ - ::avcodec_register_all(); - } - virtual void avcodec_flush_buffers(AVCodecContext *avctx) { ::avcodec_flush_buffers(avctx); } -- virtual int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ virtual int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::avcodec_open(avctx, codec); -+ return ::avcodec_open2(avctx, codec, options); - } -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec) { *(int *)0x0 = 0; return 0; } -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { *(int *)0x0 = 0; return 0; } - virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(int *)0x0 = 0; return 0; } - virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); } - virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); } -@@ -182,33 +159,21 @@ - } - virtual AVFrame *avcodec_alloc_frame() { return ::avcodec_alloc_frame(); } - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height) { return ::avpicture_fill(picture, ptr, pix_fmt, width, height); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,23,0) -- // API added on: 2009-04-07 - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video2(avctx, picture, got_picture_ptr, avpkt); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio3(avctx, samples, frame_size_ptr, avpkt); } -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio4(avctx, frame, got_frame_ptr, avpkt); } - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, avpkt); } --#else -- virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video(avctx, picture, got_picture_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio2(avctx, samples, frame_size_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle(avctx, sub, got_sub_ptr, avpkt->data, avpkt->size); } --#endif - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples) { return ::avcodec_encode_audio(avctx, buf, buf_size, samples); } - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height) { return ::avpicture_get_size(pix_fmt, width, height); } -- virtual AVCodecContext *avcodec_alloc_context() { return ::avcodec_alloc_context(); } -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec) { return ::avcodec_alloc_context3(codec); } - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { ::avcodec_string(buf, buf_size, enc, encode); } -- virtual void avcodec_get_context_defaults(AVCodecContext *s) { ::avcodec_get_context_defaults(s); } -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec) { ::avcodec_get_context_defaults3(s, codec); } - - virtual AVCodecParserContext *av_parser_init(int codec_id) { return ::av_parser_init(codec_id); } - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, - int64_t pts, int64_t dts, int64_t pos) - { --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,21,0) -- // API added on : 2009-03-05 - return ::av_parser_parse2(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts, pos); --#else -- return ::av_parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts); --#endif - } - virtual void av_parser_close(AVCodecParserContext *s) { ::av_parser_close(s); } - -@@ -225,7 +190,6 @@ - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic) { return ::avcodec_default_get_buffer(s, pic); } - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic) { ::avcodec_default_release_buffer(s, pic); } - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) { return ::avcodec_default_get_format(s, fmt); } -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count) { return ::avcodec_thread_init(s, thread_count); } - virtual AVCodec *av_codec_next(AVCodec *c) { return ::av_codec_next(c); } - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -256,12 +220,12 @@ - { - DECLARE_DLL_WRAPPER(DllAvCodec, DLL_PATH_LIBAVCODEC) - DEFINE_FUNC_ALIGNED1(void, __cdecl, avcodec_flush_buffers, AVCodecContext*) -- DEFINE_FUNC_ALIGNED2(int, __cdecl, avcodec_open_dont_call, AVCodecContext*, AVCodec *) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avcodec_open2_dont_call, AVCodecContext*, AVCodec *, AVDictionary **) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_video2, AVCodecContext*, AVFrame*, int*, AVPacket*) -- DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio3, AVCodecContext*, int16_t*, int*, AVPacket*) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio4, AVCodecContext*, AVFrame*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_subtitle2, AVCodecContext*, AVSubtitle*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_encode_audio, AVCodecContext*, uint8_t*, int, const short*) -- DEFINE_FUNC_ALIGNED0(AVCodecContext*, __cdecl, avcodec_alloc_context) -+ DEFINE_FUNC_ALIGNED1(AVCodecContext*, __cdecl, avcodec_alloc_context3, AVCodec *) - DEFINE_FUNC_ALIGNED1(AVCodecParserContext*, __cdecl, av_parser_init, int) - DEFINE_FUNC_ALIGNED9(int, __cdecl, av_parser_parse2, AVCodecParserContext*,AVCodecContext*, uint8_t**, int*, const uint8_t*, int, int64_t, int64_t, int64_t) - DEFINE_METHOD1(int, av_dup_packet, (AVPacket *p1)) -@@ -278,7 +242,7 @@ - DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5)) - DEFINE_METHOD3(int, avpicture_get_size, (PixelFormat p1, int p2, int p3)) - DEFINE_METHOD4(void, avcodec_string, (char *p1, int p2, AVCodecContext *p3, int p4)) -- DEFINE_METHOD1(void, avcodec_get_context_defaults, (AVCodecContext *p1)) -+ DEFINE_METHOD2(void, avcodec_get_context_defaults3, (AVCodecContext *p1, AVCodec *p2)) - DEFINE_METHOD1(void, av_parser_close, (AVCodecParserContext *p1)) - DEFINE_METHOD1(void, avpicture_free, (AVPicture *p1)) - DEFINE_METHOD1(AVBitStreamFilterContext*, av_bitstream_filter_init, (const char *p1)) -@@ -290,7 +254,6 @@ - DEFINE_METHOD2(void, avcodec_default_release_buffer, (AVCodecContext *p1, AVFrame *p2)) - DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2)) - -- DEFINE_METHOD2(int, avcodec_thread_init, (AVCodecContext *p1, int p2)) - DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1)) - DEFINE_METHOD6(AVAudioConvert*, av_audio_convert_alloc, (enum AVSampleFormat p1, int p2, - enum AVSampleFormat p3, int p4, -@@ -301,7 +264,7 @@ - const void * const p4[6], const int p5[6], int p6)) - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(avcodec_flush_buffers) -- RESOLVE_METHOD_RENAME(avcodec_open,avcodec_open_dont_call) -+ RESOLVE_METHOD_RENAME(avcodec_open2,avcodec_open2_dont_call) - RESOLVE_METHOD_RENAME(avcodec_close,avcodec_close_dont_call) - RESOLVE_METHOD(avcodec_find_decoder) - RESOLVE_METHOD(avcodec_find_encoder) -@@ -309,13 +272,13 @@ - RESOLVE_METHOD_RENAME(avcodec_register_all, avcodec_register_all_dont_call) - RESOLVE_METHOD(avpicture_fill) - RESOLVE_METHOD(avcodec_decode_video2) -- RESOLVE_METHOD(avcodec_decode_audio3) -+ RESOLVE_METHOD(avcodec_decode_audio4) - RESOLVE_METHOD(avcodec_decode_subtitle2) - RESOLVE_METHOD(avcodec_encode_audio) - RESOLVE_METHOD(avpicture_get_size) -- RESOLVE_METHOD(avcodec_alloc_context) -+ RESOLVE_METHOD(avcodec_alloc_context3) - RESOLVE_METHOD(avcodec_string) -- RESOLVE_METHOD(avcodec_get_context_defaults) -+ RESOLVE_METHOD(avcodec_get_context_defaults3) - RESOLVE_METHOD(av_parser_init) - RESOLVE_METHOD(av_parser_parse2) - RESOLVE_METHOD(av_parser_close) -@@ -328,7 +291,6 @@ - RESOLVE_METHOD(avcodec_default_get_buffer) - RESOLVE_METHOD(avcodec_default_release_buffer) - RESOLVE_METHOD(avcodec_default_get_format) -- RESOLVE_METHOD(avcodec_thread_init) - RESOLVE_METHOD(av_codec_next) - RESOLVE_METHOD(av_audio_convert_alloc) - RESOLVE_METHOD(av_audio_convert_free) -@@ -339,15 +301,15 @@ - END_METHOD_RESOLVE() - - /* dependencies of libavcodec */ -- DllAvCore m_dllAvCore; -+ DllAvUtil m_dllAvUtil; - // DllAvUtil loaded implicitely by m_dllAvCore - - public: - static CCriticalSection m_critSection; -- int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return avcodec_open_dont_call(avctx,codec); -+ return avcodec_open2_dont_call(avctx,codec, options); - } - int avcodec_close(AVCodecContext *avctx) - { -@@ -361,7 +323,7 @@ - } - virtual bool Load() - { -- if (!m_dllAvCore.Load()) -+ if (!m_dllAvUtil.Load()) - return false; - return DllDynamic::Load(); - } -diff -Naur xbmc-11.0.1/lib/DllAvCore.h xbmc-11.0.1.patch/lib/DllAvCore.h ---- xbmc-11.0.1/lib/DllAvCore.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCore.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,182 +0,0 @@ --#pragma once --/* -- * Copyright (C) 2005-2010 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to the Free -- * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -- * Boston, MA 02110-1301, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#if (defined HAVE_CONFIG_H) && (!defined WIN32) -- #include "config.h" --#endif --#include "DynamicDll.h" --#include "DllAvUtil.h" --#include "utils/log.h" -- --extern "C" { --#ifdef USE_EXTERNAL_FFMPEG -- #ifdef HAVE_LIBAVUTIL_SAMPLEFMT_H -- // libavcore was merged to libavutil on 2010-02-15 -- #include -- #include -- #endif -- -- #ifdef HAVE_LIBAVCORE_AVCORE_H -- #include -- #endif -- #ifdef HAVE_LIBAVCORE_SAMPLEFMT_H -- #include -- #endif -- -- /* Needed for old FFmpeg versions as used below */ -- #ifdef HAVE_LIBAVCODEC_AVCODEC_H -- #include -- #else -- #include -- #endif --#else -- #include "libavcore/avcore.h" -- #include "libavcore/samplefmt.h" --#endif --} -- --/* Compatibility for old external FFmpeg versions. */ -- --#ifdef USE_EXTERNAL_FFMPEG -- --#ifndef LIBAVCORE_VERSION_INT --// API added on: 2010-07-21, removed on 2010-02-15 --#define LIBAVCORE_VERSION_INT 0 --#endif -- --#ifndef AV_SAMPLE_FMT_NONE --// API added on: 2010-11-02 --#define AVSampleFormat SampleFormat --#define AV_SAMPLE_FMT_NONE SAMPLE_FMT_NONE --#define AV_SAMPLE_FMT_U8 SAMPLE_FMT_U8 --#define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16 --#define AV_SAMPLE_FMT_S32 SAMPLE_FMT_S32 --#define AV_SAMPLE_FMT_FLT SAMPLE_FMT_FLT --#define AV_SAMPLE_FMT_DBL SAMPLE_FMT_DBL --#endif -- --#ifndef AV_CH_FRONT_LEFT --// API added on: 2010-11-21 --#define AV_CH_FRONT_LEFT CH_FRONT_LEFT --#define AV_CH_FRONT_RIGHT CH_FRONT_RIGHT --#define AV_CH_FRONT_CENTER CH_FRONT_CENTER --#define AV_CH_LOW_FREQUENCY CH_LOW_FREQUENCY --#define AV_CH_BACK_LEFT CH_BACK_LEFT --#define AV_CH_BACK_RIGHT CH_BACK_RIGHT --#define AV_CH_FRONT_LEFT_OF_CENTER CH_FRONT_LEFT_OF_CENTER --#define AV_CH_FRONT_RIGHT_OF_CENTER CH_FRONT_RIGHT_OF_CENTER --#define AV_CH_BACK_CENTER CH_BACK_CENTER --#define AV_CH_SIDE_LEFT CH_SIDE_LEFT --#define AV_CH_SIDE_RIGHT CH_SIDE_RIGHT --#define AV_CH_TOP_CENTER CH_TOP_CENTER --#define AV_CH_TOP_FRONT_LEFT CH_TOP_FRONT_LEFT --#define AV_CH_TOP_FRONT_CENTER CH_TOP_FRONT_CENTER --#define AV_CH_TOP_FRONT_RIGHT CH_TOP_FRONT_RIGHT --#define AV_CH_TOP_BACK_LEFT CH_TOP_BACK_LEFT --#define AV_CH_TOP_BACK_CENTER CH_TOP_BACK_CENTER --#define AV_CH_TOP_BACK_RIGHT CH_TOP_BACK_RIGHT --#define AV_CH_STEREO_LEFT CH_STEREO_LEFT --#define AV_CH_STEREO_RIGHT CH_STEREO_RIGHT -- --#define AV_CH_LAYOUT_NATIVE CH_LAYOUT_NATIVE -- --#define AV_CH_LAYOUT_MONO CH_LAYOUT_MONO --#define AV_CH_LAYOUT_STEREO CH_LAYOUT_STEREO --#define AV_CH_LAYOUT_2_1 CH_LAYOUT_2_1 --#define AV_CH_LAYOUT_SURROUND CH_LAYOUT_SURROUND --#define AV_CH_LAYOUT_4POINT0 CH_LAYOUT_4POINT0 --#define AV_CH_LAYOUT_2_2 CH_LAYOUT_2_2 --#define AV_CH_LAYOUT_QUAD CH_LAYOUT_QUAD --#define AV_CH_LAYOUT_5POINT0 CH_LAYOUT_5POINT0 --#define AV_CH_LAYOUT_5POINT1 CH_LAYOUT_5POINT1 --#define AV_CH_LAYOUT_5POINT0_BACK CH_LAYOUT_5POINT0_BACK --#define AV_CH_LAYOUT_5POINT1_BACK CH_LAYOUT_5POINT1_BACK --#define AV_CH_LAYOUT_7POINT0 CH_LAYOUT_7POINT0 --#define AV_CH_LAYOUT_7POINT1 CH_LAYOUT_7POINT1 --#define AV_CH_LAYOUT_7POINT1_WIDE CH_LAYOUT_7POINT1_WIDE --#define AV_CH_LAYOUT_STEREO_DOWNMIX CH_LAYOUT_STEREO_DOWNMIX --#endif -- --#endif // USE_EXTERNAL_FFMPEG -- --class DllAvCoreInterface --{ --public: -- virtual ~DllAvCoreInterface() {} -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) = 0; --}; -- --#if (defined USE_EXTERNAL_FFMPEG) -- --// Use direct layer --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ --public: -- virtual ~DllAvCore() {} --#if LIBAVCORE_VERSION_INT >= AV_VERSION_INT(0,12,0) || LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,38,0) -- // API added on: 2010-11-02, moved to libavutil on 2010-02-15 -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_fmt(sample_fmt); } --#else -- // from avcodec.h -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_format(sample_fmt); } --#endif -- -- // DLL faking. -- virtual bool ResolveExports() { return true; } -- virtual bool Load() { --#if LIBAVCORE_VERSION_INT > 0 -- CLog::Log(LOGDEBUG, "DllAvCore: Using libavcore system library"); --#endif -- return true; -- } -- virtual void Unload() {} --}; -- --#else -- --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ -- DECLARE_DLL_WRAPPER(DllAvCore, DLL_PATH_LIBAVCORE) -- -- LOAD_SYMBOLS() -- -- DEFINE_METHOD1(int, av_get_bits_per_sample_fmt, (enum AVSampleFormat p1)) -- -- BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD(av_get_bits_per_sample_fmt) -- END_METHOD_RESOLVE() -- -- /* dependency of libavcore */ -- DllAvUtil m_dllAvUtil; -- --public: -- virtual bool Load() -- { -- if (!m_dllAvUtil.Load()) -- return false; -- return DllDynamic::Load(); -- } --}; -- --#endif -- -diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h ---- xbmc-11.0.1/lib/DllAvFilter.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFilter.h 2012-06-05 15:19:23.835494072 +0200 -@@ -24,8 +24,8 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" - #include "DllAvCodec.h" -+#include "DllSwResample.h" - #include "utils/log.h" - - extern "C" { -@@ -43,24 +43,17 @@ - #if (defined USE_EXTERNAL_FFMPEG) - #if (defined HAVE_LIBAVFILTER_AVFILTER_H) - #include -+ #include -+ #include - #elif (defined HAVE_FFMPEG_AVFILTER_H) - #include -- #endif -- /* for av_vsrc_buffer_add_frame */ -- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) -- #include -- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame); -- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts); -- #else -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts, AVRational pixel_aspect); -+ #include -+ #include - #endif - #else - #include "libavfilter/avfiltergraph.h" -+ #include "libavfilter/buffersink.h" -+ #include "libavfilter/avcodec.h" - #endif - } - -@@ -82,21 +75,16 @@ - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)=0; - virtual int avfilter_poll_frame(AVFilterLink *link)=0; - virtual int avfilter_request_frame(AVFilterLink *link)=0; --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags)=0; --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame)=0; --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts)=0; --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0; - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0; - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)=0; -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags)=0; -+ virtual AVBufferSinkParams *av_buffersink_params_alloc()=0; -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct mapping - class DllAvFilter : public DllDynamic, DllAvFilterInterface - { -@@ -115,12 +103,7 @@ - virtual void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - ::avfilter_graph_free(graph); --#else -- ::avfilter_graph_free(*graph); -- *graph = NULL; --#endif - } - void avfilter_register_all() - { -@@ -133,56 +116,31 @@ - virtual AVFilterInOut *avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return ::avfilter_inout_alloc(); --#else -- return (AVFilterInOut*)::av_mallocz(sizeof(AVFilterInOut)); --#endif - } - virtual void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - ::avfilter_inout_free(inout); --#else -- *inout = NULL; --#endif - } - virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if ( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,79,0) \ -- && LIBAVFILTER_VERSION_INT < AV_VERSION_INT(2,0,0) ) \ -- ||( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0)) - return ::avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, log_ctx); --#else -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return ::avfilter_graph_config(graphctx, log_ctx); --#else -- return ::avfilter_graph_config(graphctx, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); } - virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); } --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, flags); } --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame); } --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts); } --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); } - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); } - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { return ::avfilter_link(src, srcpad, dst, dstpad); } -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags) { return ::av_buffersink_get_buffer_ref(buffer_sink, bufref, flags); } -+ virtual AVBufferSinkParams *av_buffersink_params_alloc() { return ::av_buffersink_params_alloc(); } -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx) { return av_buffersink_poll_frame(ctx); } - // DLL faking. - virtual bool ResolveExports() { return true; } - virtual bool Load() { -@@ -200,45 +158,24 @@ - - DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3)) - DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1)) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph **p1)) --#else -- DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph *p1)) --#endif - DEFINE_METHOD0(void, avfilter_register_all_dont_call) - DEFINE_METHOD6(int, avfilter_graph_create_filter, (AVFilterContext **p1, AVFilter *p2, const char *p3, const char *p4, void *p5, AVFilterGraph *p6)) - DEFINE_METHOD1(AVFilter*, avfilter_get_by_name, (const char *p1)) - DEFINE_METHOD0(AVFilterGraph*, avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - DEFINE_METHOD0(AVFilterInOut*, avfilter_inout_alloc_dont_call) - DEFINE_METHOD1(void, avfilter_inout_free_dont_call, (AVFilterInOut **p1)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut **p3, AVFilterInOut **p4, void *p5)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, void *p5)) --#else -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, AVClass *p5)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, void *p2)) --#else -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, AVClass *p2)) --#endif -+ DEFINE_FUNC_ALIGNED5(int, __cdecl, avfilter_graph_parse_dont_call, AVFilterGraph *, const char *, AVFilterInOut **, AVFilterInOut **, void *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avfilter_graph_config_dont_call, AVFilterGraph *, void *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_poll_frame, AVFilterLink *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_request_frame, AVFilterLink*) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int p3)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- DEFINE_METHOD2(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2)) --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3)) --#else -- DEFINE_METHOD4(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3, AVRational p4)) --#endif - DEFINE_METHOD4(AVFilterBufferRef*, avfilter_get_video_buffer, (AVFilterLink *p1, int p2, int p3, int p4)) - DEFINE_METHOD1(void, avfilter_unref_buffer, (AVFilterBufferRef *p1)) - DEFINE_METHOD4(int, avfilter_link, (AVFilterContext *p1, unsigned p2, AVFilterContext *p3, unsigned p4)) -+ DEFINE_FUNC_ALIGNED3(int , __cdecl, av_buffersink_get_buffer_ref, AVFilterContext *, AVFilterBufferRef **, int); -+ DEFINE_FUNC_ALIGNED0(AVBufferSinkParams*, __cdecl, av_buffersink_params_alloc); -+ DEFINE_FUNC_ALIGNED1(int , __cdecl, av_buffersink_poll_frame, AVFilterContext *); - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call) -@@ -248,10 +185,8 @@ - RESOLVE_METHOD(avfilter_graph_create_filter) - RESOLVE_METHOD(avfilter_get_by_name) - RESOLVE_METHOD(avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - RESOLVE_METHOD_RENAME(avfilter_inout_alloc, avfilter_inout_alloc_dont_call) - RESOLVE_METHOD_RENAME(avfilter_inout_free, avfilter_inout_free_dont_call) --#endif - RESOLVE_METHOD_RENAME(avfilter_graph_parse, avfilter_graph_parse_dont_call) - RESOLVE_METHOD_RENAME(avfilter_graph_config, avfilter_graph_config_dont_call) - RESOLVE_METHOD(avfilter_poll_frame) -@@ -260,10 +195,14 @@ - RESOLVE_METHOD(avfilter_get_video_buffer) - RESOLVE_METHOD(avfilter_unref_buffer) - RESOLVE_METHOD(avfilter_link) -+ RESOLVE_METHOD(av_buffersink_get_buffer_ref) -+ RESOLVE_METHOD(av_buffersink_params_alloc) -+ RESOLVE_METHOD(av_buffersink_poll_frame) - END_METHOD_RESOLVE() - - /* dependencies of libavfilter */ - DllAvUtil m_dllAvUtil; -+ DllSwResample m_dllSwResample; - - public: - int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -279,12 +218,7 @@ - void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - avfilter_graph_free_dont_call(graph); --#else -- avfilter_graph_free_dont_call(*graph); -- m_dllAvUtil.av_freep(graph); --#endif - } - void avfilter_register_all() - { -@@ -294,45 +228,29 @@ - AVFilterInOut* avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return avfilter_inout_alloc_dont_call(); --#else -- return (AVFilterInOut*)m_dllAvUtil.av_mallocz(sizeof(AVFilterInOut)); --#endif - } - int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) - return avfilter_graph_parse_dont_call(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, log_ctx); --#else -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - avfilter_inout_free_dont_call(inout); --#else -- *inout = NULL; --#endif - } - int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return avfilter_graph_config_dont_call(graphctx, log_ctx); --#else -- return avfilter_graph_config_dont_call(graphctx, (AVClass*)log_ctx); --#endif - } - virtual bool Load() - { - if (!m_dllAvUtil.Load()) - return false; -+ if (!m_dllSwResample.Load()) -+ return false; - return DllDynamic::Load(); - } - }; -diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h ---- xbmc-11.0.1/lib/DllAvFormat.h 2012-03-21 23:57:42.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFormat.h 2012-06-05 15:19:23.837494112 +0200 -@@ -62,57 +62,45 @@ - virtual ~DllAvFormatInterface() {} - virtual void av_register_all_dont_call(void)=0; - virtual AVInputFormat *av_find_input_format(const char *short_name)=0; -- virtual int url_feof(ByteIOContext *s)=0; -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)=0; -- virtual void av_close_input_file(AVFormatContext *s)=0; -- virtual void av_close_input_stream(AVFormatContext *s)=0; -+ virtual int url_feof(AVIOContext *s)=0; -+ virtual void avformat_close_input(AVFormatContext **s)=0; - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt)=0; - virtual void av_read_frame_flush(AVFormatContext *s)=0; - virtual int av_read_play(AVFormatContext *s)=0; - virtual int av_read_pause(AVFormatContext *s)=0; - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)=0; --#if (!defined USE_EXTERNAL_FFMPEG) -- virtual int av_find_stream_info_dont_call(AVFormatContext *ic)=0; -+#if (!defined USE_EXTERNAL_FFMPEG) && (!defined TARGET_DARWIN) -+ virtual int avformat_find_stream_info_dont_call(AVFormatContext *ic, AVDictionary **options)=0; - #endif -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap)=0; -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)=0; -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap)=0; -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)=0; -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), - offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)=0; - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)=0; -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -- virtual int url_fdopen(ByteIOContext **s, URLContext *h)=0; -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags)=0; -- virtual int url_fclose(ByteIOContext *s)=0; -- virtual int url_open_dyn_buf(ByteIOContext **s)=0; -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer)=0; -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence)=0; -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual void put_byte(ByteIOContext *s, int b)=0; -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size)=0; -- virtual void put_be24(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be32(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be16(ByteIOContext *s, unsigned int val)=0; -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags)=0; -+ virtual int avio_close(AVIOContext *s)=0; -+ virtual int avio_open_dyn_buf(AVIOContext **s)=0; -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)=0; -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence)=0; -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size)=0; -+ virtual void avio_w8(AVIOContext *s, int b)=0; -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size)=0; -+ virtual void avio_wb24(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb32(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb16(AVIOContext *s, unsigned int val)=0; - virtual AVFormatContext *avformat_alloc_context(void)=0; -- virtual AVStream *av_new_stream(AVFormatContext *s, int id)=0; -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)=0; - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type)=0; -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)=0; -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; -- virtual int av_write_header (AVFormatContext *s)=0; -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options)=0; - virtual int av_write_trailer(AVFormatContext *s)=0; - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt)=0; -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct mapping - class DllAvFormat : public DllDynamic, DllAvFormatInterface -@@ -126,78 +114,45 @@ - } - virtual void av_register_all_dont_call() { *(int* )0x0 = 0; } - virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); } -- virtual int url_feof(ByteIOContext *s) { return ::url_feof(s); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return ::av_metadata_get(m, key, prev, flags); } --#else -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return NULL; } --#endif -- virtual void av_close_input_file(AVFormatContext *s) { ::av_close_input_file(s); } -- virtual void av_close_input_stream(AVFormatContext *s) { ::av_close_input_stream(s); } -+ virtual int url_feof(AVIOContext *s) { return ::url_feof(s); } -+ virtual void avformat_close_input(AVFormatContext **s) { ::avformat_close_input(s); } - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt) { return ::av_read_frame(s, pkt); } - virtual void av_read_frame_flush(AVFormatContext *s) { ::av_read_frame_flush(s); } - virtual int av_read_play(AVFormatContext *s) { return ::av_read_play(s); } - virtual int av_read_pause(AVFormatContext *s) { return ::av_read_pause(s); } - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { return ::av_seek_frame(s, stream_index, timestamp, flags); } -- virtual int av_find_stream_info(AVFormatContext *ic) -+ virtual int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::av_find_stream_info(ic); -+ return ::avformat_find_stream_info(ic, options); - } -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap) { return ::av_open_input_file(ic_ptr, filename, fmt, buf_size, ap); } -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) { ::url_set_interrupt_cb(interrupt_cb); } -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap) { return ::av_open_input_stream(ic_ptr, pb, filename, fmt, ap); } -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options) -+ { return ::avformat_open_input(ps, filename, fmt, options); } -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::init_put_byte(s, buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -+ offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::avio_alloc_context(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {return ::av_probe_input_format(pd, is_opened); } - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) {*score_max = 100; return ::av_probe_input_format(pd, is_opened); } // Use av_probe_input_format, this is not exported by ffmpeg's headers --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,98,0) -- // API added on: 2010-02-08 -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } --#else -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return -1; } --#endif -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::dump_format(ic, index, url, is_output); } -- virtual int url_fdopen(ByteIOContext **s, URLContext *h) { return ::url_fdopen(s, h); } -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags) { return ::url_fopen(s, filename, flags); } -- virtual int url_fclose(ByteIOContext *s) { return ::url_fclose(s); } -- virtual int url_open_dyn_buf(ByteIOContext **s) { return ::url_open_dyn_buf(s); } -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer) { return ::url_close_dyn_buf(s, pbuffer); } -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence) { return ::url_fseek(s, offset, whence); } -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_buffer(s, buf, size); } -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_partial_buffer(s, buf, size); } -- virtual void put_byte(ByteIOContext *s, int b) { ::put_byte(s, b); } -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size) { ::put_buffer(s, buf, size); } -- virtual void put_be24(ByteIOContext *s, unsigned int val) { ::put_be24(s, val); } -- virtual void put_be32(ByteIOContext *s, unsigned int val) { ::put_be32(s, val); } -- virtual void put_be16(ByteIOContext *s, unsigned int val) { ::put_be16(s, val); } -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::av_dump_format(ic, index, url, is_output); } -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags) { return ::avio_open(s, filename, flags); } -+ virtual int avio_close(AVIOContext *s) { return ::avio_close(s); } -+ virtual int avio_open_dyn_buf(AVIOContext **s) { return ::avio_open_dyn_buf(s); } -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { return ::avio_close_dyn_buf(s, pbuffer); } -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence) { return ::avio_seek(s, offset, whence); } -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size) { return ::avio_read(s, buf, size); } -+ virtual void avio_w8(AVIOContext *s, int b) { ::avio_w8(s, b); } -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size) { ::avio_write(s, buf, size); } -+ virtual void avio_wb24(AVIOContext *s, unsigned int val) { ::avio_wb24(s, val); } -+ virtual void avio_wb32(AVIOContext *s, unsigned int val) { ::avio_wb32(s, val); } -+ virtual void avio_wb16(AVIOContext *s, unsigned int val) { ::avio_wb16(s, val); } - virtual AVFormatContext *avformat_alloc_context() { return ::avformat_alloc_context(); } -- virtual AVStream *av_new_stream(AVFormatContext *s, int id) { return ::av_new_stream(s, id); } --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::guess_format(short_name, filename, mime_type); } --#else -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { return ::avformat_new_stream(s, c); } - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::av_guess_format(short_name, filename, mime_type); } --#endif -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) { return ::av_set_parameters(s, ap); } -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::av_alloc_put_byte(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -- virtual int av_write_header (AVFormatContext *s) { return ::av_write_header (s); } -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options) { return ::avformat_write_header (s, options); } - virtual int av_write_trailer(AVFormatContext *s) { return ::av_write_trailer(s); } - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt) { return ::av_write_frame(s, pkt); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,43,0) -- // API added on: 2009-12-13 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set2(pm, key, value, flags); } --#elif LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set(pm, key, value); } --#else -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return -1; } --#endif - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -218,108 +173,78 @@ - - DEFINE_METHOD0(void, av_register_all_dont_call) - DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1)) -- DEFINE_METHOD1(int, url_feof, (ByteIOContext *p1)) -- DEFINE_METHOD4(AVMetadataTag*, av_metadata_get, (AVMetadata *p1, const char *p2, const AVMetadataTag *p3, int p4)) -- DEFINE_METHOD1(void, av_close_input_file, (AVFormatContext *p1)) -- DEFINE_METHOD1(void, av_close_input_stream, (AVFormatContext *p1)) -+ DEFINE_METHOD1(int, url_feof, (AVIOContext *p1)) -+ DEFINE_METHOD1(void, avformat_close_input, (AVFormatContext **p1)) - DEFINE_METHOD1(int, av_read_play, (AVFormatContext *p1)) - DEFINE_METHOD1(int, av_read_pause, (AVFormatContext *p1)) - DEFINE_METHOD1(void, av_read_frame_flush, (AVFormatContext *p1)) - DEFINE_FUNC_ALIGNED2(int, __cdecl, av_read_frame, AVFormatContext *, AVPacket *) - DEFINE_FUNC_ALIGNED4(int, __cdecl, av_seek_frame, AVFormatContext*, int, int64_t, int) -- DEFINE_FUNC_ALIGNED1(int, __cdecl, av_find_stream_info_dont_call, AVFormatContext*) -- DEFINE_FUNC_ALIGNED5(int, __cdecl, av_open_input_file, AVFormatContext**, const char *, AVInputFormat *, int, AVFormatParameters *) -- DEFINE_FUNC_ALIGNED5(int,__cdecl, av_open_input_stream, AVFormatContext **, ByteIOContext *, const char *, AVInputFormat *, AVFormatParameters *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avformat_find_stream_info_dont_call, AVFormatContext*, AVDictionary **) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avformat_open_input, AVFormatContext **, const char *, AVInputFormat *, AVDictionary **) - DEFINE_FUNC_ALIGNED2(AVInputFormat*, __cdecl, av_probe_input_format, AVProbeData*, int) - DEFINE_FUNC_ALIGNED3(AVInputFormat*, __cdecl, av_probe_input_format2, AVProbeData*, int, int*) -- DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, ByteIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_partial_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_byte, ByteIOContext*, int) -- DEFINE_FUNC_ALIGNED3(void, __cdecl, put_buffer, ByteIOContext*, const unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be24, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be32, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be16, ByteIOContext*, unsigned int) -- DEFINE_METHOD1(void, url_set_interrupt_cb, (URLInterruptCB *p1)) -- DEFINE_METHOD8(int, init_put_byte, (ByteIOContext *p1, unsigned char *p2, int p3, int p4, void *p5, -+ DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, AVIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avio_read, AVIOContext*, unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_w8, AVIOContext*, int) -+ DEFINE_FUNC_ALIGNED3(void, __cdecl, avio_write, AVIOContext*, const unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb24, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb32, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb16, AVIOContext*, unsigned int) -+ DEFINE_METHOD7(AVIOContext *, avio_alloc_context, (unsigned char *p1, int p2, int p3, void *p4, -+ int (*p5)(void *opaque, uint8_t *buf, int buf_size), - int (*p6)(void *opaque, uint8_t *buf, int buf_size), -- int (*p7)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*p8)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD4(void, dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -- DEFINE_METHOD2(int, url_fdopen, (ByteIOContext **p1, URLContext *p2)) -- DEFINE_METHOD3(int, url_fopen, (ByteIOContext **p1, const char *p2, int p3)) -- DEFINE_METHOD1(int, url_fclose, (ByteIOContext *p1)) -- DEFINE_METHOD1(int, url_open_dyn_buf, (ByteIOContext **p1)) -- DEFINE_METHOD2(int, url_close_dyn_buf, (ByteIOContext *p1, uint8_t **p2)) -- DEFINE_METHOD3(offset_t, url_fseek, (ByteIOContext *p1, offset_t p2, int p3)) -+ offset_t (*p7)(void *opaque, offset_t offset, int whence))) -+ DEFINE_METHOD4(void, av_dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -+ DEFINE_METHOD3(int, avio_open, (AVIOContext **p1, const char *p2, int p3)) -+ DEFINE_METHOD1(int, avio_close, (AVIOContext *p1)) -+ DEFINE_METHOD1(int, avio_open_dyn_buf, (AVIOContext **p1)) -+ DEFINE_METHOD2(int, avio_close_dyn_buf, (AVIOContext *p1, uint8_t **p2)) -+ DEFINE_METHOD3(offset_t, avio_seek, (AVIOContext *p1, offset_t p2, int p3)) - DEFINE_METHOD0(AVFormatContext *, avformat_alloc_context) -- DEFINE_METHOD2(AVStream *, av_new_stream, (AVFormatContext *p1, int p2)) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- DEFINE_METHOD3(AVOutputFormat *, guess_format, (const char *p1, const char *p2, const char *p3)) --#else -+ DEFINE_METHOD2(AVStream *, avformat_new_stream, (AVFormatContext *p1, AVCodec *p2)) - DEFINE_METHOD3(AVOutputFormat *, av_guess_format, (const char *p1, const char *p2, const char *p3)) --#endif -- DEFINE_METHOD2(int, av_set_parameters, (AVFormatContext *p1, AVFormatParameters *p2)); -- DEFINE_METHOD7(ByteIOContext *, av_alloc_put_byte, (unsigned char *p1, int p2, int p3, void *p4, -- int(*p5)(void *opaque, uint8_t *buf, int buf_size), -- int(*p6)(void *opaque, uint8_t *buf, int buf_size), -- offset_t(*p7)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD1(int, av_write_header , (AVFormatContext *p1)) -+ DEFINE_METHOD2(int, avformat_write_header , (AVFormatContext *p1, AVDictionary **p2)) - DEFINE_METHOD1(int, av_write_trailer, (AVFormatContext *p1)) - DEFINE_METHOD2(int, av_write_frame , (AVFormatContext *p1, AVPacket *p2)) -- DEFINE_METHOD4(int, av_metadata_set2, (AVMetadata **p1, const char *p2, const char *p3, int p4)); - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(av_register_all, av_register_all_dont_call) - RESOLVE_METHOD(av_find_input_format) - RESOLVE_METHOD(url_feof) -- RESOLVE_METHOD(av_metadata_get) -- RESOLVE_METHOD(av_close_input_file) -- RESOLVE_METHOD(av_close_input_stream) -+ RESOLVE_METHOD(avformat_close_input) - RESOLVE_METHOD(av_read_frame) - RESOLVE_METHOD(av_read_play) - RESOLVE_METHOD(av_read_pause) -- RESOLVE_METHOD_RENAME(ff_read_frame_flush, av_read_frame_flush) -+ RESOLVE_METHOD(av_read_frame_flush) - RESOLVE_METHOD(av_seek_frame) -- RESOLVE_METHOD_RENAME(av_find_stream_info, av_find_stream_info_dont_call) -- RESOLVE_METHOD(av_open_input_file) -- RESOLVE_METHOD(url_set_interrupt_cb) -- RESOLVE_METHOD(av_open_input_stream) -- RESOLVE_METHOD(init_put_byte) -+ RESOLVE_METHOD_RENAME(avformat_find_stream_info, avformat_find_stream_info_dont_call) -+ RESOLVE_METHOD(avformat_open_input) -+ RESOLVE_METHOD(avio_alloc_context) - RESOLVE_METHOD(av_probe_input_format) - RESOLVE_METHOD(av_probe_input_format2) - RESOLVE_METHOD(av_probe_input_buffer) -- RESOLVE_METHOD(dump_format) -- RESOLVE_METHOD(url_fdopen) -- RESOLVE_METHOD(url_fopen) -- RESOLVE_METHOD(url_fclose) -- RESOLVE_METHOD(url_open_dyn_buf) -- RESOLVE_METHOD(url_close_dyn_buf) -- RESOLVE_METHOD(url_fseek) -- RESOLVE_METHOD(get_buffer) -- RESOLVE_METHOD(get_partial_buffer) -- RESOLVE_METHOD(put_byte) -- RESOLVE_METHOD(put_buffer) -- RESOLVE_METHOD(put_be24) -- RESOLVE_METHOD(put_be32) -- RESOLVE_METHOD(put_be16) -+ RESOLVE_METHOD(av_dump_format) -+ RESOLVE_METHOD(avio_open) -+ RESOLVE_METHOD(avio_close) -+ RESOLVE_METHOD(avio_open_dyn_buf) -+ RESOLVE_METHOD(avio_close_dyn_buf) -+ RESOLVE_METHOD(avio_seek) -+ RESOLVE_METHOD(avio_read) -+ RESOLVE_METHOD(avio_w8) -+ RESOLVE_METHOD(avio_write) -+ RESOLVE_METHOD(avio_wb24) -+ RESOLVE_METHOD(avio_wb32) -+ RESOLVE_METHOD(avio_wb16) - RESOLVE_METHOD(avformat_alloc_context) -- RESOLVE_METHOD(av_new_stream) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- RESOLVE_METHOD(guess_format) --#else -+ RESOLVE_METHOD(avformat_new_stream) - RESOLVE_METHOD(av_guess_format) --#endif -- RESOLVE_METHOD(av_set_parameters) -- RESOLVE_METHOD(av_alloc_put_byte) -- RESOLVE_METHOD(av_write_header) -+ RESOLVE_METHOD(avformat_write_header) - RESOLVE_METHOD(av_write_trailer) - RESOLVE_METHOD(av_write_frame) -- RESOLVE_METHOD(av_metadata_set2) - END_METHOD_RESOLVE() - - /* dependencies of libavformat */ - DllAvCodec m_dllAvCodec; -- // DllAvCore loaded implicitely by m_dllAvCodec - // DllAvUtil loaded implicitely by m_dllAvCodec - - public: -@@ -328,10 +253,10 @@ - CSingleLock lock(DllAvCodec::m_critSection); - av_register_all_dont_call(); - } -- int av_find_stream_info(AVFormatContext *ic) -+ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return(av_find_stream_info_dont_call(ic)); -+ return avformat_find_stream_info_dont_call(ic, options); - } - - virtual bool Load() -diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h ---- xbmc-11.0.1/lib/DllAvUtil.h 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvUtil.h 2012-06-05 15:19:23.837494112 +0200 -@@ -65,6 +65,7 @@ - #include "libavutil/opt.h" - #include "libavutil/mem.h" - #include "libavutil/fifo.h" -+ #include "libavutil/samplefmt.h" - #endif - } - -@@ -89,7 +90,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0; - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out)=0; -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; - virtual void av_fifo_free(AVFifoBuffer *f) = 0; - virtual void av_fifo_reset(AVFifoBuffer *f) = 0; -@@ -97,10 +98,13 @@ - virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0; - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0; - virtual char *av_strdup(const char *s)=0; -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) = 0; -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags) = 0; -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)=0; -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -- -+#if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct layer - class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - { -@@ -117,12 +121,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); } - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,7,0) -- // API added on: 2008-12-16 -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return ::av_set_string3(obj, name, val, alloc, o_out); } --#else -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return AVERROR(ENOENT); } --#endif -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } - virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } - virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } -@@ -132,6 +131,12 @@ - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) - { return ::av_fifo_generic_write(f, src, size, func); } - virtual char *av_strdup(const char *s) { return ::av_strdup(s); } -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) -+ { return ::av_get_bytes_per_sample(p1); } -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags){ return ::av_dict_get(m, key, prev, flags); } -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags) { return ::av_dict_set(pm, key, value, flags); } -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) -+ { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); } - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -160,7 +165,7 @@ - DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3)); - DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1)) - DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); -- DEFINE_METHOD5(int, av_set_string3, (void *p1, const char *p2, const char *p3, int p4, const AVOption **p5)); -+ DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); - DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) - DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) - DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) -@@ -168,6 +173,10 @@ - DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int))) - DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int))) - DEFINE_METHOD1(char*, av_strdup, (const char *p1)) -+ DEFINE_METHOD1(int, av_get_bytes_per_sample, (enum AVSampleFormat p1)) -+ DEFINE_METHOD4(AVDictionaryEntry *, av_dict_get, (AVDictionary *p1, const char *p2, const AVDictionaryEntry *p3, int p4)) -+ DEFINE_METHOD4(int, av_dict_set, (AVDictionary **p1, const char *p2, const char *p3, int p4)); -+ DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5)) - - public: - BEGIN_METHOD_RESOLVE() -@@ -181,7 +190,7 @@ - RESOLVE_METHOD(av_rescale_q) - RESOLVE_METHOD(av_crc_get_table) - RESOLVE_METHOD(av_crc) -- RESOLVE_METHOD(av_set_string3) -+ RESOLVE_METHOD(av_opt_set) - RESOLVE_METHOD(av_fifo_alloc) - RESOLVE_METHOD(av_fifo_free) - RESOLVE_METHOD(av_fifo_reset) -@@ -189,6 +198,10 @@ - RESOLVE_METHOD(av_fifo_generic_read) - RESOLVE_METHOD(av_fifo_generic_write) - RESOLVE_METHOD(av_strdup) -+ RESOLVE_METHOD(av_get_bytes_per_sample) -+ RESOLVE_METHOD(av_dict_get) -+ RESOLVE_METHOD(av_dict_set) -+ RESOLVE_METHOD(av_samples_get_buffer_size) - END_METHOD_RESOLVE() - }; - -diff -Naur xbmc-11.0.1/lib/DllPostProc.h xbmc-11.0.1.patch/lib/DllPostProc.h ---- xbmc-11.0.1/lib/DllPostProc.h 2012-03-21 23:57:44.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllPostProc.h 2012-06-05 15:19:23.870494772 +0200 -@@ -87,7 +87,7 @@ - virtual void pp_free_context(pp_context *ppContext)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call directly. - class DllPostProc : public DllDynamic, DllPostProcInterface -diff -Naur xbmc-11.0.1/lib/DllSwResample.h xbmc-11.0.1.patch/lib/DllSwResample.h ---- xbmc-11.0.1/lib/DllSwResample.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwResample.h 2012-06-05 15:19:23.870494772 +0200 -@@ -0,0 +1,87 @@ -+#pragma once -+/* -+ * Copyright (C) 2005-2010 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#if (defined HAVE_CONFIG_H) && (!defined WIN32) -+ #include "config.h" -+#endif -+#include "DynamicDll.h" -+ -+extern "C" { -+#ifndef HAVE_MMX -+#define HAVE_MMX -+#endif -+#ifndef __STDC_CONSTANT_MACROS -+#define __STDC_CONSTANT_MACROS -+#endif -+#ifndef __GNUC__ -+#pragma warning(disable:4244) -+#endif -+#if (defined USE_EXTERNAL_FFMPEG) -+ #include -+#else -+ #include "libswresample/swresample.h" -+#endif -+} -+ -+ -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) -+ -+// Use direct mapping -+class DllSwResample : public DllDynamic -+{ -+public: -+ virtual ~DllSwResample() {} -+ -+ // DLL faking. -+ virtual bool ResolveExports() { return true; } -+ virtual bool Load() { -+ CLog::Log(LOGDEBUG, "DllAvFormat: Using libswresample system library"); -+ return true; -+ } -+ virtual void Unload() {} -+}; -+ -+#else -+ -+class DllSwResample : public DllDynamic -+{ -+ DECLARE_DLL_WRAPPER(DllSwResample, DLL_PATH_LIBSWRESAMPLE) -+ -+ LOAD_SYMBOLS() -+ -+ BEGIN_METHOD_RESOLVE() -+ END_METHOD_RESOLVE() -+ -+ /* dependencies of libavformat */ -+ DllAvUtil m_dllAvUtil; -+ -+public: -+ -+ virtual bool Load() -+ { -+ if (!m_dllAvUtil.Load()) -+ return false; -+ return DllDynamic::Load(); -+ } -+}; -+ -+#endif -diff -Naur xbmc-11.0.1/lib/DllSwScale.h xbmc-11.0.1.patch/lib/DllSwScale.h ---- xbmc-11.0.1/lib/DllSwScale.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwScale.h 2012-06-05 15:19:23.871494792 +0200 -@@ -92,7 +92,7 @@ - virtual void sws_freeContext(struct SwsContext *context)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call into this library directly. - class DllSwScale : public DllDynamic, public DllSwScaleInterface -diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in ---- xbmc-11.0.1/lib/Makefile.in 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/Makefile.in 2012-06-05 15:19:23.880494972 +0200 -@@ -1,21 +1,18 @@ - ARCH=@ARCH@ - -+AR=@AR@ - LD=@LD@ - CC=@CC@ - CXX=@CXX@ --SHELL=@SHELL@ --ifeq ($(findstring osx,$(ARCH)),osx) --ifeq ($(findstring arm,$(ARCH)),arm) --LDFLAGS=-arch armv7 -iphoneos_version_min 4.1 -bundle -undefined dynamic_lookup -read_only_relocs suppress --else --LDFLAGS=-bundle -undefined dynamic_lookup -read_only_relocs suppress --endif --else --LDFLAGS=-shared -fPIC -rdynamic --endif - SYSDIR=@abs_top_srcdir@/system/players/dvdplayer --WRAPPER=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o --WRAPPER_MACH_ALIAS=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias -+ -+AVFORMAT_SO=avformat-53-$(ARCH).so -+AVCODEC_SO=avcodec-53-$(ARCH).so -+AVUTIL_SO=avutil-51-$(ARCH).so -+AVFILTER_SO=avfilter-2-$(ARCH).so -+SWSCALE_SO=swscale-2-$(ARCH).so -+POSTPROC_SO=postproc-52-$(ARCH).so -+SWRESAMPLE_SO=swresample-0-$(ARCH).so - - DIRS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -@@ -24,123 +21,55 @@ - - LIBS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -- LIBS+=avutil-50-$(ARCH).so \ -- avcodec-52-$(ARCH).so \ -- avcore-0-$(ARCH).so \ -- avformat-52-$(ARCH).so \ -- postproc-51-$(ARCH).so \ -- avfilter-1-$(ARCH).so \ -- swscale-0-$(ARCH).so --endif -- --ifneq (,$(findstring powerpc,$(ARCH))) -- ARCH_DIR=ppc --else --ifeq ($(findstring arm,$(ARCH)),arm) -- ARCH_DIR=arm --else -- ARCH_DIR=x86 --endif -+ LIBS+=$(AVUTIL_SO) \ -+ $(AVCODEC_SO) \ -+ $(AVFORMAT_SO) \ -+ $(POSTPROC_SO) \ -+ $(AVFILTER_SO) \ -+ $(SWSCALE_SO) \ -+ $(SWRESAMPLE_SO) - endif - - .PHONY: $(DIRS) codecs - --codecs: $(addprefix $(SYSDIR)/, $(LIBS)); -- -- --ifeq ($(findstring osx,$(ARCH)), osx) --# Add -lbundle1.o for powerpc-osx --ifeq ($(ARCH), powerpc-osx) --BUNDLE1_O = -lbundle1.o --endif -- --$(SYSDIR)/avutil-50-$(ARCH).so: $(WRAPPER) ffmpeg/libavutil/libavutil.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavutil/*.o \ -- ffmpeg/libavutil/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcodec/*.o \ -- ffmpeg/libavcodec/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcore/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavformat/*.o $(BUNDLE1_O) -- --ifeq ($(findstring x86,$(ARCH_DIR)), x86) --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/$(ARCH_DIR)/*.o \ -- ffmpeg/libavfilter/*.o $(BUNDLE1_O) --else # No libavfilter/ppc or libavfilter/arm --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/*.o $(BUNDLE1_O) --endif -+ifneq ($(findstring osx,$(ARCH)), osx) - --ifneq ($(findstring arm,$(ARCH)), arm) --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o \ -- ffmpeg/libswscale/$(ARCH_DIR)/*.o $(BUNDLE1_O) --else # No ARM version of swscale available yet. --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o --endif -- --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libpostproc/*.o $(BUNDLE1_O) -- --ffmpeg/libavutil/libavutil.dylib : ffmpeg; --ffmpeg/libavcodec/libavcodec.dylib : ffmpeg; --ffmpeg/libavcore/libavcore.dylib : ffmpeg; --ffmpeg/libavformat/libavformat.dylib : ffmpeg; --ffmpeg/libavformat/libavfilter.dylib : ffmpeg; --ffmpeg/libswscale/libswscale.dylib : ffmpeg; --ffmpeg/libpostproc/libpostproc.dylib : ffmpeg; --ffmpeg: -- $(MAKE) -C $@ -- --else -+codecs: $(addprefix $(SYSDIR)/, $(LIBS)); - --$(SYSDIR)/avutil-50-$(ARCH).so: ffmpeg/libavutil/libavutil.so -+$(SYSDIR)/$(AVUTIL_SO): ffmpeg/libavutil/libavutil.so - cp ffmpeg/libavutil/libavutil.so $@ - --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.so -+$(SYSDIR)/$(AVCODEC_SO): ffmpeg/libavcodec/libavcodec.so - cp ffmpeg/libavcodec/libavcodec.so $@ - --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.so -- cp ffmpeg/libavcore/libavcore.so $@ -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.so -+$(SYSDIR)/$(AVFORMAT_SO): ffmpeg/libavformat/libavformat.so - cp ffmpeg/libavformat/libavformat.so $@ - --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.so -+$(SYSDIR)/$(AVFILTER_SO): ffmpeg/libavfilter/libavfilter.so - cp ffmpeg/libavfilter/libavfilter.so $@ - --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.so -+$(SYSDIR)/$(SWSCALE_SO): ffmpeg/libswscale/libswscale.so - cp ffmpeg/libswscale/libswscale.so $@ - --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.so -+$(SYSDIR)/$(POSTPROC_SO): ffmpeg/libpostproc/libpostproc.so - cp ffmpeg/libpostproc/libpostproc.so $@ - -+$(SYSDIR)/$(SWRESAMPLE_SO): ffmpeg/libswresample/libswresample.so -+ cp ffmpeg/libswresample/libswresample.so $@ -+ - ffmpeg/libavutil/libavutil.so : ffmpeg; - ffmpeg/libavcodec/libavcodec.so : ffmpeg; --ffmpeg/libavcore/libavcore.so : ffmpeg; - ffmpeg/libavformat/libavformat.so : ffmpeg; - ffmpeg/libavfilter/libavfilter.so : ffmpeg; - ffmpeg/libswscale/libswscale.so : ffmpeg; - ffmpeg/libpostproc/libpostproc.so : ffmpeg; -+ffmpeg/libswresample/libswresample.so : ffmpeg; -+endif -+ - ffmpeg: - $(MAKE) -C $@ -- -+ifeq ($(findstring osx,$(ARCH)), osx) -+ $(AR) d ffmpeg/libavcodec/libavcodec.a inverse.o - endif - - clean: -diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp 2012-06-05 15:19:23.881494992 +0200 -@@ -59,11 +59,7 @@ - - CStdString filename = URIUtils::GetFileName(strFile); - AVOutputFormat *fmt = NULL; --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fmt = m_dllAvFormat.guess_format(NULL, filename.c_str(), NULL); --#else - fmt = m_dllAvFormat.av_guess_format(NULL, filename.c_str(), NULL); --#endif - if (!fmt) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Unable to guess the output format for the file %s", filename.c_str()); -@@ -82,7 +78,7 @@ - } - - m_Format = m_dllAvFormat.avformat_alloc_context(); -- m_Format->pb = m_dllAvFormat.av_alloc_put_byte(m_BCBuffer, sizeof(m_BCBuffer), URL_RDONLY, this, NULL, MuxerReadPacket, NULL); -+ m_Format->pb = m_dllAvFormat.avio_alloc_context(m_BCBuffer, sizeof(m_BCBuffer), AVIO_FLAG_READ, this, NULL, MuxerReadPacket, NULL); - if (!m_Format->pb) - { - m_dllAvUtil.av_freep(&m_Format); -@@ -93,17 +89,8 @@ - m_Format->oformat = fmt; - m_Format->bit_rate = g_guiSettings.GetInt("audiocds.bitrate") * 1000; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(m_Format, NULL) != 0) -- { -- m_dllAvUtil.av_freep(&m_Format->pb); -- m_dllAvUtil.av_freep(&m_Format); -- CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to set the muxer parameters"); -- return false; -- } -- - /* add a stream to it */ -- m_Stream = m_dllAvFormat.av_new_stream(m_Format, 1); -+ m_Stream = m_dllAvFormat.avformat_new_stream(m_Format, codec); - if (!m_Stream) - { - m_dllAvUtil.av_freep(&m_Format->pb); -@@ -144,7 +131,7 @@ - return false; - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to open the codec"); - m_dllAvUtil.av_freep(&m_Stream); -@@ -179,7 +166,7 @@ - SetTag("encoder" , "XBMC FFmpeg Encoder"); - - /* write the header */ -- if (m_dllAvFormat.av_write_header(m_Format) != 0) -+ if (m_dllAvFormat.avformat_write_header(m_Format, NULL) != 0) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to write the header"); - delete[] m_Buffer; -@@ -194,7 +181,7 @@ - - void CEncoderFFmpeg::SetTag(const CStdString tag, const CStdString value) - { -- m_dllAvFormat.av_metadata_set2(&m_Format->metadata, tag.c_str(), value.c_str(), 0); -+ m_dllAvUtil.av_dict_set(&m_Format->metadata, tag.c_str(), value.c_str(), 0); - } - - int CEncoderFFmpeg::MuxerReadPacket(void *opaque, uint8_t *buf, int buf_size) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-06-05 15:19:23.882495012 +0200 -@@ -29,10 +29,6 @@ - - CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() - { -- m_iBufferSize1 = 0; -- m_pBuffer1 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); -- memset(m_pBuffer1, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -- - m_iBufferSize2 = 0; - m_pBuffer2 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); - memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -@@ -45,11 +41,11 @@ - m_channelMap[0] = PCM_INVALID; - m_channels = 0; - m_layout = 0; -+ m_pFrame1 = NULL; - } - - CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg() - { -- _aligned_free(m_pBuffer1); - _aligned_free(m_pBuffer2); - Dispose(); - } -@@ -59,12 +55,10 @@ - AVCodec* pCodec; - m_bOpenedCodec = false; - -- if (!m_dllAvCore.Load() || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) -+ if (!m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -- m_dllAvCodec.avcodec_get_context_defaults(m_pCodecContext); - - pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); - if (!pCodec) -@@ -73,6 +67,7 @@ - return false; - } - -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = 1; -@@ -97,13 +92,14 @@ - memcpy(m_pCodecContext->extradata, hints.extradata, hints.extrasize); - } - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to open codec"); - Dispose(); - return false; - } - -+ m_pFrame1 = m_dllAvCodec.avcodec_alloc_frame(); - m_bOpenedCodec = true; - m_iSampleFormat = AV_SAMPLE_FMT_NONE; - return true; -@@ -111,6 +107,9 @@ - - void CDVDAudioCodecFFmpeg::Dispose() - { -+ if (m_pFrame1) m_dllAvUtil.av_free(m_pFrame1); -+ m_pFrame1 = NULL; -+ - if (m_pConvert) - { - m_dllAvCodec.av_audio_convert_free(m_pConvert); -@@ -135,7 +134,7 @@ - - int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) - { -- int iBytesUsed; -+ int iBytesUsed, got_frame; - if (!m_pCodecContext) return -1; - - m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ; -@@ -145,10 +144,17 @@ - m_dllAvCodec.av_init_packet(&avpkt); - avpkt.data = pData; - avpkt.size = iSize; -- iBytesUsed = m_dllAvCodec.avcodec_decode_audio3( m_pCodecContext -- , (int16_t*)m_pBuffer1 -- , &m_iBufferSize1 -+ iBytesUsed = m_dllAvCodec.avcodec_decode_audio4( m_pCodecContext -+ , m_pFrame1 -+ , &got_frame - , &avpkt); -+ if (iBytesUsed < 0 || !got_frame) -+ { -+ m_iBufferSize1 = 0; -+ m_iBufferSize2 = 0; -+ return iBytesUsed; -+ } -+ m_iBufferSize1 = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, m_pCodecContext->sample_fmt, 1); - - /* some codecs will attempt to consume more data than what we gave */ - if (iBytesUsed > iSize) -@@ -184,9 +190,9 @@ - return iBytesUsed; - } - -- const void *ibuf[6] = { m_pBuffer1 }; -+ const void *ibuf[6] = { m_pFrame1->data[0] }; - void *obuf[6] = { m_pBuffer2 }; -- int istr[6] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_pCodecContext->sample_fmt)/8 }; -+ int istr[6] = { m_dllAvUtil.av_get_bytes_per_sample(m_pCodecContext->sample_fmt) }; - int ostr[6] = { 2 }; - int len = m_iBufferSize1 / istr[0]; - if(m_dllAvCodec.av_audio_convert(m_pConvert, obuf, ostr, ibuf, istr, len) < 0) -@@ -208,7 +214,7 @@ - { - if(m_iBufferSize1) - { -- *dst = m_pBuffer1; -+ *dst = m_pFrame1->data[0]; - return m_iBufferSize1; - } - if(m_iBufferSize2) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-06-05 15:19:23.882495012 +0200 -@@ -23,7 +23,6 @@ - - #include "DVDAudioCodec.h" - #include "DllAvCodec.h" --#include "DllAvCore.h" - #include "DllAvFormat.h" - #include "DllAvUtil.h" - -@@ -51,7 +50,7 @@ - enum AVSampleFormat m_iSampleFormat; - enum PCMChannels m_channelMap[PCM_MAX_CH + 1]; - -- BYTE *m_pBuffer1; -+ AVFrame* m_pFrame1; - int m_iBufferSize1; - - BYTE *m_pBuffer2; -@@ -64,7 +63,6 @@ - int64_t m_layout; - - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - void BuildChannelMap(); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-06-05 15:19:23.883495032 +0200 -@@ -79,11 +79,7 @@ - /* get the muxer */ - AVOutputFormat *fOut = NULL; - --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fOut = m_dllAvFormat.guess_format(muxerName.c_str(), NULL, NULL); --#else - fOut = m_dllAvFormat.av_guess_format(muxerName.c_str(), NULL, NULL); --#endif - if (!fOut) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to get the FFmpeg %s muxer", muxerName.c_str()); -@@ -103,7 +99,7 @@ - muxer.m_pFormat->oformat = fOut; - - /* allocate a put_byte struct so we can grab the output */ -- muxer.m_pFormat->pb = m_dllAvFormat.av_alloc_put_byte(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), URL_RDONLY, &muxer, NULL, MuxerReadPacket, NULL); -+ muxer.m_pFormat->pb = m_dllAvFormat.avio_alloc_context(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), AVIO_FLAG_READ, &muxer, NULL, MuxerReadPacket, NULL); - if (!muxer.m_pFormat->pb) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate ByteIOContext"); -@@ -112,21 +108,10 @@ - } - - /* this is streamed, no file, and ignore the index */ -- muxer.m_pFormat->pb->is_streamed = 1; -+ muxer.m_pFormat->pb->seekable = 0; - muxer.m_pFormat->flags |= AVFMT_NOFILE | AVFMT_FLAG_IGNIDX; - muxer.m_pFormat->bit_rate = hints.bitrate; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(muxer.m_pFormat, NULL) != 0) -- { -- CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to set the %s muxer parameters", muxerName.c_str()); -- Dispose(); -- return false; -- } -- --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,92,0) -- // API added on: 2011-01-02 -- - /* While this is strictly only needed on big-endian systems, we do it on - * both to avoid as much dead code as possible. - * CoreAudio (at least on the cases we've seen) wants IEC 61937 in -@@ -138,8 +123,7 @@ - #endif - - /* request output of wanted endianness */ -- if (!fOut->priv_class || m_dllAvUtil.av_set_string3(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0, NULL) != 0) --#endif -+ if (!fOut->priv_class || m_dllAvUtil.av_opt_set(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0) != 0) - { - #if defined(WORDS_BIGENDIAN) && !defined(__APPLE__) - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Unable to set big-endian stream mode (FFmpeg too old?), disabling passthrough"); -@@ -149,7 +133,7 @@ - } - - /* add a stream to it */ -- muxer.m_pStream = m_dllAvFormat.av_new_stream(muxer.m_pFormat, 1); -+ muxer.m_pStream = m_dllAvFormat.avformat_new_stream(muxer.m_pFormat, NULL); - if (!muxer.m_pStream) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate AVStream context"); -@@ -159,8 +143,6 @@ - - - /* set the stream's parameters */ -- muxer.m_pStream->stream_copy = 1; -- - m_SampleRate = hints.samplerate; - if(!m_SampleRate && hints.codec == CODEC_ID_AC3) - m_SampleRate = 48000; -@@ -176,7 +158,7 @@ - codec->extradata_size = hints.extrasize; - memcpy(codec->extradata, hints.extradata, hints.extrasize); - -- muxer.m_WroteHeader = m_dllAvFormat.av_write_header(muxer.m_pFormat) == 0; -+ muxer.m_WroteHeader = m_dllAvFormat.avformat_write_header(muxer.m_pFormat, NULL) == 0; - if (!muxer.m_WroteHeader) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthrough::SetupMuxer - Failed to write the frame header"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-06-05 15:19:23.943496230 +0200 -@@ -55,7 +55,7 @@ - bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels *channelMap, unsigned int bitsPerSample, unsigned int sampleRate) - { - Reset(); -- if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCore.Load() || !m_dllAvCodec.Load()) -+ if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -@@ -65,7 +65,7 @@ - return false; - - /* always assume 6 channels, 5.1... m_remap will give us what we want */ -- m_CodecCtx = m_dllAvCodec.avcodec_alloc_context(); -+ m_CodecCtx = m_dllAvCodec.avcodec_alloc_context3(codec); - m_CodecCtx->bit_rate = AC3_ENCODE_BITRATE; - m_CodecCtx->sample_rate = sampleRate; - m_CodecCtx->channels = 6; -@@ -104,7 +104,7 @@ - } - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - m_dllAvUtil.av_freep(&m_CodecCtx); - return false; -@@ -149,7 +149,7 @@ - - if (m_AudioConvert) - m_TmpBuffer2 = new uint8_t[m_NeededFrames * m_CodecCtx->channels * -- m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8]; -+ m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt)]; - - return true; - } -@@ -186,7 +186,7 @@ - void *convInBuf[] = { m_TmpBuffer }; - int convInStr[] = { m_BitsPerSample / 8 }; - void *convOutBuf[] = { m_TmpBuffer2 }; -- int convOutStr[] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8 }; -+ int convOutStr[] = { m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt) }; - if (m_dllAvCodec.av_audio_convert(m_AudioConvert, convOutBuf, convOutStr, - convInBuf, convInStr, m_NeededFrames * m_CodecCtx->channels) < 0) { - CLog::Log(LOGERROR, "CDVDAudioEncoderFFmpeg: Audio conversion failed"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-06-05 15:19:23.944496250 +0200 -@@ -43,7 +43,6 @@ - virtual int GetData(uint8_t **data); - private: - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - AVCodecContext *m_CodecCtx; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-06-05 15:19:23.944496250 +0200 -@@ -49,7 +49,14 @@ - - m_dllAvCodec.avcodec_register_all(); - -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -+ if (!pCodec) -+ { -+ CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -+ return false; -+ } -+ -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; -@@ -100,14 +107,7 @@ - delete[] parse_extra; - } - -- AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -- if (!pCodec) -- { -- CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -- return false; -- } -- -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -134,19 +134,12 @@ - { - for(unsigned i=0;i= (52<<10) - if(sub.rects[i]) - { - m_dllAvUtil.av_free(sub.rects[i]->pict.data[0]); - m_dllAvUtil.av_free(sub.rects[i]->pict.data[1]); - m_dllAvUtil.av_freep(&sub.rects[i]); - } --#else -- if(sub.rects[i].bitmap) -- m_dllAvUtil.av_freep(&sub.rects[i].bitmap); -- if(m_Subtitle.rects[i].rgba_palette) -- m_dllAvUtil.av_freep(&sub.rects[i].rgba_palette); --#endif - } - if(sub.rects) - m_dllAvUtil.av_freep(&sub.rects); -@@ -294,7 +287,6 @@ - overlay->source_width = m_width; - overlay->source_height = m_height; - --#if LIBAVCODEC_VERSION_INT >= (52<<10) - BYTE* s = rect.pict.data[0]; - BYTE* t = overlay->data; - for(int i=0;idata; -- for(int i=0;ilinesize; -- } -- -- memcpy(overlay->palette, rect.rgba_palette, rect.nb_colors*4); -- -- m_dllAvUtil.av_freep(&rect.bitmap); -- m_dllAvUtil.av_freep(&rect.rgba_palette); --#endif - m_SubtitleIndex++; - - return overlay; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-06-05 15:19:23.946496292 +0200 -@@ -123,12 +123,11 @@ - CDVDVideoCodecFFmpeg::CDVDVideoCodecFFmpeg() : CDVDVideoCodec() - { - m_pCodecContext = NULL; -- m_pConvertFrame = NULL; - m_pFrame = NULL; - m_pFilterGraph = NULL; - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; -+ m_pBufferRef = NULL; - - m_iPictureWidth = 0; - m_iPictureHeight = 0; -@@ -163,9 +162,13 @@ - m_dllAvFilter.avfilter_register_all(); - - m_bSoftware = hints.software; -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ -+ m_formats.push_back(PIX_FMT_YUV420P); -+ m_formats.push_back(PIX_FMT_YUVJ420P); -+ m_formats.push_back(PIX_FMT_NONE); /* always add none to get a terminated list in ffmpeg world */ - - pCodec = NULL; -+ m_pCodecContext = NULL; - - if (hints.codec == CODEC_ID_H264) - { -@@ -196,6 +199,7 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); - CVDPAU* vdp = new CVDPAU(); -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->codec_id = hints.codec; - m_pCodecContext->width = hints.width; - m_pCodecContext->height = hints.height; -@@ -207,7 +211,7 @@ - m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set - break; - } -- m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set -+ m_dllAvUtil.av_freep(&m_pCodecContext); - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Failed to get VDPAU device"); - vdp->Release(); - } -@@ -226,21 +230,26 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Using codec: %s",pCodec->long_name ? pCodec->long_name : pCodec->name); - -+ if(m_pCodecContext == NULL) -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); -+ - m_pCodecContext->opaque = (void*)this; - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; - m_pCodecContext->get_format = GetFormat; - m_pCodecContext->codec_tag = hints.codec_tag; -+ /* Only allow slice threading, since frame threading is more -+ * sensitive to changes in frame sizes, and it causes crashes -+ * during HW accell */ -+ m_pCodecContext->thread_type = FF_THREAD_SLICE; - - #if defined(__APPLE__) && defined(__arm__) - // ffmpeg with enabled neon will crash and burn if this is enabled - m_pCodecContext->flags &= CODEC_FLAG_EMU_EDGE; - #else - if (pCodec->id != CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1 --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,69,0) - && pCodec->id != CODEC_ID_VP8 --#endif - ) - m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE; - #endif -@@ -272,16 +281,16 @@ - if (it->m_name == "surfaces") - m_uSurfacesCount = std::atoi(it->m_value.c_str()); - else -- m_dllAvUtil.av_set_string3(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0, NULL); -+ m_dllAvUtil.av_opt_set(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0); - } - - int num_threads = std::min(8 /*MAX_THREADS*/, g_cpuInfo.getCPUCount()); - if( num_threads > 1 && !hints.software && m_pHardware == NULL // thumbnail extraction fails when run threaded - && ( pCodec->id == CODEC_ID_H264 - || pCodec->id == CODEC_ID_MPEG4 )) -- m_dllAvCodec.avcodec_thread_init(m_pCodecContext, num_threads); -+ m_pCodecContext->thread_count = num_threads; - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -290,14 +299,7 @@ - m_pFrame = m_dllAvCodec.avcodec_alloc_frame(); - if (!m_pFrame) return false; - -- if(pCodec->name) -- m_name = CStdString("ff-") + pCodec->name; -- else -- m_name = "ffmpeg"; -- -- if(m_pHardware) -- m_name += "-" + m_pHardware->Name(); -- -+ UpdateName(); - return true; - } - -@@ -306,13 +308,6 @@ - if (m_pFrame) m_dllAvUtil.av_free(m_pFrame); - m_pFrame = NULL; - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- } -- m_pConvertFrame = NULL; -- - if (m_pCodecContext) - { - if (m_pCodecContext->codec) m_dllAvCodec.avcodec_close(m_pCodecContext); -@@ -458,9 +453,6 @@ - return VC_ERROR; - } - -- if (len != iSize && m_pCodecContext->skip_frame != AVDISCARD_NONREF) -- CLog::Log(LOGWARNING, "%s - avcodec_decode_video didn't consume the full packet. size: %d, consumed: %d", __FUNCTION__, iSize, len); -- - if (!iGotPicture) - return VC_BUFFER; - -@@ -478,67 +470,32 @@ - if(m_pCodecContext->codec_id == CODEC_ID_H264) - m_started = true; - -- if(m_pCodecContext->pix_fmt != PIX_FMT_YUV420P -- && m_pCodecContext->pix_fmt != PIX_FMT_YUVJ420P -- && m_pHardware == NULL) -- { -- if (!m_dllSwScale.IsLoaded() && !m_dllSwScale.Load()) -- return VC_ERROR; -- -- if (!m_pConvertFrame) -- { -- // Allocate an AVFrame structure -- m_pConvertFrame = (AVPicture*)m_dllAvUtil.av_mallocz(sizeof(AVPicture)); -- // Due to a bug in swsscale we need to allocate one extra line of data -- if(m_dllAvCodec.avpicture_alloc( m_pConvertFrame -- , PIX_FMT_YUV420P -- , m_pCodecContext->width -- , m_pCodecContext->height+1) < 0) -- { -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- return VC_ERROR; -- } -- } -+ if(m_pHardware == NULL) -+ { -+ bool need_scale = std::find( m_formats.begin() -+ , m_formats.end() -+ , m_pCodecContext->pix_fmt) == m_formats.end(); - -- // convert the picture -- struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, -- m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, -- PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); -+ bool need_reopen = false; -+ if(!m_filters.Equals(m_filters_next)) -+ need_reopen = true; - -- if(context == NULL) -+ if(m_pFilterIn) - { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::Decode - unable to obtain sws context for w:%i, h:%i, pixfmt: %i", m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt); -- return VC_ERROR; -+ if(m_pFilterIn->outputs[0]->format != m_pCodecContext->pix_fmt -+ || m_pFilterIn->outputs[0]->w != m_pCodecContext->width -+ || m_pFilterIn->outputs[0]->h != m_pCodecContext->height) -+ need_reopen = true; - } - -- m_dllSwScale.sws_scale(context -- , m_pFrame->data -- , m_pFrame->linesize -- , 0 -- , m_pCodecContext->height -- , m_pConvertFrame->data -- , m_pConvertFrame->linesize); -- -- m_dllSwScale.sws_freeContext(context); -- } -- else -- { -- // no need to convert, just free any existing convert buffers -- if (m_pConvertFrame) -+ // try to setup new filters -+ if (need_reopen || (need_scale && m_pFilterGraph == NULL)) - { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } -- } -+ m_filters = m_filters_next; - -- // try to setup new filters -- if (!m_filters.Equals(m_filters_next)) -- { -- m_filters = m_filters_next; -- if(FilterOpen(m_filters) < 0) -- FilterClose(); -+ if(FilterOpen(m_filters, need_scale) < 0) -+ FilterClose(); -+ } - } - - int result; -@@ -564,12 +521,6 @@ - if (m_pHardware) - m_pHardware->Reset(); - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } - m_filters = ""; - FilterClose(); - } -@@ -579,10 +530,10 @@ - pDvdVideoPicture->iWidth = m_pCodecContext->width; - pDvdVideoPicture->iHeight = m_pCodecContext->height; - -- if(m_pFilterLink) -+ if(m_pBufferRef) - { -- pDvdVideoPicture->iWidth = m_pFilterLink->cur_buf->video->w; -- pDvdVideoPicture->iHeight = m_pFilterLink->cur_buf->video->h; -+ pDvdVideoPicture->iWidth = m_pBufferRef->video->w; -+ pDvdVideoPicture->iHeight = m_pBufferRef->video->h; - } - - /* crop of 10 pixels if demuxer asked it */ -@@ -598,12 +549,8 @@ - - /* use variable in the frame */ - AVRational pixel_aspect = m_pCodecContext->sample_aspect_ratio; -- if (m_pFilterLink) --#ifdef HAVE_AVFILTERBUFFERREFVIDEOPROPS_SAMPLE_ASPECT_RATIO -- pixel_aspect = m_pFilterLink->cur_buf->video->sample_aspect_ratio; --#else -- pixel_aspect = m_pFilterLink->cur_buf->video->pixel_aspect; --#endif -+ if (m_pBufferRef) -+ pixel_aspect = m_pBufferRef->video->sample_aspect_ratio; - - if (pixel_aspect.num == 0) - aspect_ratio = 0; -@@ -632,8 +579,6 @@ - pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; - pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; - pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; -- if(m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P) -- pDvdVideoPicture->color_range = 1; - - pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location; - pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries; -@@ -677,14 +622,6 @@ - if(!GetPictureCommon(pDvdVideoPicture)) - return false; - -- if(m_pConvertFrame) -- { -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->data[i] = m_pConvertFrame->data[i]; -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->iLineSize[i] = m_pConvertFrame->linesize[i]; -- } -- else - { - for (int i = 0; i < 4; i++) - pDvdVideoPicture->data[i] = m_pFrame->data[i]; -@@ -693,20 +630,38 @@ - } - - pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; -- pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; - pDvdVideoPicture->extended_format = 0; -+ pDvdVideoPicture->color_range = 0; -+ -+ PixelFormat pix_fmt; -+ if(m_pBufferRef) -+ pix_fmt = (PixelFormat)m_pBufferRef->format; -+ else -+ pix_fmt = m_pCodecContext->pix_fmt; -+ -+ switch(pix_fmt) -+ { -+ case PIX_FMT_YUVJ420P: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ pDvdVideoPicture->color_range = 1; -+ break; -+ default: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ break; -+ } - - return true; - } - --int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) -+int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters, bool scale) - { - int result; -+ AVBufferSinkParams *buffersink_params; - - if (m_pFilterGraph) - FilterClose(); - -- if (filters.IsEmpty()) -+ if (filters.IsEmpty() && !scale) - return 0; - - if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) -@@ -715,17 +670,8 @@ - return -1; - } - -- // CrHasher HACK (if an alternative becomes available use it!): In order to display the output -- // produced by a combination of filters we insert "nullsink" as the last filter and we use -- // its input pin as our output pin. -- // -- // input --> .. --> last_filter --> [in] nullsink [null] [in] --> output -- // | | -- // | | -- // +------------------------+ -- // - AVFilter* srcFilter = m_dllAvFilter.avfilter_get_by_name("buffer"); -- AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("nullsink"); // should be last filter in the graph for now -+ AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("buffersink"); // should be last filter in the graph for now - - CStdString args; - -@@ -744,11 +690,19 @@ - return result; - } - -- if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, NULL/*nullsink=>NULL*/, m_pFilterGraph)) < 0) -+ buffersink_params = m_dllAvFilter.av_buffersink_params_alloc(); -+ buffersink_params->pixel_fmts = &m_formats[0]; -+#ifdef FF_API_OLD_VSINK_API -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, (void*)buffersink_params->pixel_fmts, m_pFilterGraph)) < 0) -+#else -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, buffersink_params, m_pFilterGraph)) < 0) -+#endif - { -+ m_dllAvUtil.av_freep(&buffersink_params); - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: out"); - return result; - } -+ m_dllAvUtil.av_freep(&buffersink_params); - - if (!filters.empty()) - { -@@ -794,6 +748,12 @@ - - void CDVDVideoCodecFFmpeg::FilterClose() - { -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ - if (m_pFilterGraph) - { - m_dllAvFilter.avfilter_graph_free(&m_pFilterGraph); -@@ -801,7 +761,6 @@ - // Disposed by above code - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; - } - } - -@@ -809,20 +768,9 @@ - { - int result, frames; - -- m_pFilterLink = m_pFilterOut->inputs[0]; -- - if (frame) - { --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame); --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts); --#else -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); --#endif -- - if (result < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); -@@ -830,7 +778,13 @@ - } - } - -- if ((frames = m_dllAvFilter.avfilter_poll_frame(m_pFilterLink)) < 0) -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ -+ if ((frames = m_dllAvFilter.av_buffersink_poll_frame(m_pFilterOut)) < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); - return VC_ERROR; -@@ -838,19 +792,9 @@ - - if (frames > 0) - { -- if (m_pFilterLink->cur_buf) -- { -- m_dllAvFilter.avfilter_unref_buffer(m_pFilterLink->cur_buf); -- m_pFilterLink->cur_buf = NULL; -- } -- -- if ((result = m_dllAvFilter.avfilter_request_frame(m_pFilterLink)) < 0) -- { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_request_frame"); -- return VC_ERROR; -- } - -- if (!m_pFilterLink->cur_buf) -+ result = m_dllAvFilter.av_buffersink_get_buffer_ref(m_pFilterOut, &m_pBufferRef, 0); -+ if(!m_pBufferRef) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); - return VC_ERROR; -@@ -861,11 +805,11 @@ - else - m_pFrame->repeat_pict = -(frames - 1); - -- m_pFrame->interlaced_frame = m_pFilterLink->cur_buf->video->interlaced; -- m_pFrame->top_field_first = m_pFilterLink->cur_buf->video->top_field_first; -+ m_pFrame->interlaced_frame = m_pBufferRef->video->interlaced; -+ m_pFrame->top_field_first = m_pBufferRef->video->top_field_first; - -- memcpy(m_pFrame->linesize, m_pFilterLink->cur_buf->linesize, 4*sizeof(int)); -- memcpy(m_pFrame->data , m_pFilterLink->cur_buf->data , 4*sizeof(uint8_t*)); -+ memcpy(m_pFrame->linesize, m_pBufferRef->linesize, 4*sizeof(int)); -+ memcpy(m_pFrame->data , m_pBufferRef->data , 4*sizeof(uint8_t*)); - - if(frames > 1) - return VC_PICTURE; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-06-05 15:19:23.946496292 +0200 -@@ -68,27 +68,36 @@ - { - SAFE_RELEASE(m_pHardware); - m_pHardware = hardware; -- m_name += "-"; -- m_name += m_pHardware->Name(); -+ UpdateName(); - } - - protected: - static enum PixelFormat GetFormat(struct AVCodecContext * avctx, const PixelFormat * fmt); - -- int FilterOpen(const CStdString& filters); -+ int FilterOpen(const CStdString& filters, bool scale); - void FilterClose(); - int FilterProcess(AVFrame* frame); - -+ void UpdateName() -+ { -+ if(m_pCodecContext->codec->name) -+ m_name = CStdString("ff-") + m_pCodecContext->codec->name; -+ else -+ m_name = "ffmpeg"; -+ -+ if(m_pHardware) -+ m_name += "-" + m_pHardware->Name(); -+ } -+ - AVFrame* m_pFrame; - AVCodecContext* m_pCodecContext; - -- AVPicture* m_pConvertFrame; - CStdString m_filters; - CStdString m_filters_next; - AVFilterGraph* m_pFilterGraph; - AVFilterContext* m_pFilterIn; - AVFilterContext* m_pFilterOut; -- AVFilterLink* m_pFilterLink; -+ AVFilterBufferRef* m_pBufferRef; - - int m_iPictureWidth; - int m_iPictureHeight; -@@ -109,4 +118,5 @@ - int m_iLastKeyframe; - double m_dts; - bool m_started; -+ std::vector m_formats; - }; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-06-05 15:19:23.947496313 +0200 -@@ -525,8 +525,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -537,14 +537,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -590,26 +590,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -706,7 +706,7 @@ - } - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return false; - } -@@ -717,7 +717,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata then write it into avcCData for VDADecoder -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - // CFDataCreate makes a copy of extradata contents - avcCData = CFDataCreate(kCFAllocatorDefault, (const uint8_t*)extradata, extrasize); - // done with the converted extradata, we MUST free using av_free -@@ -948,12 +948,12 @@ - int demuxer_bytes; - uint8_t *demuxer_content; - -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return VC_ERROR; - } - demuxer_bytes = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -@@ -961,7 +961,7 @@ - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -970,14 +970,14 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - - uint8_t *demuxer_content; -- int demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ int demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-06-05 15:19:23.949496352 +0200 -@@ -474,7 +474,7 @@ - { - b |= 0x80; - } -- av_format_ctx->put_byte(pb, b); -+ av_format_ctx->avio_w8(pb, b); - } - - return numBytes; -@@ -482,37 +482,37 @@ - - void quicktime_write_esds(DllAvFormat *av_format_ctx, ByteIOContext *pb, quicktime_esds_t *esds) - { -- av_format_ctx->put_byte(pb, 0); // Version -- av_format_ctx->put_be24(pb, 0); // Flags -+ av_format_ctx->avio_w8(pb, 0); // Version -+ av_format_ctx->avio_wb24(pb, 0); // Flags - - // elementary stream descriptor tag -- av_format_ctx->put_byte(pb, 0x03); -+ av_format_ctx->avio_w8(pb, 0x03); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 3 + 5 + (13 + 5 + esds->decoderConfigLen) + 3, false); - // 3 bytes + 5 bytes for tag -- av_format_ctx->put_be16(pb, esds->esid); -- av_format_ctx->put_byte(pb, esds->stream_priority); -+ av_format_ctx->avio_wb16(pb, esds->esid); -+ av_format_ctx->avio_w8(pb, esds->stream_priority); - - // decoder configuration description tag -- av_format_ctx->put_byte(pb, 0x04); -+ av_format_ctx->avio_w8(pb, 0x04); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 13 + 5 + esds->decoderConfigLen, false); - // 13 bytes + 5 bytes for tag -- av_format_ctx->put_byte(pb, esds->objectTypeId); // objectTypeIndication -- av_format_ctx->put_byte(pb, esds->streamType); // streamType -- av_format_ctx->put_be24(pb, esds->bufferSizeDB); // buffer size -- av_format_ctx->put_be32(pb, esds->maxBitrate); // max bitrate -- av_format_ctx->put_be32(pb, esds->avgBitrate); // average bitrate -+ av_format_ctx->avio_w8(pb, esds->objectTypeId); // objectTypeIndication -+ av_format_ctx->avio_w8(pb, esds->streamType); // streamType -+ av_format_ctx->avio_wb24(pb, esds->bufferSizeDB); // buffer size -+ av_format_ctx->avio_wb32(pb, esds->maxBitrate); // max bitrate -+ av_format_ctx->avio_wb32(pb, esds->avgBitrate); // average bitrate - - // decoder specific description tag -- av_format_ctx->put_byte(pb, 0x05); -+ av_format_ctx->avio_w8(pb, 0x05); - quicktime_write_mp4_descr_length(av_format_ctx, pb, esds->decoderConfigLen, false); -- av_format_ctx->put_buffer(pb, esds->decoderConfig, esds->decoderConfigLen); -+ av_format_ctx->avio_write(pb, esds->decoderConfig, esds->decoderConfigLen); - - // sync layer configuration descriptor tag -- av_format_ctx->put_byte(pb, 0x06); // tag -- av_format_ctx->put_byte(pb, 0x01); // length -- av_format_ctx->put_byte(pb, 0x7F); // no SL -+ av_format_ctx->avio_w8(pb, 0x06); // tag -+ av_format_ctx->avio_w8(pb, 0x01); // length -+ av_format_ctx->avio_w8(pb, 0x7F); // no SL - - /* no IPI_DescrPointer */ - /* no IP_IdentificationDataSet */ -@@ -666,8 +666,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -678,14 +678,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -770,26 +770,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -1086,7 +1086,7 @@ - ByteIOContext *pb; - quicktime_esds_t *esds; - -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - esds = quicktime_set_esds(m_dllAvFormat, extradata, extrasize); -@@ -1095,7 +1095,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the esds atom decoderConfig from extradata -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - free(esds->decoderConfig); - free(esds); - -@@ -1152,7 +1152,7 @@ - // NAL reformating to bitstream format required - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - m_convert_bytestream = true; -@@ -1161,7 +1161,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata getting size into extrasize -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - - // check for interlaced and get number of ref frames - if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames)) -@@ -1301,17 +1301,17 @@ - if (m_convert_bytestream) - { - // convert demuxer packet from bytestream (AnnexB) to bitstream -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - demux_size = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else if (m_convert_3byteTo4byteNALSize) - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -1320,13 +1320,13 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-06-05 15:19:23.950496372 +0200 -@@ -223,7 +223,6 @@ - } - - pic->type = FF_BUFFER_TYPE_USER; -- pic->age = 1; - pic->data[0] = (uint8_t*)wrapper; - pic->data[1] = NULL; - pic->data[2] = NULL; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-06-05 15:19:23.951496392 +0200 -@@ -1197,14 +1197,12 @@ - - if(pic->reference) - { -- pic->age = pA->ip_age[0]; - pA->ip_age[0]= pA->ip_age[1]+1; - pA->ip_age[1]= 1; - pA->b_age++; - } - else - { -- pic->age = pA->b_age; - pA->ip_age[0]++; - pA->ip_age[1]++; - pA->b_age = 1; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-06-05 15:19:23.955496472 +0200 -@@ -160,7 +160,7 @@ - #define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) - #endif - --static int interrupt_cb(void) -+static int interrupt_cb(void* unused) - { - if(g_demuxer && g_demuxer->Aborted()) - return 1; -@@ -178,7 +178,7 @@ - - static int dvd_file_read(void *h, uint8_t* buf, int size) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -192,7 +192,7 @@ - */ - static offset_t dvd_file_seek(void *h, offset_t pos, int whence) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -236,6 +236,7 @@ - m_speed = DVD_PLAYSPEED_NORMAL; - g_demuxer = this; - m_program = UINT_MAX; -+ const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; - - if (!pInput) return false; - -@@ -246,10 +247,6 @@ - - // register codecs - m_dllAvFormat.av_register_all(); -- m_dllAvFormat.url_set_interrupt_cb(interrupt_cb); -- -- // could be used for interupting ffmpeg while opening a file (eg internet streams) -- // url_set_interrupt_cb(NULL); - - m_pInput = pInput; - strFile = m_pInput->GetFileName(); -@@ -284,14 +281,14 @@ - // try mmsh, then mmst - CStdString strFile2; - strFile2.Format("mmsh://%s",strFile.substr(6,strFile.size()-6).c_str()); -- result = m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile2.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL); -+ result = m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile2.c_str(), iformat, NULL); - if (result < 0) - { - strFile = "mmst://"; - strFile += strFile2.Mid(7).c_str(); - } - } -- if (result < 0 && m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL) < 0 ) -+ if (result < 0 && m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0 ) - { - CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str()); - Dispose(); -@@ -301,24 +298,16 @@ - else - { - unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(FFMPEG_FILE_BUFFER_SIZE); -- m_ioContext = m_dllAvFormat.av_alloc_put_byte(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); -+ m_ioContext = m_dllAvFormat.avio_alloc_context(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); - m_ioContext->max_packet_size = m_pInput->GetBlockSize(); - if(m_ioContext->max_packet_size) - m_ioContext->max_packet_size *= FFMPEG_FILE_BUFFER_SIZE / m_ioContext->max_packet_size; - - if(m_pInput->Seek(0, SEEK_POSSIBLE) == 0) -- m_ioContext->is_streamed = 1; -+ m_ioContext->seekable = 0; - - if( iformat == NULL ) - { --#if defined(USE_EXTERNAL_FFMPEG) && LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(52,98,0) -- // API added on: 2011-02-09 -- // Old versions of ffmpeg do not have av_probe_input_format, so we need -- // to always probe using the lower-level functions as well. -- const bool legacyProbing = true; --#else -- const bool legacyProbing = false; --#endif - // let ffmpeg decide which demuxer we have to open - - bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); -@@ -331,7 +320,7 @@ - // want to probe for spdif (DTS or IEC 61937) compressed audio - // specifically, or in case the file is a wav which may contain DTS or - // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. -- if (legacyProbing || trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) -+ if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) - { - AVProbeData pd; - BYTE probe_buffer[FFMPEG_FILE_BUFFER_SIZE + AVPROBE_PADDING_SIZE]; -@@ -341,7 +330,7 @@ - pd.filename = strFile.c_str(); - - // read data using avformat's buffers -- pd.buf_size = m_dllAvFormat.get_buffer(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); -+ pd.buf_size = m_dllAvFormat.avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); - if (pd.buf_size <= 0) - { - CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str()); -@@ -350,10 +339,7 @@ - memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE); - - // restore position again -- m_dllAvFormat.url_fseek(m_ioContext , 0, SEEK_SET); -- -- if (legacyProbing && !trySPDIFonly) -- iformat = m_dllAvFormat.av_probe_input_format(&pd, 1); -+ m_dllAvFormat.avio_seek(m_ioContext , 0, SEEK_SET); - - // the advancedsetting is for allowing the user to force outputting the - // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode -@@ -424,7 +410,10 @@ - - - // open the demuxer -- if (m_dllAvFormat.av_open_input_stream(&m_pFormatContext, m_ioContext, strFile.c_str(), iformat, NULL) < 0) -+ m_pFormatContext = m_dllAvFormat.avformat_alloc_context(); -+ m_pFormatContext->pb = m_ioContext; -+ -+ if (m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0) - { - CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str()); - Dispose(); -@@ -432,8 +421,11 @@ - } - } - -+ // set the interrupt callback, appeared in libavformat 53.15.0 -+ m_pFormatContext->interrupt_callback = int_cb; -+ - // analyse very short to speed up mjpeg playback start -- if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->is_streamed) -+ if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) - m_pFormatContext->max_analyze_duration = 500000; - - // we need to know if this is matroska or avi later -@@ -447,8 +439,8 @@ - m_pFormatContext->max_analyze_duration = 500000; - - -- CLog::Log(LOGDEBUG, "%s - av_find_stream_info starting", __FUNCTION__); -- int iErr = m_dllAvFormat.av_find_stream_info(m_pFormatContext); -+ CLog::Log(LOGDEBUG, "%s - avformat_find_stream_info starting", __FUNCTION__); -+ int iErr = m_dllAvFormat.avformat_find_stream_info(m_pFormatContext, NULL); - if (iErr < 0) - { - CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str()); -@@ -471,7 +463,7 @@ - m_pFormatContext->flags |= AVFMT_FLAG_NONBLOCK; - - // print some extra information -- m_dllAvFormat.dump_format(m_pFormatContext, 0, strFile.c_str(), 0); -+ m_dllAvFormat.av_dump_format(m_pFormatContext, 0, strFile.c_str(), 0); - - UpdateCurrentPTS(); - -@@ -510,20 +502,12 @@ - - if (m_pFormatContext) - { -- if (m_ioContext) -+ if (m_ioContext && m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) - { -- if(m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) -- { -- CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -- m_ioContext = m_pFormatContext->pb; -- } -- m_dllAvFormat.av_close_input_stream(m_pFormatContext); -- if (m_ioContext->buffer) -- m_dllAvUtil.av_free(m_ioContext->buffer); -- m_dllAvUtil.av_free(m_ioContext); -+ CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -+ m_ioContext = m_pFormatContext->pb; - } -- else -- m_dllAvFormat.av_close_input_file(m_pFormatContext); -+ m_dllAvFormat.avformat_close_input(&m_pFormatContext); - } - m_ioContext = NULL; - m_pFormatContext = NULL; -@@ -773,19 +757,12 @@ - { - stream->duration = duration; - duration = m_dllAvUtil.av_rescale_rnd(stream->duration, (int64_t)stream->time_base.num * AV_TIME_BASE, stream->time_base.den, AV_ROUND_NEAR_INF); -- if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE && m_pFormatContext->file_size > 0) -+ if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE) - || (m_pFormatContext->duration != (int64_t)AV_NOPTS_VALUE && duration > m_pFormatContext->duration)) - m_pFormatContext->duration = duration; - } - } - -- // check if stream seem to have grown since start -- if(m_pFormatContext->file_size > 0 && m_pFormatContext->pb) -- { -- if(m_pFormatContext->pb->pos > m_pFormatContext->file_size) -- m_pFormatContext->file_size = m_pFormatContext->pb->pos; -- } -- - pPacket->iStreamId = pkt.stream_index; // XXX just for now - } - m_dllAvCodec.av_free_packet(&pkt); -@@ -923,19 +900,6 @@ - if (!m_pFormatContext) - return 0; - -- /* apperently ffmpeg messes up sometimes, so check for negative value too */ -- if (m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE || m_pFormatContext->duration < 0LL) -- { -- // no duration is available for us -- // try to calculate it -- int iLength = 0; -- if (m_iCurrentPts != DVD_NOPTS_VALUE && m_pFormatContext->file_size > 0 && m_pFormatContext->pb && m_pFormatContext->pb->pos > 0) -- { -- iLength = (int)(((m_iCurrentPts * m_pFormatContext->file_size) / m_pFormatContext->pb->pos) / 1000) & 0xFFFFFFFF; -- } -- return iLength; -- } -- - return (int)(m_pFormatContext->duration / (AV_TIME_BASE / 1000)); - } - -@@ -970,6 +934,12 @@ - - void CDVDDemuxFFmpeg::AddStream(int iId) - { -+ if(iId >= MAX_STREAMS) -+ { -+ CLog::Log(LOGWARNING, "%s - streams id %d exeeds maximum supported", __FUNCTION__, iId); -+ return; -+ } -+ - AVStream* pStream = m_pFormatContext->streams[iId]; - if (pStream) - { -@@ -987,8 +957,8 @@ - st->iBitRate = pStream->codec->bit_rate; - st->iBitsPerSample = pStream->codec->bits_per_coded_sample; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1077,8 +1047,8 @@ - if(pStream->codec) - st->identifier = pStream->codec->sub_id; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1089,7 +1059,7 @@ - { - std::string fileName = "special://temp/fonts/"; - XFILE::CDirectory::Create(fileName); -- AVMetadataTag *nameTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "filename", NULL, 0); -+ AVDictionaryEntry *nameTag = m_dllAvUtil.av_dict_get(pStream->metadata, "filename", NULL, 0); - if (!nameTag) { - CLog::Log(LOGERROR, "%s: TTF attachment has no name", __FUNCTION__); - break; -@@ -1138,7 +1108,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *langTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "language", NULL, 0); -+ AVDictionaryEntry *langTag = m_dllAvUtil.av_dict_get(pStream->metadata, "language", NULL, 0); - if (langTag) - strncpy(m_streams[iId]->language, langTag->value, 3); - #else -@@ -1248,7 +1218,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *titleTag = m_dllAvFormat.av_metadata_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, -+ AVDictionaryEntry *titleTag = m_dllAvUtil.av_dict_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, - "title", NULL, 0); - if (titleTag) - strChapterName = titleTag->value; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-06-05 15:19:23.956496492 +0200 -@@ -128,7 +128,7 @@ - #define MAX_STREAMS 100 - CDemuxStream* m_streams[MAX_STREAMS]; // maximum number of streams that ffmpeg can handle - -- ByteIOContext* m_ioContext; -+ AVIOContext* m_ioContext; - - DllAvFormat m_dllAvFormat; - DllAvCodec m_dllAvCodec; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-06-05 15:19:23.957496512 +0200 -@@ -413,6 +413,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - m_started = false; - } -@@ -420,6 +421,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - - m_pullupCorrection.Flush(); -diff -Naur xbmc-11.0.1/xbmc/DllPaths_generated.h.in xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in ---- xbmc-11.0.1/xbmc/DllPaths_generated.h.in 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in 2012-06-05 15:19:23.957496512 +0200 -@@ -74,13 +74,13 @@ - #define DLL_PATH_LIBMAD "@MAD_SONAME@" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" - - /* cdrip */ - #if defined(_LINUX) && !defined(__APPLE__) -diff -Naur xbmc-11.0.1/xbmc/DllPaths_win32.h xbmc-11.0.1.patch/xbmc/DllPaths_win32.h ---- xbmc-11.0.1/xbmc/DllPaths_win32.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_win32.h 2012-06-05 15:19:23.958496532 +0200 -@@ -58,13 +58,13 @@ - #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" - - /* cdrip */ - #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-981-toggleButtonState.patch deleted file mode 100644 index 17a606f1b1..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-981-toggleButtonState.patch +++ /dev/null @@ -1,304 +0,0 @@ -diff -Naur xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h ---- xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h 2011-12-10 22:16:22.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h 2011-12-17 18:43:42.183704449 +0100 -@@ -57,6 +57,7 @@ - virtual CStdString GetDescription() const; - void SetToggleSelect(const CStdString &toggleSelect); - void SetAltClickActions(const CGUIAction &clickActions); -+ bool IsSelected() const { return m_bSelected; }; - - protected: - virtual bool UpdateColors(); -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-17 18:43:42.216705084 +0100 -@@ -135,6 +135,11 @@ - - typedef struct { - PyObject_HEAD_XBMC_CONTROL -+ bool bIsSelected; -+ } ControlToggle; -+ -+ typedef struct { -+ PyObject_HEAD_XBMC_CONTROL - std::string strFont; - color_t textColor; - std::vector vecLabels; -@@ -263,7 +268,8 @@ - extern PyTypeObject ControlRadioButton_Type; - extern PyTypeObject ControlSlider_Type; - extern PyTypeObject ControlEdit_Type; -- -+ extern PyTypeObject ControlToggle_Type; -+ - CGUIControl* ControlLabel_Create(ControlLabel* pControl); - CGUIControl* ControlFadeLabel_Create(ControlFadeLabel* pControl); - CGUIControl* ControlTextBox_Create(ControlTextBox* pControl); -@@ -276,6 +282,7 @@ - CGUIControl* ControlRadioButton_Create(ControlRadioButton* pControl); - CGUIControl* ControlSlider_Create(ControlSlider* pControl); - CGUIControl* ControlEdit_Create(ControlEdit* pControl); -+ CGUIControl* ControlToggle_Create(ControlToggle* pControl); - - void initControl_Type(); - void initControlSpin_Type(); -@@ -291,6 +298,7 @@ - void initControlRadioButton_Type(); - void initControlSlider_Type(); - void initControlEdit_Type(); -+ void initControlToggle_Type(); - } - - #ifdef __cplusplus -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 2011-12-17 18:43:42.217705104 +0100 -@@ -0,0 +1,181 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include -+ -+#include "guilib/GUIToggleButtonControl.h" -+#include "guilib/GUIFontManager.h" -+#include "control.h" -+#include "pyutil.h" -+ -+using namespace std; -+ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+namespace PYXBMC -+{ -+ PyObject* ControlToggle_New( -+ PyTypeObject *type, -+ PyObject *args, -+ PyObject *kwds ) -+ { -+ static const char *keywords[] = { -+ "x", "y", "width", "height", "label", -+ "focusTexture", "noFocusTexture", -+ "textOffsetX", "textOffsetY", "alignment", -+ "font", "textColor", "disabledColor", "angle", "shadowColor", "focusedColor", NULL }; -+ ControlToggle *self; -+ char* cFont = NULL; -+ char* cTextureFocus = NULL; -+ char* cTextureNoFocus = NULL; -+ char* cTextColor = NULL; -+ char* cDisabledColor = NULL; -+ char* cShadowColor = NULL; -+ char* cFocusedColor = NULL; -+ -+ PyObject* pObjectText; -+ -+ self = (ControlToggle*)type->tp_alloc(type, 0); -+ if (!self) return NULL; -+ new(&self->bIsSelected) bool(); -+ -+ if (!PyArg_ParseTupleAndKeywords( -+ args, -+ kwds, -+ (char*)"llllO|sslllssslss", -+ (char**)keywords, -+ &self->dwPosX, -+ &self->dwPosY, -+ &self->dwWidth, -+ &self->dwHeight, -+ &pObjectText, -+ &cTextureFocus, -+ &cTextureNoFocus, -+ &cFont, -+ &cTextColor, -+ &cDisabledColor, -+ &cShadowColor, -+ &cFocusedColor)) -+ { -+ Py_DECREF( self ); -+ return NULL; -+ } -+ -+ -+ cTextureFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturefocus", (char*)"button-focus.png"); -+ cTextureNoFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturenofocus", (char*)"button-nofocus.jpg"); -+ -+ return (PyObject*)self; -+ } -+ -+ void ControlToggle_Dealloc(ControlToggle* self) -+ { -+ self->ob_type->tp_free((PyObject*)self); -+ } -+ -+ -+ // isSelected() Method -+ PyDoc_STRVAR(isSelected__doc__, -+ "isSelected() -- Returns the toggle buttons's selected status.\n" -+ "\n" -+ "example:\n" -+ " - is = self.togglebutton.isSelected()\n"); -+ -+ PyObject* ControlToggle_IsSelected(ControlToggle *self, PyObject *args) -+ { -+ bool isSelected = false; -+ -+ PyXBMCGUILock(); -+ if (self->pGUIControl) -+ isSelected = ((CGUIToggleButtonControl*)self->pGUIControl)->IsSelected(); -+ PyXBMCGUIUnlock(); -+ -+ return Py_BuildValue((char*)"b", isSelected); -+ } -+ -+ -+ PyMethodDef ControlToggle_methods[] = { -+ {(char*)"isSelected", (PyCFunction)ControlToggle_IsSelected, METH_VARARGS, isSelected__doc__}, -+ {NULL, NULL, 0, NULL} -+ }; -+ -+ // ControlRadioButton class -+ PyDoc_STRVAR(ControlToggle__doc__, -+ "ControlRadioButton class.\n" -+ "\n" -+ "ControlRadioButton(x, y, width, height, label[, focusTexture, noFocusTexture, textOffsetX, textOffsetY,\n" -+ " alignment, font, textColor, disabledColor, angle, shadowColor, focusedColor,\n" -+ " radioFocusTexture, noRadioFocusTexture])\n" -+ "\n" -+ "x : integer - x coordinate of control.\n" -+ "y : integer - y coordinate of control.\n" -+ "width : integer - width of control.\n" -+ "height : integer - height of control.\n" -+ "label : string or unicode - text string.\n" -+ "focusTexture : [opt] string - filename for focus texture.\n" -+ "noFocusTexture : [opt] string - filename for no focus texture.\n" -+ "textOffsetX : [opt] integer - x offset of label.\n" -+ "textOffsetY : [opt] integer - y offset of label.\n" -+ "alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n" -+ "font : [opt] string - font used for label text. (e.g. 'font13')\n" -+ "textColor : [opt] hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')\n" -+ "disabledColor : [opt] hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')\n" -+ "angle : [opt] integer - angle of control. (+ rotates CCW, - rotates CW)\n" -+ "shadowColor : [opt] hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')\n" -+ "focusedColor : [opt] hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')\n" -+ "radioFocusTexture : [opt] string - filename for radio focus texture.\n" -+ "noRadioFocusTexture : [opt] string - filename for radio no focus texture.\n" -+ "\n" -+ "*Note, You can use the above as keywords for arguments and skip certain optional arguments.\n" -+ " Once you use a keyword, all following arguments require the keyword.\n" -+ " After you create the control, you need to add it to the window with addControl().\n" -+ "\n" -+ "example:\n" -+ " - self.radiobutton = xbmcgui.ControlToggleButton(100, 250, 200, 50, 'Status', font='font14')\n"); -+ -+ // Restore code and data sections to normal. -+ -+ PyTypeObject ControlToggle_Type; -+ -+ void initControlToggle_Type() -+ { -+ PyXBMCInitializeTypeObject(&ControlToggle_Type); -+ -+ ControlToggle_Type.tp_name = (char*)"xbmcgui.ControlToggleButton"; -+ ControlToggle_Type.tp_basicsize = sizeof(ControlToggle); -+ ControlToggle_Type.tp_dealloc = (destructor)ControlToggle_Dealloc; -+ ControlToggle_Type.tp_compare = 0; -+ ControlToggle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; -+ ControlToggle_Type.tp_doc = ControlToggle__doc__; -+ ControlToggle_Type.tp_methods = ControlToggle_methods; -+ ControlToggle_Type.tp_base = &Control_Type; -+ ControlToggle_Type.tp_new = ControlToggle_New; -+ } -+} -+ -+#ifdef __cplusplus -+} -+#endif -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-17 18:44:47.447960296 +0100 -@@ -13,6 +13,7 @@ - controlslider.cpp \ - controlspin.cpp \ - controltextbox.cpp \ -+ controltogglebutton.cpp \ - dialog.cpp \ - GUIPythonWindow.cpp \ - GUIPythonWindowDialog.cpp \ -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-17 18:43:42.218705123 +0100 -@@ -277,6 +277,12 @@ - if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); - ((ControlButton*)pControl)->align = li.align; - break; -+ case CGUIControl::GUICONTROL_TOGGLEBUTTON: -+ pControl = (Control*)ControlToggle_Type.tp_alloc(&ControlToggle_Type, 0); -+ new(&((ControlToggle*)pControl)->bIsSelected) bool(); -+ -+ break; -+ - default: - break; - } -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-17 18:43:42.219705142 +0100 -@@ -138,6 +138,7 @@ - initAction_Type(); - initControlRadioButton_Type(); - initControlEdit_Type(); -+ initControlToggle_Type(); - - if (PyType_Ready(&Window_Type) < 0 || - PyType_Ready(&WindowDialog_Type) < 0 || -@@ -160,7 +161,8 @@ - PyType_Ready(&ControlSlider_Type) < 0 || - PyType_Ready(&ControlRadioButton_Type) < 0 || - PyType_Ready(&ControlEdit_Type) < 0 || -- PyType_Ready(&Action_Type) < 0) -+ PyType_Ready(&Action_Type) < 0 || -+ PyType_Ready(&ControlToggle_Type) < 0) - return; - - } -@@ -200,6 +202,7 @@ - Py_INCREF(&Action_Type); - Py_INCREF(&ControlRadioButton_Type); - Py_INCREF(&ControlEdit_Type); -+ Py_INCREF(&ControlToggle_Type); - - pXbmcGuiModule = Py_InitModule3((char*)"xbmcgui", xbmcGuiMethods, xbmcgui_module_documentation); - -@@ -227,7 +230,8 @@ - PyModule_AddObject(pXbmcGuiModule, (char*)"Action", (PyObject *)&Action_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlRadioButton", (PyObject*)&ControlRadioButton_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlEdit", (PyObject*)&ControlEdit_Type); -- -+ PyModule_AddObject(pXbmcGuiModule, (char*)"ControlToggle", (PyObject*)&ControlToggle_Type); -+ - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__author__", (char*)PY_XBMC_AUTHOR); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__date__", (char*)"14 July 2006"); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__version__", (char*)"1.2"); -diff -Naur xbmc-f3b0020/XBMC.xcodeproj/project.pbxproj xbmc-f3b0020.patch/XBMC.xcodeproj/project.pbxproj diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999-crosscompile.patch deleted file mode 100644 index 9c73a9644e..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999-crosscompile.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/Makefile.include.in b/Makefile.include.in -index b70245d..0537b86 100644 ---- a/Makefile.include.in -+++ b/Makefile.include.in -@@ -1,4 +1,4 @@ --AR=ar -+AR=@AR@ - ARFLAGS=crus - RM=rm -rf - SHELL=@SHELL@ -diff --git a/configure.in b/configure.in -index 7348529..baea8e0 100755 ---- a/configure.in -+++ b/configure.in -@@ -22,7 +22,7 @@ AC_DEFUN([XB_FIND_SONAME], - AC_MSG_CHECKING([for lib$2 soname]) - $1_FILENAME=$($CC -nostdlib -o /dev/null $LDFLAGS -l$2 -Wl,-M 2>/dev/null | grep "^LOAD.*$2" | awk '{V=2; print $V}') - if [[ ! -z $$1_FILENAME ]]; then -- $1_SONAME=$(objdump -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') -+ $1_SONAME=$($OBJDUMP -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') - fi - else - AC_MSG_CHECKING([for lib$2 dylib]) diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-402-enable_yasm_in_ffmpeg-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-404-add_lame_check-0.6.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-404-add_lame_check-0.6.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-404-add_lame_check-0.6.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-404-add_lame_check-0.6.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.01-cdrip-PR616.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.01-cdrip-PR616.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.01-cdrip-PR616.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.01-cdrip-PR616.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.02-cdrip-PR718.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.02-cdrip-PR718.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.02-cdrip-PR718.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.02-cdrip-PR718.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch similarity index 87% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch index d505fdb2d6..10c105e1a7 100644 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch @@ -1,7 +1,8 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-06-05 15:19:23.820493772 +0200 -@@ -2024,7 +2024,7 @@ +diff --git a/configure.in b/configure.in +index c8bf4f1..fe7c790 100755 +--- a/configure.in ++++ b/configure.in +@@ -2052,7 +2052,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ --disable-amd3dnow \ --disable-armv5te \ --disable-armv6t2 \ @@ -10,7 +11,7 @@ diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in `if test "$use_debug" = "no"; then echo --disable-debug; fi` \ --disable-muxers \ --enable-muxer=spdif \ -@@ -2038,7 +2038,6 @@ +@@ -2066,7 +2066,6 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ --disable-ffplay \ --disable-ffserver \ --disable-ffmpeg \ @@ -18,7 +19,7 @@ diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in --disable-doc \ --disable-decoder=mpeg_xvmc \ --enable-postproc \ -@@ -2046,6 +2045,7 @@ +@@ -2074,6 +2073,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ --enable-protocol=http \ --enable-pthreads \ --enable-runtime-cpudetect \ @@ -26,9 +27,10 @@ diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in --cc="$CC" && sed -ie "s#YASM=yasm#YASM=${prefix}/bin/yasm#" config.mak && sed -ie "s#YASMDEP=yasm#YASMDEP=${prefix}/bin/yasm#" config.mak && -diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h ---- xbmc-11.0.1/lib/DllAvCodec.h 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCodec.h 2012-06-05 15:19:23.822493812 +0200 +diff --git a/lib/DllAvCodec.h b/lib/DllAvCodec.h +index 463ab48..1ab00ea 100644 +--- a/lib/DllAvCodec.h ++++ b/lib/DllAvCodec.h @@ -24,7 +24,7 @@ #include "config.h" #endif @@ -38,7 +40,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h #include "utils/log.h" extern "C" { -@@ -76,28 +76,6 @@ +@@ -76,28 +76,6 @@ extern "C" { #endif } @@ -67,7 +69,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h #include "threads/SingleLock.h" class DllAvCodecInterface -@@ -106,20 +84,20 @@ +@@ -106,20 +84,20 @@ public: virtual ~DllAvCodecInterface() {} virtual void avcodec_register_all(void)=0; virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0; @@ -92,7 +94,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h virtual AVCodecParserContext *av_parser_init(int codec_id)=0; virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, -@@ -137,7 +115,6 @@ +@@ -137,7 +115,6 @@ public: virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt)=0; virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)=0; virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)=0; @@ -100,7 +102,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h virtual AVCodec *av_codec_next(AVCodec *c)=0; virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, enum AVSampleFormat in_fmt , int in_channels, -@@ -151,7 +128,7 @@ +@@ -151,7 +128,7 @@ public: virtual int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name)=0; }; @@ -109,7 +111,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h // Use direct layer class DllAvCodec : public DllDynamic, DllAvCodecInterface -@@ -166,12 +143,12 @@ +@@ -166,12 +143,12 @@ public: ::avcodec_register_all(); } virtual void avcodec_flush_buffers(AVCodecContext *avctx) { ::avcodec_flush_buffers(avctx); } @@ -125,7 +127,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(int *)0x0 = 0; return 0; } virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); } virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); } -@@ -182,33 +159,21 @@ +@@ -182,33 +159,21 @@ public: } virtual AVFrame *avcodec_alloc_frame() { return ::avcodec_alloc_frame(); } virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height) { return ::avpicture_fill(picture, ptr, pix_fmt, width, height); } @@ -162,7 +164,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h } virtual void av_parser_close(AVCodecParserContext *s) { ::av_parser_close(s); } -@@ -225,7 +190,6 @@ +@@ -225,7 +190,6 @@ public: virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic) { return ::avcodec_default_get_buffer(s, pic); } virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic) { ::avcodec_default_release_buffer(s, pic); } virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) { return ::avcodec_default_get_format(s, fmt); } @@ -170,7 +172,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h virtual AVCodec *av_codec_next(AVCodec *c) { return ::av_codec_next(c); } virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, enum AVSampleFormat in_fmt , int in_channels, -@@ -256,12 +220,12 @@ +@@ -256,12 +220,12 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface { DECLARE_DLL_WRAPPER(DllAvCodec, DLL_PATH_LIBAVCODEC) DEFINE_FUNC_ALIGNED1(void, __cdecl, avcodec_flush_buffers, AVCodecContext*) @@ -186,7 +188,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h DEFINE_FUNC_ALIGNED1(AVCodecParserContext*, __cdecl, av_parser_init, int) DEFINE_FUNC_ALIGNED9(int, __cdecl, av_parser_parse2, AVCodecParserContext*,AVCodecContext*, uint8_t**, int*, const uint8_t*, int, int64_t, int64_t, int64_t) DEFINE_METHOD1(int, av_dup_packet, (AVPacket *p1)) -@@ -278,7 +242,7 @@ +@@ -278,7 +242,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5)) DEFINE_METHOD3(int, avpicture_get_size, (PixelFormat p1, int p2, int p3)) DEFINE_METHOD4(void, avcodec_string, (char *p1, int p2, AVCodecContext *p3, int p4)) @@ -195,7 +197,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h DEFINE_METHOD1(void, av_parser_close, (AVCodecParserContext *p1)) DEFINE_METHOD1(void, avpicture_free, (AVPicture *p1)) DEFINE_METHOD1(AVBitStreamFilterContext*, av_bitstream_filter_init, (const char *p1)) -@@ -290,7 +254,6 @@ +@@ -290,7 +254,6 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface DEFINE_METHOD2(void, avcodec_default_release_buffer, (AVCodecContext *p1, AVFrame *p2)) DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2)) @@ -203,7 +205,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1)) DEFINE_METHOD6(AVAudioConvert*, av_audio_convert_alloc, (enum AVSampleFormat p1, int p2, enum AVSampleFormat p3, int p4, -@@ -301,7 +264,7 @@ +@@ -301,7 +264,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface const void * const p4[6], const int p5[6], int p6)) BEGIN_METHOD_RESOLVE() RESOLVE_METHOD(avcodec_flush_buffers) @@ -212,7 +214,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h RESOLVE_METHOD_RENAME(avcodec_close,avcodec_close_dont_call) RESOLVE_METHOD(avcodec_find_decoder) RESOLVE_METHOD(avcodec_find_encoder) -@@ -309,13 +272,13 @@ +@@ -309,13 +272,13 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface RESOLVE_METHOD_RENAME(avcodec_register_all, avcodec_register_all_dont_call) RESOLVE_METHOD(avpicture_fill) RESOLVE_METHOD(avcodec_decode_video2) @@ -229,7 +231,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h RESOLVE_METHOD(av_parser_init) RESOLVE_METHOD(av_parser_parse2) RESOLVE_METHOD(av_parser_close) -@@ -328,7 +291,6 @@ +@@ -328,7 +291,6 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface RESOLVE_METHOD(avcodec_default_get_buffer) RESOLVE_METHOD(avcodec_default_release_buffer) RESOLVE_METHOD(avcodec_default_get_format) @@ -237,7 +239,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h RESOLVE_METHOD(av_codec_next) RESOLVE_METHOD(av_audio_convert_alloc) RESOLVE_METHOD(av_audio_convert_free) -@@ -339,15 +301,15 @@ +@@ -339,15 +301,15 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface END_METHOD_RESOLVE() /* dependencies of libavcodec */ @@ -256,7 +258,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h } int avcodec_close(AVCodecContext *avctx) { -@@ -361,7 +323,7 @@ +@@ -361,7 +323,7 @@ public: } virtual bool Load() { @@ -265,9 +267,11 @@ diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h return false; return DllDynamic::Load(); } -diff -Naur xbmc-11.0.1/lib/DllAvCore.h xbmc-11.0.1.patch/lib/DllAvCore.h ---- xbmc-11.0.1/lib/DllAvCore.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCore.h 1970-01-01 01:00:00.000000000 +0100 +diff --git a/lib/DllAvCore.h b/lib/DllAvCore.h +deleted file mode 100644 +index 92a7ab7..0000000 +--- a/lib/DllAvCore.h ++++ /dev/null @@ -1,182 +0,0 @@ -#pragma once -/* @@ -451,9 +455,10 @@ diff -Naur xbmc-11.0.1/lib/DllAvCore.h xbmc-11.0.1.patch/lib/DllAvCore.h - -#endif - -diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h ---- xbmc-11.0.1/lib/DllAvFilter.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFilter.h 2012-06-05 15:19:23.835494072 +0200 +diff --git a/lib/DllAvFilter.h b/lib/DllAvFilter.h +index a421225..e363082 100644 +--- a/lib/DllAvFilter.h ++++ b/lib/DllAvFilter.h @@ -24,8 +24,8 @@ #include "config.h" #endif @@ -464,7 +469,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h #include "utils/log.h" extern "C" { -@@ -43,24 +43,17 @@ +@@ -43,28 +43,17 @@ extern "C" { #if (defined USE_EXTERNAL_FFMPEG) #if (defined HAVE_LIBAVFILTER_AVFILTER_H) #include @@ -474,17 +479,21 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h #include - #endif - /* for av_vsrc_buffer_add_frame */ -- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) -- #include -- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame); -- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts); +- #if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- #include - #else -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts, AVRational pixel_aspect); +- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) +- #include +- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame); +- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame, int64_t pts); +- #else +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame, int64_t pts, AVRational pixel_aspect); +- #endif + #include + #include #endif @@ -495,10 +504,13 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h #endif } -@@ -82,21 +75,16 @@ +@@ -86,25 +75,16 @@ public: virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)=0; virtual int avfilter_poll_frame(AVFilterLink *link)=0; virtual int avfilter_request_frame(AVFilterLink *link)=0; +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; +-#else -#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags)=0; -#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) @@ -507,6 +519,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts)=0; -#else - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; +-#endif -#endif virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0; virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0; @@ -521,7 +534,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h // Use direct mapping class DllAvFilter : public DllDynamic, DllAvFilterInterface { -@@ -115,12 +103,7 @@ +@@ -123,12 +103,7 @@ public: virtual void avfilter_graph_free(AVFilterGraph **graph) { CSingleLock lock(DllAvCodec::m_critSection); @@ -534,7 +547,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h } void avfilter_register_all() { -@@ -133,56 +116,31 @@ +@@ -141,60 +116,32 @@ public: virtual AVFilterInOut *avfilter_inout_alloc() { CSingleLock lock(DllAvCodec::m_critSection); @@ -569,6 +582,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) { -#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) ++ return ::avfilter_graph_config(graphctx, log_ctx); -#else - return ::avfilter_graph_config(graphctx, (AVClass*)log_ctx); @@ -576,6 +590,9 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h } virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); } virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); } +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } +-#else -#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, flags); } -#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) @@ -584,6 +601,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts); } -#else - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } +-#endif -#endif virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); } virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); } @@ -594,7 +612,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h // DLL faking. virtual bool ResolveExports() { return true; } virtual bool Load() { -@@ -200,45 +158,24 @@ +@@ -212,45 +159,24 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3)) DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1)) @@ -645,7 +663,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h BEGIN_METHOD_RESOLVE() RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call) -@@ -248,10 +185,8 @@ +@@ -260,10 +186,8 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface RESOLVE_METHOD(avfilter_graph_create_filter) RESOLVE_METHOD(avfilter_get_by_name) RESOLVE_METHOD(avfilter_graph_alloc) @@ -656,7 +674,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h RESOLVE_METHOD_RENAME(avfilter_graph_parse, avfilter_graph_parse_dont_call) RESOLVE_METHOD_RENAME(avfilter_graph_config, avfilter_graph_config_dont_call) RESOLVE_METHOD(avfilter_poll_frame) -@@ -260,10 +195,14 @@ +@@ -272,10 +196,14 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface RESOLVE_METHOD(avfilter_get_video_buffer) RESOLVE_METHOD(avfilter_unref_buffer) RESOLVE_METHOD(avfilter_link) @@ -671,7 +689,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h public: int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -279,12 +218,7 @@ +@@ -291,12 +219,7 @@ public: void avfilter_graph_free(AVFilterGraph **graph) { CSingleLock lock(DllAvCodec::m_critSection); @@ -684,7 +702,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h } void avfilter_register_all() { -@@ -294,45 +228,29 @@ +@@ -306,45 +229,29 @@ public: AVFilterInOut* avfilter_inout_alloc() { CSingleLock lock(DllAvCodec::m_critSection); @@ -732,10 +750,11 @@ diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h return DllDynamic::Load(); } }; -diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h ---- xbmc-11.0.1/lib/DllAvFormat.h 2012-03-21 23:57:42.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFormat.h 2012-06-05 15:19:23.837494112 +0200 -@@ -62,57 +62,45 @@ +diff --git a/lib/DllAvFormat.h b/lib/DllAvFormat.h +index 46a7481..72b8866 100644 +--- a/lib/DllAvFormat.h ++++ b/lib/DllAvFormat.h +@@ -62,57 +62,45 @@ public: virtual ~DllAvFormatInterface() {} virtual void av_register_all_dont_call(void)=0; virtual AVInputFormat *av_find_input_format(const char *short_name)=0; @@ -815,7 +834,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h // Use direct mapping class DllAvFormat : public DllDynamic, DllAvFormatInterface -@@ -126,78 +114,45 @@ +@@ -126,78 +114,45 @@ public: } virtual void av_register_all_dont_call() { *(int* )0x0 = 0; } virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); } @@ -917,7 +936,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h // DLL faking. virtual bool ResolveExports() { return true; } -@@ -218,108 +173,78 @@ +@@ -218,108 +173,78 @@ class DllAvFormat : public DllDynamic, DllAvFormatInterface DEFINE_METHOD0(void, av_register_all_dont_call) DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1)) @@ -1067,7 +1086,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h // DllAvUtil loaded implicitely by m_dllAvCodec public: -@@ -328,10 +253,10 @@ +@@ -328,10 +253,10 @@ public: CSingleLock lock(DllAvCodec::m_critSection); av_register_all_dont_call(); } @@ -1080,10 +1099,11 @@ diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h } virtual bool Load() -diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h ---- xbmc-11.0.1/lib/DllAvUtil.h 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvUtil.h 2012-06-05 15:19:23.837494112 +0200 -@@ -65,6 +65,7 @@ +diff --git a/lib/DllAvUtil.h b/lib/DllAvUtil.h +index b8bb2d6..2331777 100644 +--- a/lib/DllAvUtil.h ++++ b/lib/DllAvUtil.h +@@ -69,6 +69,7 @@ extern "C" { #include "libavutil/opt.h" #include "libavutil/mem.h" #include "libavutil/fifo.h" @@ -1091,7 +1111,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h #endif } -@@ -89,7 +90,7 @@ +@@ -93,7 +94,7 @@ public: virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0; virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; @@ -1100,7 +1120,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; virtual void av_fifo_free(AVFifoBuffer *f) = 0; virtual void av_fifo_reset(AVFifoBuffer *f) = 0; -@@ -97,10 +98,13 @@ +@@ -101,10 +102,13 @@ public: virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0; virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0; virtual char *av_strdup(const char *s)=0; @@ -1116,7 +1136,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h // Use direct layer class DllAvUtilBase : public DllDynamic, DllAvUtilInterface { -@@ -117,12 +121,7 @@ +@@ -121,12 +125,7 @@ public: virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); } virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } @@ -1130,7 +1150,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } -@@ -132,6 +131,12 @@ +@@ -136,6 +135,12 @@ public: virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) { return ::av_fifo_generic_write(f, src, size, func); } virtual char *av_strdup(const char *s) { return ::av_strdup(s); } @@ -1143,7 +1163,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h // DLL faking. virtual bool ResolveExports() { return true; } -@@ -160,7 +165,7 @@ +@@ -164,7 +169,7 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3)); DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1)) DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); @@ -1152,7 +1172,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) -@@ -168,6 +173,10 @@ +@@ -172,6 +177,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int))) DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int))) DEFINE_METHOD1(char*, av_strdup, (const char *p1)) @@ -1163,7 +1183,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h public: BEGIN_METHOD_RESOLVE() -@@ -181,7 +190,7 @@ +@@ -185,7 +194,7 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface RESOLVE_METHOD(av_rescale_q) RESOLVE_METHOD(av_crc_get_table) RESOLVE_METHOD(av_crc) @@ -1172,7 +1192,7 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h RESOLVE_METHOD(av_fifo_alloc) RESOLVE_METHOD(av_fifo_free) RESOLVE_METHOD(av_fifo_reset) -@@ -189,6 +198,10 @@ +@@ -193,6 +202,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface RESOLVE_METHOD(av_fifo_generic_read) RESOLVE_METHOD(av_fifo_generic_write) RESOLVE_METHOD(av_strdup) @@ -1183,10 +1203,11 @@ diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h END_METHOD_RESOLVE() }; -diff -Naur xbmc-11.0.1/lib/DllPostProc.h xbmc-11.0.1.patch/lib/DllPostProc.h ---- xbmc-11.0.1/lib/DllPostProc.h 2012-03-21 23:57:44.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllPostProc.h 2012-06-05 15:19:23.870494772 +0200 -@@ -87,7 +87,7 @@ +diff --git a/lib/DllPostProc.h b/lib/DllPostProc.h +index b09a3f6..5465601 100644 +--- a/lib/DllPostProc.h ++++ b/lib/DllPostProc.h +@@ -87,7 +87,7 @@ public: virtual void pp_free_context(pp_context *ppContext)=0; }; @@ -1195,9 +1216,11 @@ diff -Naur xbmc-11.0.1/lib/DllPostProc.h xbmc-11.0.1.patch/lib/DllPostProc.h // We call directly. class DllPostProc : public DllDynamic, DllPostProcInterface -diff -Naur xbmc-11.0.1/lib/DllSwResample.h xbmc-11.0.1.patch/lib/DllSwResample.h ---- xbmc-11.0.1/lib/DllSwResample.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwResample.h 2012-06-05 15:19:23.870494772 +0200 +diff --git a/lib/DllSwResample.h b/lib/DllSwResample.h +new file mode 100644 +index 0000000..8a99072 +--- /dev/null ++++ b/lib/DllSwResample.h @@ -0,0 +1,87 @@ +#pragma once +/* @@ -1286,10 +1309,11 @@ diff -Naur xbmc-11.0.1/lib/DllSwResample.h xbmc-11.0.1.patch/lib/DllSwResample.h +}; + +#endif -diff -Naur xbmc-11.0.1/lib/DllSwScale.h xbmc-11.0.1.patch/lib/DllSwScale.h ---- xbmc-11.0.1/lib/DllSwScale.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwScale.h 2012-06-05 15:19:23.871494792 +0200 -@@ -92,7 +92,7 @@ +diff --git a/lib/DllSwScale.h b/lib/DllSwScale.h +index 0cfb654..0fe8184 100644 +--- a/lib/DllSwScale.h ++++ b/lib/DllSwScale.h +@@ -92,7 +92,7 @@ public: virtual void sws_freeContext(struct SwsContext *context)=0; }; @@ -1298,9 +1322,10 @@ diff -Naur xbmc-11.0.1/lib/DllSwScale.h xbmc-11.0.1.patch/lib/DllSwScale.h // We call into this library directly. class DllSwScale : public DllDynamic, public DllSwScaleInterface -diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in ---- xbmc-11.0.1/lib/Makefile.in 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/Makefile.in 2012-06-05 15:19:23.880494972 +0200 +diff --git a/lib/Makefile.in b/lib/Makefile.in +index 3550582..2ea47fb 100644 +--- a/lib/Makefile.in ++++ b/lib/Makefile.in @@ -1,21 +1,18 @@ ARCH=@ARCH@ @@ -1332,7 +1357,7 @@ diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in DIRS= ifneq (@USE_EXTERNAL_FFMPEG@,1) -@@ -24,123 +21,55 @@ +@@ -24,123 +21,55 @@ endif LIBS= ifneq (@USE_EXTERNAL_FFMPEG@,1) @@ -1479,10 +1504,61 @@ diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in endif clean: -diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp 2012-06-05 15:19:23.881494992 +0200 -@@ -59,11 +59,7 @@ +diff --git a/xbmc/DllPaths_generated.h.in b/xbmc/DllPaths_generated.h.in +index a84dd52..10a7d87 100644 +--- a/xbmc/DllPaths_generated.h.in ++++ b/xbmc/DllPaths_generated.h.in +@@ -74,13 +74,13 @@ + #define DLL_PATH_LIBMAD "@MAD_SONAME@" + + /* ffmpeg */ +-#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" +-#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" +-#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" +-#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" +-#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" +-#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" +-#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" ++#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" ++#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" ++#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" ++#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" ++#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" ++#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" ++#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" + + /* cdrip */ + #if defined(_LINUX) && !defined(__APPLE__) +diff --git a/xbmc/DllPaths_win32.h b/xbmc/DllPaths_win32.h +index d39e2ea..fbd75a4 100644 +--- a/xbmc/DllPaths_win32.h ++++ b/xbmc/DllPaths_win32.h +@@ -58,13 +58,13 @@ + #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" + + /* ffmpeg */ +-#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" +-#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" +-#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" +-#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" +-#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" +-#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" +-#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" ++#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" ++#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" ++#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" ++#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" ++#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" ++#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" ++#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" + + /* cdrip */ + #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" +diff --git a/xbmc/cdrip/EncoderFFmpeg.cpp b/xbmc/cdrip/EncoderFFmpeg.cpp +index 1ec9805..bcedb0c 100644 +--- a/xbmc/cdrip/EncoderFFmpeg.cpp ++++ b/xbmc/cdrip/EncoderFFmpeg.cpp +@@ -59,11 +59,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int CStdString filename = URIUtils::GetFileName(strFile); AVOutputFormat *fmt = NULL; @@ -1494,7 +1570,7 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip if (!fmt) { CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Unable to guess the output format for the file %s", filename.c_str()); -@@ -82,7 +78,7 @@ +@@ -82,7 +78,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int } m_Format = m_dllAvFormat.avformat_alloc_context(); @@ -1503,7 +1579,7 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip if (!m_Format->pb) { m_dllAvUtil.av_freep(&m_Format); -@@ -93,17 +89,8 @@ +@@ -93,17 +89,8 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int m_Format->oformat = fmt; m_Format->bit_rate = g_guiSettings.GetInt("audiocds.bitrate") * 1000; @@ -1522,7 +1598,7 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip if (!m_Stream) { m_dllAvUtil.av_freep(&m_Format->pb); -@@ -144,7 +131,7 @@ +@@ -144,7 +131,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int return false; } @@ -1531,7 +1607,7 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip { CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to open the codec"); m_dllAvUtil.av_freep(&m_Stream); -@@ -179,7 +166,7 @@ +@@ -179,7 +166,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int SetTag("encoder" , "XBMC FFmpeg Encoder"); /* write the header */ @@ -1540,7 +1616,7 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip { CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to write the header"); delete[] m_Buffer; -@@ -194,7 +181,7 @@ +@@ -194,7 +181,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int void CEncoderFFmpeg::SetTag(const CStdString tag, const CStdString value) { @@ -1549,9 +1625,10 @@ diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip } int CEncoderFFmpeg::MuxerReadPacket(void *opaque, uint8_t *buf, int buf_size) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-06-05 15:19:23.882495012 +0200 +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp +index cebba1c..46fd47f 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp @@ -29,10 +29,6 @@ CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() @@ -1563,7 +1640,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. m_iBufferSize2 = 0; m_pBuffer2 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -@@ -45,11 +41,11 @@ +@@ -45,11 +41,11 @@ CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() m_channelMap[0] = PCM_INVALID; m_channels = 0; m_layout = 0; @@ -1576,7 +1653,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. _aligned_free(m_pBuffer2); Dispose(); } -@@ -59,12 +55,10 @@ +@@ -59,12 +55,10 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options AVCodec* pCodec; m_bOpenedCodec = false; @@ -1590,7 +1667,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); if (!pCodec) -@@ -73,6 +67,7 @@ +@@ -73,6 +67,7 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options return false; } @@ -1598,7 +1675,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. m_pCodecContext->debug_mv = 0; m_pCodecContext->debug = 0; m_pCodecContext->workaround_bugs = 1; -@@ -97,13 +92,14 @@ +@@ -97,13 +92,14 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options memcpy(m_pCodecContext->extradata, hints.extradata, hints.extrasize); } @@ -1614,7 +1691,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. m_bOpenedCodec = true; m_iSampleFormat = AV_SAMPLE_FMT_NONE; return true; -@@ -111,6 +107,9 @@ +@@ -111,6 +107,9 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options void CDVDAudioCodecFFmpeg::Dispose() { @@ -1624,7 +1701,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. if (m_pConvert) { m_dllAvCodec.av_audio_convert_free(m_pConvert); -@@ -135,7 +134,7 @@ +@@ -135,7 +134,7 @@ void CDVDAudioCodecFFmpeg::Dispose() int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) { @@ -1633,7 +1710,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. if (!m_pCodecContext) return -1; m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ; -@@ -145,10 +144,17 @@ +@@ -145,10 +144,17 @@ int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) m_dllAvCodec.av_init_packet(&avpkt); avpkt.data = pData; avpkt.size = iSize; @@ -1654,7 +1731,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. /* some codecs will attempt to consume more data than what we gave */ if (iBytesUsed > iSize) -@@ -184,9 +190,9 @@ +@@ -184,9 +190,9 @@ int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) return iBytesUsed; } @@ -1666,7 +1743,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. int ostr[6] = { 2 }; int len = m_iBufferSize1 / istr[0]; if(m_dllAvCodec.av_audio_convert(m_pConvert, obuf, ostr, ibuf, istr, len) < 0) -@@ -208,7 +214,7 @@ +@@ -208,7 +214,7 @@ int CDVDAudioCodecFFmpeg::GetData(BYTE** dst) { if(m_iBufferSize1) { @@ -1675,9 +1752,10 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. return m_iBufferSize1; } if(m_iBufferSize2) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-06-05 15:19:23.882495012 +0200 +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h +index dbd4948..4c01499 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h @@ -23,7 +23,6 @@ #include "DVDAudioCodec.h" @@ -1686,7 +1764,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. #include "DllAvFormat.h" #include "DllAvUtil.h" -@@ -51,7 +50,7 @@ +@@ -51,7 +50,7 @@ protected: enum AVSampleFormat m_iSampleFormat; enum PCMChannels m_channelMap[PCM_MAX_CH + 1]; @@ -1695,7 +1773,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. int m_iBufferSize1; BYTE *m_pBuffer2; -@@ -64,7 +63,6 @@ +@@ -64,7 +63,6 @@ protected: int64_t m_layout; DllAvCodec m_dllAvCodec; @@ -1703,10 +1781,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg. DllAvUtil m_dllAvUtil; void BuildChannelMap(); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-06-05 15:19:23.883495032 +0200 -@@ -79,11 +79,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp +index 34e93a4..c0c3c06 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp +@@ -79,11 +79,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri /* get the muxer */ AVOutputFormat *fOut = NULL; @@ -1718,7 +1797,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr if (!fOut) { CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to get the FFmpeg %s muxer", muxerName.c_str()); -@@ -103,7 +99,7 @@ +@@ -103,7 +99,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri muxer.m_pFormat->oformat = fOut; /* allocate a put_byte struct so we can grab the output */ @@ -1727,7 +1806,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr if (!muxer.m_pFormat->pb) { CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate ByteIOContext"); -@@ -112,21 +108,10 @@ +@@ -112,21 +108,10 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri } /* this is streamed, no file, and ignore the index */ @@ -1750,7 +1829,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr /* While this is strictly only needed on big-endian systems, we do it on * both to avoid as much dead code as possible. * CoreAudio (at least on the cases we've seen) wants IEC 61937 in -@@ -138,8 +123,7 @@ +@@ -138,8 +123,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri #endif /* request output of wanted endianness */ @@ -1760,7 +1839,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr { #if defined(WORDS_BIGENDIAN) && !defined(__APPLE__) CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Unable to set big-endian stream mode (FFmpeg too old?), disabling passthrough"); -@@ -149,7 +133,7 @@ +@@ -149,7 +133,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri } /* add a stream to it */ @@ -1769,7 +1848,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr if (!muxer.m_pStream) { CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate AVStream context"); -@@ -159,8 +143,6 @@ +@@ -159,8 +143,6 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri /* set the stream's parameters */ @@ -1778,7 +1857,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr m_SampleRate = hints.samplerate; if(!m_SampleRate && hints.codec == CODEC_ID_AC3) m_SampleRate = 48000; -@@ -176,7 +158,7 @@ +@@ -176,7 +158,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri codec->extradata_size = hints.extrasize; memcpy(codec->extradata, hints.extradata, hints.extrasize); @@ -1787,10 +1866,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthr if (!muxer.m_WroteHeader) { CLog::Log(LOGERROR, "CDVDAudioCodecPassthrough::SetupMuxer - Failed to write the frame header"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-06-05 15:19:23.943496230 +0200 -@@ -55,7 +55,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp +index 77d4b64..0189e65 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp +@@ -55,7 +55,7 @@ CDVDAudioEncoderFFmpeg::~CDVDAudioEncoderFFmpeg() bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels *channelMap, unsigned int bitsPerSample, unsigned int sampleRate) { Reset(); @@ -1799,7 +1879,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc return false; m_dllAvCodec.avcodec_register_all(); -@@ -65,7 +65,7 @@ +@@ -65,7 +65,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels return false; /* always assume 6 channels, 5.1... m_remap will give us what we want */ @@ -1808,7 +1888,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc m_CodecCtx->bit_rate = AC3_ENCODE_BITRATE; m_CodecCtx->sample_rate = sampleRate; m_CodecCtx->channels = 6; -@@ -104,7 +104,7 @@ +@@ -104,7 +104,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels } } @@ -1817,7 +1897,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc { m_dllAvUtil.av_freep(&m_CodecCtx); return false; -@@ -149,7 +149,7 @@ +@@ -149,7 +149,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels if (m_AudioConvert) m_TmpBuffer2 = new uint8_t[m_NeededFrames * m_CodecCtx->channels * @@ -1826,7 +1906,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc return true; } -@@ -186,7 +186,7 @@ +@@ -186,7 +186,7 @@ int CDVDAudioEncoderFFmpeg::Encode(uint8_t *data, int size) void *convInBuf[] = { m_TmpBuffer }; int convInStr[] = { m_BitsPerSample / 8 }; void *convOutBuf[] = { m_TmpBuffer2 }; @@ -1835,10 +1915,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc if (m_dllAvCodec.av_audio_convert(m_AudioConvert, convOutBuf, convOutStr, convInBuf, convInStr, m_NeededFrames * m_CodecCtx->channels) < 0) { CLog::Log(LOGERROR, "CDVDAudioEncoderFFmpeg: Audio conversion failed"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-06-05 15:19:23.944496250 +0200 -@@ -43,7 +43,6 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h +index 93bd2c7..40be42b 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h +@@ -43,7 +43,6 @@ public: virtual int GetData(uint8_t **data); private: DllAvCodec m_dllAvCodec; @@ -1846,10 +1927,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEnc DllAvUtil m_dllAvUtil; AVCodecContext *m_CodecCtx; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-06-05 15:19:23.944496250 +0200 -@@ -49,7 +49,14 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp +index 563ce78..238c855 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp +@@ -49,7 +49,14 @@ bool CDVDOverlayCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &optio m_dllAvCodec.avcodec_register_all(); @@ -1865,7 +1947,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFm m_pCodecContext->debug_mv = 0; m_pCodecContext->debug = 0; m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; -@@ -100,14 +107,7 @@ +@@ -100,14 +107,7 @@ bool CDVDOverlayCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &optio delete[] parse_extra; } @@ -1881,7 +1963,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFm { CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); return false; -@@ -134,19 +134,12 @@ +@@ -134,19 +134,12 @@ void CDVDOverlayCodecFFmpeg::FreeSubtitle(AVSubtitle& sub) { for(unsigned i=0;isource_width = m_width; overlay->source_height = m_height; @@ -1909,7 +1991,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFm BYTE* s = rect.pict.data[0]; BYTE* t = overlay->data; for(int i=0;icodec_id = hints.codec; m_pCodecContext->width = hints.width; m_pCodecContext->height = hints.height; -@@ -207,7 +211,7 @@ +@@ -207,7 +211,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set break; } @@ -1980,7 +2063,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Failed to get VDPAU device"); vdp->Release(); } -@@ -226,21 +230,26 @@ +@@ -226,21 +230,26 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Using codec: %s",pCodec->long_name ? pCodec->long_name : pCodec->name); @@ -2009,7 +2092,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. ) m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE; #endif -@@ -272,16 +281,16 @@ +@@ -272,16 +281,16 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options if (it->m_name == "surfaces") m_uSurfacesCount = std::atoi(it->m_value.c_str()); else @@ -2029,7 +2112,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); return false; -@@ -290,14 +299,7 @@ +@@ -290,14 +299,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options m_pFrame = m_dllAvCodec.avcodec_alloc_frame(); if (!m_pFrame) return false; @@ -2045,7 +2128,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. return true; } -@@ -306,13 +308,6 @@ +@@ -306,13 +308,6 @@ void CDVDVideoCodecFFmpeg::Dispose() if (m_pFrame) m_dllAvUtil.av_free(m_pFrame); m_pFrame = NULL; @@ -2059,7 +2142,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if (m_pCodecContext) { if (m_pCodecContext->codec) m_dllAvCodec.avcodec_close(m_pCodecContext); -@@ -458,9 +453,6 @@ +@@ -458,9 +453,6 @@ int CDVDVideoCodecFFmpeg::Decode(BYTE* pData, int iSize, double dts, double pts) return VC_ERROR; } @@ -2069,17 +2152,21 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if (!iGotPicture) return VC_BUFFER; -@@ -478,67 +470,32 @@ +@@ -478,67 +470,32 @@ int CDVDVideoCodecFFmpeg::Decode(BYTE* pData, int iSize, double dts, double pts) if(m_pCodecContext->codec_id == CODEC_ID_H264) m_started = true; - if(m_pCodecContext->pix_fmt != PIX_FMT_YUV420P - && m_pCodecContext->pix_fmt != PIX_FMT_YUVJ420P - && m_pHardware == NULL) -- { ++ if(m_pHardware == NULL) + { - if (!m_dllSwScale.IsLoaded() && !m_dllSwScale.Load()) - return VC_ERROR; -- ++ bool need_scale = std::find( m_formats.begin() ++ , m_formats.end() ++ , m_pCodecContext->pix_fmt) == m_formats.end(); + - if (!m_pConvertFrame) - { - // Allocate an AVFrame structure @@ -2095,20 +2182,15 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. - return VC_ERROR; - } - } -+ if(m_pHardware == NULL) -+ { -+ bool need_scale = std::find( m_formats.begin() -+ , m_formats.end() -+ , m_pCodecContext->pix_fmt) == m_formats.end(); ++ bool need_reopen = false; ++ if(!m_filters.Equals(m_filters_next)) ++ need_reopen = true; - // convert the picture - struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, - m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, - PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); -+ bool need_reopen = false; -+ if(!m_filters.Equals(m_filters_next)) -+ need_reopen = true; - +- - if(context == NULL) + if(m_pFilterIn) { @@ -2156,7 +2238,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. } int result; -@@ -564,12 +521,6 @@ +@@ -564,12 +521,6 @@ void CDVDVideoCodecFFmpeg::Reset() if (m_pHardware) m_pHardware->Reset(); @@ -2169,7 +2251,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. m_filters = ""; FilterClose(); } -@@ -579,10 +530,10 @@ +@@ -579,10 +530,10 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) pDvdVideoPicture->iWidth = m_pCodecContext->width; pDvdVideoPicture->iHeight = m_pCodecContext->height; @@ -2183,7 +2265,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. } /* crop of 10 pixels if demuxer asked it */ -@@ -598,12 +549,8 @@ +@@ -598,12 +549,8 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) /* use variable in the frame */ AVRational pixel_aspect = m_pCodecContext->sample_aspect_ratio; @@ -2198,7 +2280,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if (pixel_aspect.num == 0) aspect_ratio = 0; -@@ -632,8 +579,6 @@ +@@ -632,8 +579,6 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; @@ -2207,7 +2289,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location; pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries; -@@ -677,14 +622,6 @@ +@@ -677,14 +622,6 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) if(!GetPictureCommon(pDvdVideoPicture)) return false; @@ -2222,7 +2304,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { for (int i = 0; i < 4; i++) pDvdVideoPicture->data[i] = m_pFrame->data[i]; -@@ -693,20 +630,38 @@ +@@ -693,20 +630,38 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) } pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; @@ -2264,7 +2346,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. return 0; if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) -@@ -715,17 +670,8 @@ +@@ -715,17 +670,8 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) return -1; } @@ -2283,7 +2365,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. CStdString args; -@@ -744,11 +690,19 @@ +@@ -744,11 +690,19 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) return result; } @@ -2304,7 +2386,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if (!filters.empty()) { -@@ -794,6 +748,12 @@ +@@ -794,6 +748,12 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) void CDVDVideoCodecFFmpeg::FilterClose() { @@ -2317,7 +2399,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if (m_pFilterGraph) { m_dllAvFilter.avfilter_graph_free(&m_pFilterGraph); -@@ -801,7 +761,6 @@ +@@ -801,7 +761,6 @@ void CDVDVideoCodecFFmpeg::FilterClose() // Disposed by above code m_pFilterIn = NULL; m_pFilterOut = NULL; @@ -2325,7 +2407,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. } } -@@ -809,20 +768,9 @@ +@@ -809,24 +768,9 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) { int result, frames; @@ -2333,6 +2415,9 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. - if (frame) { +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); +-#else -#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); -#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) @@ -2342,11 +2427,12 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. -#else - result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); -#endif +-#endif - if (result < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); -@@ -830,7 +778,13 @@ +@@ -834,7 +778,13 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) } } @@ -2361,7 +2447,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); return VC_ERROR; -@@ -838,19 +792,9 @@ +@@ -842,19 +792,9 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) if (frames > 0) { @@ -2383,7 +2469,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); return VC_ERROR; -@@ -861,11 +805,11 @@ +@@ -865,11 +805,11 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) else m_pFrame->repeat_pict = -(frames - 1); @@ -2399,10 +2485,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if(frames > 1) return VC_PICTURE; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-06-05 15:19:23.946496292 +0200 -@@ -68,27 +68,36 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +index 53890cb..b958509 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +@@ -68,27 +68,36 @@ public: { SAFE_RELEASE(m_pHardware); m_pHardware = hardware; @@ -2444,16 +2531,17 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. int m_iPictureWidth; int m_iPictureHeight; -@@ -109,4 +118,5 @@ +@@ -109,4 +118,5 @@ protected: int m_iLastKeyframe; double m_dts; bool m_started; + std::vector m_formats; }; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-06-05 15:19:23.947496313 +0200 -@@ -525,8 +525,8 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp +index 0238864..c9f0650 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp +@@ -525,8 +525,8 @@ const int avc_parse_nal_units(DllAvFormat *av_format_ctx, { while (!*(nal_start++)); nal_end = avc_find_startcode(nal_start, end); @@ -2464,7 +2552,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp size += 4 + nal_end - nal_start; nal_start = nal_end; } -@@ -537,14 +537,14 @@ +@@ -537,14 +537,14 @@ const int avc_parse_nal_units_buf(DllAvUtil *av_util_ctx, DllAvFormat *av_format const uint8_t *buf_in, uint8_t **buf, int *size) { ByteIOContext *pb; @@ -2481,7 +2569,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp return 0; } -@@ -590,26 +590,26 @@ +@@ -590,26 +590,26 @@ const int isom_write_avcc(DllAvUtil *av_util_ctx, DllAvFormat *av_format_ctx, } assert(sps); @@ -2520,7 +2608,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp } } return 0; -@@ -706,7 +706,7 @@ +@@ -706,7 +706,7 @@ bool CDVDVideoCodecVDA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) } ByteIOContext *pb; @@ -2529,7 +2617,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp { return false; } -@@ -717,7 +717,7 @@ +@@ -717,7 +717,7 @@ bool CDVDVideoCodecVDA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) // unhook from ffmpeg's extradata extradata = NULL; // extract the avcC atom data into extradata then write it into avcCData for VDADecoder @@ -2538,7 +2626,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp // CFDataCreate makes a copy of extradata contents avcCData = CFDataCreate(kCFAllocatorDefault, (const uint8_t*)extradata, extrasize); // done with the converted extradata, we MUST free using av_free -@@ -948,12 +948,12 @@ +@@ -948,12 +948,12 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) int demuxer_bytes; uint8_t *demuxer_content; @@ -2553,7 +2641,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); m_dllAvUtil->av_free(demuxer_content); } -@@ -961,7 +961,7 @@ +@@ -961,7 +961,7 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) { // convert demuxer packet from 3 byte NAL sizes to 4 byte ByteIOContext *pb; @@ -2562,7 +2650,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp return VC_ERROR; uint32_t nal_size; -@@ -970,14 +970,14 @@ +@@ -970,14 +970,14 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) while (nal_start < end) { nal_size = VDA_RB24(nal_start); @@ -2580,10 +2668,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); m_dllAvUtil->av_free(demuxer_content); } -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-06-05 15:19:23.949496352 +0200 -@@ -474,7 +474,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp +index 5f512fb..cca5318 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp +@@ -474,7 +474,7 @@ int quicktime_write_mp4_descr_length(DllAvFormat *av_format_ctx, ByteIOContext * { b |= 0x80; } @@ -2592,7 +2681,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo } return numBytes; -@@ -482,37 +482,37 @@ +@@ -482,37 +482,37 @@ int quicktime_write_mp4_descr_length(DllAvFormat *av_format_ctx, ByteIOContext * void quicktime_write_esds(DllAvFormat *av_format_ctx, ByteIOContext *pb, quicktime_esds_t *esds) { @@ -2646,7 +2735,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo /* no IPI_DescrPointer */ /* no IP_IdentificationDataSet */ -@@ -666,8 +666,8 @@ +@@ -666,8 +666,8 @@ const int avc_parse_nal_units(DllAvFormat *av_format_ctx, { while (!*(nal_start++)); nal_end = avc_find_startcode(nal_start, end); @@ -2657,7 +2746,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo size += 4 + nal_end - nal_start; nal_start = nal_end; } -@@ -678,14 +678,14 @@ +@@ -678,14 +678,14 @@ const int avc_parse_nal_units_buf(DllAvUtil *av_util_ctx, DllAvFormat *av_format const uint8_t *buf_in, uint8_t **buf, int *size) { ByteIOContext *pb; @@ -2674,7 +2763,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo return 0; } -@@ -770,26 +770,26 @@ +@@ -770,26 +770,26 @@ const int isom_write_avcc(DllAvUtil *av_util_ctx, DllAvFormat *av_format_ctx, } assert(sps); @@ -2713,7 +2802,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo } } return 0; -@@ -1086,7 +1086,7 @@ +@@ -1086,7 +1086,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o ByteIOContext *pb; quicktime_esds_t *esds; @@ -2722,7 +2811,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo return false; esds = quicktime_set_esds(m_dllAvFormat, extradata, extrasize); -@@ -1095,7 +1095,7 @@ +@@ -1095,7 +1095,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o // unhook from ffmpeg's extradata extradata = NULL; // extract the esds atom decoderConfig from extradata @@ -2731,7 +2820,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo free(esds->decoderConfig); free(esds); -@@ -1152,7 +1152,7 @@ +@@ -1152,7 +1152,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o // NAL reformating to bitstream format required ByteIOContext *pb; @@ -2740,7 +2829,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo return false; m_convert_bytestream = true; -@@ -1161,7 +1161,7 @@ +@@ -1161,7 +1161,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o // unhook from ffmpeg's extradata extradata = NULL; // extract the avcC atom data into extradata getting size into extrasize @@ -2749,7 +2838,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo // check for interlaced and get number of ref frames if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames)) -@@ -1301,17 +1301,17 @@ +@@ -1301,17 +1301,17 @@ int CDVDVideoCodecVideoToolBox::Decode(BYTE* pData, int iSize, double dts, doubl if (m_convert_bytestream) { // convert demuxer packet from bytestream (AnnexB) to bitstream @@ -2770,7 +2859,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo return VC_ERROR; uint32_t nal_size; -@@ -1320,13 +1320,13 @@ +@@ -1320,13 +1320,13 @@ int CDVDVideoCodecVideoToolBox::Decode(BYTE* pData, int iSize, double dts, doubl while (nal_start < end) { nal_size = VDA_RB24(nal_start); @@ -2787,10 +2876,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoTo sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); } else -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-06-05 15:19:23.950496372 +0200 -@@ -223,7 +223,6 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +index 18fe368..a4b8725 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +@@ -223,7 +223,6 @@ int CDecoder::GetBuffer(AVCodecContext *avctx, AVFrame *pic) } pic->type = FF_BUFFER_TYPE_USER; @@ -2798,10 +2888,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp xbmc-11.0. pic->data[0] = (uint8_t*)wrapper; pic->data[1] = NULL; pic->data[2] = NULL; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-06-05 15:19:23.951496392 +0200 -@@ -1197,14 +1197,12 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index 0e67af3..7379d60 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -1211,14 +1211,12 @@ int CVDPAU::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) if(pic->reference) { @@ -2816,10 +2907,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-11.0. pA->ip_age[0]++; pA->ip_age[1]++; pA->b_age = 1; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-06-05 15:19:23.955496472 +0200 -@@ -160,7 +160,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +index 55138fa..31b6634 100644 +--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +@@ -161,7 +161,7 @@ static TLS g_tls; #define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) #endif @@ -2828,7 +2920,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- { if(g_demuxer && g_demuxer->Aborted()) return 1; -@@ -178,7 +178,7 @@ +@@ -179,7 +179,7 @@ static int dvd_file_open(URLContext *h, const char *filename, int flags) static int dvd_file_read(void *h, uint8_t* buf, int size) { @@ -2837,7 +2929,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- return -1; CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -192,7 +192,7 @@ +@@ -193,7 +193,7 @@ static int dvd_file_write(URLContext *h, BYTE* buf, int size) */ static offset_t dvd_file_seek(void *h, offset_t pos, int whence) { @@ -2846,7 +2938,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- return -1; CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -236,6 +236,7 @@ +@@ -237,6 +237,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) m_speed = DVD_PLAYSPEED_NORMAL; g_demuxer = this; m_program = UINT_MAX; @@ -2854,7 +2946,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- if (!pInput) return false; -@@ -246,10 +247,6 @@ +@@ -247,10 +248,6 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) // register codecs m_dllAvFormat.av_register_all(); @@ -2865,7 +2957,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- m_pInput = pInput; strFile = m_pInput->GetFileName(); -@@ -284,14 +281,14 @@ +@@ -285,14 +282,14 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) // try mmsh, then mmst CStdString strFile2; strFile2.Format("mmsh://%s",strFile.substr(6,strFile.size()-6).c_str()); @@ -2882,7 +2974,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- { CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str()); Dispose(); -@@ -301,24 +298,16 @@ +@@ -302,24 +299,16 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) else { unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(FFMPEG_FILE_BUFFER_SIZE); @@ -2909,7 +3001,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- // let ffmpeg decide which demuxer we have to open bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); -@@ -331,7 +320,7 @@ +@@ -332,7 +321,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) // want to probe for spdif (DTS or IEC 61937) compressed audio // specifically, or in case the file is a wav which may contain DTS or // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. @@ -2918,7 +3010,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- { AVProbeData pd; BYTE probe_buffer[FFMPEG_FILE_BUFFER_SIZE + AVPROBE_PADDING_SIZE]; -@@ -341,7 +330,7 @@ +@@ -342,7 +331,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) pd.filename = strFile.c_str(); // read data using avformat's buffers @@ -2927,7 +3019,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- if (pd.buf_size <= 0) { CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str()); -@@ -350,10 +339,7 @@ +@@ -351,10 +340,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE); // restore position again @@ -2939,7 +3031,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- // the advancedsetting is for allowing the user to force outputting the // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode -@@ -424,7 +410,10 @@ +@@ -425,7 +411,10 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) // open the demuxer @@ -2951,7 +3043,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- { CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str()); Dispose(); -@@ -432,8 +421,11 @@ +@@ -433,8 +422,11 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) } } @@ -2964,7 +3056,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- m_pFormatContext->max_analyze_duration = 500000; // we need to know if this is matroska or avi later -@@ -447,8 +439,8 @@ +@@ -448,8 +440,8 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) m_pFormatContext->max_analyze_duration = 500000; @@ -2975,7 +3067,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- if (iErr < 0) { CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str()); -@@ -471,7 +463,7 @@ +@@ -472,7 +464,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) m_pFormatContext->flags |= AVFMT_FLAG_NONBLOCK; // print some extra information @@ -2984,7 +3076,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- UpdateCurrentPTS(); -@@ -510,20 +502,12 @@ +@@ -511,20 +503,12 @@ void CDVDDemuxFFmpeg::Dispose() if (m_pFormatContext) { @@ -3009,7 +3101,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- } m_ioContext = NULL; m_pFormatContext = NULL; -@@ -773,19 +757,12 @@ +@@ -774,19 +758,12 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() { stream->duration = duration; duration = m_dllAvUtil.av_rescale_rnd(stream->duration, (int64_t)stream->time_base.num * AV_TIME_BASE, stream->time_base.den, AV_ROUND_NEAR_INF); @@ -3030,7 +3122,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- pPacket->iStreamId = pkt.stream_index; // XXX just for now } m_dllAvCodec.av_free_packet(&pkt); -@@ -923,19 +900,6 @@ +@@ -924,19 +901,6 @@ int CDVDDemuxFFmpeg::GetStreamLength() if (!m_pFormatContext) return 0; @@ -3050,7 +3142,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- return (int)(m_pFormatContext->duration / (AV_TIME_BASE / 1000)); } -@@ -970,6 +934,12 @@ +@@ -971,6 +935,12 @@ static double SelectAspect(AVStream* st, bool* forced) void CDVDDemuxFFmpeg::AddStream(int iId) { @@ -3063,7 +3155,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- AVStream* pStream = m_pFormatContext->streams[iId]; if (pStream) { -@@ -987,8 +957,8 @@ +@@ -988,8 +958,8 @@ void CDVDDemuxFFmpeg::AddStream(int iId) st->iBitRate = pStream->codec->bit_rate; st->iBitsPerSample = pStream->codec->bits_per_coded_sample; @@ -3074,7 +3166,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- break; } -@@ -1077,8 +1047,8 @@ +@@ -1078,8 +1048,8 @@ void CDVDDemuxFFmpeg::AddStream(int iId) if(pStream->codec) st->identifier = pStream->codec->sub_id; @@ -3085,7 +3177,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- break; } -@@ -1089,7 +1059,7 @@ +@@ -1090,7 +1060,7 @@ void CDVDDemuxFFmpeg::AddStream(int iId) { std::string fileName = "special://temp/fonts/"; XFILE::CDirectory::Create(fileName); @@ -3094,7 +3186,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- if (!nameTag) { CLog::Log(LOGERROR, "%s: TTF attachment has no name", __FUNCTION__); break; -@@ -1138,7 +1108,7 @@ +@@ -1139,7 +1109,7 @@ void CDVDDemuxFFmpeg::AddStream(int iId) // API added on: 2010-10-15 // (Note that while the function was available earlier, the generic // metadata tags were not populated by default) @@ -3103,7 +3195,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- if (langTag) strncpy(m_streams[iId]->language, langTag->value, 3); #else -@@ -1248,7 +1218,7 @@ +@@ -1249,7 +1219,7 @@ void CDVDDemuxFFmpeg::GetChapterName(std::string& strChapterName) // API added on: 2010-10-15 // (Note that while the function was available earlier, the generic // metadata tags were not populated by default) @@ -3112,10 +3204,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc- "title", NULL, 0); if (titleTag) strChapterName = titleTag->value; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-06-05 15:19:23.956496492 +0200 -@@ -128,7 +128,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +index 018d9b3..84ea4b7 100644 +--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +@@ -128,7 +128,7 @@ protected: #define MAX_STREAMS 100 CDemuxStream* m_streams[MAX_STREAMS]; // maximum number of streams that ffmpeg can handle @@ -3124,10 +3217,11 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h xbmc-11 DllAvFormat m_dllAvFormat; DllAvCodec m_dllAvCodec; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-06-05 15:19:23.957496512 +0200 -@@ -413,6 +413,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index e28faaf..eb51038 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -413,6 +413,7 @@ void CDVDPlayerVideo::Process() { if(m_pVideoCodec) m_pVideoCodec->Reset(); @@ -3135,7 +3229,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch m_packets.clear(); m_started = false; } -@@ -420,6 +421,7 @@ +@@ -420,6 +421,7 @@ void CDVDPlayerVideo::Process() { if(m_pVideoCodec) m_pVideoCodec->Reset(); @@ -3143,51 +3237,3 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch m_packets.clear(); m_pullupCorrection.Flush(); -diff -Naur xbmc-11.0.1/xbmc/DllPaths_generated.h.in xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in ---- xbmc-11.0.1/xbmc/DllPaths_generated.h.in 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in 2012-06-05 15:19:23.957496512 +0200 -@@ -74,13 +74,13 @@ - #define DLL_PATH_LIBMAD "@MAD_SONAME@" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" - - /* cdrip */ - #if defined(_LINUX) && !defined(__APPLE__) -diff -Naur xbmc-11.0.1/xbmc/DllPaths_win32.h xbmc-11.0.1.patch/xbmc/DllPaths_win32.h ---- xbmc-11.0.1/xbmc/DllPaths_win32.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_win32.h 2012-06-05 15:19:23.958496532 +0200 -@@ -58,13 +58,13 @@ - #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" - - /* cdrip */ - #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.41-avfilter-depends-on-avformat.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.41-avfilter-depends-on-avformat.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.41-avfilter-depends-on-avformat.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.41-avfilter-depends-on-avformat.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.00-vdpau_reset_pvr_changes.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.00-vdpau_reset_pvr_changes.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.00-vdpau_reset_pvr_changes.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.00-vdpau_reset_pvr_changes.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.02-xvba_support-gcc-4.7.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.02-xvba_support-gcc-4.7.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.02-xvba_support-gcc-4.7.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.02-xvba_support-gcc-4.7.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch new file mode 100644 index 0000000000..f1c90b0544 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch @@ -0,0 +1,15 @@ +--- xbmc-pvr-11.0.2/configure.in.orig 2012-08-29 01:02:48.633007939 +0200 ++++ xbmc-pvr-11.0.2/configure.in 2012-08-29 01:03:40.593006545 +0200 +@@ -1287,11 +1287,7 @@ + AC_DEFINE([USE_EXTERNAL_FFMPEG], [1], [Whether to use external FFmpeg libraries.]) + + # Disable vdpau support if external libavcodec doesn't have it +- AC_RUN_IFELSE( +- AC_LANG_PROGRAM([[#include ]], +- [[avcodec_register_all(); +- AVCodec *codec = avcodec_find_decoder_by_name("vc1_vdpau"); +- return (codec) ? 0 : 1;]]),, ++ AC_CHECK_LIB([avcodec], [ff_vdpau_vc1_decode_picture],, + [if test "x$use_vdpau" = "xyes"; then + AC_MSG_ERROR($ffmpeg_vdpau_not_supported) + else diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.11-disable_interop.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.11-disable_interop.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.11-disable_interop.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.11-disable_interop.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch new file mode 100644 index 0000000000..eca975c029 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch @@ -0,0 +1,1420 @@ +From 634226f3c604c38d6dd245800f05673583ba2dca Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Thu, 30 Aug 2012 12:38:39 +0200 +Subject: [PATCH 01/10] backport vdpau changes + +--- + .../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 4 +- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 59 +++----------------- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h | 10 ---- + xbmc/settings/GUISettings.cpp | 2 +- + xbmc/settings/GUIWindowSettingsCategory.cpp | 4 +- + 5 files changed, 13 insertions(+), 66 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +index 3416506..01a8c78 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +@@ -132,8 +132,7 @@ struct DVDVideoUserData + #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped + #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data + #define DVP_FLAG_DROPDEINT 0x00000040 // indicate that this picture was requested to have been dropped in deint stage +- +-#define DVP_FLAG_SKIP_PROC 0x00000100 ++#define DVP_FLAG_NO_POSTPROC 0x00000100 + #define DVP_FLAG_DRAIN 0x00000200 + + // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2! +@@ -155,7 +154,6 @@ struct DVDVideoUserData + #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again + #define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped + #define VC_HURRY 0x00000040 +-#define VC_SKIPPROC 0x00000080 + + class CDVDVideoCodec + { +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index aed9d63..16edf55 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -95,10 +95,8 @@ + m_vdpauConfig.videoSurfaces = &m_videoSurfaces; + m_vdpauConfig.videoSurfaceSec = &m_videoSurfaceSec; + +- m_picAge.b_age = m_picAge.ip_age[0] = m_picAge.ip_age[1] = 256*256*256*64; + m_vdpauConfigured = false; + m_DisplayState = VDPAU_OPEN; +- m_speed = DVD_PLAYSPEED_NORMAL; + } + + bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) +@@ -252,13 +250,6 @@ long CDecoder::ReleasePicReference() + + void CDecoder::SetWidthHeight(int width, int height) + { +- int vdpauMaxHeight = g_advancedSettings.m_videoVDPAUmaxHeight; +- if (vdpauMaxHeight > 0 && height > vdpauMaxHeight) +- { +- width = MathUtils::round_int((double)width * vdpauMaxHeight / height); +- height = vdpauMaxHeight; +- } +- + m_vdpauConfig.upscale = g_advancedSettings.m_videoVDPAUScaling; + + //pick the smallest dimensions, so we downscale with vdpau and upscale with opengl when appropriate +@@ -282,7 +273,7 @@ void CDecoder::SetWidthHeight(int width, int height) + m_vdpauConfig.outWidth = width; + m_vdpauConfig.outHeight = height; + } +- CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i vdpauMaxHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight, vdpauMaxHeight); ++ CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight); + } + + void CDecoder::OnLostDevice() +@@ -710,7 +701,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); + CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; + CDecoder* vdp = (CDecoder*)ctx->GetHardware(); +- struct PictureAge* pA = &vdp->m_picAge; + + // while we are waiting to recover we can't do anything + CSingleLock lock(vdp->m_DecoderSection); +@@ -777,18 +767,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + + pic->linesize[0] = pic->linesize[1] = pic->linesize[2] = 0; + +- if(pic->reference) +- { +- pA->ip_age[0]= pA->ip_age[1]+1; +- pA->ip_age[1]= 1; +- pA->b_age++; +- } +- else +- { +- pA->ip_age[0]++; +- pA->ip_age[1]++; +- pA->b_age = 1; +- } + pic->type= FF_BUFFER_TYPE_USER; + + render->state |= FF_VDPAU_STATE_USED_FOR_REFERENCE; +@@ -937,11 +915,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bo + m_bufferStats.IncDecoded(); + m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); + +- m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); +- if (m_codecControl & DVP_FLAG_SKIP_PROC) +- { +- m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); +- } ++ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_NO_POSTPROC); + } + + int retval = 0; +@@ -1017,7 +991,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bo + uint64_t diff = CurrentHostCounter() - startTime; + if (retval & VC_PICTURE) + { +- m_bufferStats.SetParams(diff, m_speed); ++ m_bufferStats.SetParams(diff, m_codecControl); + } + if (diff*1000/CurrentHostFrequency() > 50) + CLog::Log(LOGDEBUG,"CVDPAU::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); +@@ -1079,11 +1053,6 @@ bool CDecoder::CanSkipDeint() + return m_bufferStats.CanSkipDeint(); + } + +-void CDecoder::SetSpeed(int speed) +-{ +- m_speed = speed; +-} +- + void CDecoder::ReturnRenderPicture(CVdpauRenderPicture *renderPic) + { + m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); +@@ -1150,7 +1119,6 @@ void CVdpauRenderPicture::ReturnUnused() + if (vdpau) + vdpau->ReturnRenderPicture(this); + } +- + //----------------------------------------------------------------------------- + // Mixer + //----------------------------------------------------------------------------- +@@ -1847,7 +1815,7 @@ void CMixer::SetDeinterlacing() + { + if (method == VS_INTERLACEMETHOD_AUTO) + { +- VdpBool enabled[] = {1,1,0}; ++ VdpBool enabled[] = {1,0,0}; + if (g_advancedSettings.m_videoVDPAUtelecine) + enabled[2] = 1; + vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); +@@ -2127,10 +2095,10 @@ void CMixer::InitCycle() + { + CheckFeatures(); + uint64_t latency; +- int speed; +- m_config.stats->GetParams(latency, speed); ++ int flags; ++ m_config.stats->GetParams(latency, flags); + latency = (latency*1000)/CurrentHostFrequency(); +- if (speed != DVD_PLAYSPEED_NORMAL) ++ if (flags & DVP_FLAG_NO_POSTPROC) + SetPostProcFeatures(false); + else + SetPostProcFeatures(true); +@@ -2248,14 +2216,6 @@ void CMixer::ProcessPicture() + if (m_processPicture.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) + return; + +- int cmd = 0; +- m_config.stats->GetCmd(cmd); +- if (cmd & DVP_FLAG_SKIP_PROC) +- { +- m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; +- return; +- } +- + VdpStatus vdp_st; + + if (m_mixerstep == 1) +@@ -3222,7 +3182,7 @@ bool COutput::GLInit() + glVDPAUGetSurfaceivNV = NULL; + #endif + +- m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"); ++ m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinterop"); + + #ifdef GL_NV_vdpau_interop + if (glewIsSupported("GL_NV_vdpau_interop")) +@@ -3254,7 +3214,7 @@ bool COutput::GLInit() + #endif + { + m_config.usePixmaps = true; +- g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); ++ g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); + g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + if (!glXBindTexImageEXT) +@@ -3538,5 +3498,4 @@ bool COutput::DestroyGlxContext() + return true; + } + +- + #endif +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +index e08687c..17f1f6e 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +@@ -508,12 +508,6 @@ class CDecoder + + public: + +- struct PictureAge +- { +- int b_age; +- int ip_age[2]; +- }; +- + struct Desc + { + const char *name; +@@ -532,7 +526,6 @@ class CDecoder + virtual void Close(); + virtual long Release(); + virtual bool CanSkipDeint(); +- virtual void SetSpeed(int speed); + + virtual int Check(AVCodecContext* avctx); + virtual const std::string Name() { return "vdpau"; } +@@ -591,16 +584,13 @@ class CDecoder + CVdpauConfig m_vdpauConfig; + std::vector m_videoSurfaces; + CCriticalSection m_videoSurfaceSec; +- PictureAge m_picAge; + + COutput m_vdpauOutput; + CVdpauBufferStats m_bufferStats; + CEvent m_inMsgEvent; + CVdpauRenderPicture *m_presentPicture; + +- int m_speed; + int m_codecControl; + }; + + } +- +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 4e8aabb..2d79423 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -597,7 +597,7 @@ void CGUISettings::Initialize() + + #ifdef HAVE_LIBVDPAU + AddBool(vp, "videoplayer.usevdpau", 13425, true); +- AddBool(vp, "videoplayer.usevdpauinteroprgb", 13433, true); ++ AddBool(vp, "videoplayer.usevdpauinterop", 13433, true); + AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); + #endif + #ifdef HAVE_LIBVA +diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp +index a69f130..40becc0 100644 +--- a/xbmc/settings/GUIWindowSettingsCategory.cpp ++++ b/xbmc/settings/GUIWindowSettingsCategory.cpp +@@ -577,7 +577,7 @@ void CGUIWindowSettingsCategory::UpdateSettings() + g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + } +- else if (strSetting.Equals("videoplayer.usevdpauinteroprgb")) ++ else if (strSetting.Equals("videoplayer.usevdpauinterop")) + { + bool hasInterop = false; + #ifdef GL_NV_vdpau_interop +@@ -591,7 +591,7 @@ void CGUIWindowSettingsCategory::UpdateSettings() + else + { + pControl->SetEnabled(false); +- g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); ++ g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); + } + } + else +-- +1.7.10 + + +From d0c23ddfad95612c47bcf9ce430b00a414b42912 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Thu, 30 Aug 2012 14:10:35 +0200 +Subject: [PATCH 02/10] backport some player and renderer changes + +--- + xbmc/cores/VideoRenderers/BaseRenderer.h | 3 + + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 31 +++---- + xbmc/cores/VideoRenderers/LinuxRendererGL.h | 2 + + xbmc/cores/VideoRenderers/RenderManager.cpp | 90 ++++++++------------ + xbmc/cores/VideoRenderers/RenderManager.h | 14 +-- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 12 +-- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 6 +- + xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 65 +++----------- + 8 files changed, 71 insertions(+), 152 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h +index af51852..0c2de2c 100644 +--- a/xbmc/cores/VideoRenderers/BaseRenderer.h ++++ b/xbmc/cores/VideoRenderers/BaseRenderer.h +@@ -67,6 +67,9 @@ class CBaseRenderer + virtual void Flush() {}; + + virtual unsigned int GetProcessorSize() { return 0; } ++ virtual unsigned int GetMaxProcessorSize() { return 0; } ++ virtual void SetProcessorSize(int numBuffers) { } ++ virtual void ReleaseBuffer(int idx) { } + + protected: + void ChooseBestResolution(float fps); +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +index 186ef2c..b0ad6e4 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +@@ -77,7 +77,6 @@ + using namespace Shaders; + + static const GLubyte stipple_weave[] = { +- 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, +@@ -110,6 +109,7 @@ + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, ++ 0x00, 0x00, 0x00, 0x00, + }; + + CLinuxRendererGL::YUVBUFFER::YUVBUFFER() +@@ -249,11 +249,6 @@ bool CLinuxRendererGL::ValidateRenderTarget() + + // function pointer for texture might change in + // call to LoadShaders +- for (int i = 0 ; i < m_NumYV12Buffers ; i++) +- (this->*m_textureDelete)(i); +- +- // function pointer for texture might change in +- // call to LoadShaders + glFinish(); + for (int i = 0 ; i < m_NumYV12Buffers ; i++) + (this->*m_textureDelete)(i); +@@ -633,8 +628,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + index = m_iYV12RenderBuffer; + } + } +- else +- m_iLastRenderBuffer = index; + + if (clear) + { +@@ -750,6 +743,8 @@ void CLinuxRendererGL::FlipPage(int source) + { + UnBindPbo(m_buffers[m_iYV12RenderBuffer]); + ++ m_iLastRenderBuffer = m_iYV12RenderBuffer; ++ + if( source >= 0 && source < m_NumYV12Buffers ) + m_iYV12RenderBuffer = source; + else +@@ -1147,7 +1142,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) + m_currentField = FIELD_FULL; + + // call texture load function ++ m_skipRender = false; + (this->*m_textureUpload)(renderBuffer); ++ if (m_skipRender) ++ return; + + if (m_renderMethod & RENDER_GLSL) + { +@@ -2332,16 +2330,13 @@ void CLinuxRendererGL::UploadVDPAUTexture(int index) + YUVFIELDS &fields = m_buffers[index].fields; + YUVPLANE &plane = fields[0][0]; + +- if (!vdpau) ++ if (!vdpau || !vdpau->valid) + { +- fields[0][1].id = plane.id; + m_eventTexturesDone[index]->Set(); +- CLog::Log(LOGWARNING,"--------- no vdpau texture, index: %d", index); ++ m_skipRender = true; + return; + } + +-// CLog::Log(LOGNOTICE,"-------- rendered output surf: %d", vdpau->sourceIdx); +-// CLog::Log(LOGNOTICE,"-------- pts: %f", vdpau->DVDPic.pts); + fields[0][1].id = vdpau->texture[0]; + + m_eventTexturesDone[index]->Set(); +@@ -2411,13 +2406,10 @@ void CLinuxRendererGL::UploadVDPAUTexture420(int index) + YUVFIELDS &fields = m_buffers[index].fields; + YUVPLANE &plane = fields[0][0]; + +- if (!vdpau) ++ if (!vdpau || !vdpau->valid) + { +- fields[1][0].id = plane.id; +- fields[1][1].id = plane.id; +- fields[2][0].id = plane.id; +- fields[2][1].id = plane.id; + m_eventTexturesDone[index]->Set(); ++ m_skipRender = true; + return; + } + +@@ -2479,7 +2471,6 @@ void CLinuxRendererGL::UploadVDPAUTexture420(int index) + #endif + } + +- + void CLinuxRendererGL::DeleteVAAPITexture(int index) + { + #ifdef HAVE_LIBVA +@@ -2610,7 +2601,7 @@ void CLinuxRendererGL::UploadVAAPITexture(int index) + || status == VA_STATUS_ERROR_INVALID_DISPLAY) + { + va.display->lost(true); +- for(int i = 0; i < NUM_BUFFERS; i++) ++ for(int i = 0; i < m_NumYV12Buffers; i++) + { + m_buffers[i].vaapi.display.reset(); + m_buffers[i].vaapi.surface.reset(); +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +index 9dfe679..4a8da39 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +@@ -145,6 +145,7 @@ class CLinuxRendererGL : public CBaseRenderer + virtual void Flush(); + virtual void ReleaseBuffer(int idx); + virtual void SetProcessorSize(int numBuffers) { m_NumYV12Buffers = numBuffers; } ++ virtual unsigned int GetMaxProcessorSize() { return NUM_BUFFERS; } + virtual unsigned int GetProcessorSize() { return m_NumYV12Buffers; } + + #ifdef HAVE_LIBVDPAU +@@ -328,6 +329,7 @@ class CLinuxRendererGL : public CBaseRenderer + bool m_nonLinStretch; + bool m_nonLinStretchGui; + float m_pixelRatio; ++ bool m_skipRender; + }; + + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index c94c699..95372e0 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -235,6 +235,13 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + return false; + } + ++ // check if decoder supports buffering ++ m_bCodecSupportsBuffering = false; ++ if (format == DVDVideoPicture::FMT_VDPAU ++ || format == DVDVideoPicture::FMT_VDPAU_420 ++ || format == DVDVideoPicture::FMT_XVBA) ++ m_bCodecSupportsBuffering = true; ++ + bool result = m_pRenderer->Configure(width, height, d_width, d_height, fps, flags, format); + if(result) + { +@@ -249,7 +256,7 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + m_bReconfigured = true; + m_presentstep = PRESENT_IDLE; + m_presentevent.Set(); +-// ResetRenderBuffer(); ++ ResetRenderBuffer(); + } + + return result; +@@ -294,8 +301,6 @@ void CXBMCRenderManager::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + } + } + +-// CLog::Log(LOGNOTICE,"------ current: %d", m_iCurrentRenderBuffer); +- + if (g_advancedSettings.m_videoDisableBackgroundDeinterlace) + { + CSharedLock lock(m_sharedSection); +@@ -334,17 +339,10 @@ unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) + + UpdateDisplayLatency(); + +- m_swapCount = 1; +-// std::string Vendor = g_Windowing.GetRenderVendor(); +-// std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); +-// if (Vendor.compare(0, 3, "ati") == 0) +-// { +-// m_swapCount = 2; +-// } +- ResetRenderBuffer(); + m_bUseBuffering = false; +- m_overlays.SetNumBuffers(m_iNumRenderBuffers); +- m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); ++ m_bCodecSupportsBuffering = true; ++ ResetRenderBuffer(); ++ + return m_pRenderer->PreInit(); + } + +@@ -680,8 +678,6 @@ void CXBMCRenderManager::Present() + WaitPresentTime(m_presenttime); + + m_presentevent.Set(); +- +- m_rendertime = CurrentHostCounter(); + } + + /* simple present method */ +@@ -915,9 +911,9 @@ bool CXBMCRenderManager::HasFreeBuffer() + return true; + } + +- int outputPlusSwap = (m_iOutputRenderBuffer + m_swapCount) % m_iNumRenderBuffers; ++ int outputPlus1 = (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers; + if ((m_iOutputRenderBuffer == m_iDisplayedRenderBuffer && !m_bAllRenderBuffersDisplayed) +- || outputPlusSwap == m_iCurrentRenderBuffer) ++ || outputPlus1 == m_iCurrentRenderBuffer) + return false; + else + return true; +@@ -925,15 +921,23 @@ bool CXBMCRenderManager::HasFreeBuffer() + + void CXBMCRenderManager::ResetRenderBuffer() + { +- m_iNumRenderBuffers = 5; ++ m_iNumRenderBuffers = m_pRenderer->GetMaxProcessorSize(); ++ m_iNumRenderBuffers = std::min(5, m_iNumRenderBuffers); ++ m_iNumRenderBuffers = std::max(2, m_iNumRenderBuffers); ++ ++ if (!m_bCodecSupportsBuffering) ++ m_iNumRenderBuffers = 2; ++ ++ CLog::Log(LOGNOTICE,"CXBMCRenderManager::ResetRenderBuffer - using %d render buffers", m_iNumRenderBuffers); ++ m_overlays.SetNumBuffers(m_iNumRenderBuffers); ++ m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); ++ + m_iCurrentRenderBuffer = 0; +- m_iFlipRequestRenderBuffer = 0; + m_iOutputRenderBuffer = 0; + m_iDisplayedRenderBuffer = 0; + m_bAllRenderBuffersDisplayed = true; + m_sleeptime = 1.0; + m_presentPts = DVD_NOPTS_VALUE; +-// m_bUseBuffering = true; + m_speed = 0; + } + +@@ -943,8 +947,8 @@ void CXBMCRenderManager::PrepareNextRender() + if (idx < 0) + { + if (m_speed >= DVD_PLAYSPEED_NORMAL && g_graphicsContext.IsFullScreenVideo()) +- CLog::Log(LOGNOTICE,"----------- no buffer, out: %d, current: %d, display: %d", +- m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); ++ CLog::Log(LOGDEBUG,"%s no buffer, out: %d, current: %d, display: %d", ++ __FUNCTION__, m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); + return; + } + +@@ -962,16 +966,6 @@ void CXBMCRenderManager::PrepareNextRender() + + m_sleeptime = presenttime - clocktime; + +-// double interval; +-// if (g_VideoReferenceClock.GetRefreshRate(&interval) > 0) +-// { +-// if (m_swaptime > interval * 0.7) +-// { +-// presenttime += interval; +-// CLog::Log(LOGDEBUG,"------------ very long swaptime"); +-// } +-// } +- + if (g_graphicsContext.IsFullScreenVideo() || presenttime <= clocktime+0.01) + { + m_presentPts = m_renderBuffers[idx].pts; +@@ -986,6 +980,10 @@ void CXBMCRenderManager::PrepareNextRender() + void CXBMCRenderManager::EnableBuffering(bool enable) + { + CRetakeLock lock(m_sharedSection); ++ ++ if (m_iNumRenderBuffers < 3) ++ return; ++ + m_bUseBuffering = enable; + if (!m_bUseBuffering) + m_iOutputRenderBuffer = m_iCurrentRenderBuffer; +@@ -1005,28 +1003,11 @@ void CXBMCRenderManager::NotifyDisplayFlip() + if (!m_pRenderer) + return; + +-// if (g_graphicsContext.IsFullScreenVideo()) +-// { +-// uint64_t diff = CurrentHostCounter() - m_rendertime; +-// m_swaptime = ((double)(diff))/CurrentHostFrequency(); +-// int waittime = (int)((diff*1000LL)/CurrentHostFrequency()); +-// if (waittime > 15) +-// { +-// CLog::Log(LOGNOTICE,"------------------ wait swap buffers: %f, sleep: %f", m_swaptime, m_sleeptime); +-// } +-// } ++ if (m_iNumRenderBuffers < 3) ++ return; + + int last = m_iDisplayedRenderBuffer; +- m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - m_swapCount) % m_iNumRenderBuffers; +- m_iFlipRequestRenderBuffer = m_iCurrentRenderBuffer; +- +-// // we have caught up with output so all buffers are re-usable +-// if (last != m_iDisplayedRenderBuffer +-// && m_iDisplayedRenderBuffer == m_iOutputRenderBuffer) +-// { +-// CLog::Log(LOGNOTICE,"-------------- all displayed"); +-// m_bAllRenderBuffersDisplayed = true; +-// } ++ m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - 1) % m_iNumRenderBuffers; + + if (last != m_iDisplayedRenderBuffer + && m_iDisplayedRenderBuffer != m_iCurrentRenderBuffer) +@@ -1044,7 +1025,10 @@ bool CXBMCRenderManager::GetStats(double &sleeptime, double &pts, int &bufferLev + CSharedLock lock(m_sharedSection); + sleeptime = m_sleeptime; + pts = m_presentPts; +- bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; ++ if (m_iNumRenderBuffers < 3) ++ bufferLevel = -1; ++ else ++ bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; + return true; + } + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h +index 24f9798..f1fde10 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.h ++++ b/xbmc/cores/VideoRenderers/RenderManager.h +@@ -43,7 +43,7 @@ + + namespace DXVA { class CProcessor; } + namespace VAAPI { class CSurfaceHolder; } +-namespace VDPAU { struct CVdpauRenderPicture; } ++namespace VDPAU { class CVdpauRenderPicture; } + struct DVDVideoPicture; + + #define ERRORBUFFSIZE 30 +@@ -242,23 +242,17 @@ class CXBMCRenderManager + // displayed or even rendered). + // Current: is the current buffer being or having been submitted for render to back buffer. + // Cannot go past "Output" buffer (else it would be rendering old output). +- // FlipRequest: is the render buffer that has last been submitted for render AND importantly has had +- // swap-buffer flip subsequently invoked (thus flip to front buffer is requested for vblank +- // subsequent to render completion). + // Displayed: is the buffer that is now considered to be safely copied from back buffer to front buffer + // (we assume that after two swap-buffer flips for the same "Current" render buffer that that + // buffer will be safe, but otherwise we consider that only the previous-to-"Current" is guaranteed). +- // Last: is the last buffer successfully submitted for render to back buffer (purpose: to rollback to in +- // unexpected case where a texture render fails). + + int m_iCurrentRenderBuffer; + int m_iNumRenderBuffers; +-// int m_iLastRenderBuffer; +- int m_iFlipRequestRenderBuffer; + int m_iOutputRenderBuffer; + int m_iDisplayedRenderBuffer; + bool m_bAllRenderBuffersDisplayed; + bool m_bUseBuffering; ++ bool m_bCodecSupportsBuffering; + int m_speed; + CEvent m_flipEvent; + +@@ -284,9 +278,7 @@ class CXBMCRenderManager + CEvent m_presentevent; + CEvent m_flushEvent; + CDVDClock *m_pClock; +- uint64_t m_rendertime; +- double m_swaptime; +- unsigned int m_swapCount; ++ + + OVERLAY::CRenderer m_overlays; + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index ce39866..3c2213e 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +@@ -660,7 +660,7 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) + m_skippedDeint = 0; + + m_requestSkipDeint = false; +- pDvdVideoPicture->iFlags |= m_codecControlState; ++ pDvdVideoPicture->iFlags |= m_codecControlFlags; + + if(!m_started) + pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; +@@ -882,13 +882,7 @@ unsigned CDVDVideoCodecFFmpeg::GetConvergeCount() + return 0; + } + +-void CDVDVideoCodecFFmpeg::SetSpeed(int speed) ++void CDVDVideoCodecFFmpeg::SetCodecControl(int flags) + { +- if (m_pHardware) +- m_pHardware->SetSpeed(speed); +-} +- +-void CDVDVideoCodecFFmpeg::SetCodecControl(int state) +-{ +- m_codecControlState = state; ++ m_codecControlFlags = flags; + } +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +index 9bd201a..6ea777d 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +@@ -45,7 +45,6 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + virtual int Check (AVCodecContext* avctx) = 0; + virtual void Reset () {} + virtual bool CanSkipDeint() {return false; } +- virtual void SetSpeed(int speed) {} + virtual const std::string Name() = 0; + virtual CCriticalSection* Section() { return NULL; } + }; +@@ -63,8 +62,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + virtual const char* GetName() { return m_name.c_str(); }; // m_name is never changed after open + virtual unsigned GetConvergeCount(); + virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) {pts=m_decoderPts; skippedDeint=m_skippedDeint; if (m_pFrame) interlaced = m_pFrame->interlaced_frame; return true;} +- virtual void SetSpeed(int speed); +- virtual void SetCodecControl(int state); ++ virtual void SetCodecControl(int flags); + + bool IsHardwareAllowed() { return !m_bSoftware; } + IHardwareDecoder * GetHardware() { return m_pHardware; }; +@@ -125,6 +123,6 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + double m_decoderPts, m_decoderInterval; + int m_skippedDeint; + bool m_requestSkipDeint; +- int m_codecControlState; ++ int m_codecControlFlags; + std::vector m_formats; + }; +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index 28dfea0..93e375b 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -453,9 +453,6 @@ void CDVDPlayerVideo::Process() + if(m_speed == DVD_PLAYSPEED_PAUSE) + m_iNrOfPicturesNotToSkip = 0; + m_droppingStats.Reset(); +-// g_renderManager.EnableBuffering(m_speed == DVD_PLAYSPEED_NORMAL); +- if (m_pVideoCodec) +- m_pVideoCodec->SetSpeed(m_speed); + } + else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED)) + { +@@ -502,10 +499,9 @@ void CDVDPlayerVideo::Process() + } + int codecControl = 0; + if (iDropDirective & EOS_BUFFER_LEVEL) +- { +- if (iDropDirective & EOS_BUFFER_LEVEL) +- codecControl |= DVP_FLAG_DRAIN; +- } ++ codecControl |= DVP_FLAG_DRAIN; ++ if (m_speed > DVD_PLAYSPEED_NORMAL) ++ codecControl |= DVP_FLAG_NO_POSTPROC; + m_pVideoCodec->SetCodecControl(codecControl); + if (iDropDirective & EOS_DROPPED) + { +@@ -567,15 +563,6 @@ void CDVDPlayerVideo::Process() + } + + m_videoStats.AddSampleBytes(pPacket->iSize); +- // assume decoder dropped a picture if it didn't give us any +- // picture from a demux packet, this should be reasonable +- // for libavformat as a demuxer as it normally packetizes +- // pictures when they come from demuxer +-// if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) +-// { +-// m_iDroppedFrames++; +-// iDropped++; +-// } + + bRequestDrop = false; + +@@ -636,7 +623,7 @@ void CDVDPlayerVideo::Process() + m_iNrOfPicturesNotToSkip--; + } + +- // validate picture timing, ++ // validate picture timing, + // if both dts/pts invalid, use pts calulated from picture.iDuration + // if pts invalid use dts, else use picture.pts as passed + if (picture.dts == DVD_NOPTS_VALUE && picture.pts == DVD_NOPTS_VALUE) +@@ -1213,39 +1200,6 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + m_FlipTimeStamp += max(0.0, iSleepTime); + m_FlipTimeStamp += iFrameDuration; + +-// if (iSleepTime <= 0 && m_speed) +-// m_iLateFrames++; +-// else +-// m_iLateFrames = 0; +-// +-// // ask decoder to drop frames next round, as we are very late +-// if(m_iLateFrames > 10) +-// { +-// if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) +-// { +-// //if we're calculating the framerate, +-// //don't drop frames until we've calculated a stable framerate +-// if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) +-// { +-// result |= EOS_VERYLATE; +-// m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it +-// } +-// +-// //if we requested 5 drops in a row and we're still late, drop on output +-// //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate +-// if (m_iDroppedRequest > 5) +-// { +-// m_iDroppedRequest--; //decrease so we only drop half the frames +-// return result | EOS_DROPPED; +-// } +-// m_iDroppedRequest++; +-// } +-// } +-// else +-// { +-// m_iDroppedRequest = 0; +-// } +- + if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) + || (pPicture->iFlags & DVP_FLAG_DROPPED)) + { +@@ -1648,15 +1602,18 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + // get decoder stats + if (!m_pVideoCodec->GetPts(iDecoderPts, iSkippedDeint, interlaced)) + iDecoderPts = pts; ++ if (iDecoderPts == DVD_NOPTS_VALUE) ++ iDecoderPts = pts; + + // get render stats + g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); + +- if (iBufferLevel < 2) ++ if (iBufferLevel < 0) ++ result |= EOS_BUFFER_LEVEL; ++ else if (iBufferLevel < 2) + { + result |= EOS_BUFFER_LEVEL; +- if (iBufferLevel < 1) +- CLog::Log(LOGDEBUG,"--------------------- hurry: %d", iBufferLevel); ++ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - hurry: %d", iBufferLevel); + } + + bNewFrame = iDecoderPts != m_droppingStats.m_lastDecoderPts; +@@ -1666,7 +1623,6 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + else + iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; + +- // add any gains regardless of being late + if (m_droppingStats.m_lastDecoderPts > 0 + && bNewFrame + && m_bAllowDrop +@@ -1734,7 +1690,6 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + { + m_droppingStats.m_dropRequests--; //decrease so we only drop half the frames + m_droppingStats.m_requestOutputDrop = true; +- CLog::Log(LOGNOTICE,"-------- drop output"); + } + else if (bNewFrame) + m_droppingStats.m_dropRequests++; +-- +1.7.10 + + +From f5a828fa3fb1f5cfd127cb1bab7bad9f11d70515 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:11:32 +0200 +Subject: [PATCH 03/10] backport some xvba changes + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 61 +++++++++++++++---------- + xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h | 3 -- + 2 files changed, 37 insertions(+), 27 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +index fa96284..127c958 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +@@ -21,6 +21,7 @@ + + #include "system.h" + #ifdef HAVE_LIBXVBA ++ + #include + #include + #include "XVBA.h" +@@ -460,7 +461,6 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned + m_xvbaBufferPool.data_buffer = 0; + m_xvbaBufferPool.iq_matrix_buffer = 0; + m_xvbaBufferPool.picture_descriptor_buffer = 0; +- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; + m_presentPicture = 0; + m_xvbaConfig.numRenderBuffers = surfaces; + m_decoderThread = CThread::GetCurrentThreadId(); +@@ -573,8 +573,6 @@ bool CDecoder::Supports(EINTERLACEMETHOD method) + + void CDecoder::ResetState() + { +- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; +- + m_displayState = XVBA_OPEN; + } + +@@ -730,6 +728,40 @@ bool CDecoder::CreateSession(AVCodecContext* avctx) + + void CDecoder::DestroySession() + { ++ // wait for unfinished decoding jobs ++ XbmcThreads::EndTime timer; ++ if (m_xvbaConfig.xvbaSession) ++ { ++ for (unsigned int i = 0; i < m_videoSurfaces.size(); ++i) ++ { ++ xvba_render_state *render = m_videoSurfaces[i]; ++ if (render->surface) ++ { ++ XVBA_Surface_Sync_Input syncInput; ++ XVBA_Surface_Sync_Output syncOutput; ++ syncInput.size = sizeof(syncInput); ++ syncInput.session = m_xvbaConfig.xvbaSession; ++ syncInput.surface = render->surface; ++ syncInput.query_status = XVBA_GET_SURFACE_STATUS; ++ syncOutput.size = sizeof(syncOutput); ++ timer.Set(1000); ++ while(!timer.IsTimePast()) ++ { ++ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) ++ { ++ CLog::Log(LOGERROR,"XVBA::DestroySession - failed sync surface"); ++ break; ++ } ++ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) ++ break; ++ Sleep(10); ++ } ++ if (timer.IsTimePast()) ++ CLog::Log(LOGERROR,"XVBA::DestroySession - unfinished decoding job"); ++ } ++ } ++ } ++ + m_xvbaOutput.Dispose(); + + XVBA_Destroy_Decode_Buffers_Input bufInput; +@@ -1052,7 +1084,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + { + CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; + CDecoder* xvba = (CDecoder*)ctx->GetHardware(); +- struct pictureAge* pA = &xvba->picAge; + + pic->data[0] = + pic->data[1] = +@@ -1133,20 +1164,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + + pic->data[0] = (uint8_t*)render; + +- if(pic->reference) +- { +- pic->age = pA->ip_age[0]; +- pA->ip_age[0]= pA->ip_age[1]+1; +- pA->ip_age[1]= 1; +- pA->b_age++; +- } +- else +- { +- pic->age = pA->b_age; +- pA->ip_age[0]++; +- pA->ip_age[1]++; +- pA->b_age = 1; +- } + pic->type= FF_BUFFER_TYPE_USER; + + render->state |= FF_XVBA_STATE_USED_FOR_REFERENCE; +@@ -1198,11 +1215,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) + m_bufferStats.IncDecoded(); + m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); + +- m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); +- if (m_codecControl & DVP_FLAG_SKIP_PROC) +- { +- m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); +- } ++ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_NO_POSTPROC); + } + + int retval = 0; +@@ -2328,7 +2341,7 @@ bool COutput::CreateGlxContext() + XFree(visuals); + + m_pixmap = XCreatePixmap(m_Display, +- DefaultRootWindow(m_Display), ++ m_Window, + 192, + 108, + visInfo.depth); +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +index 0abf972..24331e9 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +@@ -33,7 +33,6 @@ + #include "libavcodec/xvba.h" + #include "utils/ActorProtocol.h" + #include "settings/VideoSettings.h" +-#include + #include + #include + #include +@@ -372,8 +371,6 @@ class CDecoder : public CDVDVideoCodecFFmpeg::IHardwareDecoder, + }; + XVBABufferPool m_xvbaBufferPool; + +- pictureAge picAge; +- + COutput m_xvbaOutput; + CXvbaBufferStats m_bufferStats; + CEvent m_inMsgEvent; +-- +1.7.10 + + +From d608d480e4159b71e0dfd18f20ba27ecc226fa97 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:12:16 +0200 +Subject: [PATCH 04/10] player and renderer, squash me later + +--- + xbmc/cores/VideoRenderers/RenderManager.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index 95372e0..ac31c32 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -237,9 +237,9 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + + // check if decoder supports buffering + m_bCodecSupportsBuffering = false; +- if (format == DVDVideoPicture::FMT_VDPAU +- || format == DVDVideoPicture::FMT_VDPAU_420 +- || format == DVDVideoPicture::FMT_XVBA) ++ if ((flags & DVDVideoPicture::FMT_VDPAU) ++ || (flags & DVDVideoPicture::FMT_VDPAU_420) ++ || (flags & DVDVideoPicture::FMT_XVBA)) + m_bCodecSupportsBuffering = true; + + bool result = m_pRenderer->Configure(width, height, d_width, d_height, fps, flags, format); +-- +1.7.10 + + +From ca91233b8590a6061fe9b24c00ff62ecb96bc333 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:12:45 +0200 +Subject: [PATCH 05/10] ati, fix segfault on exit + +--- + xbmc/video/VideoReferenceClock.cpp | 12 ++++++++++++ + xbmc/video/VideoReferenceClock.h | 1 + + 2 files changed, 13 insertions(+) + +diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp +index 24c035b..d0f1ed7 100644 +--- a/xbmc/video/VideoReferenceClock.cpp ++++ b/xbmc/video/VideoReferenceClock.cpp +@@ -123,6 +123,18 @@ + #endif + } + ++CVideoReferenceClock::~CVideoReferenceClock() ++{ ++#if defined(HAS_GLX) ++ // some ATI voodoo, if we don't close the display, we crash on exit ++ if (m_Dpy) ++ { ++ XCloseDisplay(m_Dpy); ++ m_Dpy = NULL; ++ } ++#endif ++} ++ + void CVideoReferenceClock::Process() + { + bool SetupSuccess = false; +diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/video/VideoReferenceClock.h +index 966af37..742dc79 100644 +--- a/xbmc/video/VideoReferenceClock.h ++++ b/xbmc/video/VideoReferenceClock.h +@@ -59,6 +59,7 @@ class CVideoReferenceClock : public CThread + { + public: + CVideoReferenceClock(); ++ virtual ~CVideoReferenceClock(); + + int64_t GetTime(bool interpolated = true); + int64_t GetFrequency(); +-- +1.7.10 + + +From 5b5ce20c6902643e4f858a3ca45cefc3e4de05af Mon Sep 17 00:00:00 2001 +From: Joakim Plate +Date: Sat, 14 Jul 2012 21:00:13 +0200 +Subject: [PATCH 06/10] X11: re-evaluate vsync method after having modified + window + +It could have moved between outputs on different hardware +--- + xbmc/rendering/gl/RenderSystemGL.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/xbmc/rendering/gl/RenderSystemGL.cpp b/xbmc/rendering/gl/RenderSystemGL.cpp +index be7dfea..bd8e91b 100644 +--- a/xbmc/rendering/gl/RenderSystemGL.cpp ++++ b/xbmc/rendering/gl/RenderSystemGL.cpp +@@ -174,6 +174,7 @@ bool CRenderSystemGL::ResetRenderSystem(int width, int height, bool fullScreen, + { + m_width = width; + m_height = height; ++ m_bVsyncInit = false; + + glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); + +-- +1.7.10 + + +From c0409779940d74993669788ce0b01d257508a581 Mon Sep 17 00:00:00 2001 +From: Joakim Plate +Date: Sun, 8 Jul 2012 01:06:05 +0200 +Subject: [PATCH 07/10] [tinyxml] invalid reading of xml from FILE pointers + +buf is not a null terminated string, so don't rely on it +--- + xbmc/utils/XBMCTinyXML.cpp | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/xbmc/utils/XBMCTinyXML.cpp b/xbmc/utils/XBMCTinyXML.cpp +index 82e2451..707653c 100644 +--- a/xbmc/utils/XBMCTinyXML.cpp ++++ b/xbmc/utils/XBMCTinyXML.cpp +@@ -91,12 +91,9 @@ bool CXBMCTinyXML::LoadFile(FILE *f, TiXmlEncoding encoding) + { + CStdString data(""); + char buf[BUFFER_SIZE]; +- int result, count = 0; ++ int result; + while ((result = fread(buf, 1, BUFFER_SIZE, f)) > 0) +- { +- data.reserve(BUFFER_SIZE * (++count)); +- data.append(buf); +- } ++ data.append(buf, result); + return Parse(data, NULL, encoding) != NULL; + } + +-- +1.7.10 + + +From aa661e7bd39591141fbab27a4d427db622fa3dbb Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 2 Sep 2012 10:33:08 +0200 +Subject: [PATCH 08/10] dvdplayer audio: improve a/v when using skip/dupe + method, duration of packets may be too long for + proper sync + +--- + xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +index 9f2128c..0e4adaa 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +@@ -719,7 +719,7 @@ void CDVDPlayerAudio::HandleSyncError(double duration) + + //check if measured error for 1 second + now = CurrentHostCounter(); +- if ((now - m_errortime) >= m_freq) ++ if ((now - m_errortime) >= m_freq * 2) + { + m_errortime = now; + m_error = m_errorbuff / m_errorcount; +@@ -759,9 +759,21 @@ void CDVDPlayerAudio::HandleSyncError(double duration) + { + //check how many packets to skip/duplicate + m_skipdupcount = (int)(m_error / duration); +- //if less than one frame off, see if it's more than two thirds of a frame, so we can get better in sync +- if (m_skipdupcount == 0 && fabs(m_error) > duration / 3 * 2) +- m_skipdupcount = (int)(m_error / (duration / 3 * 2)); ++ ++ if (m_skipdupcount == 0) ++ { ++ double delay; ++ if (m_error < 0) ++ { ++ m_skipdupcount -= 1; ++ delay = ((double)DVD_TIME_TO_MSEC(duration + m_error)) / 1000; ++ } ++ else ++ { ++ delay = ((double)DVD_TIME_TO_MSEC(m_error)) / 1000; ++ } ++ m_dvdAudio.AddSilence(delay); ++ } + + if (m_skipdupcount > 0) + CLog::Log(LOGDEBUG, "CDVDPlayerAudio:: Duplicating %i packet(s) of %.2f ms duration", +-- +1.7.10 + + +From 68b93215319f4ad4d0ee72797f82214ff8490379 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 2 Sep 2012 16:05:21 +0200 +Subject: [PATCH 09/10] video player: present correct pts to user for a/v sync + +--- + xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 57 ++++++++++++++++++++++--------- + xbmc/cores/dvdplayer/DVDPlayerVideo.h | 2 +- + 2 files changed, 42 insertions(+), 17 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index 93e375b..7e39690 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -1183,22 +1183,22 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + iSleepTime = iFrameSleep; + else + iSleepTime = iFrameSleep + (iClockSleep - iFrameSleep) / m_autosync; +- +-#ifdef PROFILE /* during profiling, try to play as fast as possible */ +- iSleepTime = 0; +-#endif +- +- // present the current pts of this frame to user, and include the actual +- // presentation delay, to allow him to adjust for it +- if( m_stalled ) +- m_iCurrentPts = DVD_NOPTS_VALUE; +- else +- m_iCurrentPts = pts - max(0.0, iSleepTime); +- +- // timestamp when we think next picture should be displayed based on current duration +- m_FlipTimeStamp = iCurrentClock; +- m_FlipTimeStamp += max(0.0, iSleepTime); +- m_FlipTimeStamp += iFrameDuration; ++// ++//#ifdef PROFILE /* during profiling, try to play as fast as possible */ ++// iSleepTime = 0; ++//#endif ++// ++// // present the current pts of this frame to user, and include the actual ++// // presentation delay, to allow him to adjust for it ++// if( m_stalled ) ++// m_iCurrentPts = DVD_NOPTS_VALUE; ++// else ++// m_iCurrentPts = pts - max(0.0, iSleepTime); ++// ++// // timestamp when we think next picture should be displayed based on current duration ++// m_FlipTimeStamp = iCurrentClock; ++// m_FlipTimeStamp += max(0.0, iSleepTime); ++// m_FlipTimeStamp += iFrameDuration; + + if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) + || (pPicture->iFlags & DVP_FLAG_DROPPED)) +@@ -1505,6 +1505,22 @@ void CDVDPlayerVideo::ResetFrameRateCalc() + g_advancedSettings.m_videoFpsDetect == 0; + } + ++double CDVDPlayerVideo::GetCurrentPts() ++{ ++ double iSleepTime, iRenderPts; ++ int iBufferLevel; ++ ++ // get render stats ++ g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); ++ ++ if( m_stalled ) ++ iRenderPts = DVD_NOPTS_VALUE; ++ else ++ iRenderPts = iRenderPts - max(0.0, iSleepTime); ++ ++ return iRenderPts; ++} ++ + #define MAXFRAMERATEDIFF 0.01 + #define MAXFRAMESERR 1000 + +@@ -1623,6 +1639,15 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + else + iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; + ++ ++ m_FlipTimeStamp = m_pClock->GetAbsoluteClock() + max(0.0, iSleepTime) + iInterval; ++ ++ if( m_stalled ) ++ m_iCurrentPts = DVD_NOPTS_VALUE; ++ else ++ m_iCurrentPts = iRenderPts - max(0.0, iSleepTime); ++ ++ + if (m_droppingStats.m_lastDecoderPts > 0 + && bNewFrame + && m_bAllowDrop +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h +index a0322dc..6fff15c 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h +@@ -106,7 +106,7 @@ class CDVDPlayerVideo : public CThread + + bool InitializedOutputDevice(); + +- double GetCurrentPts() { return m_iCurrentPts; } ++ double GetCurrentPts(); + int GetPullupCorrection() { return m_pullupCorrection.GetPatternLength(); } + + double GetOutputDelay(); /* returns the expected delay, from that a packet is put in queue */ +-- +1.7.10 + + +From b38863d14fb42fe86d0e53d9d34d84e1b9eb6907 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Tue, 4 Sep 2012 08:55:36 +0200 +Subject: [PATCH 10/10] vdpau: disable interop yuv and studio level + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 10 +++++----- + xbmc/settings/GUISettings.cpp | 4 ++-- + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index 16edf55..04ad61d 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -366,7 +366,7 @@ bool CDecoder::Supports(EINTERLACEMETHOD method) + || method == VS_INTERLACEMETHOD_AUTO) + return true; + +- if (g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) ++ if (0) //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) + { + if (method == VS_INTERLACEMETHOD_RENDER_BOB) + return true; +@@ -1697,7 +1697,7 @@ void CMixer::SetColor() + //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); + + VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; +- if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) ++ if (0) //g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) + { + float studioCSC[3][4]; + GenerateStudioCSCMatrix(colorStandard, studioCSC); +@@ -1846,7 +1846,7 @@ void CMixer::SetDeinterlacing() + + SetDeintSkipChroma(); + +- m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); ++ m_config.useInteropYuv = false; //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); + } + + void CMixer::SetDeintSkipChroma() +@@ -2038,7 +2038,7 @@ void CMixer::Init() + m_vdpError = false; + + m_config.upscale = g_advancedSettings.m_videoVDPAUScaling; +- m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); ++ m_config.useInteropYuv = false; //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); + + CreateVdpauMixer(); + } +@@ -3215,7 +3215,7 @@ bool COutput::GLInit() + { + m_config.usePixmaps = true; + g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); +- g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); ++// g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + if (!glXBindTexImageEXT) + glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 2d79423..e29c8c1 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -598,7 +598,7 @@ void CGUISettings::Initialize() + #ifdef HAVE_LIBVDPAU + AddBool(vp, "videoplayer.usevdpau", 13425, true); + AddBool(vp, "videoplayer.usevdpauinterop", 13433, true); +- AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); ++// AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); + #endif + #ifdef HAVE_LIBVA + AddBool(vp, "videoplayer.usevaapi", 13426, true); +@@ -672,7 +672,7 @@ void CGUISettings::Initialize() + AddSeparator(vp, "videoplayer.sep1.5"); + #ifdef HAVE_LIBVDPAU + AddBool(NULL, "videoplayer.vdpauUpscalingLevel", 13121, false); +- AddBool(vp, "videoplayer.vdpaustudiolevel", 13122, false); ++// AddBool(vp, "videoplayer.vdpaustudiolevel", 13122, false); + #endif + #endif + AddSeparator(vp, "videoplayer.sep5"); +-- +1.7.10 + diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-1c5ca99-981-toggleButtonState.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-981-toggleButtonState.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-990-wiimote.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-990-wiimote.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-990-wiimote.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-990-wiimote.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999-crosscompile.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-999-crosscompile.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.003-rar-PR1147.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.003-rar-PR1147.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.003-rar-PR1147.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.003-rar-PR1147.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.011-airtunes_reapply_lost_fix.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.011-airtunes_reapply_lost_fix.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.011-airtunes_reapply_lost_fix.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.011-airtunes_reapply_lost_fix.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.021-libnfs-1.3_support.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.021-libnfs-1.3_support.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.021-libnfs-1.3_support.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.021-libnfs-1.3_support.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.055-search-dialogs-workaround.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.055-search-dialogs-workaround.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.055-search-dialogs-workaround.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.055-search-dialogs-workaround.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.056-remove-broken-scrapers.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.056-remove-broken-scrapers.patch new file mode 100644 index 0000000000..ab26872ab7 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.056-remove-broken-scrapers.patch @@ -0,0 +1,7338 @@ +From f8ef1ccfc32335af2608236dba4fd85084a94fee Mon Sep 17 00:00:00 2001 +From: Martijn Kaijser +Date: Sun, 8 Jul 2012 12:49:57 +0200 +Subject: [PATCH 1/4] remove broken scrapers + +--- + addons/metadata.albums.allmusic.com/addon.xml | 82 -------------------- + addons/metadata.albums.allmusic.com/allmusic.xml | 44 ----------- + addons/metadata.albums.allmusic.com/icon.png | Bin 12584 -> 0 bytes + .../resources/language/Bulgarian/strings.xml | 5 -- + .../language/Chinese (Simple)/strings.xml | 5 -- + .../resources/language/Dutch/strings.xml | 5 -- + .../resources/language/English/strings.xml | 5 -- + .../resources/language/Finnish/strings.xml | 5 -- + .../resources/language/French/strings.xml | 5 -- + .../resources/language/German/strings.xml | 5 -- + .../resources/language/Hungarian/strings.xml | 5 -- + .../resources/language/Korean/strings.xml | 5 -- + .../resources/language/Polish/strings.xml | 5 -- + .../resources/language/Portuguese/strings.xml | 5 -- + .../resources/language/Russian/strings.xml | 5 -- + .../resources/language/Spanish/strings.xml | 5 -- + .../resources/language/Swedish/strings.xml | 10 --- + .../resources/settings.xml | 5 -- + addons/metadata.artists.allmusic.com/addon.xml | 81 ------------------- + addons/metadata.artists.allmusic.com/allmusic.xml | 68 ---------------- + addons/metadata.artists.allmusic.com/icon.png | Bin 12584 -> 0 bytes + .../resources/language/Bulgarian/strings.xml | 7 -- + .../language/Chinese (Simple)/strings.xml | 7 -- + .../resources/language/Dutch/strings.xml | 7 -- + .../resources/language/English/strings.xml | 7 -- + .../resources/language/Finnish/strings.xml | 7 -- + .../resources/language/French/strings.xml | 7 -- + .../resources/language/German/strings.xml | 7 -- + .../resources/language/Hungarian/strings.xml | 7 -- + .../resources/language/Korean/strings.xml | 7 -- + .../resources/language/Polish/strings.xml | 7 -- + .../resources/language/Portuguese/strings.xml | 7 -- + .../resources/language/Russian/strings.xml | 7 -- + .../resources/language/Spanish/strings.xml | 7 -- + .../resources/language/Swedish/strings.xml | 12 --- + .../resources/settings.xml | 7 -- + addons/metadata.yahoomusic.com/addon.xml | 30 ------- + addons/metadata.yahoomusic.com/icon.png | Bin 17271 -> 0 bytes + .../resources/language/Dutch/strings.xml | 5 -- + .../resources/language/English/strings.xml | 5 -- + .../resources/language/Finnish/strings.xml | 5 -- + .../resources/language/Hungarian/strings.xml | 5 -- + .../resources/language/Korean/strings.xml | 5 -- + .../resources/language/Polish/strings.xml | 5 -- + .../resources/language/Portuguese/strings.xml | 5 -- + .../resources/language/Swedish/strings.xml | 9 --- + .../metadata.yahoomusic.com/resources/settings.xml | 4 - + addons/metadata.yahoomusic.com/yahoomusic.xml | 42 ---------- + 48 files changed, 585 deletions(-) + delete mode 100644 addons/metadata.albums.allmusic.com/addon.xml + delete mode 100644 addons/metadata.albums.allmusic.com/allmusic.xml + delete mode 100644 addons/metadata.albums.allmusic.com/icon.png + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/English/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/French/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/German/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml + delete mode 100644 addons/metadata.albums.allmusic.com/resources/settings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/addon.xml + delete mode 100644 addons/metadata.artists.allmusic.com/allmusic.xml + delete mode 100644 addons/metadata.artists.allmusic.com/icon.png + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/English/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/French/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/German/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml + delete mode 100644 addons/metadata.artists.allmusic.com/resources/settings.xml + delete mode 100644 addons/metadata.yahoomusic.com/addon.xml + delete mode 100644 addons/metadata.yahoomusic.com/icon.png + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Dutch/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/English/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml + delete mode 100644 addons/metadata.yahoomusic.com/resources/settings.xml + delete mode 100644 addons/metadata.yahoomusic.com/yahoomusic.xml + +diff --git a/addons/metadata.albums.allmusic.com/addon.xml b/addons/metadata.albums.allmusic.com/addon.xml +deleted file mode 100644 +index dea6306..0000000 +--- a/addons/metadata.albums.allmusic.com/addon.xml ++++ /dev/null +@@ -1,82 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° албуми от AllMusic.com +- AllMusic album information +- Alben Scraper für AllMusic.com +- Scraper de Ãlbums de AllMusic +- Scraper d'albums musicaux AllMusic +- AllMusic.com -albumitietojen lataaja +- AllMusic.com album információk +- AllMusic-albuminfo +- Informacje o albumach z AllMusic +- Scraper de músicas AllMusic +- Catalog AllMusic pentru informaÈ›ii albume +- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± альбоме из AllMusic +- AllMusic albuminformation +- AllMusic音ä¹ä¸“è¾‘ä¿¡æ¯ +- Попълнете метаинформациÑта в библиотеката Ñи от AllMusic.com. +-УебÑайтът allmusic.com е Ñъздаден през 19995, като мÑÑто за ÑтраÑтни музикални фенове. +-РедакторÑкиÑÑ‚ колектив AMG заедно ÑÑŠÑ Ñтотици екÑперти (и малко фанатици на тема allmusic.com) Ñа направили Ñайта един от най-подробните (и най-чеÑто ползваните) източници на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° музикална тема. Ð’Ñички те Ñа Ñе поÑветили на Ñъздаването и поддържането на базата от данни, на разпроÑтранÑването на Ñъдържание от AMG, което Ñе очаква от любителите на музика и профеÑионалиÑти в Ð¼ÑƒÐ·Ð¸ÐºÐ°Ð»Ð½Ð¸Ñ Ð¾Ñ‚Ñ€Ð°Ñъл. +-ЗаÑегнати Ñа вÑички жанрове и Ñтилове музика. От най-комерÑиалните и популÑрни до най-невъзприетите. Критиката към артиÑти и албуми Ñе прави в контекÑта на Ñъответните им жанрове - от опера до гаражен рок. Така Ñе оÑигури актуална Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° почитателите на вÑеки Ñтил, за любимите им артиÑти и Ñе предÑтавÑÑ‚ нови творби. +- Use AllMusic.com to fill your library metadata information. +-The allmusic website was created in 1995 as a place for music fans to indulge their passion. +-The AMG editorial staff, along with hundreds of expert contributors (all music fanatics in their own right), has made allmusic the most comprehensive music reference source on the planet. They are all dedicated to creating and maintaining the knowledgeable, spirited content that music lovers and industry professionals have come to expect from AMG. +-All genres and styles of music are covered here, ranging from the most commercially popular to the most obscure. We critique albums and artists within the context of their own genres - from opera to garage rock to traditional country. This ensures that fans of any style of music can depend on us to keep them up-to-date with their favorite artists as well as introduce them to new sounds. +- Benutze den AllMusic.com-Scraper um deine Musik-Bibliothek mit Metadaten zu füllen. +-AllMusic.com wurde 1995 gegründet, um Musikliebhabern einen Platz zu geben, Ihre Leidenschaft auszuleben. +-Die AMG Redaktion, zusammen mit hunderten Experten (alles Fachmänner auf Ihrem Gebiet) als Beitragende, machte AllMusic.com zur umfangreichsten Quelle für Musikinformationen auf dem Planeten. Sie sind alle engagiert, um den lebhaften Inhalt, welcher von Musikliebhabern und der Musikindustrie von AMG erwartet wird, zu Erstellen und Pflegen. +-Alle Genres und Stile der Musik werden hier abgedeckt, reichend von Mainstream bis zum Underground. Wir schreiben Kritiken zu Alben, im Kontext zu dem passenden Genre - von Oper über Garagen Rock bis hin zu traditioneller Country Musik. Das garantiert Fans jeglicher Musikrichtung, dass sie sich auf uns verlassen können, weil wir sie immer up-to-date über Ihre Liblingskünstler halten und Ihnen auch neue Sounds vorstellen +- Este scraper utiliza Allmusic.com para rellenar la información de la librería musical. +-La página web allmusic fue creada en el 1995 cómo un sitio donde los fans podíaan compartir su pasión por la música. +-El equipo de AMG, junto con cuentos de colaboradores expertos (todos ellos fans de la música) han hecho de allmusic uno de los sitios más extensos del planeta. Todos ellos intentan crear y mantener unos contenidos que los amantes de la música y los profesionales del sector obtienen de AMG. +-Todos los géneros y estilos musicales tienen cabida, desde los más comerciales hasta los más oscuros. En allmusic se critican los álbumes y los artistas en el entorno que les corresponde - desde opera, pasando por rock hasta country tradicional. Así se asegura que los fans de cualquier estilo de música puedan depender de nosotros para mantenerse al día de las novedades de sus artistas favoritos y descubrir nuevos sonidos. +- Käytä AllMusic.com -sivustoa täyttämään kirjastosi metatiedot. +-AllMusic.com -sivusto luotiin vuonna 1995 paikaksi, jossa musiikkifanit voivat tyydyttää intohimonsa musiikkiin. +-AMG-toimituksen henkilökunta, satojen asiansa tuntevien lahjoittajien kanssa (kaikki musiikkifanaatikot), ovat tehneet AllMusic.com -sivustosta koko planeetan kattavimman musiikkitietolähteen. He ovat kaikki sitoutuneita luomaan ja ylläpitämään asioista perillä olevaa henkevää sisältöä, jota musiikista pitävät ja musiikkialan ammattilaiset odottavat AMG:ltä. +-Kaikki musiikin lajityypit ja tyylisuunnat ovat edustettuina täällä, vaihdellen kaupallisesti suosituimmista kaikista huomaamattomimpiin. Me arvostelemme albumit ja esittäjät heidän oman lajityyppinsä sisällä - oopperasta ja autotallirokista aina perinteiseen country-musiikkiin. Tämä varmistaa, että minkä tahansa tyylisuunnan fanit voivat luottaa, että samalla kun pidämme heidät ajan tasalla heidän lempiartististansa, niin esittelemme myös heille uusia äänimaailmoita. +- Utiliser AllMusic.com pour la récupération des méta-données. +-Le site web AllMusic a été créé en 1995 afin que les fans de musique puissent assouvir leur passion. +-L'équipe rédactionnelle d'AMG, forte de ses centaines de contributeurs avisés (tous passionnés de musique à part entière), a fait de AllMusic la source de référence la plus complète de toute la planète. Chacun s'investissant dans la construction et la maintenance d'un contenu aussi passionné et judicieux que tout amoureux de musique ou tout professionnel de l'industrie serait en droit d'attendre d'AMG. +-Tous les styles et tous les genres y sont représentés, allant du plus commercial au plus confidentiel. Nous critiquons albums et artistes dans le cadre de leur propre style - de l'opéra à la country traditionnelle en passant par le rock garage. Pour les fans de chaque style musical, c'est l'assurance que nous les tenons informés sur leurs artistes préférés ou à l'apprentissage de nouvelles sonorités. +- Az AllMusic.com használata a médiatáradatok feltöltésére. Ez a webhely 1995-ben a zenerajongók szenvedélyének kiszolgálására jött létre. +-Az AMG szerkesztÅ‘i csapata a szakértÅ‘ közreműködÅ‘kkel együtt (mind zenei fanatikus a maga nemében), az allmusic-ot a legátfogóbb zenei információforrássá tették a világon. +-Minden létezÅ‘ stílus és zenei irányzat feldolgozásra kerül itt. Kezdve a legpopulárisabbtól a legismeretlenebbig. Mi kritikát mondunk a lemezekrÅ‘l és elÅ‘adókról, az operától a garázs rock-on át a hagyományos country zenéig. Ez biztosítja, hogy bármely stílus rajongói napra készek legyenek a kedvenc elÅ‘adóikkal, ugyanakkor az új hangzások is eljussanak hozzájuk. +- AllMusic.com gebruiken om de metadata van uw collectie op te halen. +-De AllMusic-website werd in 1995 opgericht om muziekfans een online thuis te bieden. +-De AMG-redactie heeft van AllMusic het meest complete muzieknaslagwerk gemaakt op deze planeet, mede dankzij de bijdragen van honderden experts. Het is hun missie om de hoogstaande inhoud te blijven aanbieden die muziekliefhebbers en professionals ondertussen van AMG verwachten. +-Alle genres en stijlen - of het nu de meest commerciële of de meest obscure zijn - krijgen hier een plaatsje. We bespreken albums en artiesten in de context van hun eigen genre, van opera over garagerock tot traditionele country. Hierdoor kunnen fans van elke muziekstijl bij ons terecht voor de laatste informatie over hun favoriete artiesten, of om nieuwe muziek te leren ontdekken. +- Używa AllMusic.com do pobierania informacji o albumach z Twojej muzycznej biblioteki. +- Use o AllMusic.com para obter a informação da sua Biblioteca de música. O site allmusic foi criado em 1995 para alimentar a paixão dos fans de música. +-O pessoal da redacção da AMG, em conjunto com centenas de especialistas (todos fanáticos por música à sua maneira), tornaram o allmusic o mais completo site de referência musical do planeta. Continuam dedicados a criar e manter o conhecimento, espírito e conteúdos que fans de música e profissionais da indústria se habituaram a obter da AMG. +-Todos os géneros e estilos de música podem ser encontrados aqui, desde o mais comercial e popular até à música mais rara. Nós revemos e criticamos álbuns e artistas dentro do contexto do seu género - the ópera a rock de garagem, de pop a música country. Isto assegura que fans de qualquer género podem depender de nós para os manter actualizados sobre os seus artistas favoritos bem como de novos sons. +- FolosiÈ›i AllMusic.com ca sursă pentru mediateca dumneavoastră. +-Site-ul allmusic a fost creat în 1995 ca un loc unde iubitorii de muzică să se răsfeÈ›e. Echipa editorială AMG, împreună cu sute de contribuitori experÈ›i (niÈ™te fanatici după muzică în felul lor), au făcut allmusic cea mai cuprinzătoare sursă de referinÈ›e muzicale de pe planetă. ToÈ›i sunt dedicaÈ›i să creeze È™i să întreÈ›ină conÈ›inutul pe care iubitorii de muzică È™i profesioniÈ™tii din industrie îl aÈ™teaptă de la AMG. +-Toate genurile È™i stilurile de muzică sunt incluse aici, începând de la cele mai populare către cele mai obscure. Noi criticăm albumele È™i artiÈ™tii în contextul genurilor proprii. ToÈ›i fanii oricărui stil de muzică pot conta pe noi să îi È›inem la curent cu artiÈ™tii lor favoriÈ›i, dar È™i să le prezentăm noi cântece. +- ИÑпользуйте AllMusic.com Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð°-данных в вашу библиотеку. +-Сайт allmusic был Ñоздан в 1995 как меÑто Ð´Ð»Ñ Ñ„Ð°Ð½Ð°Ñ‚Ð¾Ð² музыки, где они могли бы удовлетворÑть Ñвою ÑтраÑть. +-РедакторÑкий ÑоÑтав AMG, вмеÑте Ñ ÑотнÑми учаÑтников-ÑкÑпертов (каждый по-Ñвоему фанат музыки), Ñделали allmusic Ñамым полным иÑточником информации о музыке на планете. Ð’Ñе они поÑвÑтили ÑÐµÐ±Ñ Ñозданию и поддержке полезного, и познавательного, контента который любители музыки, и профеÑÑионалы индуÑтрии, ожидают от AMG. +-ЗдеÑÑŒ предÑтавлены вÑе Ñтили и жанры музыки, от Ñамых коммерчеÑки популÑрных до наиболее неизвеÑтных. Мы критикуем альбомы и иÑполнителей в контекÑте их ÑобÑтвенного жанра - от оперы и гаражного рока до традиционного кантри. Это обеÑпечивает то, что фанат любого ÑÑ‚Ð¸Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸ может полагатьÑÑ Ð½Ð° Ð½Ð°Ñ Ð² поддержке актуальноÑти Ñвоих познаний о любимом иÑполнителе и также раÑширÑть Ñвои знаниÑ. +- LÃ¥t AllMusic.com fylla dina mappar med metadatainformation. +-AllMusic's webbplats skapades 1995 som en plats för musikälskare där de kunde njuta av sin passion. +-AMG's redaktion har tillsammans med hundratals experter och bidragsgivare, alla musikfanatiker pÃ¥ sina egna sätt, gjort AllMusic till den mest omfattande källan inom musikreferens pÃ¥ den här planeten. De är alla kunniga och engagerade med att skapa och upprätthÃ¥lla ett innehÃ¥ll pÃ¥ webbplatsen, som musikälskare och branschfolk förväntar sig av AMG. +-Alla genrer och stilar av musik behandlas här, allt frÃ¥n det mest kommersiellt populära till det mest suspekta. De kritiserar album och artister inom ramen för sina egna genrer, allt frÃ¥n opera, garagerock till traditionell countrymusik. Detta säkerställer att alla fans oavsett musikstil kan lita pÃ¥ dem och hÃ¥lla sig uppdaterade med sina favoritartister och bli introducerade till nya ljud. +- 从AllMusic.com网站获å–音ä¹èµ„料。 +-allmusic网站创建于1995年,它是音ä¹çˆ±å¥½è€…çš„ä¹å›­ã€‚ +-AMG的编辑和许多专业撰稿人(都是音ä¹ç‹‚热分å­ï¼‰å…±åŒæŠŠallmusic建æˆä¸–界上最全é¢çš„音ä¹èµ„料库。他们致力于创造和维护音ä¹çˆ±å¥½è€…和业内专业人士期望从AMG得到的知识和精神产å“。 +-è¿™é‡Œæ¶µç›–äº†æ‰€æœ‰çš„éŸ³ä¹æµæ´¾å’Œé£Žæ ¼ï¼Œè¯„价从最æµè¡Œåˆ°æ™¦æ¶©å’Œå†·é—¨çš„音ä¹ï¼Œè®¨è®ºä¸åŒé£Žæ ¼çš„专辑和艺术家 - 从歌剧到摇滚ä¹åˆ°ä¼ ç»Ÿçš„乡æ‘音ä¹ã€‚力求让所有音ä¹çˆ±å¥½è€…都能在这里了解他所喜爱的艺术家最新动æ€ï¼Œå¹¶ä¸ºä»–ä»¬ä»‹ç»æ–°çš„音ä¹ã€‚ +- all +- +- +diff --git a/addons/metadata.albums.allmusic.com/allmusic.xml b/addons/metadata.albums.allmusic.com/allmusic.xml +deleted file mode 100644 +index 1e86b27..0000000 +--- a/addons/metadata.albums.allmusic.com/allmusic.xml ++++ /dev/null +@@ -1,44 +0,0 @@ +- +- +- +- +- (allmusic.com/album/.*) +- +- +- +- +- +- +- +- +- +- +- <td class="text-center">[^<]*<a href.*?www.allmusic.com/album/([^"]*)">([^<]*).*?<td>([^<]*)</td>.*?<td>.*?<td>([^<]*) +- +- +- <td class="text-center">[^<]*</td>.*?www.allmusic.com/album/([^"]*)">([^<]*).*?<td>([^<]*)</td>.*?<td>.*?<td>([^<]*) +- +- +- +- +- +- +- +- <h1 class="title">([^<]*)</h1> +- +- +- <a href="http://www.allmusic.com/album/([^"]*)">Overview< +- +- +- <meta name="title" content="([^-]*)- ([^<]*)" /> +- +- +- <a href="http://www.allmusic.com/album/([^"]*)">Overview< +- +- +- <a href="http://www.allmusic.com/album/([^"]*)">Overview< +- +- +- +- +- +diff --git a/addons/metadata.albums.allmusic.com/icon.png b/addons/metadata.albums.allmusic.com/icon.png +deleted file mode 100644 +index 9c18e20111f1fed8e64c953057274b43c58fbeef..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 12584 +zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F +z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f +zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b +z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ +z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ +zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz +zAi082_V3b^XI=KgANV6LL +zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP +zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF +zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw +z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR +z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys +z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D +z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH +zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn +z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( +z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH +zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa +zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB +zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA +zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 +z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK +z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) +zyB`c7|3N6k5q$CQ(PFSer%%D@ +z7n +z-kTkp%$zLDfMujXoC8blcRTkeY8Lvt`)Pg-`SS6ap6T8mbong$P#+a9KNAQP5)J}gKLEcwAdoi?2()Vs +z0*PdTKxD3|W_=1E5VMxDoV2#@{C=*H8|7@)*29uLs5i11zdbFLH6>Napq5iOm1&^b +zTfxe8U-ff*nL{c}MKcW+&aqK3_jTy!h%U|D#{q2`BE6Zk==Lw|8-@e5sqXu|KS+dY +zOWq1<*7x4#(n>u+aYq}ING?(W1tGUm;;ihEWmHU|p(Vf{Aj{Wd305C?|NQPF&z#$v +zE~SV%H%*8PS&C7V`{?fdE0-E#gD#61zrQBQY5x-jA{;lmvxJo_c4 +zv{3>fY?cy6IlasR75rIMiux97(2Ss(2&VO?Mz$Eg9-ov>l1?%fB9I_czMspC7%a4g +z2|DXU|5ny%R>uY^=!{ZUZYHQeN6y7A0}eW50y=OPR}~!kJX!{=v4L`Pa%dafMLf1? +z4vuX^M?{;_43ip6>L*`gfYv~is!Q9IE~RLJ*UQS6n_G~&cuutbAY=%d7=-=@jF{z2 +zl}qF~CPGvcy1{{6vc^YOV)kE;{{V~%zl*eaN(hXXE|{8JKFb6{I^Yq99PDcj{NN5c +z2pBE=?W4?^irRS!P%Hv&2s2=su_Ln#7>8bv4x&67mTZ<$E2GmlKRD=WtrwaMDeZNI +z<47w3N*Om>c`&8#+ur==gUUfOeO(^ys%KabrxQW|UO`qE*(VYQokvrxiPJMkpb$#B +zU=#Y_r)vNZH6`0la)2?**1b}L>M4s-S_J=v0_7|#3J_QdV1{16wUUF}5_lnxCPP+L +zJa;q!1Wxmk6qW)?ftJ!v59M~1#YZTJgL=Os4%1kB +z#NUC8Mh3iL^Z#ki>;BKZfD(&>Yl9wo38zjY;kf(RtK +z;Pvb{sX&NNcgavSx$r)$B4TUz@3nj2B`stc8>wU(mPo<1h67O$R*)I&ul0_<}aV*Us~;nTXf<*KE}mkkx*-L;$9 +zm?}URd`8Sb6JT~81pE|{?^4VRa0?WYm(d^RkXa(wFeM1_DC_kSWnVZfUHz%R?oSgl +z=;k-0tEqfAO5WBRQt!4U-|LMGI(^RC{F50YR|`Ks3aSB;dn1Ybft{%`cle#34ESZ7 +z_=BiGT?8aSjW%r82qF8JejJ1|X;HDPV=W9WNBf)07 +z@t4DIITun)_G=fMR)o|hxBfZ_3aT<|6Ok9$BL~ +zIjY_|yb}8)OW+q8SKnj*dS#dpEL^IA3(HVuj$7#0Hz+OhVbo*X6yd@AQ=su-oNE}q +zzkWJAFYnRO3o&T|iOW|J!1g?L*Z}vmst!8$64gp>DTuw>SL-5yqM`usqp#`(1#pXe +zEWY@~j!vZ_8@kH||3)Q6O$#BgmL61ZK>{5M<%AG2D710cEEFn@RACO9eMFvM3ajMD +z4o@-jJlV@7*JcnY@y=i!CjJx|`|GP}t&ZWvaj1*(Y6+jgXA%FmT2MVlVh8jHK_b}R +zr)I5N3ja;iXRN6?80!r(2V)_4vS@8xu^$5hxAFJGN^Ccupl6?V;Vee<#FW>>U!CLI +zQ$tZ5UL+k~t>sm4NS|Dj)PRE}IWCZ)?@{eU`{Dx1MP^ +z33OJ}5txQbHD46*5CY#*EJKB3W3Fgz_DCmzHk}sQPM4;mEP)D2m>&L6VM)v{e0#2p +zWkc<5a^Lu;VUgS|LdvS5wR4=cb5xz~-!VxiBel+{hA6BCZ9NA!PK}O=fvrMQ$hykU +zz$UqCF{{B%kHHNJp~Udc)9?CMaS8IQdUshWs9IWD%|1sorDbIV*r)`ta>;6CDGR1_ +zHb3;un-*5zw@uE>ME(3JfsKP>@c_SHJG~zL*sLW@l5>KhOHZ)>$vKhttg)e+nRv@E +z+>t8Ct_$h)0jz9p&<|oac3m2`kS~YN6dv(rBWV9ZDQoKPL;f+ +z664h1q5p|VB6Gd3$@V)}dG&zdvDeBarM2Xk47o#3jCbB&<#PEhj@6=c5F0A8=b$!K +z!j>SZ1FI1=b0y{fCT>tS!!06a1o4+tXwydNAoo* +zO7?89u~xmI`fAg|zc(%qf*?B20nvE;AZobTzIn(BHv@{spJp^Vk09hji){r%n+ +z&n>sr?x(K=1!vo@kjyRmrxLr*$usWnYyDg)K~&?V%F5hP;~S0K%!|P +zN;*60d25!mc62p#-WJoBR`dYhPC*tD_bumyKI~rvMHKT+(#r;k3wZ`gY2InYOMg%s +zvGNvYzZPZEd?#n=K7xj%GEzKbE3a4iJlcO@lH~ZHq&$!&<3XU&CXl_lMl$HxC|C6E +zAXP#iZ_D?vmJObwr{meYx@QY4niLVmIhh8APscsC9ZrfMO+-u15`88p(h2suvUKh6 +zn?0qnDUuyGU;;d9KgE@}JC+UH5?$^}QWqkBlerB3> +zZmdqec%}CjKXLs#VVpUW7m-yRSj^iWUE)&r)t#k3O@7h`h7|3~068mn;}+hilR5eJ +z<3H;wCAw-7+Z?~DI_r-E=g1-9we)1;o<-g)n(qSr_h>dh$=Y;~4tb%bVR2*{>q{$E +z;@Kq~Mh~p}vEs+erz0IxH8E+EXh>#_t&H_jF>iiK8QqXyMy}wPa#~3c{MY#qwD-b0R}C(jAo-@$(+)b^PXXUb?mEv8>Uw0CP(x0%5{Hsoe1+;MSc2My$Lt9W{@ +zR_}$4`{ih389&paZ}03#^N=s@Z0R|mfQ}b@mLsQaduAbU?*l>~e;>Awjgh<~s0^7n +z)sC5E|ws +zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA +z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u +zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU +z#|~thGoUPelc>KIkDF&G +zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o +zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb +z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y +zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD +zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp +z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 +zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` +z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN +zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha +zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi +zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o +z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq +z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg +z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW +zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH +z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! +z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A +zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ +zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* +zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l +zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ +zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e +zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE +zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x +z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw +zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh +zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 +zrx|`}gDZVX6{jd)H4o +zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP +zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI +zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge +zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs +z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? +z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 +z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> +z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 +ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG +z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S +zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o +zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 +z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) +zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X +z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i +zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI +z7PKqr&+>B8QSiepK1yNOlk +zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< +zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 +z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| +z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ +zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q +z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d +z4cSeAh+BD?v-)h3awd +zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c +z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( +z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh +zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V +z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU +z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq +zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} +zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU +zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? +zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z +zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R +zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw +zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- +zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I +zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY +z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl +z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb +z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n +zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr +zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< + +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml +deleted file mode 100644 +index 7b03b74..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Вземи Ñнимки за албум от Allmusic.com +- Вземи Ñнимки за албум от Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml +deleted file mode 100644 +index 6b0eca4..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- 从Allmusic.com获å–专辑图片 +- 从Last.fm获å–专辑图片 +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml +deleted file mode 100644 +index 556ea1c..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Allmusic.com gebruiken voor albumminiaturen +- Last.fm gebruiken voor albumminiaturen +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml +deleted file mode 100644 +index 661ec19..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Grab album thumbs from Allmusic.com +- Grab album thumbs from Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml +deleted file mode 100644 +index 75d3ef6..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Hae albumin kuvakkeet osoitteesta Allmusic.com +- Hae albumin kuvakkeet osoitteesta Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml +deleted file mode 100644 +index 93bda6f..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Récupérer les pochettes album depuis Allmusic.com +- Récupérer les pochettes album depuis Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml +deleted file mode 100644 +index d418c1f..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Ziehe Alben Cover von Allmusic.com +- Ziehe Alben Cover von Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml +deleted file mode 100644 +index 5038141..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Album bélyegkép letöltése az Allmusic.com-ról +- Album bélyegkép letöltése a Last.fm-rÅ‘l +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml +deleted file mode 100644 +index a5202b8..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Allmusic.com ì—서 앨범 사진 가져오기 +- Last.fm ì—서 앨범 사진 가져오기 +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml +deleted file mode 100644 +index d521f48..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Pobierz miniatury albumów z Allmusic.com +- Pobierz miniatury albumów z Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml +deleted file mode 100644 +index 2b2b603..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Descarregar miniaturas do álbum de Allmusic.com +- Descarregar miniaturas do álbum de Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml +deleted file mode 100644 +index 6f34cd6..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Получать миниатюры альбомов Ñ Allmusic.com +- Получать миниатюры альбомов Ñ Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml +deleted file mode 100644 +index 16b217f..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- Descargar imágenes de Allmusic.com +- Descargar imágenes de Last.fm +- +diff --git a/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml +deleted file mode 100644 +index 3804ab1..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml ++++ /dev/null +@@ -1,10 +0,0 @@ +- +- +- +- +- +- +- +- Hämta albumminiatyr frÃ¥n Allmusic.com +- Hämta albumminiatyr frÃ¥n Last.fm +- +\ No newline at end of file +diff --git a/addons/metadata.albums.allmusic.com/resources/settings.xml b/addons/metadata.albums.allmusic.com/resources/settings.xml +deleted file mode 100644 +index 3071c6d..0000000 +--- a/addons/metadata.albums.allmusic.com/resources/settings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- +- +diff --git a/addons/metadata.artists.allmusic.com/addon.xml b/addons/metadata.artists.allmusic.com/addon.xml +deleted file mode 100644 +index 41e7af2..0000000 +--- a/addons/metadata.artists.allmusic.com/addon.xml ++++ /dev/null +@@ -1,81 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- Инф. за артиÑти от AllMusic + Ñнимки на артиÑти от HTBackdrops +- AllMusic artist information + HTBackdrops artist images +- Scraper für Künstler-Informationen von AllMusic.com +- Descarga información de Artistas de AllMusic +- AllMusic.com -esittäjätietojen ja HTBackdrops-esittäjäkuvien lataaja +- Scraper d'artistes musicaux AllMusic +- AllMusic elÅ‘adó információk +- AllMusic-artiestinfo +- Informacje o artystach AllMusic +- Scraper de músicas AllMusic +- Catalog AllMusic pentru informaÈ›ii artiÈ™ti +- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑполнителе из AllMusic +- AllMusic artistinformation + HTBackdrops artistbilder +- AllMusicè‰ºæœ¯å®¶ä¿¡æ¯ +- Попълнете метаинформациÑта в библиотеката Ñи от AllMusic.com +-УебÑайтът allmusic.com е Ñъздаден през 19995, като мÑÑто за ÑтраÑтни музикални фенове. ЗаÑегнати Ñа вÑички жанрове и Ñтилове музика. От най-комерÑиалните и популÑрни до най-невъзприетите. Критиката към артиÑти и албуми Ñе прави в контекÑта на Ñъответните им жанрове - от опера до гаражен рок. +-Home Theater Backdrops (HTBackdrops.com) предÑтавлÑва база от данни Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð²Ð¸Ð¶Ð²Ð°Ð½Ð° от общноÑтта около уебÑайта. Съдържа виÑококачеÑтвени изображениÑта на артиÑти под формата на миниатюри и fanarts. Ð’Ñички те Ñа Ñъздадени или произхождат от общноÑтта. МолÑ, обмиÑлете възможноÑтта да качите Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° любимите ви артиÑти. +- Use AllMusic.com to fill your libray metadata information. +-The allmusic website was created in 1995 as a place for music fans to indulge their passion. All genres and styles of music are covered here, ranging from the most commercially popular to the most obscure. We critique albums and artists within the context of their own genres - from opera to garage rock to traditional country. +- +-Home Theater Backdrops (HTBackdrops.com) is a community driven image database for high quality artist images like thumbs and fanarts. All images have been created or sourced by its members. Please consider uploading your own images of your favorite musician. +- Benutze den AllMusic.com-Scraper um deine Musik-Bibliothek mit Metadaten zu füllen. +-AllMusic.com wurde 1995 gegründet, um Musikliebhabern einen Platz zu geben, Ihre Leidenschaft auszuleben. +-Die AMG Redaktion, zusammen mit hunderten Experten (alles Fachmänner auf Ihrem Gebiet) als Beitragende, machte AllMusic.com zur umfangreichsten Quelle für Musikinformationen auf dem Planeten. Sie sind alle engagiert, um den lebhaften Inhalt, welcher von Musikliebhabern und der Musikindustrie von AMG erwartet wird, zu Erstellen und Pflegen. +-Alle Genres und Stile der Musik werden hier abgedeckt, reichend von Mainstream bis zum Underground. Wir schreiben Kritiken zu Alben, im Kontext zu dem passenden Genre - von Oper über Garagen Rock bis hin zu traditioneller Country Musik. Das garantiert Fans jeglicher Musikrichtung, dass sie sich auf uns verlassen können, weil wir sie immer up-to-date über Ihre Liblingskünstler halten und Ihnen auch neue Sounds vorstellen +- Este scraper utiliza Allmusic.com para rellenar la información de la librería musical. +-La página web allmusic fue creada en el 1995 cómo un sitio donde los fans podíaan compartir su pasión por la música. +-El equipo de AMG, junto con cuentos de colaboradores expertos (todos ellos fans de la música) han hecho de allmusic uno de los sitios más extensos del planeta. Todos ellos intentan crear y mantener unos contenidos que los amantes de la música y los profesionales del sector obtienen de AMG. +-Todos los géneros y estilos musicales tienen cabida, desde los más comerciales hasta los más oscuros. En allmusic se critican los álbumes y los artistas en el entorno que les corresponde - desde opera, pasando por rock hasta country tradicional. Así se asegura que los fans de cualquier estilo de música puedan depender de nosotros para mantenerse al día de las novedades de sus artistas favoritos y descubrir nuevos sonidos. +- Käytä AllMusic.com -sivustoa täyttämään kirjastosi metatiedot. +-AllMusic.com -sivusto luotiin vuonna 1995 paikaksi, jossa musiikkifanit voivat tyydyttää intohimonsa musiikkiin. Kaikki musiikin lajityypit ja tyylisuunnat ovat edustettuina täällä, vaihdellen kaupallisesti suosituimmista kaikkein huomaamattomimpiin. Me arvostelemme albumit ja esittäjät heidän oman lajityyppinsä sisällä - oopperasta ja autotallirokista aina perinteiseen country-musiikkiin. +-HTBackdrops.com -sivusto on yhteisön ylläpitämä tietokanta korkealaatuisille esittäjä- ja fanitaidekuville. Sivuston jäsenet ovat luoneet kaikki sivuston kuvat. Lähetä meille itse tekemäsi suosikkiartistiesi kuvat, jotta voimme lisätä ne tietokantaan. +- Utiliser AllMusic.com pour la récupération des méta-données. +-Le site web AllMusic a été créé en 1995 afin que les fans de musique puissent assouvir leur passion. +-L'équipe rédactionnelle d'AMG, forte de ses centaines de contributeurs avisés (tous passionnés de musique à part entière), a fait de AllMusic la source de référence la plus complète de toute la planète. Chacun s'investissant dans la construction et la maintenance d'un contenu aussi passionné et judicieux que tout amoureux de musique ou tout professionnel de l'industrie serait en droit d'attendre d'AMG. +-Tous les styles et tous les genres y sont représentés, allant du plus commercial au plus confidentiel. Nous critiquons albums et artistes dans le cadre de leur propre style - de l'opéra à la country traditionnelle en passant par le rock garage. Pour les fans de chaque style musical, c'est l'assurance que nous les tenons informés sur leurs artistes préférés ou à l'apprentissage de nouvelles sonorités. +- Az AllMusic.com használata a médiatáradatok feltöltésére. Ez a webhely 1995-ben a zenerajongók szenvedélyének kiszolgálására jött létre. +-Az AMG szerkesztÅ‘i csapata a szakértÅ‘ közreműködÅ‘kkel együtt (mind zenei fanatikus a maga nemében), az allmusic-ot a legátfogóbb zenei információforrássá tették a világon. +-Minden létezÅ‘ stílus és zenei irányzat feldolgozásra kerül itt. Kezdve a legpopulárisabbtól a legismeretlenebbig. Mi kritikát mondunk a lemezekrÅ‘l és elÅ‘adókról, az operától a garázs rock-on át a hagyományos country zenéig. Ez biztosítja, hogy bármely stílus rajongói napra készek legyenek a kedvenc elÅ‘adóikkal, ugyanakkor az új hangzások is eljussanak hozzájuk. +- AllMusic.com gebruiken om de metadata van uw collectie op te halen. +-De AllMusic-website werd in 1995 opgericht om muziekfans een online thuis te bieden. +-De AMG-redactie heeft van AllMusic het meest complete muzieknaslagwerk gemaakt op deze planeet, mede dankzij de bijdragen van honderden experts. Het is hun missie om de hoogstaande inhoud te blijven aanbieden die muziekliefhebbers en professionals ondertussen van AMG verwachten. +-Alle genres en stijlen - of het nu de meest commerciële of de meest obscure zijn - krijgen hier een plaatsje. We bespreken albums en artiesten in de context van hun eigen genre, van opera over garagerock tot traditionele country. Hierdoor kunnen fans van elke muziekstijl bij ons terecht voor de laatste informatie over hun favoriete artiesten, of om nieuwe muziek te leren ontdekken. +- Używa AllMusic.com do pobierania informacji o zawartoÅ›ci Twojej muzycznej biblioteki. +- Use o AllMusic.com para obter a informação da sua Biblioteca de música. O site allmusic foi criado em 1995 para alimentar a paixão dos fans de música. +-O pessoal da redacção da AMG, em conjunto com centenas de especialistas (todos fanáticos por música à sua maneira), tornaram o allmusic o mais completo site de referência musical do planeta. Continuam dedicados a criar e manter o conhecimento, espírito e conteúdos que fans de música e profissionais da indústria se habituaram a obter da AMG. +-Todos os géneros e estilos de música podem ser encontrados aqui, desde o mais comercial e popular até à música mais rara. Nós revemos e criticamos álbuns e artistas dentro do contexto do seu género - the ópera a rock de garagem, de pop a música country. Isto assegura que fans de qualquer género podem depender de nós para os manter actualizados sobre os seus artistas favoritos bem como de novos sons. +- FolosiÈ›i AllMusic.com ca sursă pentru mediateca dumneavoastră. +-Site-ul allmusic a fost creat în 1995 ca un loc unde iubitorii de muzică să se răsfeÈ›e. Toate genurile È™i stilurile de muzică sunt incluse aici, începând de la cele mai populare către cele mai obscure. Noi criticăm albumele È™i artiÈ™tii în contextul genurilor proprii. +- +-Home Theater Backdrops (HTBackdrops.com) este o bază de date de imagini realizată de comunitate pentru imagini de înaltă calitate ale artiÈ™tiilor, cum ar fi miniaturi È™i imagini realizate de fani (fanarts). Toate imaginile au fost create sau au ca sursă membrii ei. Vă rugăm să luaÈ›i în considerare că puteÈ›i încărca propriile imagini cu muzicianul preferat. +- ИÑпользуйте AllMusic.com Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð°-данных в вашу библиотеку. +-Сайт allmusic был Ñоздан в 1995 как меÑто Ð´Ð»Ñ Ñ„Ð°Ð½Ð°Ñ‚Ð¾Ð² музыки, где они могли бы удовлетворÑть Ñвою ÑтраÑть. +-РедакторÑкий ÑоÑтав AMG, вмеÑте Ñ ÑотнÑми учаÑтников-ÑкÑпертов (каждый по-Ñвоему фанат музыки), Ñделали allmusic Ñамым полным иÑточником информации о музыке на планете. Ð’Ñе они поÑвÑтили ÑÐµÐ±Ñ Ñозданию и поддержке полезного, и познавательного, контента который любители музыки, и профеÑÑионалы индуÑтрии, ожидают от AMG. +-ЗдеÑÑŒ предÑтавлены вÑе Ñтили и жанры музыки, от Ñамых коммерчеÑки популÑрных до наиболее неизвеÑтных. Мы критикуем альбомы и иÑполнителей в контекÑте их ÑобÑтвенного жанра - от оперы и гаражного рока до традиционного кантри. Это обеÑпечивает то, что фанат любого ÑÑ‚Ð¸Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸ может полагатьÑÑ Ð½Ð° Ð½Ð°Ñ Ð² поддержке актуальноÑти Ñвоих познаний о любимом иÑполнителе и также раÑширÑть Ñвои знаниÑ. +- LÃ¥t AllMusic.com fylla dina mappar med metadatainformation. +-AllMusic's webbplats skapades 1995 som en plats för musikälskare där de kunde njuta av sin passion. Alla genrer och stilar av musik behandlas här, allt frÃ¥n det mest kommersiellt populära till det mest suspekta. De kritiserar album och artister inom ramen för sina egna genrer, allt frÃ¥n opera, garagerock till traditionell countrymusik. +- +-Home Theater Backdrops (HTBackdrops.com) är en gemenskapsdriven bilddatabas för högkvalitativa miniatyrer och fanart pÃ¥ artister. Alla bilder har skapats eller bidragits frÃ¥n medlemmarna. Överväg att ladda upp dina egna bilder av dina favoritartister. +- 从AllMusic.com网站获å–音ä¹èµ„料。 +-allmusic网站创建于1995年,它是音ä¹çˆ±å¥½è€…çš„ä¹å›­ã€‚ +-AMG的编辑和许多专业撰稿人(都是音ä¹ç‹‚热分å­ï¼‰å…±åŒæŠŠallmusic建æˆä¸–界上最全é¢çš„音ä¹èµ„料库。他们致力于创造和维护音ä¹çˆ±å¥½è€…和业内专业人士期望从AMG得到的知识和精神产å“。 +-è¿™é‡Œæ¶µç›–äº†æ‰€æœ‰çš„éŸ³ä¹æµæ´¾å’Œé£Žæ ¼ï¼Œè¯„价从最æµè¡Œåˆ°æ™¦æ¶©å’Œå†·é—¨çš„音ä¹ï¼Œè®¨è®ºä¸åŒé£Žæ ¼çš„专辑和艺术家 - 从歌剧到摇滚ä¹åˆ°ä¼ ç»Ÿçš„乡æ‘音ä¹ã€‚力求让所有音ä¹çˆ±å¥½è€…都能在这里了解他所喜爱的艺术家最新动æ€ï¼Œå¹¶ä¸ºä»–ä»¬ä»‹ç»æ–°çš„音ä¹ã€‚ +- all +- +- +diff --git a/addons/metadata.artists.allmusic.com/allmusic.xml b/addons/metadata.artists.allmusic.com/allmusic.xml +deleted file mode 100644 +index 7ea01cc..0000000 +--- a/addons/metadata.artists.allmusic.com/allmusic.xml ++++ /dev/null +@@ -1,68 +0,0 @@ +- +- +- +- +- (allmusic.com/artist/.*) +- +- +- +- +- +- +- +- +- +- +- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/credits" +- +- +- (.+) +- +- +- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/biography" +- +- +- (.+) +- +- +- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/discography" +- +- +- (.+) +- +- +- <td><a href="http://www.allmusic.com/artist/([^"]*)">([^<]*)</a></td>[^>]*>([^<]*)</td>[^>]*>([^<]*)</td> +- +- +- +- +- +- +- +- <meta name="title" content="([^"]*) +- +- +- http://www.allmusic.com/artist/([^&"/]*)/ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/addons/metadata.artists.allmusic.com/icon.png b/addons/metadata.artists.allmusic.com/icon.png +deleted file mode 100644 +index 9c18e20111f1fed8e64c953057274b43c58fbeef..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 12584 +zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F +z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f +zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b +z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ +z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ +zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz +zAi082_V3b^XI=KgANV6LL +zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP +zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF +zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw +z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR +z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys +z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D +z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH +zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn +z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( +z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH +zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa +zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB +zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA +zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 +z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK +z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) +zyB`c7|3N6k5q$CQ(PFSer%%D@ +z7n +z-kTkp%$zLDfMujXoC8blcRTkeY8Lvt`)Pg-`SS6ap6T8mbong$P#+a9KNAQP5)J}gKLEcwAdoi?2()Vs +z0*PdTKxD3|W_=1E5VMxDoV2#@{C=*H8|7@)*29uLs5i11zdbFLH6>Napq5iOm1&^b +zTfxe8U-ff*nL{c}MKcW+&aqK3_jTy!h%U|D#{q2`BE6Zk==Lw|8-@e5sqXu|KS+dY +zOWq1<*7x4#(n>u+aYq}ING?(W1tGUm;;ihEWmHU|p(Vf{Aj{Wd305C?|NQPF&z#$v +zE~SV%H%*8PS&C7V`{?fdE0-E#gD#61zrQBQY5x-jA{;lmvxJo_c4 +zv{3>fY?cy6IlasR75rIMiux97(2Ss(2&VO?Mz$Eg9-ov>l1?%fB9I_czMspC7%a4g +z2|DXU|5ny%R>uY^=!{ZUZYHQeN6y7A0}eW50y=OPR}~!kJX!{=v4L`Pa%dafMLf1? +z4vuX^M?{;_43ip6>L*`gfYv~is!Q9IE~RLJ*UQS6n_G~&cuutbAY=%d7=-=@jF{z2 +zl}qF~CPGvcy1{{6vc^YOV)kE;{{V~%zl*eaN(hXXE|{8JKFb6{I^Yq99PDcj{NN5c +z2pBE=?W4?^irRS!P%Hv&2s2=su_Ln#7>8bv4x&67mTZ<$E2GmlKRD=WtrwaMDeZNI +z<47w3N*Om>c`&8#+ur==gUUfOeO(^ys%KabrxQW|UO`qE*(VYQokvrxiPJMkpb$#B +zU=#Y_r)vNZH6`0la)2?**1b}L>M4s-S_J=v0_7|#3J_QdV1{16wUUF}5_lnxCPP+L +zJa;q!1Wxmk6qW)?ftJ!v59M~1#YZTJgL=Os4%1kB +z#NUC8Mh3iL^Z#ki>;BKZfD(&>Yl9wo38zjY;kf(RtK +z;Pvb{sX&NNcgavSx$r)$B4TUz@3nj2B`stc8>wU(mPo<1h67O$R*)I&ul0_<}aV*Us~;nTXf<*KE}mkkx*-L;$9 +zm?}URd`8Sb6JT~81pE|{?^4VRa0?WYm(d^RkXa(wFeM1_DC_kSWnVZfUHz%R?oSgl +z=;k-0tEqfAO5WBRQt!4U-|LMGI(^RC{F50YR|`Ks3aSB;dn1Ybft{%`cle#34ESZ7 +z_=BiGT?8aSjW%r82qF8JejJ1|X;HDPV=W9WNBf)07 +z@t4DIITun)_G=fMR)o|hxBfZ_3aT<|6Ok9$BL~ +zIjY_|yb}8)OW+q8SKnj*dS#dpEL^IA3(HVuj$7#0Hz+OhVbo*X6yd@AQ=su-oNE}q +zzkWJAFYnRO3o&T|iOW|J!1g?L*Z}vmst!8$64gp>DTuw>SL-5yqM`usqp#`(1#pXe +zEWY@~j!vZ_8@kH||3)Q6O$#BgmL61ZK>{5M<%AG2D710cEEFn@RACO9eMFvM3ajMD +z4o@-jJlV@7*JcnY@y=i!CjJx|`|GP}t&ZWvaj1*(Y6+jgXA%FmT2MVlVh8jHK_b}R +zr)I5N3ja;iXRN6?80!r(2V)_4vS@8xu^$5hxAFJGN^Ccupl6?V;Vee<#FW>>U!CLI +zQ$tZ5UL+k~t>sm4NS|Dj)PRE}IWCZ)?@{eU`{Dx1MP^ +z33OJ}5txQbHD46*5CY#*EJKB3W3Fgz_DCmzHk}sQPM4;mEP)D2m>&L6VM)v{e0#2p +zWkc<5a^Lu;VUgS|LdvS5wR4=cb5xz~-!VxiBel+{hA6BCZ9NA!PK}O=fvrMQ$hykU +zz$UqCF{{B%kHHNJp~Udc)9?CMaS8IQdUshWs9IWD%|1sorDbIV*r)`ta>;6CDGR1_ +zHb3;un-*5zw@uE>ME(3JfsKP>@c_SHJG~zL*sLW@l5>KhOHZ)>$vKhttg)e+nRv@E +z+>t8Ct_$h)0jz9p&<|oac3m2`kS~YN6dv(rBWV9ZDQoKPL;f+ +z664h1q5p|VB6Gd3$@V)}dG&zdvDeBarM2Xk47o#3jCbB&<#PEhj@6=c5F0A8=b$!K +z!j>SZ1FI1=b0y{fCT>tS!!06a1o4+tXwydNAoo* +zO7?89u~xmI`fAg|zc(%qf*?B20nvE;AZobTzIn(BHv@{spJp^Vk09hji){r%n+ +z&n>sr?x(K=1!vo@kjyRmrxLr*$usWnYyDg)K~&?V%F5hP;~S0K%!|P +zN;*60d25!mc62p#-WJoBR`dYhPC*tD_bumyKI~rvMHKT+(#r;k3wZ`gY2InYOMg%s +zvGNvYzZPZEd?#n=K7xj%GEzKbE3a4iJlcO@lH~ZHq&$!&<3XU&CXl_lMl$HxC|C6E +zAXP#iZ_D?vmJObwr{meYx@QY4niLVmIhh8APscsC9ZrfMO+-u15`88p(h2suvUKh6 +zn?0qnDUuyGU;;d9KgE@}JC+UH5?$^}QWqkBlerB3> +zZmdqec%}CjKXLs#VVpUW7m-yRSj^iWUE)&r)t#k3O@7h`h7|3~068mn;}+hilR5eJ +z<3H;wCAw-7+Z?~DI_r-E=g1-9we)1;o<-g)n(qSr_h>dh$=Y;~4tb%bVR2*{>q{$E +z;@Kq~Mh~p}vEs+erz0IxH8E+EXh>#_t&H_jF>iiK8QqXyMy}wPa#~3c{MY#qwD-b0R}C(jAo-@$(+)b^PXXUb?mEv8>Uw0CP(x0%5{Hsoe1+;MSc2My$Lt9W{@ +zR_}$4`{ih389&paZ}03#^N=s@Z0R|mfQ}b@mLsQaduAbU?*l>~e;>Awjgh<~s0^7n +z)sC5E|ws +zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA +z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u +zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU +z#|~thGoUPelc>KIkDF&G +zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o +zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb +z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y +zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD +zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp +z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 +zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` +z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN +zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha +zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi +zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o +z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq +z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg +z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW +zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH +z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! +z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A +zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ +zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* +zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l +zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ +zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e +zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE +zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x +z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw +zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh +zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 +zrx|`}gDZVX6{jd)H4o +zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP +zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI +zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge +zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs +z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? +z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 +z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> +z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 +ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG +z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S +zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o +zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 +z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) +zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X +z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i +zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI +z7PKqr&+>B8QSiepK1yNOlk +zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< +zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 +z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| +z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ +zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q +z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d +z4cSeAh+BD?v-)h3awd +zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c +z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( +z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh +zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V +z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU +z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq +zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} +zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU +zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? +zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z +zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R +zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw +zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- +zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I +zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY +z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl +z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb +z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n +zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr +zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< + +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml +deleted file mode 100644 +index ebedf10..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Включи поÑтер +- Вземи Ñнимки за албум от Allmusic.com +- Вземи Ñнимки за албум от Last.fm +- Вземи Ñнимки за албум от HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml +deleted file mode 100644 +index 0dae926..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- å¯ç”¨åŒäººç”» +- 从Allmusic.com获å–艺人图片 +- 从Last.fm获å–艺人图片 +- 从HTBackdrops获å–艺人图片 +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml +deleted file mode 100644 +index 19ece63..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Fanart inschakelen +- Allmusic.com gebruiken voor artiestminiaturen +- Last.fm gebruiken voor artiestminiaturen +- HTBackdrops gebruiken voor artiestminiaturen +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml +deleted file mode 100644 +index 7534b41..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Download Fanarts from HTBackdrops.com +- Grab artist thumbs from Allmusic.com +- Grab artist thumbs from Last.fm +- Grab artist thumbs from HTBackdrops.com +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml +deleted file mode 100644 +index ae4ff3c..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Fanitaide käytössä +- Hae esittäjän kuvakkeet osoitteesta Allmusic.com +- Hae esittäjän kuvakkeet osoitteesta Last.fm +- Hae esittäjän kuvakkeet osoitteesta HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml +deleted file mode 100644 +index 27f6352..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Activer les Fanarts +- Récupérer les images artistes depuis Allmusic.com +- Récupérer les images artistes depuis Last.fm +- Récupérer les images artistes depuis HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml +deleted file mode 100644 +index 9e44c44..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Aktiviere Fanart +- Ziehe Bilder des Künstler von Allmusic.com +- Ziehe Bilder des Künstler von Last.fm +- Ziehe Bilder des Künstler von HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml +deleted file mode 100644 +index 3502108..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Fanartképek letöltése a HTBackdrops.com-ról +- ElÅ‘adó bélyegkép letöltése az Allmusic.com-ról +- ElÅ‘adó bélyegkép letöltése a Last.fm-rÅ‘l +- ElÅ‘adó bélyegkép letöltése a HTBackdrops.com-ról +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml +deleted file mode 100644 +index e62f7b7..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- 팬아트 가져오기 +- Allmusic.com ì—서 ìŒì•…ê°€ 사진 가져오기 +- Last.fm ì—서 ìŒì•…ê°€ 사진 가져오기 +- HTBackdrops ì—서 ìŒì•…ê°€ 사진 가져오기 +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml +deleted file mode 100644 +index 5a4ab39..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Włącz fanart +- Pobierz miniaturÄ™ artysty z Allmusic.com +- Pobierz miniaturÄ™ artysty z Last.fm +- Pobierz miniaturÄ™ artysty z HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml +deleted file mode 100644 +index bbe7a67..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Ligar Fanart +- Descarregar miniaturas do artista de Allmusic.com +- Descarregar miniaturas do artista de Last.fm +- Descarregar miniaturas do artista de HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml +deleted file mode 100644 +index 7d24737..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Включить Фанарт +- Брать миниатюры Ñ Allmusic.com +- Брать миниатюры Ñ Last.fm +- Брать миниатюры Ñ HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml +deleted file mode 100644 +index 7ce046c..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- Descargar Fanart +- Descargar miniaturas de artista de Allmusic.com +- Descargar miniaturas de artista de Last.fm +- Descargar miniaturas de artista de HTBackdrops +- +diff --git a/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml +deleted file mode 100644 +index a63aa7c..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml ++++ /dev/null +@@ -1,12 +0,0 @@ +- +- +- +- +- +- +- +- Ladda ner fanart frÃ¥n HTBackdrops.com +- Hämta artistminiatyr frÃ¥n Allmusic.com +- Hämta artistminiatyr frÃ¥n Last.fm +- Hämta artistminiatyr frÃ¥n HTBackdrops.com +- +\ No newline at end of file +diff --git a/addons/metadata.artists.allmusic.com/resources/settings.xml b/addons/metadata.artists.allmusic.com/resources/settings.xml +deleted file mode 100644 +index bbae2a6..0000000 +--- a/addons/metadata.artists.allmusic.com/resources/settings.xml ++++ /dev/null +@@ -1,7 +0,0 @@ +- +- +- +- +- +- +- +diff --git a/addons/metadata.yahoomusic.com/addon.xml b/addons/metadata.yahoomusic.com/addon.xml +deleted file mode 100644 +index 425358f..0000000 +--- a/addons/metadata.yahoomusic.com/addon.xml ++++ /dev/null +@@ -1,30 +0,0 @@ +- +- +- +- +- +- +- +- Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„. за музикални клипове от Yahoo! +- Yahoo! Music Video Scraper +- Yahoo! musiikkivideotietojen lataaja +- Yahoo! videóklip leolvasó +- 야후! ë®¤ì§ ë¹„ë””ì˜¤ 스í¬ëž˜í¼ +- Scraper teledysków Yahoo! +- Scraper de música Yahoo! +- Skrapa för Yahoo! musik +- Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° музикални клипове +- Download Music Video information +- Lataa musiikkivideoiden tiedot +- Videóklip információk letöltése a Yahoo! webhelyrÅ‘l +- ë®¤ì§ ë¹„ë””ì˜¤ ì •ë³´ 다운로드 +- Pobieraj informacje o teledyskach z music.yahoo.com +- Descarregar informação de filmes de music.yahoo.com +- Ladda ner musikvideoinformation frÃ¥n music.yahoo.com +- +- +diff --git a/addons/metadata.yahoomusic.com/icon.png b/addons/metadata.yahoomusic.com/icon.png +deleted file mode 100644 +index f04e6f44aa41fa0d3f839984aebc31e9ff771f8f..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 17271 +zcmZs?1yCGK*fqLH(8V=CU?Bu|3-0dj?(XjH!JPmBf?I&#&f)|JAwclJ;;zBr&imcE +zRp0&V->R+|sM+qB>F(z_=R9ZQRF!2g&`8igAP|O}tfV>!1P7eLfl%Oq!yL8Hf+t&1x}PC^3W>h5A~=V%22`7Re|*l21T +z5DML{UyCcmhGr!j8y%|y&yQ>Idl|Izfyib8(GXN)}eT=AzWxA +zT)$^3uL4RaK1kF*NxU2+Dh(G}kVB&Z`ho~DowP8AfmE46rnDiubD+?IyW9XckU<6| +z0o<2V5CqRERuW_@0IHqQj+X-IvVrie6^8ggf0#jRayr(spl@xU{%LIVCJ+i3#HJP- +zMGry@0GW=xfA0&5%mv{~U+M^6FxF%5F#vBWw@I*rnolas0EO8NSx1M3oNiil7uMgaA0W_|R07~>ubzFUG3%$Nd6HT&O_&e+kY1_G&0#M)Gc~TF +zAkd~~@azi{Ycolx08*&aOUZ{*L|bF@FJ89^)=gNVEub$4%Q{!C|GgWj;*^f1rJe2V +zKk`H324)jFK`%CgCjC0kj`zWWPq#OJd$*{=IE=z%5bypD{jWl1~O_q6T +zLw|jGH%B!jXWpU9fDco{bxV@WOT6MJqlyzxqaXh8>(z2=gXs}Lc!L}C&0ZKTAeFh& +z$O7S?0xh<#XaCkM2z1%yGVq%Y1tHWnVspml^-Sbh=F10AsI^?08wg}9NzI};(JV5G +z0s={X31j#sMtVI!%+!xWHt=S30R737CsLexXiywm9L+M6%-xi}He8%8dg|Ld22{*wOX +ztp5IhsVbjKmgIf<__C!#6Ea^06NGUrYP(h|?cV~b9G!e0LE +z4)zY$4w6+4hnQArp88s4u_g|8vc7m-ajSZRT1+J#mscL&R0N@%LRno&<{XJFk?pNr +z!@g%H&RQn9a`sQ1Uy}zi``P;l*FIp3Xo85*SR1;x`NYV?HgA218*&uO-_9kx9o1y} +z$bOWwmy4C_qNU5w$`DA9I)RocpGlKR%D}2wRb5`aUX8AGr8TLUTxF~gR4=W?sR64( +z{hd{#Rb8NZq(Q1-QzcLtQ*Be}qABtR(|D#Ka?8J6RA_t{e!b&swh`zkno +z9si7ei=MQcOR>$B#w(?i9L +z3|JSb8BC3|0-h!o9Oia&5q!rwx^kf=VFVSGC^O46%ifGk?U)rTotOS3jg@FOVhE## +zIgL1tl+qy4P|_$U9V(sXsVjAq)0Yb<3Mh_F{g^75TFB+j7h+%J*vsF`U(DZVGu8Li +zXKJl%ZMTwZ+SV`EJ8kWDj?(ATE7R4|H)@uyE2#Uh&{fw}fm6|;oUU9`xL^bQcF{WC +zTGjUU+s+@PmHJkv)*v$*b0V9z;dF|iSicN@92%luh7G}vO9a$Ue +z*_QXbaWmTV|8-N4-<&^qQn}J_%5!RW8nasTgR6+XP><8&Cv;5WuiDP62zpT_o5MzJ +zu!@9Am`%&xdsYk9RGqrTZ*65h)wgD6M8f}s-HTwtFu{-O9P4@}KR))ijkQgxKwSz= +zqBbN#-oIMD`oGSCDndWN*&xJ)iG>-!Ki>HVQuZZ@@UK|?Yg#%HOZ?IyMj)0PUKhSI +zP)BJycAQd2dApZ0ojPrY8KoM$zwi^;Y}YIS8Vsh5iiy&R7D;lA)g_r_&*t`-U6t_I +zkbIELl3dTXVOQa6V3y}*5Uysi7hL|>$<-+`!eXuWV_vsFSI$v^jE{w(p2yj-cjM{g +zDrT!-3mq0fl*2k^j-{8AJ +z8!FaWp4r$x5{3-q%9pYXO8#lbsomUu)We)*OgkNsv{fnHiWrJ(`TT{1dEO8w4k7*? +z_K3996gTl|N~QExn?svjYwyWgtEi@zVdsQ4R`N{bafjxV+BbU4XszPq`;eN%B0d|5Sxj8i8+nkQCLK7KwcdOg7%#NAA5EsIvrVScB(+f!@L*CgoXw}J*E +zc*7X2jZ`bx9^cB~G_O)~qLW=8+(YB9g?TY +zOlORx3+rbVamEbd>f9ws%`qj89Jqh-iM*yw-fsv(>}p!@b&c)WK-3r(aESz*~#r>6yX=b +zGxB@P*2RwB^Y4BMX{skLFdoTZj#Bi#6rA}mWAI>Tefm7I_1;y|Z~NdDb>o&CgMZmO +zF`#x6d5*&Soy|K|d-1%>Jn4Lmyhj6bgHDwn!m|s9>;6wND->9txdiq61g?#iq0Fm&iR_3vp3u)aMYE&MpWcHQH5LHN2bU&tr4)^p|W +zayxu`vq88P>`wbUJ=wM7Lwj1+t%hl|v%q>z> +z#LP?TO){3mo8;W&$!Lt|qe5O`KE5px_veGB3W*uZ8Ja?(my(ysdLlyB;Jf*w#p&6c +z+2ZWW?DRgTz_RDV{-d`IDlA#|^{_l-9i +zKPw*7-=?R(A|m8mJy~!vuK;)xVj-)p1OoYg0D(dyK%o0q;CKK6d9i^&ho&G9e+~#l +ztf5XJvR)u#XGomoA(9n}PnQ|B_J +z=gLj*jYF^4JoXAbPM?FPefT!6gwC1Uo(SMUIaQ+l??E6$;FkYa%c1Y*#S}ygeX9t7 +zXfOywgAF{080K5NJU;q0&rxk>52I9;InNos5Iies? +zDA3{m+2%-1-+@f6@j$f*AP^papMb&tcQZu-MT)_NB7s0TjU@kb5e9GpaNU26Z7vY# +zF>cUS^W;zCk29>?Da@`ln5(Z4dEW-br9XnP3mbk3Uy_Ahl0tXRdz1)xMR-@T$*K8L +zIufutzEq63C!1`CVQ|-)MO(mU=|ZR} +zF(#roxr%AI5JeJD;y$AP4(OU +z@{!^xhR5s^4oYNTZ_4~(ldd6Q!iu@uzuT_vb&wJ#{&1u?KJ=R**s=0$1spcw2pf1* +zEmyI2eqzX6yg_H*)4fi+UOPQdnAKaUnQ70{|MB7T^Ye5)OFq!ok|0n1%Fbn!$yK61 +z4jXuYEfGSO9D^1Wh=MDIosnDh&Q}S7-LxX)-L+`#VZh`Z1GQ*uS1xjfLnP*m6z`QC +z%AOqN=$^`J`Bys?2`7?cQj}GCj!|DT0br^%893(^l8F;k7AlA`>&ebJ<}i +z9Bmf1gerzD_Lsjvyh6k9>1$IHDz+&&MLtTuZq-y3A3sN3V;(I^l5U$;`SvcbaJG_z +zM9YkH@ZdUkD(T^2y1d-DdC8eaz&cN#m>}Ta@zJSp!{S~9-A`HUgg1J6%g2sJ%1Ock +z2HC3OBH;+k>2a1EYPuqxUQ2m-ous4zBqW{w{>P~Gc;(XZWSFDtJud%lV>~;@-}if_ +z1%M?uIa}VmDSryo(9eseelspW7$IiHMwi7}v^Hzj;ac3+*;&`yThlPZmtOHYSE1tL +z<6~oOj9DTYL5Yh~R<`7^`*m-7|F`{tr~eU6`h=zWRDSmSii1ct&5ZKV{WWSEbamzIvs5M(X=gmKO1#=TsAYKVXI@SHlqZ#FA@oYIHd^dOiFH*lkNV? +zRsv^*%14z)Uo{O44F`v#TD>D|#M}-*5SNgX-OpdY;Gu!JipXN=d^;bMi1DRTR}G=ui-tTl%KX^R3dWStS(!W2x#=(W +zdlh{T)%+}}CG;sJu+ikJd)#7G_70~HF-WRaW84n%+6^qq@v*^%qS$xyIwsosc`ZI? +zKD5eQchAKKT%Dp2*QYzTFwvxvbh16!aJK!Ydp;dwKHxD>z6NR%f2v+_Hb^gWc{*;M +z`1h~3>NgyF&*S~oUO+&=rx7WXa7AYW)H=9G@fR(fOrv1GI9)~1X3{#9es7?+w)RA! +z&}cGQRRMWKb!FwbZ@0V^16alV$9p$aQ;w>JF6RqiEYb4O3N-Ii!-B&4`*WyEP_Jnd +z*4~Os-_C_>m?+2nm6SPVd$*v=(ZaCwdz70*3V65>X!O0EU0&PzLuYBJh##_f^AZUu +zY376`xyvO+SY!hH0GsC&_l}N{SFUI%0%hSjG!mG~uE*0)XWbsQ?#;2t0iec=lDxdU +z>1pK%Gt}^Nnx5jJYBWkhJdykHLx%<<@YfLaDaxC7K89}hJHvGGLy30m$FI4ZHjX^m +zk|ptRlNr2fkQV*UpvPZQ323IoC@0hr)KVf3v+iM_jlNe+I<9-tUr;Fu^I4B9tD~bM +zDXL6S(GhWNJSl{I&-kL(KtvQGq|d?|vtc6|vn~g&Yo9X=OI<_SFu* +zowILQSX@jPmKQc5E2Y^Yd?SwSd$oI6rhp#GJMxB_e!aD>yJ2SO&mW<;w+V6hE&uaj +z#Ft7hgvSrT_+}}$S*~QohVn2p_xQ_kMZ0`{0=G40Z@S>8-f +zWkE^=IwbYqi;Fs1T2g8HVWNZr^aY2O?XJ}`$4hpwM?NSUGc&W1kr7I`E16B(3PM;v +zL?9l;=RHEv<@jmc*(8!Fj~7DeihhJ+4zqKC+~Mv!2^I6_K3_Up8=zIFzN= +zl$ela+%}TzfQAhWR47aKTtSS@2ixaVDm3Elw9m4oHYM2v)y +zQNf0aTv=yMD@U0cM7YRjC-aIR{-VK71Al&P?LFaZ%G+=lJmMzC+c!U&xTNl(O#%$6 +z88NWb$+0&P##vS@mjmV(bDk+PMB;Pk*(S!uYO|^a`E+`7#j2H^o%#@n6^D_cl&3s* +zfA||dk3DOpa~eVNzOUQz1uU#g*(l+dE;&tV3+WV_G}uFpOnCK@ASj#En+P!%wb^hx +zX%Km`&%73TUY;;|6fPCtuLDnQO-*1HH)+bZJ;FcW4qWa?@d{H;P@;&ZsUuSIVTPM| +za^0fG{rVm6i$@%NA834c3@%PlNfWQqq{BXM(bv=0pSZq?-kZwjv{Bv}Pv4bv4QD1) +z2nvc&{wT6=$>&A#EkE!F9Dnd7sAt7|ck&h2#EZG|e*ZgG0Z7XLt%GahP +z*Pcq&)@Vr$z~|YF`K;6B`8T2b6)r6u#wBd!{ms8JI1i;YKG*| +z2Gt=!8S8iyNOnRt3-f2+zZ9bv_g4y(DCWdjX1dX4;*`rL|6+3gdOkSvv@IQfTUtFi +z39?|u5dSZ{X4lM9heJ@{XZoc&S67d>%y;7OvhKX!6NAYGyc0+9QodT}VM9JHrWA?f +z-WP7BS3pqkQ0~;L_DiU&UlHod%THck&L(?>Wv*`>ZTFXZ9{;L@_-h?|D}U&vRW&XQ +z*&5Qp#-HJUhKc@ty1!DdN*cvego87$KSPA?u4RfDP2gKHy`y6Pa)0H)2KKw(2{B-r +zb^dLt=R8x`psxOt*`U7g3&P^>-$QKR_#_QjBNHQT+_t-)XK6HQICh+*;5xOelbKoX +zz`2*sqHdWvM_FZ0Pft~qR25UC86EKI2}ndMG={9273Aa=oZ9MwZ{`tZJw&Nyd#X#gQ56bhI2q)V=q*>|3Nm6A`${0=jdEeiZ)nHL$uls&mO +zJ#~2Oh&f8U74ES&4eX+d^7@?cR&(+<;bxVUbV9~4+8J59lqi>%laHmlpuwh2B9lPa +zk_`o3oFvRalPVQEGPdM17e?}}p$awj`OQCm@#0GPq6S014(Za|ueWblbyb^OHt4h7 +zNgz#A%i~No*~}CYpjlC++M|hQurGqdDO1x+lS{?;e4M9~L&ySw$8q-29E>c{_29gE +zIC6R3BJxQLz%}ah>`<4xx*w#|*`h+DQbLxX6d84U-v!&*X%4yVTDg0YQ?Q*o@*=@l +zn1hbk5^as0-v<&95KvbEgJ~4QnXiS4Qzkt|Hvrkfh~><{E)i?fS`bq$pNX_NDuW^6##*ZRc7fx)}MRJ=) +zA;sR_zT3D@-7YVWy5NsJ2rL0}cm=aLrcC7%b*+UxKh8+rxJa`OO9AY_!L%`dUug0tA-Z(c_XH()$?D)#o{Fc +z$@YeA>!_HSwTk=0FDmK%_kU7`1Ca@eZx@>L@K%tV$3eTq(U%tG1;`3(r~QoMOamB<7tR&OY +zfE?)CGf-WeAe^+?c0ONEarl4Ik=sRpLnz+42%x8B!g^%TNx(0Ijw$IgW>Ra +z(PkQb)Sn=--rn|BJM@_hK@2NSwzm6+hw^f{orcgqo%b~9{^3h5>6it|%|VY;>GaD^ +z<#g2nn^7U2US3M(6w?JYJ$r?(Kp0r+?H!4w0m>yT_csj<%q-J?FTVMHup|caqg*Pv +zmC7WOdvyuPTP=G+KuH!z5ma!T_U;~Y-p9JcJFSRd=$i8ZI_r}VuN+-NaS>{L> +zzIk~ZE%hKz?DBqB$j#_;f4Kv5ZtUxO4MQgPy_))nDz2{Eu1v#e7L3G(FgB}k0kl-!W{WJ^=0v=D= +zLat|J0(&bfZ6);e4~84!VlCR**(1gUK~?dU +zu7y6((;t$$7?N4lWT7H96Xw){5+CMVlBqoZ(9ai+e= +za_qp88L`L(iFc-aPL{pqls*C^M}a!8!=qv0=&COn+jOOkb*01OlYD0To55>;q4+@! +z7^07-=l9mucu99ev5FrENp*N+>tg615C~a51H^X2{|FnJSlCUUYWcE>6{4b~G&Mf{ +zmaqI`D}hz`VhE2XU#Uuwm1SKv?UmlWL0ci@38s}mM5H*?blN`PW=OZ4AT3VAA_Zgw +z%oqWI6_D7urZ%Ib`TZRv$s#=*#0G9KXfwSzEU_hIHYMJ?;-v83cWYP_Smg$?6+j6$ +zSVQg=@~5oXey}jF$)~-_=}nH$z8>lrWU(+Sx*lNRL9ksp!9s7G3V7WH&uq$R-uTC( +zq!|9ax;JQJVPKh#RqjAtbDn>FnxUYJkKeyMUG2Ck%QhBQV-g5(bGy*myhVea1Kg$W +zX(wydP@+kY&{y6bAyT}!*=9zbnt_Z+i2|P5$m~sven-&bAf3t{A=*x6W>(uqu+7iC +zqQJ}Xn?;k?C7U9gNZ)_Q7|k{&I4mbadsp?{?gKry#sy)gmiFtW78Vu;2Kk20 +ziC%AO>Ak{(dPRp&IU3(>{Wz-cQlv|?|DaC&tMBntM<$634ojZe;)NTlVRH-C`Z +zoGx$xIDNXOS2WNe@VaQ`{le8fPgnU6anPcgs#q5&pqffqJ0tk4DrANMC-LY+jW1*msJ!NU{uq__7VMjW-$mh_Q&=1+P;ms1?!|O^QPuGzsqemVUvuaKL5WA +z4Fg}E?q@y{5|)dNqt?vJV{gZ1M$p13DJjj*&*RDw#*Y+}=zt4M8y3$l?$WQ$%h +z08NL^PR&@@1~#%q$Eqwhu2B;A8{bhg5TZNx`gzI8(PaDpQpVv~+t|**tlSuH +z*_eGxFtEts;pDJ!lM*Df4*%GPo;n*CN^|R}R%IBpX2cI$#2Qhdbi40-1_)U(wTzEX +z+uXtCg*jM^lqK=27CGkAJDCX-Y^S +zh{>Ag0X2C=EiD45C{=2pKW=DA4xlwzW+TOvHZ(W$Pb5fDi9`Oh^^%@QeVF6&qrv6>KfTvCDIIJeKpe>t|!azm&fJ!UoPo+H(LR&cZ_BN8*W6!sH7} +ziRhx(kBwQpIV424+)VP~ND&g@0(}hAu +z7l@^-s=~tb_Rh|y$Hy!Tc|@b4azFMM5{8Ym=2MPILSZFS2RTSF2}_Qx4Sg^AbQz=9 +zu`JPM)ipJKf@ZbJgGrol-Rq_v9xm$Wh@)-;Uq0qBnh~dsORAv)7DRI_#S^&;}JRt`2ojRQ&e3*GHtH0vib +ze)f2x1|;nLlhUlGmdS>WkrBF*4;%Q%)i=!_1yBOrx`IfQPIH*>5W_~lKMXV-H(HEJ +zQoRwA-4a-*rwW}U;P>4B(XNuHK;_fXw~^cZ+|bYva?-LmWPYQIo-xNYw`hZfSi<~e +zZDnQUzZ^U)V&Zxje_O;m8+^KYUsAF?iA$=X9GG?rhX#uxGXADtcYp6OO7iN)+s)eZ +zT>!h1DB+%-o?gC8y!nUy%5oOY|LU1}H5$wvS3vf!hAz(tiy +z1Nvvl&R3*~7)Z&_uUR|-=z)=*-guKOnMPpZw7Fy9fxBlzb +z!L0x#%GQN1q8KnZHVPSLjHZ3Ro7!sgPGeQjL^qZ&FK>W%n0T=))wpZd+H5|ebKA`3 +zd938%HdQ}>se~W)->3aPyml +zS8uNUjSP9+mlTX>xj5W_o%5b#Ku#Pa}pJYW8H*g*j6o(Dn5zFPv0Zxm}hOef;Hp +zAP|sydY+$eH$(#OT&=CYBSU!$);l}BvoIc>MLx69rplsh;dX_?coD^9(}pg1iGJ?# +zo&sr4$nWy2bb5Lk?#d;znKt!r(&UJ$_>yHHo4yu?ys%ekl9;UQ4#nZoDt`ue)CQy5 +zpH0`h=iubgIUr=u&Z-$0OuCVY$x^4;VhNxlRROv5d)W?ScFpTn3^1WI=@`_2K7lAE +zcscgo%F5~@Gqfk*_T~93L`E&x`yVb?;h_MGdV**oDT91jA@Y3o`WS*$Y`eOPP%(GE +zUz$wL>uOrbj1FZ3zo(nPL)(E5|iVAuFa5a8sf7#C#I81P5#gV$?cy{KaSI5$|R^XWn(G7ei4->U+ +zK|1ZZ9RQX}Zf$LCm17>YTpD$8Zj4aCzg0kL3+@x)_6nAk=0hBSrNbeHeRS&lVX4jz +zCIzbxK;D6)1AD&=Zyg^r>M_+9l6TD?x_1Q?W4}Y29e@lsF-^Lo?%0op3>Q*sJUk-! +zY&_Qh?7)B9Vh=>)d=vC^G3vAKXQQH$tgMrg-DXea(1;iYA1!+o00apIw#_P)fG6fhBUfROVY%^MJDW+_8tYj7h +ztty4a+_tt9h(WdVn!^dV33mD +zj4MUESLVRQAsq5q8XpWjIdMV>A2E8ut&a@Tt(8|WxPLh6a_Ks0eR%MP4B!n^6a@o% +z`afVJ5kc?x_$GlJBr_{_^?;8y-cFSK9Nf3$NEo+OL{JpVEr=5SW6CJ#(sI#j(dqSX +z1Xd_nGJBmQ`2?YIqArQkefuFnVBizeeAmxNBi*jIDdG&wKc`RM(r|8h;q(eK+1u# +zwzfu|%(@VRCAot@eQXeErdz?7APIbC;g^HO!^>5jsLFo1A +z3iuM;#N@PbULL;);a(s;ep;MuXklTYXz1X#yFMkR0X$PFDlfCmk<-(>0s)u4-8@DL +z-@jq2tE;)WZM@Y}9>;$gX$yU~@?CnvAhFb5dU^`K4;_i6%`f72+~Z`2icsKqF@eCg +zI?U?qwKV!u3ap~UoGI^B6zINx)PS`fa3+-h(S?WPljuGaB}yC!9IQRpzYJV@q~^Gi +zY1v2;=6+4|CSQ+kKg*X5##vr^d3$fQV@vtD5%qngH-=;$CdAjDo(R4Elt}(B*ZsFp +z7we52IC8C<_BHUe3=AGmyUuzqCm1nf5TyL%t)#7Y&7-JxN1LlPwhg|n-p54*sO)N+%f={0$m-9Zp^!?=YR=r< +zgBvLgk5wwM^HHbRUtDW*a}wB=R5?xKI(>4Gl-<3C`2#cq{pr<^SC{yNjn#HH*g~BF +zIvSdF_$qS5z>M&t&t|1^TyTB~KRO$jF%xEj=*mm>{QOLu +zg^f&aD%Xjw$-pgJhSc>e?&EW!q4Ioh^7^pYWHs69yryq#TX%&+_)~U48v^kENxOr +z*~TX%WDY29z0S%|047bxKi|xDCNg(+cIG5bySlotD1-y=&NrVQZ-HWHK#wt^7}bR9{P_x%1egv_UCC6wpK`{pCfWx9N*YgjnEGu!!hS52S)}&Qu&QUl0I`7$% +z|K37JN5{dz0ZqCb1p6;9dG@?jv>9DIT9kNDP|&+~?|@v%&CR_Lbh~yiSHVhnILKyL +zEUQz~`~mlqYNcYN*Bsn4mL3zcvyTbnFD8;vSf~KDD?8ZB?rSU?$tN@IuYp)S#(e>| +zr$${bMyjqK;zvRx&-1wFQb0rlZe&WxPr(&a3)U^I56}Np$3~mJ8#l}VKHpqLnsj8xG+jR(v$twr&pyHVRTi@7XL+*ZckZ_rk)$?CdOXvc7)m-9?EKZiWbT +z6*d92MgvlFohklB@v8W*1#d$AAs)M1a$Q{JnfE2n*#jB+LHq-+W0? +z5KJjGV3bVjoxKKyNH37@RNjUtCsJ|B;^w|Pe^-!j0Nr*u9V=KuzfPYen;svnPCGv} +z6-RhZtW5pDlfO!n|5U@tlsMY#k0TIDcTZ1GdwYA)iC7HVT>&6@eS3TR?_cMdb5;~D +z=AauT0A|7znY7a_<0VU!EQ={h8Oos(l*FFM5$mdBq+tJWv1I9V2d-(QNd98Z1P}ra +zxD&X8yPLZ}p1zH@Xns&mz4q@u*D|Hj2#5pNh*E0g;ido_L$TcKObF}+v`4&1u41Oo +z#77ueR=Ge?32936{2rH#NCJD*&5>=txDq6FFG1;&g9<=n{7aw;mWQcq*^>r?2%E&h +zsDw=tVI{7^yyPmOFmd3I65n?GgGB#Jw#1<_5?qKVBIBEIQ(|dE_*_vC+z(Mx&IWQe +zP(Nr6Ul2a@Z5>=1Kj0Gr*#iC=QK0=r1Y9})8E!tC0(S2I*J%GghWqF%I8l6*|E>$o +zt^WT`|Nme4&!2;*_+=;=ev_957Zuy`YXMBTBD*|y|BN0N2a#Q!0I7&|{}#FQDRXL< +z{H9$+xQLbzePr?K+~vmK%FHYe5FZuh+{uu|*r04eLOeyRf7YFyZTCI9o{e2hZQo^Y +z=3yeyCy$Dh`{49y85hb`Xng%T)}qfBUxJOOhQGG7bawTI)o|azfpg`=x#4396QZo= +z_Fl!hD^$KLjchY7+j!YPZ;AL>sLjPh&A3ox@C_i!K5QjSh*21O%@1nT$Rh>Gs{IhU +z?Uq%$9%G&^Dhilnc0djqV>{-Y>0Vr26&l3iCRuv8u_`O$bMMHZmJ%fAPl*Ho7hB>Y +zsb^OZz{~Jx4}0&+`H8!~im!yf@%y;ZZM|QROvd-Pn{Og{KV(YGllyxzi-1{Qvr<(S +z1%B_!4`BxN-(v(A`Vc6VJ*i`|;dbXbb$>;)>MR23m!wQZ@o)#b-^<42&*W$8>FH6F +zNmXd3DP;XnR+vk2{iHczLu{{lLQOZPA^6s!jC-OEv^4ByQNu@S3NB(kd=_x9j{A!<>i~| +zyPWS=JC@#mPGrVDr$oU`cti4uNx(qF#rPjO>+$`+l`9Auml_+G6a|semKvT(H|656 +zh9xUg$^*J;SgQO{-s^07n)CVjlfKiym+|2J%rMdO)sAGFsbxX;0?z0-RqKTEgYxnS +z;|6smZLE3X+l@Y}-@%v#6;7?%(VG~x{IYYYjDa^d++LoVA}r2qFiEa +z&F1rTihAx(WL>2qx}Q7QtY0c;nU$+Fd0mW^J)7;mW7$wi8JiJ@L3~qoJQj^~RJQTg +zi$7DGUg3OS0Omef|C#2_1nIMD%G}q`X`sr>RR-Xu66n8 +z0CL;7W$9UNYokD_=A}0wSSOWYHOog#%Rzm0Xovl +zq9cz4_SboPJWE5Q2=~pwvCS$#=6$(H4q5F9Xd8uf{8n7d$j)xiZQP1ytRI`1q0s-c +z=6uTr7WhtPTND6w?y6$Shh}(OQx5x0{2ypm79rvQAyd00f6>Q=NQf|6RP?7enOVE>lG%tKYPD-*smV3w +zphkR`!)n2dnekK;Q>pJ|>>V5cBh0vFxw;h=6`$0-VLf?FDQs4z2nDHNcsLuwo~48o +zAnsza$VR!TsQ~Uui!C@lJL>~T>PGM*z#i@bQRNOLsWNqIrLZGm5aMV$hQC*OPCSn$ +zuMZQz-H*6cDz~u>ykXMg21%(&EJnBJI|cW4R>za9s}%~2Mb_2U8n)PbZ6!KH(q*Yu +z($Tf6(+Cw3L6i(_x~I^2`g>ECW^ +z|GUn?K!U~&I*lf2;c%|dyeTV7)sZz0zPGBFv*XID*3|oX +z4UhY89ruZqN;hk%?QC0>)PJ@FH~IqHDWRQZwot3^yK!=7xyz?PvV?3}`BN_~)JQOC +z!`n;G!9Fj#OT8H4(ia3fYIwC@Y2D#3zzzQ!C)h8h1Z68(WPC4V<2_R-geXP=E|a5V +zws=t3$}|N>Oc$Pbb*x4Rn{;}zi-D&t0VgHq1npY04VKcJyp?syz1>+~2q3H`yM{@> +z@4A|<0fd#Vvo03}x$&<`<5gAmsdVAaRaI4uOOE_&pKX8brl}xMyDXX!|MN$P!NgG3 +z*RGk5ibBe=Li(fNtG84umK}7r8ABJJ{*`5RWPV}S_qfqUMyODW2G1nurbOgvb0LPJ +zmy*!|SGrhx5-}WQvot9QvthA9(^_Hg&VixmEc8YeRs2k9Ml>0jjn`y2lriHv@Z_)AgjjMUV$Y#Wk0t)QUi +zVu=__4!k6EJU?6iAUDAD*7tHVUsKXD%DPK|o~{uyGl)5t9|qEE=_;NNw8Yk#k7{wiY#J+XsCP*75=u(_Gp +zK)Zm5VbhD$7dmH-Oagqvy7??Et(GV|*X#Y+&H9<~@gEZ;GxE7hjuiSR2;q=aSuP*v +z&HhRf*Kj<{jo_7iZ!BYMpp2U)Pg$oed=3RTRs=Fu+E?KUG`QgN+=;5~S_1y(WgxHa*XQD-Dg|d`!q;ad`Qnl8bxlE8D2Xc6D +zyQwXcY{R0P7ILpOh-6zEiqm6RkFiwFii +za7{KLQr=V2g-PP6hRdq!sJc$QJQLsuOtB?S&I={o&1aivOBn`+n%xx!IR6-vg;V=7 +zG@SZgX~1+}-GSEzh&8)w<>lo-5nZlKn%qTDyJ>Q#ron~u!7n)YWq0a50a3@z!VS** +zYe1A3VjJk^E(dC&Px~@8G0rB5U;R{D_+5D65#j6Iz~_Tey`?gJq%_oJ0e72D&=dRw +ze1SB~OE^ +zhY6W2jll&c!I0L{tvW)UkMcJcpqG~%g@NvStxl6I`orJE2oQ4xKJFz6)cZeO6qJ>9 +z#IfoVbA3AB$<_k)EzeUtT$jxZpsMmD-OWg8YW{XwYSJuD!OA_?1hy9j0J(KEKliy7 +zvwrp|$am0f|7JS<`A2LU5TsosBqEGMmiqSvCf%_So&Kn{I_k~F;oT4r?5PykbLAuN +zjbvt68ihQ^1EBJK{7tq=FyDD0akOMD^C(P8Ro=@h==Et2S-{(nv~fniZi}d|-5NGB +zIbG=FV7q^O(h^mZ(ZuAyQ8hQGaqVvx0m=mlxY&s+*73zb`LzEghcTp|AOv!vPGV+H8L4wASubj|HQuQ +zcW5)t%p}{pP%6!-2;WmnsUbiOH{qux0JV8kYK-sZ{tmE9B!t{g!rVIoC20}K&Ax*1 +zO6XoCcS*33-fk6m^Vg4zT!ESl|patU?GKL-e)SncyY9ap=Odb +z%)}if`??oE00opX1Ez)8;Zh?1Og-P_Rr6s +zbL;DG$GsaWD=Ss$IM@_u&$NL&_5ZMBaQJCx0MO1CsKrE`KHYiL00v +z83p~YQt_B&&hLDemjjHCtEw6roQFsSVn)>f!rtFk3_OqzAJk>Z?rUw;W9S(&1*+&6 +zdkt8JfDKS4dBMuc4!PGWd$J|q);W$^ib?scXV1z>LzSJS-s=~;riuz=lE%DDeW98@ +ziq4k@(!Ckhr4A1pKfez7GAa~ts#HU8-$P)pD8#gFWu{2vbu)(Ibg7xva8|8sVthhB +z%53Q8V-eq6lN(G$iN^VAcj{_yCR@JDz2oyJEN)nY+8HroKokPVd+#u1yu5B08@k;A +z)!3Chf0lQ{mI+;^jdjra>i2vLc$E@g`p@87vqX14KvsBux{{y>R0YCGXPrS?R(AHJ +zB}b|(HSV)&e}a`>!=i#(#^lc7$%&Bv^*&Hr(b3b3gGg#GOdt}m`Ce=V;C=@2PNPTp +z3-I@r*}aNVez6l18{n33vL(lASyDD&xM5qYe|H2id5bA@G9YFpG>e30skl`C#Qmf!j8M2vhuW4*&?8nt*jX6=l}&<`kHzBwiPpC +zoH$JyjSg`fvz}atYf(d8&+~rD^rNfb2U?po+d{1|XP2XW-Z+?|zP`Pkot?kGzqNI_ +zB8`O}p_Ez-6u`ECF9E3h11#>uyK58{W+n;zQdhx%8n+4#js~rwxu)i*ON^j_8rMjA +z)N{i=HNvbsu|tH%$P1=)y{ccQ9RRrgRLAK}; +zK`<;qlA*2@s0F;|EzoxGkdcY(MlIu5vFv2Z)9H7sU0Zi<;ptct0^?Z{=b2T)+2dgn +zp-QQdjYd&d=`eTt+ymm>uC +z!KljI48vjKVWO0THSCIPhvs;bzi{UGpxa~#ZWLf7pn}3j?D_wUl}T?F-ywrDg*t5? +zIh}xhn&_b_pkdJCF-><0&}9q_H(DJT8PfD7J!+9)XqX|`!2F4y!AAiy+~xorX+y#d +znY +- +- +- Afmetingen van de voorbeeld afbeeldingen +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/English/strings.xml b/addons/metadata.yahoomusic.com/resources/language/English/strings.xml +deleted file mode 100644 +index b41bc3e..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/English/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- Thumb(s) Size +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml +deleted file mode 100644 +index cba8217..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- Pienoiskuvien koko +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml +deleted file mode 100644 +index 8944ed5..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- Bélyegképek mérete +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml +deleted file mode 100644 +index 4532347..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- 미리보기 í¬ê¸° +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml +deleted file mode 100644 +index 05b9a8d..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- Rozmiar miniatur +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml +deleted file mode 100644 +index 72d365c..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml ++++ /dev/null +@@ -1,5 +0,0 @@ +- +- +- +- Tamanho de miniaturas +- +diff --git a/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml +deleted file mode 100644 +index aa781c2..0000000 +--- a/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml ++++ /dev/null +@@ -1,9 +0,0 @@ +- +- +- +- +- +- +- +- Miniatyrstorlek +- +diff --git a/addons/metadata.yahoomusic.com/resources/settings.xml b/addons/metadata.yahoomusic.com/resources/settings.xml +deleted file mode 100644 +index 373a6de..0000000 +--- a/addons/metadata.yahoomusic.com/resources/settings.xml ++++ /dev/null +@@ -1,4 +0,0 @@ +- +- +- +- +diff --git a/addons/metadata.yahoomusic.com/yahoomusic.xml b/addons/metadata.yahoomusic.com/yahoomusic.xml +deleted file mode 100644 +index 9bd5a3f..0000000 +--- a/addons/metadata.yahoomusic.com/yahoomusic.xml ++++ /dev/null +@@ -1,42 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- <Video.*?title="([^"]*)".*?copyrightYear="([^"]*)".*?\/([0-9]*)\?size.*?name="([^"]*)".*?</Video> +- +- +- +- +- +- +- +- <Video.*?title="([^"]*)" +- +- +- <Artist.*?name="([^"]*)" +- +- +- <Release.*?title="([^"]*)" +- +- +- label="([^"]*)" +- +- +- copyrightYear="([0-9]*)" +- +- +- <Category.*?name="([^"]*)" rating="([^"]*)" type="Genre"> +- +- +- \/([0-9]*)\?size +- +- +- +- +- +-- +1.7.10 + + +From 4c4ccf0e898d8ad1636a9fec5d22c4b1195ca520 Mon Sep 17 00:00:00 2001 +From: Martijn Kaijser +Date: Sun, 8 Jul 2012 12:54:29 +0200 +Subject: [PATCH 2/4] update common scraper modules + +--- + addons/metadata.common.allmusic.com/addon.xml | 2 +- + addons/metadata.common.allmusic.com/allmusic.xml | 523 +++++++++++++++++--- + addons/metadata.common.allmusic.com/icon.png | Bin 0 -> 12584 bytes + addons/metadata.common.amazon.de/addon.xml | 17 + + addons/metadata.common.amazon.de/amazonde.xml | 15 + + addons/metadata.common.fanart.tv/addon.xml | 41 ++ + addons/metadata.common.fanart.tv/fanarttv.xml | 58 +++ + addons/metadata.common.htbackdrops.com/addon.xml | 2 +- + .../htbackdrops.xml | 35 +- + addons/metadata.common.htbackdrops.com/icon.png | Bin 0 -> 11423 bytes + addons/metadata.common.last.fm/addon.xml | 2 +- + addons/metadata.common.last.fm/icon.png | Bin 0 -> 14392 bytes + addons/metadata.common.last.fm/lastfm.xml | 278 ++++++++++- + addons/metadata.common.musicbrainz.org/addon.xml | 43 ++ + .../musicbrainz.xml | 170 +++++++ + 15 files changed, 1081 insertions(+), 105 deletions(-) + create mode 100644 addons/metadata.common.allmusic.com/icon.png + create mode 100644 addons/metadata.common.amazon.de/addon.xml + create mode 100644 addons/metadata.common.amazon.de/amazonde.xml + create mode 100644 addons/metadata.common.fanart.tv/addon.xml + create mode 100644 addons/metadata.common.fanart.tv/fanarttv.xml + create mode 100644 addons/metadata.common.htbackdrops.com/icon.png + create mode 100644 addons/metadata.common.last.fm/icon.png + create mode 100644 addons/metadata.common.musicbrainz.org/addon.xml + create mode 100644 addons/metadata.common.musicbrainz.org/musicbrainz.xml + +diff --git a/addons/metadata.common.allmusic.com/addon.xml b/addons/metadata.common.allmusic.com/addon.xml +index 0fc8372..8a990a9 100644 +--- a/addons/metadata.common.allmusic.com/addon.xml ++++ b/addons/metadata.common.allmusic.com/addon.xml +@@ -1,7 +1,7 @@ +  + + + +diff --git a/addons/metadata.common.allmusic.com/allmusic.xml b/addons/metadata.common.allmusic.com/allmusic.xml +index dec3959..fa593d6 100644 +--- a/addons/metadata.common.allmusic.com/allmusic.xml ++++ b/addons/metadata.common.allmusic.com/allmusic.xml +@@ -1,147 +1,506 @@ + +- +- +- +- <td class="sorted cell">([^<]*)</td>.*?<td class="cell"><a href="[^>]*>([^<]*)<.*?<td class="cell">([^<]*)< ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <td class="year[^"]*"(?:\stitle="[^"]*")*\s*data-sort-value="[^>]*>([^<]*)</td>[^<]*<td class=".*?title="([^"]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- (.*?)&(.+) ++ ++ " itemprop="description">(.*?)div class="advertisement leaderboard"> + +- ++ ++ ++ last.fm ++ ++ ^$ ++ ++ + (.+) + +- ++ ++ ++ ++ ++ ++ ++ + +- +- ++ ++ + +- +- Biography</h2>.*?</p>(.*?)</p> ++ ++ ++ ++ ++ " itemprop="description">(.*?)div class="advertisement leaderboard"> + + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ + +- +- <h2 class="title">Review</h2>.*?</p>(.*?)</p> ++ ++ http://schema.org/MusicGroup">[^<]*<span itemprop="name">([^<]*)</span> + +- ++ + +- +- +- +- +- <meta name="title" content="([^"]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ ++ MusicBrainz ++ ++ ^$ ++ ++ ++ <(?:born|formed)*>(.+)</(?:born|formed)*> + +- +- <h3>Born[^>]*>[^>]*>(.*?)</p> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- <h3>Birth[^>]*>[^>]*>(.*?)</p> ++ ++ <dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ <dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- <h3>Died[^>]*>[^>]*>(.*?)</p> ++ ++ <dd class="active">([^<]*)< + +- +- <h3>Formed[^>]*>[^>]*>(.*?)</p> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- <h3>Disbanded[^>]*>[^>]*>(.*?)</p> ++ ++ + + +- <h3>Years Active</h3>(.*?)</p> ++ <dt>Genres</dt>(.*?)</dd> ++ ++ ++ <li><a href="/genre/[^"]*">(<strong>)?([^<]*) + +- +- <span class="active">([0-9]+)</span> ++ ++ ++ last.fm ++ ++ <genre></genre> + +- +- (.+)/ ++ ++ <genre>(.+)</genre> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- <h3>Genres</h3>(.*?)</div> ++ <dt>Genres</dt>(.*?)</dd> ++ ++ ++ <li><a href="/genre/[^"]*">(<strong>)?([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- <a href="/explore/genre/[^>]*>(<strong>)?([^<]*) ++ ++ + + +- <h3>Styles</h3>(.*?)</div> ++ <dt>Styles</dt>(.*?)</dd> + +- +- <li>[^>]*>([^<]*)</a></li> ++ ++ <li><a href="/style/[^"]*">([^<]*) ++ ++ ++ ++ last.fm ++ ++ <style></style> ++ ++ ++ <style>(.+)</style> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <dt>Styles</dt>(.*?)</dd> ++ ++ ++ <li><a href="/style/[^"]*">([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + +- <h3>Moods</h3>(.*?)</div> ++ <h4>artist moods</h4>(.*?)</ul> + +- ++ + <li>[^>]*>([^<]*)</a></li> + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- <h3>Instruments</h3>(.*?)</div> ++ <h4>photo gallery</h4>(.*?)<h4> + +- +- <li>[^>]*>([^<]*)</a></li> ++ ++ <img src="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*) + +- +- <img id="artist_image" src="([^"]*)" ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <span itemprop="description">([^<]*) + + + +- +- +- +- +- <meta name="title" content="([^-]*)-[^<]*" /> +- +- +- <meta name="title" content="[^-]*- ([^<]*)" /> +- +- +- <h3>Rating</h3>[^_]*_r([0-9^]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <div class="album-title">([^<]*) + +- +- <h3>Label</h3>[^>]*>([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <div class="album-artist">[^>]*>([^<]*) + +- +- <h3>Type</h3>[^>]*>([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ itemprop="rating">([0-9^]*) + +- +- <h3>Release Date</h3>[^>]*>([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <dd class="release-date">([^<]*) + +- +- <span>Release Date.*?([0-9]+)</ ++ ++ <dd class="release-date">([^,]*,)?([^<]*) + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- <h3>Genre[s]?</h3>(.*?)</div> ++ <dd class="genres">(.*?)</dd> + +- ++ + <li>[^>]*>([^<]*)</a></li> + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- <h3>Style[s]?</h3>(.*?)</div> ++ <dd class="styles">(.*?)</dd> + +- ++ + <li>[^>]*>([^<]*)</a></li> + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- <h3>Mood[s]?</h3>(.*?)</div> ++ >\s*<h4>album moods</h4>(.*?)</ul> + +- ++ + <li>[^>]*>([^<]*)</a></li> + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- <h3>Theme[s]?</h3>(.*?)</div> ++ <h4>album themes</h4>(.*?)</ul> + +- ++ + <li>[^>]*>([^<]*)</a></li> + +- +- "cell">([0-9]+)<.*?<td class="cell">[^>]*>([^<]*)</a></td>.*?<td class="cell">([0-9]*:[0-9]*)</td> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <td class="tracknum">([0-9]*).*?<div class="title">[^>]*>([^<]*).*?<td class="time">([^<]*) + +- +- http://image.allmusic.com/([^"]*)" ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <meta property="og:image" content="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +- ++ ++ + +diff --git a/addons/metadata.common.allmusic.com/icon.png b/addons/metadata.common.allmusic.com/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..9c18e20111f1fed8e64c953057274b43c58fbeef +GIT binary patch +literal 12584 +zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F +z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f +zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b +z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ +z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ +zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz +zAi082_V3b^XI=KgANV6LL +zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP +zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF +zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw +z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR +z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys +z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D +z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH +zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn +z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( +z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH +zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa +zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB +zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA +zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 +z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK +z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) +zyB`c7|3N6k5q$CQ(PFSer%%D@ +z7n +z-kTkp%$zLDfMujXoC8blcRTkeY8Lvt`)Pg-`SS6ap6T8mbong$P#+a9KNAQP5)J}gKLEcwAdoi?2()Vs +z0*PdTKxD3|W_=1E5VMxDoV2#@{C=*H8|7@)*29uLs5i11zdbFLH6>Napq5iOm1&^b +zTfxe8U-ff*nL{c}MKcW+&aqK3_jTy!h%U|D#{q2`BE6Zk==Lw|8-@e5sqXu|KS+dY +zOWq1<*7x4#(n>u+aYq}ING?(W1tGUm;;ihEWmHU|p(Vf{Aj{Wd305C?|NQPF&z#$v +zE~SV%H%*8PS&C7V`{?fdE0-E#gD#61zrQBQY5x-jA{;lmvxJo_c4 +zv{3>fY?cy6IlasR75rIMiux97(2Ss(2&VO?Mz$Eg9-ov>l1?%fB9I_czMspC7%a4g +z2|DXU|5ny%R>uY^=!{ZUZYHQeN6y7A0}eW50y=OPR}~!kJX!{=v4L`Pa%dafMLf1? +z4vuX^M?{;_43ip6>L*`gfYv~is!Q9IE~RLJ*UQS6n_G~&cuutbAY=%d7=-=@jF{z2 +zl}qF~CPGvcy1{{6vc^YOV)kE;{{V~%zl*eaN(hXXE|{8JKFb6{I^Yq99PDcj{NN5c +z2pBE=?W4?^irRS!P%Hv&2s2=su_Ln#7>8bv4x&67mTZ<$E2GmlKRD=WtrwaMDeZNI +z<47w3N*Om>c`&8#+ur==gUUfOeO(^ys%KabrxQW|UO`qE*(VYQokvrxiPJMkpb$#B +zU=#Y_r)vNZH6`0la)2?**1b}L>M4s-S_J=v0_7|#3J_QdV1{16wUUF}5_lnxCPP+L +zJa;q!1Wxmk6qW)?ftJ!v59M~1#YZTJgL=Os4%1kB +z#NUC8Mh3iL^Z#ki>;BKZfD(&>Yl9wo38zjY;kf(RtK +z;Pvb{sX&NNcgavSx$r)$B4TUz@3nj2B`stc8>wU(mPo<1h67O$R*)I&ul0_<}aV*Us~;nTXf<*KE}mkkx*-L;$9 +zm?}URd`8Sb6JT~81pE|{?^4VRa0?WYm(d^RkXa(wFeM1_DC_kSWnVZfUHz%R?oSgl +z=;k-0tEqfAO5WBRQt!4U-|LMGI(^RC{F50YR|`Ks3aSB;dn1Ybft{%`cle#34ESZ7 +z_=BiGT?8aSjW%r82qF8JejJ1|X;HDPV=W9WNBf)07 +z@t4DIITun)_G=fMR)o|hxBfZ_3aT<|6Ok9$BL~ +zIjY_|yb}8)OW+q8SKnj*dS#dpEL^IA3(HVuj$7#0Hz+OhVbo*X6yd@AQ=su-oNE}q +zzkWJAFYnRO3o&T|iOW|J!1g?L*Z}vmst!8$64gp>DTuw>SL-5yqM`usqp#`(1#pXe +zEWY@~j!vZ_8@kH||3)Q6O$#BgmL61ZK>{5M<%AG2D710cEEFn@RACO9eMFvM3ajMD +z4o@-jJlV@7*JcnY@y=i!CjJx|`|GP}t&ZWvaj1*(Y6+jgXA%FmT2MVlVh8jHK_b}R +zr)I5N3ja;iXRN6?80!r(2V)_4vS@8xu^$5hxAFJGN^Ccupl6?V;Vee<#FW>>U!CLI +zQ$tZ5UL+k~t>sm4NS|Dj)PRE}IWCZ)?@{eU`{Dx1MP^ +z33OJ}5txQbHD46*5CY#*EJKB3W3Fgz_DCmzHk}sQPM4;mEP)D2m>&L6VM)v{e0#2p +zWkc<5a^Lu;VUgS|LdvS5wR4=cb5xz~-!VxiBel+{hA6BCZ9NA!PK}O=fvrMQ$hykU +zz$UqCF{{B%kHHNJp~Udc)9?CMaS8IQdUshWs9IWD%|1sorDbIV*r)`ta>;6CDGR1_ +zHb3;un-*5zw@uE>ME(3JfsKP>@c_SHJG~zL*sLW@l5>KhOHZ)>$vKhttg)e+nRv@E +z+>t8Ct_$h)0jz9p&<|oac3m2`kS~YN6dv(rBWV9ZDQoKPL;f+ +z664h1q5p|VB6Gd3$@V)}dG&zdvDeBarM2Xk47o#3jCbB&<#PEhj@6=c5F0A8=b$!K +z!j>SZ1FI1=b0y{fCT>tS!!06a1o4+tXwydNAoo* +zO7?89u~xmI`fAg|zc(%qf*?B20nvE;AZobTzIn(BHv@{spJp^Vk09hji){r%n+ +z&n>sr?x(K=1!vo@kjyRmrxLr*$usWnYyDg)K~&?V%F5hP;~S0K%!|P +zN;*60d25!mc62p#-WJoBR`dYhPC*tD_bumyKI~rvMHKT+(#r;k3wZ`gY2InYOMg%s +zvGNvYzZPZEd?#n=K7xj%GEzKbE3a4iJlcO@lH~ZHq&$!&<3XU&CXl_lMl$HxC|C6E +zAXP#iZ_D?vmJObwr{meYx@QY4niLVmIhh8APscsC9ZrfMO+-u15`88p(h2suvUKh6 +zn?0qnDUuyGU;;d9KgE@}JC+UH5?$^}QWqkBlerB3> +zZmdqec%}CjKXLs#VVpUW7m-yRSj^iWUE)&r)t#k3O@7h`h7|3~068mn;}+hilR5eJ +z<3H;wCAw-7+Z?~DI_r-E=g1-9we)1;o<-g)n(qSr_h>dh$=Y;~4tb%bVR2*{>q{$E +z;@Kq~Mh~p}vEs+erz0IxH8E+EXh>#_t&H_jF>iiK8QqXyMy}wPa#~3c{MY#qwD-b0R}C(jAo-@$(+)b^PXXUb?mEv8>Uw0CP(x0%5{Hsoe1+;MSc2My$Lt9W{@ +zR_}$4`{ih389&paZ}03#^N=s@Z0R|mfQ}b@mLsQaduAbU?*l>~e;>Awjgh<~s0^7n +z)sC5E|ws +zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA +z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u +zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU +z#|~thGoUPelc>KIkDF&G +zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o +zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb +z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y +zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD +zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp +z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 +zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` +z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN +zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha +zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi +zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o +z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq +z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg +z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW +zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH +z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! +z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A +zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ +zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* +zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l +zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ +zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e +zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE +zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x +z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw +zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh +zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 +zrx|`}gDZVX6{jd)H4o +zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP +zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI +zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge +zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs +z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? +z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 +z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> +z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 +ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG +z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S +zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o +zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 +z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) +zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X +z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i +zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI +z7PKqr&+>B8QSiepK1yNOlk +zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< +zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 +z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| +z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ +zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q +z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d +z4cSeAh+BD?v-)h3awd +zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c +z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( +z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh +zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V +z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU +z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq +zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} +zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU +zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? +zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z +zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R +zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw +zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- +zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I +zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY +z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl +z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb +z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n +zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr +zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< + +literal 0 +HcmV?d00001 + +diff --git a/addons/metadata.common.amazon.de/addon.xml b/addons/metadata.common.amazon.de/addon.xml +new file mode 100644 +index 0000000..d9750bc +--- /dev/null ++++ b/addons/metadata.common.amazon.de/addon.xml +@@ -0,0 +1,17 @@ ++ ++ ++ ++ ++ ++ ++ ++ all ++ 20000 ++ amazon.de Scraper Library ++ Download Music information from amazon.de ++ ++ +diff --git a/addons/metadata.common.amazon.de/amazonde.xml b/addons/metadata.common.amazon.de/amazonde.xml +new file mode 100644 +index 0000000..a8e054b +--- /dev/null ++++ b/addons/metadata.common.amazon.de/amazonde.xml +@@ -0,0 +1,15 @@ ++ ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ Kurzbeschreibung</h3>\s*<div class="productDescriptionWrapper">(.*?)<div class ++ ++ (.+) ++ ++ ++ +diff --git a/addons/metadata.common.fanart.tv/addon.xml b/addons/metadata.common.fanart.tv/addon.xml +new file mode 100644 +index 0000000..0d60546 +--- /dev/null ++++ b/addons/metadata.common.fanart.tv/addon.xml +@@ -0,0 +1,41 @@ ++ ++ ++ ++ ++ ++ ++ ++ all ++ 20000 ++ Библиотека за ÑвалÑне на инф. от fanart.tv ++ fanart.tv Scraper Library ++ Scraper für Hintergründe von fanart.tv ++ Scraper de fanart.tv ++ fanart.tv taustakuvalataajan kirjasto ++ Scraper fanart.tv ++ fanart.tv leolvasó-könyvtár ++ fanart.tv-scraperfuncties ++ Scraper biblioteki fanart.tv ++ Biblioteca de fundos fanart.tv ++ Обработчик Фоновых изображений Ñ fanart.tv ++ Skrapa för fanart.tv ++ fanart.tv刮削器代ç åº“ ++ Ð¡Ð²Ð°Ð»Ñ Ð´ÐµÐºÐ¾Ñ€Ð°Ñ†Ð¸Ð¸ от www.fanart.tv.com ++ Download backdrops from www.fanart.tv.com ++ Downloade Hintergründe von www.fanart.tv.com ++ Descarga fanart y fotos de artistas de www.fanart.tv.com ++ Lataa taustakuvia osoitteesta www.fanart.tv.com ++ Télécharge les backdrops depuis www.htbackgrops.com ++ Fanartképek letöltése www.fanart.tv.com webhelyrÅ‘l ++ Achtergronden ophalen van www.fanart.tv.com ++ Pobieraj tÅ‚a z www.fanart.tv.com ++ Descarregar fundos de www.fanart.tv.com ++ Загружать фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ www.fanart.tv.com ++ Ladda ner bakgrundsbilder frÃ¥n www.fanart.tv.com ++ 从www.fanart.tv.com下载背景图 ++ ++ +diff --git a/addons/metadata.common.fanart.tv/fanarttv.xml b/addons/metadata.common.fanart.tv/fanarttv.xml +new file mode 100644 +index 0000000..f5b6faf +--- /dev/null ++++ b/addons/metadata.common.fanart.tv/fanarttv.xml +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <artistthumb id="[^"]*" url="([^"]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <artistbackground id="[^"]*" url="([^"]*) ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <albumcover id="[^"]*" url="([^"]*) ++ ++ ++ ++ ++ +diff --git a/addons/metadata.common.htbackdrops.com/addon.xml b/addons/metadata.common.htbackdrops.com/addon.xml +index c77de5f..2b7d8b3 100644 +--- a/addons/metadata.common.htbackdrops.com/addon.xml ++++ b/addons/metadata.common.htbackdrops.com/addon.xml +@@ -1,7 +1,7 @@ + + + + +diff --git a/addons/metadata.common.htbackdrops.com/htbackdrops.xml b/addons/metadata.common.htbackdrops.com/htbackdrops.xml +index e29ee83..0531585 100644 +--- a/addons/metadata.common.htbackdrops.com/htbackdrops.xml ++++ b/addons/metadata.common.htbackdrops.com/htbackdrops.xml +@@ -1,28 +1,51 @@ + ++ ++ ++ ++ ++ + + + + + +- ++ + ++ ++ ++ + + <id>([^<]+)</id>\n[^<]+<aid>5</aid> + +- (.+) ++ + + ++ ++ ++ ++ ++ ++ + + + + + +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ + <id>([^<]+)</id>\n[^<]+<aid>1</aid> + +- (.+) ++ ++ (.+) ++ ++ + + + +diff --git a/addons/metadata.common.htbackdrops.com/icon.png b/addons/metadata.common.htbackdrops.com/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..277ec1297aa3bd4132e71aeeafec9e72ccac28cc +GIT binary patch +literal 11423 +zcmbWd1yCK`_a%C9ceelmg2Tn#_2O>9-QAswB*BBby9W*K?jGFTf;$Y~Z@xEg{_oYy +zyn0>L)w|X@XRmcmwVdAFKa>=tP!I_b0RR9BNLpM40D$-iApr1@ABS0VA(oE=gR6v= +ztC+Kyk*k%1J(-%7of$y>BVYrP$r#y_u>x6G$ym5}S%AE3Y-EhUkL^IZzx<;goGVCP +z0&W%J69x+}51(cA2ZZ1#t?dE;ApZSlhY+n`Px%0$Ekxu+0DxaHNH0b(008|RNL)nC +zbNMvW$B}4$zU$)LS`$q+=_P#U5BHB9VKK^wu+0=iY#Z!9fo+mBm^PfS +zvpb|cr43pZsKCWI-Mxy&UTC!}cTXr{j*J}iZ_EGDjWRc#?KiK+6W+L$G$B<SiqH5dwMge<^S93|CJD3BdACgOjYB} +z^$RhCj0fhw%)$Sz5fBbY-;HUA8pzY-3aWwDxcIUUfR9uCACmz@;QWWjj0FAtm;ciJ +z|CM(E)L}9}>;qDuZa1$9@ +zuWx;mw9(g$y7<;Ms^IQFKFQ^lZ@!*LXC#G%#$;2kj|bCt?t0j86IqGh!t#DfJGtF9 +zxnFQvG0BcyST(wr +zIs=|pvZN{38F)|A!mIf9#~ueJG6^078vt1CE%uqJNe4hV;{<}h!ZmXfw{~fDj_~8q +z+wh{TO0saj=|kI?;>f&kvt~7AZV=tZ +zD8+4)Rgocgb(H&?-yrz0Qx+e6Xq7S$9La#~Qb5*D@}ZLf%SVy@Dz8zx-SB@zppbwo#-Yp1HJP%jC8 +z6QKFIPw)xLd)1sG>WtEa0S~g@smRxu$j-_BAv7I5D%L(NtK2H-(7d4dAS#N8ytXi7 +zBG2nu29JS8r!D37(Y#vsD4ojz_I6SNK17aZ6M+vfuLTSG2+ +zKtSjFU!%@m4AT@vzm6z}cAS_XMhM=nWSEgZ&Hp|i>l&&z4Yne5_@r>gA{d8EzYd6^Zj|+G7jwqrF^A0aocJZo +zF`xors@})rzB~Buvd1u0V!4L$*dZ;j%D5D&k~Vzo`qy1J&UcaeKp!C;J8`k +zn1(GC3LCRF1O2TZ@2kgIcqt~LUU}JBs|fxvocB^+s0V3 +z-^9^z5zHMgx!*>r+iIVua#aJ~TrPf@e4ZTKjmR54%kr6(A0_pov>Jtt$X;oG*7bW8 +z7K0*1#&yidp-C9m@V)F$UU!)U-=6G@L_&G)3~+7CMFn;=}&LUz7u)@Zp^ziS1~7-N1fQQyB=UaCpd+fy +z+l!NskrPK{J)hQbU9?UL1PC(dsn_~e=BZ&qCjZ5nAx0$)IBUpKE$-+r8T^ihoFx>n +z*$wvD~iwu+e +zuL*W*whQmhsIO#rH+rYnMSEhJMvm3BAx22KG^Xo@;%rp0f)~}%vUJGot)wVwL(|}H +zfEO_tpW$8SeJ|<6w=>b%5iG%PEP=EL2pVkU?@yb-9$XF`dku?SYXlO_W{$wp4*g;) +zHz+7j+zwWaq`Iu_^B!47v*)lAreYdJZr?;o +zFHFIZhaE(9y^(9a4X=Znx=E(DrOD0f(}Z{9mBvZ`=M^Gxr_idpd}e{KaZEp`f5Tq> +zfK6XUmv5yllTnvkW6T3F`!VeZBSxcxN8j|5>0XNF{+i_`Ws`aIV +z>~$%rpfigHtEpK&_aQw!F6-ro75uT_bn#z%`7t_Z#5CHC6-(x-a{67+H6&uvh>uj_ +zC3bMAt2E(1maO~!jKg7CC*+Kcg8^yvZSQZC%qX%Qg3UcbAps!=BGT?7*~^VlQIbYy +zT%AdxmXu1^JC1UHFzdl%92EUJsKkIZ{$$-5vnC6RWI4S2R9ArX0g=a9i+EByD4WQv +zyWmailv{K0tNR60Rb^CHPwHnB!6O#iG-Keu9LXz`GHkPuMwN@ilLFf#h=9#1NS-n9TC<@QBikh6EfRz^_f9- +zuuFvCMk=M?HoeUaKyHe6LKY7$s-Ln6L87%MiwQ0m-;EhA|1u +ztZO6wPnkQe%5waO@tXqK)!j#tIEXMt@?-!`kbWgC-OOx!=v8oK<#b0!GwpFVdYihE +z1=bvtI_3VYLvdRfLRw5LEa-R(g8ik9eIRw#%M1Re+@Wz4Q6AHdc_Oc{`fMajT +z#Hbx5L-zc43?ZWGxl@^7phi7SXs;o7DPQQ6y5Pr7Syk)#)Z43UaJTqt8G;otK21s0 +zf|kbaV_yjZ>`nzk^>Z)jOSbRT|%HGdAAE^RS`@!I4`n>$GJV +zYt6Vr0;P6bNyvfwc0wSn(chx;VVEI1aT5)y0bIkV-aOBpSw&5Kuf5#jtf%{El4N=r +z>)$C0aaeTBp`z>(IK|Sz5m{5W)vuQ^l|J|W4>PjKVZET@6ZW%If#=Msstaiq<9$Hg +zyH|An=m>tRo_Yd|Y|{yQFRsFKBOZ*uE!@I>jim0z2Z4E%Z8 +z?A{-C0^T;^UXRRILJ(nAmfL6%!c8moCh|V(Cs7RCu_A^$LbvKnpy~3G}OMX@JFxJD)~o3 +zejYNS8438iIki+5SyZSOp3HwU^-bvAD}WyXq?Te-wos*4V+7?ocz!F28XIc7saGmS +zys`Tl8p_h(wx+J-dAmQplbkXRoHtVncYg4_{K}R!GE!e>2W|PqCT*i6Gzw5Ua|?Ft +zXmB&*&M*Erfu>&);3heU)2`{s0rH^mjBGwY)+qr(%F!;5?M`$K19#cgvflxFXh=1K2&LrM5>8 +z5vcBb+gfo5W<%m!S+>X?7iFQ-`$5|=yzw-~cDaX>lts((hJ65_BxgvkNwrz1i1WIh +zU}tBL`Hry#6VmKP%Z7s+>0VrC+>dB|3Q0Uv|LDs;_%i`pK4I@c4B9Fvzs6?8uVccJ +zo#ji|-m5pr+OZW1budR6Lz7+JG$sB0rZ~KXcj1U#+atZ8dE0K_n2?2mC+Mmcc|0!R +z+gx*f*~rG6tCb2q2`P9TfmBIGEUIdQ6uIoO^U0CdPQgM_BeTw#ie|y*Sk3zg8%ALi +zwff15G06%Q7_UyIHOlO>88l10Xp(oyl6G#9@_4csBb1#WEG+xmgAI~FI-D}fh3QZG +z)6+=|Pv(o|3B$}SO74_jd%F+;AvpWuo9MZ8!SkAj9hLwJ%Uhw-XymhfYDx7uF! +zTf{|c_3+-dyq*w&cVx3U8z#_4LnE}(HjXQ;LJbzidZC)xpxHTlg@mwaNqfkc$No~! +zW4yGS%_P`XEw{uBO^_xr`5kJeIwAPxZ%z_stwNGw+to;EvOyMvPt<&aZDMwlQ@)1! +zEpym#-u_T6)@n?o7ksbpa3$}p2bj$o)<}2FB&OlPmzg&+yI3}o?CY|kw7{Txz-@VX +zqiya$I|NT^A(TRB!Co45w(XU-f!We^FB%;+7ezrvY?)=f(evH#1_Gy5)g{_Vyi%51 +zYqjs`FV)b{ce^^bqE%4@g3!!*VU=?lCczP4saO$#vOgO+%qO%y^HjPo*E@F7@homS +z2usBnr5K;JVii1phqB5vTcvl0mTrkU9OX$go&UK!!cu&hgd^u!5F +z9slC8T9*Chy7hWLXmYMaO>FkM_%zFo#hb?kn&aiLm<&=0gH32_BRP5>{d +zyK+!W>iXqJy!kQogrsLtlM2H~F^EDGP-KS`9?MRuTDO`H-rCJZug}iVyC;*)xPN69 +zwc-~g?}$q@OJHMV^K=-N9MjRa?q3ex3%&e3dV7;m&d9f-l1!~4DiV~qU9t_I_3B^q +z;EO6QVpCzz(8@0nS9Oeo{@O>d)AF%QN{?VIX>IeJm??aIc`G1OQcs}bT2*2X@PDy0 +zGTW2T)N812=4n{UYvFb1i8tMZGVnR)d7sYD^tngjQN7#dx+2EJ)Rv60p5(uWtb}Z3T&(o=2&m)u1Pp8N# +z1=O8{t0m8_-hQ*6zVoG0zt#OR45czNlTiE&3hHMS6Va%sJ)6VX@=t49_mN)c_R5Zq +z$I7Oc=lg6VXdP`_S4VZtYVD?~BZq+JgRNdU(RP^qMfG&fAesJ#hNkn?$Nsysp92GI +zV8@^x;ja%{851}*3ke&ZCbn~7tr +z%3+qdJn&U^jA`8{es)3gXCwCKyZP_M9rJTI!cJnmf9q$RB+LI4wRiygfLW?;%#RvW +z3KW^NLO1%*KQK9ZnDDTq5Yj8-;h|_^ +zviai0gFolF&gXH?czeq>Z$n8@3j*_@ee%7K5}Fx&bC;GD=SPLJsara8pFU#fJT41O +z=fb0Y@lz@?{YexQ(cyNGStVWI`k<6bsn>l?65=~E1^6m5^PV^~hf4Oo)_T4T3o9eS +zlf^uHOYhn)syu;lW#mx(8RRZ%t)t9acgzUdQT!th?)kd(Xe*}#D6R~@}e8- +zGyHa$wRGG4bMgHnPw2kk`$ZQ;!8>8 +zf01EVFg6w)kA1P0>w?MOt|A*TRw9JZ_6b;XcvS3+&MexnIfd<0>ZoQIIrqO`bvbVy +z<+*S7=p4Y4xN<S9zS4T0>vCo;B13!XM0pP*Hn)61dLks)TpoozwqkE{{HugL|P2WY3p{kedIx)pI=c$t6RuU#O2gf +zR>T$6M)XeE!vmbLUQP}lZ+H@eRf{K!|M6VK#w)5yK3wHAl(2)lI6RQMf!AWO3W6D%!jW-cZV%{CX=HV7cX`+?QN_AJ&rSv5n@b82k#_5vo4|G}WZ%w1 +z3#q*zJ7-S-`{iYbu**q{9ze9Oi2{;iP#xM7%;T8KNglMr-8-J1LtRffbl<-Lv7hmD +zoqbei5n#`Xx>vb4_L#Vq)APDB7N! +z4O2VqYU966cg}NY7;^7rDkNU)#mNlz{Z3^O=|P^w7Dt_Oepmi!K;;xZNjL6 +zFzE0kyY*G4M`s_Ce4X4b<%BRMS!ImN%NFgr?JQqRo!L+8n5`vz0ZYP0I=k_8tcl3kO7i$`i)F4i~7FQ@@`+G}H}za6ouCu{BI=PNa<3GG)c +ztII^Kmf}nb3WZ>MPIp;r_KxTGN0TeP +z1y+`=Z7sWOIU{;8vXc)iZR+M0MB|;^`EGFWa9p)iX1@1FaLalY#>#fL*y3b<^4S>HfYpocMlqazlu_^nze3_G-+Hq +zm9Vvxh`o38RnlL7h$7O9X4vR>ed&BlJak09&nu=HW(@@!YcqQ-U=0?YaU$;Jg+-fK|9#ozGU-K&K=?_c+$t-kL8sSCpL*(Q +zsz*6o5}96=jzn2GHQ@QHt9xT>zV1rP?P(Gt)Y+X}nA5Kn(Ja*{BezYSB)>V^yHf^S +zXfMsm#(Ya+5oniHvb1w?m-6Y5SA2x<{Jaeb@Il +zqU%9WRa7NDu#yOBQy9qCP&oCHSjJ7%KFT5#(m2t{bcrIonMVUr-KbJU)Hv*5T@{)k +z42mMVjq^`XS%-Fcw&^HVma#9lEmL*W{P(M9q}SKXwts+naajvn(s$CMt2g!X&=^T^ +zkgDcuKPjZ}m_M0w3eBeK&Nuuq*y848$Bs`M5bj;_h#|O6$Ud$Jl&#Z}v0vlu@VvYc +z@L`|Q^L$%YJQ~O^>El*;%efAPUTP5ZIng_{+*QBJj;D~A<=zg2 +zOsM4oFUC<&@YcO7YUk5-m2tm-oshAtSkL%ehnDAV>egB>yr^5x52t;+yWJ8ja$vWS +z+3NDez=%41gj+@6=z1NS;}faJ9PnFB+soBghbV(ied4{lX?KobvSJYH(XT<{fvDgZ +z^v8^)8Y9uboBB$8+@C)oAnb?B)M+`>DI0(c4qw3E3HWfYgNGK7=%7=3oG{MLEZ(0q +z;g`r`OO`r?CQV2F9=_`JHvA477r1ExQXL3F(E5q;e}LGT8b%$#zOGxYcW|D%j{P2Qa*QN=e_c5-#D{|@aA!Abkj~5oco6z +z6OHOHh)rj9lcpvObq<5}WvA;elTPQTO8ZTCkQ_<@+u~Z@Pxq8dqiR!<6n~=mY4U9G +zC+f608!FEZF9HG%uFU*EAXv)QywR4TVhLz}^Vh9j0(M5G6Ldt4-V{^>0-#kKv%IeQ +z>fJcODLS2V%J}9FBZi3Qk|8{Dmax3#t=`vyW;dl$AU6a5QUcb3#nPP2Og;QA{f&Eb)GmaOf(mpcN%#N( +z2-5d&2cuB~Hl+UW_EVtgSzK5cbr_gw+)=r-PvhQ1U=w^hV9NO_2>lfr<%t%wK$ln( +z*rKph#K+r52u??0PtyS_mCi5h?=z%jO{ezY?q(E~e7|um8M0&#Pqr=j4M^y73MczQ +zglr;_RwHV;b+9AcxS)}e)F(G=pfYEMJ#Lo5^64rU0&d1tUR(R&a5~n?lOww>K~%YP +z{>uGXE!arTqCbOS)SWM3j~Mk3X1f~-se+)l*1&Im?OE0!pnd1_ZMR0N+m&cGn&cgC?kDB$9F?N;ulq@ZwIYi3khnh3qcqbNp^WQ;G42V!mm +z2n15XgQ&`t*ohKe_Lw{4RWNfRqxRrMi5Qb|zyB7Eg(gw@Bp;Ryx)=(K9K6XvKOJM?8TtH6Li<9d6zTRf4}%R&&~w9t=alz`==`sek@y +zMghj&dT63kAGq3Mk~9KwYsy92Fwk1@yGU;3KVs+Ra)wFldWPJB|IuH3N$81=I4l9xA0zk+;c;yeR3eI`4(6$gt3i_VnNoXFQb~WcJq7 +zPIQKm4Y`IrzD?y0%%~hTXs-KAHrFkA#X}Q%5&N33AHQE`XL)XA!P2o4IzfFF^@p*E +zV5YM~mB_EFWk*2xj?GhjO+b#_-bs!=hDDfOc^buqjvTT7n?0pcVzC~nDV*57l~RDQ +zKt$c=uEfhff!SLpF&t~i1@`-hLY=Ap{%!GlXQgm}UeSmSszBj_|0{jxP-@!Xh;1>o`|FsTZ`MC~NT6@2v&K +z0XS9X27RFkTU<7(Z^*=lw$NJ05{$7Xb$T1Ec%;)VKeEWZNa+m)bEx!@9Yi#QsVUM;4IFCfpsCr~)0F*vrZT0lZ{Mh?5|a}P +z*&;P#le>WwD=Xyne>{%Wo}-95DC-eUJZ_mYk%d- +zyG}HmWB+dXwMEOs4-!YKPhbtu5OU<2xLD=IMkU7gU?>wkHWa&>AEKg7oV=HRn^TcR +zna{>%G-pJIgM4*dXR$PK?r|2FsM`#gYJ)Cf>8Ay8i9Awk^y9}K4$l1zShDzp5o(Q$ +zoiKs2urz1f+@SCj*@R2R@#ozYCyiV3g9 +z-0*ZAVMgIYL%VneH-kuPK;YXjb*ueXDIY%O+lMk2^_%Ye)kGvnyAgY+eWLF*4OUi{ +zbrypYS>po(?!j5O>LLm{>8iiTYSWmPzxC +zjY;o2q%UiJ2y0*%Ez?~D>_pSMQ^v!qt2|b=h`D1QR;mD`Osn-ad;V%zD-R6N7yh^3 +z*Ye0&)kBj~w@<_Ft=y3%J;2)>k>x&dJ@>mG6MWE2!a_`gmk9^iiesbKvq(XN+=e%Y +zJ~4lpic^^UG2fS^paA>R#^K;pGPfnx6hktc(T85r5m8aWfy=-{t4zZ9-9sGusomXn +z>suIXoX!;FBPkm@#+{u+v!NMDCY`xFH4WEw%V6kz3-{+Jv2XUim!T&_ZgO&W%MHmN +zS-LL?OV{?QZf~#*6_$w{d;^$^b|-1+IQfV$T@AJ%m}zzzO2F)~kEx<8Kt4XZM`!q+ +zo55(km1dXlY5dP|Q}7UUAXKko+DNjn&L?XU2^^$`RtUdWAY~c|bmnss&#o<7PKgp0scNCA5-#&bs}s8_tQ%qUFv4Rw13!Y^BkqT=PIv{Ycm%DQb^95vb~J +zs6_z+GuGL0s#`o(mG!eX83Jw?or1rikqY{)G$J{4ws#g#E=SO&l9hpGM3hsj+gMGv +zM0>^)7$D`YTb*7vt= +zi%YAo@3Y8;d0b9Ns3??Wwq5fcwhXD@LY+~?ZkJXTadOIkzo8x~*dkOn-Ay3jW9oRe +z*VOOIU}=1ZZ6RIXFFef9Ly<0-k5ik<5QaHhKEp`fJ6B=#Y51h0u8wmEsA+8cWY9QP +zwD{~Y63ol3l{+sfpGlaWUjAv*&tlm5V4^Y@?jj)}=j_Zd4XRho$;pY$e9re$V(0N% +z%ffqkYmz^{&GM&DSfCb6l@-5ppXU)Kst9>F@0_)|+}LJD#`g+_2d!GuAEk|r@p1g5 +z6|?fIzkmMHVQzorbh$2?H>^RJ+a=GUV +zQ$R-!vx<)wlZx3#b +z+aF;Vom+w2pd}q=iXXOU-8&dX#BHUbH4_t4)u5(EoWi$wBC=Qq@2pfVpUO64_ciFwD$=lW3pyfZL*KLga0*#g3{n~ +zSDz_>RAr>>x@i*AKc2eN;I`6$$Dhr3zae~RSgcXSE;@Phmt+tKMJ>?kvTfOafaE=TR_pF2nd2%VV>10-VG=!xOH_Dh5BZDiK +zrb7rGx#p3&=UAJ?g2mkM;=GN!@O1=8N~5KTA`e3-AqM%&ja3B04Kr=L2flfi|9-f6 +zy45w=VNaXD)VJb>`4uI@;lI|BTW5Z&+pZsE3g^g`Q(*D>GLN*j3JXKJu^614(dwqh +zTicXynoAz%QOgSWCL*wq%>U`;yK=tuN5#_9|E(c9nkI}VU&*xn3URjqO{bM~ +z+70e-*#_eAhMbpBIgAKBLh$OufO>ad!+w2r<`4H}s)g&v?RaqMKoR=t^6*XO0RcjS +z{J2F}cgJ{~!jhZEYrSVSG@b7A{0ovO4Gj%J%W|_JPs3Qnzwwt!ViOQAiBrsE +zq){{nfO}cdPT>Hqx(gDBJ29VNcG0C#gU*vf{Da=?i-;kIW2cK_;Q}MS +z5jvx8R)_dQ@W92o1U^&c8sv1Q(;fg=O>by-A;@-e!}tNF{ByDKh5=MJNJF5S4CoDJ +zgjdMdH8~!HB=USk@^8X#GKYAvVq`qfEe0P#PpzrW@RVYb*`l8S|HwlL4~U`gAlzw+ +zb_QlZkAnWb#!WF#ZHyrKrC2KHz +z6Vb_EQze0IDuA*jzz4<|h~oGkj1%w=Mhlpa+_V#gruYNjA@e= +z{sV+ml7}eSN356szKOVt==vYoD&fB}5G6$bH8yY)0!E}E#lwG$M;ZQW{6kzf=wnE_ +zLApUzn4b%TW^v&Eb@bnrAeF|2{;?4Ncn4@AV9aD6kplip1Gd8tmaT;C@IO{~gL^)# +bECU|GNTRyXpEy4L2nK*86vV4U4Z;5nBl^HI + +literal 0 +HcmV?d00001 + +diff --git a/addons/metadata.common.last.fm/addon.xml b/addons/metadata.common.last.fm/addon.xml +index 981cf95..8bece1a 100644 +--- a/addons/metadata.common.last.fm/addon.xml ++++ b/addons/metadata.common.last.fm/addon.xml +@@ -1,7 +1,7 @@ + + + + +diff --git a/addons/metadata.common.last.fm/icon.png b/addons/metadata.common.last.fm/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b253ec589717cc93876db82f67ec84ffeaecc583 +GIT binary patch +literal 14392 +zcmd72RZv`Av@N`wMuQXF2^xYEAh^2+55XORyEpC-+$HcK!QI{6-JRg>cKiHKf7N}z +zbsoA_@7lKJ+G~z6ri3XeNTPlq`~Uy|s_a+^U$1Ulu@J6VWB-qDXlQh$OVfuK&O*l)6k +z5NtrmBU+>Y5Rw2vGE-<&fE-vrf5gae2T)=J^l5$fX8=g%L#ihT&`zMh0p-L3 +z^ZSavc|8gMIk7lUYp-A3#?i{h$2p_x(exOPI^f?w85-`q?M;-}2?4;Clh4!}19J@_ +zgclxS{gz9825YX1oa1~SVOotYR0rf7E^A!d{mk$@8$k>vwfS&k4?u<682%Ud-O&wpLik;DbR3rKSuJU0r~xfWad+^v|*Db +zJ@$?=mVLBXTI4lb{--dJxX*pm)9=RH8w}52fej9z(oz8A8OvCtV+6jFrNz*6>fF8u +zfU6eUu30)nFvL7yYr^&YT<}#ghZ=yGO2^p)fUX!7lj?Ad-~b{3h~@avR|*r|bm22} +z!V`DFt#%>5=yL{&Q1y0;V2FG$h7ddGe=hYGp$i_XB%#-5o)seb+No?F9B+rl)UDQt +z#&3uIWPq5}Mc3+w1S>p<_|br3ITU0Vu1OhI{#A{Tkm*oieQ1~(^t +z(xH}+Ka%s$!DNX!`f`kb=m1OSKYRrC-d`+C{XHU8-x!eMjYg_Im7|t1C_gJKgAcx*3vX%KK9}p +zvayC}N-h?M=Q|6ZXSQuOhwa~k(p0Isxbepznf452xm`MpKOKc{BQwM0^dsw`Zr$0-M?=&819n)LPb +zUO2JC9};B}X%dO(nN|N57Zk4-BdcAjji|=_)m8B>mr!F@+4+k!n^dA!oT+rILZo8$ +zm$xXS*sRD_Rq#I_t=BMktsc1^MbZD1bE@=qTKmb7jR<%?XW34OUY{2g=ERu7OuOu9Xt_xGry|7T0a%uN}_1O*Pu|rub_FV7d +z1zKnItu{eFxV7>%)qd#INR(xkQO~!OwG?6&HYvm_lw{4D^;BNg57qx|AgJ71gkLGI +zx32d#Ff+t6Yv?QQIg4+L_ipx%dgVtz4Ov1fA^Ab#<5=r}&7;nz +zra6HzvB`M)z;$Run5_Q@Q?dY4I#K`HVB4;Y)2+SEmdEsM +zW_nF}_i52e#Tnul>DNpUZ9xCl5d%-`D?RaKa;7}=$vMzrt~jaVs0k-a!#9H?Hezr*CE@P+sHefcqz<- +zI(F`V#=CEV3UU83VKML|3CV>jd`q|x#-K04jikQ%=t>>^!M&TL+w2qb6z5dvqUcY0 +zQiUridU=nylh{@ccd9=2e1^TIK-#~*TjfyY*3x;haMN7Kt=af_+E@ePVt?C<6jR8@ +z*P9)g?VGxcl$r!pzxCNfG%%AUA`Ds8{4RylV*F4qQt(gp2i*caLbaKRhH1xG*f4ie +zN!FLK)6tsYmET+$=h^S4Slw7#arODZvKoven)_{~mfY2R_UFn +z(_7CemYixNm;1EQc*tA%>2?kKch!Ncj*-;-uruP&VGC~7imZPXb&1!oco;Dm*j +zW3S*Pvq^>5^{w?WkGM+GSTWJZX7j4Sx;A?C(DI6Lf;}ul>PxVIiNtN?#dacf2;lXC=jL5U~?(50i +zigxS$tH4nEiW*2we$I5xDgMROu^dzbO1aJenp@}t6ylEog0ao^|Xvbg!z+O9op@B8j=H*nW{9B5z1 +zM_QI#Y0t`96DEyv%U#%b8ibeydJ(3icT0$&}8Ag<-U!SF@3*Z69)DXVtw?e?IMUU3Dcn&)Yy(-1Q>&rF%Djth!a1EPRe9h>w4V1*crU +z7_l?1K=mfMk<@p20Pvs&07w7;JibH6LjZ7Q0e~ZY0N_ah06g0`y*>#5U^J2z6IOLw +zKFM@VQ5ByLQJh1~ETo-a2}3f*ppsIJixU&-j0`W&ZX70@Ctj#D)tKUFkznyl0ZU^f +z5>v^>ee2xi%d{!Few|tqWp_f?QXVfsS5&-@a-OI-n*FQdykt5E>;Fw{OBEIt2|_Lf +zzzV~VBVqx0soq{w93wxKWa9OcNj*sdvhUenoBjlo<~!>qG13= +zotjhmAEg1`Z*obQcv*O^eVW?YHhkka&P2-RNTrW+*K--mL)rL!CR7m0o1zRC(}t>m +z2;JDBw>QnwHAO}DJH2}L7P2EGo?qVMmABlK7st3e>F3gbBz)SZesp6$U#fA|p6Lyb +zq=5mF{kz=tJnK~%CX7ps&iNMYC(jAT!kr7(Dc3XBJM7F4L88hz9Zz5vp6`0@FQKJm +zKy8#ZYmPFq(95B{jzItPUmcZo1$mOE*PP-AO +z<{*f@r+z|3B}~9=QtqgDH^hC3P8Npwh9gYz_Hf6~NPTp_T%r9B6bmT$sSlb) +z(a2*b&Z&N*f~fo<=q}RhC$6LgVGKlRGGT0!F+esR2^DPKV3o5cTllp7USTIDzD?iW3s9n{%npVeiA%QI5f?LKYYruLaUowY3&Y}Age +zOdiCX+OceUb-2ULMCNJmP92ly%(&i!d?b*L`Czh!xe~duN65R%efQI9 +zg6X@V*XXe74D=ao?E7=A_hI!EGPKhIMYdNx4MF~V1;5#6@<<1qFQu#+6v)M=fOwPh +zRk*!-e&^YsB)18{3`+Q*>8T(kZ9Fj?%OlyCu%k2yLj4S)K9fF;RVqGRpfY2g=5}x3 +zPBxTPh@tJ$ue10TwS~@|`;trdv{}C~BNKD4X?EV-biBgrYHv{IPFvSS;^kJOnThZZ +z_Scy2%b>CQo$ca-jhoSjt=W$dsy;ne_in+8D4ag4UtLUvb!K=_Baj;2+up7TaAMjq +z=7fw=jix(nlvnC_oI<{ULr^^%TBo9Q_kZPbaep-?pCM0AcJ>dD~`onr9w<~R@KT5&psGa64XrSpQUQ{Le +zk@i!}^O3;IHpH;wSjlH-T!^QO;T*K4t!SK-N>Bq7eNUK4uG?t$@GO5D?x +zQHaHBl+2j(P|?Zb%-VvE&$ks?L3i7l7(H&{W7}CnDtS+g)=Uo_8z;-kw*CVXYq83Yw8kwrr&bYQI%1Auw|o +zyvFu!xH%t1#AMND>eqRfj1ru$Al&j7+);9~p4QRElQy*-j>VBSb6l1aML#h>kt8m= +z>0R}htr%_$)X7@wd*w^|EjRqL$+YOG4RVt9up>I@l=Rxi{yrUn{R(D)o0k1LqG3+` +zabV9}8htg+%}nmO{`NH1Z9{&*E&SoQqBh%m|B?|Fw`9d*@i}{PZEw`+%q5@iUVm2j +ztiY>A;gneP*)f^jd0JG`J~r%r9e;L0uO7V3MSGbJG* +zr{323c&+Y_a`g5VpO1$A82m&j8M@DCnCnlnSIjii*W?<0c3+kc_kRqoz7;MvcXC@w +zF%0ndY^y=HeYcM0p<5$l;7)AUXgO1xQC^!?Q6{v*pmn+4B<}+7@Rn0ct5+V#X_v97 +z&xm)=*)Z2{!!!PSNPuj)l5_`ZQ?q#we4cQi&GPg|n%@vU?-PtqG$u;E0U +z^gL5fOGy!&u`91G@#@A_2v>Lxa?44*+Y3;t)O@>}Rp-B# +z=mLG~)!zsah7`X#wK$&(V{xcM2H0L`yPF!%$S~iC?$ZxycWlEb*)u-bwycf?b85ov}Qu1elISqdg4zYAy>3#~& +z)TFLGZ*oz?5H}HDJm1vag!27JwX?&}dT)oh{|N{DPfQ$3Ykkn(p&D +zE%amMhN`Q*r@<&`?`ySWlg@pjEW4XjG`SpJb}ejr_YqG(>&G!F(RH)(#TBjf$x28d +zH{+Z!)UK(j`0rn}F91@yUQQ^GEPy(hABOTXH;1i{F=uMTkzN%pn6Rb@f!l_b%J(qF +z)vvUzS>krEO_0H|nVLTZio{~J2?80*9Ecr`?9cAf*a-H>yz +z&qNt7QK;vev1NePchk4%rDa+_pg9Zo)^o!3I{HRwdEfe$6$WlRHsG$Io0YA0+ZNx~ +ziE^?KdwHHDO2VzT>Ja1kXZSV%8 +znTLLTPJY3v`-5mnZno4wklm4LH*gDu-`&Vs&D8WlhW>H>C_F)dhs)GYM}gmrY^yGw +z(B>S?26zY`Xpg`w5yfKiRHa4JuGpk~ptftg!AYR8V?5T!p{uB +zMvomdUPU{}zw|O+#N__ES?&NH&}xL_#nJcXfDW%n)OT1pzJUcjtZv6bHY3VF;o +zHT7{Vq47(9f4FBBJ+bI*WV288+87xFuwN;83W_*N%Tp-7@#4Dwt*fLz_cR@L|Hp<{ +zSh^`A+5kLF+wr??^IHE|=p}3WF`^z&M{W=cJO5DeUbG?u1=Fb9X}ZiP|NZ&(HNv;j +zOun{%{z#ISG>9XIr|bg0?0bjLMV=RUn^fL`a%$1d^(o}%K0Tdk^*_l72Tf%*vPRut8R;4KwIcy_U$`6DNZ*-iB;7FP-y2G*8F;xn6Pm_ +zduDThtK;Q8rcDMn{}L`AjX;*;w^AN47f*NG +z^M#yYomx9oho9d^c@9AxVy(8~xWIc%Rs8c{os*62>H5-gSzf*<(U}W}eQvL(?Tr`j +zJ+_u~#t+EHNtjvB+#gK|aYefa#J2`fx!<9-=eczMOpdmc`JGm7z53&R3(us1Pjk`r +zq+B5&yrOl9_jy2bMZ3kN_V!4|R1D_ZGOiF;r1=|HyouF>5gUVI&K0OeGRl=N49Il|sJb4Qmh~f6cz6tv1#wQiH;`>Abnt +zSNpzz35nOkP!-x}#=j8*O;CO6-~um&m3p2n2~=e_`wlTrS*Y7dD4QUV^w?Y;n#n8I`Xo*?XmteB^HC-mn_7_ebdENyA}z7y?s?VO(b4CP +z0m^rB1#oBYC@|*R9Dmz`zKm9f7wIZpQMwXOffYO+>KiZdIA640`w^7QezBBLpN^TK +znMuchd4}ieB&2J_J)T;aPzO&(8p*!_l_i&r%w +zY9a)E1rCou3>P@?mw=X4^VkR8Z+udKlDI-}gU)imb4OHWCc1 +zq^?mefJ@!}EopKK&fAdGw7)MxPxlZ`CjR$dh)qPZUGCdTbde{1KF-v!e{077%=+O! +z%aWIyhHQD?^Tz;50P5ydPQQqbr?)FwevVs86nHrio1wGKmx@4X+iG0$&7@@Ph>)9F +zdPDoC)8#EH2^dPJ&e=W(&E{eZsEf~cMIKv>=dD4e;y8$)NY->UYaM;E#R2E3&_N`V +zQ5(l-(q)!JhDsNsKFWy!!fG{#nso0Q2PlX-lX)Lzc4%%?wM^x}su+K!9-2Quxev6z +za~uyp>mJi1zV)=8vCXZI9uOyxkZOD+lnt48o@wU{mr11>BCx2hXvp>E;SwvS?3UJ!Dwd%?(fI +z>a;4#CG1n*R?w8ydVVTUm!xLI6WqdSjw1(a@IQNq=4#K?RA}?mMG$fE%yX=apV;u$ +z@IJjjBc1-UHdANDfAE7?uH1XI#@t*jVK|PjvObrLKQPTe-JZYD~X5L^KKKJF>KhdPHq*WB$&fodgkg?t# +z3yj89i#kolSWD|1fr+`ikdqf$c^)SVJ~F!Iyp=3bFRZ#~UNfTQ^>{!&&(GoM@KinZ +zxkjIlC2c%v&eRw|QRnp8{VFefoTTcZ_>4w)V9){-i@p`NVS?d+{6F8rXU&(1|BW7>&+1kd|{t|~vP5xC0P+5j&66$fJsQbE;3KDtDSgQ?I$?*XJaf~X!uu76a;fk1d$F!t2~r1Bak8^! +z-j`}@=gL%){%+k!c2Yc())=yWn1;xzBBP*HXOUpuMbkk(;pOW4^S$O9FRPew2N#Kp +zQ?BkEj=My2qK5hQcdgQ&nXhYIv&I7#H6)_X+7th%%>I+qqU&c7lh3R_*kfQ+$?0h@_lF|NhLm@9ds0|rDlzdd${6anchIsS6cqcCM&C)W=8)w +zws(TU&6wJf@n;Y#_u^69xvZ)}Y@<$cqh5AH%k4o0&QO}?MxZofR9`0)H115YE}1f)=1&0;FY;J1;gx}cB?zPU^8&*EKmS*l2C%%?_PqZ&zk~?BYofi& +z_#1t2o7Ou(>cBEa;2T@S!=-11g$*7QnRqq!czTXi?EPp&4grxPZjXJzQX>zA3%{kLmctf +z4-EiHAW$KsH#turT8o$f2e5U<8(HuL19G@Un-pb)CZOVnSG5S@u1`ul(lRLcEWv}2 +zKfiM6@qq}nZ1!M^J~ucI5CJl7lRtU(&o4Wqz990H(LFm963gQ?gcOX;WbOT3rdNU2 +zN7|mK%^`@8^vJ{JTq`uWR{w}t72E(DpC9R}XWf3|nNN;Paq+A}_F!%1G^E|aa{CuS +z?jnOK3+xZ1r(JHnr$KAQilJZ@&C+GK*uUZ47y6PNZ*obn4+-i`?j^pXDOYR`r~f$w +z?(S#_L?Ydkz?IdQc@ZyG+8-RgPE9tgS)Mwj6%|Ec0HXcw7nxk8T^3@1zA#r<&~sFxto~yFf5zGWGJy9axm^4w45CB!$_ZeL{6D?QB%@MgQXGE2;vWd +zCL!jhs~BsvSXRA)&S5ZrgV22epx<8u_0#SNE9o0=t?-4Qm|vG5KwuP#Dv8{Tivq-g +zRT3_)+`6>GZd$c2?C@jNG3_mlJIPNr4SI3l_4=X~Crb=YAR=g7E5KHpzxXgdIlwkv +zMzT^;hAgD)uZs%)R!M+Ls-BGXy}IL7X`{|nBUxBe8#U4|7ea+Ffz^5+stZD2Q@W^q +z&i=yrRj?~&U=1@dCi@X#3Nz}0i^m@c1_XdXANex0g-yE2^brwV`Y|wJAMg|;MaU2L?ra@6*j@2ZSDsE?0zaS9Z1X&Ck-n`Xfs~taOb{u +ztCx2AI2{$*_~s$3Tk0=^>cHSI2}l4=Y9xf=gc{BkuM5~jq^bF#1g24fgxKS#5qu>P +zhvb1%0&_qg;6FgH=G6fJUxmOS5CQ=-tOp4mP(OY}BBr=~1{YZvu+PB)U}S)86Gjd; +z6D*1$@()14P&Nmu+by2!U33Tr+G(2Y4dw7>JbReuRw00W_)w!%vsd><)%XQoRl1Zti5P`khY +z4Bvb-30uKSh5k%+t244nmYbAJG~TAwu0h(S>m4uq@%8;R7t_#2<5#nNr-MlY#J3#p +zFJtV}*}gQkr~dw9vX1*cxLhs_{^(P%uz?V(*~g_C!I6zt2H&3UNLO8zl{(x_a6zHq +z?fEGBdc2AX>{FwfeDh<$zO31SwQgF6f%4NaGd<%q<_p7*M{*!{LBLq(ZuIahVt{7D +zS^F(m9O_vz?z=uV$#LgRl(w(_t*8;~>)vYP;~4*9)AP-I9}SL-?msFfKc*+|mA_Ctc0H$bWAa(*>dw=W(Y#+vz%u9h>CBfo~@+z&?p@sd{fAJu)Z9Kl4XKBfXvtCp4b&$dI|K03D4~KMKRo)8nxdnZ2 +ze3!lfl*FTm{J)Gpy+$2OZ@8ghvzt%e)$nj-^RIDxq||97k20@=#}gxKPYB3p6~mM3JC3gm%(yf#DqHvE_1z4FgxQ44<8Hvu@L%) +zfUI?V?UH7G(K92K{ouNBgn5?p)l_|sX2aWRzCmSgmr96#y9xe;-^19OeU8;Q2TIY_ +zD`*41L0aqr4w3l3g!0ppli9Cl0@Eu#-U^&9FxCsSu@!b?I^CBc`he;#7k*~l_Icj< +zw80Q@rs8lwD+NPY+&V*}nBBI#g|@5Wl=+d^Adlq{#X^DiqKqXu?bi~zGPx8x@%@8% +zcM+@f?Tsu%8h{N0`dX5J=j%vgAoguub|_{YS>!>Zd=KetH{{Hma}S4tKt{I!dObAh +zi%2-=@pP=1&-eTr`~0rr2Q4*CfxxBE6ECwvDn&S=$&qE@-MGPlv79ISWzsQ(we+59 +z%|WvNxq@CR^-YZ^VYM~#UQgQN0ZlZ4t>D`@{{X*DDUc0x#H}!F)gLn!)=fpYezwrk +z+E9>hKE^eL)ce$wjT}OkKka4L8wTdNh8GSd$9r*U+yLx{z)vkYEZu;9WP7@lsb$Q~ +zn#BreZ4XJ0+Qd%B?=X>C2p%v1q7df8w-xrnHtXYc#!8=$u#vsmwu4z5I%5{mN);}@ +z&hgoDmRgwm^gPA&chpJovh7~gEaI~O_!C$s(g*t!kQ9c-Hg^2?6df;!{QJ7leAs*fJIT<-Wh +z7n+P*?nzA4RjCENV)DhUxGAXjs-A-u8ay{s)_Nq*Pu4n)`Wg~SBO7J=KRrwyAovv> +z$DLGX&h@;HH0zjU)Lg$fHr$@+zK{Kqede53u!egw>V3jD=K)gkO%=48*$L}pgQ5It%GMoe8`?=4`waph +zWD(oqd9i4H%0o1lXfYvhq}OOD8B*gCLsyY7dY9)I3Cw0v|^ys!=j3`{yUaty)7 +zoMy16GAt;({w$%BYrjUbN{)u+QycRJAl=vfCnp@MiyCom2V?a%{L0rH*oa`E3Pm^X +zXI`pcB;cny|MkHsDGQ;q=th&PYsDX&iI)&r^{;SGFQI8=-V3uK=N#d(uD1de7p+yi +z9w?3YRn^<=isLZ9NID91;zL^fsX21y;Urn;!=WOu&%n1Qk~DR3ek9;FF)14;8FS3V +zW3hdjgl6p@wMempv;K%&*Ih<@vV123AeQRlX?8>h$YQIdsm+;xfW@@Z#n_2sDQ*>H +zh{IadnkoEm{f=3?ft32=`69ndg0dP+IQ8ld?zr*+jL_-vdHNnT@%Gqucw5iF=|8r~ +z4tr!U4th}#02IGHyR2m}cbz-moWc>e%BmNgUhTmD%&8x}tkCQ!oo|d_zN*mMezp(G +zH`3M~m;vM#E(`!Au2P_VyTGm;lgWhBs+o7!%w2OA)xvanN3@!(x7+^m3Ah;7Q+3$Md>a2Wv^5FkfFyO6N*Ft! +z{IwYl*qt>l9RmZ_BlUKwy@pSgH_n2Nc5I)Gb%{Y;$M|fVm*Yf?);~T}=*`YbNlR}b +zxD>IOMf!C^So=YMF;e3&EMU}S!rWabz@kcy0i^W8!iSePvF?REXHo_i+#bOL{b$}d +ziXA^6heu*dOj)!*fVUni7@5V`d`i|8UWQBNcV{Zjo#YHY3mWi7{e`NM(k`Ez4A`dq +znPqpHNXIG!Ymlp_5*G&tYgy=Pa=b9(a|Uem-`4xIfzy4jnRO|(h(|5hWk#ZM4beD( +zaiL4wMOeVW;rmTtGzt~jE84&Gmhw}ymB}p(jTiWL%*Cz*!Usnve>cTV99}w% +z8^bMTM)@cNzZvPsA{QJ=OJjY|hy)2j@DK&-{&7H(tcK!UKv!c<84EBezsXSPqjEX- +zQ8?C*^{dl(9K|1bliHHNHEI +zjlHQ^-IDNDw?8hj7QGuV8WN$2R0q>hk|Rg01;cpC83KR^c?uv0_^YA*Kuad^*ve{4 +z*8OXWM`xYRJI?cEtKfKA*JHH7@beRY)Oh!rJwPK$L#}_i+%wHI!R4D@RY>=V&tI5; +zP}~!sf|Y0f3UBv6wcLU25 +zH2@pMobR);j2z1sS%N`CQ#)lIW$g$|zd@zI?{$#U4`V_?)Qrdge(?5`u)F@Zev(op +z3=Ag{V0ZObpnm5hwCu#kA+0)_gNxWsnP~sn?Gvt#6@7rm_DxMzzTcX<7#KA~(7I3@v->Dlau|;C?1&RqVU6bjE*|6!a2g!mu +zorfL)xsdN?(GzKR3jMoWO>@!aVg$OzU7GF0npLC#F~6s|)xum^%CXjCp4I4}X~nz7 +zxRfb*t+n>CnXm2PqQGtHfD)JGdiHqdC$GA8_Xz5cvDXHB#9*XEOLd}q6CCzyiJz(_JS3?S| +z#r4gQQfb_0L#-ml@mHeXuOyAoW{*1gky6D%)sE|`DrX`k+TtTnT36@PV#;^LbJR_l%|B<9EhER~;6S +zmFhN+D@l}-QA1FeeTkZO0}`;!L=>MV$8Kqv8Gt|s*981_+d<7=2~YVXJ~Gg?IVx?6 +zBwm-wKw_7k!P*i*e5M%pzBMt`3OY|#OWJ>gUhx5JwRWSp{eB+T7$ISIQ0SLvbqam!Blp~UI@V%+ +zs^9RZ3K?bpQ$`qv%DIUQ6|UPa3w@O76VK}{=3)6dRtx{O+Vj8Em92nEfvn}f+0EmE +ziq=!B><5zG1L^>>zwTx4H8k-n*L*-DyOQ)YE;3MAGdB-cN9MbqDj1`^I%;ZC`~eG$ +z@}Nt>JOK#fn-M2b46D)eVysPI;|@Jw +zGoL`Thhu4)l<%!=y`%nKJa^Y__Jmt;Gx`XEfbo-DPV)mFniV@(U2&c@D&`t~HPl=0 +zH0%FY=81Q%7!gsP^-rhzcR>7U3@6?49b%0IN}VOCR0WhMEZ4mzl+y +z2>ZVIJR%RTx|xp4GHsKj1nnR7&<2f?dW*fxTkkPX73(#g689!&G9UWFLXZ(O%}!BV +zOqqeIBBP-41JBLueN(R*Mkwh-K{h$sua4-rBNc8iwe&|zmd)9h;`BR?BLQe9m}R

eXc +z;Xl3lVP0DheB{%)seSqk_X#mHs*1cWKG0+CIN!(tgSm6_42#Q_r9Mm7sR#~S(Zkat +z*7)4rn;%6xKJkX2e^1L_Xni#p>eUvvpavs@ml&98oXlx0k4yACnJY~>5WXO2F|VAa +zH%Q4S+M^Jd3zmcw-K%!oxE!vb`)>f!P)#4|eCtf+Me`!?4lOpw#I@OydA_rQi8$3; +zFN&#Y7ufG<->dalFjyi+b|b&aCM!J6Tek5p>+UKVJQg*q5Ai{LvjY?lAwbBH$LLWBP!X}j8wmZzvt^wMfP^pN-D#I-_c=b +z?T7vtoB8#QUeUJ|h`|s+M)6br8RQIWX|3j_m?U~whrznQcd31p|7c0=8J-aP!AE{Y +zWl)I46bx$`OW;3QyV;fB=)}#THR};M&5tNDM6VAMm5Zg{sfrB$HTVQlijSdRm%A~L +z0y~HyCtXMW>FAH2W;tD??n*)JyqbbX;U +zl?l7lJeZSlVOMfDA58@PBOl43>ps}~g9V1g-Zbe<93?hY8ymLFD-I2aVue#?(Snf{ +zkw-8_^Z`_chQLgRysjYf25t%rA!7)6PL}pIbzx6wF+Aokb^=Ry;8O}rYdEitj6yHO +z^kj*$^LHnvOhx4idCnh#QD3BN)*MM1n~YHy#5)fZctmnASO_dak+Z47iuv0QTaL(h +zk>v>$1zSG@^f44uxk8_Y2jOdXj~^Ch~ocR7~D<>^AC{*W+z98 +zZjU^LGXSF%rFT<`7L1kyuml2tQ4TpGJdBV5!cWBuvX2micoGl=pAvnI5>iUnKP9>l +zI8+b~SU(3|C6ho3Gfe2mqIm)olkT@e9j*J*IH;WBegyw7q1{Y}~D&fpCf`d>*@o=iB +z;p11(7!dmj(XcQ}SF<(n>>(FP3@@H;$rlay^xX3ge0Dg2QH7}~NLY_^Nok_0Xyj2&(qf`pCxW~!nMUMTq+ +t!(@j3|Keue|Et~j|7FuLZQ45-5aKK>uoSV93}rt+T3kV_Ttwgh{{Xp+Jz4+& + +literal 0 +HcmV?d00001 + +diff --git a/addons/metadata.common.last.fm/lastfm.xml b/addons/metadata.common.last.fm/lastfm.xml +index 6bd19c6..e8c8ee2 100644 +--- a/addons/metadata.common.last.fm/lastfm.xml ++++ b/addons/metadata.common.last.fm/lastfm.xml +@@ -1,38 +1,287 @@ + +- ++ ++ ++ ++ ++ ++ + + + + +- ++ + +- ++ ++ ++ ++ + <album[^>]*>[^<]*<name>([^<]*?)</name> + + + + +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <content><!\[CDATA\[(.*?)\]\] ++ ++ ++ ++ allmusic.com ++ ++ ^$ ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <content><!\[CDATA\[(.*?)\]\] ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <tag>.*?<name>([^/lt;]*)</name> ++ ++ ++ ++ allmusic.com ++ ++ <genre></genre> ++ ++ ++ <genre>(.+)</genre> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <tag>.*?<name>([^/lt;]*)</name> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <tag>.*?<name>([^/lt;]*)</name> ++ ++ ++ ++ allmusic.com ++ ++ <style></style> ++ ++ ++ <style>(.+)</style> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <tag>.*?<name>([^/lt;]*)</name> ++ ++ ++ ++ ++ ++ ++ + + +- +- +- ++ ++ ++ + + + +- ++ + ++ ++ ++ + +- <size name="original"[^>]*>([^<]*)<[^<]*<size name="large"[^>]*>([^<]*)< ++ <size name="original"[^>]*>([^<]*)<[^<]*<size name="large"[^>]*>([^<]*)< + +- (.+) ++ + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+)::(.+)::(.+)::(.+) ++ ++ ++ ++ ++ ++ <name>(.*?)</name> ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+)::(.+)::(.+)::(.+) ++ ++ ++ ++ ++ ++ <artist>(.*?)</artist> ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+)::(.+)::(.+)::(.+) ++ ++ ++ ++ ++ ++ <releasedate>([^,]*)?([^<]*)?</releasedate> ++ ++ ++ <releasedate>.*?([0-9]{4})[^<]*</releasedate> ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+)::(.+)::(.+)::(.+) ++ ++ ++ ++ ++ ++ <track rank="(.*?)".*?<name>(.*?)</name> ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+)::(.+)::(.+)::(.+) ++ ++ ++ ++ ++ ++ <content><!\[CDATA\[(.*?)(User-|\]\]) ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ + +- +- (.+)::(.+) ++ ++ (.+)::(.+)::(.+)::(.+) + + + +@@ -43,7 +292,8 @@ + + <image size="large">([^<]*)</image> + +- ++ (.+) + + ++ + +diff --git a/addons/metadata.common.musicbrainz.org/addon.xml b/addons/metadata.common.musicbrainz.org/addon.xml +new file mode 100644 +index 0000000..42a2635 +--- /dev/null ++++ b/addons/metadata.common.musicbrainz.org/addon.xml +@@ -0,0 +1,43 @@ ++ ++ ++ ++ ++ ++ ++ ++ all ++ 20000 ++

Библиотека за ÑвалÑне на музикална инф. от MusicBrainz ++ MusicBrainz Music Scraper Library ++ Musik-Scraper für musicbrainz.org ++ Scraper de música de MusicBrainz ++ MusicBrainz musiikkitietojen lataajan kirjasto ++ Scraper MusicBrainz pour la musique ++ MusicBrainz zenei adat leolvasó ++ MusicBrainz-scraperfuncties ++ Scraper muzyki MusicBrainz ++ Scraper de música MusicBrainz ++ Bibliotecă catalog de muzică MusicBrainz ++ ÐœÑƒÐ·Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ MusicBrainz ++ Skrapa för musicbrainz.org ++ MusicBrainz音ä¹åˆ®å‰Šå™¨ä»£ç åº“ ++ Извлича инф. за музикални файлове от www.musicbrainz.org ++ Download Music information from www.musicbrainz.org ++ Downloade Musik Informationen von www.musicbrainz.org ++ Descarga información musical de www.musicbrainz.org ++ Lataa musiikkitietoja osoitteesta www.musicbrainz.org ++ Télécharger les infos musicales depuis www.musicbrainz.org ++ Zene információk letöltése a www.musicbrainz.org webhelyrÅ‘l ++ Muziekinformatie ophalen van www.musicbrainz.org ++ Pobieraj informacje o muzyce z www.musicbrainz.org ++ Descarregar informação de música de www.musicbrainz.org ++ DescărcaÈ›i informaÈ›ii muzică de pe www.musicbrainz.org ++ Загружать информацию о Музыке Ñ www.musicbrainz.org ++ Ladda ner musikinformation frÃ¥n www.musicbrainz.org ++ 从www.musicbrainz.org下载音ä¹ä¿¡æ¯ ++ ++
+diff --git a/addons/metadata.common.musicbrainz.org/musicbrainz.xml b/addons/metadata.common.musicbrainz.org/musicbrainz.xml +new file mode 100644 +index 0000000..16e539b +--- /dev/null ++++ b/addons/metadata.common.musicbrainz.org/musicbrainz.xml +@@ -0,0 +1,170 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ type="Album" id="([^"]*)"><title>([^<]*)</title><first-release-date(\s/)?>(\d{4})? ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <artist type="Person".*?<life-span><begin>([^<]*) ++ ++ ++ <artist type="Person".*?<life-span><begin>[^<]*</begin><end>([^<]*) ++ ++ ++ <artist type="Group".*?<life-span><begin>([^<]*) ++ ++ ++ <artist type="Group".*?<life-span><begin>[^<]*</begin><end>([^<]*) ++ ++ ++ ++ allmusic.com ++ ++ ^$ ++ ++ ++ <(?:born|formed)*>(.+)</(?:born|formed)*> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <artist type="Person".*?<life-span><begin>([^<]*) ++ ++ ++ <artist type="Person".*?<life-span><begin>[^<]*</begin><end>([^<]*) ++ ++ ++ <artist type="Group".*?<life-span><begin>([^<]*) ++ ++ ++ <artist type="Group".*?<life-span><begin>[^<]*</begin><end>([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <release id="[^"]*"><title>([^<]*)< ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <artist id="[^"]*"><name>([^<]*)< ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ </primary-type><rating votes-count="[^"]*">(\d) ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <label id="[^"]*"><name>([^<]*) ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <first-release-date>([^<]*)< ++ ++ ++ <first-release-date>(\d{4}) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <track><position>(\d+)</position><number>\d*</number>(?:<length>(\d*?)\d{3}</length>)*(?:<recording id="([^"]*)">)*<title>([^<]*)< ++ ++ (.+) ++ ++ ++ ++ +-- +1.7.10 + + +From cfb94b4d1baae0b3c0cf3909f247e73666f12b35 Mon Sep 17 00:00:00 2001 +From: Martijn Kaijser +Date: Sun, 8 Jul 2012 14:09:06 +0200 +Subject: [PATCH 3/4] add artists/album universal scrapers for music and + last.fm for musicvideos + +--- + addons/metadata.album.universal/addon.xml | 24 +++ + addons/metadata.album.universal/albumuniversal.xml | 166 ++++++++++++++++++++ + addons/metadata.album.universal/changelog.txt | 36 +++++ + addons/metadata.album.universal/icon.png | Bin 0 -> 59634 bytes + .../resources/language/English/strings.xml | 13 ++ + .../resources/settings.xml | 20 +++ + addons/metadata.artists.universal/addon.xml | 24 +++ + .../metadata.artists.universal/artistuniversal.xml | 146 +++++++++++++++++ + addons/metadata.artists.universal/changelog.txt | 37 +++++ + addons/metadata.artists.universal/icon.png | Bin 0 -> 59634 bytes + .../resources/language/English/strings.xml | 24 +++ + .../resources/settings.xml | 37 +++++ + addons/metadata.musicvideos.last.fm/addon.xml | 32 ++++ + addons/metadata.musicvideos.last.fm/icon.png | Bin 0 -> 14392 bytes + .../lastfmmusicvideos.xml | 63 ++++++++ + .../resources/language/English/strings.xml | 5 + + .../resources/settings.xml | 5 + + 17 files changed, 632 insertions(+) + create mode 100644 addons/metadata.album.universal/addon.xml + create mode 100644 addons/metadata.album.universal/albumuniversal.xml + create mode 100644 addons/metadata.album.universal/changelog.txt + create mode 100644 addons/metadata.album.universal/icon.png + create mode 100644 addons/metadata.album.universal/resources/language/English/strings.xml + create mode 100644 addons/metadata.album.universal/resources/settings.xml + create mode 100644 addons/metadata.artists.universal/addon.xml + create mode 100644 addons/metadata.artists.universal/artistuniversal.xml + create mode 100644 addons/metadata.artists.universal/changelog.txt + create mode 100644 addons/metadata.artists.universal/icon.png + create mode 100644 addons/metadata.artists.universal/resources/language/English/strings.xml + create mode 100644 addons/metadata.artists.universal/resources/settings.xml + create mode 100644 addons/metadata.musicvideos.last.fm/addon.xml + create mode 100644 addons/metadata.musicvideos.last.fm/icon.png + create mode 100644 addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml + create mode 100644 addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml + create mode 100644 addons/metadata.musicvideos.last.fm/resources/settings.xml + +diff --git a/addons/metadata.album.universal/addon.xml b/addons/metadata.album.universal/addon.xml +new file mode 100644 +index 0000000..e25ee4a +--- /dev/null ++++ b/addons/metadata.album.universal/addon.xml +@@ -0,0 +1,24 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Universal Scraper for Albums ++ This scraper collects information from the following supported sites: MusicBrainz, last.fm, allmusic.com and amazon.de, while grabs artwork from: fanart.tv, last.fm and allmusic.com. It can be set field by field that from which site you want that specific information. ++ ++The initial search is always done on MusicBrainz. In case allmusic and/or amazon.de links are not added on the MusicBrainz site, fields from allmusic.com and/or amazon.de cannot be fetched (very easy to add those missing links though). ++ all ++ ++ +diff --git a/addons/metadata.album.universal/albumuniversal.xml b/addons/metadata.album.universal/albumuniversal.xml +new file mode 100644 +index 0000000..9a90ff0 +--- /dev/null ++++ b/addons/metadata.album.universal/albumuniversal.xml +@@ -0,0 +1,166 @@ ++ ++ ++ ++ ++ release/(.+) ++ ++ ++ ++ ++ ++ (.+) ++ ++ ++ (.+)(?:Ft%2e|Feat%2e|Ft.|Feat.|%20and%20) ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation><language>[^<]*</language><script>[^<]*</script></text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\stype="Album"\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+) ++ ++ ++ id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation><language>[^<]*</language><script>[^<]*</script></text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group(?:\stype="[^"]*")*\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+) ++ ++ ++ ++ ++ ++ ++ ++ ++ id="([^"]*) ++ ++ ++ ++ <release-group type="[^"]*" id="([^"]*)" ++ ++ ++ ++ <release id="[^"]*"><title>([^<]*)< ++ ++ ++ ++ <release id="[^"]*"><title>[^<]*<.*?<artist id="[^"]*"><name>([^<]*)< ++ ++ ++ (.+) ++ ++ ++ (.+) ++ ++ ++ (.+) ++ ++ ++ (.+) ++ ++ ++ (.+) ++ ++ ++ allmusic.com ++ ++ ++ last.fm ++ ++ ++ amazon.de ++ ++ ++ MusicBrainz ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com/album/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ http://www.amazon.de/gp/product/([^<]*) ++ ++ ++ ++ ++ ++ +diff --git a/addons/metadata.album.universal/changelog.txt b/addons/metadata.album.universal/changelog.txt +new file mode 100644 +index 0000000..10cbfbf +--- /dev/null ++++ b/addons/metadata.album.universal/changelog.txt +@@ -0,0 +1,36 @@ ++[B]1.2.2[/B] ++Fixed: accommodate new Frodo style URL encoding ++ ++[B]1.2.1[/B] ++Removed: '&' sign from artist splitter ++ ++[B]1.2.0[/B] ++Added: scraping album review from amazon.de (if link exist on MusicBrainz) ++ ++[B]1.1.4[/B] ++Fixed: typo blocks preferring album in search result ++ ++[B]1.1.3[/B] ++Fixed: won't find tracks without recording id ++ ++[B]1.1.2[/B] ++Fixed: won't find tracks without duration ++ ++[B]1.1.1[/B] ++Fixed: artists won't find with 'and' in their name ++ ++[B]1.1.0[/B] ++Added: trying to get album info when multiple artists are credited (first artist will be used) ++Fixed: will not find some albums ++ ++[B]1.0.3[/B] ++Fixed: Some Album releases were not found ++ ++[B]1.0.2[/B] ++Fixed: Track Duration from MusicBrainz was wrong in certain cases. Credits to scudlee! ++ ++[B]1.0.1[/B] ++Fixed: scraping moods from allmusic.com ++ ++[B]1.0.0[/B] ++Initial version +\ No newline at end of file +diff --git a/addons/metadata.album.universal/icon.png b/addons/metadata.album.universal/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..7c3d600dfc876fdcb621927efe52d4f2e2fcd5ff +GIT binary patch +literal 59634 +zcmbTcRa9L;vo5-DcL)v(cejPREZjY~6Wrb1-Cctd+#y(SCuneYmmoL)K6{^gAI>-r +zcfPdD`l_m{t43QzDJx2&AQB(~000!QjD#ux0P(L10f2}6S1h0lv;8aZT_v?$)f_Bb +zJ&c{r0itFOCgwn}ow234s=2Y5m(!TJ0001GVXdz1s;wZ;XX;?bZ2TV@W=}iEe`o+e +zK-kmK*wohC6=-5^X>Bh^e$~}S4zxBCB-i3nU{!DwH@C8u@pd*>^Hx+h^|m$TH6s@m +z0t$HY{bOKf?rIG5wEJf7!sjVS{$G6g{?-4}%|Z_RFA`TlmM1hTWTv9hqSv#|0ov9a=T@$j*-0ss3W|0m7a%z{rHivnouh)n|7L9O^52H~XEGK~V@DP?W>ywEyZ?;q +zzo=bYRn7ljHU5v(F6v&6<}9k_E)H(arvK){g5rO`|7`bv7xW*(f7mXZVqE{j +zfmDK;0P2~<6>q5YFXQxIe57IXL|nEXeG>@ +zt=-Mdq?{e>fd6G*KI{L3d{!}0E(uXK9u9F)kR%%$n<%d+m#7pkFNZk0D61r^IQf5L +z&Hn$`jOCv)EdOzi|Bti$PuD*W{7?0NyZ*n%{|+8=`+pJR{4X@FycbpgfCF-{gs8gb +z+IbH`gWakQ$>XQ(h0Ao_m7j}8-*1AXPQ$ix%>+owP!Xe1SPBGIiJ!2TSe4jhB!RNK +zrK+e0^lDMxqp>RJp%HPNCXpe!luf=>ia^&wNd8C)U6iTsTH5p3eE&l{-TY+0a8|Ia +z`*))vQ?wboU0SJaM(_#w@A>=8=Tm_2$5N9a+&0hzTEY>dzv5H$mFsTyavOS&Z0Rwd@XO&KPiY2$t@H?VG{3d4gt~bS +zZ!aK?cFpm%GbO*6bX(s$sT)mD{4?i+;KXVn!kbjAfW)H?;Za`5)7zv}T!Hkoj^x!G +z*C%qWBQc&w5bi|z)s;Q>Y~jhxNcdzR{&IAgKNOX<$58t7xX@cj?>_22Qu+fEf}3aK +zkNvmA_yK;I2nmPS**0J7lNbqUv~next7U$^a1m+TPFLXl@7|JvH!W{nnJp?}hr&CI +zzqns`wt4DA*6%W6fLejQM4u%LV44Jf@~z*7C-Sp~rvAOT%Yc{i3d9XB#~j~RC_$B8 +z+gI3M4k!E8Co)i*MF9gJLkSZUFP-BB==YBEGc72dV+=GX-zrix#`d+wGNyR~o?eL= +z(FDO^L)#}Uc5|kt5SDRZ8a?UGFqN94{g^-QCQ2c(eO=ml +zg+64uuh~*@9pqO<`zTgXhnbj3B)JD`0GcZ2q_5rLo%3EMAwIM1FUZT!IvbO)vkMXx +znLe`uuF0g$tdm_LoZTN%4jNv1^*I|UgZ|(ztRfnla%OGz!X|9VY(Xq?XYG@x+QuK4 +z}y!-!kjbYuD +zhBTaX{W*jVT!H)Ez_+B7LAvO&Fyv~NOkJKKmEP{!ejjvszRL0b_Hrh@gn*Zi`I$Y% +z57w42c;K86ZY`(1J@3DSX`Makbk!QjleLT(R+;V|=Qos9g~3!-!UT_pnssPA5EOiK +zF&hS`plOI64MCM!CeW;Kw(En0h-jvz#q1zF(~SVyEG-W2pt8}J4cL)LgYmxAFe +zm||FY`O>>iQ4=j4=N9P7Y{ibgs6z}PkC*+TR=kRA*+1KAHGAgaX-XW^p|pgezXw*# +z1bI?7#@PgE8jqf^#{n`+z}oHB&I>Y+CVM6@9&qx86Qo~4??d%lf5@xC0X~52{V--VtPyH +zkpx$p;FJ$y-PLzBbHn6c!@-v?&l(gfbrn#X+AdAz(W*94C6z41ny#yFP%%QP4U}`5 +z>Hg^J4w&_i8Z1bg)_UiBD=Pr5yZ#&GVe5NaRWuq0_)N*z1k}l;!X74zBVfeXXv=DB +z1&d*bG};hvWvK+m9n`vm0alY+<%Mw#45e^b?Yy?NC{xobPW+C= +zfw1YkJd))^WP_LE2~^%R9Uf?>_?UsIpP4ea#1k7-YItsetoSC3L@&&C(w~K7?9cTA +zp^x!N8BxF4j-{ZrLgVw{T?(bhl%Ol$ghBu>`S_;>D$#_jg|3+5)^{3$cGhx%L{(o( +zwK^bf)wtm>^7faTl?;dzM4T{};K=(_6{}rLmUtgHB^>d)rmr*_MQqs+<)^X)@A!+0 +zyUp!pL|eHa +z7E+jBCzEq*hBOt$EYnJ;hQ2s?+RHB9vpeNE@`l{Oqo^nRskFV(k+25BsLdu+(80;t +zOLJlZkUWq)=_T}^5{O^zwo69BA9x+LvpzxaaS~uPM$Vp~E=%1=3f@(6LlAOt{JO&^ +zjZoG&_EW_|HYR{=x8JJ<2G{lLOs*hWQ}sSvxUsTo-~=NEQKiuZ)>#gZP9uSV7@oCuW*uI{9RPH7A)% +zM{eWNHXa?ZJOT%qB|Hp0hIb_#iY8=DGsy|dqLIJ8FNcCu$E_RHJ-XXz=bF#I +z%)3aN8VMIVWrI*2IpYms=-E$4=P;e__V2yoy3?XbNFhg6l9RfoQqf%N_6%vC$?j%g +zSNU&{lk|0N0b}BiZ%(51P1yswq=iEh?lQA(blU?{C`mvzu3d}CKemWLtB*cjv9{{! +zLWou{*b|vc1!YIy;+7K(E_cS04u%+ZT!<{%ozQ_x`9+8vg@}WB&p}SNkGh}uD;6np +z$rh$%gz-u{X*yYmxOhtQ5e;EYT&LS8DYX|YS@|Jy%(7j$0TthrITmq +zYE4Sw{*#3nQWPAK$^AZO6rgZiU1rMa~0OL>Zn)* +zm0P+qeRWW3N9%InJ0RjCKE>#UBwje)v}l`Chz#c1DjS_@j;>rOHxN2mhiFZ*^B3L4 +zFNg$P?_QB(#&d8vnX?5+aJWdRYtNlVY$B>~0kw3!5ixxF+_J`CS}G4oHKazo +z2|DD#Etj(pD>-qcoFGF73o5Zp9a5U1Q=&X>mtubM+rKp-^+(>AN8=PKoC--XHmYjF +zw$3gXpq;CJIfdS-FCyUfs4498+Cd>G_W6npSyVlbiA1~N2O6WCe9ckz7L3unG(*}+ +zMs;M|*DyU<%T)R8OiQY~=pPK-H!WLs3q9SzmF0e1g`IUKMsm0dH`J5qkmPH+y-s|@ +zk&L%wor)taUdYpUoYRv$A~xIT3Eeno_E!U|6#u6okMrERHD--gNWJkkvS=~{8(k57 +zBTEK2)yd_nTtW7=ip6BrVzn&jOndg|&gU$u84pFa5pkGimMy}r&;OYouE0V#aYD$= +z?$dJ{(^#2sCRsNPR9%S-IVxr^fbL1q*YvRo@nJG>+{+6b#FqVQD6`zeJiwQDS6Nv-k>+`w +zZc2ln`avXg{oHlL{!t+_M5uQ`MR3}45qrEM8Zf#o$0B?pjkE2tzD|iw8949I+`;!oFG@=g^hHYM1;&25Clv^xzG#8BfyGZ+R8oo?J2xJYY%8HEAt;eu{{BR&^; +zW9t(OjB<6aQ$*}sB_M)5UyJ;Z+ICRrTQ~tmP`0nS%Rq0XwJc^$z=O?3rR#Djjf2v4 +z<=_{Yji4^mp!Yz{pnly#%(q4Sf=ot))h5HIUc@-MBL)9Jv0k^jJmc?{O}rp~Y(|yW(!EoL(h}*wmr_px% +zY5J8fjmva2>9i*;{)}(-JO>GS7qwMqh!-Y{ocWX!6*kuVR?C*H#ZLB*;B__O!5R*9 +zVsyQn_k4wB02It&lGuE<^=8ZJbHEZh+&l&LXQ^Db^ +zQW?k1jVowErMXOVfurn_57HxPe}j2%JQx*o(d3f}Dp9ouM#(2Dah17(h-v7mQhur< +zpK>;TuZ%E5k?8O~Dbus{Yz|F-%Mbndmd=aczh*oUwRD)lAX&6g=c-|>jx_NW*Tp^Z +zr@mgJ>|F-K05zx``R5Ou78RgQJ!PaWRN5P|tQ0ejDqL5C|Me-LAm7>!I{`=VELypS +zz}Rh{1NmO-KFFjf+}rFmFL+pNRQyx6^@l-+?CXtoEf(*W;?7w*)j(flHp}%x<&$Ws +zM?eiD(W_5gXmn3TrsO;f$~oQ4E}X~A*W3E7?g`}f2hu6E12d69#l_rA6_okTRNQte +zBf?>jL|c2h^X~D;8@1*}s=U^D=TrLgk4PD!FntR*<^bkMdAXcl;P+HFQ}&=a_zE>9 +zkK)6T$~pXX7{qaC{%uZ`sMT|Lq2PE?ir9_cQKzoPJ}78wE5#ghN~@irB0AfY$x~@| +z>d!IyWklfiDi3-s9kCK~xt^p{wDw$cXOM(8u=VWA9jhvMJa_=yU3!5(TS_n0F+Q#O +z=RTBp1N59+3gr?PR+H3DaGjcHk_o+MGtOE$*l-PViT3QY^f)fa-W~M^<#G?0Az7(d +zbO5vz`A|p_u)+qLT1o%VU5j@+0^OU +z;HB_A{8y3`E*ieVmizw36r%EUJYKKDZ0j*SX9m9PjM?c_(kSLRor6}7SJU~RL7`!> +zMQHf^6eA8=;DvV*szV_#O2g%VCWZiq-iP5k^x2|GbePx{mn!c3rAfmji?oERFZPj@ +z&=naEeW`DxDz(W*?9wT@?sVrF_oLxb3hF%rCaKn60E2d+ab&TFepm{JACTCpU+MWr +z1SWh3J&*Q@W!k9_a-vxF?{<16FyCwwYVHpQTsZ$R)nFB5qPUQBK}u5KPOQzd%T`)| +zEAifc6KSC45Bv!EDx +z&B{fJJ>iq@a3v>M} +zphOm0++b`D+>oet3xZO-d1)+>q-bl$a>+5Y4Nte20)y1fS+;F)gvrfo7KT;F$te{& +zzvGx!x+AE)sy)5odql}vyFUJKq$rWeE16vrf1t(4&*mj<%(70I-a|&+C&{VaBB1;{NKTEAr=EiMJt8W#otm# +z@Q7(HA8D>mB(yVR234VD19fxUJdEi=1LCFnK53o6c*+5Tk!o55S>j05zcmLN|bbLi-`Tr^AGlIvY^aX!Q~1p5!!Shg9)8dZW%LrcIY=7&*H<1C{5 +zv5P2K70{kbDXv=SjES_e$eE!(q7yg0X=U$^OpkP#^T|48hcGB`p`yLg0!8W!bCxm? +z`bY9}I^~L^VGDtjIJVl?q8AV$8l;ttwt}HD1t+J~e)^lB6%Nrk +z`0U2%kx@~xDZ{mc>l=*EU8Jh!4^@j3XxpfTX7-~lSPX^Eo!`H|&#~ndS%0^YQBSnC +z->2=zL~#jWu1MLyO4Mwuhp-Ud95@&Ilb!hoC5w$ZL41&}|*HX|=_lfdy +zIdEt^H{mfbWJv0vJ`4PV`MiOvHprqBQ}eS@187}fe&3QBOR%EA=ja8I&|Id}tqMCl +zQv~3#jjR1g+hQFS^RMA+Pz5ldLcoc`RA0qb_n#2tWxw?Y?L#d?aq}z%Y6MZ@EYrdx +zVvAHI0BcE6_BxIOW@_sxUPxZV16dUGO27kMorXlItOg>0bdGC_D>a1^W?71NDup{N= +zzf7dR^=Df^a@H@)Q7sY}e_ONWrh-?W*J{8$Qt!v@Ez9XsN#$p4@ +zex{1RE&9I#MgcDlax40V`s&K^1urbl*XQ +zbMxF-IW}_rrt=Uo{zlD*ASg|U17L((Qa@UJd~(Pa0(4~2KU0L{@F1mY#nIkpsy`M8 +zjsig#2SchK8I(dw-w@~31QQ^yZawHC^VqqwNRw=w`(54r#^DT(8-KF}8i5^0(ht}M +zkQ13BYgHYIe&tF?sEiVnHGC7iCT87m(~8P^b5>=2sgUpoX1_Dk8bMy(TwCg +z-3-V7H^Z_NYG*}ca@;ePpE^K8nKLkEq)Ne}QJJG|(hDYmLFe0&Q#IBla#kIUfeS_y +z^#wg~VwFlPa>N(wX7pdX7z%)PtKE}+-oa##vf?R12fw`1K39PfY*_xxsMRMoS)eJo +zL9$%p5Ac34JT7SqCc&IH_v)@DMTc2;eBJKyOL>+^+!c??vX%-ydulwyzH+{Um1xFd +z7_K<4h)2byp0!^?%IGwY +zaM0n7=kyr^=>ak2V)q|Rzoj~uhl0?~y7otzn=2cj5>b +z8Gk?uDoC8k7(&c;H>T_y%RJt|M3w7QHB2Mv>p)B*tiq>qD*)Tl&Tai2wLiA6c8@vI> +zx&Arb!rAYA^xHj8;~VP5iHtYoTkeIInl*H9Dg_+4YK5+mkSFPS11 +zLOv{uk%oC+2$|G%5qKh2QQzaaqHXc8!EpHa=xDW$4SoMjdE(%I|U>GoxCfl!x +zbl9aBnh@MToc)l)(K`UQ6@&=MP`n8?O5uh8faPQ1%^Lh3dXMq5I8=1VwK+8u4t~*+ +zocPaY9|xbFF}MUF$heozq!_gj^&b~-514bEb-_$7`XnaJ3AQWk#mFeqNQrp%v-_9{ +zzSBDzE1-}mP*-uVrdw{H#rhS>4;CiNyv!t5%^QrlSqDT9#ZR4_e$RQLDS5(Ly$C8q +zv9p+%d^vc`RfJ3fl@;+B1TQnWZIN8j^V%2Np`(V>iK%`u!cwTScMwh9D?LK170`K= +z^O0K$+5C@Qe%4#y8BI8@YNj&ZnW$YKaq9HV*-(R3u-iCi&~he2x)|UG>IPd(fz3iA +z=@kkZAHLhe;j_N4MveYJn~D&ts<84JGCmEC=3Qu-=-+ev{W1Kc?25z`(v>YGf1tTt +zGL$FE`*$}M4`sqZZbINayh;x`n1Ug&_?JMoKi~{7jV%Nma2=xks$5|nc~7R0uP|Au +zL%`g`tDAMsC5>S^EkXB1)*p}^rRhhB}LEn_eX25?!?Hf4m@z*(Z0Dun}XwHto9?v)scm0c{iZ?XxYO?nhZ7HVfh +zmCXr+Q*3_~|jH_d% +zRo(}JD?;5aUq~>7udk{gi3dZ;QB_xP{$O}1GVrlB((RBjmzs4p=H@`e3?-J4j|8=r +z;CU+9xWxA8ii4Uz9M{B}-7dde7zY`DSPdrlkRYaQNRnf~@>U4u +z5-l7F4g#m_%Tr%&|H7oNtAkY$Bb=BtJp$q(ejoGB_$v6|BVY&*LOFUlC# +zph`bHS(Rk2xMYpyfp#T;Sa6EBt*Q~E`O}+7q^ee2T_9pmwA;W|&d16hNU~5&-;IC& +za~IgwOIHH+CtH$2+u1mQ+2tF3&8J13glhQ4pKp=;OqPIn%vswvgDt{0So}q_(rpBu +zETa4opW%z+^ni81C*tKl%@|x8iw->ERRAX^m5$cY4_XRdE#BY +z+!hn1dsCD1B_cu>8i8q_cZmv7UWLdw`}rkSVS`^+ggRZ81FCAz#PBAFV#5U=0_F6X +zP*5a-?mN&Pmq<3xZ3^____D8{R=?ww!mP$wawo+{BsOwt!7*ncYh1B=C7gDjoykYkrQ%V&_C!(q~Iz7iI(u~5#bpkpG3%);0bY6-fxjkM2&d^bl>cf4Jz +zN)b2FM~`X$QIR+z`x*3Awy*}j$a)AtMj3mb;qJ!1M(MFD-)cv*^K-t+2{tCNh6inY +zaWJJrFcv2xho>Ux4d6~Vh9>eWMUov{f(Y~#4Nu~>AoC*?1>@yJEUA`^)SlE_ylj?C +zM7&cFyNc6F&U1V0FiC;?%8#nBmj +z(P6u*YJ#08MG-(TdcydmY$ZNHWFlu}8Q0mq8_hd_Y;!pgy1{(dJ^Tv!~P`}%QC4A +z0nEhB7C(g#xBN;FKk5m3Aios-_ZUlw;0=$-;Fx~WvNPnyX2)^^ou8VVMk(g`gOjGb +zug1=vs5~a|_6PE#KE5v|5iOBr9OemH8386kZ>>C6`!~zF^-OtJi(eVV74gYzDMSSB +z@GkE(>mLGNsZ3Q)uphmC!MYE)7WRRmJi`tUjWk5Gl3eCYO6hTQ6~_>)7+sMm1c6sS +zZE8NWz5TGhwH}M)m=s-Ze8--uMWWs^!eEDBSRsvA6WTAN1&>4FZqcS=av;h;VMJxF +zj+AkJ!`@@;BB?MForVvKos%^|M)8C;v}B!xA627qf^~J|$sfLG0v&ppSO%&eA&#aO +z9bzLX*?WGdP8lt#n4TIPagEM4}DlYC(c7T7YdKDf~|_I$*6-J*XdKI&kvUR +zEd5=~7^yZ=v0*o1HX_qhv0r$X@7u3$pvb1i@RB6C#>8Wd#2*d)R^2delYYerff&Ou +zsfo$8)fEQVkuOiVDc&q)xc6%H+pECxN+GGBi6++4fCrArv1(i@@~wCyC$Epxf;3>n?>rt +z(&$Vs^{PuWgHE)w?*?>?vZi>k^`d58yN;nw>85_a0HE)KWD|&AW<%Xr;8;&$6{5bt +zf5%sBz4yL_vQ+(v?VJHhfRV#*Znz9Crh$ed`#}=t6d4R}xFVLPNoZ_G^qcy_h<-th +z2$xSyMfntDjS%vaRHOo#s{N7MT{2rF0EKTsMcxs$k!%@AKYV%V-bD8j +z)H%o%iO|p=fv9JP7hiXzzLI}FMKYZ(y<#8#UD(LgiJRH9T?iRt;=INS_PtnDB`zEg +zEpKZe(%9ARY&K+{n2cJ=s~OjTQwZ&kT55TKs4BFbf*Pyk2P2j9ri)OgSs5B% +zMjjR_;(UpUiuN>^t8({b*ey-rWX;3tKnF42z+yRASP}~sSgw4> +zu?TasoP}-+D$B*g6U9L&Q(n+ov2JRi3R1+4|96MP%ae`gk_aOv0J2zhWR&>^@m0^> +zj%vPGSXRE2$#NXd#ChPa^f=f|Sy_{EYbd%CkbRXelQ?#10a8g2rko{?FHra^QQX?aP3M=tri;4h5rVEA +zkY^-!Erm5mMtI-tkDvq#t +z$+E(SQJ(45L|zphbxYD{t}}Bi)GknJlr9$^saC0M~e5OqZ(F&!4!QOuo`N +zPl|C1dmB4=5N_y-a+te2#1Fhf;a(ZnDHKHb@rFd>myllcGav%t_Krt;3#2$+5_!i( +z|9+R{#E8RH9GC$-YT;^iopOH@@#ON&HzDIO*sJWdmWNUqrJlG)UZz#K(nl$pi28x< +z3}y#%*b|z{G|oO)Q*SP0C&Z2U(0K<-I5BGl6{d=E*ri)yT2CV;7oO1L9d)Yt&=Hh% +zGcNF(n;w5-iBWW4*&~0a%+7^wGRwGu`rbHFDRb`S6L@!Fp%6(JHCowbp%0$~MV2#$ +zLV0j9Ae3Gs-tX3P!#2hb_lT^|w0`Lkf9Xr+kJ;p1Hw&yCd2MX|I3>3x-bEwB9rC*( +z#7kg^1~G0(F!)}%onVCvc+?%XRB|%C1g#F-`E>dG+E~WNqwy6r6XZpJ)f)t+^d=rv +zfnM#{E8x>NagUc(6_MXnCd)`_&&zSSy!P}06v|mGlC%% +z(;ejqWi&>^K>YAY#^SJmHr;hIyC`|??B5U=53cjCaR~AR?Lv2|qRmnGWie{0(1U+P +zf=S2tqB~Ztl-6nHzJ>i>v49xr=_6OEfI8zuA&5;y`nJ +znjH?$!{Jzs#adnjK^ +zX7vddMe&NiU9)5p6kCdocziJV0;n1V!O!l~yDK9u;g7|O} +z4Q}|wN~~Td_yI1l0TYD3gQNyA5@fQCjECEkL8+~`Mz?H3fZrBbnt}XqUkWRc{nI|k +zJ=$qS^oi;xX!u`BL}0_;11IAo&!jyoO+#pvUH<`?VIe}dc#UVOTOxWd=;$z`){EZ~ +z8@$~+JSQRSw2wrmiTrF_6deiNtL1&S5E2v#tfm;d+~<>qEnA-uB0PBcI{5x9HC;|z +zrqdX2^cW`juz8qWqn-lCT^-Sp(}5R!HUtraLsrlB-ttblbr6{~nPrWk}=ih&!kj4~w0i20&PB66}>+>Vx$xV&EgSsemj%92|aFG5~NaO)>!6$QbqPDdekGmCp +zyGqImE^dkQk;5@@7|GWtzS3ZuPf4+sPT!ubUW3PQz&wK)7Spqr&t8jIc_4askw{$( +z9O_I+7GH4h%MYo+qq;vLu|DVgm^;-;eu!^^c1CJIS&z{oq9iWtR3>89ix!`@TtHlM +zs-aK2(MIY}O?#1dGa4?o%q~1pWe<@)|)4 +z?Ob;s7^csZP`I$_QfGs#b}trs*s+)M7D)QyU#@0pmR%{jZ|4y<)5PAiiziD?d@xdIjYbt +z^yH0a5K}6c(GYAT_I-y+;N)lW1Sb73Da%Duza}XpRE3XfvK8dg-ZZzuZ4&B!UR=*~ +zl4Oc=l0SmaBHA^DUuCF)|H0GP8Yb-*K1yQk!Mcjd@E!@wn_n{({9o&X5;MKrkth$q +z_da1}DWo!_>$jE<-6`zOYqJAi?3oR{SH99UDhtl(XnCJ82UVX6H%eiN=6_|r{dbog +zN${8sMYLxcO6Im9I}0Dm +zoavt?#3flFjbZv-ddtbd;-887Z%uUGk})3(^~JD)TUuO^ +zA%CSO#B=R-2!w^>3DwxuiWM-VvDyVlccVEPatex?YXbS +zB?d^kmQ=it}89>CeKVieKiDHT(w+Po0% +z@H_n?Qp;LSwCzt9C>!9hFV#xOWD!jgGfn5BF-QkAo^%z-HA|=z28@`b+$?29Ld1R- +zSgYv?71wypp`(iJ+9M!%%MBaDv-U}Lcg}+lC>1>5u#?EAJXD$;Cc+76cEQ&$ +zRy4JRw59O1zr;BzaU=PaMygTxad)Q(ETRUH&4E_FV`U +zS#2r##C}C4GKtg0e6DMm55kC9G~q%~g;~j7|-h +z{p!hr1*$GaoCM6zL#E&63rZ-st?2q4j~Q(O3bz7G?(XftD`1G;`$stJ&)DU4cKv3t +z5d9(ncbpfcRTDEcUH_@Bq&;n!b;vo3c?z?0C^Uq2OjI2Gyw}hTzQ{zn>3`?IukEE! +zmeU<$p%6vd)agjL=+|Gq6?pg--due#!?^kNT&_HTZ(fgHLPOlnEk3weLOt+<3S8rl +z8vV`7z{m$JE=5R0r$qszWZ^GTK1K27 +ze`syG^K7VyR9wIA=~*&UH{~U7|8+gdyKtJ1&$O@lCI0~*-OHHcT|1*;h3lBR%W!T< +z{?1NRlY+ZO-1J>$KaOzVi+NEecFx(Cc|>tNXj}Qx?Y*puoqJw=!wlvYwFW4o@{RF3 +zLEQ(-^{v_cuAhhOG#Q|XV9;*CI-&jUUJDFEk%+`XBbzAaX_Y{nV=7m+oXCJL%uzn& +zYbvGV0J&_b;_e^gt@*i{xE)8t378nq3SqiKYXvI4zoUK0+wL}p{4Pj#^~GCRmR1+j +z-TbGPgic~of`Ti$jFc9=IB5N?eNFte$C$$Nx58kweFQ%VRpjxs6hAP&TDSR};8@cv +zj=qMaScHsUJ3b?J^)xf`(XagsRotH%k07FA@w2r`LS~RlTCe0_T8t*+!b$hX%Io(S +zFa(LR0KnUl|C%1yhsy{xzMa9L>H25Hgea<<;WimzM{2LT5xM;|5~04b$vX!BL%yE8 +zqew!*s-atXr$|RB+p=J!6e`6DBAR=O_AZh>uhZ!`{!Jzuc6Xq=!YxCP1Jzh@Ak1fi +z0cmp?`Zr;F=dXT(<{cvvM3*0+LA6&x-W$n0tXXziEJ9f7WooY|qN$Y9*3dVDX)9(^ +zKQUgXb(@;4#`~D1tLG$ht&h~wzP*6jH(4sb#!6-FeMkTG~`CTYb3mFFR;AmUZ{L?Y2{G_u7vhLexl^~LB{p5JT^ILiIl^e)~s +zm4sgviLg~@%oSKb0t|aH3LInJzejp;x{D2&|El?1FD`U*)hrwr{0N>#M+BV3kNGuRaJjU%K5o!$%x`iSdBQb+35_;(#dJJvru-d5mYxQ)_HQ36 +z4(yo8){E$}SV+Lrgqkq%{wfj@B8H*lh +zeDHT^s^T!pDJDJ)b;A*J@fH~TgrlID%1TzptLByV4x!{AeKnegSlPtDc#=BbhCw^k +zk#o7y()l9Z{5Q_oPCH%M0U|Y_-7cpAnzZM#!E@uM;>_!^sl}dUD`s{RVqQ8y%9N`> +zH7=FqK|_A=i}^S3@z<{Nr`DS>3T?*P=>^SUWyq9~KcRXyB^_>nqFA8Zj*M*zKEpr) +z=`b$!Zx1I94hDKW)VuD?s^G7~@}gN4jiw59w4k)o9d>W-5w3O@|9iIC<7E_?&B8_Q +zd-YL)6Xh@|wmaDsg!nY*7}ReL1f{H}uNVxhxKN~Lxm{}{farl5i-#%#+r4E0=KDSG +zd2_gMKpgpkicE9rY7h$HL~fgM(aDGGd;uC+5_`zA5gYcm8e)*3-Z4CN>I2foqBhMpW>TuBjP{CG=6*{&4 +zldb${-h~%aMML41p)#u{R<--f6x>}v!_CqvA<=&DX^$S#=ZN7Y(4 +z6sc#C4#oD(ax!z1NfQlnYJ^YSpaR8peB+k|o3|;=uo9iHR5`_495lsUz9w9K=3Q@# +z`}@$C%~tlOL4wgBve;GZ_d%mvLic29r(Y&X88j82@6K=K+~=2&NPAJcSq7KW*emC^ +z!6VI-6XwqXFmZaxlpX{-rRY|?MEQ;yi+ET{j`&dlh!14aco;82;#=_=T{4!`w=- +zd37RsM-1awy;Dx}&KG$GT0c1UCw!DfxzMDoU(e*k!jtB@-8w>+>hz(f=-HX--sl+W +zl&?a4*w3$JwxIDL7XwfsRCKEwHBVPDtZqC$A%NpAIzpz;^UigDh`ooFoG>rpoK;wd +zJD5Fey#Z~B+1Q$CV%!ew8)B*YzMP0V?EQ7=JgN#%jY} +za`*k&XwVw;8&DZ(Z;SZlezz`K7&PA(x_8Okd$e-11dK7X@w74by``O8u;lk0?7kq~ +zo@5+<)LxVS$?tyMSDO*?a%}z_W9SP22|mBi_`a!W2{}2oE1h9jOV%59)fNP3x&qn3 +zAo4FAZE?b_X{+>7+6O}~uAR}}7zk`f@5-T8>*_1*1o_Wzv4VH#ej1TW>;6f-{pj!d +zOz&U6!FQ|`C!{)LsG+2-^c7mGj9%uB=R{w}gR8B@bC<#s4GESVZUTjtRNuemr~EN$ +zCILgOhz=Z6j;~NEx +zE=Zz7mx;dFwNs{C1hRXNJ5JuhC)7z5k)s3SL=K99Kz#$>%g~R6vMssUnIFFxS;Clg +zT*YZ@DRywSiz1ACBKStdxT`QM!jZzQy3}w`s)C}M*qHXU6~V9Urn!kU)l=FMFlx(YMoeS{YRRMFP~86joVT_}$I_nkbNS;)bBShs4GYet)Vm&>lVR?dIfMzY +zNVLxHG0}atD&onMbdb6!ig5JEh!MD*LuO4sSSh-?(~mE;Xr$zho^d(vHTllkg}kE} +zAe;Wd;o`X!R|@3>cH}9ww?0nR`*-H2OC?*Rq7&g)n%{DdY0wTmh!qgQe1AcE%{0JK?c^AMtqt{Xv2;{I4h}qms)O4b9 +zkzA+rdPM$amp)(7#1+8*m0=Zw7EfOLv3&=)Eexet*`)#Y4y10Ijc;#1ZxMr}0qM>I5O+X*G}K^Y~{tg+;WjYyFva#W*6W)+-{ +zlfZQgP{Mo-IRrl!vK6h(%#xG>>kWoV0WOi}7PQ +zuAx+fHu)HC+$E#vLTuD#)(s4i-sIkKJU@7+BLkt7{8#5SYu`V+^m8Di``+hs{ +z3-fc64?k$-v&`@%?DL_*fA@PuJ}U_6*q?m8r<@VFPVAgWFIBxBrt)rcA1)d7_%tC} +z5f~1E2iDP(xU99=KJYigC54WjJ%wR@x(G4cqZ&KQ+ZF?T0>_qxW-~YM=;cPslZB;tdQ33HRzGrAb=80LQZV!4Yuwm!)r? +z>iX!!{j&$n|E{a|VXeis@AEHd#DF~V?oEw{Ok^-9R2yxt7~k}e+O+yo)7ll{bNkd} +zWg|7QFBvYe1)rO`SnW{8KTxIbrzeg$1qc!%2D5lX4vkTKb!bzN-e>dko~PHAonWA#Pwy7i!RKuKs_SXsDPVhNFeIdEJuu{t-INC=Tx>Gy2FsTz +zW~w$mOk((D`Z}$D`Fe$3EF6ayc0mID8K$dLcEfkt^4WLc|haZ3wkVqG3;RUw1=sG2)ipF{oPgal!P +zw%mv~w}~3c(X=Y1KLh18qReZ_5S1f^#NyC*fH?NavASZsnRp|ppO#<#9{^K8tiJ?# +zVuW#ufR-r*5DyUAg?WJ4<NxO +z2?VNwE+a|*JpH5iXFC14@BQALjScv7e@m|5%f9q2cieILxBl-A6xjpF@y39$ES=P`d +zi8D2!qL#fau;4{9K^ASv(3!6K5(=KAW*a+h=e%Jsg41%hcg4xu+SMOGd2Wyc6+^7{!VNldQ +zF%;4@P){K&i_P#;gYFtr%%*lMv6O>hJ!J4E-5PI;m84b7$0z8zsJzo&3EH8M59!{sJI3zK|Vh5nDhC +zWp#-ydw13h)SXMgDAaSgN!-S0E#<_xoEgER?&TGPg3sfhn$A`$U?QT+EOd2vR&53# +zKM?TBlX&TZ=X}7>s@jEj)k5N^w%x`YVjYHYQY>T>J&%0JKI8PG>$~09uJzrO#Zp6{ +zlmt@;fO=lv`p`p{&YnFn{5Q#rzw+(r&IdmDa5eFWg;An3^Q%<29)rYHs)*@~Hlxpy0Y(?4+(CaKqEc9Ql(C+4rm{I^K6o)IAAyY+& +zHLX^LfnQ5%;1@Gj(C8}GwuAxeRUEhXN=N;yXlL7t^ +z>+@o9kt_SXm35FlQ)iJ~KIT|>6Es@r_Bo2su)@n0GKgqv^RoRb`&T?RmjKs{DFw>X +zE*TfjG^3#W2zetLR)u`vj+?lL2FvC@Sl0(%R?w22S&mGc>y<@I)u72u3xva|Jh{!jMA5n|NHH~av<*mW$85I4>C2L+N +z9H$ZDv$2C9`J-FP4!Fb2#e +zWy2(#zw|qB^}rmWc}J!Ykmk@}PVvdBmZny6*0-V%9 +z|46qV`g=co>#dhG5Q;Ig$CorSCmhY%28uvL)1&*nCqxuE@KL+oUD +zatY|9?-pa8ZtETg +zJSBX3f-ox+5VU8}Z`;1@0xt|ch44e~e$NRG;tzk@-ro6d{@xD@_j@!p>lNvbaWL5* +zVHHXZL#F7buah6(D?6m(%Jo*mieYWMbK0HJKN1y;n=$6C8I2oXa?P5T9o(J*g{H34 +zGsZ4D8^tBQb80(Sp$W?NUnnbxi&fv;#nb0&$e`z~lDV3sE6I%M5KDSr1J5(0S&Lqf +zQAurZKl?j)^}w;K^D;p%o+y*%3ZWvWH^^=oWD$ElBZJT~iy3p}vqzCW4 +z_s#d-dm`3<)aJl$x2lm5xUdm--Xu;+nZ9(y +zY-v&>7Ll(oQ1H}6C24R1N*Z6HHDp+8Y)g~J>Mg~P3;R+VeDndD}0^R9X@|I->KlLzNJuF1IX7v@0Dlr)GwRF7zX8DqY +z>K1#l`YqXhlKn1ufTRIio15SFUEg(*-TpCd-}avGxP=3upq#vh{D}qe7ULijsA12m +zO2LmNKX79@a1JCQBGXdB7aWAH%VEFo@?J-+mMU+GE>Sf#NPigL7Tu)KEO|>nJqO$w +zVk3~dQ0%?pZVa36u)?x2Y?TgeYX{DpGc<(dIGD*#W6TQyayu`N;6&SeV;~3bGQz?# +z@zvUh8I1%MPK4|o9UvuAm4;d`9P#ENnSPZ$TI@E;X@drGO +zq7P5rfE%;oBAn&Lj$1;En+Tc2idOJ80)xzJD`dSpnEB5jO6rgy>A)mY!|EsJ?Acj_ +zZ9UrDHkLiD8Jg;I%`^jn(i3-f-MI@IJvl?|$MW5{h0N_dYpnUaxDvr=d=<#7_0G(s +zlF_!A$1rw_{F8K~B6MA`T)c3yOVAwa!}KmQ|G5UW9VBK?2z+xL9;e-f%}xXyzG +z&|4!WA`E~Mg^de_40_2Am=0(~$ii-_#?-!r0-hl7m*5mI?X>ct%>E$IQBEv`Q3uwk +zHY$;i^NOzIp?jy>wq+%0(3OcwWoMODU)Q!|U1XNU^x)QZJbwWTOej~5ERV6BToH#{ +zj)*qX19`21EsZg9_jFtK_+uY{rw(jhFIu5fNlHv8+B_|eMEzM;GUB~;iG~$A~cxua+Vu9aOs0Xp` +z{M*(J3PIoizy~%nkP$xR+e;oioW0h0%UBhd(h(7kcHYB}eh8jA)V`poK~J%MutjnV +z0}YIU4>MdV!lE{8uZtr=|cf_g^TA&asq@>VpT|$9n`4UvTRH!Wo +zQVb^pncOAN5o9o;Zhpz;Hk>;jLHc4PrUKMTe>L`=>&2$h)jUmwMb%tJx4X`J_m4jm +zpE!^fS0~>s+505s%jHrcoOF+czFjWn?P9rHEYi=E`=*~M3i`@7fBA|1{=D42>TO?h +z>n)e+(Xd!=SdP^iR#^1_Rb((6C^PD(Cl4%fv{iG`3k%AFXw^x`u|$-)@}RpStyvcG +zk^uvdCJkD$`QB1p6ip*exh%%Sp +zY$--mZZ_Hpq=4sW6c3d}*Pd}wigaiF65u2VUk~b>q|eHhgZokoDnn~NBcTKhVQndI +z3*z0@Hl%zYRw(PTF%KZquvE@34`+8&6a|72>qS%?4VBk<^cM-?9dH?(B( +zTSmR{e>)caB>8g|{l#)VPmjO+WiLIE+Rx+do$q*87WV-tx)AllOxf*5v)2!uMqnLXa)irBfw>jz#^l$Q4wc3K6OHwm~*Dx}3FG{^?kh3J@`eKrV0G!D=q2z3$+nf2f4Qk<+6vdT_3gd1H3 +zF^`7Xvi~1G3g2^ge__&clb3>iG5Otsh5?|3Dqhw3dA`t8x|;fb$`}||Nh^$j~x*Bha>()$2OmC^I5X}tOKM5 +z^d|y8!%6(}dB45&E57FJIWRwGezX%DSPfaT{ueS+ +zkSAt1F_MNZjRjPIdB>wh6Cf-jETj&1E;+we_$g#0z&kgHSZwNm2z>H8LtW;_42&yu +z!6_EnfeW`(>5rxxzATN!QZ_9`9~}p?&Brn3LV^wba=kOOvw8cEKGt4&A;~vYIoqX0 +zJ4pv-bJBsuEGfWzHkA)MfA(Ym^7DLq{p%h|;mCyxO8=HY5Q^%NqB#yqL&p=}+SZnq +zsze*^vk^Yr$vCWFGi!vfg!}Y3*D=8$J=P0zd7MCj``%fIky-8H_9Ymt**v}#;LBQH +zsPUqh$x#%NP|I#jS89pEPRa+)M=W^HoQ~_TJkNo)e^8Lv;S3N;qU| +zoxaKTB|Lb7R;7pu4zz5g$+g*N3+nQaWMIZeFGP!s3-o@4Ye+-Eq=UP=^l49Dbv%6^ +zWor`*TZBqIEy)I}bU7jEexnsIUYFi88+;2u>n~zh&cfoy9-05uTNk@wI%j)NKc`c= +zGo7Y{SaOWbjg1Q@Bk-T^+xGVED_?on6Hk0>GJ%)A6rT8O+4mPq?x*0eShc`%TNhzK +z8J*R@NqI+Ns`z-o4+otY^NmuPWjtwZImbHC_Q9|<1SdYE)c9@;palCHX +zfxziPEcvJf{E=50No~}S(vD&(n>v;ECoVJxbEAEPwn}-}aWboXG2+ +z#_da9dAIBh9FOD6Uk;iBRy9qmR$#_B+?YKygm7#)27>{l<6}t&3LUysB)zODGc>9* +z3VlsQVysJ$%B}^n^}_jFqcra79gc+xLlI(Kr~wuY1}T{aw#K%k{@{0mw@*J9_eWE9&cXvucCh_h17;|%buIH +zUWMjSCN00$>8!98=3NEq448Sda*|+8sGL3LOhoo?8=o`H9PZtY*B_6|r7jYbnkHi| +zT!CF!aFrRjYFcxBCFXRNH-B(|w7Wxr(^Jn@)6@nC3qI#jrt-YM$+KWRBZ92e>Q(^P +z+!(HD8f^bDXUx*nl3@VmTp;tjce}g(1g%KSOu#xf!x?nMo7A&lxI?>aR+Ti_WqKsa +ziPHx?`Ak*(E!+Y6aZa}Pfx$wF?n}`=gm+7#Pm9AT0pNwcbN)%29$|3=i^Jc3;pnoP +zZF;zH?(Da}=iLvUjD7v-rvZ5wfT4-7u?era3x4ktWp8%TfQk?f;(#DGZ)KHOxrquy +z6L>(wQvqyNA7lG|KhVZ$wB0Yf15b8Y3j>OoXDtVb@%9SfQLJ*%2)l4Ya0?kv-HtCL +z9axA13839&$Pl)up;XzxltUMB8Y{#Ad5JbD*bW`&6HnU-&^^Ie@r>zU!ghq|i{Vsg{1>C>|M}5u} +zuC?4}!9z|`E%NckE?8kLr9lR~TQ_LoNTHxqEb2n9NQcln?@wLA>rY|w1MFC&x2>o< +zrC-kz{3X4|!OBOJnrRe-KQ)OhflhuPos`F(QMECbRlJr0AE;*@DCS|XbCe8N{&lkO +zYmt)RxSV~{L$CeDH^1>suetL?BEKNFn-D{!=x7rjxCcJ?5$O9ud&sDr!3*mx8~Mde +zV7upq&zS-IBOG&~v-d#byeTIpdAdKR!W7c?HmV}1xKJZeG3J22nkROw4>}bfN7BeB +zX3B|g3)i1?%cW69yMl2QD%$8I&k_5Lv4m1!$+vUa5lM=|Z;`&w?l#`;+~ZH{WN^$u +zV#ZHo6cLwzgx@NP2MD|do2o#|@B2${dgqtD?$Wu_CsO!@ykUvzYf(;F-$QSN5Bx54 +zeXTAf=tmqZr8J-zi?}hVI~9>U>aH_4NI7xRj0ZF|4HdRN=e}im3}#v&%~NH*J}{nw +zAwXp*i%j39mz}-@*Pe(eCk7=Ma=IA1W~VAdSoItvR!}9~dXzH(*&nvML!r;(&)~op +z#vCCEqX~~0^}zy0b_Hzyw?_CA-~XP=w_i9Bzb_8?H=tYfP!gh@E%>tg;C&wwHp)uO +zE9sBb!zk4Hw!;`?(l?jMWsPxzQYQs`tcf3T7XMVSlz^3Ej;R!{nv;Z#mGe4I3H7{> +z=o^Pe@ysO{O+dzcg>$wKL8-wgH;okuip=y{11ke7Dq@wKiU^7H>1}uWEx8_G+u@5o +z2{2Anj8?xTHSdXeL5)qiE#ur4BS +zRvGE22Sl#G^Sq*j5RM7pNI7**i2{uF~jVbfJ6t;m8C9*XeyAuT{JG}{C2if#^(;*sU3L9EojR*txGQN1wB|Q +z07h{|tpMtUwfDdJ;)&ROk%<0)?)+xA-EH`a`=Q=O8{y{nr4ZOi)x!b3q9O71RxfuJ +z9|Z13aj1L+s0a3d8doNPL%|J;Mv&-mDM@JNcwLgGWVb}=^v=91iIgV=87YxYdP78l +zK)9eYx8ZY7QGY=85AjF$%-SFemYN`Y%D5h@IR}??gsw$*F-2a}Y89c(8gP1tj_k2( +zsHJ0@5|Bxt^dRyW0E+aJ+o3y8Ub~KWp3Jy>QN%x);ye@HLlqQpfe%ja!dKo8zwrTL +zr(Y=sRp4Sx2N~HfyvjgjeuSjW8hp5F+%l)Hm-O02df)2tvCv=4Sy;^N`rQOaD4iN4qBkkjy<$7-W8$#&6* +z1tolEj;UUL(!5pQhS2Wa(qgkr_j?LLs5sLS1IZ%&Dht_#kz8nb_^mibl9eL5zA^GP +z0*tZn^-4;8Y8zg5i?b24GGnLAKN>`d^wYA(_y67>{QSRu_(cA`@CuL@ZdHB&VL*hd +z4P6g=+wk`LIUhK_C$-WCSGNo#xOaoWkqE{YtuO)Bg#J;Of50GR#@oEY5e;RS3)!oL +zs1diYj6|gp?|83b5^t9OB*)8k*(V)1-;o~(U6T8*TaqiF!Sn^IL{E1pJ?J=94#G(& +zI~zs2DBuEJ@23P7#bOgI+@!HcVl9Op0 +zbh7TQ?`Zox^LP>1lv)`buj=w1sTtU7yE-4Kb>=jUlE4hlY*QZa$TKzv)>)hu1rWi` +zBxuTg-A)DQpXcfaB!8Ti87j*bqp=$G0h>Wr9Y#Sr%M7)vww^cH;Weei#N +z5SDEPkBg;thO@THuMp?b8du^vI$k+MPLjfb_Rn*V2O=|8(LL$UiWS-pjKb(H^5B&Z2{`QAXWbq4f`_v=< +z)_aNgrF{ei2ZLo0EL3q3v%gZr`xowo@#rQ)!yMwrh{GZ&!hk*8)zbnze{6dZNjlmq +zIQ<|+A*L;Ps#tQ#J}8?kMKGWg`n|1E5wa25seZV%`7c_t}OO2%4w^s7B)pmfzPIV;JmG5Ml55+F>8BfB*Xoq +z>EHZ^|MTO|Ts;xT7ytH=kNl40yLHwpB3=_8)Egj`UxEF=zxPJY2cq>kO;4K45Qt@! +zSY&Km_62ASGO%t}eg_I=k`5&C-+BNgdP&kQ?bsyZ7^N@EaX&L^$`o_DyX=?7@yml) +z%Dt(Ikr!Ob7u(#$7oNj@sbtRB(~Ld}1x4)AePMO?O+#E)j(gR8?;8g)%Iuvod$KD6 +z@9P5BnQdtM_^D^))4Wa#K#ZYUKVndl{iE5B{Ig&Dk-zyLok--1c{@DZf8YDwyRkt* +zj`;zVevj3Cw$@^^bJ)I-njWfy=L +zb>3%|p4l`yoRB$5(--OKYn&bIoQrb@v?D^_hI0KuTn}7LrNB`m@w8C7Xp+=ir)C?~B&@K9RJ*$B= +z8AvjPcFJiWq*-!g3WlTu>Djvv7`Z=7FqiR3>Vhtk<0zeT-=qV{{0B;ZTT2Nj8`cFZ +zT-wjEiqNx9)|-PHKE%c+p-(!{k49mFz8f{;^ghjq^r6XZkGx7rbU_0{MbPO=a+mX7 +zBpvAdr=G2g0Rc)Rq_-dcFaOgMiF`3{Pe1+mM?dnu^$j-v9wh{lJUGt*J2Ux3eA(zh +zr&>WMfu4SD?d<)P*IoaWkHWHJ55S3YM8m~6L)l4ok;J`&-YPw?i3d89PtqSinu +z|6V>0H(c1c&qdv}#5nZwjKE<{Y!G+rJpIark@Z;u-4hS?9&wwWg`$wPj?M(E$`xfX_pfG%$$;W9PByx%8J4xV7ux?;EMq)y5heN$gvEY|oD{cJ{~(Re;jq0_kO+tG;n +z!6W7!qJCBq=T3=$pzpjR!XM$arcOUm<*sv=Qq8t@mS8`v87jy%59JIA4KngVOk?W+e +z`;xD}>&eEd+|k=St`@0Or|sO$Dl@7{O+gLmD1`Q@*8>4gjD>vQqxPhYw6na4i% +z@!$XO?|yW8v}i_2iPkzc|A8e{=(KVe=rxoR9=M(qJNl^n&ordZkkN`dz$nGipLR## +zmi6%1l+6Eke*IVehwu7}C$jhjx&6wo{B*;Hzlc6?704Gga8||l)!=X0ju!_}P~R)0 +zG(}Hg_a%+?fJAjt#6ZY`m8NhI3ek`Sg`+7M6_5v$Y^As8V_$U%;=$uo;@Nmj+Xn&t +zw5|4dQ|Pmha%XY{%(Y3H@Tyn8@|(Wp8(#a`yFb^tc*QGTmj1o%tKM>SboB7UANs{# +z_!n)v&uyy4uS37-=rj$*BFrTJxffHMNzYE1!$(o}5nR8dUg2*~B5aQN9U?Zft69ozmT%m0FH +zzi`Zw6G;Dd_O`y~KmOj=d~VTSxovK4zU^&qN&kN4XMXXQe(Ak!%k5^S^;DXcq_CZ5 +z;!!6^x#R$7GNErpl_esgG)I=5g6vV{9v$}(L?yPGcxv3QkguHFUbNef{xAQnZ2e5x +z>Q;kV3AH9b1_jwhQJHBPRIpdTKSt)j6(ly^&GSz`fA*FOaV^>c3n>JZDO>R_L5I#< +zpUGKJW@TI~6<8UFNz&g15V;GpC;MgSHeMymRd~Y|V;rQzHDAuZ^vm!6_V0Yp=GNvP +z;{<*4H^1Zl```HgviBW;a#ZF1=bV|@a(j}SLJ~*_B%vgsgx*1eh2m46^&x^h1fL52 +z_1U|E`sATLyVwN<#fFGJL6o8hN)wP036Mg1yZ!FY%sKzBoinpHfao(9g{< +z?#$P}-}n2@JMR$;9{y0u0i+Ym`%QA6yKd9YDf69@?U?VD1iZX%+~ZRTtVEqSDwgI>T6TDF`A@Ijv8{3ZZx?;#zcp2UDB#iH +z1V%P-#_W#{f +zR4SFj4m;?UTW%WYA0@IZ9>|H9JK8XO2s`G6cIP2(T3~&QNkze@-W<-~q>MbJT^OS& +z=u%^3#mW`%H5V`3bB9$Px7+G9D=+-Sdm-xu4*>T#)|EuE*v?MOh7-z+(LV%W9ECte +zHc${KNWv1iL;8oc9u-*|(aR$xNi}ldXB*aSup_xDP;tIA?%~DEhHJUlLikV{_-Tuc +z9gM#hmdzZ|Z#-L`4XkT!T83-1C=VFjX~xvQi}d@fpzY0XeqEA`SPLFN;L~|7SWy&m +zC!kbLbYZ#plRQ +zVk=v_odD~EUmS%dr|5!$>kLh-O$Rono0mfdFq$OM+urs6{=Oa)VxfQem*=q#1YjJF +ziSg8d#6QxRp!gn5KR3B#T9aPGJ5f0VqCY?5OLE~?F4+;5jL&Uwu>ZR2e~yt4mp*A3 +zbi|!tqnb_C-(O?`ii?ikqqZUg)I-<62B^zu6;2@)6Ue=Y*0SwK^bHNAUKvw*|s0szekuI8CuBn=9*ROLU +zN`)1XlI#|Hh%Lv@ya>Zdj$vh6nd6o+ZdoB4n>mF2p!7R@gn-1j +zGi}sr4fraY{?aH;E@Q)4s#ws415}<@LOjIQKedF|fRwfJU +zu1QagGGiA8YhB>~4+*vK@o?6W<-RXV%eIJGgs4qG2jG7AF^fC9I=0ifJLHf9F23Y) +zNB}xIF%O^+hzI90F7rdO8xw@w^Kn@vG*}R+!Hb)u5pa--{ssk*Nx2;hfVc1Mfu;9A +z1{|@_M=j$o!MgL4BO_|dRyBE&&sc4-4vgb+W=Q7>sS3biqZwo@#LY!QI)#-7m*nEqTs!o5Vzfx{>b&zZeLK)1X3zw}F-{s!1{ +zm;g4R{O@Ps2L{!~O`gruD8KDlX8wfAmgilJ02y-YN?ha4l)AY^@dxpnDqFjLtsY^T +zL>0svdEI2Go+_433veDWZ^TU{#UdqQhIz2XswhT5M?UM2?Ro}h?J|>^ZYaJzU3o%d +zGnS}Sh+xYnx;7IATpnD`bGH2$7a?X36X-l`hL1h_mH*n=-nK(PxA*PWH~gG7A`1H7 +zl;NMPQ9kFvgM(_*W(jy)DN@&d_oww+m0WqHo-m#eJ-R7BSt5^s_pV>JZtAq1qIUEm +z*3^$*m)=T=Un)I9A_PtodBr8oOwHM?=!gTuCp>4I$+L-p6+aLBomO2 +z6Pi(QgZQWCmInuzbcp%@h*g!q2~{YClX1YJy-s}AQ711sdWUpwcj>?WX9EM0{sy^c +zWhj%t6$aZOd~Il0ZPsdHPk9Am(e!0(80$d5xrMfG92lX)PSvt2fLwOn+I5q6n(Eq= +zpk=VT6qw|k5C;jiB3G`w%RXn2Ce1gpAFyqmwe1~7@3z~nL@+^9HWN$h3t1<;W+{dJ4#y +zM0H>YWpQ#(%NjYYi-BM)2dNgV;LSy`9)Ns&wO;4U?u%)@_<*1H^q0 +zYz{}pa$y8wg~<8cIi|m=D1%ZSO!|;-?~~Zk(axN6Qv5+Lluw?JZyCZwT-zwmaepv# +z7E!U^`OX)W|8X#(`N{XZe&4<4?vTiFzTJA;Z&?8hbCjEwh+pfmoG4+&1r8t<(pF9B +zDL#$Y=`mlqwlWo2-ZG{G$9kxQwsJ{}Pe2`5y-|%6d4i^SfP${SAWqO!Qjy{hvx_KB +z55ysi$9c@Ce2K+=RsjS;yQ!0GB@Wz)B<|7xlVlx7@^Lyj+jZvT9n$|4)qhrmd{>AN +z{m^4nsse3GcFR_La7b;~T(afmty;b|YJw2+Xo0VCauj3&5s+)$c$cYk^P`(5&YWc0 +z2@vY*Mb6nkq(jTyeK$bjF`hin*%i=>)i_iVg=v>^TT648@Q_sPPLti*Ew-7b#0jY_ +zcYlcl7mKt^OOZC)Yu!7_ollkdmu^>7Sb8k!m=<2>P>L)FQT+1L!C{o$Dcy<(V=*-6 +z5XH|4gdsy&jMTby&yA6L&rE{P<|^B|YO5V~LFKeZ$vG~#`dtC?Q65+7WTy+(AIIlZ +z%211k`iOHQAkg$lwp!6b(975dN|!NLp#%W_yY!*u1CUtlxQ(*{-2U58+bIY@qf)@5 +z3R>K-*sa)=^|>G@`m)y$ZbS8$qN@D919c!?RcsDaSm +zKXBH6esExL#~8r4-u}P}Ac4LX_D@}8z@EcEj9kHj=m*t}C%J)~c*B-b8B`U>xu6Lg +zi^P64Sc&6`{%KoT*U1T?ZlDe<@9&z`quUk5HpbGRd@k%IIv1XPiv#j(`)Pch0XIsy +z@rf=dvghRkme|-WBnDB8oQjdorca1gZc;-HANLbkom5U~d~NB251;kc4_^Ak3wFrm +z_}o^nUNO+$XS6r}rOuS{M9_N7b_^#f!Ami;Ysm|SN7P1$g}RDpN9;YWBl6`@TjD=# +z1vjYH=71<2`GLHl8e5ld&4xML4?#ahI1+9N8J6QZqdy+M5J>ULQyX@kVoB7A4@jvu +zoKEY>5|eqv8x{Vg4BCW8I2lWqJ@S*QuiGJ-<8ym-%?e)3$O^zg4%2;>MKBN+>w=44 +z0vqL7A)F6*AQsxtCj$e_jYXExl{d~y`io+!gyES}SRqyLRC5_kIR+}YhHCadGLR4B +z03K|6?wzjN`%&o6uI^GWK +zqkl$pTIr*?;0J<>2#hK8wg^;W=;5Xv5oit4uLay2-Yt_gSUy(L4N&8i23TJOLc$^9 +z-r|Kz$ga-ZjQDq@Q@gT6FtJ&Fc+wQl4!G2X*=2p%=!!C@m7p3%!_AJoh +zNl%2S28Px8{*W1pL*RKRqDK#;uf=D|XBe6pBZojsFGLfpkG0}dHSIE$%!zE>W-iSY +zhd=`U$r%R6Kp@Hil!sJqcLyNFoy_Lm@Mp4+iIh6y8bXGhudKJDIXv7%1O(hOd<=9K +zCm(;zj(X_$+?M|NZXqD{COk0Qpy0$(whyUrSYW}yI!E~k|FkW=0S-9^N7VXUP3^|k +zmD5G76LcUh7Dv;2eIr@K-TRi1cDqpMRJgrVrD}BaA(PB8d5yw-<(o=!PfN$yxSdU2 +zNoIXs%UY18O=Lq+LODu&Y@CB~9UvolwsQ`#}eq;3zsf+h6(O6V5vIr90$u{BCe*>O$*jiWQD6@s9R{_hF?e +zV{*9L6($0lpHL5&HhvT2112Aw(ADD^0C6!&?45%hTB*WE!$g}oB5E8Ry0k=s(=8wkPKuhr}lH~jlB!2g`F&pb6))}^WHmehx9)c9)RPPdYh6l +zB#+9JXr~kcIp5pj7FaOJQr#~#1l%_L0f>c+U0>^%&Yu)JB}5NAHo$ZbjKub&(2n|I +z))u?C;l&XA;BwMjs;D>w3=)*C%Ix%Jnxv_1QV4{jz&WUaOUJ*a!X+Ru@DXuJ8=i!O +zyeCe0{S2xouPY!79OT5Wf9+K%}fnHth+6CdzuD}r$t!2L@)FSJxL`SkWN#QdLF3Q;h*Ti`qA9& +zlx9&%Yn#~W+i +zG63l}dA0DNmuCh-ii|n&sOrfcGUe`qmEg*iiA8-R=E4$4D;~hI6TqP=u%viTNe3XB +zZVqjv^%po@i?PsC5mJh$K}u>|K}m~;aUCV@X#Rjd6-Q9RnIwVPUWbK@@(#skpG0vK`F0 +z61|*P3FmtPCimb|D{;Te=nqDrC(#EdfYCo3yJn-mnYTAfs3KY0I1cu|JQ)qQ(%XIM{=0}{$x8F|c69dnL?rckvphEX|t=ecM&~n}t_-QYRh;*r`?0n%r<9Bh)!|@N_!3kvK +z2k^i((;+_w?8Yqx2vDdZC1~Kb?a^jql(rKzn5rEiqO`t-SNy^42S2`Yhb%rd3NUXG +zUn)z00$E!^b{F!si4zfx6I8<5$9DT==~rP@uPah#tx7ObdMe(k2H?qQYA5A~0c=r| +zrR{gcS|pXxdvj43fsxWW41D}n-^U;C>n+~-IPYx6DGBC+*uMKN{NyJ-`k1e|_r9g) +zee5$b8jsx9r~%hpd;N2k9JlYH1v?~ioNt{S-QWZsSb7&zd0G;zoJ0*CBcpmIsDZ6K +zVoULi8@v0ckbYMRja*Aa%u;JyL6?G3*{24TT0c!q<7L5RC|;C#R5?rzxP8Qz3iJ`?)aNF*6g_bUv3BN +zeyUSo$p`m)77u(+LyR*3A-{I}h?PdTidOWcjm%MuA4f=;By;Ahgtr`qaQW +zwIPUpkZf0M+Y9keV1KrybR}nM=qHfJbVvXj<01X-FHc{R?a!581GQb|WW$~TA(!@~)9kXIgke_M$hc(ze_2Urjgrw``XlfFNu^S) +zRjSpMtJl8#w6p%a?BN}9Ii9zZPdEi@L7CLlIUM4wK#u9M_V%IMeRqa5op425{V``ry^m)bz4CS)mLncvH$44JCascT(4Bqi%FmkL-Qq+%Ns? +z!p9TMamWGs`&Cz0pv`Fcbw?ljd=hcGS8AjLxM>YL1vavIoZCFglPpFM(OGYL+v{F) +z>PugA@($4)pWDB^{6D^Z>E}@N6K=1%JlEg>KvHvq2u-2$*Qf)VH(<@tmC{zObr$`y +zFf-tL1+GLQ#8p?b&GZ@M1O4mOdcW|(I%$LzwIeG;h(a`EeN5%oOO7l3$z$F?3;PH3 +z6Z{pt@J2^u`xA_NVlw`q71dh3T5GG-+iGp?^|p>LUwrAg?|9#ub?bLX=Q!M^?={!X1*joo)vna1=O!TW`A&(qFhHSw#1Yh8W?%Z?;p!X%)q4 +z(nPg+lj21VA?7iqE|}6S4FTi1|M``%E(yKzGr_D3kQ2k}K?ef)a}Xt>hSs*|vZ->d +z=_w~va9*t&&24=H`!&bAgh3A=1_JZ1BVH%$Qyu3rP=HD`sWhUr5~tOuF$(|u_3!@h +zi|c>WJE8li!wx-R$#L`M%-JEbfA`z#UixZs#W57{BOf46$*;v-*h;we{Lc?qV!G3h`g2VlQ5(g9EgL%a+q +z#F3iPt2S&vC=SFtu}8%T8J6|To~7Y|kO{}7s<~p|r}a>RP#Xosn5w4PR*}+W>crxi +ze*p0hz}Uwb!`GYvQ|Fhn0MG!FB%lVG`eEenG_icy7yx-dhQF6>WSA(Y)n>C1SE~s; +zf@jE@X|uU`VCZ{4{n>YZbOkuX{SP_h*@qr-*rJ8IY=;f7&$QcH-}3QaU3cZ^Xdmi8 +zr1BVZfXFY)NC}yfatvcoYH>TpMBEp~{B3OVqgHNo?RjvcLPU!Fkj#;&%j9iAp!=~l +zs(aNGgF7Vi@}QYG10M?&BrAGb{&vs!GLB3;Zrfjn%fV6XLH^-C5d4S}NGjM2AWdM< +zD7-U86|iZRqI#sws9KFc`qOG$tI<$Fnh~xJ6eCNUx8HKh&wh7vQ|Y~SoAb&g$GvjN +zv%A}O;3@vbTUS@lhd*%9Ti*IIOnlMyyU6Iwh?t@uFrFgLN~0i&aAV|piiH>lk&`Aw +zeqCg-D#rRj8SQ%ltv#}_Kmv{Vz}5{^7xLuN+9w8qkTT`te|W67chuV9xV_%lMfc9O&h9oi=<06knb6)d0UkRh +zOx(GnqmsmTKeX(fU;6UQm%QxkPk!pgyYGI6i}ISatH1iqFZ~T~Jnq<&jydWi0Yu~; +z77-v4lpX}UknrPb^aItT7@;f>a$%a@wMe{CEo1d+%obo*u!Vvj*s@lwDbX_)Y>lC` +z7^ZL@r!=F+Zz%F{e%00?>i$x!V?rS`CL9EbKGs9wzm;0TZGn1QrCx`}T6;&mqXRUd +zt)sKn-dXSHY6I!-LN#dX?y1vpM^DeLJ>8%os#1a9b;&P(`P_HD6Ye)WgVkWCY12Um +zPCfHwx8Hf|U;EwII1k8` +zk(SjP6b^BgS-KT@h2OWnU2laJJjSmxL!-+~dc*@zgU+s67wAJ*dsp{-(1ETl-PNT!I(TdI4R_yl$T@Gg +zZCrkMNc{*h$GM#Fh96@Fr^BMyFIDhFXr6pjfb$7%qNf*`8Zl3Klj%7Az9169xm +zRD+Is7iI<3F3^F_z0nVJ>+WuZCDm&1tNVtA&idqqaDN6mfuoN+?&U8z1^1Z_4t(k} +z|MkL`9)J5CzkibNJ?X?(z2slt;2FkCFlmZ;azD_B$GPABLX>jg2WqjzMbiCsV!5^Q +zjOwbiS+z7frb^5!*0q#M74--DNe8qm^59|+(J1}YM?jBLYtpiV!E72Z%hpmy0O#d3 +zl|(hgL@{oWsZ>BS2pwI)=m?TyNDnYL!sM8B022dn2#_dubf6}5c2?TktDPMf6k%@A +zxv;ydy`vKq09`>R$B7sJ^6Ilb`QOjPKD!S$jJR7BR96IT|>`_L%RUA5RtKawx|-&G46sSvmi +zss7Dsy(uiF +ziOZKhe*XW=ojYGPCpvZeoxgwmIcJ{vh7*5(+YNv5z3+U-MN5{viql^<|9LJf63*iq +zl-Gou5!BQ$-ic$OZ8pg3&UDk5JuCI%c@d{Aw3bb>V;!MqpkAU;jJid($Vl7VXr2kp +zwN8vnRNB<4V)9JqxydW4(J)D(DisZRMUw0nMR!DIF!Huya1dU9$u(EcnmX;>|90v# +ztGeIWb;0?cKIQZm4R9(IvTd_P2dGj`VfcT^!ib +zb1RhS41BPv_9g9046apP+)9vl>$fcpPKJoFsp}}XG4$Pao2k1Z-Bt=e^ +zNW+t$1C^To{jE2=>wRY)|NQx%|KfR%u3rAw`M{elI_}t4g#{MQ6(hpBL>_8N8&Ua3 +z(^$o6Cv1YrT-&=0^ +zW3cvn?YUd|M~|*vPa%+zJ#5V-Ha9=4C?R&}888w;XAn`<2wP^1p5VrDln9)f +zI>)FXkUwA#p~^lXuA?i6!687B0Qa_fy{&yQA0=NY_Fuhvi%e4G+UpVjh=gmLo|Go6uU;Sj;x4+?>i=KbN8+dP!Yz>rZVH4qm-#ZmarL!0!Ck9g_~T~x;4hfdOe!eU`8 +zGKzNq8}&{%|y+p){CkONdLKSdg+nJO#9Gzuf6fcE6Z;`?ezaX`|K~5 +zy0CcT!7;w&ULRO7IN-^3(mSEO=KVmVTNI!re77wUugW>JmMpoL5nyCQLk$nB0gah= +zG|<=L+4tOMZont}@Y_Gzex_yBs17+u +z4G-(G&+=?!oFlN?KpoK3K~n^!U`8PflE@Dj$q=fhLi&JCpcdC5G(tbHe_IFWfMy-2 +z*WeS*zVKsxgM-gVKL9##NoQwQiOSW9AMmJ5xLiX+TYq}hx8C{gmmGUs^#dP#=@nOe +z=HZ9Y$scvhtKRvZtLtq&67cvv8cG$s4`n{kj8#I%6MA~8v4}{tx1Ot7){3>P7}Lde +z86J(71i%(ug1{Mp4e3-ha)-Q|dmc1**ZD1M<5zwEm;BkQR;+#TDJOJwcW#e!`t`4W +z|K?jHv+U~XIRC?MF8}nK-}(9Sm7C(EX5uQ|qpFT8DyrxxQBeZnzl!3GqfviqcAF%W +z5u7YISz4&cGhpQC=#)ElA(25kc?h4#r&uyd4!s3F6I>==Ami*Lr8Zle=9vcTl%`wz +z`)bw7QH%C_2I|11Ns|vdhu{9G?Qu5y`v<@F^~*y?X;})m;|l>Ji($m#6oT21e7}e;;%tIpq`PpdGq%C;^)W@guz+7 +zJkzRGiQtVN0}u&AzYD>})(7sp;ff!f_tPuR3s4)a3%D{@DtRet;1VrHVRYO!VOk{; +zg>kKEuhWlFRCl_y5ac7D!dHYQKvOlYx#GGpG2e?{bwc>KtABd^_Q(X@`nHdO4umiI +zn$urW{^@-WJTf@c1nD<)mjOsDh8n2~Q1Z@S{@xAh=MOpBGM_Vfs0wQDSP>{N5(nXQ +zPy^Bg3X0&D#F_@pxJDG!PzU&4tJN0NJ0LgKwW_XG-~-RT@FP!y$o}>_Z~OAszx3C> +zYmfPRU-_dO=Fi*9_i^#^MP_QfO+XEJkEpt03M6KzR|dxOF=hC$9W20sV&i*Q*z$?% +zlV*?IuJ+^#SEMIy5AOBqbQ{hwd`i=v@;@WK0zNdSKIlj~9Rqu6J_k>b-y$t~ZV2sgII@7`#x54|Rm;~h8r@%Ddq +zbG~@L0|p2CUwQgVZ@c3Uf7Kho16=flOXtnot62KzToO%fYcB-Ln3gJ}DXp<^L?WK3$CJAnV^#`<1*w`1wYaAs8o_9zEf*_8VM;ar~KKbaP +z3)s^Mao#OA-p;=Yj<37+mXrVW+0|P0|9;+YzWI*VzV=<-3*zm&mwp;@fFe2?7<%{n +zzmz%1P-{_AHA&sXAesr}vMR2CTR@Nk1VRz6B*$(q21R*O79;&C$*EmKCsNq6r0@@9tg^683oYfd@-gnxD&Sg`k^ +z%f5HXcfNPY;LyOrz4xhBp6vAni}0K!Cq1%!+4AKN@-uKXs!3O^Hi*OTm;>PDO7KEa +zr6od(&e2iCGD;zh37~%(2a5wM1mpmC$0`V%mRz9oN +ztz(lu5MpC!xC#V+)sMgRzpIw7E`P&w-*x6*QV+$q-h0>5mp%XW|93y|i(lL*((e%= +zZ+g?|GiOd~Nq;Z?>A-N40`w5~!-+(1z+*AKJPLn4W>C&kV*hco{^4@*3Ea2g$^wN& +zwv6rw&~Y|R6g7I{U7WW}Xy^drB6I~*Fa`erx81AlH3)dM1`lxKKfe>`?C8AUqn`p9 +z`Oak*pY)<7-}&yh{whCk;RP3+bmB|UyUGR8aWtc|i{nkP?#%m1QD?C((v>(5i$zJA +zw+(~_uw!6z&QU99$VsQap!3e^MzvLyNaM=jHdO>v%CFEfC7yIuN-)9#CFC7JqQ$=c +zB`-L-9PRCQ(1I&3zoyX;8khC!HvZ%XzubG#yq#xF|J#Dj3oiKjTi$X(o~NPt_MGP& +z`H}PAT7J#I;P6}C{@L7tM+sN1`dUV)r +zO7$Myv|vUnUfsY&AvXDVPT<94=Hc8}dI6t27n~Bphn&kZ@&Gw)rNPy#me`&;ay3Z% +zx>v4S^Qz~b_|KjR^iG<*(@xWWeZ#Ms&BjeP|MtqC{TL*Bk9m7O$+sVS%yT+Ax^DUX +z^^ilw2@YvjD&4huKllMQ`E33p;!KCLi#|bnIKBt@@aV81)KH|E%$aLNQEt%#INW+? +zqT>&Lc75+o(t*t-n1e1=ew1q2x)*{j7JXelaK*4CipYI`eBi*N_nkRAFpa9oQzspL +z{GnHV|C&+I0n#||0N?x0&mei-|G))*RXFt9-`sxctKRXWA6*L{Li`z6gxqVdxnKVB +zN2}FJ`IQ%b>f5*7xh#U37#)TLrf~>uR;TR_o7F6nzx;SV$sbBN9(_J*k04UICab)X4Uv$k~Y1z*?}- +z5yIe?9C)0Ib$tQoKz*ayqze6M;fm8O +z{mJ*eA0Qif+aK<^_^UtKuzu6-^JaJdr53@@uDanr|MP;6|JPU7Z`d6ELePPI_L=*= +z?|rr$`eXC!_xF78Bi|s=ui+g#05y|T(E~t23<*F?aX+X5nwJPyi*qy|Y1{y-9g4Dc +zt47_XOz+uAzSCgxW4R=1w9f=YF}QimiGdWC9e#|%**=Ft56&VZS3t)uOHmopw3gZt +zo54$$9C+x{puTz7AxErPyZV8p_wzqjuX*$r*Zl0tt9}SE()@XQK8f<^-bWtsoa=A+ +zX`VO1#>bILl8N>D)@Bnqg19qaybc(TwPjz+X+U5);l#k&DCht^f%$;`uh*T&uER9U +zmanhBS1m1V*5H_my^7}D@qFy}?M3?z#xzTy?n +zKmYu5ySqDDI|D<{dhQ#BM{Qhbi;}je(gx{oRH>_^O@kju>JEY*2!WEsMO9mgtu}ca +z;XQ%_(=QGfd|JD?llTI@L!Zu)&eN +zw3#CjMPpnqg*-)MjTXkUMGc(}Gx?_J;i@zbWvf98Lj +zcI)l8lxPYtT$ny>`pGB0=#?)&4ML+Qe*3z0tIq%E>sGG353;0cB|@?R_wYbJLi|B$ +zQ7a4*q8MHXU{M(oI$#+$IXMRsP;C_Y{<`zAxXL}u5#9HVjek-P +z_)tfC1>k%mwxv0GKa_)y8CiX1EKNxbQreuCBDX0Ld%gX_|2X}emyPXP^$mRTBVYOQ +z=PqR-mZ-XrX(eO!!P}Jho?QuV*VWSjqW_9loUlz_Z0OY2y#LS3)=}64canZc1CpAq +z)OB3Nq4lWZ64U{Unh-<8&!V445sE%M#z?~ik4^2;*fe6j{{;1l=_KxK<{?s|V~6n) +zUfzszFVF)_ap#>F4nZV= +zY`FQu0|O}WmAD9g@J{fam~A$V3K-Iahz=AefJ-br!fUfUMh$xQfyYU{3n_O3u~0|H +zooyR17E-E}{>>?Gr;8-plrjW~muxAE2&0KNTz$***;Du4cV0Qysnx0w3mtaU;*~4b +ztYnC&9>YTIW3f>CE#K&$uXyDNmtX#=0}os5d&y4?BX&$wou1 +zy(ZJ{J>F`&|9@yeeROy +z-*oeDHf`FVia8~jEqq|X1>!V5^*^))}aar&&Od+j@SjDGJtYx+x1Iq}dV +z7sIRnbobIi?^LOTQf^ex^SkV_)7k&=vd@0*y`TWKT4l^ +zH*DD8EA*~xNL#8uW!6p +z-Ct&T2+4q7tfWKTljw;w;o+F3h1aJ#+8m6dn@sTwk1u@nk_*22uEz!Q^bP#>#@l}P +zn>+5ld+AL#-WC*qb!_KZJMFy7PKO_{_<1KBwQ%9%MhN%Zv+Rv;`pkXzubnWlR;`ik +zNAz2b;~x#m5JAviLkwJ;2)_f%`iU$1O0D$>+5g5?dBFb{ZKgc))fMgN<~kY&~xAc +zhwi`M!TaoU$edmGETMhx`^r~d-`~F>i7OGf?)>(xTgm+U;t!i-UIEVshVC(Lx5gYm +zV-ys_U8y*S>kSIvC&jUL#8^&5b&cvxU*CMcx#s +zg$6d`Rq_tEYR}(i*Dw9x{F$?NdNOCNuWtaNqXi3}Y(RYJWmmuN{a^1NglrZ?zqhwu +zt=HK6W7#LEYRCbi3dH(Y0FB{*%s+@ed4LS0IR*uYGVSs>Zem#PQn-TxP!imT4Jkmb +zR1?1CF4HHTF^P5t##*uh^b%SW0Fz)kIS}pSRQ^vJc@yv1$VfUeoDK~_)|-Od5A-(& +z1|bK4Y`8f*0uJNiPkrv-efR%|mF90>@y%Uk%s%pfqyO4BzVCx?zv9Xtl;AaPOa(Dc +z431J);L$*i2FGx)XyHK%7aTNY%1m$qGiUDcg)f}3Zp}k64(U}*{<}?^$gnddn^lzC +zq9C%oq7GOxS$SeiV)K~N089Wt4WefqaI9*fK*UFb8Lz4@fLN%LVxh2PyX77#p{fL+ +z2vyhMH;UIF7GJMlx8B*eg6)V=B`sxpS`71wfg58d4 +z#?(wyA8pp!+G|K{f^9DhevE`Y{Ae`QlQ|l6gki@17owIUtBHz6asb0co*d`Ia>d0S +z?fM1=?vL9Rw@L19rAlQ^U3~hEyE$qEPZCV1${_Un`RkkMFUb~42M92 +zmK<^PoLy%9!z#d{J@)8@fBMyJxBd9KUtcslxHXOwno3IIWOiF+1>^%9T!ndDQ`&{0 +z1s9DiFxr|Fk$gfdq%jAeu*dmMGmbn_(FZ=<)E3n0ceZa*8+}n#l{NrqUBp5z#7IFa +z{6BR$H=y5uaoX>$zvGJUUDMgqw#)44wR-jcl4h-3x%NHp`SdyGd}7t3eIWW#)P~Y; +zY8vnL;YQNlUaM5F=Ox`=NqK1i0FoiiI{`p^jbyaMxJ{ibh0S29Aage$H&ozJRQ{#X +z+TdXS-ATuRb;S)})&XDaK)kdqrt~;5W;IB`CxEO|?%T{7>>2m~+atTrntkwoi~o_c +z+anJ=`tz53`jcPzc(d79wCBFHYW+#R@wj7_OrJjE*VkQLl(;?ojj*#3foL_-l0mE* +zlP17FE1D*cs0WPX#xV_TCq~1Co!eenH9Ty&-XD2dhtLP$tQ6soAoSMwUKr=W6t1w) +zbHavgOU&8OYU#S_J$>RHYOm6GfGh7_72Jd5yUxQxxl0}UVTL5af>kBLdo|MZs49;> +zvhmHY`N#pgpY-1U{O^12df;!cLswmO{VD(Uwte^c*UK*b6$yRS7`O}-l>Vp+nUdBJ +z_EpzyN>XxvaMnCIV?@wptfKiXgQd)yGFeZ&Wc?0KPs+-LE^ZjoGn-c}|DQf503pb9 +zv~Ls|9frP98S=2<&3T*WtSm7g-|NQCVgDoF!0`XYKC8F4U2DJIoo=}; +zfc{J%7l8YL`BQ)7wI9?vL@7KKuGlBg?ohPuQ8V87)xP`GpSTGC^6iR_n-1c@7narq +zQwfF8)Hywq`MqYTN^@C&2?tF`407GbR0EWA)^5`eJMw@-k6gT9(YytV=09Fa0QvFV +zcP+i?x3`1zJ05KWp@)b+!bgq4PaPidZmJ6IQN>Z@Gjm3zS_A8maM{NqrUW}*kPkrC +zO9v)1m;>bzXTuQp!=r=5AdMBb!y0(Tn|K1S7Gd#=8v0ts)@ILsV;2gt6i*?6Hja?f +z8cUy`9BIQ+(-)Fp2LaFMXgWO97#z%o1{;tBLnhFV9Wh7-;B=mI`kCjP{_p?zscqlD +z))P*9*4_8r2@(Lx@VWE9cEmwXHZi#WfqTz=^O>txuVSbr$aED!g9!eqR`4-N@JUJo +zRHfo7h>37X39|Qbz<857w)kyreUidIqB8MoqXzXzy1C7Pv*UQ%-`$#m;D?bx!6bSGcuaNhRq0b +zHxs(bhD91cV#_Bk+feBl4=YDZoHUi$JmW}qVH8ax&zQn25;=7w3(A4KmV7LUqYOeG*Ze{NV+l%PNy+Qx@M>uj0V+y +z0T!MxIF~vk)78VeC+#9OstoQgF+w|`%f(AeT`DS4(9ni0W&^a3h#mU`$OrVKGdlNB +z3&IZ85^KqfMS(*WMgkpUIbYC6mNEn=zElG1+8biBQGK@no%@nexG< +z|1;E7Y*VZaLj)>}T-(6ZVa3>6pInJD;8ogd?mrV00(9WppZVb{U-;@!*$3%=!70Zb +z^Mb{f{qQg62Iqb7!Vi7m!k+G)hzR%$tuCRtQr>4s!8sZ+#SS4v@E8P9yPd9slapOP +zxO37xZHm>|su=GsGFM%$8j)LZEX4dVITByWZ*tx`x|*GMM*Do96U&f6v2rGqO9djq +z9)J}f;5ED-ND#GwxqK3yA=9Wp>fB>(5uhl=j~nP1)duofbOMBHFcmsU6*T|!3{viq +z?Z@;V`~c1EfDSygS~XH?`q8K1M0~*l<4ba`gzV<$SkS|M5TP#r~l*}RfAMj6ydicUezyA4;eyy~XPTh0goo{^m +zYZf27+eP2_pZ45wwceDoB+5oxXq7eSHYA2o1Hc#!XWCl`u +z@)cKt43!(*D$J}I85WC6`9Q+vpA-OPnpM{3kHhXSzb7IaFLy(CI>1qPR5pWsKyUsl +zO7q4X6LjFgN7YEfs)9P#lk{-}&tXpxPc8xJ7Oc0N#WH!2EA2{N_UF$H468sS0eLom +zEIDS!!9L=IyoM+hASQ58jz8*X_0M^G<%>?c;m5akclDIh#1$(adCz%o-hID`=e+GT +z_uTuqbf|N8-}9?qyyD2iml)buOB@hf6hc>kwHJ<#3^V#M|1%CUaS_il?1aEqc&*y^ +zt4&yFJ$JM!CbuL7%V^;M17BRoFr2R;SrP)f&8AU&Va-i^O>MqfsJE3)p{0-nfI}ct +zl70+$R7Gn8QX%B+YL6}t?_ig2nP +zT&+f$j8l@>#tDo=QUX6cS6a4Lb_=>>^-BRxku*QF?2DuW=sdEVTu9D2m5kVjB7^5% +z5=4qIr@izQ|Gbcgg?sM%$6q~k#6ic5T|K1Kr9b$_aVPG7z)^E9`r4;fu6ktK_jYu2 +zec(NxIqQsfzyVeLHLYz>S{HR{j==&reTLjq@|C> +zjBR%QoruyZiyB{_;xqjXuYO%kJfkv~>Ovm0={$F|RmEr}hgI5Rii{uWj68-f65Ed= +z8&kZLs20AuG4k&ysYP+8@=ip)F~W!lLLd@x`X>ui%-C3wekZIkT8hNx&uiT9DBJrm +z*Gc+7=Rt>6gCV{TYEbs0WqmEeA@&0gez|WzIshE>6O$#8t>n&+rTR2Y;>Sbw-~W*P +z7XMSje!v6##{har!)&!LQ0}kQ6AAa)zN6vZiE06oiH$Js`&5AK^Kl#K{KlHw@ +z@4D-rMifAM+9@4kdgX^yxXi{>9kl5jWg^R^sN>r9jwc)tQY{wC95)R3EP}#)(HWWR +z^Ou(Sa75_o7Z&*(T)euQa7N^Hz_kt#b7D{?OpgM`5&bjfq7Y$IwemGn-$6?rZ^Z_M +z{+QhwIgl!+M(k6>Kc&QmC>|6|z7x%JKz3^>bi$bfyKI-PcEb&+_DEV(*mc%uMltv_ +zfNMcz4^^&~Do;S8{e^mH+1L8}tT*=3VU(I%AV+r0sD;XD^t)bv?$ZPP_Vzcv|GF!0 +zpEYxK8Q~tz9Eid#w_W$)kG=WG<7c1xy2HQq?ax2-@crSvvuEw`(GP#`xyPSsr29*z +zE@DW4 +zszg)GOlV7Tr8f<$uDYYuEq<~QF>Q`oT8^PX*3ccEVJL*o#n(Z|Bty|wbVl3O(P*o- +zZ24oYx=$Q&DGA4daTGYCsYuJikf@9Jn4R_Fmp$*uW1cn$(5aKBz5GS5ZZ;dY-g&e3 +zLnOjqLSv1F?rYYpTDJ1~Ykzs|RloSovWM>J>))8=&B?vf7w&!d{CNj1d-%3Sqn`q3 +zR09%4A|Nv|2Zmv@!$iSZ%4sdOXmRYFrc_ZWl3o|JtKro`jpzujh8&4Tzwh*Skx4Wx +z--herY$_ebqde5Y8sa1%#xH>yLamB?#BKVDS*q_=GJS@Bmh;n?BoUDl^o+5BBV*vS +zCA@Sq)y-Uw9(eS;@BZ>bPx8#(^xJ!0^5TygQ#Xbn4-pzs +z!wIgyg*CaeSn?)j)+$0K92!29{yZWmLrj9MZ5BXi2GwBjVY~iz?PBMlpx6oay-*+O +zmVjI;#PX$t&GQ1fu<8h8Z{ok(-Sxt9q^=4z(qSgS6g%Yu_`>rDX#%nS6*q!IVZVfH +zK{O3V&0Q(NIw3Kl;tKI58K#1hTAFh{uu<3yynme;&UE03bX;KbbU^-86iA-Jz?V7d +z`R%z6lgdqvHx#I@dvr99??oOx0))bS&AO$x-gf2H*L-pHnx%+qNT^K1v8p5UY`CAJD5VlM +z8vdzkT^E2Cq-~CxbRbg$rSy7?5Tv;23h+a@-a^s8pI@+6m0Y{_FM#CP)LicwZjRY| +z%o;r39@ecpV}#_CfD#Pe=4>^7@)m_0l2nZ(^w%^JcaVy +z%bQErq(iCazp`0L(5-A^(|Vh5-}x?>DuE`#W)js>Bzc0)J9FpH +zocq?!wl?+jy+LOD;dg)XN8kSSq6PbM^AoRqV@LhzEdAkj=z+)l{PH{A|MpK#m@t7|fk!yYMDNOnvMl~X +z95G*Cafj52B%JC(WcwLDt94Nq0#ykxHtTJa_Anq)3KezD*1h{WzhhXx_q2DC1w>as +z+pzoqB>x7P%at~qRGyUVlyISo%>RWan`Y(L-16+tB?nIrS +zn~(Ixz2d?w?q|wSqr!SkjW^<`Ii2H^#1$SDZ>9a!~<3wroWI6BvccI +zM~sLphW?ED#KA=ZX+k<1(YO{4xkJ>GL7HnE5&VxT)li9>F?}NC1Nfs1r^DdDHgQN& +zHxn?}@TZMp+;4ILgklard9WeEd1SIw=tCUM0kii&^+;*QXH(7G>BUinMuF38bYyb9 +z-rLrZ^JFj%2R9)h&QqEhNV6PU$T<&`64H&f);_X!-6OsxL(^NH+XwQ2 +zxqGO3bWjor;YJi8W|zu^m{w_olT|3qt&lKQZBC@0kO@HOpW_fWrmWcJGGv;#Qzo1y +z@NM$Gm1fiZI2iEWSHBZ8UCS~p{TP{j@dV&1tVb~>U>5`Lr2r*pK`?TTj=B}!bgP;V +zIjQ#GH_Am8SQ88>fa11Orqf(ypa3~Sqj7E+{yf?KjZItrgCi%&H{`Xr!@XWd2oM}c +zQPp8pw4$&a6mjB<@J}oRX-o4iH0`eOw16%}s0lgh18%j*Fb~$G6(Gb-r5g$kVm)={ +zlv-7%I2dU%0!26Bm62-ViOn$sR`dutZp;|)TyVEC6hz|A1tOGwPK8sMD@dDaTJMW0 +z?UsgMa6+=tu=MDU(=2UpT?mwf7!(UNa31*5(wPo;7e8*hS@mZsZymi2;Kgm;Rj3D> +zRafdxD4}lhN&?4CH|j=;$-sg}lhZp>>i+oM(Nv+A+*g<7-iHC2@dEUjm5Q3bmuia+ +zMAiY9M==O;j$;5=#enmWM5c;jZ7Y;bRr8Ewo!dS%@J@ +zxIZQs9JQ-#5t^_QiNJ7r??Mo3OLJwy1l&b!_=FN4hR!-h|=cK9#oo8qfhG&1VIUVMHCdOBE1GLJLCbTpP +z_nQC2ydeZt2$gyroRe!I53iqizucENp;JVMAtzs0ck@GL-d +zj+^F@i}mW!S)R;r@fiowJ=LmZchkVp&SgG>{)l}D#^K{n{Pdxd`kt3eW1 +z<9Zu*!4v_W5&A}mK_3F)i;AXoQk)d0d +zI_Y2H4hv2oYdQ>jz}RCHgdtFtVy_@Y(MRxfnh~`MtAW)azxFwXC)eZJ7gwv%wyjnh +zn>4?#MdCvNgG+g;un4voLMSN6r0Nw|fY}wW(79$d;s(73AUh$0u->kRgW|4=$HFDv{A*UKp!+^Hn|BA7c9?ruq-nsFkZImtY+p%q@6woO8#jptThCSmW#cXcH~< +zeb_AIL{rZ;m2G=WsLzN2a|}gsWJs~LBUvfiPEL81?*2gJlZM<>CgrxC39+%7K +zuto9}JL*z8?<|c^j_(lR+B7=jak1Rq3NU&c9Z;Y8oi0BwCDS(V^ +zkO34ENGhTW&>r4ryBVw0x`rOr&P#j%_F<{KoF4dqN(YQa5c=XXbqJ!gO37`WrFNTk0mNOmLXgho3gi;7HKAMSUxckc& +z-1$)3lwt`LCW);tiP~VH3x?H!f&1H|J>$C6Ydq#zn>xs$E0TsI6M;6IN(sh(IJbBTWtTs1iWsge$M|3+OoJ +zm(ep7eis%R{DG>}BVEN@Ln@mz{)e0!27A47+)A2jZP58mTtU^oGd`G~BkpD{^R*!>1jw`=N-% +zr0_~+Ts%;YF>}`1Pzx>a$RSat7YS9e^1xF1KmG-Yp0KwbeV}u&IiMs8g1;{Ee7zA{ +z8^RrwSMNzIOiq;q8nXiGRb#}@m3|I;VkEk75nN_^E4R9gPaf!xB++NkzoQi*Y%s~U +z1aIXsSaiguyE^JQIbt5WEra0Zx@A +zHXAs3t)MLoehA_3hh8Xp!M7bY=Ma>U#I!5|^R-hC9`mIkjs$fPetNDH8Ok&?q7y1b +z;GiHfpRlJIUD`R^94-i2D5POBQwqFD(7m-r$ySlK<&iA&qNR?CE{mhKv7$~eO?4tB +zfe_>oue`R}XJy8lf9VRikW}zA0GWUG0J#7ew5R=H^ad%0>tC03^n$?UTHd6%z`}qJ +zCIDb>kY~j%*`l_{kGYt*FghdYsRbRl4|E`|6LQbUbRepMB8f+7j!=>fZI?k>5YmB& +zT>;wu3jH)D4WYM?KJYPejr1lx1MzSk=Y*D`iZSL*yfu>n=89qF;aH?RrdNvhrLJvE +zqR(kpWTQkUh{m$6NvQX@Ksp$P{b*V37=DpAY}JZMZq=NhOTu7cw55W~6n7=pD`T%KpxB +zAMpW4M_NKA-tHLX7B#+7DSe14ih0h+$RnK@%bH22h}f?*1gSo$N9W(50_=$x`dJUmZ@S>p(;LGp;3|9g{9Oyv9*L;j`_CgMkMay*=1(aSCFJh>}M%86>`DG^z5OAmeofaO(EsNN8)ef +zpxm&|QMW^x5CX9RkUo(^RooCLYemfU&D*bVPKX+AYqkbCKdmTFD7%=qG^9tT+tKftAU5AjnUML +z3AzF?|Ga@$QxF|;0DFdaN$pa4x|z?0a{+aV$p;-+r@AKK6?UHbNcqkeSAmQwEWOQ(a)$H4Qc;oi)tEAu +zF>UnIyyrU-hagUaHAD_5RARruG*b8plcPy}r~@h6 +zemuK0f5^U;rYZzpD8wx}{6Nx}klE +zvFN6$;*pD?P8F+P7=Qw?(3IZwI+{T?hb$>600|&Z{230@rRkeH!8d3bNiqel0Yad8 +zhlbX!BMtnrD}G~2G-+$p +z-!!SAPAs!$D2jGyni@^J;pwADM42B|#2eMH&(4lkJOCoi6@krFTo)Y(tpNUtMvuh< +z%a;x%QBw?*m{L7bml+($gKmU;VB%_HW>ON2%^ehd8Ut{}q?e=taH?{Qmbm0gL7~j!|xw36+LOL>swwK9m#p} +zD@VsAoT1##(K3XkHM}0!LkvbBqo+Jj3JApvNA>Y_C;A5chvM=3$Xp(P<+D!6&V9)&7{3bKc%LIV6r#N?`T-{>hL8X-ppauN?+s*f-bq8ZXa(@ROKBOJ +z@y0$U9q3{|5L|>W3MpIIcvT{g@SXA&5RUfxP%aR`%lZcH?n)P#9uD6*1Y$;0l6b}b +z0hNQJNpb?juTPhOU#5B6t|S8#DvCb=PtdC;_36IUG}w9=ImZ<9V1TJ5JBx`sxLlXk +zG-JoDw1^ZyUTH&l2g&Cnl@ApSU==o2s20?NE^&)V!OXXZ1!!Di^(lr`E#?Eg6ILp< +z3tnYwkRd`U;3m(|)LVLnMkV<#B+NlL{t69}Iw_33fcd_>NQDfNI&x#r_aJGOM855+{eD(r?UbMsMupm)LwWo9$owP5?ar6#?E3-t9o9VhZdN5)N^WSJ5FGF0rRzX~nPq5|n^39*SLj8B>~G +z(Y7>diBs{3nLO8RS)rQ4Y*LKxv+JN~Ufg}J-%}%LU)7P+MYnLa`(O!|RDupvDm0cL +zhF@YKT5Tk2OwoFyh_JCwi#~uZPyIUYB5cvg0*~9bQFMT>kIhS~5u8%C)Y&hSD>_wx +z>&jbFd@~_z_v|13V|Qb}Xp-L$Xn8iDm-%RNs?;^}q}Q6=q4qjXFDp)-ZaI+@|4-JF +zwt^psm|)+RqZ!yGTaTs6K>ZabpkYf@AaaS)YoYIJ{OlilHQYj&sBEZ&8!dqb`3yz6 +zr7X$h&`sy +z;XsT#7D>#S% +z*z<$UGRUAy4P8QQ_is{N-F_)^NQG4ygXvvIsUcuW9E<^#6fSS@A=rNyzO$#XubyCx +z3c-)~IS)kPK}(;TaSo;fTA${lY_ZtTC{=nJ`T^Aou~1VrLRkh+j|r~BqYHdxCiqm6 +zW6RMiZ&r}Nh9U11^Pmo}A82LB(WQ!Kuoc>sroF6(4VN(8Qco_8Ie^XCvNfMFag&O6 +z7S>mCMZ|!{16gvaSi-Cydz2*j(A^JWaV#w=b%8X3%%66V#4pzKrwQQ4qY8x<#ZS!# +zUtv5-)aR>4`A!>+V#2A>Q|777D@h0FWDDrc1Ftv*b43QCeJRs~`3o0n2dc!mA<>S- +zMXio%qs0zZ5i!PsNeEO(yvO>hfLIOsP=dY{eJ=0=n^jjAwRuWL%#||%-xcPoXS{F+ +zGdNi8+jrLe-6&f)MyX*ac|?}xj46FfKBunIqQw&-)Y +z!T^uW2SUlfg*l$qL59e1cB?jTZcOgpqOdlKDwYfC+;D87r0#*46663nEC@ga*zF+e +z+oyC+S%DcLP2WDJs#Ky{HW_Gv&w5<8R$*#BWPBx>9OqmBSy&fP=Th>SI#+F4=^!5n +zxha+6xPW7WlL-~40!70W9;qZ6Uo2o3o(uRLX_6=(sL-|2E@0#Q5=d5zyaWXDK({bZ +z;%sp&7tIzyJp6R)Ce#70jh6eqCKNTi1>>FozpL={xlb*;*LSUrWYmGdeci+&2qdyC +zOT5zp1|sVwYGB%9MP2!Mk#nVrBLfSS +z^q&Gn0C8owA`{>OLC^t-^1>1qRqCOa(%d4)bY-s5QdhlP9io20rp+T0ItHztstse{ +zs1c?F3oSE{ApI^ZBEe~a=%C#eGefABq)C@1A&n3~;2+I8P_Ta%g%|G`gum7o{)q3% +z_#T4}LhsoS7 +zEy$`oUHBr2&@ux2C%Qa@r$ZBf2WX0>vCobf8R7p}M<@*vP7{XZ*>gjV1v;>Cr5YU( +zzRpmmr+;#CX`E^)3P^maB_k@DO2k#dtxG4Ha$Ji20h?5W*vofH>bw72}l7kE+0vTZZoF>f2XM +zR)Xb{FM(rXp43{*HvWORCkR0f8RCSDYW%hRdf;oJ2FX%vOQcv(zT!b)N9&)I_ +z5-G>Z7D)HdNYs+=1V50Dcw-WTJC_QnEARGFeyLHJ+`M%$qbex_>p)-Mz@)BB#Z&wY +zkHCRY^j#Pp(BXSW2k&-(Dt0*v1VZ^ONnuSdp0Au@zKRZQC+CTFwbbJUbjc(2f%;p^ +zH?GSNbR({-muCwMto0zA{MECh{N$dQ#+sD6pV*HC2*k_YGtC5TM9O_ +zmi&N|Ylu4`LmxmEKN9IxKml1{uVWiu;Im2*ktz?{u^;HbS*8LAZA*D@=|Dy+Np)?j +zV+m|?))u(|@8H`CIq_D|0kY_R>Ou3kSnfx|bQs^^fk|U@*wN0zg8uC~463q3L?(h* +zsLyOoRnz$fruGWJMIi}PX*EvE&>lg+B#LB{qKeJwjF$xm3Fjso@vXvg*{oE|Q)O2W +zMrp^=Fpq7MiKpDMwWl3I-pLY9`o&+uWkqqm%ooA;J!sBi-_rGMByCDbHmkoYN{sM{ +zu`8&AWMW`KgArqDhrp>V%AJroxPI>l1r#-8S4kN-YAf!rj +zm{L6~jlyW(^YY=7Mn3@OoO)!^8ncR*1zO>)lWu^QcwKJsQdP7_f>mp@<6B^TTUBS5 +zihNzDB?)#S>t#U?9Wgh?E%?B?%)SWLy>Ilcp1ytD6wMVxYjx{i!ZVXh_u7<Ae*l +z3UWSymNgUXYAmQ1#6nw|c{5ZZwD=a^TespF{Lr3bf-nhzRFS}&QZmnq5y#>OTsa>o +z)xdPgS%yBbv*j865(hvin0c*$f=k4A*)6cnLQ!Ym(j2`z+Pj{a_=d^B2 +zWe&Ac3uNs96bNGPR*~G_)&!8^k^{|M1cabz-GXTCO&LQrs!42W5mTDKqHRhsGcKu) +z+HWx|@WCJ9)pNr}5jrRxd}!r^Rps6Jl)$({sMoyq5`{g4X}#seRFcXnUzrI6+M`qm +z!+e|*s%Zg|3ceqWdC1plbgG38Yd`~qIxN3uNPA^G42Gl{(_lzgllRA^;zIv<`1+gi +z6U8}4=e#P!)A)Y!;OD;9qA4*f5Zn=&Ij*Vc``pKS=lEs=>!Q&|rUv(|HtJau6>Ggr +ztoj$er=6LC@q&u)>(OU!4DX_wX8(ySh4~3~AH` +zYWF<#JyQnYr2i5Rlyr|5ujzvjI=0GX0mei?OXMTPs;PZ4+G0tATc&p#+S}U$p9bg=4-|+)72s2_ +z;5$Iq0mmf`p*%i6ueH$LBBD26ZjN}Xt(k?ES6OoIhyoo7a#6cyE|&jw`}McDjtS!cUP2{tTBa_i7&aeao9vm3eikO>=6+c#%-Ze54P-3rE#xuePI +z0KqY*ALBos{^-J$G<()F%N-F3y&~i0%~7s32#8v1Yd&2 +zTp(uKu;*+ac7VgcO+WqUDDEwP*`B^8#ev(?)B;6 +zts7MC=xmA&VKTdv;criWQpR#s4YTzCLM$1Q$SX17RIS`rPVAXsddO(3vQKk=v1vft +z>V&9^Qk2$cU)++Mv!e~1ea*ZjGSc)63_|&aPEuyTehnejWQ(Sj8EYHIn_MS06c|` +z>&K%x1rZp(w$|yz=3hY3;35U(FN8y^yVN(!jz4u3_|Lva9tN0fHwwld$#WeH2)KN6 +za;v_AJ397gn7!EQwhZv(M?HIhoxz?#LTzDa+@n&2sBxlHssr050iOTuAkXQcBwLBz +zR@AXUu56o{RAD23Yq2N~p3vC~ST0Rn;G|A<3WCrJLFov!=!Rwj`?1he+xOd43m_?Y +z=%NajuicEx-Z?+6{nde2GQi3=@vMN&5S^eBZ{NbhtbI;qp#@GWXd3Qz11JF(3frc-Ga0tLf%V&$ +zhljVP7#QvJi@#pw;pC%Rw_w}IlEk(dkq)bts@5Vl%R`&T<2iIi#XWH-B+;0dHLqW&4W8o +zEts6D(@>x(0NT3XVi+a6Ka<_WsA3i)=a~V!IR)<8J-(Nh$g{1pgq()G+Tm=*Lw}hM)YP}DzHZRGJEayH +z-@(-CNggPP0+gxIc}5$kjvrY{6rglpsU(tXE#&h7qSV20!hE=!xD`i%Amtz1OsvLR +zAh_!8?eZUoufB!{$)&Uh@0AM?Gp_Yq;NU6zlJqKiju7%ge9SydsN8GRZoepfqOU(m1 +z4r4p|5RP%^^JYj%zzWhlC3k3AlC+Hbr#w(=p_1&edRhde6CocHbwoN$UUV56Y6aWw +zV)Z|VzkW>*d;(yZnlOB$kz=nRfxARWa%hk?nk^c)m0J3xT9?@Jz*GyZl!T|SoH_Ba +zlHp1M{tLtuF95oVRXNH@l^Tga4G4!lVWX>!ob1>W8kRAr4S47{9hpUe +zo^_mC3eEE8=rNqU;N{Aqro%%a^~CC!(lWHnl5LO!GOuV0j@$stec!j@y|50Sw0j;_+~-SU5L +zzWRzD2&m(m4I0DOD2jTmHftCZ*ECkDCz;DEdBIUXGww#6(hTJ;e{xY?*M5MFX)rp` +zR_6ff@#a-fDu=KqzlH#y-7QlLOwVSsP8SGt{GWnpp&@r$JTV!yv&#~~?$P>zH^1y3 +ze9Xg5`4xwsj-M$j%^eOyg=4x3cZ+OikpmS4TYM{Q#P*qmP93vxbnxdmKDIdkIfFX9 +zUKRHp(teG~7dkqg`hgk)_5()RbC|=*p3yi(TFkO>^$>Q(c^0;cpKq$Xb?paw*Ee*^ +zB1OjK6d3t5JFY+5t*yLKiGkA1cinO{(!X^blzssDrepeBK7z33Vf%jd&s%3-@fXhc +z*W7ES-{!gvoS{36)2|nnqKxbdq#Fgb&MQ9}Ke?dSJ6t1K2}HVn*$W=@0N}8g3HuA~ +zFe1IA+wT;$5CpuFdC|Z=q3yR5B-E(n^}Rl8v7EY{V&K+2T->aJm>(ZM6E>QZH*Bsc +zc|mkFzik8_>sLKdxO29aG)-=dQvGTDWB$?(UumLI$pOiT0B!Gvb~-?S)_0$cLf{jjA=5US04pef}Kj1hp4>0T>bN4ih&0r5R-@J>&bXD +zJ9SgZXg^2x##0+0OQJPtjH(BjI>w3%QOyJB-qdy4P67V7)v8Ut3PeJP>)+ym{KjZ` +zpvJ(uBR^w)y@@h}{irz91;$f|4kRh_wy&ocxX;6l;m6~@y5ccS0{xW7IuV%{5_t<+1#p!+?*Tl&Kb4t#av%JOj_# +zxWIY9~#YE?OVtmcYQ3vriFv8R@2 +zFvT;dGh=*a<2RCw2zGCNUL4#XethywCxT%LihAGcli*~S4d`V?`l+PaLCXp4Wg!n^ +zQq#v1_XRT~o>}Y>MUAv!JUKzvXw06wN?2thoG&Tr`+>uo%AL-0vCKG<&k%InA&-qL&h!&u +zfw8?@{_FbbpZTGi(+Fcr--5^k$Uy&5nGw@Vsn?lY_TqNdUQ?SWE9sa8{hVqczWob8rdeYe4go6IRdvGb`bIl&$dO3)T?_nSzpn!n~czl +z-3kYhWi~(T0Uti%vy-V7@`(;XR&5w{f`z_c+X-8mTEzTkmu~k|s5;_Vap^7WT~Dv* +zN-g9a9P*sZg*ev(cyStBiFa^t!+PR``a^#r;@hP~+(f~=;0(yJ?rDXol3xAm=E*y@XJPoM-9^LP!RD#as=BXUE?|^q}It +zgsHyL!&jo70mlMyV>~%&JuzCGDdR1=P7hS7FF{H;QWLoPr(1goUIIakx^~M71nuAGPF~zv(096? +zlFjZj>ow-9DOoL2-d@1%hK*t(d&UTif@RGK4M!M +zfu^Jxh7y$}<~pdM1r&^4HIKA}MkF*i(G~DV5d-AY3$4g@wnu8G{0QVsUo>!QjMG2U +z#n%~Gf%PU3@2lt`=PN%;KGQtLEjUUlr>jNjvj^WL11{hHrOp_tXNQ3E`>UD-?XPSC +zG>LX(4{SSJOT~rSBQJ{ih${<8Bosg5%G@d0Y%AVL>msPCocx{C8QIY>oV=8NAnZO& +z6T^8xW=jLAPjJlu>iQv&19O@HOh +z1ys`FVEbuYDw#45QI{N?NQY@=+)2tKjjUIzpZ8C`gd=SLl=n`~Nmsn0t=BDLb>aki +zrC&OuNEJ40T|{Zw{0`rLkH3$waht8(AaJt|OM95!8xwGkSvUcwBt<_ZmCVIO?FUK{KFRwL^-QNg +zpnSo1s|Io}(JhDMDF%MIaq=g4B;Y;iCM5`jN8S^wEXGD-hDZz3JPFNEn>~Ho1C~2H +z<$>R5>IcX+CXIIDNeR*=apNHM@Oknz<5Gdm2WlQz=XI|gYsi@;x!{3-?p2uy{kLcV +z@Q3ekSL&pDC=|1&z>s90Gr7)P5@<3{4@}bsWMKX%MysllefB>(^DoXZ$(VsBXyt!8iMI62IFXfUeZB3vFDt7`W!5 +z`;K@O&=6c9tjq|FaOE8uHu~lr+`3Wsd`3Y}ok5UK)+j-VoLr{;Gn{^Y)XK4SDva$yI%_j7YHFl +zbukJ^$V~i}W9nILx#nV_F~EGK+VPsPqzi{Sk221>dycX6@a*$%Su9_*YY0n-M1f{Q +zMY|L1tT?Csb27=Y0FuAnHrOm6qN?ud(A!k7>ZYV2Tg`zo1Ynm{hU*riI-IHcxG7or +z;X^(-oqA$#cGRuLWs@A4WEb15F-^e&!8VjmZQ*3)(Wc(V*REM9lGs71-nfE3B)3c8 +z55+(#<ECux*rE3UIL!wg4z+_BJDvu=0@cKQX5RH`$Y +z)v%_5wxMb8azI94X>G4ysooOI6arSM`bbU!&zRJ_Sd>Rc@bVN^D?9GRray=fu2{_n +zNP!?w>rbUca3_C3=s3^yh-|9hv|^+AdQQ}xYzpk2_T8q8D@wlHDl{Ls$OD)Nc5^zA +zU7-wJGXPf*B+n#`KD1sgpI<+H%8$IZ5fG^Eqqj)~Q#xFF+KDOFs)p2;6Hrt +zGk_}mC{{w4<1N|1%R!z-SJpdTDRHKI^m^Sjz7B&jfL=Py$eUf2%Kob>|5Pt0_gRto +z8c}#Nrv8At#5&PXB+%pT93Jg(6yain;L#1lTKaU7+U~CS)`7 +zoWnV?RlJL#^#fNx=G+RGI05s<%57IbN}%)}n&!Re26g9hveiIwBM1Z}4v}^TqthR3 +z*{t#Blmyx+CGE0Un6Fkm`cRzd0N)ZWTMkZhY0fhTugcnw#K%YY@=Wpoh)Jk0CXyzY +zlnWHV|JX?!^^?$%aJ<-@0-)AH`^mIY>ek*@nS1WBdoROG`Pa7-^0=oMxV0Y}bcs7I +zG$z=mGpkE{A?7*5l-yp0SF7cVng@JvYN&)=2jQz@jCPui&F`_tHl1Bi)gm=Hc#OA+|aR4*R#%7DxR}$>N-X+cU+$ +z*s#&O6&Mra4d}|%9?rs@*gGdP1wh*uoNA#d57d=>S2_*8VzujsE9WIjfib2(YA;~5 +zzMNv<2|bc3qLR4SsJMAzY5*u&8kY$`fmoY@(H=z0F`c~IQw+chrd|h=dL?IfVh;yk +znvP|GeDZ3jNx-=ha8;Me9Sk9P)axZk*!A$&&%cSI?`7<^b^TF(2N0RAFE@~j;c?S* +z4S=CHQqhc5kz%mLDy1Lxiju1^mh*9@AH^iN{Q`sh_oBNm=1*Vp9va(E)AGP6EZ3%* +zM>AbSD}gc{8d47cz2Lpu43KW_sTq(wkd3{g{KU?-&s84gJ^LZKE2r&AZOxw6LXf2N +zoOX)IvF>|iP9J#c$i73twXS*KbpQ16)DNI6&^2+enkKLxZg7Ckx@1l1#fI;hq0c@e +z#RLBIayY4sTjT7NBw`Gx*_jc^@5X6DQMF@7Eg#zc?agNHobD|F&K7W_CYX(?Pq{j8G162j`|t| +zF4UD1HA@~n$J6PNGj-^v*W&JHDGYv{4JT|YnnC5wM0+56#}pUBj!sv4 +zPetrl!co%J08q?bTtxB*+ZM0`coi;JyB%)q_hFbq(xB2&24uz*44DoxG|sV2+s91S<>*$p&H!11ufl;|ETE +z9y8U_q4fiMeGG82v;^t^P)wYNnbUE!tqBgSGqNSzyao#l`3v{Fqmt$WCCx}hImi73 +z&5LVc0*t)ePI=($F+Adqy%z(=@EuBOCU;>lV>#~u*hbAH9dm(lQ0^`9th-f`y3V!S +zTBc(!0>!i$V779t{abqC%{GQ#WhT_a;9+65o{>rLx1avS@l7ZCquGm9?-P_gT^&op +zota%2;8_A)j2qWIrt*fnx2@hNGuEUv6xKF0TdxkA3wvt42~-a-3U$#KN7K`J{19K9 +zamxcz$$9`#HwB9wFdQq7W+UMYce)o@%>$%)AlqBUfSe;Y19l}4;s@{|>`lQdF0_P$ +z=B0)S^5bg!~_^vg< +zQM7V^2(oObu9s+eAdjB)!PYjRP^U&nd?Cah_dqvi#kA6^d6ZT+IQ?J9FF_XD7ZF}| +zXpgJq(C(`_&ZV4OdO +zygJ9XN0N#2sth%jMW5f1z3nN8hAgN0-&&D?1o0$g_b#g43+YfO3fM5Pv +zY91&)3Eo;UxQogswqA2*$TMru=I|x9p4jpLV((duA6oO!`GzG<5$br0xoZ_`EwqAz +zJ=G5kVb)m>(dY*~ag%a?oK#{BDhDT+jvng3)v55?b*>^_k +zlSiWqD{rDLp(Sw;Vz@DUwC3LY%~uOaawt7=I$K-jA`9EQFvY;D +zy|W`eiuH#S+j{L9RyRvs9>Z4jQ{J;BGiLI}T2C ++ ++ Grab Album Thumbs from fanart.tv ++ Grab Album Thumbs from Last.fm ++ Get Album Review from ++ Preferred Language ++ Get Album Rating from ++ Get Album Styles from ++ Get Album Moods from ++ Get Album Themes from ++ Grab Album Thumbs from allmusic.com ++ Artwork ++ +diff --git a/addons/metadata.album.universal/resources/settings.xml b/addons/metadata.album.universal/resources/settings.xml +new file mode 100644 +index 0000000..8b2a8a9 +--- /dev/null ++++ b/addons/metadata.album.universal/resources/settings.xml +@@ -0,0 +1,20 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/addons/metadata.artists.universal/addon.xml b/addons/metadata.artists.universal/addon.xml +new file mode 100644 +index 0000000..2d94544 +--- /dev/null ++++ b/addons/metadata.artists.universal/addon.xml +@@ -0,0 +1,24 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Universal Scraper for Artists ++ This scraper collects information from the following supported sites: MusicBrainz, last.fm, and allmusic.com, while grabs artwork from: fanart.tv, htbackdrops.com, last.fm and allmusic.com. It can be set field by field that from which site you want that specific information. ++ ++The initial search is always done on MusicBrainz. In case allmusic link is not added on the MusicBrainz site fields from allmusic.com cannot be fetched (very easy to add those missing links though). ++ all ++ ++ +diff --git a/addons/metadata.artists.universal/artistuniversal.xml b/addons/metadata.artists.universal/artistuniversal.xml +new file mode 100644 +index 0000000..ec474e1 +--- /dev/null ++++ b/addons/metadata.artists.universal/artistuniversal.xml +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ http://musicbrainz.org/artist/(.+) ++ ++ ++ ++ ++ ++ (.+) ++ ++ ++ (.+)(?:Ft%2e|Feat%2e|Ft.|Feat.|%20and%20) ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ artist ext:score="[^"]*"(?:\stype="[^"]*")* id="([^"]*)"><name>([^<]*)</name>(<sort-name>[^<]*</sort-name>)?(<gender>[^<]*</gender>)?(<country>[^<]*</country>)?(<disambiguation>([^<]*))? ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ ++ <artist(?:\stype="[^"]*")* id="([^"]*)"><name>([^<]*) ++ ++ ++ ++ ><relation type="allmusic"><target>http://(www.)?allmusic.com/artist/([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (.+) ++ ++ ++ ^$ ++ ++ ++ MusicBrainz ++ ++ ++ MusicBrainz ++ ++ ++ last.fm ++ ++ ++ last.fm ++ ++ ++ last.fm ++ ++ ++ last.fm ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ allmusic.com ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ last.fm ++ ++ ++ last.fm ++ ++ ++ MusicBrainz ++ ++ ++ last.fm ++ ++ ++ last.fm ++ ++ ++ MusicBrainz ++ ++ ++ ++ ++ ++ +diff --git a/addons/metadata.artists.universal/changelog.txt b/addons/metadata.artists.universal/changelog.txt +new file mode 100644 +index 0000000..961ee0b +--- /dev/null ++++ b/addons/metadata.artists.universal/changelog.txt +@@ -0,0 +1,37 @@ ++[B]2.0.6[/B] ++Fixed: accommodate new Frodo style URL encoding ++ ++[B]2.0.5[/B] ++Removed: '&' sign from artist splitter ++ ++[B]2.0.4[/B] ++Improved: further improve search results for artists with almost no data ++ ++[B]2.0.3[/B] ++Improved: search results are now return artists with almost no data ++ ++[B]2.0.2[/B] ++Fixed: artists won't find with 'and' in their name ++ ++[B]2.0.1[/B] ++Fixed: potential crashes due to infinite loop ++ ++[B]2.0.0[/B] ++Added: Fallback per field ++Added: scraping in case of multiple artists (feat., ft., &, and) ++Added: other improvements ++ ++[B]1.2.1[/B] ++Added: Enable all source for artwork by default ++ ++[B]1.2.0[/B] ++Added: extra options for Artist Biography ++ ++[B]1.1.1[/B] ++Added: handling of new format of allmusic link ++ ++[B]1.1.0[/B] ++Added: language setting for last.fm artist biography ++ ++[B]1.0.0[/B] ++Initial version +\ No newline at end of file +diff --git a/addons/metadata.artists.universal/icon.png b/addons/metadata.artists.universal/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..7c3d600dfc876fdcb621927efe52d4f2e2fcd5ff +GIT binary patch +literal 59634 +zcmbTcRa9L;vo5-DcL)v(cejPREZjY~6Wrb1-Cctd+#y(SCuneYmmoL)K6{^gAI>-r +zcfPdD`l_m{t43QzDJx2&AQB(~000!QjD#ux0P(L10f2}6S1h0lv;8aZT_v?$)f_Bb +zJ&c{r0itFOCgwn}ow234s=2Y5m(!TJ0001GVXdz1s;wZ;XX;?bZ2TV@W=}iEe`o+e +zK-kmK*wohC6=-5^X>Bh^e$~}S4zxBCB-i3nU{!DwH@C8u@pd*>^Hx+h^|m$TH6s@m +z0t$HY{bOKf?rIG5wEJf7!sjVS{$G6g{?-4}%|Z_RFA`TlmM1hTWTv9hqSv#|0ov9a=T@$j*-0ss3W|0m7a%z{rHivnouh)n|7L9O^52H~XEGK~V@DP?W>ywEyZ?;q +zzo=bYRn7ljHU5v(F6v&6<}9k_E)H(arvK){g5rO`|7`bv7xW*(f7mXZVqE{j +zfmDK;0P2~<6>q5YFXQxIe57IXL|nEXeG>@ +zt=-Mdq?{e>fd6G*KI{L3d{!}0E(uXK9u9F)kR%%$n<%d+m#7pkFNZk0D61r^IQf5L +z&Hn$`jOCv)EdOzi|Bti$PuD*W{7?0NyZ*n%{|+8=`+pJR{4X@FycbpgfCF-{gs8gb +z+IbH`gWakQ$>XQ(h0Ao_m7j}8-*1AXPQ$ix%>+owP!Xe1SPBGIiJ!2TSe4jhB!RNK +zrK+e0^lDMxqp>RJp%HPNCXpe!luf=>ia^&wNd8C)U6iTsTH5p3eE&l{-TY+0a8|Ia +z`*))vQ?wboU0SJaM(_#w@A>=8=Tm_2$5N9a+&0hzTEY>dzv5H$mFsTyavOS&Z0Rwd@XO&KPiY2$t@H?VG{3d4gt~bS +zZ!aK?cFpm%GbO*6bX(s$sT)mD{4?i+;KXVn!kbjAfW)H?;Za`5)7zv}T!Hkoj^x!G +z*C%qWBQc&w5bi|z)s;Q>Y~jhxNcdzR{&IAgKNOX<$58t7xX@cj?>_22Qu+fEf}3aK +zkNvmA_yK;I2nmPS**0J7lNbqUv~next7U$^a1m+TPFLXl@7|JvH!W{nnJp?}hr&CI +zzqns`wt4DA*6%W6fLejQM4u%LV44Jf@~z*7C-Sp~rvAOT%Yc{i3d9XB#~j~RC_$B8 +z+gI3M4k!E8Co)i*MF9gJLkSZUFP-BB==YBEGc72dV+=GX-zrix#`d+wGNyR~o?eL= +z(FDO^L)#}Uc5|kt5SDRZ8a?UGFqN94{g^-QCQ2c(eO=ml +zg+64uuh~*@9pqO<`zTgXhnbj3B)JD`0GcZ2q_5rLo%3EMAwIM1FUZT!IvbO)vkMXx +znLe`uuF0g$tdm_LoZTN%4jNv1^*I|UgZ|(ztRfnla%OGz!X|9VY(Xq?XYG@x+QuK4 +z}y!-!kjbYuD +zhBTaX{W*jVT!H)Ez_+B7LAvO&Fyv~NOkJKKmEP{!ejjvszRL0b_Hrh@gn*Zi`I$Y% +z57w42c;K86ZY`(1J@3DSX`Makbk!QjleLT(R+;V|=Qos9g~3!-!UT_pnssPA5EOiK +zF&hS`plOI64MCM!CeW;Kw(En0h-jvz#q1zF(~SVyEG-W2pt8}J4cL)LgYmxAFe +zm||FY`O>>iQ4=j4=N9P7Y{ibgs6z}PkC*+TR=kRA*+1KAHGAgaX-XW^p|pgezXw*# +z1bI?7#@PgE8jqf^#{n`+z}oHB&I>Y+CVM6@9&qx86Qo~4??d%lf5@xC0X~52{V--VtPyH +zkpx$p;FJ$y-PLzBbHn6c!@-v?&l(gfbrn#X+AdAz(W*94C6z41ny#yFP%%QP4U}`5 +z>Hg^J4w&_i8Z1bg)_UiBD=Pr5yZ#&GVe5NaRWuq0_)N*z1k}l;!X74zBVfeXXv=DB +z1&d*bG};hvWvK+m9n`vm0alY+<%Mw#45e^b?Yy?NC{xobPW+C= +zfw1YkJd))^WP_LE2~^%R9Uf?>_?UsIpP4ea#1k7-YItsetoSC3L@&&C(w~K7?9cTA +zp^x!N8BxF4j-{ZrLgVw{T?(bhl%Ol$ghBu>`S_;>D$#_jg|3+5)^{3$cGhx%L{(o( +zwK^bf)wtm>^7faTl?;dzM4T{};K=(_6{}rLmUtgHB^>d)rmr*_MQqs+<)^X)@A!+0 +zyUp!pL|eHa +z7E+jBCzEq*hBOt$EYnJ;hQ2s?+RHB9vpeNE@`l{Oqo^nRskFV(k+25BsLdu+(80;t +zOLJlZkUWq)=_T}^5{O^zwo69BA9x+LvpzxaaS~uPM$Vp~E=%1=3f@(6LlAOt{JO&^ +zjZoG&_EW_|HYR{=x8JJ<2G{lLOs*hWQ}sSvxUsTo-~=NEQKiuZ)>#gZP9uSV7@oCuW*uI{9RPH7A)% +zM{eWNHXa?ZJOT%qB|Hp0hIb_#iY8=DGsy|dqLIJ8FNcCu$E_RHJ-XXz=bF#I +z%)3aN8VMIVWrI*2IpYms=-E$4=P;e__V2yoy3?XbNFhg6l9RfoQqf%N_6%vC$?j%g +zSNU&{lk|0N0b}BiZ%(51P1yswq=iEh?lQA(blU?{C`mvzu3d}CKemWLtB*cjv9{{! +zLWou{*b|vc1!YIy;+7K(E_cS04u%+ZT!<{%ozQ_x`9+8vg@}WB&p}SNkGh}uD;6np +z$rh$%gz-u{X*yYmxOhtQ5e;EYT&LS8DYX|YS@|Jy%(7j$0TthrITmq +zYE4Sw{*#3nQWPAK$^AZO6rgZiU1rMa~0OL>Zn)* +zm0P+qeRWW3N9%InJ0RjCKE>#UBwje)v}l`Chz#c1DjS_@j;>rOHxN2mhiFZ*^B3L4 +zFNg$P?_QB(#&d8vnX?5+aJWdRYtNlVY$B>~0kw3!5ixxF+_J`CS}G4oHKazo +z2|DD#Etj(pD>-qcoFGF73o5Zp9a5U1Q=&X>mtubM+rKp-^+(>AN8=PKoC--XHmYjF +zw$3gXpq;CJIfdS-FCyUfs4498+Cd>G_W6npSyVlbiA1~N2O6WCe9ckz7L3unG(*}+ +zMs;M|*DyU<%T)R8OiQY~=pPK-H!WLs3q9SzmF0e1g`IUKMsm0dH`J5qkmPH+y-s|@ +zk&L%wor)taUdYpUoYRv$A~xIT3Eeno_E!U|6#u6okMrERHD--gNWJkkvS=~{8(k57 +zBTEK2)yd_nTtW7=ip6BrVzn&jOndg|&gU$u84pFa5pkGimMy}r&;OYouE0V#aYD$= +z?$dJ{(^#2sCRsNPR9%S-IVxr^fbL1q*YvRo@nJG>+{+6b#FqVQD6`zeJiwQDS6Nv-k>+`w +zZc2ln`avXg{oHlL{!t+_M5uQ`MR3}45qrEM8Zf#o$0B?pjkE2tzD|iw8949I+`;!oFG@=g^hHYM1;&25Clv^xzG#8BfyGZ+R8oo?J2xJYY%8HEAt;eu{{BR&^; +zW9t(OjB<6aQ$*}sB_M)5UyJ;Z+ICRrTQ~tmP`0nS%Rq0XwJc^$z=O?3rR#Djjf2v4 +z<=_{Yji4^mp!Yz{pnly#%(q4Sf=ot))h5HIUc@-MBL)9Jv0k^jJmc?{O}rp~Y(|yW(!EoL(h}*wmr_px% +zY5J8fjmva2>9i*;{)}(-JO>GS7qwMqh!-Y{ocWX!6*kuVR?C*H#ZLB*;B__O!5R*9 +zVsyQn_k4wB02It&lGuE<^=8ZJbHEZh+&l&LXQ^Db^ +zQW?k1jVowErMXOVfurn_57HxPe}j2%JQx*o(d3f}Dp9ouM#(2Dah17(h-v7mQhur< +zpK>;TuZ%E5k?8O~Dbus{Yz|F-%Mbndmd=aczh*oUwRD)lAX&6g=c-|>jx_NW*Tp^Z +zr@mgJ>|F-K05zx``R5Ou78RgQJ!PaWRN5P|tQ0ejDqL5C|Me-LAm7>!I{`=VELypS +zz}Rh{1NmO-KFFjf+}rFmFL+pNRQyx6^@l-+?CXtoEf(*W;?7w*)j(flHp}%x<&$Ws +zM?eiD(W_5gXmn3TrsO;f$~oQ4E}X~A*W3E7?g`}f2hu6E12d69#l_rA6_okTRNQte +zBf?>jL|c2h^X~D;8@1*}s=U^D=TrLgk4PD!FntR*<^bkMdAXcl;P+HFQ}&=a_zE>9 +zkK)6T$~pXX7{qaC{%uZ`sMT|Lq2PE?ir9_cQKzoPJ}78wE5#ghN~@irB0AfY$x~@| +z>d!IyWklfiDi3-s9kCK~xt^p{wDw$cXOM(8u=VWA9jhvMJa_=yU3!5(TS_n0F+Q#O +z=RTBp1N59+3gr?PR+H3DaGjcHk_o+MGtOE$*l-PViT3QY^f)fa-W~M^<#G?0Az7(d +zbO5vz`A|p_u)+qLT1o%VU5j@+0^OU +z;HB_A{8y3`E*ieVmizw36r%EUJYKKDZ0j*SX9m9PjM?c_(kSLRor6}7SJU~RL7`!> +zMQHf^6eA8=;DvV*szV_#O2g%VCWZiq-iP5k^x2|GbePx{mn!c3rAfmji?oERFZPj@ +z&=naEeW`DxDz(W*?9wT@?sVrF_oLxb3hF%rCaKn60E2d+ab&TFepm{JACTCpU+MWr +z1SWh3J&*Q@W!k9_a-vxF?{<16FyCwwYVHpQTsZ$R)nFB5qPUQBK}u5KPOQzd%T`)| +zEAifc6KSC45Bv!EDx +z&B{fJJ>iq@a3v>M} +zphOm0++b`D+>oet3xZO-d1)+>q-bl$a>+5Y4Nte20)y1fS+;F)gvrfo7KT;F$te{& +zzvGx!x+AE)sy)5odql}vyFUJKq$rWeE16vrf1t(4&*mj<%(70I-a|&+C&{VaBB1;{NKTEAr=EiMJt8W#otm# +z@Q7(HA8D>mB(yVR234VD19fxUJdEi=1LCFnK53o6c*+5Tk!o55S>j05zcmLN|bbLi-`Tr^AGlIvY^aX!Q~1p5!!Shg9)8dZW%LrcIY=7&*H<1C{5 +zv5P2K70{kbDXv=SjES_e$eE!(q7yg0X=U$^OpkP#^T|48hcGB`p`yLg0!8W!bCxm? +z`bY9}I^~L^VGDtjIJVl?q8AV$8l;ttwt}HD1t+J~e)^lB6%Nrk +z`0U2%kx@~xDZ{mc>l=*EU8Jh!4^@j3XxpfTX7-~lSPX^Eo!`H|&#~ndS%0^YQBSnC +z->2=zL~#jWu1MLyO4Mwuhp-Ud95@&Ilb!hoC5w$ZL41&}|*HX|=_lfdy +zIdEt^H{mfbWJv0vJ`4PV`MiOvHprqBQ}eS@187}fe&3QBOR%EA=ja8I&|Id}tqMCl +zQv~3#jjR1g+hQFS^RMA+Pz5ldLcoc`RA0qb_n#2tWxw?Y?L#d?aq}z%Y6MZ@EYrdx +zVvAHI0BcE6_BxIOW@_sxUPxZV16dUGO27kMorXlItOg>0bdGC_D>a1^W?71NDup{N= +zzf7dR^=Df^a@H@)Q7sY}e_ONWrh-?W*J{8$Qt!v@Ez9XsN#$p4@ +zex{1RE&9I#MgcDlax40V`s&K^1urbl*XQ +zbMxF-IW}_rrt=Uo{zlD*ASg|U17L((Qa@UJd~(Pa0(4~2KU0L{@F1mY#nIkpsy`M8 +zjsig#2SchK8I(dw-w@~31QQ^yZawHC^VqqwNRw=w`(54r#^DT(8-KF}8i5^0(ht}M +zkQ13BYgHYIe&tF?sEiVnHGC7iCT87m(~8P^b5>=2sgUpoX1_Dk8bMy(TwCg +z-3-V7H^Z_NYG*}ca@;ePpE^K8nKLkEq)Ne}QJJG|(hDYmLFe0&Q#IBla#kIUfeS_y +z^#wg~VwFlPa>N(wX7pdX7z%)PtKE}+-oa##vf?R12fw`1K39PfY*_xxsMRMoS)eJo +zL9$%p5Ac34JT7SqCc&IH_v)@DMTc2;eBJKyOL>+^+!c??vX%-ydulwyzH+{Um1xFd +z7_K<4h)2byp0!^?%IGwY +zaM0n7=kyr^=>ak2V)q|Rzoj~uhl0?~y7otzn=2cj5>b +z8Gk?uDoC8k7(&c;H>T_y%RJt|M3w7QHB2Mv>p)B*tiq>qD*)Tl&Tai2wLiA6c8@vI> +zx&Arb!rAYA^xHj8;~VP5iHtYoTkeIInl*H9Dg_+4YK5+mkSFPS11 +zLOv{uk%oC+2$|G%5qKh2QQzaaqHXc8!EpHa=xDW$4SoMjdE(%I|U>GoxCfl!x +zbl9aBnh@MToc)l)(K`UQ6@&=MP`n8?O5uh8faPQ1%^Lh3dXMq5I8=1VwK+8u4t~*+ +zocPaY9|xbFF}MUF$heozq!_gj^&b~-514bEb-_$7`XnaJ3AQWk#mFeqNQrp%v-_9{ +zzSBDzE1-}mP*-uVrdw{H#rhS>4;CiNyv!t5%^QrlSqDT9#ZR4_e$RQLDS5(Ly$C8q +zv9p+%d^vc`RfJ3fl@;+B1TQnWZIN8j^V%2Np`(V>iK%`u!cwTScMwh9D?LK170`K= +z^O0K$+5C@Qe%4#y8BI8@YNj&ZnW$YKaq9HV*-(R3u-iCi&~he2x)|UG>IPd(fz3iA +z=@kkZAHLhe;j_N4MveYJn~D&ts<84JGCmEC=3Qu-=-+ev{W1Kc?25z`(v>YGf1tTt +zGL$FE`*$}M4`sqZZbINayh;x`n1Ug&_?JMoKi~{7jV%Nma2=xks$5|nc~7R0uP|Au +zL%`g`tDAMsC5>S^EkXB1)*p}^rRhhB}LEn_eX25?!?Hf4m@z*(Z0Dun}XwHto9?v)scm0c{iZ?XxYO?nhZ7HVfh +zmCXr+Q*3_~|jH_d% +zRo(}JD?;5aUq~>7udk{gi3dZ;QB_xP{$O}1GVrlB((RBjmzs4p=H@`e3?-J4j|8=r +z;CU+9xWxA8ii4Uz9M{B}-7dde7zY`DSPdrlkRYaQNRnf~@>U4u +z5-l7F4g#m_%Tr%&|H7oNtAkY$Bb=BtJp$q(ejoGB_$v6|BVY&*LOFUlC# +zph`bHS(Rk2xMYpyfp#T;Sa6EBt*Q~E`O}+7q^ee2T_9pmwA;W|&d16hNU~5&-;IC& +za~IgwOIHH+CtH$2+u1mQ+2tF3&8J13glhQ4pKp=;OqPIn%vswvgDt{0So}q_(rpBu +zETa4opW%z+^ni81C*tKl%@|x8iw->ERRAX^m5$cY4_XRdE#BY +z+!hn1dsCD1B_cu>8i8q_cZmv7UWLdw`}rkSVS`^+ggRZ81FCAz#PBAFV#5U=0_F6X +zP*5a-?mN&Pmq<3xZ3^____D8{R=?ww!mP$wawo+{BsOwt!7*ncYh1B=C7gDjoykYkrQ%V&_C!(q~Iz7iI(u~5#bpkpG3%);0bY6-fxjkM2&d^bl>cf4Jz +zN)b2FM~`X$QIR+z`x*3Awy*}j$a)AtMj3mb;qJ!1M(MFD-)cv*^K-t+2{tCNh6inY +zaWJJrFcv2xho>Ux4d6~Vh9>eWMUov{f(Y~#4Nu~>AoC*?1>@yJEUA`^)SlE_ylj?C +zM7&cFyNc6F&U1V0FiC;?%8#nBmj +z(P6u*YJ#08MG-(TdcydmY$ZNHWFlu}8Q0mq8_hd_Y;!pgy1{(dJ^Tv!~P`}%QC4A +z0nEhB7C(g#xBN;FKk5m3Aios-_ZUlw;0=$-;Fx~WvNPnyX2)^^ou8VVMk(g`gOjGb +zug1=vs5~a|_6PE#KE5v|5iOBr9OemH8386kZ>>C6`!~zF^-OtJi(eVV74gYzDMSSB +z@GkE(>mLGNsZ3Q)uphmC!MYE)7WRRmJi`tUjWk5Gl3eCYO6hTQ6~_>)7+sMm1c6sS +zZE8NWz5TGhwH}M)m=s-Ze8--uMWWs^!eEDBSRsvA6WTAN1&>4FZqcS=av;h;VMJxF +zj+AkJ!`@@;BB?MForVvKos%^|M)8C;v}B!xA627qf^~J|$sfLG0v&ppSO%&eA&#aO +z9bzLX*?WGdP8lt#n4TIPagEM4}DlYC(c7T7YdKDf~|_I$*6-J*XdKI&kvUR +zEd5=~7^yZ=v0*o1HX_qhv0r$X@7u3$pvb1i@RB6C#>8Wd#2*d)R^2delYYerff&Ou +zsfo$8)fEQVkuOiVDc&q)xc6%H+pECxN+GGBi6++4fCrArv1(i@@~wCyC$Epxf;3>n?>rt +z(&$Vs^{PuWgHE)w?*?>?vZi>k^`d58yN;nw>85_a0HE)KWD|&AW<%Xr;8;&$6{5bt +zf5%sBz4yL_vQ+(v?VJHhfRV#*Znz9Crh$ed`#}=t6d4R}xFVLPNoZ_G^qcy_h<-th +z2$xSyMfntDjS%vaRHOo#s{N7MT{2rF0EKTsMcxs$k!%@AKYV%V-bD8j +z)H%o%iO|p=fv9JP7hiXzzLI}FMKYZ(y<#8#UD(LgiJRH9T?iRt;=INS_PtnDB`zEg +zEpKZe(%9ARY&K+{n2cJ=s~OjTQwZ&kT55TKs4BFbf*Pyk2P2j9ri)OgSs5B% +zMjjR_;(UpUiuN>^t8({b*ey-rWX;3tKnF42z+yRASP}~sSgw4> +zu?TasoP}-+D$B*g6U9L&Q(n+ov2JRi3R1+4|96MP%ae`gk_aOv0J2zhWR&>^@m0^> +zj%vPGSXRE2$#NXd#ChPa^f=f|Sy_{EYbd%CkbRXelQ?#10a8g2rko{?FHra^QQX?aP3M=tri;4h5rVEA +zkY^-!Erm5mMtI-tkDvq#t +z$+E(SQJ(45L|zphbxYD{t}}Bi)GknJlr9$^saC0M~e5OqZ(F&!4!QOuo`N +zPl|C1dmB4=5N_y-a+te2#1Fhf;a(ZnDHKHb@rFd>myllcGav%t_Krt;3#2$+5_!i( +z|9+R{#E8RH9GC$-YT;^iopOH@@#ON&HzDIO*sJWdmWNUqrJlG)UZz#K(nl$pi28x< +z3}y#%*b|z{G|oO)Q*SP0C&Z2U(0K<-I5BGl6{d=E*ri)yT2CV;7oO1L9d)Yt&=Hh% +zGcNF(n;w5-iBWW4*&~0a%+7^wGRwGu`rbHFDRb`S6L@!Fp%6(JHCowbp%0$~MV2#$ +zLV0j9Ae3Gs-tX3P!#2hb_lT^|w0`Lkf9Xr+kJ;p1Hw&yCd2MX|I3>3x-bEwB9rC*( +z#7kg^1~G0(F!)}%onVCvc+?%XRB|%C1g#F-`E>dG+E~WNqwy6r6XZpJ)f)t+^d=rv +zfnM#{E8x>NagUc(6_MXnCd)`_&&zSSy!P}06v|mGlC%% +z(;ejqWi&>^K>YAY#^SJmHr;hIyC`|??B5U=53cjCaR~AR?Lv2|qRmnGWie{0(1U+P +zf=S2tqB~Ztl-6nHzJ>i>v49xr=_6OEfI8zuA&5;y`nJ +znjH?$!{Jzs#adnjK^ +zX7vddMe&NiU9)5p6kCdocziJV0;n1V!O!l~yDK9u;g7|O} +z4Q}|wN~~Td_yI1l0TYD3gQNyA5@fQCjECEkL8+~`Mz?H3fZrBbnt}XqUkWRc{nI|k +zJ=$qS^oi;xX!u`BL}0_;11IAo&!jyoO+#pvUH<`?VIe}dc#UVOTOxWd=;$z`){EZ~ +z8@$~+JSQRSw2wrmiTrF_6deiNtL1&S5E2v#tfm;d+~<>qEnA-uB0PBcI{5x9HC;|z +zrqdX2^cW`juz8qWqn-lCT^-Sp(}5R!HUtraLsrlB-ttblbr6{~nPrWk}=ih&!kj4~w0i20&PB66}>+>Vx$xV&EgSsemj%92|aFG5~NaO)>!6$QbqPDdekGmCp +zyGqImE^dkQk;5@@7|GWtzS3ZuPf4+sPT!ubUW3PQz&wK)7Spqr&t8jIc_4askw{$( +z9O_I+7GH4h%MYo+qq;vLu|DVgm^;-;eu!^^c1CJIS&z{oq9iWtR3>89ix!`@TtHlM +zs-aK2(MIY}O?#1dGa4?o%q~1pWe<@)|)4 +z?Ob;s7^csZP`I$_QfGs#b}trs*s+)M7D)QyU#@0pmR%{jZ|4y<)5PAiiziD?d@xdIjYbt +z^yH0a5K}6c(GYAT_I-y+;N)lW1Sb73Da%Duza}XpRE3XfvK8dg-ZZzuZ4&B!UR=*~ +zl4Oc=l0SmaBHA^DUuCF)|H0GP8Yb-*K1yQk!Mcjd@E!@wn_n{({9o&X5;MKrkth$q +z_da1}DWo!_>$jE<-6`zOYqJAi?3oR{SH99UDhtl(XnCJ82UVX6H%eiN=6_|r{dbog +zN${8sMYLxcO6Im9I}0Dm +zoavt?#3flFjbZv-ddtbd;-887Z%uUGk})3(^~JD)TUuO^ +zA%CSO#B=R-2!w^>3DwxuiWM-VvDyVlccVEPatex?YXbS +zB?d^kmQ=it}89>CeKVieKiDHT(w+Po0% +z@H_n?Qp;LSwCzt9C>!9hFV#xOWD!jgGfn5BF-QkAo^%z-HA|=z28@`b+$?29Ld1R- +zSgYv?71wypp`(iJ+9M!%%MBaDv-U}Lcg}+lC>1>5u#?EAJXD$;Cc+76cEQ&$ +zRy4JRw59O1zr;BzaU=PaMygTxad)Q(ETRUH&4E_FV`U +zS#2r##C}C4GKtg0e6DMm55kC9G~q%~g;~j7|-h +z{p!hr1*$GaoCM6zL#E&63rZ-st?2q4j~Q(O3bz7G?(XftD`1G;`$stJ&)DU4cKv3t +z5d9(ncbpfcRTDEcUH_@Bq&;n!b;vo3c?z?0C^Uq2OjI2Gyw}hTzQ{zn>3`?IukEE! +zmeU<$p%6vd)agjL=+|Gq6?pg--due#!?^kNT&_HTZ(fgHLPOlnEk3weLOt+<3S8rl +z8vV`7z{m$JE=5R0r$qszWZ^GTK1K27 +ze`syG^K7VyR9wIA=~*&UH{~U7|8+gdyKtJ1&$O@lCI0~*-OHHcT|1*;h3lBR%W!T< +z{?1NRlY+ZO-1J>$KaOzVi+NEecFx(Cc|>tNXj}Qx?Y*puoqJw=!wlvYwFW4o@{RF3 +zLEQ(-^{v_cuAhhOG#Q|XV9;*CI-&jUUJDFEk%+`XBbzAaX_Y{nV=7m+oXCJL%uzn& +zYbvGV0J&_b;_e^gt@*i{xE)8t378nq3SqiKYXvI4zoUK0+wL}p{4Pj#^~GCRmR1+j +z-TbGPgic~of`Ti$jFc9=IB5N?eNFte$C$$Nx58kweFQ%VRpjxs6hAP&TDSR};8@cv +zj=qMaScHsUJ3b?J^)xf`(XagsRotH%k07FA@w2r`LS~RlTCe0_T8t*+!b$hX%Io(S +zFa(LR0KnUl|C%1yhsy{xzMa9L>H25Hgea<<;WimzM{2LT5xM;|5~04b$vX!BL%yE8 +zqew!*s-atXr$|RB+p=J!6e`6DBAR=O_AZh>uhZ!`{!Jzuc6Xq=!YxCP1Jzh@Ak1fi +z0cmp?`Zr;F=dXT(<{cvvM3*0+LA6&x-W$n0tXXziEJ9f7WooY|qN$Y9*3dVDX)9(^ +zKQUgXb(@;4#`~D1tLG$ht&h~wzP*6jH(4sb#!6-FeMkTG~`CTYb3mFFR;AmUZ{L?Y2{G_u7vhLexl^~LB{p5JT^ILiIl^e)~s +zm4sgviLg~@%oSKb0t|aH3LInJzejp;x{D2&|El?1FD`U*)hrwr{0N>#M+BV3kNGuRaJjU%K5o!$%x`iSdBQb+35_;(#dJJvru-d5mYxQ)_HQ36 +z4(yo8){E$}SV+Lrgqkq%{wfj@B8H*lh +zeDHT^s^T!pDJDJ)b;A*J@fH~TgrlID%1TzptLByV4x!{AeKnegSlPtDc#=BbhCw^k +zk#o7y()l9Z{5Q_oPCH%M0U|Y_-7cpAnzZM#!E@uM;>_!^sl}dUD`s{RVqQ8y%9N`> +zH7=FqK|_A=i}^S3@z<{Nr`DS>3T?*P=>^SUWyq9~KcRXyB^_>nqFA8Zj*M*zKEpr) +z=`b$!Zx1I94hDKW)VuD?s^G7~@}gN4jiw59w4k)o9d>W-5w3O@|9iIC<7E_?&B8_Q +zd-YL)6Xh@|wmaDsg!nY*7}ReL1f{H}uNVxhxKN~Lxm{}{farl5i-#%#+r4E0=KDSG +zd2_gMKpgpkicE9rY7h$HL~fgM(aDGGd;uC+5_`zA5gYcm8e)*3-Z4CN>I2foqBhMpW>TuBjP{CG=6*{&4 +zldb${-h~%aMML41p)#u{R<--f6x>}v!_CqvA<=&DX^$S#=ZN7Y(4 +z6sc#C4#oD(ax!z1NfQlnYJ^YSpaR8peB+k|o3|;=uo9iHR5`_495lsUz9w9K=3Q@# +z`}@$C%~tlOL4wgBve;GZ_d%mvLic29r(Y&X88j82@6K=K+~=2&NPAJcSq7KW*emC^ +z!6VI-6XwqXFmZaxlpX{-rRY|?MEQ;yi+ET{j`&dlh!14aco;82;#=_=T{4!`w=- +zd37RsM-1awy;Dx}&KG$GT0c1UCw!DfxzMDoU(e*k!jtB@-8w>+>hz(f=-HX--sl+W +zl&?a4*w3$JwxIDL7XwfsRCKEwHBVPDtZqC$A%NpAIzpz;^UigDh`ooFoG>rpoK;wd +zJD5Fey#Z~B+1Q$CV%!ew8)B*YzMP0V?EQ7=JgN#%jY} +za`*k&XwVw;8&DZ(Z;SZlezz`K7&PA(x_8Okd$e-11dK7X@w74by``O8u;lk0?7kq~ +zo@5+<)LxVS$?tyMSDO*?a%}z_W9SP22|mBi_`a!W2{}2oE1h9jOV%59)fNP3x&qn3 +zAo4FAZE?b_X{+>7+6O}~uAR}}7zk`f@5-T8>*_1*1o_Wzv4VH#ej1TW>;6f-{pj!d +zOz&U6!FQ|`C!{)LsG+2-^c7mGj9%uB=R{w}gR8B@bC<#s4GESVZUTjtRNuemr~EN$ +zCILgOhz=Z6j;~NEx +zE=Zz7mx;dFwNs{C1hRXNJ5JuhC)7z5k)s3SL=K99Kz#$>%g~R6vMssUnIFFxS;Clg +zT*YZ@DRywSiz1ACBKStdxT`QM!jZzQy3}w`s)C}M*qHXU6~V9Urn!kU)l=FMFlx(YMoeS{YRRMFP~86joVT_}$I_nkbNS;)bBShs4GYet)Vm&>lVR?dIfMzY +zNVLxHG0}atD&onMbdb6!ig5JEh!MD*LuO4sSSh-?(~mE;Xr$zho^d(vHTllkg}kE} +zAe;Wd;o`X!R|@3>cH}9ww?0nR`*-H2OC?*Rq7&g)n%{DdY0wTmh!qgQe1AcE%{0JK?c^AMtqt{Xv2;{I4h}qms)O4b9 +zkzA+rdPM$amp)(7#1+8*m0=Zw7EfOLv3&=)Eexet*`)#Y4y10Ijc;#1ZxMr}0qM>I5O+X*G}K^Y~{tg+;WjYyFva#W*6W)+-{ +zlfZQgP{Mo-IRrl!vK6h(%#xG>>kWoV0WOi}7PQ +zuAx+fHu)HC+$E#vLTuD#)(s4i-sIkKJU@7+BLkt7{8#5SYu`V+^m8Di``+hs{ +z3-fc64?k$-v&`@%?DL_*fA@PuJ}U_6*q?m8r<@VFPVAgWFIBxBrt)rcA1)d7_%tC} +z5f~1E2iDP(xU99=KJYigC54WjJ%wR@x(G4cqZ&KQ+ZF?T0>_qxW-~YM=;cPslZB;tdQ33HRzGrAb=80LQZV!4Yuwm!)r? +z>iX!!{j&$n|E{a|VXeis@AEHd#DF~V?oEw{Ok^-9R2yxt7~k}e+O+yo)7ll{bNkd} +zWg|7QFBvYe1)rO`SnW{8KTxIbrzeg$1qc!%2D5lX4vkTKb!bzN-e>dko~PHAonWA#Pwy7i!RKuKs_SXsDPVhNFeIdEJuu{t-INC=Tx>Gy2FsTz +zW~w$mOk((D`Z}$D`Fe$3EF6ayc0mID8K$dLcEfkt^4WLc|haZ3wkVqG3;RUw1=sG2)ipF{oPgal!P +zw%mv~w}~3c(X=Y1KLh18qReZ_5S1f^#NyC*fH?NavASZsnRp|ppO#<#9{^K8tiJ?# +zVuW#ufR-r*5DyUAg?WJ4<NxO +z2?VNwE+a|*JpH5iXFC14@BQALjScv7e@m|5%f9q2cieILxBl-A6xjpF@y39$ES=P`d +zi8D2!qL#fau;4{9K^ASv(3!6K5(=KAW*a+h=e%Jsg41%hcg4xu+SMOGd2Wyc6+^7{!VNldQ +zF%;4@P){K&i_P#;gYFtr%%*lMv6O>hJ!J4E-5PI;m84b7$0z8zsJzo&3EH8M59!{sJI3zK|Vh5nDhC +zWp#-ydw13h)SXMgDAaSgN!-S0E#<_xoEgER?&TGPg3sfhn$A`$U?QT+EOd2vR&53# +zKM?TBlX&TZ=X}7>s@jEj)k5N^w%x`YVjYHYQY>T>J&%0JKI8PG>$~09uJzrO#Zp6{ +zlmt@;fO=lv`p`p{&YnFn{5Q#rzw+(r&IdmDa5eFWg;An3^Q%<29)rYHs)*@~Hlxpy0Y(?4+(CaKqEc9Ql(C+4rm{I^K6o)IAAyY+& +zHLX^LfnQ5%;1@Gj(C8}GwuAxeRUEhXN=N;yXlL7t^ +z>+@o9kt_SXm35FlQ)iJ~KIT|>6Es@r_Bo2su)@n0GKgqv^RoRb`&T?RmjKs{DFw>X +zE*TfjG^3#W2zetLR)u`vj+?lL2FvC@Sl0(%R?w22S&mGc>y<@I)u72u3xva|Jh{!jMA5n|NHH~av<*mW$85I4>C2L+N +z9H$ZDv$2C9`J-FP4!Fb2#e +zWy2(#zw|qB^}rmWc}J!Ykmk@}PVvdBmZny6*0-V%9 +z|46qV`g=co>#dhG5Q;Ig$CorSCmhY%28uvL)1&*nCqxuE@KL+oUD +zatY|9?-pa8ZtETg +zJSBX3f-ox+5VU8}Z`;1@0xt|ch44e~e$NRG;tzk@-ro6d{@xD@_j@!p>lNvbaWL5* +zVHHXZL#F7buah6(D?6m(%Jo*mieYWMbK0HJKN1y;n=$6C8I2oXa?P5T9o(J*g{H34 +zGsZ4D8^tBQb80(Sp$W?NUnnbxi&fv;#nb0&$e`z~lDV3sE6I%M5KDSr1J5(0S&Lqf +zQAurZKl?j)^}w;K^D;p%o+y*%3ZWvWH^^=oWD$ElBZJT~iy3p}vqzCW4 +z_s#d-dm`3<)aJl$x2lm5xUdm--Xu;+nZ9(y +zY-v&>7Ll(oQ1H}6C24R1N*Z6HHDp+8Y)g~J>Mg~P3;R+VeDndD}0^R9X@|I->KlLzNJuF1IX7v@0Dlr)GwRF7zX8DqY +z>K1#l`YqXhlKn1ufTRIio15SFUEg(*-TpCd-}avGxP=3upq#vh{D}qe7ULijsA12m +zO2LmNKX79@a1JCQBGXdB7aWAH%VEFo@?J-+mMU+GE>Sf#NPigL7Tu)KEO|>nJqO$w +zVk3~dQ0%?pZVa36u)?x2Y?TgeYX{DpGc<(dIGD*#W6TQyayu`N;6&SeV;~3bGQz?# +z@zvUh8I1%MPK4|o9UvuAm4;d`9P#ENnSPZ$TI@E;X@drGO +zq7P5rfE%;oBAn&Lj$1;En+Tc2idOJ80)xzJD`dSpnEB5jO6rgy>A)mY!|EsJ?Acj_ +zZ9UrDHkLiD8Jg;I%`^jn(i3-f-MI@IJvl?|$MW5{h0N_dYpnUaxDvr=d=<#7_0G(s +zlF_!A$1rw_{F8K~B6MA`T)c3yOVAwa!}KmQ|G5UW9VBK?2z+xL9;e-f%}xXyzG +z&|4!WA`E~Mg^de_40_2Am=0(~$ii-_#?-!r0-hl7m*5mI?X>ct%>E$IQBEv`Q3uwk +zHY$;i^NOzIp?jy>wq+%0(3OcwWoMODU)Q!|U1XNU^x)QZJbwWTOej~5ERV6BToH#{ +zj)*qX19`21EsZg9_jFtK_+uY{rw(jhFIu5fNlHv8+B_|eMEzM;GUB~;iG~$A~cxua+Vu9aOs0Xp` +z{M*(J3PIoizy~%nkP$xR+e;oioW0h0%UBhd(h(7kcHYB}eh8jA)V`poK~J%MutjnV +z0}YIU4>MdV!lE{8uZtr=|cf_g^TA&asq@>VpT|$9n`4UvTRH!Wo +zQVb^pncOAN5o9o;Zhpz;Hk>;jLHc4PrUKMTe>L`=>&2$h)jUmwMb%tJx4X`J_m4jm +zpE!^fS0~>s+505s%jHrcoOF+czFjWn?P9rHEYi=E`=*~M3i`@7fBA|1{=D42>TO?h +z>n)e+(Xd!=SdP^iR#^1_Rb((6C^PD(Cl4%fv{iG`3k%AFXw^x`u|$-)@}RpStyvcG +zk^uvdCJkD$`QB1p6ip*exh%%Sp +zY$--mZZ_Hpq=4sW6c3d}*Pd}wigaiF65u2VUk~b>q|eHhgZokoDnn~NBcTKhVQndI +z3*z0@Hl%zYRw(PTF%KZquvE@34`+8&6a|72>qS%?4VBk<^cM-?9dH?(B( +zTSmR{e>)caB>8g|{l#)VPmjO+WiLIE+Rx+do$q*87WV-tx)AllOxf*5v)2!uMqnLXa)irBfw>jz#^l$Q4wc3K6OHwm~*Dx}3FG{^?kh3J@`eKrV0G!D=q2z3$+nf2f4Qk<+6vdT_3gd1H3 +zF^`7Xvi~1G3g2^ge__&clb3>iG5Otsh5?|3Dqhw3dA`t8x|;fb$`}||Nh^$j~x*Bha>()$2OmC^I5X}tOKM5 +z^d|y8!%6(}dB45&E57FJIWRwGezX%DSPfaT{ueS+ +zkSAt1F_MNZjRjPIdB>wh6Cf-jETj&1E;+we_$g#0z&kgHSZwNm2z>H8LtW;_42&yu +z!6_EnfeW`(>5rxxzATN!QZ_9`9~}p?&Brn3LV^wba=kOOvw8cEKGt4&A;~vYIoqX0 +zJ4pv-bJBsuEGfWzHkA)MfA(Ym^7DLq{p%h|;mCyxO8=HY5Q^%NqB#yqL&p=}+SZnq +zsze*^vk^Yr$vCWFGi!vfg!}Y3*D=8$J=P0zd7MCj``%fIky-8H_9Ymt**v}#;LBQH +zsPUqh$x#%NP|I#jS89pEPRa+)M=W^HoQ~_TJkNo)e^8Lv;S3N;qU| +zoxaKTB|Lb7R;7pu4zz5g$+g*N3+nQaWMIZeFGP!s3-o@4Ye+-Eq=UP=^l49Dbv%6^ +zWor`*TZBqIEy)I}bU7jEexnsIUYFi88+;2u>n~zh&cfoy9-05uTNk@wI%j)NKc`c= +zGo7Y{SaOWbjg1Q@Bk-T^+xGVED_?on6Hk0>GJ%)A6rT8O+4mPq?x*0eShc`%TNhzK +z8J*R@NqI+Ns`z-o4+otY^NmuPWjtwZImbHC_Q9|<1SdYE)c9@;palCHX +zfxziPEcvJf{E=50No~}S(vD&(n>v;ECoVJxbEAEPwn}-}aWboXG2+ +z#_da9dAIBh9FOD6Uk;iBRy9qmR$#_B+?YKygm7#)27>{l<6}t&3LUysB)zODGc>9* +z3VlsQVysJ$%B}^n^}_jFqcra79gc+xLlI(Kr~wuY1}T{aw#K%k{@{0mw@*J9_eWE9&cXvucCh_h17;|%buIH +zUWMjSCN00$>8!98=3NEq448Sda*|+8sGL3LOhoo?8=o`H9PZtY*B_6|r7jYbnkHi| +zT!CF!aFrRjYFcxBCFXRNH-B(|w7Wxr(^Jn@)6@nC3qI#jrt-YM$+KWRBZ92e>Q(^P +z+!(HD8f^bDXUx*nl3@VmTp;tjce}g(1g%KSOu#xf!x?nMo7A&lxI?>aR+Ti_WqKsa +ziPHx?`Ak*(E!+Y6aZa}Pfx$wF?n}`=gm+7#Pm9AT0pNwcbN)%29$|3=i^Jc3;pnoP +zZF;zH?(Da}=iLvUjD7v-rvZ5wfT4-7u?era3x4ktWp8%TfQk?f;(#DGZ)KHOxrquy +z6L>(wQvqyNA7lG|KhVZ$wB0Yf15b8Y3j>OoXDtVb@%9SfQLJ*%2)l4Ya0?kv-HtCL +z9axA13839&$Pl)up;XzxltUMB8Y{#Ad5JbD*bW`&6HnU-&^^Ie@r>zU!ghq|i{Vsg{1>C>|M}5u} +zuC?4}!9z|`E%NckE?8kLr9lR~TQ_LoNTHxqEb2n9NQcln?@wLA>rY|w1MFC&x2>o< +zrC-kz{3X4|!OBOJnrRe-KQ)OhflhuPos`F(QMECbRlJr0AE;*@DCS|XbCe8N{&lkO +zYmt)RxSV~{L$CeDH^1>suetL?BEKNFn-D{!=x7rjxCcJ?5$O9ud&sDr!3*mx8~Mde +zV7upq&zS-IBOG&~v-d#byeTIpdAdKR!W7c?HmV}1xKJZeG3J22nkROw4>}bfN7BeB +zX3B|g3)i1?%cW69yMl2QD%$8I&k_5Lv4m1!$+vUa5lM=|Z;`&w?l#`;+~ZH{WN^$u +zV#ZHo6cLwzgx@NP2MD|do2o#|@B2${dgqtD?$Wu_CsO!@ykUvzYf(;F-$QSN5Bx54 +zeXTAf=tmqZr8J-zi?}hVI~9>U>aH_4NI7xRj0ZF|4HdRN=e}im3}#v&%~NH*J}{nw +zAwXp*i%j39mz}-@*Pe(eCk7=Ma=IA1W~VAdSoItvR!}9~dXzH(*&nvML!r;(&)~op +z#vCCEqX~~0^}zy0b_Hzyw?_CA-~XP=w_i9Bzb_8?H=tYfP!gh@E%>tg;C&wwHp)uO +zE9sBb!zk4Hw!;`?(l?jMWsPxzQYQs`tcf3T7XMVSlz^3Ej;R!{nv;Z#mGe4I3H7{> +z=o^Pe@ysO{O+dzcg>$wKL8-wgH;okuip=y{11ke7Dq@wKiU^7H>1}uWEx8_G+u@5o +z2{2Anj8?xTHSdXeL5)qiE#ur4BS +zRvGE22Sl#G^Sq*j5RM7pNI7**i2{uF~jVbfJ6t;m8C9*XeyAuT{JG}{C2if#^(;*sU3L9EojR*txGQN1wB|Q +z07h{|tpMtUwfDdJ;)&ROk%<0)?)+xA-EH`a`=Q=O8{y{nr4ZOi)x!b3q9O71RxfuJ +z9|Z13aj1L+s0a3d8doNPL%|J;Mv&-mDM@JNcwLgGWVb}=^v=91iIgV=87YxYdP78l +zK)9eYx8ZY7QGY=85AjF$%-SFemYN`Y%D5h@IR}??gsw$*F-2a}Y89c(8gP1tj_k2( +zsHJ0@5|Bxt^dRyW0E+aJ+o3y8Ub~KWp3Jy>QN%x);ye@HLlqQpfe%ja!dKo8zwrTL +zr(Y=sRp4Sx2N~HfyvjgjeuSjW8hp5F+%l)Hm-O02df)2tvCv=4Sy;^N`rQOaD4iN4qBkkjy<$7-W8$#&6* +z1tolEj;UUL(!5pQhS2Wa(qgkr_j?LLs5sLS1IZ%&Dht_#kz8nb_^mibl9eL5zA^GP +z0*tZn^-4;8Y8zg5i?b24GGnLAKN>`d^wYA(_y67>{QSRu_(cA`@CuL@ZdHB&VL*hd +z4P6g=+wk`LIUhK_C$-WCSGNo#xOaoWkqE{YtuO)Bg#J;Of50GR#@oEY5e;RS3)!oL +zs1diYj6|gp?|83b5^t9OB*)8k*(V)1-;o~(U6T8*TaqiF!Sn^IL{E1pJ?J=94#G(& +zI~zs2DBuEJ@23P7#bOgI+@!HcVl9Op0 +zbh7TQ?`Zox^LP>1lv)`buj=w1sTtU7yE-4Kb>=jUlE4hlY*QZa$TKzv)>)hu1rWi` +zBxuTg-A)DQpXcfaB!8Ti87j*bqp=$G0h>Wr9Y#Sr%M7)vww^cH;Weei#N +z5SDEPkBg;thO@THuMp?b8du^vI$k+MPLjfb_Rn*V2O=|8(LL$UiWS-pjKb(H^5B&Z2{`QAXWbq4f`_v=< +z)_aNgrF{ei2ZLo0EL3q3v%gZr`xowo@#rQ)!yMwrh{GZ&!hk*8)zbnze{6dZNjlmq +zIQ<|+A*L;Ps#tQ#J}8?kMKGWg`n|1E5wa25seZV%`7c_t}OO2%4w^s7B)pmfzPIV;JmG5Ml55+F>8BfB*Xoq +z>EHZ^|MTO|Ts;xT7ytH=kNl40yLHwpB3=_8)Egj`UxEF=zxPJY2cq>kO;4K45Qt@! +zSY&Km_62ASGO%t}eg_I=k`5&C-+BNgdP&kQ?bsyZ7^N@EaX&L^$`o_DyX=?7@yml) +z%Dt(Ikr!Ob7u(#$7oNj@sbtRB(~Ld}1x4)AePMO?O+#E)j(gR8?;8g)%Iuvod$KD6 +z@9P5BnQdtM_^D^))4Wa#K#ZYUKVndl{iE5B{Ig&Dk-zyLok--1c{@DZf8YDwyRkt* +zj`;zVevj3Cw$@^^bJ)I-njWfy=L +zb>3%|p4l`yoRB$5(--OKYn&bIoQrb@v?D^_hI0KuTn}7LrNB`m@w8C7Xp+=ir)C?~B&@K9RJ*$B= +z8AvjPcFJiWq*-!g3WlTu>Djvv7`Z=7FqiR3>Vhtk<0zeT-=qV{{0B;ZTT2Nj8`cFZ +zT-wjEiqNx9)|-PHKE%c+p-(!{k49mFz8f{;^ghjq^r6XZkGx7rbU_0{MbPO=a+mX7 +zBpvAdr=G2g0Rc)Rq_-dcFaOgMiF`3{Pe1+mM?dnu^$j-v9wh{lJUGt*J2Ux3eA(zh +zr&>WMfu4SD?d<)P*IoaWkHWHJ55S3YM8m~6L)l4ok;J`&-YPw?i3d89PtqSinu +z|6V>0H(c1c&qdv}#5nZwjKE<{Y!G+rJpIark@Z;u-4hS?9&wwWg`$wPj?M(E$`xfX_pfG%$$;W9PByx%8J4xV7ux?;EMq)y5heN$gvEY|oD{cJ{~(Re;jq0_kO+tG;n +z!6W7!qJCBq=T3=$pzpjR!XM$arcOUm<*sv=Qq8t@mS8`v87jy%59JIA4KngVOk?W+e +z`;xD}>&eEd+|k=St`@0Or|sO$Dl@7{O+gLmD1`Q@*8>4gjD>vQqxPhYw6na4i% +z@!$XO?|yW8v}i_2iPkzc|A8e{=(KVe=rxoR9=M(qJNl^n&ordZkkN`dz$nGipLR## +zmi6%1l+6Eke*IVehwu7}C$jhjx&6wo{B*;Hzlc6?704Gga8||l)!=X0ju!_}P~R)0 +zG(}Hg_a%+?fJAjt#6ZY`m8NhI3ek`Sg`+7M6_5v$Y^As8V_$U%;=$uo;@Nmj+Xn&t +zw5|4dQ|Pmha%XY{%(Y3H@Tyn8@|(Wp8(#a`yFb^tc*QGTmj1o%tKM>SboB7UANs{# +z_!n)v&uyy4uS37-=rj$*BFrTJxffHMNzYE1!$(o}5nR8dUg2*~B5aQN9U?Zft69ozmT%m0FH +zzi`Zw6G;Dd_O`y~KmOj=d~VTSxovK4zU^&qN&kN4XMXXQe(Ak!%k5^S^;DXcq_CZ5 +z;!!6^x#R$7GNErpl_esgG)I=5g6vV{9v$}(L?yPGcxv3QkguHFUbNef{xAQnZ2e5x +z>Q;kV3AH9b1_jwhQJHBPRIpdTKSt)j6(ly^&GSz`fA*FOaV^>c3n>JZDO>R_L5I#< +zpUGKJW@TI~6<8UFNz&g15V;GpC;MgSHeMymRd~Y|V;rQzHDAuZ^vm!6_V0Yp=GNvP +z;{<*4H^1Zl```HgviBW;a#ZF1=bV|@a(j}SLJ~*_B%vgsgx*1eh2m46^&x^h1fL52 +z_1U|E`sATLyVwN<#fFGJL6o8hN)wP036Mg1yZ!FY%sKzBoinpHfao(9g{< +z?#$P}-}n2@JMR$;9{y0u0i+Ym`%QA6yKd9YDf69@?U?VD1iZX%+~ZRTtVEqSDwgI>T6TDF`A@Ijv8{3ZZx?;#zcp2UDB#iH +z1V%P-#_W#{f +zR4SFj4m;?UTW%WYA0@IZ9>|H9JK8XO2s`G6cIP2(T3~&QNkze@-W<-~q>MbJT^OS& +z=u%^3#mW`%H5V`3bB9$Px7+G9D=+-Sdm-xu4*>T#)|EuE*v?MOh7-z+(LV%W9ECte +zHc${KNWv1iL;8oc9u-*|(aR$xNi}ldXB*aSup_xDP;tIA?%~DEhHJUlLikV{_-Tuc +z9gM#hmdzZ|Z#-L`4XkT!T83-1C=VFjX~xvQi}d@fpzY0XeqEA`SPLFN;L~|7SWy&m +zC!kbLbYZ#plRQ +zVk=v_odD~EUmS%dr|5!$>kLh-O$Rono0mfdFq$OM+urs6{=Oa)VxfQem*=q#1YjJF +ziSg8d#6QxRp!gn5KR3B#T9aPGJ5f0VqCY?5OLE~?F4+;5jL&Uwu>ZR2e~yt4mp*A3 +zbi|!tqnb_C-(O?`ii?ikqqZUg)I-<62B^zu6;2@)6Ue=Y*0SwK^bHNAUKvw*|s0szekuI8CuBn=9*ROLU +zN`)1XlI#|Hh%Lv@ya>Zdj$vh6nd6o+ZdoB4n>mF2p!7R@gn-1j +zGi}sr4fraY{?aH;E@Q)4s#ws415}<@LOjIQKedF|fRwfJU +zu1QagGGiA8YhB>~4+*vK@o?6W<-RXV%eIJGgs4qG2jG7AF^fC9I=0ifJLHf9F23Y) +zNB}xIF%O^+hzI90F7rdO8xw@w^Kn@vG*}R+!Hb)u5pa--{ssk*Nx2;hfVc1Mfu;9A +z1{|@_M=j$o!MgL4BO_|dRyBE&&sc4-4vgb+W=Q7>sS3biqZwo@#LY!QI)#-7m*nEqTs!o5Vzfx{>b&zZeLK)1X3zw}F-{s!1{ +zm;g4R{O@Ps2L{!~O`gruD8KDlX8wfAmgilJ02y-YN?ha4l)AY^@dxpnDqFjLtsY^T +zL>0svdEI2Go+_433veDWZ^TU{#UdqQhIz2XswhT5M?UM2?Ro}h?J|>^ZYaJzU3o%d +zGnS}Sh+xYnx;7IATpnD`bGH2$7a?X36X-l`hL1h_mH*n=-nK(PxA*PWH~gG7A`1H7 +zl;NMPQ9kFvgM(_*W(jy)DN@&d_oww+m0WqHo-m#eJ-R7BSt5^s_pV>JZtAq1qIUEm +z*3^$*m)=T=Un)I9A_PtodBr8oOwHM?=!gTuCp>4I$+L-p6+aLBomO2 +z6Pi(QgZQWCmInuzbcp%@h*g!q2~{YClX1YJy-s}AQ711sdWUpwcj>?WX9EM0{sy^c +zWhj%t6$aZOd~Il0ZPsdHPk9Am(e!0(80$d5xrMfG92lX)PSvt2fLwOn+I5q6n(Eq= +zpk=VT6qw|k5C;jiB3G`w%RXn2Ce1gpAFyqmwe1~7@3z~nL@+^9HWN$h3t1<;W+{dJ4#y +zM0H>YWpQ#(%NjYYi-BM)2dNgV;LSy`9)Ns&wO;4U?u%)@_<*1H^q0 +zYz{}pa$y8wg~<8cIi|m=D1%ZSO!|;-?~~Zk(axN6Qv5+Lluw?JZyCZwT-zwmaepv# +z7E!U^`OX)W|8X#(`N{XZe&4<4?vTiFzTJA;Z&?8hbCjEwh+pfmoG4+&1r8t<(pF9B +zDL#$Y=`mlqwlWo2-ZG{G$9kxQwsJ{}Pe2`5y-|%6d4i^SfP${SAWqO!Qjy{hvx_KB +z55ysi$9c@Ce2K+=RsjS;yQ!0GB@Wz)B<|7xlVlx7@^Lyj+jZvT9n$|4)qhrmd{>AN +z{m^4nsse3GcFR_La7b;~T(afmty;b|YJw2+Xo0VCauj3&5s+)$c$cYk^P`(5&YWc0 +z2@vY*Mb6nkq(jTyeK$bjF`hin*%i=>)i_iVg=v>^TT648@Q_sPPLti*Ew-7b#0jY_ +zcYlcl7mKt^OOZC)Yu!7_ollkdmu^>7Sb8k!m=<2>P>L)FQT+1L!C{o$Dcy<(V=*-6 +z5XH|4gdsy&jMTby&yA6L&rE{P<|^B|YO5V~LFKeZ$vG~#`dtC?Q65+7WTy+(AIIlZ +z%211k`iOHQAkg$lwp!6b(975dN|!NLp#%W_yY!*u1CUtlxQ(*{-2U58+bIY@qf)@5 +z3R>K-*sa)=^|>G@`m)y$ZbS8$qN@D919c!?RcsDaSm +zKXBH6esExL#~8r4-u}P}Ac4LX_D@}8z@EcEj9kHj=m*t}C%J)~c*B-b8B`U>xu6Lg +zi^P64Sc&6`{%KoT*U1T?ZlDe<@9&z`quUk5HpbGRd@k%IIv1XPiv#j(`)Pch0XIsy +z@rf=dvghRkme|-WBnDB8oQjdorca1gZc;-HANLbkom5U~d~NB251;kc4_^Ak3wFrm +z_}o^nUNO+$XS6r}rOuS{M9_N7b_^#f!Ami;Ysm|SN7P1$g}RDpN9;YWBl6`@TjD=# +z1vjYH=71<2`GLHl8e5ld&4xML4?#ahI1+9N8J6QZqdy+M5J>ULQyX@kVoB7A4@jvu +zoKEY>5|eqv8x{Vg4BCW8I2lWqJ@S*QuiGJ-<8ym-%?e)3$O^zg4%2;>MKBN+>w=44 +z0vqL7A)F6*AQsxtCj$e_jYXExl{d~y`io+!gyES}SRqyLRC5_kIR+}YhHCadGLR4B +z03K|6?wzjN`%&o6uI^GWK +zqkl$pTIr*?;0J<>2#hK8wg^;W=;5Xv5oit4uLay2-Yt_gSUy(L4N&8i23TJOLc$^9 +z-r|Kz$ga-ZjQDq@Q@gT6FtJ&Fc+wQl4!G2X*=2p%=!!C@m7p3%!_AJoh +zNl%2S28Px8{*W1pL*RKRqDK#;uf=D|XBe6pBZojsFGLfpkG0}dHSIE$%!zE>W-iSY +zhd=`U$r%R6Kp@Hil!sJqcLyNFoy_Lm@Mp4+iIh6y8bXGhudKJDIXv7%1O(hOd<=9K +zCm(;zj(X_$+?M|NZXqD{COk0Qpy0$(whyUrSYW}yI!E~k|FkW=0S-9^N7VXUP3^|k +zmD5G76LcUh7Dv;2eIr@K-TRi1cDqpMRJgrVrD}BaA(PB8d5yw-<(o=!PfN$yxSdU2 +zNoIXs%UY18O=Lq+LODu&Y@CB~9UvolwsQ`#}eq;3zsf+h6(O6V5vIr90$u{BCe*>O$*jiWQD6@s9R{_hF?e +zV{*9L6($0lpHL5&HhvT2112Aw(ADD^0C6!&?45%hTB*WE!$g}oB5E8Ry0k=s(=8wkPKuhr}lH~jlB!2g`F&pb6))}^WHmehx9)c9)RPPdYh6l +zB#+9JXr~kcIp5pj7FaOJQr#~#1l%_L0f>c+U0>^%&Yu)JB}5NAHo$ZbjKub&(2n|I +z))u?C;l&XA;BwMjs;D>w3=)*C%Ix%Jnxv_1QV4{jz&WUaOUJ*a!X+Ru@DXuJ8=i!O +zyeCe0{S2xouPY!79OT5Wf9+K%}fnHth+6CdzuD}r$t!2L@)FSJxL`SkWN#QdLF3Q;h*Ti`qA9& +zlx9&%Yn#~W+i +zG63l}dA0DNmuCh-ii|n&sOrfcGUe`qmEg*iiA8-R=E4$4D;~hI6TqP=u%viTNe3XB +zZVqjv^%po@i?PsC5mJh$K}u>|K}m~;aUCV@X#Rjd6-Q9RnIwVPUWbK@@(#skpG0vK`F0 +z61|*P3FmtPCimb|D{;Te=nqDrC(#EdfYCo3yJn-mnYTAfs3KY0I1cu|JQ)qQ(%XIM{=0}{$x8F|c69dnL?rckvphEX|t=ecM&~n}t_-QYRh;*r`?0n%r<9Bh)!|@N_!3kvK +z2k^i((;+_w?8Yqx2vDdZC1~Kb?a^jql(rKzn5rEiqO`t-SNy^42S2`Yhb%rd3NUXG +zUn)z00$E!^b{F!si4zfx6I8<5$9DT==~rP@uPah#tx7ObdMe(k2H?qQYA5A~0c=r| +zrR{gcS|pXxdvj43fsxWW41D}n-^U;C>n+~-IPYx6DGBC+*uMKN{NyJ-`k1e|_r9g) +zee5$b8jsx9r~%hpd;N2k9JlYH1v?~ioNt{S-QWZsSb7&zd0G;zoJ0*CBcpmIsDZ6K +zVoULi8@v0ckbYMRja*Aa%u;JyL6?G3*{24TT0c!q<7L5RC|;C#R5?rzxP8Qz3iJ`?)aNF*6g_bUv3BN +zeyUSo$p`m)77u(+LyR*3A-{I}h?PdTidOWcjm%MuA4f=;By;Ahgtr`qaQW +zwIPUpkZf0M+Y9keV1KrybR}nM=qHfJbVvXj<01X-FHc{R?a!581GQb|WW$~TA(!@~)9kXIgke_M$hc(ze_2Urjgrw``XlfFNu^S) +zRjSpMtJl8#w6p%a?BN}9Ii9zZPdEi@L7CLlIUM4wK#u9M_V%IMeRqa5op425{V``ry^m)bz4CS)mLncvH$44JCascT(4Bqi%FmkL-Qq+%Ns? +z!p9TMamWGs`&Cz0pv`Fcbw?ljd=hcGS8AjLxM>YL1vavIoZCFglPpFM(OGYL+v{F) +z>PugA@($4)pWDB^{6D^Z>E}@N6K=1%JlEg>KvHvq2u-2$*Qf)VH(<@tmC{zObr$`y +zFf-tL1+GLQ#8p?b&GZ@M1O4mOdcW|(I%$LzwIeG;h(a`EeN5%oOO7l3$z$F?3;PH3 +z6Z{pt@J2^u`xA_NVlw`q71dh3T5GG-+iGp?^|p>LUwrAg?|9#ub?bLX=Q!M^?={!X1*joo)vna1=O!TW`A&(qFhHSw#1Yh8W?%Z?;p!X%)q4 +z(nPg+lj21VA?7iqE|}6S4FTi1|M``%E(yKzGr_D3kQ2k}K?ef)a}Xt>hSs*|vZ->d +z=_w~va9*t&&24=H`!&bAgh3A=1_JZ1BVH%$Qyu3rP=HD`sWhUr5~tOuF$(|u_3!@h +zi|c>WJE8li!wx-R$#L`M%-JEbfA`z#UixZs#W57{BOf46$*;v-*h;we{Lc?qV!G3h`g2VlQ5(g9EgL%a+q +z#F3iPt2S&vC=SFtu}8%T8J6|To~7Y|kO{}7s<~p|r}a>RP#Xosn5w4PR*}+W>crxi +ze*p0hz}Uwb!`GYvQ|Fhn0MG!FB%lVG`eEenG_icy7yx-dhQF6>WSA(Y)n>C1SE~s; +zf@jE@X|uU`VCZ{4{n>YZbOkuX{SP_h*@qr-*rJ8IY=;f7&$QcH-}3QaU3cZ^Xdmi8 +zr1BVZfXFY)NC}yfatvcoYH>TpMBEp~{B3OVqgHNo?RjvcLPU!Fkj#;&%j9iAp!=~l +zs(aNGgF7Vi@}QYG10M?&BrAGb{&vs!GLB3;Zrfjn%fV6XLH^-C5d4S}NGjM2AWdM< +zD7-U86|iZRqI#sws9KFc`qOG$tI<$Fnh~xJ6eCNUx8HKh&wh7vQ|Y~SoAb&g$GvjN +zv%A}O;3@vbTUS@lhd*%9Ti*IIOnlMyyU6Iwh?t@uFrFgLN~0i&aAV|piiH>lk&`Aw +zeqCg-D#rRj8SQ%ltv#}_Kmv{Vz}5{^7xLuN+9w8qkTT`te|W67chuV9xV_%lMfc9O&h9oi=<06knb6)d0UkRh +zOx(GnqmsmTKeX(fU;6UQm%QxkPk!pgyYGI6i}ISatH1iqFZ~T~Jnq<&jydWi0Yu~; +z77-v4lpX}UknrPb^aItT7@;f>a$%a@wMe{CEo1d+%obo*u!Vvj*s@lwDbX_)Y>lC` +z7^ZL@r!=F+Zz%F{e%00?>i$x!V?rS`CL9EbKGs9wzm;0TZGn1QrCx`}T6;&mqXRUd +zt)sKn-dXSHY6I!-LN#dX?y1vpM^DeLJ>8%os#1a9b;&P(`P_HD6Ye)WgVkWCY12Um +zPCfHwx8Hf|U;EwII1k8` +zk(SjP6b^BgS-KT@h2OWnU2laJJjSmxL!-+~dc*@zgU+s67wAJ*dsp{-(1ETl-PNT!I(TdI4R_yl$T@Gg +zZCrkMNc{*h$GM#Fh96@Fr^BMyFIDhFXr6pjfb$7%qNf*`8Zl3Klj%7Az9169xm +zRD+Is7iI<3F3^F_z0nVJ>+WuZCDm&1tNVtA&idqqaDN6mfuoN+?&U8z1^1Z_4t(k} +z|MkL`9)J5CzkibNJ?X?(z2slt;2FkCFlmZ;azD_B$GPABLX>jg2WqjzMbiCsV!5^Q +zjOwbiS+z7frb^5!*0q#M74--DNe8qm^59|+(J1}YM?jBLYtpiV!E72Z%hpmy0O#d3 +zl|(hgL@{oWsZ>BS2pwI)=m?TyNDnYL!sM8B022dn2#_dubf6}5c2?TktDPMf6k%@A +zxv;ydy`vKq09`>R$B7sJ^6Ilb`QOjPKD!S$jJR7BR96IT|>`_L%RUA5RtKawx|-&G46sSvmi +zss7Dsy(uiF +ziOZKhe*XW=ojYGPCpvZeoxgwmIcJ{vh7*5(+YNv5z3+U-MN5{viql^<|9LJf63*iq +zl-Gou5!BQ$-ic$OZ8pg3&UDk5JuCI%c@d{Aw3bb>V;!MqpkAU;jJid($Vl7VXr2kp +zwN8vnRNB<4V)9JqxydW4(J)D(DisZRMUw0nMR!DIF!Huya1dU9$u(EcnmX;>|90v# +ztGeIWb;0?cKIQZm4R9(IvTd_P2dGj`VfcT^!ib +zb1RhS41BPv_9g9046apP+)9vl>$fcpPKJoFsp}}XG4$Pao2k1Z-Bt=e^ +zNW+t$1C^To{jE2=>wRY)|NQx%|KfR%u3rAw`M{elI_}t4g#{MQ6(hpBL>_8N8&Ua3 +z(^$o6Cv1YrT-&=0^ +zW3cvn?YUd|M~|*vPa%+zJ#5V-Ha9=4C?R&}888w;XAn`<2wP^1p5VrDln9)f +zI>)FXkUwA#p~^lXuA?i6!687B0Qa_fy{&yQA0=NY_Fuhvi%e4G+UpVjh=gmLo|Go6uU;Sj;x4+?>i=KbN8+dP!Yz>rZVH4qm-#ZmarL!0!Ck9g_~T~x;4hfdOe!eU`8 +zGKzNq8}&{%|y+p){CkONdLKSdg+nJO#9Gzuf6fcE6Z;`?ezaX`|K~5 +zy0CcT!7;w&ULRO7IN-^3(mSEO=KVmVTNI!re77wUugW>JmMpoL5nyCQLk$nB0gah= +zG|<=L+4tOMZont}@Y_Gzex_yBs17+u +z4G-(G&+=?!oFlN?KpoK3K~n^!U`8PflE@Dj$q=fhLi&JCpcdC5G(tbHe_IFWfMy-2 +z*WeS*zVKsxgM-gVKL9##NoQwQiOSW9AMmJ5xLiX+TYq}hx8C{gmmGUs^#dP#=@nOe +z=HZ9Y$scvhtKRvZtLtq&67cvv8cG$s4`n{kj8#I%6MA~8v4}{tx1Ot7){3>P7}Lde +z86J(71i%(ug1{Mp4e3-ha)-Q|dmc1**ZD1M<5zwEm;BkQR;+#TDJOJwcW#e!`t`4W +z|K?jHv+U~XIRC?MF8}nK-}(9Sm7C(EX5uQ|qpFT8DyrxxQBeZnzl!3GqfviqcAF%W +z5u7YISz4&cGhpQC=#)ElA(25kc?h4#r&uyd4!s3F6I>==Ami*Lr8Zle=9vcTl%`wz +z`)bw7QH%C_2I|11Ns|vdhu{9G?Qu5y`v<@F^~*y?X;})m;|l>Ji($m#6oT21e7}e;;%tIpq`PpdGq%C;^)W@guz+7 +zJkzRGiQtVN0}u&AzYD>})(7sp;ff!f_tPuR3s4)a3%D{@DtRet;1VrHVRYO!VOk{; +zg>kKEuhWlFRCl_y5ac7D!dHYQKvOlYx#GGpG2e?{bwc>KtABd^_Q(X@`nHdO4umiI +zn$urW{^@-WJTf@c1nD<)mjOsDh8n2~Q1Z@S{@xAh=MOpBGM_Vfs0wQDSP>{N5(nXQ +zPy^Bg3X0&D#F_@pxJDG!PzU&4tJN0NJ0LgKwW_XG-~-RT@FP!y$o}>_Z~OAszx3C> +zYmfPRU-_dO=Fi*9_i^#^MP_QfO+XEJkEpt03M6KzR|dxOF=hC$9W20sV&i*Q*z$?% +zlV*?IuJ+^#SEMIy5AOBqbQ{hwd`i=v@;@WK0zNdSKIlj~9Rqu6J_k>b-y$t~ZV2sgII@7`#x54|Rm;~h8r@%Ddq +zbG~@L0|p2CUwQgVZ@c3Uf7Kho16=flOXtnot62KzToO%fYcB-Ln3gJ}DXp<^L?WK3$CJAnV^#`<1*w`1wYaAs8o_9zEf*_8VM;ar~KKbaP +z3)s^Mao#OA-p;=Yj<37+mXrVW+0|P0|9;+YzWI*VzV=<-3*zm&mwp;@fFe2?7<%{n +zzmz%1P-{_AHA&sXAesr}vMR2CTR@Nk1VRz6B*$(q21R*O79;&C$*EmKCsNq6r0@@9tg^683oYfd@-gnxD&Sg`k^ +z%f5HXcfNPY;LyOrz4xhBp6vAni}0K!Cq1%!+4AKN@-uKXs!3O^Hi*OTm;>PDO7KEa +zr6od(&e2iCGD;zh37~%(2a5wM1mpmC$0`V%mRz9oN +ztz(lu5MpC!xC#V+)sMgRzpIw7E`P&w-*x6*QV+$q-h0>5mp%XW|93y|i(lL*((e%= +zZ+g?|GiOd~Nq;Z?>A-N40`w5~!-+(1z+*AKJPLn4W>C&kV*hco{^4@*3Ea2g$^wN& +zwv6rw&~Y|R6g7I{U7WW}Xy^drB6I~*Fa`erx81AlH3)dM1`lxKKfe>`?C8AUqn`p9 +z`Oak*pY)<7-}&yh{whCk;RP3+bmB|UyUGR8aWtc|i{nkP?#%m1QD?C((v>(5i$zJA +zw+(~_uw!6z&QU99$VsQap!3e^MzvLyNaM=jHdO>v%CFEfC7yIuN-)9#CFC7JqQ$=c +zB`-L-9PRCQ(1I&3zoyX;8khC!HvZ%XzubG#yq#xF|J#Dj3oiKjTi$X(o~NPt_MGP& +z`H}PAT7J#I;P6}C{@L7tM+sN1`dUV)r +zO7$Myv|vUnUfsY&AvXDVPT<94=Hc8}dI6t27n~Bphn&kZ@&Gw)rNPy#me`&;ay3Z% +zx>v4S^Qz~b_|KjR^iG<*(@xWWeZ#Ms&BjeP|MtqC{TL*Bk9m7O$+sVS%yT+Ax^DUX +z^^ilw2@YvjD&4huKllMQ`E33p;!KCLi#|bnIKBt@@aV81)KH|E%$aLNQEt%#INW+? +zqT>&Lc75+o(t*t-n1e1=ew1q2x)*{j7JXelaK*4CipYI`eBi*N_nkRAFpa9oQzspL +z{GnHV|C&+I0n#||0N?x0&mei-|G))*RXFt9-`sxctKRXWA6*L{Li`z6gxqVdxnKVB +zN2}FJ`IQ%b>f5*7xh#U37#)TLrf~>uR;TR_o7F6nzx;SV$sbBN9(_J*k04UICab)X4Uv$k~Y1z*?}- +z5yIe?9C)0Ib$tQoKz*ayqze6M;fm8O +z{mJ*eA0Qif+aK<^_^UtKuzu6-^JaJdr53@@uDanr|MP;6|JPU7Z`d6ELePPI_L=*= +z?|rr$`eXC!_xF78Bi|s=ui+g#05y|T(E~t23<*F?aX+X5nwJPyi*qy|Y1{y-9g4Dc +zt47_XOz+uAzSCgxW4R=1w9f=YF}QimiGdWC9e#|%**=Ft56&VZS3t)uOHmopw3gZt +zo54$$9C+x{puTz7AxErPyZV8p_wzqjuX*$r*Zl0tt9}SE()@XQK8f<^-bWtsoa=A+ +zX`VO1#>bILl8N>D)@Bnqg19qaybc(TwPjz+X+U5);l#k&DCht^f%$;`uh*T&uER9U +zmanhBS1m1V*5H_my^7}D@qFy}?M3?z#xzTy?n +zKmYu5ySqDDI|D<{dhQ#BM{Qhbi;}je(gx{oRH>_^O@kju>JEY*2!WEsMO9mgtu}ca +z;XQ%_(=QGfd|JD?llTI@L!Zu)&eN +zw3#CjMPpnqg*-)MjTXkUMGc(}Gx?_J;i@zbWvf98Lj +zcI)l8lxPYtT$ny>`pGB0=#?)&4ML+Qe*3z0tIq%E>sGG353;0cB|@?R_wYbJLi|B$ +zQ7a4*q8MHXU{M(oI$#+$IXMRsP;C_Y{<`zAxXL}u5#9HVjek-P +z_)tfC1>k%mwxv0GKa_)y8CiX1EKNxbQreuCBDX0Ld%gX_|2X}emyPXP^$mRTBVYOQ +z=PqR-mZ-XrX(eO!!P}Jho?QuV*VWSjqW_9loUlz_Z0OY2y#LS3)=}64canZc1CpAq +z)OB3Nq4lWZ64U{Unh-<8&!V445sE%M#z?~ik4^2;*fe6j{{;1l=_KxK<{?s|V~6n) +zUfzszFVF)_ap#>F4nZV= +zY`FQu0|O}WmAD9g@J{fam~A$V3K-Iahz=AefJ-br!fUfUMh$xQfyYU{3n_O3u~0|H +zooyR17E-E}{>>?Gr;8-plrjW~muxAE2&0KNTz$***;Du4cV0Qysnx0w3mtaU;*~4b +ztYnC&9>YTIW3f>CE#K&$uXyDNmtX#=0}os5d&y4?BX&$wou1 +zy(ZJ{J>F`&|9@yeeROy +z-*oeDHf`FVia8~jEqq|X1>!V5^*^))}aar&&Od+j@SjDGJtYx+x1Iq}dV +z7sIRnbobIi?^LOTQf^ex^SkV_)7k&=vd@0*y`TWKT4l^ +zH*DD8EA*~xNL#8uW!6p +z-Ct&T2+4q7tfWKTljw;w;o+F3h1aJ#+8m6dn@sTwk1u@nk_*22uEz!Q^bP#>#@l}P +zn>+5ld+AL#-WC*qb!_KZJMFy7PKO_{_<1KBwQ%9%MhN%Zv+Rv;`pkXzubnWlR;`ik +zNAz2b;~x#m5JAviLkwJ;2)_f%`iU$1O0D$>+5g5?dBFb{ZKgc))fMgN<~kY&~xAc +zhwi`M!TaoU$edmGETMhx`^r~d-`~F>i7OGf?)>(xTgm+U;t!i-UIEVshVC(Lx5gYm +zV-ys_U8y*S>kSIvC&jUL#8^&5b&cvxU*CMcx#s +zg$6d`Rq_tEYR}(i*Dw9x{F$?NdNOCNuWtaNqXi3}Y(RYJWmmuN{a^1NglrZ?zqhwu +zt=HK6W7#LEYRCbi3dH(Y0FB{*%s+@ed4LS0IR*uYGVSs>Zem#PQn-TxP!imT4Jkmb +zR1?1CF4HHTF^P5t##*uh^b%SW0Fz)kIS}pSRQ^vJc@yv1$VfUeoDK~_)|-Od5A-(& +z1|bK4Y`8f*0uJNiPkrv-efR%|mF90>@y%Uk%s%pfqyO4BzVCx?zv9Xtl;AaPOa(Dc +z431J);L$*i2FGx)XyHK%7aTNY%1m$qGiUDcg)f}3Zp}k64(U}*{<}?^$gnddn^lzC +zq9C%oq7GOxS$SeiV)K~N089Wt4WefqaI9*fK*UFb8Lz4@fLN%LVxh2PyX77#p{fL+ +z2vyhMH;UIF7GJMlx8B*eg6)V=B`sxpS`71wfg58d4 +z#?(wyA8pp!+G|K{f^9DhevE`Y{Ae`QlQ|l6gki@17owIUtBHz6asb0co*d`Ia>d0S +z?fM1=?vL9Rw@L19rAlQ^U3~hEyE$qEPZCV1${_Un`RkkMFUb~42M92 +zmK<^PoLy%9!z#d{J@)8@fBMyJxBd9KUtcslxHXOwno3IIWOiF+1>^%9T!ndDQ`&{0 +z1s9DiFxr|Fk$gfdq%jAeu*dmMGmbn_(FZ=<)E3n0ceZa*8+}n#l{NrqUBp5z#7IFa +z{6BR$H=y5uaoX>$zvGJUUDMgqw#)44wR-jcl4h-3x%NHp`SdyGd}7t3eIWW#)P~Y; +zY8vnL;YQNlUaM5F=Ox`=NqK1i0FoiiI{`p^jbyaMxJ{ibh0S29Aage$H&ozJRQ{#X +z+TdXS-ATuRb;S)})&XDaK)kdqrt~;5W;IB`CxEO|?%T{7>>2m~+atTrntkwoi~o_c +z+anJ=`tz53`jcPzc(d79wCBFHYW+#R@wj7_OrJjE*VkQLl(;?ojj*#3foL_-l0mE* +zlP17FE1D*cs0WPX#xV_TCq~1Co!eenH9Ty&-XD2dhtLP$tQ6soAoSMwUKr=W6t1w) +zbHavgOU&8OYU#S_J$>RHYOm6GfGh7_72Jd5yUxQxxl0}UVTL5af>kBLdo|MZs49;> +zvhmHY`N#pgpY-1U{O^12df;!cLswmO{VD(Uwte^c*UK*b6$yRS7`O}-l>Vp+nUdBJ +z_EpzyN>XxvaMnCIV?@wptfKiXgQd)yGFeZ&Wc?0KPs+-LE^ZjoGn-c}|DQf503pb9 +zv~Ls|9frP98S=2<&3T*WtSm7g-|NQCVgDoF!0`XYKC8F4U2DJIoo=}; +zfc{J%7l8YL`BQ)7wI9?vL@7KKuGlBg?ohPuQ8V87)xP`GpSTGC^6iR_n-1c@7narq +zQwfF8)Hywq`MqYTN^@C&2?tF`407GbR0EWA)^5`eJMw@-k6gT9(YytV=09Fa0QvFV +zcP+i?x3`1zJ05KWp@)b+!bgq4PaPidZmJ6IQN>Z@Gjm3zS_A8maM{NqrUW}*kPkrC +zO9v)1m;>bzXTuQp!=r=5AdMBb!y0(Tn|K1S7Gd#=8v0ts)@ILsV;2gt6i*?6Hja?f +z8cUy`9BIQ+(-)Fp2LaFMXgWO97#z%o1{;tBLnhFV9Wh7-;B=mI`kCjP{_p?zscqlD +z))P*9*4_8r2@(Lx@VWE9cEmwXHZi#WfqTz=^O>txuVSbr$aED!g9!eqR`4-N@JUJo +zRHfo7h>37X39|Qbz<857w)kyreUidIqB8MoqXzXzy1C7Pv*UQ%-`$#m;D?bx!6bSGcuaNhRq0b +zHxs(bhD91cV#_Bk+feBl4=YDZoHUi$JmW}qVH8ax&zQn25;=7w3(A4KmV7LUqYOeG*Ze{NV+l%PNy+Qx@M>uj0V+y +z0T!MxIF~vk)78VeC+#9OstoQgF+w|`%f(AeT`DS4(9ni0W&^a3h#mU`$OrVKGdlNB +z3&IZ85^KqfMS(*WMgkpUIbYC6mNEn=zElG1+8biBQGK@no%@nexG< +z|1;E7Y*VZaLj)>}T-(6ZVa3>6pInJD;8ogd?mrV00(9WppZVb{U-;@!*$3%=!70Zb +z^Mb{f{qQg62Iqb7!Vi7m!k+G)hzR%$tuCRtQr>4s!8sZ+#SS4v@E8P9yPd9slapOP +zxO37xZHm>|su=GsGFM%$8j)LZEX4dVITByWZ*tx`x|*GMM*Do96U&f6v2rGqO9djq +z9)J}f;5ED-ND#GwxqK3yA=9Wp>fB>(5uhl=j~nP1)duofbOMBHFcmsU6*T|!3{viq +z?Z@;V`~c1EfDSygS~XH?`q8K1M0~*l<4ba`gzV<$SkS|M5TP#r~l*}RfAMj6ydicUezyA4;eyy~XPTh0goo{^m +zYZf27+eP2_pZ45wwceDoB+5oxXq7eSHYA2o1Hc#!XWCl`u +z@)cKt43!(*D$J}I85WC6`9Q+vpA-OPnpM{3kHhXSzb7IaFLy(CI>1qPR5pWsKyUsl +zO7q4X6LjFgN7YEfs)9P#lk{-}&tXpxPc8xJ7Oc0N#WH!2EA2{N_UF$H468sS0eLom +zEIDS!!9L=IyoM+hASQ58jz8*X_0M^G<%>?c;m5akclDIh#1$(adCz%o-hID`=e+GT +z_uTuqbf|N8-}9?qyyD2iml)buOB@hf6hc>kwHJ<#3^V#M|1%CUaS_il?1aEqc&*y^ +zt4&yFJ$JM!CbuL7%V^;M17BRoFr2R;SrP)f&8AU&Va-i^O>MqfsJE3)p{0-nfI}ct +zl70+$R7Gn8QX%B+YL6}t?_ig2nP +zT&+f$j8l@>#tDo=QUX6cS6a4Lb_=>>^-BRxku*QF?2DuW=sdEVTu9D2m5kVjB7^5% +z5=4qIr@izQ|Gbcgg?sM%$6q~k#6ic5T|K1Kr9b$_aVPG7z)^E9`r4;fu6ktK_jYu2 +zec(NxIqQsfzyVeLHLYz>S{HR{j==&reTLjq@|C> +zjBR%QoruyZiyB{_;xqjXuYO%kJfkv~>Ovm0={$F|RmEr}hgI5Rii{uWj68-f65Ed= +z8&kZLs20AuG4k&ysYP+8@=ip)F~W!lLLd@x`X>ui%-C3wekZIkT8hNx&uiT9DBJrm +z*Gc+7=Rt>6gCV{TYEbs0WqmEeA@&0gez|WzIshE>6O$#8t>n&+rTR2Y;>Sbw-~W*P +z7XMSje!v6##{har!)&!LQ0}kQ6AAa)zN6vZiE06oiH$Js`&5AK^Kl#K{KlHw@ +z@4D-rMifAM+9@4kdgX^yxXi{>9kl5jWg^R^sN>r9jwc)tQY{wC95)R3EP}#)(HWWR +z^Ou(Sa75_o7Z&*(T)euQa7N^Hz_kt#b7D{?OpgM`5&bjfq7Y$IwemGn-$6?rZ^Z_M +z{+QhwIgl!+M(k6>Kc&QmC>|6|z7x%JKz3^>bi$bfyKI-PcEb&+_DEV(*mc%uMltv_ +zfNMcz4^^&~Do;S8{e^mH+1L8}tT*=3VU(I%AV+r0sD;XD^t)bv?$ZPP_Vzcv|GF!0 +zpEYxK8Q~tz9Eid#w_W$)kG=WG<7c1xy2HQq?ax2-@crSvvuEw`(GP#`xyPSsr29*z +zE@DW4 +zszg)GOlV7Tr8f<$uDYYuEq<~QF>Q`oT8^PX*3ccEVJL*o#n(Z|Bty|wbVl3O(P*o- +zZ24oYx=$Q&DGA4daTGYCsYuJikf@9Jn4R_Fmp$*uW1cn$(5aKBz5GS5ZZ;dY-g&e3 +zLnOjqLSv1F?rYYpTDJ1~Ykzs|RloSovWM>J>))8=&B?vf7w&!d{CNj1d-%3Sqn`q3 +zR09%4A|Nv|2Zmv@!$iSZ%4sdOXmRYFrc_ZWl3o|JtKro`jpzujh8&4Tzwh*Skx4Wx +z--herY$_ebqde5Y8sa1%#xH>yLamB?#BKVDS*q_=GJS@Bmh;n?BoUDl^o+5BBV*vS +zCA@Sq)y-Uw9(eS;@BZ>bPx8#(^xJ!0^5TygQ#Xbn4-pzs +z!wIgyg*CaeSn?)j)+$0K92!29{yZWmLrj9MZ5BXi2GwBjVY~iz?PBMlpx6oay-*+O +zmVjI;#PX$t&GQ1fu<8h8Z{ok(-Sxt9q^=4z(qSgS6g%Yu_`>rDX#%nS6*q!IVZVfH +zK{O3V&0Q(NIw3Kl;tKI58K#1hTAFh{uu<3yynme;&UE03bX;KbbU^-86iA-Jz?V7d +z`R%z6lgdqvHx#I@dvr99??oOx0))bS&AO$x-gf2H*L-pHnx%+qNT^K1v8p5UY`CAJD5VlM +z8vdzkT^E2Cq-~CxbRbg$rSy7?5Tv;23h+a@-a^s8pI@+6m0Y{_FM#CP)LicwZjRY| +z%o;r39@ecpV}#_CfD#Pe=4>^7@)m_0l2nZ(^w%^JcaVy +z%bQErq(iCazp`0L(5-A^(|Vh5-}x?>DuE`#W)js>Bzc0)J9FpH +zocq?!wl?+jy+LOD;dg)XN8kSSq6PbM^AoRqV@LhzEdAkj=z+)l{PH{A|MpK#m@t7|fk!yYMDNOnvMl~X +z95G*Cafj52B%JC(WcwLDt94Nq0#ykxHtTJa_Anq)3KezD*1h{WzhhXx_q2DC1w>as +z+pzoqB>x7P%at~qRGyUVlyISo%>RWan`Y(L-16+tB?nIrS +zn~(Ixz2d?w?q|wSqr!SkjW^<`Ii2H^#1$SDZ>9a!~<3wroWI6BvccI +zM~sLphW?ED#KA=ZX+k<1(YO{4xkJ>GL7HnE5&VxT)li9>F?}NC1Nfs1r^DdDHgQN& +zHxn?}@TZMp+;4ILgklard9WeEd1SIw=tCUM0kii&^+;*QXH(7G>BUinMuF38bYyb9 +z-rLrZ^JFj%2R9)h&QqEhNV6PU$T<&`64H&f);_X!-6OsxL(^NH+XwQ2 +zxqGO3bWjor;YJi8W|zu^m{w_olT|3qt&lKQZBC@0kO@HOpW_fWrmWcJGGv;#Qzo1y +z@NM$Gm1fiZI2iEWSHBZ8UCS~p{TP{j@dV&1tVb~>U>5`Lr2r*pK`?TTj=B}!bgP;V +zIjQ#GH_Am8SQ88>fa11Orqf(ypa3~Sqj7E+{yf?KjZItrgCi%&H{`Xr!@XWd2oM}c +zQPp8pw4$&a6mjB<@J}oRX-o4iH0`eOw16%}s0lgh18%j*Fb~$G6(Gb-r5g$kVm)={ +zlv-7%I2dU%0!26Bm62-ViOn$sR`dutZp;|)TyVEC6hz|A1tOGwPK8sMD@dDaTJMW0 +z?UsgMa6+=tu=MDU(=2UpT?mwf7!(UNa31*5(wPo;7e8*hS@mZsZymi2;Kgm;Rj3D> +zRafdxD4}lhN&?4CH|j=;$-sg}lhZp>>i+oM(Nv+A+*g<7-iHC2@dEUjm5Q3bmuia+ +zMAiY9M==O;j$;5=#enmWM5c;jZ7Y;bRr8Ewo!dS%@J@ +zxIZQs9JQ-#5t^_QiNJ7r??Mo3OLJwy1l&b!_=FN4hR!-h|=cK9#oo8qfhG&1VIUVMHCdOBE1GLJLCbTpP +z_nQC2ydeZt2$gyroRe!I53iqizucENp;JVMAtzs0ck@GL-d +zj+^F@i}mW!S)R;r@fiowJ=LmZchkVp&SgG>{)l}D#^K{n{Pdxd`kt3eW1 +z<9Zu*!4v_W5&A}mK_3F)i;AXoQk)d0d +zI_Y2H4hv2oYdQ>jz}RCHgdtFtVy_@Y(MRxfnh~`MtAW)azxFwXC)eZJ7gwv%wyjnh +zn>4?#MdCvNgG+g;un4voLMSN6r0Nw|fY}wW(79$d;s(73AUh$0u->kRgW|4=$HFDv{A*UKp!+^Hn|BA7c9?ruq-nsFkZImtY+p%q@6woO8#jptThCSmW#cXcH~< +zeb_AIL{rZ;m2G=WsLzN2a|}gsWJs~LBUvfiPEL81?*2gJlZM<>CgrxC39+%7K +zuto9}JL*z8?<|c^j_(lR+B7=jak1Rq3NU&c9Z;Y8oi0BwCDS(V^ +zkO34ENGhTW&>r4ryBVw0x`rOr&P#j%_F<{KoF4dqN(YQa5c=XXbqJ!gO37`WrFNTk0mNOmLXgho3gi;7HKAMSUxckc& +z-1$)3lwt`LCW);tiP~VH3x?H!f&1H|J>$C6Ydq#zn>xs$E0TsI6M;6IN(sh(IJbBTWtTs1iWsge$M|3+OoJ +zm(ep7eis%R{DG>}BVEN@Ln@mz{)e0!27A47+)A2jZP58mTtU^oGd`G~BkpD{^R*!>1jw`=N-% +zr0_~+Ts%;YF>}`1Pzx>a$RSat7YS9e^1xF1KmG-Yp0KwbeV}u&IiMs8g1;{Ee7zA{ +z8^RrwSMNzIOiq;q8nXiGRb#}@m3|I;VkEk75nN_^E4R9gPaf!xB++NkzoQi*Y%s~U +z1aIXsSaiguyE^JQIbt5WEra0Zx@A +zHXAs3t)MLoehA_3hh8Xp!M7bY=Ma>U#I!5|^R-hC9`mIkjs$fPetNDH8Ok&?q7y1b +z;GiHfpRlJIUD`R^94-i2D5POBQwqFD(7m-r$ySlK<&iA&qNR?CE{mhKv7$~eO?4tB +zfe_>oue`R}XJy8lf9VRikW}zA0GWUG0J#7ew5R=H^ad%0>tC03^n$?UTHd6%z`}qJ +zCIDb>kY~j%*`l_{kGYt*FghdYsRbRl4|E`|6LQbUbRepMB8f+7j!=>fZI?k>5YmB& +zT>;wu3jH)D4WYM?KJYPejr1lx1MzSk=Y*D`iZSL*yfu>n=89qF;aH?RrdNvhrLJvE +zqR(kpWTQkUh{m$6NvQX@Ksp$P{b*V37=DpAY}JZMZq=NhOTu7cw55W~6n7=pD`T%KpxB +zAMpW4M_NKA-tHLX7B#+7DSe14ih0h+$RnK@%bH22h}f?*1gSo$N9W(50_=$x`dJUmZ@S>p(;LGp;3|9g{9Oyv9*L;j`_CgMkMay*=1(aSCFJh>}M%86>`DG^z5OAmeofaO(EsNN8)ef +zpxm&|QMW^x5CX9RkUo(^RooCLYemfU&D*bVPKX+AYqkbCKdmTFD7%=qG^9tT+tKftAU5AjnUML +z3AzF?|Ga@$QxF|;0DFdaN$pa4x|z?0a{+aV$p;-+r@AKK6?UHbNcqkeSAmQwEWOQ(a)$H4Qc;oi)tEAu +zF>UnIyyrU-hagUaHAD_5RARruG*b8plcPy}r~@h6 +zemuK0f5^U;rYZzpD8wx}{6Nx}klE +zvFN6$;*pD?P8F+P7=Qw?(3IZwI+{T?hb$>600|&Z{230@rRkeH!8d3bNiqel0Yad8 +zhlbX!BMtnrD}G~2G-+$p +z-!!SAPAs!$D2jGyni@^J;pwADM42B|#2eMH&(4lkJOCoi6@krFTo)Y(tpNUtMvuh< +z%a;x%QBw?*m{L7bml+($gKmU;VB%_HW>ON2%^ehd8Ut{}q?e=taH?{Qmbm0gL7~j!|xw36+LOL>swwK9m#p} +zD@VsAoT1##(K3XkHM}0!LkvbBqo+Jj3JApvNA>Y_C;A5chvM=3$Xp(P<+D!6&V9)&7{3bKc%LIV6r#N?`T-{>hL8X-ppauN?+s*f-bq8ZXa(@ROKBOJ +z@y0$U9q3{|5L|>W3MpIIcvT{g@SXA&5RUfxP%aR`%lZcH?n)P#9uD6*1Y$;0l6b}b +z0hNQJNpb?juTPhOU#5B6t|S8#DvCb=PtdC;_36IUG}w9=ImZ<9V1TJ5JBx`sxLlXk +zG-JoDw1^ZyUTH&l2g&Cnl@ApSU==o2s20?NE^&)V!OXXZ1!!Di^(lr`E#?Eg6ILp< +z3tnYwkRd`U;3m(|)LVLnMkV<#B+NlL{t69}Iw_33fcd_>NQDfNI&x#r_aJGOM855+{eD(r?UbMsMupm)LwWo9$owP5?ar6#?E3-t9o9VhZdN5)N^WSJ5FGF0rRzX~nPq5|n^39*SLj8B>~G +z(Y7>diBs{3nLO8RS)rQ4Y*LKxv+JN~Ufg}J-%}%LU)7P+MYnLa`(O!|RDupvDm0cL +zhF@YKT5Tk2OwoFyh_JCwi#~uZPyIUYB5cvg0*~9bQFMT>kIhS~5u8%C)Y&hSD>_wx +z>&jbFd@~_z_v|13V|Qb}Xp-L$Xn8iDm-%RNs?;^}q}Q6=q4qjXFDp)-ZaI+@|4-JF +zwt^psm|)+RqZ!yGTaTs6K>ZabpkYf@AaaS)YoYIJ{OlilHQYj&sBEZ&8!dqb`3yz6 +zr7X$h&`sy +z;XsT#7D>#S% +z*z<$UGRUAy4P8QQ_is{N-F_)^NQG4ygXvvIsUcuW9E<^#6fSS@A=rNyzO$#XubyCx +z3c-)~IS)kPK}(;TaSo;fTA${lY_ZtTC{=nJ`T^Aou~1VrLRkh+j|r~BqYHdxCiqm6 +zW6RMiZ&r}Nh9U11^Pmo}A82LB(WQ!Kuoc>sroF6(4VN(8Qco_8Ie^XCvNfMFag&O6 +z7S>mCMZ|!{16gvaSi-Cydz2*j(A^JWaV#w=b%8X3%%66V#4pzKrwQQ4qY8x<#ZS!# +zUtv5-)aR>4`A!>+V#2A>Q|777D@h0FWDDrc1Ftv*b43QCeJRs~`3o0n2dc!mA<>S- +zMXio%qs0zZ5i!PsNeEO(yvO>hfLIOsP=dY{eJ=0=n^jjAwRuWL%#||%-xcPoXS{F+ +zGdNi8+jrLe-6&f)MyX*ac|?}xj46FfKBunIqQw&-)Y +z!T^uW2SUlfg*l$qL59e1cB?jTZcOgpqOdlKDwYfC+;D87r0#*46663nEC@ga*zF+e +z+oyC+S%DcLP2WDJs#Ky{HW_Gv&w5<8R$*#BWPBx>9OqmBSy&fP=Th>SI#+F4=^!5n +zxha+6xPW7WlL-~40!70W9;qZ6Uo2o3o(uRLX_6=(sL-|2E@0#Q5=d5zyaWXDK({bZ +z;%sp&7tIzyJp6R)Ce#70jh6eqCKNTi1>>FozpL={xlb*;*LSUrWYmGdeci+&2qdyC +zOT5zp1|sVwYGB%9MP2!Mk#nVrBLfSS +z^q&Gn0C8owA`{>OLC^t-^1>1qRqCOa(%d4)bY-s5QdhlP9io20rp+T0ItHztstse{ +zs1c?F3oSE{ApI^ZBEe~a=%C#eGefABq)C@1A&n3~;2+I8P_Ta%g%|G`gum7o{)q3% +z_#T4}LhsoS7 +zEy$`oUHBr2&@ux2C%Qa@r$ZBf2WX0>vCobf8R7p}M<@*vP7{XZ*>gjV1v;>Cr5YU( +zzRpmmr+;#CX`E^)3P^maB_k@DO2k#dtxG4Ha$Ji20h?5W*vofH>bw72}l7kE+0vTZZoF>f2XM +zR)Xb{FM(rXp43{*HvWORCkR0f8RCSDYW%hRdf;oJ2FX%vOQcv(zT!b)N9&)I_ +z5-G>Z7D)HdNYs+=1V50Dcw-WTJC_QnEARGFeyLHJ+`M%$qbex_>p)-Mz@)BB#Z&wY +zkHCRY^j#Pp(BXSW2k&-(Dt0*v1VZ^ONnuSdp0Au@zKRZQC+CTFwbbJUbjc(2f%;p^ +zH?GSNbR({-muCwMto0zA{MECh{N$dQ#+sD6pV*HC2*k_YGtC5TM9O_ +zmi&N|Ylu4`LmxmEKN9IxKml1{uVWiu;Im2*ktz?{u^;HbS*8LAZA*D@=|Dy+Np)?j +zV+m|?))u(|@8H`CIq_D|0kY_R>Ou3kSnfx|bQs^^fk|U@*wN0zg8uC~463q3L?(h* +zsLyOoRnz$fruGWJMIi}PX*EvE&>lg+B#LB{qKeJwjF$xm3Fjso@vXvg*{oE|Q)O2W +zMrp^=Fpq7MiKpDMwWl3I-pLY9`o&+uWkqqm%ooA;J!sBi-_rGMByCDbHmkoYN{sM{ +zu`8&AWMW`KgArqDhrp>V%AJroxPI>l1r#-8S4kN-YAf!rj +zm{L6~jlyW(^YY=7Mn3@OoO)!^8ncR*1zO>)lWu^QcwKJsQdP7_f>mp@<6B^TTUBS5 +zihNzDB?)#S>t#U?9Wgh?E%?B?%)SWLy>Ilcp1ytD6wMVxYjx{i!ZVXh_u7<Ae*l +z3UWSymNgUXYAmQ1#6nw|c{5ZZwD=a^TespF{Lr3bf-nhzRFS}&QZmnq5y#>OTsa>o +z)xdPgS%yBbv*j865(hvin0c*$f=k4A*)6cnLQ!Ym(j2`z+Pj{a_=d^B2 +zWe&Ac3uNs96bNGPR*~G_)&!8^k^{|M1cabz-GXTCO&LQrs!42W5mTDKqHRhsGcKu) +z+HWx|@WCJ9)pNr}5jrRxd}!r^Rps6Jl)$({sMoyq5`{g4X}#seRFcXnUzrI6+M`qm +z!+e|*s%Zg|3ceqWdC1plbgG38Yd`~qIxN3uNPA^G42Gl{(_lzgllRA^;zIv<`1+gi +z6U8}4=e#P!)A)Y!;OD;9qA4*f5Zn=&Ij*Vc``pKS=lEs=>!Q&|rUv(|HtJau6>Ggr +ztoj$er=6LC@q&u)>(OU!4DX_wX8(ySh4~3~AH` +zYWF<#JyQnYr2i5Rlyr|5ujzvjI=0GX0mei?OXMTPs;PZ4+G0tATc&p#+S}U$p9bg=4-|+)72s2_ +z;5$Iq0mmf`p*%i6ueH$LBBD26ZjN}Xt(k?ES6OoIhyoo7a#6cyE|&jw`}McDjtS!cUP2{tTBa_i7&aeao9vm3eikO>=6+c#%-Ze54P-3rE#xuePI +z0KqY*ALBos{^-J$G<()F%N-F3y&~i0%~7s32#8v1Yd&2 +zTp(uKu;*+ac7VgcO+WqUDDEwP*`B^8#ev(?)B;6 +zts7MC=xmA&VKTdv;criWQpR#s4YTzCLM$1Q$SX17RIS`rPVAXsddO(3vQKk=v1vft +z>V&9^Qk2$cU)++Mv!e~1ea*ZjGSc)63_|&aPEuyTehnejWQ(Sj8EYHIn_MS06c|` +z>&K%x1rZp(w$|yz=3hY3;35U(FN8y^yVN(!jz4u3_|Lva9tN0fHwwld$#WeH2)KN6 +za;v_AJ397gn7!EQwhZv(M?HIhoxz?#LTzDa+@n&2sBxlHssr050iOTuAkXQcBwLBz +zR@AXUu56o{RAD23Yq2N~p3vC~ST0Rn;G|A<3WCrJLFov!=!Rwj`?1he+xOd43m_?Y +z=%NajuicEx-Z?+6{nde2GQi3=@vMN&5S^eBZ{NbhtbI;qp#@GWXd3Qz11JF(3frc-Ga0tLf%V&$ +zhljVP7#QvJi@#pw;pC%Rw_w}IlEk(dkq)bts@5Vl%R`&T<2iIi#XWH-B+;0dHLqW&4W8o +zEts6D(@>x(0NT3XVi+a6Ka<_WsA3i)=a~V!IR)<8J-(Nh$g{1pgq()G+Tm=*Lw}hM)YP}DzHZRGJEayH +z-@(-CNggPP0+gxIc}5$kjvrY{6rglpsU(tXE#&h7qSV20!hE=!xD`i%Amtz1OsvLR +zAh_!8?eZUoufB!{$)&Uh@0AM?Gp_Yq;NU6zlJqKiju7%ge9SydsN8GRZoepfqOU(m1 +z4r4p|5RP%^^JYj%zzWhlC3k3AlC+Hbr#w(=p_1&edRhde6CocHbwoN$UUV56Y6aWw +zV)Z|VzkW>*d;(yZnlOB$kz=nRfxARWa%hk?nk^c)m0J3xT9?@Jz*GyZl!T|SoH_Ba +zlHp1M{tLtuF95oVRXNH@l^Tga4G4!lVWX>!ob1>W8kRAr4S47{9hpUe +zo^_mC3eEE8=rNqU;N{Aqro%%a^~CC!(lWHnl5LO!GOuV0j@$stec!j@y|50Sw0j;_+~-SU5L +zzWRzD2&m(m4I0DOD2jTmHftCZ*ECkDCz;DEdBIUXGww#6(hTJ;e{xY?*M5MFX)rp` +zR_6ff@#a-fDu=KqzlH#y-7QlLOwVSsP8SGt{GWnpp&@r$JTV!yv&#~~?$P>zH^1y3 +ze9Xg5`4xwsj-M$j%^eOyg=4x3cZ+OikpmS4TYM{Q#P*qmP93vxbnxdmKDIdkIfFX9 +zUKRHp(teG~7dkqg`hgk)_5()RbC|=*p3yi(TFkO>^$>Q(c^0;cpKq$Xb?paw*Ee*^ +zB1OjK6d3t5JFY+5t*yLKiGkA1cinO{(!X^blzssDrepeBK7z33Vf%jd&s%3-@fXhc +z*W7ES-{!gvoS{36)2|nnqKxbdq#Fgb&MQ9}Ke?dSJ6t1K2}HVn*$W=@0N}8g3HuA~ +zFe1IA+wT;$5CpuFdC|Z=q3yR5B-E(n^}Rl8v7EY{V&K+2T->aJm>(ZM6E>QZH*Bsc +zc|mkFzik8_>sLKdxO29aG)-=dQvGTDWB$?(UumLI$pOiT0B!Gvb~-?S)_0$cLf{jjA=5US04pef}Kj1hp4>0T>bN4ih&0r5R-@J>&bXD +zJ9SgZXg^2x##0+0OQJPtjH(BjI>w3%QOyJB-qdy4P67V7)v8Ut3PeJP>)+ym{KjZ` +zpvJ(uBR^w)y@@h}{irz91;$f|4kRh_wy&ocxX;6l;m6~@y5ccS0{xW7IuV%{5_t<+1#p!+?*Tl&Kb4t#av%JOj_# +zxWIY9~#YE?OVtmcYQ3vriFv8R@2 +zFvT;dGh=*a<2RCw2zGCNUL4#XethywCxT%LihAGcli*~S4d`V?`l+PaLCXp4Wg!n^ +zQq#v1_XRT~o>}Y>MUAv!JUKzvXw06wN?2thoG&Tr`+>uo%AL-0vCKG<&k%InA&-qL&h!&u +zfw8?@{_FbbpZTGi(+Fcr--5^k$Uy&5nGw@Vsn?lY_TqNdUQ?SWE9sa8{hVqczWob8rdeYe4go6IRdvGb`bIl&$dO3)T?_nSzpn!n~czl +z-3kYhWi~(T0Uti%vy-V7@`(;XR&5w{f`z_c+X-8mTEzTkmu~k|s5;_Vap^7WT~Dv* +zN-g9a9P*sZg*ev(cyStBiFa^t!+PR``a^#r;@hP~+(f~=;0(yJ?rDXol3xAm=E*y@XJPoM-9^LP!RD#as=BXUE?|^q}It +zgsHyL!&jo70mlMyV>~%&JuzCGDdR1=P7hS7FF{H;QWLoPr(1goUIIakx^~M71nuAGPF~zv(096? +zlFjZj>ow-9DOoL2-d@1%hK*t(d&UTif@RGK4M!M +zfu^Jxh7y$}<~pdM1r&^4HIKA}MkF*i(G~DV5d-AY3$4g@wnu8G{0QVsUo>!QjMG2U +z#n%~Gf%PU3@2lt`=PN%;KGQtLEjUUlr>jNjvj^WL11{hHrOp_tXNQ3E`>UD-?XPSC +zG>LX(4{SSJOT~rSBQJ{ih${<8Bosg5%G@d0Y%AVL>msPCocx{C8QIY>oV=8NAnZO& +z6T^8xW=jLAPjJlu>iQv&19O@HOh +z1ys`FVEbuYDw#45QI{N?NQY@=+)2tKjjUIzpZ8C`gd=SLl=n`~Nmsn0t=BDLb>aki +zrC&OuNEJ40T|{Zw{0`rLkH3$waht8(AaJt|OM95!8xwGkSvUcwBt<_ZmCVIO?FUK{KFRwL^-QNg +zpnSo1s|Io}(JhDMDF%MIaq=g4B;Y;iCM5`jN8S^wEXGD-hDZz3JPFNEn>~Ho1C~2H +z<$>R5>IcX+CXIIDNeR*=apNHM@Oknz<5Gdm2WlQz=XI|gYsi@;x!{3-?p2uy{kLcV +z@Q3ekSL&pDC=|1&z>s90Gr7)P5@<3{4@}bsWMKX%MysllefB>(^DoXZ$(VsBXyt!8iMI62IFXfUeZB3vFDt7`W!5 +z`;K@O&=6c9tjq|FaOE8uHu~lr+`3Wsd`3Y}ok5UK)+j-VoLr{;Gn{^Y)XK4SDva$yI%_j7YHFl +zbukJ^$V~i}W9nILx#nV_F~EGK+VPsPqzi{Sk221>dycX6@a*$%Su9_*YY0n-M1f{Q +zMY|L1tT?Csb27=Y0FuAnHrOm6qN?ud(A!k7>ZYV2Tg`zo1Ynm{hU*riI-IHcxG7or +z;X^(-oqA$#cGRuLWs@A4WEb15F-^e&!8VjmZQ*3)(Wc(V*REM9lGs71-nfE3B)3c8 +z55+(#<ECux*rE3UIL!wg4z+_BJDvu=0@cKQX5RH`$Y +z)v%_5wxMb8azI94X>G4ysooOI6arSM`bbU!&zRJ_Sd>Rc@bVN^D?9GRray=fu2{_n +zNP!?w>rbUca3_C3=s3^yh-|9hv|^+AdQQ}xYzpk2_T8q8D@wlHDl{Ls$OD)Nc5^zA +zU7-wJGXPf*B+n#`KD1sgpI<+H%8$IZ5fG^Eqqj)~Q#xFF+KDOFs)p2;6Hrt +zGk_}mC{{w4<1N|1%R!z-SJpdTDRHKI^m^Sjz7B&jfL=Py$eUf2%Kob>|5Pt0_gRto +z8c}#Nrv8At#5&PXB+%pT93Jg(6yain;L#1lTKaU7+U~CS)`7 +zoWnV?RlJL#^#fNx=G+RGI05s<%57IbN}%)}n&!Re26g9hveiIwBM1Z}4v}^TqthR3 +z*{t#Blmyx+CGE0Un6Fkm`cRzd0N)ZWTMkZhY0fhTugcnw#K%YY@=Wpoh)Jk0CXyzY +zlnWHV|JX?!^^?$%aJ<-@0-)AH`^mIY>ek*@nS1WBdoROG`Pa7-^0=oMxV0Y}bcs7I +zG$z=mGpkE{A?7*5l-yp0SF7cVng@JvYN&)=2jQz@jCPui&F`_tHl1Bi)gm=Hc#OA+|aR4*R#%7DxR}$>N-X+cU+$ +z*s#&O6&Mra4d}|%9?rs@*gGdP1wh*uoNA#d57d=>S2_*8VzujsE9WIjfib2(YA;~5 +zzMNv<2|bc3qLR4SsJMAzY5*u&8kY$`fmoY@(H=z0F`c~IQw+chrd|h=dL?IfVh;yk +znvP|GeDZ3jNx-=ha8;Me9Sk9P)axZk*!A$&&%cSI?`7<^b^TF(2N0RAFE@~j;c?S* +z4S=CHQqhc5kz%mLDy1Lxiju1^mh*9@AH^iN{Q`sh_oBNm=1*Vp9va(E)AGP6EZ3%* +zM>AbSD}gc{8d47cz2Lpu43KW_sTq(wkd3{g{KU?-&s84gJ^LZKE2r&AZOxw6LXf2N +zoOX)IvF>|iP9J#c$i73twXS*KbpQ16)DNI6&^2+enkKLxZg7Ckx@1l1#fI;hq0c@e +z#RLBIayY4sTjT7NBw`Gx*_jc^@5X6DQMF@7Eg#zc?agNHobD|F&K7W_CYX(?Pq{j8G162j`|t| +zF4UD1HA@~n$J6PNGj-^v*W&JHDGYv{4JT|YnnC5wM0+56#}pUBj!sv4 +zPetrl!co%J08q?bTtxB*+ZM0`coi;JyB%)q_hFbq(xB2&24uz*44DoxG|sV2+s91S<>*$p&H!11ufl;|ETE +z9y8U_q4fiMeGG82v;^t^P)wYNnbUE!tqBgSGqNSzyao#l`3v{Fqmt$WCCx}hImi73 +z&5LVc0*t)ePI=($F+Adqy%z(=@EuBOCU;>lV>#~u*hbAH9dm(lQ0^`9th-f`y3V!S +zTBc(!0>!i$V779t{abqC%{GQ#WhT_a;9+65o{>rLx1avS@l7ZCquGm9?-P_gT^&op +zota%2;8_A)j2qWIrt*fnx2@hNGuEUv6xKF0TdxkA3wvt42~-a-3U$#KN7K`J{19K9 +zamxcz$$9`#HwB9wFdQq7W+UMYce)o@%>$%)AlqBUfSe;Y19l}4;s@{|>`lQdF0_P$ +z=B0)S^5bg!~_^vg< +zQM7V^2(oObu9s+eAdjB)!PYjRP^U&nd?Cah_dqvi#kA6^d6ZT+IQ?J9FF_XD7ZF}| +zXpgJq(C(`_&ZV4OdO +zygJ9XN0N#2sth%jMW5f1z3nN8hAgN0-&&D?1o0$g_b#g43+YfO3fM5Pv +zY91&)3Eo;UxQogswqA2*$TMru=I|x9p4jpLV((duA6oO!`GzG<5$br0xoZ_`EwqAz +zJ=G5kVb)m>(dY*~ag%a?oK#{BDhDT+jvng3)v55?b*>^_k +zlSiWqD{rDLp(Sw;Vz@DUwC3LY%~uOaawt7=I$K-jA`9EQFvY;D +zy|W`eiuH#S+j{L9RyRvs9>Z4jQ{J;BGiLI}T2C ++ ++ Enable Artist Fanarts from HTBackdrops.com ++ Enable Artist Thumbs from allmusic.com ++ Enable Artist Thumbs from last.fm ++ Enable Artist Thumbs from HTBackdrops.com ++ Enable Artist Fanarts from fanart.tv ++ Enable Artist Thumbs from fanart.tv ++ Get Artist Biography from ++ Artwork ++ Get Artist Discography from ++ Get Artist Genres from ++ Get Artist Styles from ++ Get Artist Life-Span from ++ Get Artist Moods from ++ Get Artist Years Active from ++ Preferred Language ++ Fallback to Artist Biography from ++ Fallback to Artist Discography from ++ Fallback to Artist Genres from ++ Fallback to Artist Styles from ++ Fallback to Artist Life-Span from ++ Fallbacks ++ +diff --git a/addons/metadata.artists.universal/resources/settings.xml b/addons/metadata.artists.universal/resources/settings.xml +new file mode 100644 +index 0000000..c91d6c5 +--- /dev/null ++++ b/addons/metadata.artists.universal/resources/settings.xml +@@ -0,0 +1,37 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/addons/metadata.musicvideos.last.fm/addon.xml b/addons/metadata.musicvideos.last.fm/addon.xml +new file mode 100644 +index 0000000..b687aa9 +--- /dev/null ++++ b/addons/metadata.musicvideos.last.fm/addon.xml +@@ -0,0 +1,32 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„. за музикални клипове от Last.fm ++ Last.fm Music Video Scraper ++ Last.fm musiikkivideotietojen lataaja ++ Last.fm videóklip leolvasó ++ 야후! ë®¤ì§ ë¹„ë””ì˜¤ 스í¬ëž˜í¼ ++ Scraper teledysków Last.fm ++ Scraper de música Last.fm ++ Skrapa för Last.fm musik ++ Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° музикални клипове ++ Download Music Video information ++ Lataa musiikkivideoiden tiedot ++ Videóklip információk letöltése a Last.fm webhelyrÅ‘l ++ ë®¤ì§ ë¹„ë””ì˜¤ ì •ë³´ 다운로드 ++ Pobieraj informacje o teledyskach z last.fm ++ Descarregar informação de filmes de last.fm ++ Ladda ner musikvideoinformation frÃ¥n last.fm ++ ++ +diff --git a/addons/metadata.musicvideos.last.fm/icon.png b/addons/metadata.musicvideos.last.fm/icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b253ec589717cc93876db82f67ec84ffeaecc583 +GIT binary patch +literal 14392 +zcmd72RZv`Av@N`wMuQXF2^xYEAh^2+55XORyEpC-+$HcK!QI{6-JRg>cKiHKf7N}z +zbsoA_@7lKJ+G~z6ri3XeNTPlq`~Uy|s_a+^U$1Ulu@J6VWB-qDXlQh$OVfuK&O*l)6k +z5NtrmBU+>Y5Rw2vGE-<&fE-vrf5gae2T)=J^l5$fX8=g%L#ihT&`zMh0p-L3 +z^ZSavc|8gMIk7lUYp-A3#?i{h$2p_x(exOPI^f?w85-`q?M;-}2?4;Clh4!}19J@_ +zgclxS{gz9825YX1oa1~SVOotYR0rf7E^A!d{mk$@8$k>vwfS&k4?u<682%Ud-O&wpLik;DbR3rKSuJU0r~xfWad+^v|*Db +zJ@$?=mVLBXTI4lb{--dJxX*pm)9=RH8w}52fej9z(oz8A8OvCtV+6jFrNz*6>fF8u +zfU6eUu30)nFvL7yYr^&YT<}#ghZ=yGO2^p)fUX!7lj?Ad-~b{3h~@avR|*r|bm22} +z!V`DFt#%>5=yL{&Q1y0;V2FG$h7ddGe=hYGp$i_XB%#-5o)seb+No?F9B+rl)UDQt +z#&3uIWPq5}Mc3+w1S>p<_|br3ITU0Vu1OhI{#A{Tkm*oieQ1~(^t +z(xH}+Ka%s$!DNX!`f`kb=m1OSKYRrC-d`+C{XHU8-x!eMjYg_Im7|t1C_gJKgAcx*3vX%KK9}p +zvayC}N-h?M=Q|6ZXSQuOhwa~k(p0Isxbepznf452xm`MpKOKc{BQwM0^dsw`Zr$0-M?=&819n)LPb +zUO2JC9};B}X%dO(nN|N57Zk4-BdcAjji|=_)m8B>mr!F@+4+k!n^dA!oT+rILZo8$ +zm$xXS*sRD_Rq#I_t=BMktsc1^MbZD1bE@=qTKmb7jR<%?XW34OUY{2g=ERu7OuOu9Xt_xGry|7T0a%uN}_1O*Pu|rub_FV7d +z1zKnItu{eFxV7>%)qd#INR(xkQO~!OwG?6&HYvm_lw{4D^;BNg57qx|AgJ71gkLGI +zx32d#Ff+t6Yv?QQIg4+L_ipx%dgVtz4Ov1fA^Ab#<5=r}&7;nz +zra6HzvB`M)z;$Run5_Q@Q?dY4I#K`HVB4;Y)2+SEmdEsM +zW_nF}_i52e#Tnul>DNpUZ9xCl5d%-`D?RaKa;7}=$vMzrt~jaVs0k-a!#9H?Hezr*CE@P+sHefcqz<- +zI(F`V#=CEV3UU83VKML|3CV>jd`q|x#-K04jikQ%=t>>^!M&TL+w2qb6z5dvqUcY0 +zQiUridU=nylh{@ccd9=2e1^TIK-#~*TjfyY*3x;haMN7Kt=af_+E@ePVt?C<6jR8@ +z*P9)g?VGxcl$r!pzxCNfG%%AUA`Ds8{4RylV*F4qQt(gp2i*caLbaKRhH1xG*f4ie +zN!FLK)6tsYmET+$=h^S4Slw7#arODZvKoven)_{~mfY2R_UFn +z(_7CemYixNm;1EQc*tA%>2?kKch!Ncj*-;-uruP&VGC~7imZPXb&1!oco;Dm*j +zW3S*Pvq^>5^{w?WkGM+GSTWJZX7j4Sx;A?C(DI6Lf;}ul>PxVIiNtN?#dacf2;lXC=jL5U~?(50i +zigxS$tH4nEiW*2we$I5xDgMROu^dzbO1aJenp@}t6ylEog0ao^|Xvbg!z+O9op@B8j=H*nW{9B5z1 +zM_QI#Y0t`96DEyv%U#%b8ibeydJ(3icT0$&}8Ag<-U!SF@3*Z69)DXVtw?e?IMUU3Dcn&)Yy(-1Q>&rF%Djth!a1EPRe9h>w4V1*crU +z7_l?1K=mfMk<@p20Pvs&07w7;JibH6LjZ7Q0e~ZY0N_ah06g0`y*>#5U^J2z6IOLw +zKFM@VQ5ByLQJh1~ETo-a2}3f*ppsIJixU&-j0`W&ZX70@Ctj#D)tKUFkznyl0ZU^f +z5>v^>ee2xi%d{!Few|tqWp_f?QXVfsS5&-@a-OI-n*FQdykt5E>;Fw{OBEIt2|_Lf +zzzV~VBVqx0soq{w93wxKWa9OcNj*sdvhUenoBjlo<~!>qG13= +zotjhmAEg1`Z*obQcv*O^eVW?YHhkka&P2-RNTrW+*K--mL)rL!CR7m0o1zRC(}t>m +z2;JDBw>QnwHAO}DJH2}L7P2EGo?qVMmABlK7st3e>F3gbBz)SZesp6$U#fA|p6Lyb +zq=5mF{kz=tJnK~%CX7ps&iNMYC(jAT!kr7(Dc3XBJM7F4L88hz9Zz5vp6`0@FQKJm +zKy8#ZYmPFq(95B{jzItPUmcZo1$mOE*PP-AO +z<{*f@r+z|3B}~9=QtqgDH^hC3P8Npwh9gYz_Hf6~NPTp_T%r9B6bmT$sSlb) +z(a2*b&Z&N*f~fo<=q}RhC$6LgVGKlRGGT0!F+esR2^DPKV3o5cTllp7USTIDzD?iW3s9n{%npVeiA%QI5f?LKYYruLaUowY3&Y}Age +zOdiCX+OceUb-2ULMCNJmP92ly%(&i!d?b*L`Czh!xe~duN65R%efQI9 +zg6X@V*XXe74D=ao?E7=A_hI!EGPKhIMYdNx4MF~V1;5#6@<<1qFQu#+6v)M=fOwPh +zRk*!-e&^YsB)18{3`+Q*>8T(kZ9Fj?%OlyCu%k2yLj4S)K9fF;RVqGRpfY2g=5}x3 +zPBxTPh@tJ$ue10TwS~@|`;trdv{}C~BNKD4X?EV-biBgrYHv{IPFvSS;^kJOnThZZ +z_Scy2%b>CQo$ca-jhoSjt=W$dsy;ne_in+8D4ag4UtLUvb!K=_Baj;2+up7TaAMjq +z=7fw=jix(nlvnC_oI<{ULr^^%TBo9Q_kZPbaep-?pCM0AcJ>dD~`onr9w<~R@KT5&psGa64XrSpQUQ{Le +zk@i!}^O3;IHpH;wSjlH-T!^QO;T*K4t!SK-N>Bq7eNUK4uG?t$@GO5D?x +zQHaHBl+2j(P|?Zb%-VvE&$ks?L3i7l7(H&{W7}CnDtS+g)=Uo_8z;-kw*CVXYq83Yw8kwrr&bYQI%1Auw|o +zyvFu!xH%t1#AMND>eqRfj1ru$Al&j7+);9~p4QRElQy*-j>VBSb6l1aML#h>kt8m= +z>0R}htr%_$)X7@wd*w^|EjRqL$+YOG4RVt9up>I@l=Rxi{yrUn{R(D)o0k1LqG3+` +zabV9}8htg+%}nmO{`NH1Z9{&*E&SoQqBh%m|B?|Fw`9d*@i}{PZEw`+%q5@iUVm2j +ztiY>A;gneP*)f^jd0JG`J~r%r9e;L0uO7V3MSGbJG* +zr{323c&+Y_a`g5VpO1$A82m&j8M@DCnCnlnSIjii*W?<0c3+kc_kRqoz7;MvcXC@w +zF%0ndY^y=HeYcM0p<5$l;7)AUXgO1xQC^!?Q6{v*pmn+4B<}+7@Rn0ct5+V#X_v97 +z&xm)=*)Z2{!!!PSNPuj)l5_`ZQ?q#we4cQi&GPg|n%@vU?-PtqG$u;E0U +z^gL5fOGy!&u`91G@#@A_2v>Lxa?44*+Y3;t)O@>}Rp-B# +z=mLG~)!zsah7`X#wK$&(V{xcM2H0L`yPF!%$S~iC?$ZxycWlEb*)u-bwycf?b85ov}Qu1elISqdg4zYAy>3#~& +z)TFLGZ*oz?5H}HDJm1vag!27JwX?&}dT)oh{|N{DPfQ$3Ykkn(p&D +zE%amMhN`Q*r@<&`?`ySWlg@pjEW4XjG`SpJb}ejr_YqG(>&G!F(RH)(#TBjf$x28d +zH{+Z!)UK(j`0rn}F91@yUQQ^GEPy(hABOTXH;1i{F=uMTkzN%pn6Rb@f!l_b%J(qF +z)vvUzS>krEO_0H|nVLTZio{~J2?80*9Ecr`?9cAf*a-H>yz +z&qNt7QK;vev1NePchk4%rDa+_pg9Zo)^o!3I{HRwdEfe$6$WlRHsG$Io0YA0+ZNx~ +ziE^?KdwHHDO2VzT>Ja1kXZSV%8 +znTLLTPJY3v`-5mnZno4wklm4LH*gDu-`&Vs&D8WlhW>H>C_F)dhs)GYM}gmrY^yGw +z(B>S?26zY`Xpg`w5yfKiRHa4JuGpk~ptftg!AYR8V?5T!p{uB +zMvomdUPU{}zw|O+#N__ES?&NH&}xL_#nJcXfDW%n)OT1pzJUcjtZv6bHY3VF;o +zHT7{Vq47(9f4FBBJ+bI*WV288+87xFuwN;83W_*N%Tp-7@#4Dwt*fLz_cR@L|Hp<{ +zSh^`A+5kLF+wr??^IHE|=p}3WF`^z&M{W=cJO5DeUbG?u1=Fb9X}ZiP|NZ&(HNv;j +zOun{%{z#ISG>9XIr|bg0?0bjLMV=RUn^fL`a%$1d^(o}%K0Tdk^*_l72Tf%*vPRut8R;4KwIcy_U$`6DNZ*-iB;7FP-y2G*8F;xn6Pm_ +zduDThtK;Q8rcDMn{}L`AjX;*;w^AN47f*NG +z^M#yYomx9oho9d^c@9AxVy(8~xWIc%Rs8c{os*62>H5-gSzf*<(U}W}eQvL(?Tr`j +zJ+_u~#t+EHNtjvB+#gK|aYefa#J2`fx!<9-=eczMOpdmc`JGm7z53&R3(us1Pjk`r +zq+B5&yrOl9_jy2bMZ3kN_V!4|R1D_ZGOiF;r1=|HyouF>5gUVI&K0OeGRl=N49Il|sJb4Qmh~f6cz6tv1#wQiH;`>Abnt +zSNpzz35nOkP!-x}#=j8*O;CO6-~um&m3p2n2~=e_`wlTrS*Y7dD4QUV^w?Y;n#n8I`Xo*?XmteB^HC-mn_7_ebdENyA}z7y?s?VO(b4CP +z0m^rB1#oBYC@|*R9Dmz`zKm9f7wIZpQMwXOffYO+>KiZdIA640`w^7QezBBLpN^TK +znMuchd4}ieB&2J_J)T;aPzO&(8p*!_l_i&r%w +zY9a)E1rCou3>P@?mw=X4^VkR8Z+udKlDI-}gU)imb4OHWCc1 +zq^?mefJ@!}EopKK&fAdGw7)MxPxlZ`CjR$dh)qPZUGCdTbde{1KF-v!e{077%=+O! +z%aWIyhHQD?^Tz;50P5ydPQQqbr?)FwevVs86nHrio1wGKmx@4X+iG0$&7@@Ph>)9F +zdPDoC)8#EH2^dPJ&e=W(&E{eZsEf~cMIKv>=dD4e;y8$)NY->UYaM;E#R2E3&_N`V +zQ5(l-(q)!JhDsNsKFWy!!fG{#nso0Q2PlX-lX)Lzc4%%?wM^x}su+K!9-2Quxev6z +za~uyp>mJi1zV)=8vCXZI9uOyxkZOD+lnt48o@wU{mr11>BCx2hXvp>E;SwvS?3UJ!Dwd%?(fI +z>a;4#CG1n*R?w8ydVVTUm!xLI6WqdSjw1(a@IQNq=4#K?RA}?mMG$fE%yX=apV;u$ +z@IJjjBc1-UHdANDfAE7?uH1XI#@t*jVK|PjvObrLKQPTe-JZYD~X5L^KKKJF>KhdPHq*WB$&fodgkg?t# +z3yj89i#kolSWD|1fr+`ikdqf$c^)SVJ~F!Iyp=3bFRZ#~UNfTQ^>{!&&(GoM@KinZ +zxkjIlC2c%v&eRw|QRnp8{VFefoTTcZ_>4w)V9){-i@p`NVS?d+{6F8rXU&(1|BW7>&+1kd|{t|~vP5xC0P+5j&66$fJsQbE;3KDtDSgQ?I$?*XJaf~X!uu76a;fk1d$F!t2~r1Bak8^! +z-j`}@=gL%){%+k!c2Yc())=yWn1;xzBBP*HXOUpuMbkk(;pOW4^S$O9FRPew2N#Kp +zQ?BkEj=My2qK5hQcdgQ&nXhYIv&I7#H6)_X+7th%%>I+qqU&c7lh3R_*kfQ+$?0h@_lF|NhLm@9ds0|rDlzdd${6anchIsS6cqcCM&C)W=8)w +zws(TU&6wJf@n;Y#_u^69xvZ)}Y@<$cqh5AH%k4o0&QO}?MxZofR9`0)H115YE}1f)=1&0;FY;J1;gx}cB?zPU^8&*EKmS*l2C%%?_PqZ&zk~?BYofi& +z_#1t2o7Ou(>cBEa;2T@S!=-11g$*7QnRqq!czTXi?EPp&4grxPZjXJzQX>zA3%{kLmctf +z4-EiHAW$KsH#turT8o$f2e5U<8(HuL19G@Un-pb)CZOVnSG5S@u1`ul(lRLcEWv}2 +zKfiM6@qq}nZ1!M^J~ucI5CJl7lRtU(&o4Wqz990H(LFm963gQ?gcOX;WbOT3rdNU2 +zN7|mK%^`@8^vJ{JTq`uWR{w}t72E(DpC9R}XWf3|nNN;Paq+A}_F!%1G^E|aa{CuS +z?jnOK3+xZ1r(JHnr$KAQilJZ@&C+GK*uUZ47y6PNZ*obn4+-i`?j^pXDOYR`r~f$w +z?(S#_L?Ydkz?IdQc@ZyG+8-RgPE9tgS)Mwj6%|Ec0HXcw7nxk8T^3@1zA#r<&~sFxto~yFf5zGWGJy9axm^4w45CB!$_ZeL{6D?QB%@MgQXGE2;vWd +zCL!jhs~BsvSXRA)&S5ZrgV22epx<8u_0#SNE9o0=t?-4Qm|vG5KwuP#Dv8{Tivq-g +zRT3_)+`6>GZd$c2?C@jNG3_mlJIPNr4SI3l_4=X~Crb=YAR=g7E5KHpzxXgdIlwkv +zMzT^;hAgD)uZs%)R!M+Ls-BGXy}IL7X`{|nBUxBe8#U4|7ea+Ffz^5+stZD2Q@W^q +z&i=yrRj?~&U=1@dCi@X#3Nz}0i^m@c1_XdXANex0g-yE2^brwV`Y|wJAMg|;MaU2L?ra@6*j@2ZSDsE?0zaS9Z1X&Ck-n`Xfs~taOb{u +ztCx2AI2{$*_~s$3Tk0=^>cHSI2}l4=Y9xf=gc{BkuM5~jq^bF#1g24fgxKS#5qu>P +zhvb1%0&_qg;6FgH=G6fJUxmOS5CQ=-tOp4mP(OY}BBr=~1{YZvu+PB)U}S)86Gjd; +z6D*1$@()14P&Nmu+by2!U33Tr+G(2Y4dw7>JbReuRw00W_)w!%vsd><)%XQoRl1Zti5P`khY +z4Bvb-30uKSh5k%+t244nmYbAJG~TAwu0h(S>m4uq@%8;R7t_#2<5#nNr-MlY#J3#p +zFJtV}*}gQkr~dw9vX1*cxLhs_{^(P%uz?V(*~g_C!I6zt2H&3UNLO8zl{(x_a6zHq +z?fEGBdc2AX>{FwfeDh<$zO31SwQgF6f%4NaGd<%q<_p7*M{*!{LBLq(ZuIahVt{7D +zS^F(m9O_vz?z=uV$#LgRl(w(_t*8;~>)vYP;~4*9)AP-I9}SL-?msFfKc*+|mA_Ctc0H$bWAa(*>dw=W(Y#+vz%u9h>CBfo~@+z&?p@sd{fAJu)Z9Kl4XKBfXvtCp4b&$dI|K03D4~KMKRo)8nxdnZ2 +ze3!lfl*FTm{J)Gpy+$2OZ@8ghvzt%e)$nj-^RIDxq||97k20@=#}gxKPYB3p6~mM3JC3gm%(yf#DqHvE_1z4FgxQ44<8Hvu@L%) +zfUI?V?UH7G(K92K{ouNBgn5?p)l_|sX2aWRzCmSgmr96#y9xe;-^19OeU8;Q2TIY_ +zD`*41L0aqr4w3l3g!0ppli9Cl0@Eu#-U^&9FxCsSu@!b?I^CBc`he;#7k*~l_Icj< +zw80Q@rs8lwD+NPY+&V*}nBBI#g|@5Wl=+d^Adlq{#X^DiqKqXu?bi~zGPx8x@%@8% +zcM+@f?Tsu%8h{N0`dX5J=j%vgAoguub|_{YS>!>Zd=KetH{{Hma}S4tKt{I!dObAh +zi%2-=@pP=1&-eTr`~0rr2Q4*CfxxBE6ECwvDn&S=$&qE@-MGPlv79ISWzsQ(we+59 +z%|WvNxq@CR^-YZ^VYM~#UQgQN0ZlZ4t>D`@{{X*DDUc0x#H}!F)gLn!)=fpYezwrk +z+E9>hKE^eL)ce$wjT}OkKka4L8wTdNh8GSd$9r*U+yLx{z)vkYEZu;9WP7@lsb$Q~ +zn#BreZ4XJ0+Qd%B?=X>C2p%v1q7df8w-xrnHtXYc#!8=$u#vsmwu4z5I%5{mN);}@ +z&hgoDmRgwm^gPA&chpJovh7~gEaI~O_!C$s(g*t!kQ9c-Hg^2?6df;!{QJ7leAs*fJIT<-Wh +z7n+P*?nzA4RjCENV)DhUxGAXjs-A-u8ay{s)_Nq*Pu4n)`Wg~SBO7J=KRrwyAovv> +z$DLGX&h@;HH0zjU)Lg$fHr$@+zK{Kqede53u!egw>V3jD=K)gkO%=48*$L}pgQ5It%GMoe8`?=4`waph +zWD(oqd9i4H%0o1lXfYvhq}OOD8B*gCLsyY7dY9)I3Cw0v|^ys!=j3`{yUaty)7 +zoMy16GAt;({w$%BYrjUbN{)u+QycRJAl=vfCnp@MiyCom2V?a%{L0rH*oa`E3Pm^X +zXI`pcB;cny|MkHsDGQ;q=th&PYsDX&iI)&r^{;SGFQI8=-V3uK=N#d(uD1de7p+yi +z9w?3YRn^<=isLZ9NID91;zL^fsX21y;Urn;!=WOu&%n1Qk~DR3ek9;FF)14;8FS3V +zW3hdjgl6p@wMempv;K%&*Ih<@vV123AeQRlX?8>h$YQIdsm+;xfW@@Z#n_2sDQ*>H +zh{IadnkoEm{f=3?ft32=`69ndg0dP+IQ8ld?zr*+jL_-vdHNnT@%Gqucw5iF=|8r~ +z4tr!U4th}#02IGHyR2m}cbz-moWc>e%BmNgUhTmD%&8x}tkCQ!oo|d_zN*mMezp(G +zH`3M~m;vM#E(`!Au2P_VyTGm;lgWhBs+o7!%w2OA)xvanN3@!(x7+^m3Ah;7Q+3$Md>a2Wv^5FkfFyO6N*Ft! +z{IwYl*qt>l9RmZ_BlUKwy@pSgH_n2Nc5I)Gb%{Y;$M|fVm*Yf?);~T}=*`YbNlR}b +zxD>IOMf!C^So=YMF;e3&EMU}S!rWabz@kcy0i^W8!iSePvF?REXHo_i+#bOL{b$}d +ziXA^6heu*dOj)!*fVUni7@5V`d`i|8UWQBNcV{Zjo#YHY3mWi7{e`NM(k`Ez4A`dq +znPqpHNXIG!Ymlp_5*G&tYgy=Pa=b9(a|Uem-`4xIfzy4jnRO|(h(|5hWk#ZM4beD( +zaiL4wMOeVW;rmTtGzt~jE84&Gmhw}ymB}p(jTiWL%*Cz*!Usnve>cTV99}w% +z8^bMTM)@cNzZvPsA{QJ=OJjY|hy)2j@DK&-{&7H(tcK!UKv!c<84EBezsXSPqjEX- +zQ8?C*^{dl(9K|1bliHHNHEI +zjlHQ^-IDNDw?8hj7QGuV8WN$2R0q>hk|Rg01;cpC83KR^c?uv0_^YA*Kuad^*ve{4 +z*8OXWM`xYRJI?cEtKfKA*JHH7@beRY)Oh!rJwPK$L#}_i+%wHI!R4D@RY>=V&tI5; +zP}~!sf|Y0f3UBv6wcLU25 +zH2@pMobR);j2z1sS%N`CQ#)lIW$g$|zd@zI?{$#U4`V_?)Qrdge(?5`u)F@Zev(op +z3=Ag{V0ZObpnm5hwCu#kA+0)_gNxWsnP~sn?Gvt#6@7rm_DxMzzTcX<7#KA~(7I3@v->Dlau|;C?1&RqVU6bjE*|6!a2g!mu +zorfL)xsdN?(GzKR3jMoWO>@!aVg$OzU7GF0npLC#F~6s|)xum^%CXjCp4I4}X~nz7 +zxRfb*t+n>CnXm2PqQGtHfD)JGdiHqdC$GA8_Xz5cvDXHB#9*XEOLd}q6CCzyiJz(_JS3?S| +z#r4gQQfb_0L#-ml@mHeXuOyAoW{*1gky6D%)sE|`DrX`k+TtTnT36@PV#;^LbJR_l%|B<9EhER~;6S +zmFhN+D@l}-QA1FeeTkZO0}`;!L=>MV$8Kqv8Gt|s*981_+d<7=2~YVXJ~Gg?IVx?6 +zBwm-wKw_7k!P*i*e5M%pzBMt`3OY|#OWJ>gUhx5JwRWSp{eB+T7$ISIQ0SLvbqam!Blp~UI@V%+ +zs^9RZ3K?bpQ$`qv%DIUQ6|UPa3w@O76VK}{=3)6dRtx{O+Vj8Em92nEfvn}f+0EmE +ziq=!B><5zG1L^>>zwTx4H8k-n*L*-DyOQ)YE;3MAGdB-cN9MbqDj1`^I%;ZC`~eG$ +z@}Nt>JOK#fn-M2b46D)eVysPI;|@Jw +zGoL`Thhu4)l<%!=y`%nKJa^Y__Jmt;Gx`XEfbo-DPV)mFniV@(U2&c@D&`t~HPl=0 +zH0%FY=81Q%7!gsP^-rhzcR>7U3@6?49b%0IN}VOCR0WhMEZ4mzl+y +z2>ZVIJR%RTx|xp4GHsKj1nnR7&<2f?dW*fxTkkPX73(#g689!&G9UWFLXZ(O%}!BV +zOqqeIBBP-41JBLueN(R*Mkwh-K{h$sua4-rBNc8iwe&|zmd)9h;`BR?BLQe9m}R

eXc +z;Xl3lVP0DheB{%)seSqk_X#mHs*1cWKG0+CIN!(tgSm6_42#Q_r9Mm7sR#~S(Zkat +z*7)4rn;%6xKJkX2e^1L_Xni#p>eUvvpavs@ml&98oXlx0k4yACnJY~>5WXO2F|VAa +zH%Q4S+M^Jd3zmcw-K%!oxE!vb`)>f!P)#4|eCtf+Me`!?4lOpw#I@OydA_rQi8$3; +zFN&#Y7ufG<->dalFjyi+b|b&aCM!J6Tek5p>+UKVJQg*q5Ai{LvjY?lAwbBH$LLWBP!X}j8wmZzvt^wMfP^pN-D#I-_c=b +z?T7vtoB8#QUeUJ|h`|s+M)6br8RQIWX|3j_m?U~whrznQcd31p|7c0=8J-aP!AE{Y +zWl)I46bx$`OW;3QyV;fB=)}#THR};M&5tNDM6VAMm5Zg{sfrB$HTVQlijSdRm%A~L +z0y~HyCtXMW>FAH2W;tD??n*)JyqbbX;U +zl?l7lJeZSlVOMfDA58@PBOl43>ps}~g9V1g-Zbe<93?hY8ymLFD-I2aVue#?(Snf{ +zkw-8_^Z`_chQLgRysjYf25t%rA!7)6PL}pIbzx6wF+Aokb^=Ry;8O}rYdEitj6yHO +z^kj*$^LHnvOhx4idCnh#QD3BN)*MM1n~YHy#5)fZctmnASO_dak+Z47iuv0QTaL(h +zk>v>$1zSG@^f44uxk8_Y2jOdXj~^Ch~ocR7~D<>^AC{*W+z98 +zZjU^LGXSF%rFT<`7L1kyuml2tQ4TpGJdBV5!cWBuvX2micoGl=pAvnI5>iUnKP9>l +zI8+b~SU(3|C6ho3Gfe2mqIm)olkT@e9j*J*IH;WBegyw7q1{Y}~D&fpCf`d>*@o=iB +z;p11(7!dmj(XcQ}SF<(n>>(FP3@@H;$rlay^xX3ge0Dg2QH7}~NLY_^Nok_0Xyj2&(qf`pCxW~!nMUMTq+ +t!(@j3|Keue|Et~j|7FuLZQ45-5aKK>uoSV93}rt+T3kV_Ttwgh{{Xp+Jz4+& + +literal 0 +HcmV?d00001 + +diff --git a/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml b/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml +new file mode 100644 +index 0000000..64d58e7 +--- /dev/null ++++ b/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ (.+)%20%20%20(.+) ++ ++ ++ ++ ++ ++ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) ++ ++ ++ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) ++ ++ ++ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) ++ ++ ++ ++ ++ ++ ++ ++ </title>\s*<mbid>([^<]*)< ++ ++ ++ <album[^>]*>\s*<artist>\s*[^<]*</artist>\s*<title>([^<]*)</title> ++ ++ ++ <artist>\s*<name>([^<]*)< ++ ++ ++ <name>([^<]*)< ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <content><!\[CDATA\[(.*?)(User-|\]\]) ++ ++ ++ <tag>\s*<name>([^<]*)</name> ++ ++ ++ <image size="extralarge">\s*([^<]*)\s*</image> ++ ++ ++ (.+) ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml b/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml +new file mode 100644 +index 0000000..acb2b4f +--- /dev/null ++++ b/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml +@@ -0,0 +1,5 @@ ++ ++ ++ Grab album thumbs from fanart.tv ++ Grab album thumbs from Last.fm ++ +diff --git a/addons/metadata.musicvideos.last.fm/resources/settings.xml b/addons/metadata.musicvideos.last.fm/resources/settings.xml +new file mode 100644 +index 0000000..4034620 +--- /dev/null ++++ b/addons/metadata.musicvideos.last.fm/resources/settings.xml +@@ -0,0 +1,5 @@ ++ ++ ++ ++ ++ +-- +1.7.10 + + +From 23dbf6ffda52c35dcca0bb24d667ec880bdf6a17 Mon Sep 17 00:00:00 2001 +From: Martijn Kaijser +Date: Sun, 8 Jul 2012 14:09:54 +0200 +Subject: [PATCH 4/4] make artists/album universal scrapers and last.fm + scrapers default + +--- + xbmc/settings/GUISettings.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 849953c..086b100 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -274,8 +274,8 @@ void CGUISettings::Initialize() + AddBool(ml, "musiclibrary.showcompilationartists", 13414, true); + AddSeparator(ml,"musiclibrary.sep1"); + AddBool(ml,"musiclibrary.downloadinfo", 20192, false); +- AddDefaultAddon(ml, "musiclibrary.albumsscraper", 20193, "metadata.albums.allmusic.com", ADDON_SCRAPER_ALBUMS); +- AddDefaultAddon(ml, "musiclibrary.artistsscraper", 20194, "metadata.artists.allmusic.com", ADDON_SCRAPER_ARTISTS); ++ AddDefaultAddon(ml, "musiclibrary.albumsscraper", 20193, "metadata.album.universal", ADDON_SCRAPER_ALBUMS); ++ AddDefaultAddon(ml, "musiclibrary.artistsscraper", 20194, "metadata.artists.universal", ADDON_SCRAPER_ARTISTS); + AddBool(ml, "musiclibrary.updateonstartup", 22000, false); + AddBool(ml, "musiclibrary.backgroundupdate", 22001, false); + AddSeparator(ml,"musiclibrary.sep2"); +@@ -774,7 +774,7 @@ void CGUISettings::Initialize() + + AddDefaultAddon(NULL, "scrapers.moviesdefault", 21413, "metadata.themoviedb.org", ADDON_SCRAPER_MOVIES); + AddDefaultAddon(NULL, "scrapers.tvshowsdefault", 21414, "metadata.tvdb.com", ADDON_SCRAPER_TVSHOWS); +- AddDefaultAddon(NULL, "scrapers.musicvideosdefault", 21415, "metadata.yahoomusic.com", ADDON_SCRAPER_MUSICVIDEOS); ++ AddDefaultAddon(NULL, "scrapers.musicvideosdefault", 21415, "metadata.musicvideos.last.fm", ADDON_SCRAPER_MUSICVIDEOS); + AddBool(NULL, "scrapers.langfallback", 21416, false); + + // service settings +-- +1.7.10 + diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch deleted file mode 100644 index c013e0ae3a..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur xbmc-9389dc8/configure.in xbmc-9389dc8.patch/configure.in ---- xbmc-9389dc8/configure.in 2011-09-01 17:21:47.000000000 +0200 -+++ xbmc-9389dc8.patch/configure.in 2011-09-01 23:30:40.419399392 +0200 -@@ -428,6 +428,14 @@ - esac - AC_SUBST([ARCH]) - -+AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) -+if test "$HAVE_GIT" = "yes" -a "$GIT_REV" = ""; then -+ GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') -+elif test "$GIT_REV" = ""; then -+ GIT_REV="Unknown" -+fi -+final_message="$final_message\n git Rev.:\t${GIT_REV}" -+ - # platform debug flags - if test "$use_debug" = "yes"; then - final_message="$final_message\n Debugging:\tYes" -@@ -1177,7 +1185,6 @@ - fi - fi - --AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) - - # Checks for header files. - AC_HEADER_DIRENT -@@ -1408,12 +1415,6 @@ - final_message="$final_message\n Avahi:\tNo" - fi - --if test "$HAVE_GIT" = "yes"; then -- GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') --fi --if test "$GIT_REV" = ""; then -- GIT_REV="Unknown" --fi - if test "$host_vendor" = "apple"; then - echo "#define GIT_REV \"$GIT_REV\"" > git_revision.h - else diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch deleted file mode 100644 index 5e76acefe4..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 05:01:20.091837122 +0200 -@@ -6,5 +6,5 @@ - Name: libdvdcss - Description: DVD access and decryption library. - Version: @VERSION@ --Libs: -L${libdir} -ldvdcss --Cflags: -I{includedir} -I${includedir}/@PACKAGE@ -+Libs: -ldvdcss -+Cflags: -I. -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 05:01:20.549828701 +0200 -@@ -56,17 +56,17 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $dvdread_cflags $extracflags $threadcflags -+ echo $dvdread_cflags $extracflags $threadcflags - fi - - if test "$echo_minicflags" = "yes"; then -- echo -I$prefix/include -I$prefix/include/dvdnav $extracflags $threadcflags -+ echo $extracflags $threadcflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir -ldvdnav $dvdread_libs $threadlib -+ echo -ldvdnav $dvdread_libs $threadlib - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L$libdir -ldvdnavmini $threadlib -+ echo -ldvdnavmini $threadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 05:01:20.624827321 +0200 -@@ -76,13 +76,13 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -I@includedir@/libdvdread @THREAD_CFLAGS@ -+ echo @THREAD_CFLAGS@ - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdnav -ldvdread @THREAD_LIBS@ -+ echo -ldvdnav -ldvdread @THREAD_LIBS@ - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L@libdir@ -ldvdnavmini @THREAD_LIBS@ -+ echo -ldvdnavmini @THREAD_LIBS@ - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 05:01:21.042819641 +0200 -@@ -7,5 +7,5 @@ - Description: DVD Navigation mini library - Version: @VERSION@ - --Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 05:01:21.262815601 +0200 -@@ -8,5 +8,5 @@ - Version: @VERSION@ - - Requires.private: dvdread >= 4.1.2 --Cflags: -I${includedir} @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 05:01:21.278815307 +0200 -@@ -72,9 +72,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -+ echo "" - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdread -+ echo -ldvdread - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 05:01:21.278815307 +0200 -@@ -48,9 +48,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $extracflags -+ echo $extracflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir $dvdreadlib -+ echo $dvdreadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 05:01:21.279815289 +0200 -@@ -7,5 +7,5 @@ - Description: Low level DVD access library - Version: @VERSION@ - --Cflags: -I${includedir} --Libs: -L${libdir} -ldvdread -+Cflags: -I. -+Libs: -ldvdread diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch deleted file mode 100644 index fe0ee49cab..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h ---- xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-09-27 15:56:19.000000000 +0200 -+++ xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-10-16 02:13:13.805433847 +0200 -@@ -17,7 +17,7 @@ - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - --#if !_LIBC -+#if 0 - /* This code is written for inclusion in gnu-libc, and uses names in the - namespace reserved for libc. If we're not compiling in libc, define those - names to be the normal ones instead. */ diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch deleted file mode 100644 index 507334d2e2..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch +++ /dev/null @@ -1,199 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-06-19 04:44:55.985036378 +0200 -@@ -385,6 +385,12 @@ - [use_texturepacker=$enableval], - [use_texturepacker=auto]) - -+AC_ARG_WITH([texturepacker-root], -+ [AS_HELP_STRING([--with-texturepacker-root], -+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], -+ [use_texturepacker_root=$withval], -+ [use_texturepacker_root=$prefix]) -+ - AC_ARG_WITH([lirc-device], - [AS_HELP_STRING([--with-lirc-device=file], - [specify the default LIRC device (default is /dev/lircd)])], -@@ -466,8 +472,7 @@ - use_cpu=cortex-a8 - check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] - if test "x$check_sdl_arch" = "xi386"; then -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" -+ use_texturepacker_root="/opt/local" - else - use_texturepacker=no - fi -@@ -484,8 +489,6 @@ - *86-apple-darwin*) - use_joystick=no - use_vtbdecoder=no -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" - ARCH="x86-osx" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") - ;; -@@ -1649,17 +1652,17 @@ - - USE_TEXTUREPACKER_NATIVE=0 - if test "x$use_texturepacker" != "xno"; then -- final_message="$final_message\n TexturePacker:Yes" -- USE_TEXTUREPACKER=1 -- if test "x$use_texturepacker_native" = "xyes"; then -+ if test "x$cross_compiling" = "xyes"; then - USE_TEXTUREPACKER_NATIVE=1 -- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then -- USE_TEXTUREPACKER_NATIVE_ROOT= -- fi -+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" -+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" -+ else -+ USE_TEXTUREPACKER=1 -+ final_message="$final_message\n TexturePacker:Yes" - fi - else -- final_message="$final_message\n TexturePacker:No" - USE_TEXTUREPACKER=0 -+ final_message="$final_message\n TexturePacker:No" - fi - - if test "$use_mid" = "yes"; then -diff -Naur xbmc-pvr-11.0.1/lib/libsquish/Makefile.in xbmc-pvr-11.0.1.patch/lib/libsquish/Makefile.in ---- xbmc-pvr-11.0.1/lib/libsquish/Makefile.in 2012-03-27 17:55:41.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/libsquish/Makefile.in 2012-06-19 02:45:32.926185206 +0200 -@@ -1,6 +1,6 @@ - ARCH=@ARCH@ - --SRCS= \ -+SRCS = \ - alpha.cpp \ - clusterfit.cpp \ - colourblock.cpp \ -@@ -11,27 +11,30 @@ - singlecolourfit.cpp \ - squish.cpp - --CXXFLAGS+=-I. -+LIB = libsquish.a -+NATIVE_LIB = libsquish-native.so -+CLEAN_FILES += $(NATIVE_LIB) -+ -+HOST_CXX ?= g++ -+CXXFLAGS += -I. -+HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif - --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -+$(LIB): $(SRCS) - --all: $(LIB) $(NATIVE_LIB) - # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. - $(NATIVE_LIB): $(SRCS) - ifeq ($(findstring osx,$(ARCH)),osx) -- g++ -m32 -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ -+ $(HOST_CXX) -m32 $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ - else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ --endif -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ - endif - - include ../../Makefile.include -diff -Naur xbmc-pvr-11.0.1/tools/TexturePacker/Makefile.in xbmc-pvr-11.0.1.patch/tools/TexturePacker/Makefile.in ---- xbmc-pvr-11.0.1/tools/TexturePacker/Makefile.in 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/tools/TexturePacker/Makefile.in 2012-06-19 04:47:54.700638167 +0200 -@@ -1,47 +1,52 @@ --DEFINES += -D_LINUX -DUSE_LZO_PACKING -+DEFINES += -D_LINUX -DUSE_LZO_PACKING - ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) --DEFINES += -DHOST_BIGENDIAN -+DEFINES += -DHOST_BIGENDIAN - endif - --CXXFLAGS+= \ -- -I. \ -- -I@abs_top_srcdir@/lib \ -- -I@abs_top_srcdir@/xbmc \ -- -I@abs_top_srcdir@/xbmc/linux -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@ --ifdef NATIVE_ROOT_PATH --ifeq ($(findstring osx,@ARCH@),osx) --CXXFLAGS+= -m32 --endif --CXXFLAGS+= -I$(NATIVE_ROOT_PATH)/include --LIBS += -L$(NATIVE_ROOT_PATH)/lib --endif --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native --else --LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish --endif -- --LIBS += -lSDL_image -lSDL -llzo2 -- --SRCS = \ -+SRCS = \ - md5.cpp \ - SDL_anigif.cpp \ - XBTFWriter.cpp \ - XBMCTex.cpp \ - @abs_top_srcdir@/xbmc/guilib/XBTF.cpp - -- --TARGET = TexturePacker --CLEAN_FILES=$(TARGET) -+TARGET = TexturePacker -+CLEAN_FILES = $(TARGET) - - all: $(TARGET) - -+HOST_CXX ?= g++ -+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ -+ -+LIBS += -lSDL_image -lSDL -llzo2 -+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish -+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 -+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native -+ -+CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux -+ -+HOST_CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux \ -+ -I$(HOST_ROOT_PATH)/include -+ -+ifeq ($(findstring osx,@ARCH@),osx) -+CXXFLAGS += -m32 -+HOST_CXXFLAGS += -m32 -+endif -+ - ifeq (@USE_TEXTUREPACKER_NATIVE@,1) - # TexturePacker run native on build system, build it with native tools - $(TARGET): $(SRCS) -- g++ $(DEFINES) $(CXXFLAGS) $(SRCS) $(LIBS) -o $(TARGET) -+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) -+ - clean: - rm -f $(TARGET) - else diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch deleted file mode 100644 index 63b04cb3e0..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/xbmc/Application.cpp xbmc-10.1-Dharma.patch/xbmc/Application.cpp ---- xbmc-10.1-Dharma/xbmc/Application.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/xbmc/Application.cpp 2011-05-06 01:41:52.853741840 +0200 -@@ -2515,8 +2515,8 @@ - if (!m_pPlayer->IsPaused()) - { // unpaused - set the playspeed back to normal - SetPlaySpeed(1); -+ g_audioManager.Enable(m_pPlayer->IsPaused() && !g_audioContext.IsPassthroughActive()); - } -- g_audioManager.Enable(m_pPlayer->IsPaused() && !g_audioContext.IsPassthroughActive()); - return true; - } - if (!m_pPlayer->IsPaused()) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index b8f5b8afcf..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -885,6 +885,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # Python -@@ -1547,6 +1550,7 @@ - `if test "$use_arch" != "no"; then echo --arch=$use_arch; fi`\ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - --target-os=$(tolower $(uname -s)) \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch deleted file mode 100644 index a459219108..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch +++ /dev/null @@ -1,125 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 05:46:35.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:50:02.982401390 +0200 -@@ -72,6 +72,8 @@ - rsxs_disabled="== RSXS disabled. ==" - pulse_not_found="== Could not find libpulse. PulseAudio support disabled. ==" - pulse_disabled="== PulseAudio support manually disabled. ==" -+lame_not_found="== Could not find libmp3lame. LAME support disabled. ==" -+lame_disabled="== LAME support manually disabled. ==" - dvdcss_enabled="== DVDCSS support enabled. ==" - dvdcss_disabled="== DVDCSS support disabled. ==" - hal_not_found="== Could not find hal. HAL support disabled. ==" -@@ -244,6 +246,12 @@ - [use_ffmpeg_libvorbis=$enableval], - [use_ffmpeg_libvorbis=no]) - -+AC_ARG_ENABLE([lame], -+ [AS_HELP_STRING([--enable-lame], -+ [enable lame support (default is yes)])], -+ [use_lame=$enableval], -+ [use_lame=yes]) -+ - AC_ARG_ENABLE([dvdcss], - [AS_HELP_STRING([--enable-dvdcss], - [enable DVDCSS support (default is yes)])], -@@ -758,6 +766,20 @@ - USE_PULSE=0 - fi - -+# LAME -+if test "$use_lame" = "yes"; then -+ AC_CHECK_LIB([mp3lame], [main], -+ AC_DEFINE([HAVE_LIBMP3LAME], [1], [Define to 1 if you have the 'libmp3lame' library (-lmp3lame).]), -+ use_lame=no;AC_MSG_RESULT($lame_not_found)) -+else -+ AC_MSG_RESULT($lame_disabled) -+fi -+if test "$use_lame" = "yes"; then -+ AC_SUBST([HAVE_LIBMP3LAME], 1) -+else -+ AC_SUBST([HAVE_LIBMP3LAME], 0) -+fi -+ - # HAL - if test "$host_vendor" = "apple" ; then - use_hal="no" -@@ -1311,6 +1333,12 @@ - final_message="$final_message\n HAL Support:\tNo" - fi - -+if test "$use_lame" = "yes"; then -+ final_message="$final_message\n LAME:\t\tYes" -+else -+ final_message="$final_message\n LAME:\t\tNo" -+fi -+ - # DVDCSS - if test "$use_dvdcss" = "yes"; then - AC_MSG_NOTICE($dvdcss_enabled) -diff -Naur xbmc-pvr-3513480/configure.in.orig xbmc-pvr-3513480.patch/configure.in.orig -diff -Naur xbmc-pvr-3513480/Makefile.in.orig xbmc-pvr-3513480.patch/Makefile.in.orig -diff -Naur xbmc-pvr-3513480/xbmc/cdrip/CDDARipper.cpp xbmc-pvr-3513480.patch/xbmc/cdrip/CDDARipper.cpp ---- xbmc-pvr-3513480/xbmc/cdrip/CDDARipper.cpp 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/cdrip/CDDARipper.cpp 2011-04-25 05:48:10.487548571 +0200 -@@ -27,7 +27,11 @@ - #include "CDDAReader.h" - #include "utils/StringUtils.h" - #include "Util.h" -+ -+#ifdef HAVE_LIBMP3LAME - #include "EncoderLame.h" -+#endif -+ - #include "EncoderWav.h" - #include "EncoderVorbis.h" - #include "EncoderFFmpeg.h" -@@ -78,9 +82,16 @@ - case CDDARIP_ENCODER_FLAC: - m_pEncoder = new CEncoderFlac(); - break; -- default: -+#ifdef HAVE_LIBMP3LAME -+ case CDDARIP_ENCODER_LAME: - m_pEncoder = new CEncoderLame(); - break; -+#else -+ default: -+ CLog::Log(LOGERROR,"invalid encoder selected"); -+ return false; -+ break; -+#endif - } - - // we have to set the tags before we init the Encoder -diff -Naur xbmc-pvr-3513480/xbmc/cdrip/Makefile.in xbmc-pvr-3513480.patch/xbmc/cdrip/Makefile.in ---- xbmc-pvr-3513480/xbmc/cdrip/Makefile.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/cdrip/Makefile.in 2011-04-25 05:51:13.013064387 +0200 -@@ -3,10 +3,13 @@ - Encoder.cpp \ - EncoderFFmpeg.cpp \ - EncoderFlac.cpp \ -- EncoderLame.cpp \ - EncoderVorbis.cpp \ - EncoderWav.cpp \ - -+ifeq (@HAVE_LIBMP3LAME@,1) -+ SRCS+=EncoderLame.cpp -+endif -+ - LIB=cdrip.a - - include @abs_top_srcdir@/Makefile.include -diff -Naur xbmc-pvr-3513480/xbmc/settings/GUISettings.cpp xbmc-pvr-3513480.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-3513480/xbmc/settings/GUISettings.cpp 2011-04-25 05:47:12.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/settings/GUISettings.cpp 2011-04-25 05:48:47.956833472 +0200 -@@ -324,7 +324,9 @@ - AddPath(acd,"audiocds.recordingpath",20000,"select writable folder",BUTTON_CONTROL_PATH_INPUT,false,657); - AddString(acd, "audiocds.trackpathformat", 13307, "%A - %B/[%N. ][%A - ]%T", EDIT_CONTROL_INPUT, false, 16016); - map encoders; -+#ifdef HAVE_LIBMP3LAME - encoders.insert(make_pair(34000,CDDARIP_ENCODER_LAME)); -+#endif - encoders.insert(make_pair(34001,CDDARIP_ENCODER_VORBIS)); - encoders.insert(make_pair(34002,CDDARIP_ENCODER_WAV)); - encoders.insert(make_pair(34005,CDDARIP_ENCODER_FLAC)); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch deleted file mode 100644 index 821c1cc7bd..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -Naur xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -335,11 +335,9 @@ - // at http://docs.python.org/using/cmdline.html#environment-variables - - #if !defined(_WIN32) -- /* PYTHONOPTIMIZE is set off intentionally when using external Python. -- Reason for this is because we cannot be sure what version of Python -- was used to compile the various Python object files (i.e. .pyo, -- .pyc, etc.). */ -- // check if we are running as real xbmc.app or just binary -+ // Required for python to find optimized code (pyo) files -+ setenv("PYTHONOPTIMIZE", "1", 1); -+ // check if we are running as real xbmc.app or just binary - if (!CUtil::GetFrameworksPath(true).IsEmpty()) - { - // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch deleted file mode 100644 index 0427b534f9..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-pvr-3513480/userdata/LCD.xml xbmc-pvr-3513480.patch/userdata/LCD.xml ---- xbmc-pvr-3513480/userdata/LCD.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/userdata/LCD.xml 2011-04-25 05:27:34.956125133 +0200 -@@ -21,7 +21,7 @@ - Freemem: $INFO[System.FreeMemory] - - -- XBMC running... -+ *** OpenELEC *** - $INFO[System.Time] $INFO[System.Date] - Freemem: $INFO[System.FreeMemory] - $INFO[System.ScreenWidth]x$INFO[System.ScreenHeight] $INFO[System.ScreenMode] diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch deleted file mode 100644 index 5b32c0cce7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/userdata/RssFeeds.xml xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml ---- xbmc-10.1-Dharma/userdata/RssFeeds.xml 2011-03-08 02:49:24.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml 2011-06-14 17:07:08.450880123 +0200 -@@ -3,6 +3,7 @@ - - - -+ http://openelec.tv/news?format=feed&type=rss - http://feeds.feedburner.com/xbmc - - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch deleted file mode 100644 index 0888920258..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-30a9070/system/keymaps/keyboard.xml xbmc-30a9070.patch/system/keymaps/keyboard.xml ---- xbmc-30a9070/system/keymaps/keyboard.xml 2011-07-28 06:20:13.000000000 +0200 -+++ xbmc-30a9070.patch/system/keymaps/keyboard.xml 2011-07-28 09:39:57.210973380 +0200 -@@ -90,7 +90,7 @@ - Number7 - Number8 - Number9 -- ToggleFullScreen -+ - FirstPage - LastPage - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch deleted file mode 100644 index f4982ec635..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/xbmc/FileSystem/FileCurl.cpp xbmc-10.1-Dharma.patch/xbmc/FileSystem/FileCurl.cpp ---- xbmc-10.1-Dharma/xbmc/filesystem/FileCurl.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/xbmc/filesystem/FileCurl.cpp 2011-10-17 19:21:04.180783870 +0200 -@@ -803,9 +803,9 @@ - // Detect whether we are "online" or not! Very simple and dirty! - bool CFileCurl::IsInternet(bool checkDNS /* = true */) - { -- CStdString strURL = "http://www.google.com"; -+ CStdString strURL = "http://www.openelec.tv"; - if (!checkDNS) -- strURL = "http://74.125.19.103"; // www.google.com ip -+ strURL = "http://212.101.13.10"; // www.openelec.tv ip - - bool found = Exists(strURL); - Close(); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch deleted file mode 100644 index 85d635b61b..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/Lircmap.xml xbmc-10.1-Dharma.patch/system/Lircmap.xml ---- xbmc-10.1-Dharma/system/Lircmap.xml 2011-06-18 01:43:43.132101246 +0200 -+++ xbmc-10.1-Dharma.patch/system/Lircmap.xml 2011-06-18 01:44:53.777025290 +0200 -@@ -365,7 +365,6 @@ - - - cx23885_remote -- devinput - KEY_LEFT - KEY_RIGHT - KEY_UP -@@ -452,4 +451,59 @@ - yellow - blue - -+ -+ -+ KEY_LEFT -+ KEY_RIGHT -+ KEY_UP -+ KEY_DOWN -+ -+ KEY_ENTER -+ KEY_DELETE -+ KEY_PROG1 -+ KEY_EXIT -+ KEY_RECORD -+ KEY_PLAY -+ KEY_PAUSE -+ KEY_STOP -+ KEY_FASTFORWARD -+ KEY_REWIND -+ KEY_VOLUMEUP -+ KEY_VOLUMEDOWN -+ KEY_CHANNELUP -+ KEY_CHANNELDOWN -+ KEY_NEXT -+ KEY_PREVIOUS -+ KEY_EPG -+ KEY_SUBTITLE -+ KEY_LANGUAGE -+ KEY_INFO -+ KEY_ZOOM -+ KEY_MUTE -+ KEY_POWER -+ KEY_EJECT -+

KEY_DVD -+ KEY_MENU -+ KEY_VIDEO -+ KEY_AUDIO -+ KEY_CAMERA -+ KEY_TUNER -+ KEY_TEXT -+ KEY_NUMERIC_1 -+ KEY_NUMERIC_2 -+ KEY_NUMERIC_3 -+ KEY_NUMERIC_4 -+ KEY_NUMERIC_5 -+ KEY_NUMERIC_6 -+ KEY_NUMERIC_7 -+ KEY_NUMERIC_8 -+ KEY_NUMERIC_9 -+ KEY_NUMERIC_0 -+ KEY_NUMERIC_STAR -+ KEY_NUMERIC_POUND -+ KEY_RED -+ KEY_GREEN -+ KEY_YELLOW -+ KEY_BLUE -+ - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch deleted file mode 100644 index 0a68955141..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch +++ /dev/null @@ -1,1975 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:03:25.176271190 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.1.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:03:25.195271549 +0200 -@@ -2831,6 +2831,7 @@ - Device removed - Keymap to use for this device - Keymap enabled -+ Do not use the custom keymap for this device - - Location - Class -@@ -2845,16 +2846,23 @@ - Press "user" button command - Enable switch side commands - Could not open the adapter -- Power on the TV when starting XBMC -- Power off devices when stopping XBMC -+ Devices to power on the TV when starting XBMC -+ Devices to power off devices when stopping XBMC - Put devices in standby mode when activating screensaver - - Could not detect the CEC port. Set it up manually. -- Could not detect the CEC adapter. -- Unsupported libcec interface version. %d is greater than the version XBMC supports (%d) -+ Could not initialise the CEC adapter. Check your settings. -+ Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) - Put this PC in standby mode when the TV is switched off - HDMI port number - Connected -- Adapter found, but libcec is not available -+ Adapter found, but libCEC is not available - Use the TV's language setting -+ Connected to HDMI device -+ Make XBMC the active source when starting -+ Physical address (overrules HDMI port) -+ COM port (leave empty unless needed) -+ Configuration updated -+ Failed to set the new configuration. Please check your settings. -+ Send 'inactive source' command when stopping XBMC - -diff -Naur xbmc-pvr-11.0.1/lib/libcec/Makefile xbmc-pvr-11.0.1.patch/lib/libcec/Makefile ---- xbmc-pvr-11.0.1/lib/libcec/Makefile 2012-03-27 17:55:40.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/libcec/Makefile 2012-04-17 14:03:25.202271682 +0200 -@@ -7,17 +7,17 @@ - - # lib name, version - LIBNAME=libcec --VERSION=1.2.0 -+VERSION=latest - SOURCE=$(LIBNAME)-$(VERSION) - - # download location and format --BASE_URL=http://mirrors.xbmc.org/build-deps/darwin-libs --ARCHIVE=$(SOURCE).tar.gz -+BASE_URL=http://packages.pulse-eight.net/pulse/sources/libcec -+ARCHIVE=$(SOURCE).tar.bz2 - TARBALLS_LOCATION=. - RETRIEVE_TOOL=/usr/bin/curl - RETRIEVE_TOOL_FLAGS=-Ls --create-dirs --output $(TARBALLS_LOCATION)/$(ARCHIVE) - ARCHIVE_TOOL=tar --ARCHIVE_TOOL_FLAGS=xf -+ARCHIVE_TOOL_FLAGS=jxf - - PREFIX ?= /usr/local - LIBCEC_CONFIGOPTS ?= --prefix=$(PREFIX) -@@ -25,30 +25,30 @@ - # configuration settings - CONFIGURE=./configure CFLAGS=-D_FILE_OFFSET_BITS=64 $(LIBCEC_CONFIGOPTS) - --SO_NAME=$(SOURCE)/.libs/$(LIBNAME).so -+SO_NAME=$(LIBNAME)/.libs/$(LIBNAME).so - - all: $(SO_NAME) - - $(TARBALLS_LOCATION)/$(ARCHIVE): - $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - --$(SOURCE): $(TARBALLS_LOCATION)/$(ARCHIVE) -- rm -rf $(SOURCE) -+$(LIBNAME): $(TARBALLS_LOCATION)/$(ARCHIVE) -+ rm -rf $(LIBNAME) - $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -- echo $(SOURCE) > .gitignore -- cd $(SOURCE); autoreconf -vif -- cd $(SOURCE); $(CONFIGURE) -+ echo $(LIBNAME) > .gitignore -+ cd $(LIBNAME); autoreconf -vif -+ cd $(LIBNAME); $(CONFIGURE) - --$(SO_NAME): $(SOURCE) -- make -j 1 -C $(SOURCE) -+$(SO_NAME): $(LIBNAME) -+ make -j 1 -C $(LIBNAME) - - install: -- make -C $(SOURCE) install -+ make -C $(LIBNAME) install - ldconfig - - clean: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - - distclean:: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:03:25.196271568 +0200 -@@ -1,22 +1,29 @@ - - -- -+ - -- -- -- -- -+ -+ -+ -+ - - -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.cpp xbmc-pvr-11.0.1.patch/xbmc/Application.cpp ---- xbmc-pvr-11.0.1/xbmc/Application.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.cpp 2012-04-17 14:06:37.605914462 +0200 -@@ -160,9 +160,6 @@ - #endif - #include "interfaces/AnnouncementManager.h" - #include "peripherals/Peripherals.h" --#ifdef HAVE_LIBCEC --#include "peripherals/devices/PeripheralCecAdapter.h" --#endif - #include "peripherals/dialogs/GUIDialogPeripheralManager.h" - #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" - -@@ -2618,6 +2615,9 @@ - } - } - -+ if (g_peripherals.OnAction(action)) -+ return true; -+ - if (action.GetID() == ACTION_MUTE) - { - ToggleMute(); -@@ -2893,23 +2893,9 @@ - - bool CApplication::ProcessPeripherals(float frameTime) - { --#ifdef HAVE_LIBCEC -- vector peripherals; -- if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -- { -- for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -- { -- CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -- if (cecDevice && cecDevice->GetButton()) -- { -- CKey key(cecDevice->GetButton(), cecDevice->GetHoldTime()); -- cecDevice->ResetButton(); -- return OnKey(key); -- } -- } -- } --#endif -- -+ CKey key; -+ if (g_peripherals.GetNextKeypress(frameTime, key)) -+ return OnKey(key); - return false; - } - -@@ -3365,7 +3351,8 @@ - { - try - { -- CAnnouncementManager::Announce(System, "xbmc", "OnQuit"); -+ CVariant vExitCode(exitCode); -+ CAnnouncementManager::Announce(System, "xbmc", "OnQuit", vExitCode); - - // cancel any jobs from the jobmanager - CJobManager::GetInstance().CancelJobs(); -@@ -5123,6 +5110,8 @@ - - bool CApplication::IsMuted() const - { -+ if (g_peripherals.IsMuted()) -+ return true; - return g_settings.m_bMute; - } - -@@ -5136,6 +5125,9 @@ - - void CApplication::Mute() - { -+ if (g_peripherals.Mute()) -+ return; -+ - g_settings.m_iPreMuteVolumeLevel = GetVolume(); - SetVolume(0); - g_settings.m_bMute = true; -@@ -5143,6 +5135,9 @@ - - void CApplication::UnMute() - { -+ if (g_peripherals.UnMute()) -+ return; -+ - SetVolume(g_settings.m_iPreMuteVolumeLevel); - g_settings.m_iPreMuteVolumeLevel = 0; - g_settings.m_bMute = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:03:25.211271852 +0200 -@@ -18,8 +18,8 @@ - * http://www.gnu.org/copyleft/gpl.html - * - */ --#include "system.h" - -+#include "system.h" - #if defined(HAVE_LIBCEC) - #include "PeripheralCecAdapter.h" - #include "input/XBIRRemote.h" -@@ -31,36 +31,40 @@ - #include "peripherals/Peripherals.h" - #include "peripherals/bus/PeripheralBus.h" - #include "settings/GUISettings.h" -+#include "settings/Settings.h" - #include "utils/log.h" -+#include "utils/Variant.h" - --#include -+#include - - using namespace PERIPHERALS; - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 1 -+#define CEC_LIB_SUPPORTED_VERSION 0x1500 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -+#define VOLUME_CHANGE_TIMEOUT 250 -+#define VOLUME_REFRESH_TIMEOUT 100 - - class DllLibCECInterface - { - public: - virtual ~DllLibCECInterface() {} -- virtual ICECAdapter* CECInit(const char *interfaceName, cec_device_type_list types)=0; -- virtual void* CECDestroy(ICECAdapter *adapter)=0; -+ virtual ICECAdapter* CECInitialise(libcec_configuration *configuration)=0; -+ virtual void* CECDestroy(ICECAdapter *adapter)=0; - }; - - class DllLibCEC : public DllDynamic, DllLibCECInterface - { - DECLARE_DLL_WRAPPER(DllLibCEC, DLL_PATH_LIBCEC) - -- DEFINE_METHOD2(ICECAdapter*, CECInit, (const char *p1, cec_device_type_list p2)) -- DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) -+ DEFINE_METHOD1(ICECAdapter*, CECInitialise, (libcec_configuration *p1)) -+ DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) - - BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD_RENAME(CECInit, CECInit) -+ RESOLVE_METHOD_RENAME(CECInitialise, CECInitialise) - RESOLVE_METHOD_RENAME(CECDestroy, CECDestroy) - END_METHOD_RESOLVE() - }; -@@ -71,41 +75,19 @@ - m_bStarted(false), - m_bHasButton(false), - m_bIsReady(false), -+ m_bHasConnectedAudioSystem(false), - m_strMenuLanguage("???"), -- m_lastKeypress(0) -+ m_lastKeypress(0), -+ m_lastChange(VOLUME_CHANGE_NONE), -+ m_iExitCode(0), -+ m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC - { - m_button.iButton = 0; - m_button.iDuration = 0; - m_screensaverLastActivated.SetValid(false); -- m_dll = new DllLibCEC; -- if (m_dll->Load() && m_dll->IsLoaded()) -- { -- cec_device_type_list typeList; -- typeList.clear(); -- typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE); -- m_cecAdapter = m_dll->CECInit("XBMC", typeList); -- } -- else -- m_cecAdapter = NULL; -- -- if (!m_cecAdapter || m_cecAdapter->GetMinLibVersion() > CEC_LIB_SUPPORTED_VERSION) -- { -- /* unsupported libcec version */ -- CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); - -- CStdString strMessage; -- strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -- m_bError = true; -- if (m_cecAdapter) -- m_dll->CECDestroy(m_cecAdapter); -- m_cecAdapter = NULL; -- } -- else -- { -- CLog::Log(LOGDEBUG, "%s - using libCEC v%d.%d", __FUNCTION__, m_cecAdapter->GetLibVersionMajor(), m_cecAdapter->GetLibVersionMinor()); -- m_features.push_back(FEATURE_CEC); -- } -+ m_configuration.Clear(); -+ m_features.push_back(FEATURE_CEC); - } - - CPeripheralCecAdapter::~CPeripheralCecAdapter(void) -@@ -117,7 +99,6 @@ - - if (m_dll && m_cecAdapter) - { -- FlushLog(); - m_dll->CECDestroy(m_cecAdapter); - m_cecAdapter = NULL; - delete m_dll; -@@ -129,60 +110,94 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_cecAdapter->SetInactiveView(); -- if (GetSettingBool("cec_power_off_shutdown")) -- m_cecAdapter->StandbyDevices(); -+ m_iExitCode = data.asInteger(0); -+ StopThread(false); - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && GetSettingBool("cec_standby_screensaver") && m_bIsReady) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) - { -- m_cecAdapter->PowerOnDevices(); -+ if (m_configuration.bPowerOffScreensaver == 1) -+ { -+ // power off/on on screensaver is set, and devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); -+ } - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && GetSettingBool("cec_standby_screensaver")) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && m_bIsReady) - { - // Don't put devices to standby if application is currently playing -- if (!g_application.IsPlaying() || g_application.IsPaused()) -+ if ((!g_application.IsPlaying() || g_application.IsPaused()) && m_configuration.bPowerOffScreensaver == 1) - { - m_screensaverLastActivated = CDateTime::GetCurrentDateTime(); -- m_cecAdapter->StandbyDevices(); -+ // only power off when we're the active source -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ m_cecAdapter->StandbyDevices(CECDEVICE_BROADCAST); - } - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { -- if (GetSettingBool("cec_power_off_shutdown") && m_bIsReady) -- m_cecAdapter->StandbyDevices(); -+ // this will also power off devices when we're the active source - CSingleLock lock(m_critSection); - m_bStop = true; - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -+ // reconnect to the device - CSingleLock lock(m_critSection); - CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ -+ // close the previous connection - m_cecAdapter->Close(); - -- CStdString strPort = GetComPort(); -- if (!strPort.empty()) -- { -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__); -- FlushLog(); -- m_bStop = true; -- } -- else -- { -- if (GetSettingBool("cec_power_on_startup")) -- PowerOnCecDevices(CECDEVICE_TV); -- m_cecAdapter->SetActiveView(); -- } -- } -+ // and open a new one -+ m_bStop = false; -+ Create(); - } - } - - bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature) - { -- if (feature == FEATURE_CEC && !m_bStarted) -+ if (feature == FEATURE_CEC && !m_bStarted && GetSettingBool("enabled")) - { -+ SetConfigurationFromSettings(); -+ m_callbacks.CBCecLogMessage = &CecLogMessage; -+ m_callbacks.CBCecKeyPress = &CecKeyPress; -+ m_callbacks.CBCecCommand = &CecCommand; -+ m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_configuration.callbackParam = this; -+ m_configuration.callbacks = &m_callbacks; -+ -+ m_dll = new DllLibCEC; -+ if (m_dll->Load() && m_dll->IsLoaded()) -+ m_cecAdapter = m_dll->CECInitialise(&m_configuration); -+ else -+ return false; -+ -+ if (m_configuration.serverVersion < CEC_LIB_SUPPORTED_VERSION) -+ { -+ /* unsupported libcec version */ -+ CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ -+ CStdString strMessage; -+ strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -+ m_bError = true; -+ if (m_cecAdapter) -+ m_dll->CECDestroy(m_cecAdapter); -+ m_cecAdapter = NULL; -+ -+ m_features.clear(); -+ return false; -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ } -+ - m_bStarted = true; - Create(); - } -@@ -221,23 +236,20 @@ - return strPort; - } - --void CPeripheralCecAdapter::Process(void) -+bool CPeripheralCecAdapter::OpenConnection(void) - { -+ bool bIsOpen(false); -+ - if (!GetSettingBool("enabled")) - { - CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__); - m_bStarted = false; -- return; -+ return bIsOpen; - } - - CStdString strPort = GetComPort(); - if (strPort.empty()) -- return; -- -- // set correct physical address from peripheral settings -- int iHdmiPort = GetSettingInt("cec_hdmi_port"); -- SetHdmiPort(iHdmiPort); -- FlushLog(); -+ return bIsOpen; - - // open the CEC adapter - CLog::Log(LOGDEBUG, "%s - opening a connection to the CEC adapter: %s", __FUNCTION__, strPort.c_str()); -@@ -247,100 +259,221 @@ - strMessage.Format(g_localizeStrings.Get(21336), g_localizeStrings.Get(36000)); - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strMessage); - -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- FlushLog(); -- CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -- m_bStarted = false; -- return; -- } -+ bool bConnectionFailedDisplayed(false); - -- CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -- m_bIsReady = true; -- CAnnouncementManager::AddAnnouncer(this); -- -- if (GetSettingBool("cec_power_on_startup")) -+ while (!m_bStop && !bIsOpen) - { -- PowerOnCecDevices(CECDEVICE_TV); -- FlushLog(); -+ if ((bIsOpen = m_cecAdapter->Open(strPort.c_str(), 10000)) == false) -+ { -+ CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -+ if (!bConnectionFailedDisplayed) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -+ bConnectionFailedDisplayed = true; -+ -+ Sleep(10000); -+ } - } - -- if (GetSettingBool("use_tv_menu_language")) -+ if (bIsOpen) - { -- cec_menu_language language; -- if (m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -- SetMenuLanguage(language.language); -+ CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -+ -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); - } - -- m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(36016)); -+ return bIsOpen; -+} -+ -+void CPeripheralCecAdapter::Process(void) -+{ -+ if (!OpenConnection()) -+ return; -+ -+ CAnnouncementManager::AddAnnouncer(this); -+ -+ m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -+ m_queryThread->Create(false); - - while (!m_bStop) - { -- FlushLog(); - if (!m_bStop) -- ProcessNextCommand(); -+ ProcessVolumeChange(); -+ - if (!m_bStop) - Sleep(5); - } - -+ delete m_queryThread; -+ -+ if (m_iExitCode != EXITCODE_REBOOT) -+ { -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ { -+ if (!m_configuration.powerOffDevices.IsEmpty()) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending standby commands", __FUNCTION__); -+ m_cecAdapter->StandbyDevices(); -+ } -+ else if (m_configuration.bSendInactiveSource == 1) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__); -+ m_cecAdapter->SetInactiveView(); -+ } -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - XBMC is not the active source, not sending any standby commands", __FUNCTION__); -+ } -+ } -+ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); - m_bStarted = false; - } - --bool CPeripheralCecAdapter::PowerOnCecDevices(cec_logical_address iLogicalAddress) -+bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) - { -- bool bReturn(false); -+ CSingleLock lock(m_critSection); -+ return m_bHasConnectedAudioSystem; -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::SetAudioSystemConnected(bool bSetTo) -+{ -+ CSingleLock lock(m_critSection); -+ m_bHasConnectedAudioSystem = bSetTo; -+} -+ -+void CPeripheralCecAdapter::ScheduleVolumeUp(void) -+{ - { -- CLog::Log(LOGDEBUG, "%s - powering on CEC capable device with address %1x", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->PowerOnDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+ Sleep(5); -+} - -- return bReturn; -+void CPeripheralCecAdapter::ScheduleVolumeDown(void) -+{ -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } -+ Sleep(5); - } - --bool CPeripheralCecAdapter::StandbyCecDevices(cec_logical_address iLogicalAddress) -+void CPeripheralCecAdapter::ScheduleMute(void) - { -- bool bReturn(false); -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); -+ } -+ Sleep(5); -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::ProcessVolumeChange(void) -+{ -+ bool bSendRelease(false); -+ CecVolumeChange pendingVolumeChange = VOLUME_CHANGE_NONE; - { -- CLog::Log(LOGDEBUG, "%s - putting CEC capable devices with address %1x in standby mode", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->StandbyDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ if (m_volumeChangeQueue.size() > 0) -+ { -+ /* get the first change from the queue */ -+ pendingVolumeChange = m_volumeChangeQueue.front(); -+ m_volumeChangeQueue.pop(); -+ -+ /* remove all dupe entries */ -+ while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange) -+ m_volumeChangeQueue.pop(); -+ -+ /* send another keypress after VOLUME_REFRESH_TIMEOUT ms */ -+ bool bRefresh(m_lastKeypress + VOLUME_REFRESH_TIMEOUT < XbmcThreads::SystemClockMillis()); -+ -+ /* only send the keypress when it hasn't been sent yet */ -+ if (pendingVolumeChange != m_lastChange) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ m_lastChange = pendingVolumeChange; -+ } -+ else if (bRefresh) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ pendingVolumeChange = m_lastChange; -+ } -+ else -+ pendingVolumeChange = VOLUME_CHANGE_NONE; -+ } -+ else if (m_lastKeypress > 0 && m_lastKeypress + VOLUME_CHANGE_TIMEOUT < XbmcThreads::SystemClockMillis()) -+ { -+ /* send a key release */ -+ m_lastKeypress = 0; -+ bSendRelease = true; -+ m_lastChange = VOLUME_CHANGE_NONE; -+ } - } - -- return bReturn; -+ switch (pendingVolumeChange) -+ { -+ case VOLUME_CHANGE_UP: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_UP, false); -+ break; -+ case VOLUME_CHANGE_DOWN: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_DOWN, false); -+ break; -+ case VOLUME_CHANGE_MUTE: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_MUTE, false); -+ { -+ CSingleLock lock(m_critSection); -+ m_bIsMuted = !m_bIsMuted; -+ } -+ break; -+ case VOLUME_CHANGE_NONE: -+ if (bSendRelease) -+ m_cecAdapter->SendKeyRelease(CECDEVICE_AUDIOSYSTEM, false); -+ break; -+ } - } - --bool CPeripheralCecAdapter::SendPing(void) -+void CPeripheralCecAdapter::VolumeUp(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- CLog::Log(LOGDEBUG, "%s - sending ping to the CEC adapter", __FUNCTION__); -- bReturn = m_cecAdapter->PingAdapter(); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+} - -- return bReturn; -+void CPeripheralCecAdapter::VolumeDown(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } - } - --bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort) -+void CPeripheralCecAdapter::Mute(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- if (iHdmiPort <= 0 || iHdmiPort > 16) -- iHdmiPort = 1; -- CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d", __FUNCTION__, iHdmiPort); -- bReturn = m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); - } -+} - -- return bReturn; -+bool CPeripheralCecAdapter::IsMuted(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ return m_bIsMuted; -+ } -+ return false; - } - - void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage) -@@ -404,10 +537,13 @@ - CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage); - } - --void CPeripheralCecAdapter::ProcessNextCommand(void) -+int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command &command) - { -- cec_command command; -- if (m_cecAdapter && m_bIsReady && m_cecAdapter->GetNextCommand(&command)) -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ if (adapter->m_bIsReady) - { - CLog::Log(LOGDEBUG, "%s - processing command: initiator=%1x destination=%1x opcode=%02x", __FUNCTION__, command.initiator, command.destination, command.opcode); - -@@ -416,21 +552,21 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && GetSettingBool("standby_pc_on_tv_standby") && -- (!m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) -+ if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { -- m_bStarted = false; -+ adapter->m_bStarted = false; - g_application.getApplicationMessenger().Suspend(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -- if (GetSettingBool("use_tv_menu_language") && command.initiator == CECDEVICE_TV && command.parameters.size == 3) -+ if (adapter->m_configuration.bUseTVMenuLanguage == 1 && command.initiator == CECDEVICE_TV && command.parameters.size == 3) - { - char strNewLanguage[4]; - for (int iPtr = 0; iPtr < 3; iPtr++) - strNewLanguage[iPtr] = command.parameters[iPtr]; - strNewLanguage[3] = 0; -- SetMenuLanguage(strNewLanguage); -+ adapter->SetMenuLanguage(strNewLanguage); - } - break; - case CEC_OPCODE_DECK_CONTROL: -@@ -438,11 +574,11 @@ - command.parameters.size == 1 && - command.parameters[0] == CEC_DECK_CONTROL_MODE_STOP) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_STOP; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - break; - case CEC_OPCODE_PLAY: -@@ -451,26 +587,58 @@ - { - if (command.parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PLAY; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - else if (command.parameters[0] == CEC_PLAY_MODE_PLAY_STILL) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PAUSE; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - } - break; -+ case CEC_OPCODE_REPORT_POWER_STATUS: -+ if (command.initiator == CECDEVICE_TV && -+ command.parameters.size == 1 && -+ command.parameters[0] == CEC_POWER_STATUS_ON && -+ adapter->m_queryThread) -+ { -+ adapter->m_queryThread->Signal(); -+ } -+ break; - default: - break; - } - } -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration &config) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->SetConfigurationFromLibCEC(config); -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->m_buttonQueue.push(key); -+ return 1; - } - - bool CPeripheralCecAdapter::GetNextCecKey(cec_keypress &key) -@@ -483,10 +651,6 @@ - m_buttonQueue.pop(); - bReturn = true; - } -- else if (m_cecAdapter->GetNextKeypress(&key)) -- { -- bReturn = true; -- } - - return bReturn; - } -@@ -726,41 +890,43 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else if (strChangedSetting.Equals("cec_hdmi_port")) -+ else - { -- SetHdmiPort(GetSettingInt("cec_hdmi_port")); -+ SetConfigurationFromSettings(); -+ m_queryThread->UpdateConfiguration(&m_configuration); - } - } - --void CPeripheralCecAdapter::FlushLog(void) -+int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) - { -- cec_log_message message; -- while (m_cecAdapter && m_cecAdapter->GetNextLogMessage(&message)) -- { -- int iLevel = -1; -- switch (message.level) -- { -- case CEC_LOG_ERROR: -- iLevel = LOGERROR; -- break; -- case CEC_LOG_WARNING: -- iLevel = LOGWARNING; -- break; -- case CEC_LOG_NOTICE: -- iLevel = LOGDEBUG; -- break; -- case CEC_LOG_TRAFFIC: -- case CEC_LOG_DEBUG: -- if (GetSettingBool("cec_debug_logging")) -- iLevel = LOGDEBUG; -- break; -- default: -- break; -- } -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; - -- if (iLevel >= 0) -- CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ int iLevel = -1; -+ switch (message.level) -+ { -+ case CEC_LOG_ERROR: -+ iLevel = LOGERROR; -+ break; -+ case CEC_LOG_WARNING: -+ iLevel = LOGWARNING; -+ break; -+ case CEC_LOG_NOTICE: -+ iLevel = LOGDEBUG; -+ break; -+ case CEC_LOG_TRAFFIC: -+ case CEC_LOG_DEBUG: -+ iLevel = LOGDEBUG; -+ break; -+ default: -+ break; - } -+ -+ if (iLevel >= 0) -+ CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ -+ return 1; - } - - bool CPeripheralCecAdapter::TranslateComPort(CStdString &strLocation) -@@ -774,4 +940,301 @@ - - return false; - } -+ -+void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configuration &config) -+{ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ m_configuration.deviceTypes.Add(config.deviceTypes[0]); -+ SetSetting("device_type", (int)config.deviceTypes[0]); -+ -+ // set the connected device -+ m_configuration.baseDevice = config.baseDevice; -+ SetSetting("connected_device", (int)config.baseDevice); -+ -+ // set the HDMI port number -+ m_configuration.iHDMIPort = config.iHDMIPort; -+ SetSetting("cec_hdmi_port", config.iHDMIPort); -+ -+ // set the physical address, when baseDevice or iHDMIPort are not set -+ if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ { -+ m_configuration.iPhysicalAddress = config.iPhysicalAddress; -+ CStdString strPhysicalAddress; -+ strPhysicalAddress.Format("%x", config.iPhysicalAddress); -+ SetSetting("physical_address", strPhysicalAddress); -+ } -+ -+ // set the tv vendor override -+ m_configuration.tvVendor = config.tvVendor; -+ SetSetting("tv_vendor", (int)config.tvVendor); -+ -+ // set the devices to wake when starting -+ m_configuration.wakeDevices = config.wakeDevices; -+ CStdString strWakeDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.wakeDevices[iPtr]) -+ strWakeDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strWakeDevices.Trim()); -+ -+ // set the devices to power off when stopping -+ m_configuration.powerOffDevices = config.powerOffDevices; -+ CStdString strPowerOffDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.powerOffDevices[iPtr]) -+ strPowerOffDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ -+ // set the boolean settings -+ m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -+ SetSetting("use_tv_menu_language", m_configuration.bUseTVMenuLanguage == 1); -+ -+ m_configuration.bActivateSource = config.bActivateSource; -+ SetSetting("activate_source", m_configuration.bActivateSource == 1); -+ -+ m_configuration.bPowerOffScreensaver = config.bPowerOffScreensaver; -+ SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); -+ -+ m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -+ SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) -+ m_configuration.bSendInactiveSource = config.bSendInactiveSource; -+ SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+} -+ -+void CPeripheralCecAdapter::SetConfigurationFromSettings(void) -+{ -+ // client version 1.5.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ -+ // device name 'XBMC' -+ snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -+ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ int iDeviceType = GetSettingInt("device_type"); -+ if (iDeviceType != (int)CEC_DEVICE_TYPE_RECORDING_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_PLAYBACK_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_TUNER) -+ iDeviceType = (int)CEC_DEVICE_TYPE_RECORDING_DEVICE; -+ m_configuration.deviceTypes.Add((cec_device_type)iDeviceType); -+ -+ // always try to autodetect the address. -+ // when the firmware supports this, it will override the physical address, connected device and hdmi port settings -+ m_configuration.bAutodetectAddress = 1; -+ -+ // set the physical address -+ // when set, it will override the connected device and hdmi port settings -+ CStdString strPhysicalAddress = GetSettingString("physical_address"); -+ int iPhysicalAddress; -+ if (sscanf(strPhysicalAddress.c_str(), "%x", &iPhysicalAddress) == 1 && iPhysicalAddress > 0 && iPhysicalAddress < 0xFFFF) -+ m_configuration.iPhysicalAddress = iPhysicalAddress; -+ -+ // set the connected device -+ int iConnectedDevice = GetSettingInt("connected_device"); -+ if (iConnectedDevice == 0 || iConnectedDevice == 5) -+ m_configuration.baseDevice = (cec_logical_address)iConnectedDevice; -+ -+ // set the HDMI port number -+ int iHDMIPort = GetSettingInt("cec_hdmi_port"); -+ if (iHDMIPort >= 0 && iHDMIPort <= 4) -+ m_configuration.iHDMIPort = iHDMIPort; -+ -+ // set the tv vendor override -+ int iVendor = GetSettingInt("tv_vendor"); -+ if (iVendor > 0 && iVendor < 0xFFFFFF) -+ m_configuration.tvVendor = iVendor; -+ -+ // read the devices to wake when starting -+ CStdString strWakeDevices = CStdString(GetSettingString("wake_devices")).Trim(); -+ m_configuration.wakeDevices.Clear(); -+ ReadLogicalAddresses(strWakeDevices, m_configuration.wakeDevices); -+ -+ // read the devices to power off when stopping -+ CStdString strStandbyDevices = CStdString(GetSettingString("standby_devices")).Trim(); -+ m_configuration.powerOffDevices.Clear(); -+ ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); -+ -+ // always get the settings from the rom, when supported by the firmware -+ m_configuration.bGetSettingsFromROM = 1; -+ -+ // read the boolean settings -+ m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; -+ m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; -+ m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -+ m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; -+ m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+} -+ -+void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -+{ -+ for (size_t iPtr = 0; iPtr < strString.size(); iPtr++) -+ { -+ CStdString strDevice = CStdString(strString.substr(iPtr, 1)).Trim(); -+ if (!strDevice.IsEmpty()) -+ { -+ int iDevice(0); -+ if (sscanf(strDevice.c_str(), "%x", &iDevice) == 1 && iDevice >= 0 && iDevice <= 0xF) -+ addresses.Set((cec_logical_address)iDevice); -+ } -+ } -+} -+ -+CPeripheralCecAdapterUpdateThread::CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, libcec_configuration *configuration) : -+ CThread("CEC Adapter Update Thread"), -+ m_adapter(adapter), -+ m_configuration(*configuration), -+ m_bNextConfigurationScheduled(false), -+ m_bIsUpdating(true) -+{ -+ m_nextConfiguration.Clear(); -+ m_event.Reset(); -+} -+ -+CPeripheralCecAdapterUpdateThread::~CPeripheralCecAdapterUpdateThread(void) -+{ -+ StopThread(false); -+ m_event.Set(); -+ StopThread(true); -+} -+ -+void CPeripheralCecAdapterUpdateThread::Signal(void) -+{ -+ m_event.Set(); -+} -+ -+bool CPeripheralCecAdapterUpdateThread::UpdateConfiguration(libcec_configuration *configuration) -+{ -+ CSingleLock lock(m_critSection); -+ if (m_bIsUpdating) -+ { -+ m_bNextConfigurationScheduled = true; -+ m_nextConfiguration = *configuration; -+ } -+ else -+ { -+ m_configuration = *configuration; -+ m_event.Set(); -+ } -+ return true; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::WaitReady(void) -+{ -+ // don't wait if we're not powering up anything -+ if (m_configuration.wakeDevices.IsEmpty() && m_configuration.bActivateSource == 0) -+ return true; -+ -+ // wait for the TV if we're configured to become the active source. -+ // wait for the first device in the wake list otherwise. -+ cec_logical_address waitFor = (m_configuration.bActivateSource == 1) ? -+ CECDEVICE_TV : -+ m_configuration.wakeDevices.primary; -+ -+ cec_power_status powerStatus(CEC_POWER_STATUS_UNKNOWN); -+ bool bContinue(true); -+ while (bContinue && !m_adapter->m_bStop && !m_bStop && powerStatus != CEC_POWER_STATUS_ON) -+ { -+ powerStatus = m_adapter->m_cecAdapter->GetDevicePowerStatus(waitFor); -+ if (powerStatus != CEC_POWER_STATUS_ON) -+ bContinue = !m_event.WaitMSec(1000); -+ } -+ -+ return powerStatus == CEC_POWER_STATUS_ON; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::SetInitialConfiguration(void) -+{ -+ // devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_adapter->m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_adapter->m_cecAdapter->SetActiveSource(); -+ -+ // wait until devices are powered up -+ if (!WaitReady()) -+ return false; -+ -+ // request the menu language of the TV -+ if (m_configuration.bUseTVMenuLanguage == 1) -+ { -+ cec_menu_language language; -+ if (m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -+ m_adapter->SetMenuLanguage(language.language); -+ } -+ -+ // request the OSD name of the TV -+ CStdString strNotification; -+ cec_osd_name tvName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV); -+ strNotification.Format("%s: %s", g_localizeStrings.Get(36016), tvName.name); -+ -+ /* disable the mute setting when an amp is found, because the amp handles the mute setting and -+ set PCM output to 100% */ -+ if (m_adapter->m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM)) -+ { -+ // request the OSD name of the amp -+ cec_osd_name ampName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM); -+ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name); -+ strNotification.AppendFormat(" - %s", ampName.name); -+ -+ // set amp present -+ m_adapter->SetAudioSystemConnected(true); -+ g_settings.m_bMute = false; -+ g_settings.m_nVolumeLevel = VOLUME_MAXIMUM; -+ } -+ -+ m_adapter->m_bIsReady = true; -+ -+ // try to send an OSD string to the TV -+ m_adapter->m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -+ // and let the gui know that we're done -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strNotification); -+ -+ CSingleLock lock(m_critSection); -+ m_bIsUpdating = false; -+ return true; -+} -+ -+void CPeripheralCecAdapterUpdateThread::Process(void) -+{ -+ // set the initial configuration -+ if (!SetInitialConfiguration()) -+ return; -+ -+ // and wait for updates -+ bool bUpdate(false); -+ while (!m_bStop) -+ { -+ // update received -+ if (m_event.WaitMSec(500) || bUpdate) -+ { -+ if (m_bStop) -+ return; -+ // set the new configuration -+ bool bConfigSet(m_adapter->m_cecAdapter->SetConfiguration(&m_configuration)); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(bConfigSet ? 36023 : 36024)); -+ { -+ CSingleLock lock(m_critSection); -+ bUpdate = m_bNextConfigurationScheduled; -+ if (bUpdate) -+ { -+ // another update is scheduled -+ m_bNextConfigurationScheduled = false; -+ m_configuration = m_nextConfiguration; -+ } -+ else -+ { -+ // nothing left to do, wait for updates -+ m_bIsUpdating = false; -+ m_event.Reset(); -+ } -+ } -+ } -+ } -+} -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:05:05.882177854 +0200 -@@ -20,7 +20,28 @@ - * - */ - --#if defined(HAVE_LIBCEC) -+#if !defined(HAVE_LIBCEC) -+#include "Peripheral.h" -+ -+// an empty implementation, so CPeripherals can be compiled without a bunch of #ifdef's when libCEC is not available -+namespace PERIPHERALS -+{ -+ class CPeripheralCecAdapter : public CPeripheral -+ { -+ public: -+ bool HasConnectedAudioSystem(void) { return false; } -+ void ScheduleVolumeUp(void) {} -+ void ScheduleVolumeDown(void) {} -+ bool IsMuted(void) { return false; } -+ void ScheduleMute(void) {} -+ -+ WORD GetButton(void) { return 0; } -+ unsigned int GetHoldTime(void) { return 0; } -+ void ResetButton(void) {} -+ }; -+} -+ -+#else - - #include "PeripheralHID.h" - #include "interfaces/AnnouncementManager.h" -@@ -32,7 +53,7 @@ - #ifdef isset - #undef isset - #endif --#include -+#include - - class DllLibCEC; - -@@ -43,25 +64,40 @@ - - namespace PERIPHERALS - { -+ class CPeripheralCecAdapterUpdateThread; -+ - typedef struct - { - WORD iButton; - unsigned int iDuration; - } CecButtonPress; - -+ typedef enum -+ { -+ VOLUME_CHANGE_NONE, -+ VOLUME_CHANGE_UP, -+ VOLUME_CHANGE_DOWN, -+ VOLUME_CHANGE_MUTE -+ } CecVolumeChange; - - class CPeripheralCecAdapter : public CPeripheralHID, public ANNOUNCEMENT::IAnnouncer, private CThread - { -+ friend class CPeripheralCecAdapterUpdateThread; -+ - public: - CPeripheralCecAdapter(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId); - virtual ~CPeripheralCecAdapter(void); - - virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); -- virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress); -- virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress); -- -- virtual bool SendPing(void); -- virtual bool SetHdmiPort(int iHdmiPort); -+ virtual bool HasConnectedAudioSystem(void); -+ virtual void SetAudioSystemConnected(bool bSetTo); -+ virtual void ScheduleVolumeUp(void); -+ virtual void VolumeUp(void); -+ virtual void ScheduleVolumeDown(void); -+ virtual void VolumeDown(void); -+ virtual void ScheduleMute(void); -+ virtual void Mute(void); -+ virtual bool IsMuted(void); - - virtual void OnSettingChanged(const CStdString &strChangedSetting); - -@@ -71,27 +107,66 @@ - virtual CStdString GetComPort(void); - - protected: -- virtual void FlushLog(void); -- virtual bool GetNextCecKey(CEC::cec_keypress &key); -+ virtual bool OpenConnection(void); -+ virtual void SetConfigurationFromSettings(void); -+ virtual void SetConfigurationFromLibCEC(const CEC::libcec_configuration &config); -+ static void ReadLogicalAddresses(const CStdString &strString, CEC::cec_logical_addresses &addresses); -+ static int CecKeyPress(void *cbParam, const CEC::cec_keypress &key); -+ static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); -+ static int CecCommand(void *cbParam, const CEC::cec_command &command); -+ static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ - virtual bool GetNextKey(void); -+ virtual bool GetNextCecKey(CEC::cec_keypress &key); - virtual bool InitialiseFeature(const PeripheralFeature feature); - virtual void Process(void); -- virtual void ProcessNextCommand(void); -+ virtual void ProcessVolumeChange(void); - virtual void SetMenuLanguage(const char *strLanguage); - static bool FindConfigLocation(CStdString &strString); - static bool TranslateComPort(CStdString &strPort); - -- DllLibCEC* m_dll; -- CEC::ICECAdapter* m_cecAdapter; -- bool m_bStarted; -- bool m_bHasButton; -- bool m_bIsReady; -- CStdString m_strMenuLanguage; -- CDateTime m_screensaverLastActivated; -- CecButtonPress m_button; -- std::queue m_buttonQueue; -- unsigned int m_lastKeypress; -- CCriticalSection m_critSection; -+ DllLibCEC* m_dll; -+ CEC::ICECAdapter* m_cecAdapter; -+ bool m_bStarted; -+ bool m_bHasButton; -+ bool m_bIsReady; -+ bool m_bHasConnectedAudioSystem; -+ CStdString m_strMenuLanguage; -+ CDateTime m_screensaverLastActivated; -+ CecButtonPress m_button; -+ std::queue m_buttonQueue; -+ std::queue m_volumeChangeQueue; -+ unsigned int m_lastKeypress; -+ CecVolumeChange m_lastChange; -+ int m_iExitCode; -+ bool m_bIsMuted; -+ CPeripheralCecAdapterUpdateThread*m_queryThread; -+ CEC::ICECCallbacks m_callbacks; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ }; -+ -+ class CPeripheralCecAdapterUpdateThread : public CThread -+ { -+ public: -+ CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, CEC::libcec_configuration *configuration); -+ virtual ~CPeripheralCecAdapterUpdateThread(void); -+ -+ virtual void Signal(void); -+ virtual bool UpdateConfiguration(CEC::libcec_configuration *configuration); -+ -+ protected: -+ virtual bool WaitReady(void); -+ virtual bool SetInitialConfiguration(void); -+ virtual void Process(void); -+ -+ CPeripheralCecAdapter * m_adapter; -+ CEvent m_event; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ CEC::libcec_configuration m_nextConfiguration; -+ bool m_bNextConfigurationScheduled; -+ bool m_bIsUpdating; - }; - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:03:25.174271152 +0200 -@@ -30,6 +30,14 @@ - using namespace PERIPHERALS; - using namespace std; - -+struct SortBySettingsOrder -+{ -+ bool operator()(const CSetting *left, const CSetting *right) -+ { -+ return left->GetOrder() < right->GetOrder(); -+ } -+}; -+ - CPeripheral::CPeripheral(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId) : - m_type(type), - m_busType(busType), -@@ -168,6 +176,15 @@ - return m_subDevices.size() > 0; - } - -+vector CPeripheral::GetSettings(void) const -+{ -+ vector settings; -+ for (map::const_iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ settings.push_back(it->second); -+ sort(settings.begin(), settings.end(), SortBySettingsOrder()); -+ return settings; -+} -+ - void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) - { - if (!setting) -@@ -183,7 +200,7 @@ - case SETTINGS_TYPE_BOOL: - { - const CSettingBool *mappedSetting = (const CSettingBool *) setting; -- CSettingBool *boolSetting = new CSettingBool(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); -+ CSettingBool *boolSetting = new CSettingBool(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); - if (boolSetting) - { - boolSetting->SetVisible(mappedSetting->IsVisible()); -@@ -194,7 +211,7 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -@@ -205,7 +222,7 @@ - case SETTINGS_TYPE_FLOAT: - { - const CSettingFloat *mappedSetting = (const CSettingFloat *) setting; -- CSettingFloat *floatSetting = new CSettingFloat(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); -+ CSettingFloat *floatSetting = new CSettingFloat(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); - if (floatSetting) - { - floatSetting->SetVisible(mappedSetting->IsVisible()); -@@ -216,7 +233,7 @@ - case SETTINGS_TYPE_STRING: - { - const CSettingString *mappedSetting = (const CSettingString *) setting; -- CSettingString *stringSetting = new CSettingString(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); -+ CSettingString *stringSetting = new CSettingString(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); - if (stringSetting) - { - stringSetting->SetVisible(mappedSetting->IsVisible()); -@@ -323,7 +340,7 @@ - bool bChanged(boolSetting->GetData() != bValue); - boolSetting->SetData(bValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -339,7 +356,7 @@ - bool bChanged(intSetting->GetData() != iValue); - intSetting->SetData(iValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -355,11 +372,26 @@ - bool bChanged(floatSetting->GetData() != fValue); - floatSetting->SetData(fValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } - -+void CPeripheral::SetSettingVisible(const CStdString &strKey, bool bSetTo) -+{ -+ map::iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ (*it).second->SetVisible(bSetTo); -+} -+ -+bool CPeripheral::IsSettingVisible(const CStdString &strKey) const -+{ -+ map::const_iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ return (*it).second->IsVisible(); -+ return false; -+} -+ - void CPeripheral::SetSetting(const CStdString &strKey, const CStdString &strValue) - { - map::iterator it = m_settings.find(strKey); -@@ -373,7 +405,7 @@ - bool bChanged(!stringSetting->GetData().Equals(strValue)); - stringSetting->SetData(strValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - else if ((*it).second->GetType() == SETTINGS_TYPE_INT) -@@ -436,7 +468,7 @@ - - if (!bExiting) - { -- for (vector::iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) -+ for (set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) - OnSettingChanged(*it); - } - m_changedSettings.clear(); -@@ -467,7 +499,7 @@ - map::iterator it = m_settings.begin(); - while (it != m_settings.end()) - { -- m_changedSettings.push_back((*it).first); -+ m_changedSettings.insert((*it).first); - ++it; - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:03:25.174271152 +0200 -@@ -20,7 +20,7 @@ - * - */ - --#include -+#include - #include "utils/StdString.h" - #include "peripherals/PeripheralTypes.h" - -@@ -128,6 +128,8 @@ - */ - virtual const CStdString GetSettingString(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, const CStdString &strValue); -+ virtual void SetSettingVisible(const CStdString &strKey, bool bSetTo); -+ virtual bool IsSettingVisible(const CStdString &strKey) const; - - virtual int GetSettingInt(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, int iValue); -@@ -142,6 +144,8 @@ - virtual void LoadPersistedSettings(void); - virtual void ResetDefaultSettings(void); - -+ virtual std::vector GetSettings(void) const; -+ - virtual bool ErrorOccured(void) const { return m_bError; } - - protected: -@@ -163,6 +167,6 @@ - std::vector m_features; - std::vector m_subDevices; - std::map m_settings; -- std::vector m_changedSettings; -+ std::set m_changedSettings; - }; - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp 2012-04-17 14:03:25.173271133 +0200 -@@ -37,7 +37,7 @@ - - CPeripheralHID::~CPeripheralHID(void) - { -- if (!m_strKeymap.IsEmpty() && GetSettingBool("keymap_enabled")) -+ if (!m_strKeymap.IsEmpty() && !GetSettingBool("do_not_use_custom_keymap")) - { - CLog::Log(LOGDEBUG, "%s - switching active keymapping to: default", __FUNCTION__); - CButtonTranslator::GetInstance().RemoveDevice(m_strKeymap); -@@ -59,9 +59,12 @@ - SetSetting("keymap", m_strKeymap); - } - -+ if (!IsSettingVisible("keymap")) -+ SetSettingVisible("do_not_use_custom_keymap", false); -+ - if (!m_strKeymap.IsEmpty()) - { -- bool bKeymapEnabled(GetSettingBool("keymap_enabled")); -+ bool bKeymapEnabled(!GetSettingBool("do_not_use_custom_keymap")); - if (bKeymapEnabled) - { - CLog::Log(LOGDEBUG, "%s - adding keymapping for: %s", __FUNCTION__, m_strKeymap.c_str()); -@@ -82,7 +85,7 @@ - - void CPeripheralHID::OnSettingChanged(const CStdString &strChangedSetting) - { -- if (m_bInitialised && ((strChangedSetting.Equals("keymap") && GetSettingBool("keymap_enabled")) || strChangedSetting.Equals("keymap_enabled"))) -+ if (m_bInitialised && ((strChangedSetting.Equals("keymap") && !GetSettingBool("do_not_use_custom_keymap")) || strChangedSetting.Equals("keymap_enabled"))) - { - m_bInitialised = false; - InitialiseFeature(FEATURE_HID); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:03:25.169271055 +0200 -@@ -66,17 +66,15 @@ - - if (m_item) - { -- int iIndex = 1; - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (peripheral) - { -- map::iterator it = peripheral->m_settings.begin(); -- while (it != peripheral->m_settings.end()) -+ vector settings = peripheral->GetSettings(); -+ for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) - { -- CSetting *setting = (*it).second; -+ CSetting *setting = settings[iPtr]; - if (!setting->IsVisible()) - { -- ++it; - CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); - continue; - } -@@ -89,7 +87,7 @@ - if (boolSetting) - { - m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData())); -- AddBool(iIndex++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); -+ AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); - } - } - break; -@@ -99,7 +97,7 @@ - if (intSetting) - { - m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(iIndex++, intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); - } - } - break; -@@ -109,7 +107,7 @@ - if (floatSetting) - { - m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData())); -- AddSlider(iIndex++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); -+ AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); - } - } - break; -@@ -119,7 +117,7 @@ - if (stringSetting) - { - m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData())); -- AddString(iIndex, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); -+ AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); - } - } - break; -@@ -128,7 +126,6 @@ - CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); - break; - } -- ++it; - } - } - else -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:03:25.213271888 +0200 -@@ -27,9 +27,7 @@ - #include "devices/PeripheralNIC.h" - #include "devices/PeripheralNyxboard.h" - #include "devices/PeripheralTuner.h" --#if defined(HAVE_LIBCEC) - #include "devices/PeripheralCecAdapter.h" --#endif - #include "bus/PeripheralBusUSB.h" - #include "dialogs/GUIDialogPeripheralManager.h" - -@@ -43,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "guilib/Key.h" - - using namespace PERIPHERALS; - using namespace XFILE; -@@ -447,6 +446,8 @@ - void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, map &m_settings) - { - TiXmlElement *currentNode = xmlNode->FirstChildElement("setting"); -+ int iMaxOrder(0); -+ - while (currentNode) - { - CSetting *setting = NULL; -@@ -492,10 +493,32 @@ - } - - //TODO add more types if needed -+ -+ /* set the visibility */ - setting->SetVisible(bConfigurable); -+ -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; -+ -+ /* and add this new setting */ - m_settings[strKey] = setting; -+ - currentNode = currentNode->NextSiblingElement("setting"); - } -+ -+ /* add the settings without an order attribute or an invalid order attribute set at the end */ -+ for (map::iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ { -+ if (it->second->GetOrder() == 0) -+ it->second->SetOrder(++iMaxOrder); -+ } - } - - void CPeripherals::GetDirectory(const CStdString &strPath, CFileItemList &items) const -@@ -531,3 +554,89 @@ - - return NULL; - } -+ -+bool CPeripherals::OnAction(const CAction &action) -+{ -+ if (action.GetID() == ACTION_MUTE) -+ { -+ return ToggleMute(); -+ } -+ -+ if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) -+ { -+ vector peripherals; -+ if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ if (action.GetID() == ACTION_VOLUME_UP) -+ cecDevice->ScheduleVolumeUp(); -+ else -+ cecDevice->ScheduleVolumeDown(); -+ return true; -+ } -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::IsMuted(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->IsMuted()) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::ToggleMute(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ cecDevice->ScheduleMute(); -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::GetNextKeypress(float frameTime, CKey &key) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->GetButton()) -+ { -+ CKey newKey(cecDevice->GetButton(), cecDevice->GetHoldTime()); -+ cecDevice->ResetButton(); -+ key = newKey; -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.h 2012-04-17 14:03:25.213271888 +0200 -@@ -29,6 +29,8 @@ - class CSetting; - class CSettingsCategory; - class TiXmlElement; -+class CAction; -+class CKey; - - namespace PERIPHERALS - { -@@ -147,6 +149,54 @@ - */ - virtual CPeripheral *GetByPath(const CStdString &strPath) const; - -+ /*! -+ * @brief Try to let one of the peripherals handle an action. -+ * @param action The change to handle. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool OnAction(const CAction &action); -+ -+ /*! -+ * @brief Check whether there's a peripheral that reports to be muted. -+ * @return True when at least one peripheral reports to be muted, false otherwise. -+ */ -+ virtual bool IsMuted(void); -+ -+ /*! -+ * @brief Try to toggle the mute status via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool ToggleMute(void); -+ -+ /*! -+ * @brief Try to mute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool Mute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to unmute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool UnMute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to get a keypress from a peripheral. -+ * @param frameTime The current frametime. -+ * @param key The fetched key. -+ * @return True when a keypress was fetched, false otherwise. -+ */ -+ virtual bool GetNextKeypress(float frameTime, CKey &key); -+ -+ bool SupportsCEC(void) const -+ { -+#if defined(HAVE_LIBCEC) -+ return true; -+#else -+ return false; -+#endif -+ } -+ - private: - CPeripherals(void); - bool LoadMappings(void); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch deleted file mode 100644 index d08d45ece7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 35e4a2eb5515fe72d87b6d78b0567609df79df2b Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:30:25 +0200 -Subject: [PATCH] fixed: possible deadlock - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 0cb6602..1c91341 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -140,8 +140,10 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { - // this will also power off devices when we're the active source -- CSingleLock lock(m_critSection); -- m_bStop = true; -+ { -+ CSingleLock lock(m_critSection); -+ m_bStop = true; -+ } - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch deleted file mode 100644 index c186e4d62a..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch +++ /dev/null @@ -1,41 +0,0 @@ -From de4cd8d63257af1cb9060c4b2b304a82655adb99 Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:31:46 +0200 -Subject: [PATCH] fixed: make sure the old thread is stopped before starting a - new one, fixes throwing an exception in the main thread - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 14 ++++++++------ - 1 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 1c91341..a898a16 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -148,15 +148,17 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -- // reconnect to the device -- CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ { -+ // reconnect to the device -+ CSingleLock lock(m_critSection); -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); - -- // close the previous connection -- m_cecAdapter->Close(); -+ // close the previous connection -+ m_cecAdapter->Close(); -+ } - - // and open a new one -- m_bStop = false; -+ StopThread(); - Create(); - } - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index f870fbb3b6..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,630 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-04-17 14:08:05.972587511 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:18:39.755586920 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.6.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-04-17 14:08:05.974587546 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -2853,7 +2853,7 @@ - Could not detect the CEC port. Set it up manually. - Could not initialise the CEC adapter. Check your settings. - Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) -- Put this PC in standby mode when the TV is switched off -+ When the TV is switched off - HDMI port number - Connected - Adapter found, but libCEC is not available -@@ -2865,4 +2865,7 @@ - Configuration updated - Failed to set the new configuration. Please check your settings. - Send 'inactive source' command when stopping XBMC -+ Put devices in standby mode when putting the PC in standby -+ This device needs servicing -+ Ignore - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-04-17 14:08:05.975587564 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -14,13 +14,14 @@ - - - -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ - - - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp 2012-04-17 14:18:39.758586977 +0200 -@@ -323,6 +323,7 @@ - peripheralFile->SetProperty("bus", PeripheralTypeTranslator::BusTypeToString(peripheral->GetBusType())); - peripheralFile->SetProperty("location", peripheral->Location()); - peripheralFile->SetProperty("class", PeripheralTypeTranslator::TypeToString(peripheral->Type())); -+ peripheralFile->SetProperty("version", peripheral->GetVersionInfo()); - items.Add(peripheralFile); - } - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:17:35.207364830 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:18:39.760587015 +0200 -@@ -41,7 +41,7 @@ - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 0x1500 -+#define CEC_LIB_SUPPORTED_VERSION 0x1600 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -@@ -80,7 +80,9 @@ - m_lastKeypress(0), - m_lastChange(VOLUME_CHANGE_NONE), - m_iExitCode(0), -- m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bIsMuted(false), // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bGoingToStandby(false), -+ m_bIsRunning(false) - { - m_button.iButton = 0; - m_button.iDuration = 0; -@@ -96,6 +98,7 @@ - - m_bStop = true; - StopThread(true); -+ CAnnouncementManager::RemoveAnnouncer(this); - - if (m_dll && m_cecAdapter) - { -@@ -110,7 +113,11 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_iExitCode = data.asInteger(0); -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = data.asInteger(0); -+ } -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(false); - } - else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) -@@ -142,23 +149,22 @@ - // this will also power off devices when we're the active source - { - CSingleLock lock(m_critSection); -- m_bStop = true; -+ m_bGoingToStandby = false; - } -- WaitForThreadExit(0); -+ StopThread(); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { - { -- // reconnect to the device - CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -- -- // close the previous connection -- m_cecAdapter->Close(); -+ m_iExitCode = EXITCODE_RESTARTAPP; - } - -- // and open a new one -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(); -+ -+ // and open a new one - Create(); - } - } -@@ -172,6 +178,7 @@ - m_callbacks.CBCecKeyPress = &CecKeyPress; - m_callbacks.CBCecCommand = &CecCommand; - m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_callbacks.CBCecAlert = &CecAlert; - m_configuration.callbackParam = this; - m_configuration.callbacks = &m_callbacks; - -@@ -200,6 +207,8 @@ - else - { - CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ if (m_configuration.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); - } - - m_bStarted = true; -@@ -297,6 +306,13 @@ - if (!OpenConnection()) - return; - -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = EXITCODE_QUIT; -+ m_bGoingToStandby = false; -+ m_bIsRunning = true; -+ } -+ - CAnnouncementManager::AddAnnouncer(this); - - m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -@@ -312,8 +328,17 @@ - } - - delete m_queryThread; -+ m_queryThread = NULL; -+ -+ bool bSendStandbyCommands(false); -+ { -+ CSingleLock lock(m_critSection); -+ bSendStandbyCommands = m_iExitCode != EXITCODE_REBOOT && -+ m_iExitCode != EXITCODE_RESTARTAPP && -+ (!m_bGoingToStandby || GetSettingBool("standby_tv_on_pc_standby")); -+ } - -- if (m_iExitCode != EXITCODE_REBOOT) -+ if (bSendStandbyCommands) - { - if (m_cecAdapter->IsLibCECActiveSource()) - { -@@ -337,7 +362,12 @@ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); -- m_bStarted = false; -+ -+ { -+ CSingleLock lock(m_critSection); -+ m_bStarted = false; -+ m_bIsRunning = false; -+ } - } - - bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) -@@ -556,11 +586,15 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ if (command.initiator == CECDEVICE_TV && -+ (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_configuration.bShutdownOnStandby == 1) && - (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { - adapter->m_bStarted = false; -- g_application.getApplicationMessenger().Suspend(); -+ if (adapter->m_configuration.bPowerOffOnStandby == 1) -+ g_application.getApplicationMessenger().Suspend(); -+ else if (adapter->m_configuration.bShutdownOnStandby == 1) -+ g_application.getApplicationMessenger().Shutdown(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -@@ -634,6 +668,30 @@ - return 1; - } - -+int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter &data) -+{ -+ (void)data; -+ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ int iAlertString(0); -+ switch (alert) -+ { -+ case CEC_ALERT_SERVICE_DEVICE: -+ iAlertString = 36027; -+ break; -+ default: -+ break; -+ } -+ -+ if (iAlertString) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(iAlertString)); -+ -+ return 1; -+} -+ - int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) - { - CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -@@ -695,6 +753,10 @@ - case CEC_USER_CONTROL_CODE_RIGHT_DOWN: - iButton = XINPUT_IR_REMOTE_RIGHT; - break; -+ case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: -+ case CEC_USER_CONTROL_CODE_SETUP_MENU: -+ case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -+ case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_ROOT_MENU: - iButton = XINPUT_IR_REMOTE_MENU; - break; -@@ -711,7 +773,11 @@ - iButton = XINPUT_IR_REMOTE_CHANNEL_PLUS; - break; - case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: -+#if defined(XINPUT_IR_REMOTE_TELETEXT) -+ iButton = XINPUT_IR_REMOTE_TELETEXT; // only supported by the pvr branch -+#else - iButton = XINPUT_IR_REMOTE_BACK; -+#endif - break; - case CEC_USER_CONTROL_CODE_SOUND_SELECT: - iButton = XINPUT_IR_REMOTE_LANGUAGE; -@@ -806,13 +872,23 @@ - case CEC_USER_CONTROL_CODE_F4_YELLOW: - iButton = XINPUT_IR_REMOTE_YELLOW; - break; -+ case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: -+#if defined(XINPUT_IR_REMOTE_GUIDE) -+ iButton = XINPUT_IR_REMOTE_GUIDE; -+#else -+ bHasButton = false; -+#endif -+ break; -+ case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: -+#if defined(XINPUT_IR_REMOTE_LIVE_TV) -+ iButton = XINPUT_IR_REMOTE_LIVE_TV; -+#else -+ bHasButton = false; -+#endif -+ break; - case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: - case CEC_USER_CONTROL_CODE_EJECT: -- case CEC_USER_CONTROL_CODE_SETUP_MENU: -- case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -- case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_DOT: -- case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: - case CEC_USER_CONTROL_CODE_INPUT_SELECT: - case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: - case CEC_USER_CONTROL_CODE_HELP: -@@ -821,7 +897,6 @@ - case CEC_USER_CONTROL_CODE_ANGLE: - case CEC_USER_CONTROL_CODE_SUB_PICTURE: - case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: -- case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: - case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: - case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: - case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: -@@ -894,11 +969,15 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else -+ else if (IsRunning()) - { - SetConfigurationFromSettings(); - m_queryThread->UpdateConfiguration(&m_configuration); - } -+ else -+ { -+ InitialiseFeature(FEATURE_CEC); -+ } - } - - int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) -@@ -962,7 +1041,7 @@ - - // set the physical address, when baseDevice or iHDMIPort are not set - if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -- m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 15) - { - m_configuration.iPhysicalAddress = config.iPhysicalAddress; - CStdString strPhysicalAddress; -@@ -977,7 +1056,7 @@ - // set the devices to wake when starting - m_configuration.wakeDevices = config.wakeDevices; - CStdString strWakeDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.wakeDevices[iPtr]) - strWakeDevices.AppendFormat(" %X", iPtr); - SetSetting("wake_devices", strWakeDevices.Trim()); -@@ -985,10 +1064,10 @@ - // set the devices to power off when stopping - m_configuration.powerOffDevices = config.powerOffDevices; - CStdString strPowerOffDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.powerOffDevices[iPtr]) - strPowerOffDevices.AppendFormat(" %X", iPtr); -- SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ SetSetting("standby_devices", strPowerOffDevices.Trim()); - - // set the boolean settings - m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -@@ -1001,17 +1080,27 @@ - SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); - - m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -- SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); - - if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) - m_configuration.bSendInactiveSource = config.bSendInactiveSource; - SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ { -+ m_configuration.iFirmwareVersion = config.iFirmwareVersion; -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); -+ m_configuration.bShutdownOnStandby = config.bShutdownOnStandby; -+ } -+ -+ SetSetting("standby_pc_on_tv_standby", -+ m_configuration.bPowerOffOnStandby == 1 ? 13011 : -+ m_configuration.bShutdownOnStandby == 1 ? 13005 : 36028); - } - - void CPeripheralCecAdapter::SetConfigurationFromSettings(void) - { -- // client version 1.5.0 -- m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ // client version 1.6.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_6_0; - - // device name 'XBMC' - snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -@@ -1061,15 +1150,16 @@ - m_configuration.powerOffDevices.Clear(); - ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); - -- // always get the settings from the rom, when supported by the firmware -- m_configuration.bGetSettingsFromROM = 1; -- - // read the boolean settings - m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; - m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; - m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -- m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; - m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+ -+ // read the mutually exclusive boolean settings -+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby")); -+ m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0; -+ m_configuration.bShutdownOnStandby = iStandbyAction == 13005 ? 1 : 0; - } - - void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -@@ -1203,6 +1293,12 @@ - return true; - } - -+bool CPeripheralCecAdapter::IsRunning(void) const -+{ -+ CSingleLock lock(m_critSection); -+ return m_bIsRunning; -+} -+ - void CPeripheralCecAdapterUpdateThread::Process(void) - { - // set the initial configuration -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:08:06.071589381 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:18:39.761587034 +0200 -@@ -115,6 +115,8 @@ - static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); - static int CecCommand(void *cbParam, const CEC::cec_command &command); - static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ static int CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter &data); -+ bool IsRunning(void) const; - - virtual bool GetNextKey(void); - virtual bool GetNextCecKey(CEC::cec_keypress &key); -@@ -140,6 +142,8 @@ - CecVolumeChange m_lastChange; - int m_iExitCode; - bool m_bIsMuted; -+ bool m_bGoingToStandby; -+ bool m_bIsRunning; - CPeripheralCecAdapterUpdateThread*m_queryThread; - CEC::ICECCallbacks m_callbacks; - CCriticalSection m_critSection; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -211,7 +211,15 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting(NULL); -+ if (mappedSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ } -+ else if (mappedSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_entries, mappedSetting->GetControlType()); -+ } - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:18:39.758586977 +0200 -@@ -53,6 +53,7 @@ - const CStdString &DeviceName(void) const { return m_strDeviceName; } - bool IsHidden(void) const { return m_bHidden; } - void SetHidden(bool bSetTo = true) { m_bHidden = bSetTo; } -+ const CStdString &GetVersionInfo(void) const { return m_strVersionInfo; } - - /*! - * @brief Check whether this device has the given feature. -@@ -161,6 +162,7 @@ - CStdString m_strVendorId; - int m_iProductId; - CStdString m_strProductId; -+ CStdString m_strVersionInfo; - bool m_bInitialised; - bool m_bHidden; - bool m_bError; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:08:06.105590023 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:18:39.753586884 +0200 -@@ -51,6 +51,7 @@ - delete m_item; - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -@@ -96,8 +97,23 @@ - CSettingInt *intSetting = (CSettingInt *) setting; - if (intSetting) - { -- m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ if (intSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ } -+ else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData())); -+ vector > entries; -+ map::iterator entriesItr = intSetting->m_entries.begin(); -+ while (entriesItr != intSetting->m_entries.end()) -+ { -+ entries.push_back(make_pair(entriesItr->first, entriesItr->second)); -+ ++entriesItr; -+ } -+ AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries); -+ } - } - } - break; -@@ -160,6 +176,13 @@ - ++intItr; - } - -+ map::iterator intTextItr = m_intTextSettings.begin(); -+ while (intTextItr != m_intTextSettings.end()) -+ { -+ peripheral->SetSetting((*intTextItr).first, (*intTextItr).second); -+ ++intTextItr; -+ } -+ - map::iterator floatItr = m_floatSettings.begin(); - while (floatItr != m_floatSettings.end()) - { -@@ -210,6 +233,7 @@ - /* clear the settings */ - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-04-17 14:18:39.753586884 +0200 -@@ -44,6 +44,7 @@ - bool m_bIsInitialising; - std::map m_boolSettings; - std::map m_intSettings; -+ std::map m_intTextSettings; - std::map m_floatSettings; - std::map m_stringSettings; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:08:06.106590043 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -41,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "Util.h" - #include "guilib/Key.h" - - using namespace PERIPHERALS; -@@ -486,29 +487,46 @@ - float fMax = currentNode->Attribute("max") ? (float) atof(currentNode->Attribute("max")) : 0; - setting = new CSettingFloat(0, strKey, iLabelId, fValue, fMin, fStep, fMax, SPIN_CONTROL_FLOAT); - } -+ else if (strSettingsType.Equals("enum")) -+ { -+ CStdString strEnums(currentNode->Attribute("lvalues")); -+ if (!strEnums.IsEmpty()) -+ { -+ map enums; -+ vector valuesVec; -+ CUtil::Tokenize(strEnums, valuesVec, "|"); -+ for (unsigned int i = 0; i < valuesVec.size(); i++) -+ enums.insert(make_pair(atoi(valuesVec[i]), atoi(valuesVec[i]))); -+ int iValue = currentNode->Attribute("value") ? atoi(currentNode->Attribute("value")) : 0; -+ setting = new CSettingInt(0, strKey, iLabelId, iValue, enums, SPIN_CONTROL_TEXT); -+ } -+ } - else - { - CStdString strValue(currentNode->Attribute("value")); - setting = new CSettingString(0, strKey, iLabelId, strValue, EDIT_CONTROL_INPUT, !bConfigurable, -1); - } - -- //TODO add more types if needed -+ if (setting) -+ { -+ //TODO add more types if needed - -- /* set the visibility */ -- setting->SetVisible(bConfigurable); -+ /* set the visibility */ -+ setting->SetVisible(bConfigurable); - -- /* set the order */ -- int iOrder(0); -- currentNode->Attribute("order", &iOrder); -- /* if the order attribute is invalid or 0, then the setting will be added at the end */ -- if (iOrder < 0) -- iOrder = 0; -- setting->SetOrder(iOrder); -- if (iOrder > iMaxOrder) -- iMaxOrder = iOrder; -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; - -- /* and add this new setting */ -- m_settings[strKey] = setting; -+ /* and add this new setting */ -+ m_settings[strKey] = setting; -+ } - - currentNode = currentNode->NextSiblingElement("setting"); - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch deleted file mode 100644 index 830722aabf..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch +++ /dev/null @@ -1,144 +0,0 @@ -From ab72a555c5dd8585ac6e101d9f5966e25500867d Mon Sep 17 00:00:00 2001 -From: Giftie -Date: Thu, 5 Jan 2012 19:32:14 -0700 -Subject: [PATCH] Updated auto cd rip modified: - language/English/strings.xml modified: - xbmc/cdrip/CDDARipper.cpp modified: - xbmc/settings/GUISettings.cpp modified: - xbmc/settings/GUISettings.h modified: - xbmc/storage/MediaManager.cpp modified: xbmc/Autorun.cpp - - Author: Giftie - Committer: Giftie ---- - language/English/strings.xml | 5 ++++- - xbmc/Autorun.cpp | 15 ++++++++++++--- - xbmc/settings/GUISettings.cpp | 8 +++++++- - xbmc/settings/GUISettings.h | 5 +++++ - xbmc/storage/MediaManager.cpp | 7 +++++-- - 5 files changed, 33 insertions(+), 7 deletions(-) - -diff --git a/language/English/strings.xml b/language/English/strings.xml -index ca2ac4d..ae22214 100644 ---- a/language/English/strings.xml -+++ b/language/English/strings.xml -@@ -1344,7 +1344,7 @@ - Show EXIF picture information - Use a fullscreen window rather than true fullscreen - Queue songs on selection -- Play audio CDs automatically -+ - Playback - DVDs - Play DVDs automatically -@@ -1355,6 +1355,9 @@ - Security - Input devices - Power saving -+ Rip -+ Audio CD Insert Action -+ Play - - Remove - Games -diff --git a/xbmc/Autorun.cpp b/xbmc/Autorun.cpp -index 846b28d..3cd6f75 100644 ---- a/xbmc/Autorun.cpp -+++ b/xbmc/Autorun.cpp -@@ -43,6 +43,9 @@ - #include "dialogs/GUIDialogYesNo.h" - #include "utils/URIUtils.h" - #include "utils/log.h" -+#ifdef HAS_CDDA_RIPPER -+#include "cdrip/CDDARipper.h" -+#endif - - using namespace std; - using namespace XFILE; -@@ -69,13 +72,19 @@ void CAutorun::ExecuteAutorun(const CStdString& path, bool bypassSettings, bool - - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); // turn off the screensaver if it's active -- -+#ifdef HAS_CDDA_RIPPER -+ if ( g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_RIP && pInfo->IsAudio(1) && !g_settings.GetCurrentProfile().musicLocked()) -+ { -+ CCDDARipper ripper; -+ ripper.RipCD(); -+ } -+#endif - PlayDisc(path, bypassSettings, startFromBeginning); - } - - bool CAutorun::PlayDisc(const CStdString& path, bool bypassSettings, bool startFromBeginning) - { -- if ( !bypassSettings && !g_guiSettings.GetBool("audiocds.autorun") && !g_guiSettings.GetBool("dvds.autorun")) -+ if ( !bypassSettings && !g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_PLAY && !g_guiSettings.GetBool("dvds.autorun")) - return false; - - int nSize = g_playlistPlayer.GetPlaylist( PLAYLIST_MUSIC ).size(); -@@ -276,7 +285,7 @@ bool CAutorun::RunDisc(IDirectory* pDir, const CStdString& strDrive, int& nAdded - } - } - // then music -- if (!bPlaying && (bypassSettings || g_guiSettings.GetBool("audiocds.autorun")) && bAllowMusic) -+ if (!bPlaying && (bypassSettings || g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_PLAY) && bAllowMusic) - { - for (int i = 0; i < vecItems.Size(); i++) - { -diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp -index 6cce6ac..a0c7bf5 100644 ---- a/xbmc/settings/GUISettings.cpp -+++ b/xbmc/settings/GUISettings.cpp -@@ -318,7 +318,13 @@ void CGUISettings::Initialize() - AddString(scr, "scrobbler.librefmpass", 15219, "", EDIT_CONTROL_MD5_INPUT, false, 15219); - - CSettingsCategory* acd = AddCategory(3, "audiocds", 620); -- AddBool(acd, "audiocds.autorun", 14085, false); -+ map autocd; -+ autocd.insert(make_pair(16018, AUTOCD_NONE)); -+ autocd.insert(make_pair(14098, AUTOCD_PLAY)); -+#ifdef HAS_CDDA_RIPPER -+ autocd.insert(make_pair(14096, AUTOCD_RIP)); -+#endif -+ AddInt(acd,"audiocds.autoaction",14097,AUTOCD_NONE, autocd, SPIN_CONTROL_TEXT); - AddBool(acd, "audiocds.usecddb", 227, true); - AddSeparator(acd, "audiocds.sep1"); - AddPath(acd,"audiocds.recordingpath",20000,"select writable folder",BUTTON_CONTROL_PATH_INPUT,false,657); -diff --git a/xbmc/settings/GUISettings.h b/xbmc/settings/GUISettings.h -index 5501064..8751624 100644 ---- a/xbmc/settings/GUISettings.h -+++ b/xbmc/settings/GUISettings.h -@@ -64,6 +64,11 @@ - #define KARAOKE_COLOR_START 0 - #define KARAOKE_COLOR_END 4 - -+// CDDA Autoaction defines -+#define AUTOCD_NONE 0 -+#define AUTOCD_PLAY 1 -+#define AUTOCD_RIP 2 -+ - // CDDA ripper defines - #define CDDARIP_ENCODER_LAME 0 - #define CDDARIP_ENCODER_VORBIS 1 -diff --git a/xbmc/storage/MediaManager.cpp b/xbmc/storage/MediaManager.cpp -index ced4ad0..316e8c9 100644 ---- a/xbmc/storage/MediaManager.cpp -+++ b/xbmc/storage/MediaManager.cpp -@@ -624,8 +624,11 @@ void CMediaManager::ProcessEvents() - - void CMediaManager::OnStorageAdded(const CStdString &label, const CStdString &path) - { -- if (g_guiSettings.GetBool("audiocds.autorun") || g_guiSettings.GetBool("dvds.autorun")) -- CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_HIGH); -+ if (g_guiSettings.GetInt("audiocds.autoaction") != AUTOCD_NONE || g_guiSettings.GetBool("dvds.autorun")) -+ if ( g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_RIP) -+ CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_LOW); -+ else -+ CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_HIGH); - else - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(13021), label, TOAST_DISPLAY_TIME, false); - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch deleted file mode 100644 index f8fd6b6c73..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -Naur xbmc-pvr-fc63e66/language/English/strings.xml xbmc-pvr-fc63e66.patch/language/English/strings.xml ---- xbmc-pvr-fc63e66/language/English/strings.xml 2012-03-19 21:20:31.531809910 +0100 -+++ xbmc-pvr-fc63e66.patch/language/English/strings.xml 2012-03-19 21:21:56.576430020 +0100 -@@ -1360,6 +1360,7 @@ - Rip - Audio CD Insert Action - Play -+ Eject disc when Audio CD ripping is complete - - Remove - Games -diff -Naur xbmc-pvr-fc63e66/xbmc/cdrip/CDDARipper.cpp xbmc-pvr-fc63e66.patch/xbmc/cdrip/CDDARipper.cpp ---- xbmc-pvr-fc63e66/xbmc/cdrip/CDDARipper.cpp 2012-03-16 22:27:56.000000000 +0100 -+++ xbmc-pvr-fc63e66.patch/xbmc/cdrip/CDDARipper.cpp 2012-03-19 21:21:07.725417655 +0100 -@@ -332,6 +332,11 @@ - } - - CLog::Log(LOGINFO, "Ripped CD succesfull"); -+ if (g_guiSettings.GetBool("audiocds.ejectonrip")) -+ { -+ CLog::Log(LOGINFO, "Ejecting CD"); -+ CIoSupport::EjectTray(); -+ } - return true; - } - -diff -Naur xbmc-pvr-fc63e66/xbmc/settings/GUISettings.cpp xbmc-pvr-fc63e66.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-fc63e66/xbmc/settings/GUISettings.cpp 2012-03-19 21:20:31.533809950 +0100 -+++ xbmc-pvr-fc63e66.patch/xbmc/settings/GUISettings.cpp 2012-03-19 21:21:07.734417841 +0100 -@@ -349,6 +349,7 @@ - AddInt(acd, "audiocds.quality", 622, CDDARIP_QUALITY_CBR, qualities, SPIN_CONTROL_TEXT); - AddInt(acd, "audiocds.bitrate", 623, 192, 128, 32, 320, SPIN_CONTROL_INT_PLUS, MASK_KBPS); - AddInt(acd, "audiocds.compressionlevel", 665, 5, 0, 1, 8, SPIN_CONTROL_INT_PLUS); -+ AddBool(acd, "audiocds.ejectonrip", 14099, false); - - #ifdef HAS_KARAOKE - CSettingsCategory* kar = AddCategory(3, "karaoke", 13327); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch deleted file mode 100644 index 68c31b264a..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 5c62df65cb2ef1c7dcebbf07bd6d180960ab6715 Mon Sep 17 00:00:00 2001 -From: theuni -Date: Wed, 4 Apr 2012 14:53:51 -0400 -Subject: [PATCH] ffmpeg: disable ffmpeg's crystalhd implementation for now - ---- - configure.in | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/configure.in b/configure.in -index 0d80719..40e9fb5 100755 ---- a/configure.in -+++ b/configure.in -@@ -2041,6 +2041,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ - --disable-ffmpeg \ - --disable-doc \ - --disable-decoder=mpeg_xvmc \ -+ --disable-crystalhd \ - --enable-postproc \ - --enable-gpl \ - --enable-protocol=http \ -@@ -2080,6 +2081,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ - --disable-ffplay \ - --disable-ffserver \ - --disable-ffmpeg \ -+ --disable-crystalhd \ - --enable-shared \ - --disable-doc \ - --enable-postproc \ --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch deleted file mode 100644 index 04708b7219..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch +++ /dev/null @@ -1,41 +0,0 @@ -From d1e06c28d3eb6cd689b8cbc5b96babe81707baa7 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 15 Apr 2012 14:00:22 +0200 -Subject: [PATCH] ffmpeg: avfilter depends on avformat - ---- - lib/DllAvFilter.h | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/lib/DllAvFilter.h b/lib/DllAvFilter.h -index 5c83654..6ae5d15 100644 ---- a/lib/DllAvFilter.h -+++ b/lib/DllAvFilter.h -@@ -25,6 +25,7 @@ - #endif - #include "DynamicDll.h" - #include "DllAvCodec.h" -+#include "DllAvFormat.h" - #include "DllSwResample.h" - #include "utils/log.h" - -@@ -203,6 +204,7 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface - /* dependencies of libavfilter */ - DllAvUtil m_dllAvUtil; - DllSwResample m_dllSwResample; -+ DllAvFormat m_dllAvFormat; - - public: - int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -251,6 +253,8 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface - return false; - if (!m_dllSwResample.Load()) - return false; -+ if (!m_dllAvFormat.Load()) -+ return false; - return DllDynamic::Load(); - } - }; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch deleted file mode 100644 index 98a4fa1a77..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch +++ /dev/null @@ -1,14563 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-05-14 14:11:49.081856910 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-05-14 14:15:12.045218673 +0200 -@@ -98,6 +98,8 @@ - vaapi_disabled="== VAAPI support manually disabled. ==" - crystalhd_not_found="== Could not find libcrystalhd. CrystalHD support disabled. ==" - crystalhd_disabled="== CrystalHD support manually disabled. ==" -+xvba_not_found="== Could not find amdxvba.h. XVBA support disabled. ==" -+xvba_disabled="== XVBA support manually disabled. ==" - vdadecoder_enabled="== VDADecoder support enabled. ==" - vdadecoder_disabled="== VDADecoder support manually disabled. ==" - vtbdecoder_enabled="== VTBDecoder support enabled. ==" -@@ -204,6 +206,12 @@ - [enable CrystalHD decoding (default is auto)])], - [use_crystalhd=$enableval], - [use_crystalhd=auto]) -+ -+AC_ARG_ENABLE([xvba], -+ [AS_HELP_STRING([--enable-xvba], -+ [enable XVBA decoding (default is auto)])], -+ [use_xvba=$enableval], -+ [use_xvba=auto]) - - AC_ARG_ENABLE([vdadecoder], - [AS_HELP_STRING([--enable-vdadecoder], -@@ -1382,6 +1390,38 @@ - USE_CRYSTALHD=0 - fi - -+# XVBA -+if test "x$use_xvba" != "xno"; then -+ if test "$host_vendor" = "apple" ; then -+ if test "x$use_xvba" = "xyes"; then -+ AC_MSG_ERROR([XVBA not supported on this platform]) -+ else -+ use_xvba="no" -+ AC_MSG_NOTICE($xvba_disabled) -+ fi -+ USE_XVBA=0 -+ else -+ initial_val=$use_xvba -+ AC_CHECK_HEADER([amd/amdxvba.h],, use_xvba=no, [#include ]) -+ -+ if test "x$use_xvba" = "xno"; then -+ if test "x$initial_val" = "xyes"; then -+ AC_MSG_ERROR($xvba_not_found) -+ else -+ AC_MSG_RESULT($xvba_not_found) -+ fi -+ USE_XVBA=0 -+ else -+ AC_DEFINE([HAVE_LIBXVBA], [1], [Define to 1 if you have the 'xvba' header (amdxvba.h)]) -+ USE_XVBA=1 -+ fi -+ fi -+else -+ AC_MSG_NOTICE($xvba_disabled) -+ USE_XVBA=0 -+fi -+ -+ - # VDADecoder - if test "x$use_vdadecoder" != "xno"; then - if test "$host_vendor" = "apple" ; then -@@ -1578,6 +1618,12 @@ - final_message="$final_message\n CrystalHD:\tNo" - fi - -+if test "x$use_xvba" != "xno"; then -+ final_message="$final_message\n XVBA:\t\tYes" -+else -+ final_message="$final_message\n XVBA:\t\tNo" -+fi -+ - if test "x$use_vdadecoder" != "xno"; then - final_message="$final_message\n VDADecoder:\tYes" - else -@@ -1952,6 +1998,7 @@ - AC_SUBST(USE_VDPAU) - AC_SUBST(USE_VAAPI) - AC_SUBST(USE_CRYSTALHD) -+AC_SUBST(USE_XVBA) - AC_SUBST(USE_LIBSMBCLIENT) - AC_SUBST(USE_LIBNFS) - AC_SUBST(USE_LIBAFPCLIENT) -@@ -2094,6 +2141,7 @@ - --enable-gpl \ - `if test "x$use_vdpau" != "xno"; then echo --enable-vdpau; else echo --disable-vdpau; fi` \ - `if test "x$use_vaapi" != "xno"; then echo --enable-vaapi; else echo --disable-vaapi; fi` \ -+ `if test "x$use_xvba" != "xno"; then echo --enable-xvba; else echo --disable-xvba; fi` \ - --enable-protocol=http \ - --enable-pthreads \ - --enable-runtime-cpudetect \ -diff -Naur xbmc-pvr-11.0.1/language/Dutch/strings.xml xbmc-pvr-11.0.1.patch/language/Dutch/strings.xml ---- xbmc-pvr-11.0.1/language/Dutch/strings.xml 2012-05-14 14:14:51.670808009 +0200 -+++ xbmc-pvr-11.0.1.patch/language/Dutch/strings.xml 2012-05-14 14:15:12.051218793 +0200 -@@ -1236,7 +1236,8 @@ - Hardwareversnelling inschakelen (OpenMax) - Pixelshaders - Hardware acceleratie toestaan (VideoToolbox) -- -+ Vdpau OpenGL interop RGB inschakelen -+ Vdpau OpenGL interop YUV inschakelen - A/V-synchronisatiemethode - Audiosignaal - Videosignaal (Drop/Dupe audio) -@@ -1542,6 +1543,7 @@ - Spline36 - Spline36 geoptimaliseerd - Software menging -+ VDPAU Bob - - Kwaliteitsverbetering video - -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-05-14 14:14:51.673808069 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-05-14 14:15:12.053218833 +0200 -@@ -1234,6 +1234,9 @@ - Allow hardware acceleration (OpenMax) - Pixel Shaders - Allow hardware acceleration (VideoToolbox) -+ Allow Vdpau OpenGL interop RGB -+ Allow Vdpau OpenGL interop YUV -+ Allow hardware acceleration (XVBA) - - A/V sync method - Audio clock -@@ -1540,6 +1543,8 @@ - Spline36 - Spline36 optimized - Software Blend -+ VDPAU Bob -+ XVBA - - Post-processing - -diff -Naur xbmc-pvr-11.0.1/language/German/strings.xml xbmc-pvr-11.0.1.patch/language/German/strings.xml ---- xbmc-pvr-11.0.1/language/German/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/German/strings.xml 2012-05-14 14:15:12.059218956 +0200 -@@ -1268,6 +1268,8 @@ - Hardwarebeschleunigung erlauben (OpenMax) - Pixel Shaders - Hardwarebeschleunigung erlauben (VideoToolbox) -+ Vdpau OpenGL interop RGB erlauben -+ Vdpau OpenGL interop YUV erlauben - - A/V Sync Methode - Audio Takt -@@ -1567,6 +1569,7 @@ - Zeitlich (Hälfte) - Zeitlich/Räumlich (Hälfte) - DXVA -+ VDPAU Bob - - Video Nachbearbeitung - Deaktiviert -diff -Naur xbmc-pvr-11.0.1/language/Swedish/strings.xml xbmc-pvr-11.0.1.patch/language/Swedish/strings.xml ---- xbmc-pvr-11.0.1/language/Swedish/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/Swedish/strings.xml 2012-05-14 14:15:12.062219016 +0200 -@@ -1412,6 +1412,7 @@ - Spline36 - Spline36-optimerad - Mjukvarublandning -+ VDPAU Bob - Efterbearbetning - Visa insommningstimeout - Byt till kanal -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/extract.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/extract.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/extract.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/extract.cpp 2012-05-14 14:15:12.095219681 +0200 -@@ -1,9 +1,5 @@ - #include "rar.hpp" - #include "Util.h" --#ifdef _LINUX --#include "XSyncUtils.h" --#include "XEventUtils.h" --#endif - - // a cautious wrapper around strncpy - char *strncpy_null_terminated(char *dest, const char *src, size_t n) -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/unpack15.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack15.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/unpack15.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack15.cpp 2012-05-14 14:15:12.095219681 +0200 -@@ -1,7 +1,3 @@ --#ifdef _LINUX --#include "XSyncUtils.h" --#endif -- - #define STARTL1 2 - static unsigned int DecL1[]={0x8000,0xa000,0xc000,0xd000,0xe000,0xea00, - 0xee00,0xf000,0xf200,0xf200,0xffff}; -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/unpack.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/unpack.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack.cpp 2012-05-14 14:15:12.096219701 +0200 -@@ -8,11 +8,6 @@ - #include "unpack20.cpp" - #endif - --#ifdef _LINUX --#include "XSyncUtils.h" --#include "XEventUtils.h" --#endif -- - Unpack::Unpack(ComprDataIO *DataIO) - { - UnpIO=DataIO; -diff -Naur xbmc-pvr-11.0.1/system/shaders/yuv2rgb_basic.glsl xbmc-pvr-11.0.1.patch/system/shaders/yuv2rgb_basic.glsl ---- xbmc-pvr-11.0.1/system/shaders/yuv2rgb_basic.glsl 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/system/shaders/yuv2rgb_basic.glsl 2012-05-14 14:15:12.097219721 +0200 -@@ -70,6 +70,18 @@ - rgb.a = gl_Color.a; - gl_FragColor = rgb; - -+#elif defined(XBMC_VDPAU_NV12) -+ -+ vec4 yuv, rgb; -+ yuv.rgba = vec4( texture2D(m_sampY, stretch(m_cordY)).r -+ , texture2D(m_sampU, stretch(m_cordU)).r -+ , texture2D(m_sampV, stretch(m_cordV)).g -+ , 1.0 ); -+ -+ rgb = m_yuvmat * yuv; -+ rgb.a = gl_Color.a; -+ gl_FragColor = rgb; -+ - #elif defined(XBMC_YUY2) || defined(XBMC_UYVY) - - #if(XBMC_texture_rectangle) -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.cpp xbmc-pvr-11.0.1.patch/xbmc/Application.cpp ---- xbmc-pvr-11.0.1/xbmc/Application.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.cpp 2012-05-14 14:15:12.101219801 +0200 -@@ -391,8 +391,6 @@ - #endif - m_currentStack = new CFileItemList; - -- m_frameCount = 0; -- - m_bPresentFrame = false; - m_bPlatformDirectories = true; - -@@ -2026,28 +2024,18 @@ - - bool CApplication::WaitFrame(unsigned int timeout) - { -- bool done = false; -- - // Wait for all other frames to be presented -- CSingleLock lock(m_frameMutex); -- //wait until event is set, but modify remaining time -+ m_frameEvent.Reset(); - -- TightConditionVariable > cv(m_frameCond, InversePredicate(m_frameCount)); -- cv.wait(lock,timeout); -- done = m_frameCount == 0; -+ if (!g_renderManager.HasFrame() && !m_frameEvent.WaitMSec(timeout)) -+ return false; - -- return done; -+ return g_renderManager.HasFrame(); - } - - void CApplication::NewFrame() - { -- // We just posted another frame. Keep track and notify. -- { -- CSingleLock lock(m_frameMutex); -- m_frameCount++; -- } -- -- m_frameCond.notifyAll(); -+ m_frameEvent.Set(); - } - - void CApplication::Render() -@@ -2081,12 +2069,13 @@ - m_bPresentFrame = false; - if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !IsPaused()) - { -- CSingleLock lock(m_frameMutex); -- -- TightConditionVariable cv(m_frameCond,m_frameCount); -- cv.wait(lock,100); -+ uint64_t timeout = CurrentHostCounter() + CurrentHostFrequency()/10; -+ while (!g_renderManager.HasFrame() && CurrentHostCounter() < timeout) -+ { -+ m_frameEvent.WaitMSec(100); -+ } -+ m_bPresentFrame = g_renderManager.HasFrame(); - -- m_bPresentFrame = m_frameCount > 0; - decrement = m_bPresentFrame; - hasRendered = true; - } -@@ -2169,18 +2158,14 @@ - m_lastFrameTime = XbmcThreads::SystemClockMillis(); - - if (flip) -+ { - g_graphicsContext.Flip(dirtyRegions); -+ g_renderManager.NotifyDisplayFlip(); -+ } - CTimeUtils::UpdateFrameTime(flip); - - g_renderManager.UpdateResolution(); - g_renderManager.ManageCaptures(); -- -- { -- CSingleLock lock(m_frameMutex); -- if(m_frameCount > 0 && decrement) -- m_frameCount--; -- } -- m_frameCond.notifyAll(); - } - - void CApplication::SetStandAlone(bool value) -@@ -5399,12 +5384,6 @@ - // See if we're playing a video, and are in GUI mode - if ( IsPlayingVideo() && g_windowManager.GetActiveWindow() != WINDOW_FULLSCREEN_VIDEO) - { -- // Reset frame count so that timing is FPS will be correct. -- { -- CSingleLock lock(m_frameMutex); -- m_frameCount = 0; -- } -- - // then switch to fullscreen mode - g_windowManager.ActivateWindow(WINDOW_FULLSCREEN_VIDEO); - return true; -@@ -5580,7 +5559,6 @@ - - bool CApplication::IsPresentFrame() - { -- CSingleLock lock(m_frameMutex); - bool ret = m_bPresentFrame; - - return ret; -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.h xbmc-pvr-11.0.1.patch/xbmc/Application.h ---- xbmc-pvr-11.0.1/xbmc/Application.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.h 2012-05-14 14:15:12.102219821 +0200 -@@ -351,9 +351,7 @@ - bool m_bTestMode; - bool m_bSystemScreenSaverEnable; - -- int m_frameCount; -- CCriticalSection m_frameMutex; -- XbmcThreads::ConditionVariable m_frameCond; -+ CEvent m_frameEvent; - - void Mute(); - void UnMute(); -diff -Naur xbmc-pvr-11.0.1/xbmc/ApplicationMessenger.cpp xbmc-pvr-11.0.1.patch/xbmc/ApplicationMessenger.cpp ---- xbmc-pvr-11.0.1/xbmc/ApplicationMessenger.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/ApplicationMessenger.cpp 2012-05-14 14:15:12.106219903 +0200 -@@ -75,7 +75,7 @@ - - using namespace std; - --CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) -+CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) : CThread("CDelayedMessage") - { - m_msg.dwMessage = msg.dwMessage; - m_msg.dwParam1 = msg.dwParam1; -diff -Naur xbmc-pvr-11.0.1/xbmc/cdrip/CDDAReader.cpp xbmc-pvr-11.0.1.patch/xbmc/cdrip/CDDAReader.cpp ---- xbmc-pvr-11.0.1/xbmc/cdrip/CDDAReader.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cdrip/CDDAReader.cpp 2012-05-14 14:15:12.106219903 +0200 -@@ -29,7 +29,7 @@ - - #define SECTOR_COUNT 52 - --CCDDAReader::CCDDAReader() -+CCDDAReader::CCDDAReader() : CThread("CCDDAReader") - { - m_sRipBuffer[0].pbtStream = NULL; - m_sRipBuffer[1].pbtStream = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-05-14 14:15:12.107219923 +0200 -@@ -240,15 +240,6 @@ - #endif - } - --extern "C" BOOL WINAPI dllGetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime) --{ -- // since the xbox has only one process, we just take the current thread -- HANDLE h = GetCurrentThread(); -- BOOL res = GetThreadTimes(h, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); -- -- return res; --} -- - extern "C" int WINAPI dllDuplicateHandle(HANDLE hSourceProcessHandle, // handle to source process - HANDLE hSourceHandle, // handle to duplicate - HANDLE hTargetProcessHandle, // handle to target process -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.h xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h ---- xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-05-14 14:15:12.108219943 +0200 -@@ -686,7 +686,6 @@ - - extern "C" HGLOBAL WINAPI dllLoadResource(HMODULE module, HRSRC res); - extern "C" HRSRC WINAPI dllFindResourceA(HMODULE module, LPCTSTR name, LPCTSTR type); --extern "C" BOOL WINAPI dllGetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime); - extern "C" int WINAPI dllGetLocaleInfoA(LCID Locale, LCTYPE LCType, LPTSTR lpLCData, int cchData); - extern "C" UINT WINAPI dllGetConsoleCP(); - extern "C" UINT WINAPI dllGetConsoleOutputCP(); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DummyVideoPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/DummyVideoPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/DummyVideoPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DummyVideoPlayer.cpp 2012-05-14 14:15:12.109219963 +0200 -@@ -33,7 +33,7 @@ - - CDummyVideoPlayer::CDummyVideoPlayer(IPlayerCallback& callback) - : IPlayer(callback), -- CThread() -+ CThread("CDummyVideoPlayer") - { - m_paused = false; - m_clock = 0; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-05-14 14:15:12.111220003 +0200 -@@ -325,7 +325,7 @@ - #pragma mark - - #endif - CMPCOutputThread::CMPCOutputThread(void *device, DllLibCrystalHD *dll, bool has_bcm70015) : -- CThread(), -+ CThread("CMPCOutputThread"), - m_dll(dll), - m_device(device), - m_has_bcm70015(has_bcm70015), -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-05-14 14:11:52.781931376 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-05-14 14:32:47.792343580 +0200 -@@ -56,6 +56,9 @@ - #ifdef HAVE_LIBVA - #include "VAAPI.h" - #endif -+#ifdef HAVE_LIBXVBA -+#include "XVBA.h" -+#endif - - using namespace boost; - -@@ -71,14 +74,14 @@ - while(*cur != PIX_FMT_NONE) - { - #ifdef HAVE_LIBVDPAU -- if(CVDPAU::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.usevdpau")) -+ if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.usevdpau")) - { - if(ctx->GetHardware()) - return *cur; - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); -- CVDPAU* vdp = new CVDPAU(); -- if(vdp->Open(avctx, *cur)) -+ VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); -+ if(vdp->Open(avctx, *cur, ctx->m_uSurfacesCount)) - { - ctx->SetHardware(vdp); - return *cur; -@@ -100,6 +103,19 @@ - dec->Release(); - } - #endif -+#ifdef HAVE_LIBXVBA -+ if(*cur == PIX_FMT_XVBA_VLD && g_guiSettings.GetBool("videoplayer.usexvba")) -+ { -+ XVBA::CDecoder* dec = new XVBA::CDecoder(); -+ if(dec->Open(avctx, *cur)) -+ { -+ ctx->SetHardware(dec); -+ return *cur; -+ } -+ else -+ dec->Release(); -+ } -+#endif - #ifdef HAVE_LIBVA - // mpeg4 vaapi decoding is disabled - if(*cur == PIX_FMT_VAAPI_VLD && g_guiSettings.GetBool("videoplayer.usevaapi") -@@ -141,6 +157,7 @@ - m_iLastKeyframe = 0; - m_dts = DVD_NOPTS_VALUE; - m_started = false; -+ m_decoderPts = DVD_NOPTS_VALUE; - } - - CDVDVideoCodecFFmpeg::~CDVDVideoCodecFFmpeg() -@@ -198,14 +215,26 @@ - continue; - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); -- CVDPAU* vdp = new CVDPAU(); -+ VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); - m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->codec_id = hints.codec; - m_pCodecContext->width = hints.width; - m_pCodecContext->height = hints.height; - m_pCodecContext->coded_width = hints.width; - m_pCodecContext->coded_height = hints.height; -- if(vdp->Open(m_pCodecContext, pCodec->pix_fmts ? pCodec->pix_fmts[0] : PIX_FMT_NONE)) -+ -+ // check number of surfaces used in renderer -+ unsigned int surfaces = 0; -+ for(CDVDCodecOptions::iterator it = options.begin(); it != options.end(); it++) -+ { -+ if (it->m_name == "surfaces") -+ { -+ surfaces = std::atoi(it->m_value.c_str()); -+ break; -+ } -+ } -+ -+ if(vdp->Open(m_pCodecContext, pCodec->pix_fmts ? pCodec->pix_fmts[0] : PIX_FMT_NONE, surfaces)) - { - m_pHardware = vdp; - m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set -@@ -333,6 +362,14 @@ - { - if( m_pCodecContext ) - { -+ if (bDrop && m_pHardware && m_pHardware->CanSkipDeint()) -+ { -+ m_requestSkipDeint = true; -+ bDrop = false; -+ } -+ else -+ m_requestSkipDeint = false; -+ - // i don't know exactly how high this should be set - // couldn't find any good docs on it. think it varies - // from codec to codec on what it does -@@ -515,6 +552,7 @@ - void CDVDVideoCodecFFmpeg::Reset() - { - m_started = false; -+ m_decoderPts = DVD_NOPTS_VALUE; - m_iLastKeyframe = m_pCodecContext->has_b_frames; - m_dllAvCodec.avcodec_flush_buffers(m_pCodecContext); - -@@ -608,6 +646,22 @@ - else - pDvdVideoPicture->pts = DVD_NOPTS_VALUE; - -+ if (pDvdVideoPicture->pts != DVD_NOPTS_VALUE) -+ m_decoderPts = pDvdVideoPicture->pts; -+ else -+ m_decoderPts = m_dts; -+ -+ if (m_requestSkipDeint) -+ { -+ pDvdVideoPicture->iFlags |= DVP_FLAG_DROPDEINT; -+ m_skippedDeint = 1; -+ } -+ else -+ m_skippedDeint = 0; -+ -+ m_requestSkipDeint = false; -+ pDvdVideoPicture->iFlags |= m_codecControlState; -+ - if(!m_started) - pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; - -@@ -827,3 +881,14 @@ - else - return 0; - } -+ -+void CDVDVideoCodecFFmpeg::SetSpeed(int speed) -+{ -+ if (m_pHardware) -+ m_pHardware->SetSpeed(speed); -+} -+ -+void CDVDVideoCodecFFmpeg::SetCodecControl(int state) -+{ -+ m_codecControlState = state; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-05-14 14:11:52.782931396 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-05-14 14:30:28.105682654 +0200 -@@ -29,7 +29,6 @@ - #include "DllSwScale.h" - #include "DllAvFilter.h" - --class CVDPAU; - class CCriticalSection; - - class CDVDVideoCodecFFmpeg : public CDVDVideoCodec -@@ -45,6 +44,8 @@ - virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) = 0; - virtual int Check (AVCodecContext* avctx) = 0; - virtual void Reset () {} -+ virtual bool CanSkipDeint() {return false; } -+ virtual void SetSpeed(int speed) {} - virtual const std::string Name() = 0; - virtual CCriticalSection* Section() { return NULL; } - }; -@@ -61,6 +62,9 @@ - virtual unsigned int SetFilters(unsigned int filters); - virtual const char* GetName() { return m_name.c_str(); }; // m_name is never changed after open - virtual unsigned GetConvergeCount(); -+ virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) {pts=m_decoderPts; skippedDeint=m_skippedDeint; if (m_pFrame) interlaced = m_pFrame->interlaced_frame; return true;} -+ virtual void SetSpeed(int speed); -+ virtual void SetCodecControl(int state); - - bool IsHardwareAllowed() { return !m_bSoftware; } - IHardwareDecoder * GetHardware() { return m_pHardware; }; -@@ -118,5 +122,9 @@ - int m_iLastKeyframe; - double m_dts; - bool m_started; -+ double m_decoderPts, m_decoderInterval; -+ int m_skippedDeint; -+ bool m_requestSkipDeint; -+ int m_codecControlState; - std::vector m_formats; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-05-14 14:15:12.117220123 +0200 -@@ -34,7 +34,8 @@ - - namespace DXVA { class CSurfaceContext; } - namespace VAAPI { struct CHolder; } --class CVDPAU; -+namespace VDPAU { class CVdpauRenderPicture; } -+namespace XVBA { class CXvbaRenderPicture; } - class COpenMax; - class COpenMaxVideo; - struct OpenMaxVideoBuffer; -@@ -59,11 +60,14 @@ - DXVA::CSurfaceContext* context; - }; - struct { -- CVDPAU* vdpau; -+ VDPAU::CVdpauRenderPicture* vdpau; - }; - struct { - VAAPI::CHolder* vaapi; - }; -+ struct { -+ XVBA::CXvbaRenderPicture* xvba; -+ }; - - struct { - COpenMax *openMax; -@@ -102,6 +106,7 @@ - enum EFormat { - FMT_YUV420P = 0, - FMT_VDPAU, -+ FMT_VDPAU_420, - FMT_NV12, - FMT_UYVY, - FMT_YUY2, -@@ -109,6 +114,7 @@ - FMT_VAAPI, - FMT_OMXEGL, - FMT_CVBREF, -+ FMT_XVBA, - } format; - }; - -@@ -125,6 +131,10 @@ - - #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped - #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data -+#define DVP_FLAG_DROPDEINT 0x00000040 // indicate that this picture was requested to have been dropped in deint stage -+ -+#define DVP_FLAG_SKIP_PROC 0x00000100 -+#define DVP_FLAG_DRAIN 0x00000200 - - // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2! - -@@ -143,6 +153,10 @@ - #define VC_PICTURE 0x00000004 // the decoder got a picture, call Decode(NULL, 0) again to parse the rest of the data - #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data - #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again -+#define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped -+#define VC_HURRY 0x00000040 -+#define VC_SKIPPROC 0x00000080 -+ - class CDVDVideoCodec - { - public: -@@ -207,7 +221,6 @@ - */ - virtual void SetDropState(bool bDrop) = 0; - -- - enum EFilterFlags { - FILTER_NONE = 0x0, - FILTER_DEINTERLACE_YADIF = 0x1, /* use first deinterlace mode */ -@@ -237,4 +250,16 @@ - { - return 0; - } -+ -+ virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) -+ { -+ return false; -+ } -+ -+ virtual void SetSpeed(int speed) -+ { -+ return; -+ } -+ -+ virtual void SetCodecControl(int state) {} - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-05-14 14:15:12.118220144 +0200 -@@ -17,6 +17,10 @@ - DVDVideoCodecCrystalHD.cpp \ - - endif -+ifeq (@USE_XVBA@,1) -+SRCS+= XVBA.cpp \ -+ -+endif - ifeq (@USE_VDA@,1) - SRCS+= DVDVideoCodecVDA.cpp \ - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-05-14 14:14:51.682808251 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-05-14 14:15:12.128220346 +0200 -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2005-2009 Team XBMC -+ * Copyright (C) 2005-2011 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify -@@ -33,11 +33,16 @@ - #include "settings/AdvancedSettings.h" - #include "Application.h" - #include "utils/MathUtils.h" -+#include "utils/TimeUtils.h" - #include "DVDCodecs/DVDCodecUtils.h" -+#include "cores/VideoRenderers/RenderFlags.h" -+ -+using namespace VDPAU; -+#define NUM_RENDER_PICS 9 - - #define ARSIZE(x) (sizeof(x) / sizeof((x)[0])) - --CVDPAU::Desc decoder_profiles[] = { -+CDecoder::Desc decoder_profiles[] = { - {"MPEG1", VDP_DECODER_PROFILE_MPEG1}, - {"MPEG2_SIMPLE", VDP_DECODER_PROFILE_MPEG2_SIMPLE}, - {"MPEG2_MAIN", VDP_DECODER_PROFILE_MPEG2_MAIN}, -@@ -51,14 +56,16 @@ - {"MPEG4_PART2_ASP", VDP_DECODER_PROFILE_MPEG4_PART2_ASP}, - #endif - }; --const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CVDPAU::Desc); -+const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CDecoder::Desc); - --static float studioCSC[3][4] = --{ -- { 1.0f, 0.0f, 1.57480000f,-0.78740000f}, -- { 1.0f,-0.18737736f,-0.46813736f, 0.32775736f}, -- { 1.0f, 1.85556000f, 0.0f,-0.92780000f} --}; -+//static float studioCSC[3][4] = -+//{ -+// { 1.0f, 0.0f, 1.57480000f,-0.78740000f}, -+// { 1.0f,-0.18737736f,-0.46813736f, 0.32775736f}, -+// { 1.0f, 1.85556000f, 0.0f,-0.92780000f} -+//}; -+static float studioCSCKCoeffs601[3] = {0.299, 0.587, 0.114}; //BT601 {Kr, Kg, Kb} -+static float studioCSCKCoeffs709[3] = {0.2126, 0.7152, 0.0722}; //BT709 {Kr, Kg, Kb} - - static struct SInterlaceMapping - { -@@ -69,59 +76,32 @@ - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL} - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL} - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL} --, {VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE} -+, {VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE} - , {VS_INTERLACEMETHOD_NONE , (VdpVideoMixerFeature)-1} - }; - - //since libvdpau 0.4, vdp_device_create_x11() installs a callback on the Display*, - //if we unload libvdpau with dlclose(), we segfault on XCloseDisplay, - //so we just keep a static handle to libvdpau around --void* CVDPAU::dl_handle; -- --CVDPAU::CVDPAU() --{ -- glXBindTexImageEXT = NULL; -- glXReleaseTexImageEXT = NULL; -- vdp_device = VDP_INVALID_HANDLE; -- surfaceNum = presentSurfaceNum = 0; -- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -- vdpauConfigured = false; -- m_DisplayState = VDPAU_OPEN; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -- m_mixerstep = 0; -+void* CDecoder::dl_handle; - -- m_glPixmap = 0; -- m_Pixmap = 0; -- if (!glXBindTexImageEXT) -- glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); -- if (!glXReleaseTexImageEXT) -- glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT"); -- -- totalAvailableOutputSurfaces = 0; -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- vdp_flip_target = VDP_INVALID_HANDLE; -- vdp_flip_queue = VDP_INVALID_HANDLE; -- vid_width = vid_height = OutWidth = OutHeight = 0; -- memset(&outRect, 0, sizeof(VdpRect)); -- memset(&outRectVid, 0, sizeof(VdpRect)); -- -- tmpBrightness = 0; -- tmpContrast = 0; -- tmpDeintMode = 0; -- tmpDeintGUI = 0; -- tmpDeint = 0; -- max_references = 0; -- -- for (int i = 0; i < NUM_OUTPUT_SURFACES; i++) -- outputSurfaces[i] = VDP_INVALID_HANDLE; -+//----------------------------------------------------------------------------- -+// CVDPAU -+//----------------------------------------------------------------------------- - -- videoMixer = VDP_INVALID_HANDLE; -- m_BlackBar = NULL; -+CDecoder::CDecoder() : m_vdpauOutput(&m_inMsgEvent) -+{ -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; -+ m_vdpauConfig.videoSurfaces = &m_videoSurfaces; -+ m_vdpauConfig.videoSurfaceSec = &m_videoSurfaceSec; - -- upScale = g_advancedSettings.m_videoVDPAUScaling; -+ m_picAge.b_age = m_picAge.ip_age[0] = m_picAge.ip_age[1] = 256*256*256*64; -+ m_vdpauConfigured = false; -+ m_DisplayState = VDPAU_OPEN; -+ m_speed = DVD_PLAYSPEED_NORMAL; - } - --bool CVDPAU::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) -+bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) - { - if(avctx->coded_width == 0 - || avctx->coded_height == 0) -@@ -129,6 +109,8 @@ - CLog::Log(LOGWARNING,"(VDPAU) no width/height available, can't init"); - return false; - } -+ m_vdpauConfig.numRenderBuffers = surfaces; -+ m_decoderThread = CThread::GetCurrentThreadId(); - - if (!dl_handle) - { -@@ -140,8 +122,6 @@ - error = "dlerror() returned NULL"; - - CLog::Log(LOGNOTICE,"(VDPAU) Unable to get handle to libvdpau: %s", error); -- //g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Error, "VDPAU", error, 10000); -- - return false; - } - } -@@ -150,8 +130,9 @@ - return false; - - InitVDPAUProcs(); -+ m_presentPicture = 0; - -- if (vdp_device != VDP_INVALID_HANDLE) -+ if (m_vdpauConfig.vdpDevice != VDP_INVALID_HANDLE) - { - SpewHardwareAvailable(); - -@@ -169,25 +150,23 @@ - - /* attempt to create a decoder with this width/height, some sizes are not supported by hw */ - VdpStatus vdp_st; -- vdp_st = vdp_decoder_create(vdp_device, profile, avctx->coded_width, avctx->coded_height, 5, &decoder); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_create(m_vdpauConfig.vdpDevice, profile, avctx->coded_width, avctx->coded_height, 5, &m_vdpauConfig.vdpDecoder); - - if(vdp_st != VDP_STATUS_OK) - { -- CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) checking for decoder support\n", vdp_get_error_string(vdp_st), vdp_st); -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) checking for decoder support\n", m_vdpauConfig.vdpProcs.vdp_get_error_string(vdp_st), vdp_st); - FiniVDPAUProcs(); - return false; - } - -- vdp_decoder_destroy(decoder); -+ m_vdpauConfig.vdpProcs.vdp_decoder_destroy(m_vdpauConfig.vdpDecoder); - CheckStatus(vdp_st, __LINE__); - } - -- InitCSCMatrix(avctx->coded_height); -- - /* finally setup ffmpeg */ -- avctx->get_buffer = CVDPAU::FFGetBuffer; -- avctx->release_buffer = CVDPAU::FFReleaseBuffer; -- avctx->draw_horiz_band = CVDPAU::FFDrawSlice; -+ avctx->get_buffer = CDecoder::FFGetBuffer; -+ avctx->release_buffer = CDecoder::FFReleaseBuffer; -+ avctx->draw_horiz_band = CDecoder::FFDrawSlice; - avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; - - g_Windowing.Register(this); -@@ -196,17 +175,20 @@ - return false; - } - --CVDPAU::~CVDPAU() -+CDecoder::~CDecoder() - { - Close(); - } - --void CVDPAU::Close() -+void CDecoder::Close() - { - CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); - -+ CSingleLock lock(m_DecoderSection); -+ - FiniVDPAUOutput(); - FiniVDPAUProcs(); -+ m_vdpauOutput.Dispose(); - - while (!m_videoSurfaces.empty()) - { -@@ -222,188 +204,118 @@ - m_dllAvUtil.Unload(); - } - --bool CVDPAU::MakePixmapGL() -+long CDecoder::Release() - { -- int num=0; -- int fbConfigIndex = 0; -- -- int doubleVisAttributes[] = { -- GLX_RENDER_TYPE, GLX_RGBA_BIT, -- GLX_RED_SIZE, 8, -- GLX_GREEN_SIZE, 8, -- GLX_BLUE_SIZE, 8, -- GLX_ALPHA_SIZE, 8, -- GLX_DEPTH_SIZE, 8, -- GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, -- GLX_BIND_TO_TEXTURE_RGBA_EXT, True, -- GLX_DOUBLEBUFFER, True, -- GLX_Y_INVERTED_EXT, True, -- GLX_X_RENDERABLE, True, -- None -- }; -- -- int pixmapAttribs[] = { -- GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, -- GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT, -- None -- }; -+ // check if we should do some pre-cleanup here -+ // a second decoder might need resources -+ if (m_vdpauConfigured == true) -+ { -+ CSingleLock lock(m_DecoderSection); -+ CLog::Log(LOGNOTICE,"CVDPAU::Release pre-cleanup"); -+ -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - pre-cleanup returned error", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - pre-cleanup timed out", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ } - -- GLXFBConfig *fbConfigs; -- fbConfigs = glXChooseFBConfig(m_Display, DefaultScreen(m_Display), doubleVisAttributes, &num); -- if (fbConfigs==NULL) -- { -- CLog::Log(LOGERROR, "GLX Error: MakePixmap: No compatible framebuffers found"); -- return false; -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ vdpau_render_state *render = m_videoSurfaces[i]; -+ if (render->surface != VDP_INVALID_HANDLE && !(render->state & FF_VDPAU_STATE_USED_FOR_RENDER)) -+ { -+ m_vdpauConfig.vdpProcs.vdp_video_surface_destroy(render->surface); -+ render->surface = VDP_INVALID_HANDLE; -+ } -+ } - } -- CLog::Log(LOGDEBUG, "Found %d fbconfigs.", num); -- fbConfigIndex = 0; -- CLog::Log(LOGDEBUG, "Using fbconfig index %d.", fbConfigIndex); -+ IHardwareDecoder::Release(); -+} - -- m_glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], m_Pixmap, pixmapAttribs); -+long CDecoder::ReleasePicReference() -+{ -+ return IHardwareDecoder::Release(); -+} - -- if (!m_glPixmap) -+void CDecoder::SetWidthHeight(int width, int height) -+{ -+ int vdpauMaxHeight = g_advancedSettings.m_videoVDPAUmaxHeight; -+ if (vdpauMaxHeight > 0 && height > vdpauMaxHeight) - { -- CLog::Log(LOGINFO, "GLX Error: Could not create Pixmap"); -- XFree(fbConfigs); -- return false; -+ width = MathUtils::round_int((double)width * vdpauMaxHeight / height); -+ height = vdpauMaxHeight; - } -- XFree(fbConfigs); - -- return true; --} -+ m_vdpauConfig.upscale = g_advancedSettings.m_videoVDPAUScaling; - --bool CVDPAU::MakePixmap(int width, int height) --{ - //pick the smallest dimensions, so we downscale with vdpau and upscale with opengl when appropriate - //this requires the least amount of gpu memory bandwidth -- if (g_graphicsContext.GetWidth() < width || g_graphicsContext.GetHeight() < height || upScale) -+ if (g_graphicsContext.GetWidth() < width || g_graphicsContext.GetHeight() < height || m_vdpauConfig.upscale >= 0) - { - //scale width to desktop size if the aspect ratio is the same or bigger than the desktop - if ((double)height * g_graphicsContext.GetWidth() / width <= (double)g_graphicsContext.GetHeight()) - { -- OutWidth = g_graphicsContext.GetWidth(); -- OutHeight = MathUtils::round_int((double)height * g_graphicsContext.GetWidth() / width); -+ m_vdpauConfig.outWidth = g_graphicsContext.GetWidth(); -+ m_vdpauConfig.outHeight = MathUtils::round_int((double)height * g_graphicsContext.GetWidth() / width); - } - else //scale height to the desktop size if the aspect ratio is smaller than the desktop - { -- OutHeight = g_graphicsContext.GetHeight(); -- OutWidth = MathUtils::round_int((double)width * g_graphicsContext.GetHeight() / height); -+ m_vdpauConfig.outHeight = g_graphicsContext.GetHeight(); -+ m_vdpauConfig.outWidth = MathUtils::round_int((double)width * g_graphicsContext.GetHeight() / height); - } - } - else - { //let opengl scale -- OutWidth = width; -- OutHeight = height; -- } -- -- CLog::Log(LOGNOTICE,"Creating %ix%i pixmap", OutWidth, OutHeight); -- -- // Get our window attribs. -- XWindowAttributes wndattribs; -- XGetWindowAttributes(m_Display, DefaultRootWindow(m_Display), &wndattribs); // returns a status but I don't know what success is -- -- m_Pixmap = XCreatePixmap(m_Display, -- DefaultRootWindow(m_Display), -- OutWidth, -- OutHeight, -- wndattribs.depth); -- if (!m_Pixmap) -- { -- CLog::Log(LOGERROR, "GLX Error: MakePixmap: Unable to create XPixmap"); -- return false; -- } -- -- XGCValues values = {}; -- GC xgc; -- values.foreground = BlackPixel (m_Display, DefaultScreen (m_Display)); -- xgc = XCreateGC(m_Display, m_Pixmap, GCForeground, &values); -- XFillRectangle(m_Display, m_Pixmap, xgc, 0, 0, OutWidth, OutHeight); -- XFreeGC(m_Display, xgc); -- -- if(!MakePixmapGL()) -- return false; -- -- return true; --} -- --void CVDPAU::BindPixmap() --{ -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- if (m_glPixmap) -- { -- if(presentSurface != VDP_INVALID_HANDLE) -- { -- VdpPresentationQueueStatus status; -- VdpTime time; -- VdpStatus vdp_st; -- vdp_st = vdp_presentation_queue_query_surface_status( -- vdp_flip_queue, presentSurface, &status, &time); -- CheckStatus(vdp_st, __LINE__); -- while(status != VDP_PRESENTATION_QUEUE_STATUS_VISIBLE && vdp_st == VDP_STATUS_OK) -- { -- Sleep(1); -- vdp_st = vdp_presentation_queue_query_surface_status( -- vdp_flip_queue, presentSurface, &status, &time); -- CheckStatus(vdp_st, __LINE__); -- } -- } -- -- glXBindTexImageEXT(m_Display, m_glPixmap, GLX_FRONT_LEFT_EXT, NULL); -- } -- else CLog::Log(LOGERROR,"(VDPAU) BindPixmap called without valid pixmap"); --} -- --void CVDPAU::ReleasePixmap() --{ -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- if (m_glPixmap) -- { -- glXReleaseTexImageEXT(m_Display, m_glPixmap, GLX_FRONT_LEFT_EXT); -+ m_vdpauConfig.outWidth = width; -+ m_vdpauConfig.outHeight = height; - } -- else CLog::Log(LOGERROR,"(VDPAU) ReleasePixmap called without valid pixmap"); -+ CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i vdpauMaxHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight, vdpauMaxHeight); - } - --void CVDPAU::OnLostDevice() -+void CDecoder::OnLostDevice() - { - CLog::Log(LOGNOTICE,"CVDPAU::OnLostDevice event"); - -- CExclusiveLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - FiniVDPAUOutput(); - FiniVDPAUProcs(); - - m_DisplayState = VDPAU_LOST; -+ lock.Leave(); - m_DisplayEvent.Reset(); - } - --void CVDPAU::OnResetDevice() -+void CDecoder::OnResetDevice() - { - CLog::Log(LOGNOTICE,"CVDPAU::OnResetDevice event"); - -- CExclusiveLock lock(m_DisplaySection); -+ CSingleLock lock(m_DecoderSection); - if (m_DisplayState == VDPAU_LOST) - { - m_DisplayState = VDPAU_RESET; -+ lock.Leave(); - m_DisplayEvent.Set(); - } - } - --int CVDPAU::Check(AVCodecContext* avctx) -+int CDecoder::Check(AVCodecContext* avctx) - { - EDisplayState state; - -- { CSharedLock lock(m_DisplaySection); -+ { CSingleLock lock(m_DecoderSection); - state = m_DisplayState; - } - -@@ -417,16 +329,13 @@ - } - else - { -- CSharedLock lock(m_DisplaySection); -+ CSingleLock lock(m_DecoderSection); - state = m_DisplayState; - } - } - if (state == VDPAU_RESET || state == VDPAU_ERROR) - { -- CLog::Log(LOGNOTICE,"Attempting recovery"); -- -- CSingleLock gLock(g_graphicsContext); -- CExclusiveLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - - FiniVDPAUOutput(); - FiniVDPAUProcs(); -@@ -441,7 +350,7 @@ - return 0; - } - --bool CVDPAU::IsVDPAUFormat(PixelFormat format) -+bool CDecoder::IsVDPAUFormat(PixelFormat format) - { - if ((format >= PIX_FMT_VDPAU_H264) && (format <= PIX_FMT_VDPAU_VC1)) return true; - #if (defined PIX_FMT_VDPAU_MPEG4_IN_AVUTIL) -@@ -450,90 +359,28 @@ - else return false; - } - --void CVDPAU::CheckFeatures() --{ -- if (videoMixer == VDP_INVALID_HANDLE) -- { -- CLog::Log(LOGNOTICE, " (VDPAU) Creating the video mixer"); -- // Creation of VideoMixer. -- VdpVideoMixerParameter parameters[] = { -- VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, -- VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, -- VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE -- }; -- -- void const * parameter_values[] = { -- &surface_width, -- &surface_height, -- &vdp_chroma_type -- }; -- -- tmpBrightness = 0; -- tmpContrast = 0; -- tmpNoiseReduction = 0; -- tmpSharpness = 0; -- -- VdpStatus vdp_st = VDP_STATUS_ERROR; -- vdp_st = vdp_video_mixer_create(vdp_device, -- m_feature_count, -- m_features, -- ARSIZE(parameters), -- parameters, -- parameter_values, -- &videoMixer); -- CheckStatus(vdp_st, __LINE__); -- -- SetHWUpscaling(); -- } -- -- if (tmpBrightness != g_settings.m_currentVideoSettings.m_Brightness || -- tmpContrast != g_settings.m_currentVideoSettings.m_Contrast) -- { -- SetColor(); -- tmpBrightness = g_settings.m_currentVideoSettings.m_Brightness; -- tmpContrast = g_settings.m_currentVideoSettings.m_Contrast; -- } -- if (tmpNoiseReduction != g_settings.m_currentVideoSettings.m_NoiseReduction) -- { -- tmpNoiseReduction = g_settings.m_currentVideoSettings.m_NoiseReduction; -- SetNoiseReduction(); -- } -- if (tmpSharpness != g_settings.m_currentVideoSettings.m_Sharpness) -- { -- tmpSharpness = g_settings.m_currentVideoSettings.m_Sharpness; -- SetSharpness(); -- } -- if ( tmpDeintMode != g_settings.m_currentVideoSettings.m_DeinterlaceMode || -- tmpDeintGUI != g_settings.m_currentVideoSettings.m_InterlaceMethod || -- (tmpDeintGUI == VS_INTERLACEMETHOD_AUTO && tmpDeint != AutoInterlaceMethod())) -- { -- tmpDeintMode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- tmpDeintGUI = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (tmpDeintGUI == VS_INTERLACEMETHOD_AUTO) -- tmpDeint = AutoInterlaceMethod(); -- else -- tmpDeint = tmpDeintGUI; -- -- SetDeinterlacing(); -- } --} -- --bool CVDPAU::Supports(VdpVideoMixerFeature feature) -+bool CDecoder::Supports(VdpVideoMixerFeature feature) - { -- for(int i = 0; i < m_feature_count; i++) -+ for(int i = 0; i < m_vdpauConfig.featureCount; i++) - { -- if(m_features[i] == feature) -+ if(m_vdpauConfig.vdpFeatures[i] == feature) - return true; - } - return false; - } - --bool CVDPAU::Supports(EINTERLACEMETHOD method) -+bool CDecoder::Supports(EINTERLACEMETHOD method) - { - if(method == VS_INTERLACEMETHOD_VDPAU_BOB - || method == VS_INTERLACEMETHOD_AUTO) - return true; - -+ if (g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) -+ { -+ if (method == VS_INTERLACEMETHOD_RENDER_BOB) -+ return true; -+ } -+ - for(SInterlaceMapping* p = g_interlace_mapping; p->method != VS_INTERLACEMETHOD_NONE; p++) - { - if(p->method == method) -@@ -542,149 +389,12 @@ - return false; - } - --EINTERLACEMETHOD CVDPAU::AutoInterlaceMethod() --{ -- return VS_INTERLACEMETHOD_VDPAU_TEMPORAL; --} -- --void CVDPAU::SetColor() --{ -- VdpStatus vdp_st; -- -- if (tmpBrightness != g_settings.m_currentVideoSettings.m_Brightness) -- m_Procamp.brightness = (float)((g_settings.m_currentVideoSettings.m_Brightness)-50) / 100; -- if (tmpContrast != g_settings.m_currentVideoSettings.m_Contrast) -- m_Procamp.contrast = (float)((g_settings.m_currentVideoSettings.m_Contrast)+50) / 100; -- -- if(vid_height >= 600 || vid_width > 1024) -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_709, &m_CSCMatrix); -- else -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); -- -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; -- if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) -- { -- void const * pm_CSCMatix[] = { &studioCSC }; -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -- } -- else -- { -- void const * pm_CSCMatix[] = { &m_CSCMatrix }; -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -- } -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetNoiseReduction() --{ -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION }; -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL }; -- VdpStatus vdp_st; -- -- if (!g_settings.m_currentVideoSettings.m_NoiseReduction) -- { -- VdpBool enabled[]= {0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- return; -- } -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- void* nr[] = { &g_settings.m_currentVideoSettings.m_NoiseReduction }; -- CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",g_settings.m_currentVideoSettings.m_NoiseReduction); -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, nr); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetSharpness() --{ -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS }; -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL }; -- VdpStatus vdp_st; -- -- if (!g_settings.m_currentVideoSettings.m_Sharpness) -- { -- VdpBool enabled[]={0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- return; -- } -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- void* sh[] = { &g_settings.m_currentVideoSettings.m_Sharpness }; -- CLog::Log(LOGNOTICE,"Setting Sharpness to %f",g_settings.m_currentVideoSettings.m_Sharpness); -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, sh); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetHWUpscaling() --{ --#ifdef VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1) || !upScale) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -- VdpStatus vdp_st; -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); --#endif --} -- --void CVDPAU::SetDeinterlacing() -+EINTERLACEMETHOD CDecoder::AutoInterlaceMethod() - { -- VdpStatus vdp_st; -- EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (method == VS_INTERLACEMETHOD_AUTO) -- method = AutoInterlaceMethod(); -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -- VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -- VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE }; -- if (mode == VS_DEINTERLACEMODE_OFF) -- { -- VdpBool enabled[]={0,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else -- { -- if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF) -- { -- VdpBool enabled[]={1,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF) -- { -- VdpBool enabled[]={1,1,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else if (method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE) -- { -- VdpBool enabled[]={1,0,1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else -- { -- VdpBool enabled[]={0,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- } -- -- CheckStatus(vdp_st, __LINE__); -+ return VS_INTERLACEMETHOD_RENDER_BOB; - } - --void CVDPAU::InitVDPAUProcs() -+void CDecoder::InitVDPAUProcs() - { - char* error; - -@@ -694,151 +404,115 @@ - if (error) - { - CLog::Log(LOGERROR,"(VDPAU) - %s in %s",error,__FUNCTION__); -- vdp_device = VDP_INVALID_HANDLE; -- -- //g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Error, "VDPAU", error, 10000); -- -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - return; - } - - if (dl_vdp_device_create_x11) - { -- CSingleLock lock(g_graphicsContext); -- m_Display = g_Windowing.GetDisplay(); -+ m_Display = XOpenDisplay(NULL); - } - - int mScreen = DefaultScreen(m_Display); - VdpStatus vdp_st; - - // Create Device -- // tested on 64bit Ubuntu 11.10 and it deadlocked without this -- XLockDisplay(m_Display); - vdp_st = dl_vdp_device_create_x11(m_Display, //x_display, - mScreen, //x_screen, -- &vdp_device, -- &vdp_get_proc_address); -- XUnlockDisplay(m_Display); -+ &m_vdpauConfig.vdpDevice, -+ &m_vdpauConfig.vdpProcs.vdp_get_proc_address); - -- CLog::Log(LOGNOTICE,"vdp_device = 0x%08x vdp_st = 0x%08x",vdp_device,vdp_st); -+ CLog::Log(LOGNOTICE,"vdp_device = 0x%08x vdp_st = 0x%08x",m_vdpauConfig.vdpDevice,vdp_st); - if (vdp_st != VDP_STATUS_OK) - { - CLog::Log(LOGERROR,"(VDPAU) unable to init VDPAU - vdp_st = 0x%x. Falling back.",vdp_st); -- vdp_device = VDP_INVALID_HANDLE; -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - return; - } - -- if (vdp_st != VDP_STATUS_OK) -- { -- CLog::Log(LOGERROR,"(VDPAU) - Unable to create X11 device in %s",__FUNCTION__); -- vdp_device = VDP_INVALID_HANDLE; -- return; -- } - #define VDP_PROC(id, proc) \ - do { \ -- vdp_st = vdp_get_proc_address(vdp_device, id, (void**)&proc); \ -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_get_proc_address(m_vdpauConfig.vdpDevice, id, (void**)&proc); \ - CheckStatus(vdp_st, __LINE__); \ - } while(0); - -- VDP_PROC(VDP_FUNC_ID_GET_ERROR_STRING , vdp_get_error_string); -- VDP_PROC(VDP_FUNC_ID_DEVICE_DESTROY , vdp_device_destroy); -- VDP_PROC(VDP_FUNC_ID_GENERATE_CSC_MATRIX , vdp_generate_csc_matrix); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_CREATE , vdp_video_surface_create); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY , vdp_video_surface_destroy); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR , vdp_video_surface_put_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR , vdp_video_surface_get_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR , vdp_output_surface_put_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE , vdp_output_surface_put_bits_native); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE , vdp_output_surface_create); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY , vdp_output_surface_destroy); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE , vdp_output_surface_get_bits_native); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, vdp_output_surface_render_output_surface); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED , vdp_output_surface_put_bits_indexed); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_CREATE , vdp_video_mixer_create); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES , vdp_video_mixer_set_feature_enables); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_DESTROY , vdp_video_mixer_destroy); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_RENDER , vdp_video_mixer_render); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES , vdp_video_mixer_set_attribute_values); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT , vdp_video_mixer_query_parameter_support); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT , vdp_video_mixer_query_feature_support); -- VDP_PROC(VDP_FUNC_ID_DECODER_CREATE , vdp_decoder_create); -- VDP_PROC(VDP_FUNC_ID_DECODER_DESTROY , vdp_decoder_destroy); -- VDP_PROC(VDP_FUNC_ID_DECODER_RENDER , vdp_decoder_render); -- VDP_PROC(VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES , vdp_decoder_query_caps); -- VDP_PROC(VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER , vdp_preemption_callback_register); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY , vdp_presentation_queue_target_destroy); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE , vdp_presentation_queue_create); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY , vdp_presentation_queue_destroy); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY , vdp_presentation_queue_display); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, vdp_presentation_queue_block_until_surface_idle); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 , vdp_presentation_queue_target_create_x11); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS , vdp_presentation_queue_query_surface_status); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME , vdp_presentation_queue_get_time); -- -+ VDP_PROC(VDP_FUNC_ID_GET_ERROR_STRING , m_vdpauConfig.vdpProcs.vdp_get_error_string); -+ VDP_PROC(VDP_FUNC_ID_DEVICE_DESTROY , m_vdpauConfig.vdpProcs.vdp_device_destroy); -+ VDP_PROC(VDP_FUNC_ID_GENERATE_CSC_MATRIX , m_vdpauConfig.vdpProcs.vdp_generate_csc_matrix); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_CREATE , m_vdpauConfig.vdpProcs.vdp_video_surface_create); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY , m_vdpauConfig.vdpProcs.vdp_video_surface_destroy); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_video_surface_put_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_video_surface_get_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_native); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE , m_vdpauConfig.vdpProcs.vdp_output_surface_create); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY , m_vdpauConfig.vdpProcs.vdp_output_surface_destroy); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE , m_vdpauConfig.vdpProcs.vdp_output_surface_get_bits_native); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, m_vdpauConfig.vdpProcs.vdp_output_surface_render_output_surface); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_indexed); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_CREATE , m_vdpauConfig.vdpProcs.vdp_video_mixer_create); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES , m_vdpauConfig.vdpProcs.vdp_video_mixer_set_feature_enables); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_DESTROY , m_vdpauConfig.vdpProcs.vdp_video_mixer_destroy); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_RENDER , m_vdpauConfig.vdpProcs.vdp_video_mixer_render); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES , m_vdpauConfig.vdpProcs.vdp_video_mixer_set_attribute_values); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT , m_vdpauConfig.vdpProcs.vdp_video_mixer_query_parameter_support); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT , m_vdpauConfig.vdpProcs.vdp_video_mixer_query_feature_support); -+ VDP_PROC(VDP_FUNC_ID_DECODER_CREATE , m_vdpauConfig.vdpProcs.vdp_decoder_create); -+ VDP_PROC(VDP_FUNC_ID_DECODER_DESTROY , m_vdpauConfig.vdpProcs.vdp_decoder_destroy); -+ VDP_PROC(VDP_FUNC_ID_DECODER_RENDER , m_vdpauConfig.vdpProcs.vdp_decoder_render); -+ VDP_PROC(VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES , m_vdpauConfig.vdpProcs.vdp_decoder_query_caps); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_target_destroy); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE , m_vdpauConfig.vdpProcs.vdp_presentation_queue_create); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_destroy); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_display); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, m_vdpauConfig.vdpProcs.vdp_presentation_queue_block_until_surface_idle); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 , m_vdpauConfig.vdpProcs.vdp_presentation_queue_target_create_x11); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS , m_vdpauConfig.vdpProcs.vdp_presentation_queue_query_surface_status); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME , m_vdpauConfig.vdpProcs.vdp_presentation_queue_get_time); -+ - #undef VDP_PROC - - // set all vdpau resources to invalid -- vdp_flip_target = VDP_INVALID_HANDLE; -- vdp_flip_queue = VDP_INVALID_HANDLE; -- videoMixer = VDP_INVALID_HANDLE; -- totalAvailableOutputSurfaces = 0; -- presentSurface = VDP_INVALID_HANDLE; -- outputSurface = VDP_INVALID_HANDLE; -- for (int i = 0; i < NUM_OUTPUT_SURFACES; i++) -- outputSurfaces[i] = VDP_INVALID_HANDLE; -- -- m_vdpauOutputMethod = OUTPUT_NONE; -- -- CExclusiveLock lock(m_DisplaySection); - m_DisplayState = VDPAU_OPEN; -- vdpauConfigured = false; -+ m_vdpauConfigured = false; - } - --void CVDPAU::FiniVDPAUProcs() -+void CDecoder::FiniVDPAUProcs() - { -- if (vdp_device == VDP_INVALID_HANDLE) return; -+ if (m_vdpauConfig.vdpDevice == VDP_INVALID_HANDLE) return; - - VdpStatus vdp_st; -- vdp_st = vdp_device_destroy(vdp_device); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_device_destroy(m_vdpauConfig.vdpDevice); - CheckStatus(vdp_st, __LINE__); -- vdp_device = VDP_INVALID_HANDLE; -- vdpauConfigured = false; -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - } - --void CVDPAU::InitCSCMatrix(int Height) -+void CDecoder::FiniVDPAUOutput() - { -+ if (m_vdpauConfig.vdpDevice == VDP_INVALID_HANDLE || !m_vdpauConfigured) return; -+ -+ CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); -+ -+ // uninit output -+ m_vdpauOutput.Dispose(); -+ m_vdpauConfigured = false; -+ - VdpStatus vdp_st; -- m_Procamp.struct_version = VDP_PROCAMP_VERSION; -- m_Procamp.brightness = 0.0; -- m_Procamp.contrast = 1.0; -- m_Procamp.saturation = 1.0; -- m_Procamp.hue = 0; -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, -- (Height < 720)? VDP_COLOR_STANDARD_ITUR_BT_601 : VDP_COLOR_STANDARD_ITUR_BT_709, -- &m_CSCMatrix); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::FiniVDPAUOutput() --{ -- FiniOutputMethod(); -- -- if (vdp_device == VDP_INVALID_HANDLE || !vdpauConfigured) return; - -- CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); -- -- VdpStatus vdp_st; -- -- vdp_st = vdp_decoder_destroy(decoder); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_destroy(m_vdpauConfig.vdpDecoder); - if (CheckStatus(vdp_st, __LINE__)) - return; -- decoder = VDP_INVALID_HANDLE; -+ m_vdpauConfig.vdpDecoder = VDP_INVALID_HANDLE; - -- for (unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ CSingleLock lock(m_videoSurfaceSec); -+ CLog::Log(LOGDEBUG, "CVDPAU::FiniVDPAUOutput destroying %d video surfaces", (int)m_videoSurfaces.size()); -+ -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) - { - vdpau_render_state *render = m_videoSurfaces[i]; - if (render->surface != VDP_INVALID_HANDLE) - { -- vdp_st = vdp_video_surface_destroy(render->surface); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_video_surface_destroy(render->surface); - render->surface = VDP_INVALID_HANDLE; - } - if (CheckStatus(vdp_st, __LINE__)) -@@ -846,8 +520,7 @@ - } - } - -- --void CVDPAU::ReadFormatOf( PixelFormat fmt -+void CDecoder::ReadFormatOf( PixelFormat fmt - , VdpDecoderProfile &vdp_decoder_profile - , VdpChromaType &vdp_chroma_type) - { -@@ -885,170 +558,78 @@ - } - } - -- --bool CVDPAU::ConfigVDPAU(AVCodecContext* avctx, int ref_frames) -+bool CDecoder::ConfigVDPAU(AVCodecContext* avctx, int ref_frames) - { - FiniVDPAUOutput(); - - VdpStatus vdp_st; - VdpDecoderProfile vdp_decoder_profile; -- vid_width = avctx->width; -- vid_height = avctx->height; -- surface_width = avctx->coded_width; -- surface_height = avctx->coded_height; -- -- past[1] = past[0] = current = future = NULL; -- CLog::Log(LOGNOTICE, " (VDPAU) screenWidth:%i vidWidth:%i surfaceWidth:%i",OutWidth,vid_width,surface_width); -- CLog::Log(LOGNOTICE, " (VDPAU) screenHeight:%i vidHeight:%i surfaceHeight:%i",OutHeight,vid_height,surface_height); -- ReadFormatOf(avctx->pix_fmt, vdp_decoder_profile, vdp_chroma_type); -+ -+ m_vdpauConfig.vidWidth = avctx->width; -+ m_vdpauConfig.vidHeight = avctx->height; -+ m_vdpauConfig.surfaceWidth = avctx->coded_width; -+ m_vdpauConfig.surfaceHeight = avctx->coded_height; -+ -+ SetWidthHeight(avctx->width,avctx->height); -+ -+ CLog::Log(LOGNOTICE, " (VDPAU) screenWidth:%i vidWidth:%i surfaceWidth:%i",m_vdpauConfig.outWidth,m_vdpauConfig.vidWidth,m_vdpauConfig.surfaceWidth); -+ CLog::Log(LOGNOTICE, " (VDPAU) screenHeight:%i vidHeight:%i surfaceHeight:%i",m_vdpauConfig.outHeight,m_vdpauConfig.vidHeight,m_vdpauConfig.surfaceHeight); -+ -+ ReadFormatOf(avctx->pix_fmt, vdp_decoder_profile, m_vdpauConfig.vdpChromaType); - - if(avctx->pix_fmt == PIX_FMT_VDPAU_H264) - { -- max_references = ref_frames; -- if (max_references > 16) max_references = 16; -- if (max_references < 5) max_references = 5; -+ m_vdpauConfig.maxReferences = ref_frames; -+ if (m_vdpauConfig.maxReferences > 16) m_vdpauConfig.maxReferences = 16; -+ if (m_vdpauConfig.maxReferences < 5) m_vdpauConfig.maxReferences = 5; - } - else -- max_references = 2; -+ m_vdpauConfig.maxReferences = 2; - -- vdp_st = vdp_decoder_create(vdp_device, -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_create(m_vdpauConfig.vdpDevice, - vdp_decoder_profile, -- surface_width, -- surface_height, -- max_references, -- &decoder); -- if (CheckStatus(vdp_st, __LINE__)) -- return false; -- -- m_vdpauOutputMethod = OUTPUT_NONE; -- -- vdpauConfigured = true; -- return true; --} -- --bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame) --{ -- VdpStatus vdp_st; -- -- if (m_vdpauOutputMethod == OUTPUT_PIXMAP) -- return true; -- -- FiniOutputMethod(); -- -- MakePixmap(avctx->width,avctx->height); -- -- vdp_st = vdp_presentation_queue_target_create_x11(vdp_device, -- m_Pixmap, //x_window, -- &vdp_flip_target); -- if (CheckStatus(vdp_st, __LINE__)) -- return false; -- -- vdp_st = vdp_presentation_queue_create(vdp_device, -- vdp_flip_target, -- &vdp_flip_queue); -+ m_vdpauConfig.surfaceWidth, -+ m_vdpauConfig.surfaceHeight, -+ m_vdpauConfig.maxReferences, -+ &m_vdpauConfig.vdpDecoder); - if (CheckStatus(vdp_st, __LINE__)) - return false; - -- totalAvailableOutputSurfaces = 0; -- -- int tmpMaxOutputSurfaces = NUM_OUTPUT_SURFACES; -- if (vid_width == FULLHD_WIDTH) -- tmpMaxOutputSurfaces = NUM_OUTPUT_SURFACES_FOR_FULLHD; -- -- // Creation of outputSurfaces -- for (int i = 0; i < NUM_OUTPUT_SURFACES && i < tmpMaxOutputSurfaces; i++) -- { -- vdp_st = vdp_output_surface_create(vdp_device, -- VDP_RGBA_FORMAT_B8G8R8A8, -- OutWidth, -- OutHeight, -- &outputSurfaces[i]); -- if (CheckStatus(vdp_st, __LINE__)) -+ // initialize output -+ CSingleLock lock(g_graphicsContext); -+ m_vdpauConfig.stats = &m_bufferStats; -+ m_vdpauConfig.vdpau = this; -+ m_bufferStats.Reset(); -+ m_vdpauOutput.Start(); -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::INIT, -+ &reply, -+ 2000, -+ &m_vdpauConfig, -+ sizeof(m_vdpauConfig))) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - vdpau output returned error", __FUNCTION__); -+ m_vdpauOutput.Dispose(); - return false; -- totalAvailableOutputSurfaces++; -- } -- CLog::Log(LOGNOTICE, " (VDPAU) Total Output Surfaces Available: %i of a max (tmp: %i const: %i)", -- totalAvailableOutputSurfaces, -- tmpMaxOutputSurfaces, -- NUM_OUTPUT_SURFACES); -- -- // create 3 pitches of black lines needed for clipping top -- // and bottom lines when de-interlacing -- m_BlackBar = new uint32_t[3*OutWidth]; -- memset(m_BlackBar, 0, 3*OutWidth*sizeof(uint32_t)); -- -- surfaceNum = presentSurfaceNum = 0; -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- videoMixer = VDP_INVALID_HANDLE; -- -- m_vdpauOutputMethod = OUTPUT_PIXMAP; -- -- return true; --} -- --bool CVDPAU::FiniOutputMethod() --{ -- VdpStatus vdp_st; -- -- if (vdp_flip_queue != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_presentation_queue_destroy(vdp_flip_queue); -- vdp_flip_queue = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (vdp_flip_target != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_presentation_queue_target_destroy(vdp_flip_target); -- vdp_flip_target = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (m_glPixmap) -- { -- CLog::Log(LOGDEBUG, "GLX: Destroying glPixmap"); -- glXDestroyPixmap(m_Display, m_glPixmap); -- m_glPixmap = None; -- } -- -- if (m_Pixmap) -- { -- CLog::Log(LOGDEBUG, "GLX: Destroying XPixmap"); -- XFreePixmap(m_Display, m_Pixmap); -- m_Pixmap = None; -- } -- -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- -- for (int i = 0; i < totalAvailableOutputSurfaces; i++) -- { -- if (outputSurfaces[i] == VDP_INVALID_HANDLE) -- continue; -- vdp_st = vdp_output_surface_destroy(outputSurfaces[i]); -- outputSurfaces[i] = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (videoMixer != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_video_mixer_destroy(videoMixer); -- videoMixer = VDP_INVALID_HANDLE; -- if (CheckStatus(vdp_st, __LINE__)); -+ } - } -- -- if (m_BlackBar) -+ else - { -- delete [] m_BlackBar; -- m_BlackBar = NULL; -+ CLog::Log(LOGERROR, "VDPAU::%s - failed to init output", __FUNCTION__); -+ m_vdpauOutput.Dispose(); -+ return false; - } - -- while (!m_DVDVideoPics.empty()) -- m_DVDVideoPics.pop(); -- -+ m_inMsgEvent.Reset(); -+ m_vdpauConfigured = true; - return true; - } - --void CVDPAU::SpewHardwareAvailable() //Copyright (c) 2008 Wladimir J. van der Laan -- VDPInfo -+void CDecoder::SpewHardwareAvailable() //CopyrighVDPAUt (c) 2008 Wladimir J. van der Laan -- VDPInfo - { - VdpStatus rv; - CLog::Log(LOGNOTICE,"VDPAU Decoder capabilities:"); -@@ -1058,7 +639,7 @@ - { - VdpBool is_supported = false; - uint32_t max_level, max_macroblocks, max_width, max_height; -- rv = vdp_decoder_query_caps(vdp_device, decoder_profiles[x].id, -+ rv = m_vdpauConfig.vdpProcs.vdp_decoder_query_caps(m_vdpauConfig.vdpDevice, decoder_profiles[x].id, - &is_supported, &max_level, &max_macroblocks, &max_width, &max_height); - if(rv == VDP_STATUS_OK && is_supported) - { -@@ -1067,13 +648,13 @@ - } - } - CLog::Log(LOGNOTICE,"------------------------------------"); -- m_feature_count = 0; -+ m_vdpauConfig.featureCount = 0; - #define CHECK_SUPPORT(feature) \ - do { \ - VdpBool supported; \ -- if(vdp_video_mixer_query_feature_support(vdp_device, feature, &supported) == VDP_STATUS_OK && supported) { \ -+ if(m_vdpauConfig.vdpProcs.vdp_video_mixer_query_feature_support(m_vdpauConfig.vdpDevice, feature, &supported) == VDP_STATUS_OK && supported) { \ - CLog::Log(LOGNOTICE, "Mixer feature: "#feature); \ -- m_features[m_feature_count++] = feature; \ -+ m_vdpauConfig.vdpFeatures[m_vdpauConfig.featureCount++] = feature; \ - } \ - } while(false) - -@@ -1097,7 +678,7 @@ - - } - --bool CVDPAU::IsSurfaceValid(vdpau_render_state *render) -+bool CDecoder::IsSurfaceValid(vdpau_render_state *render) - { - // find render state in queue - bool found(false); -@@ -1124,34 +705,34 @@ - return true; - } - --int CVDPAU::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) -+int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) - { - //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -- struct pictureAge* pA = &vdp->picAge; -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); -+ struct PictureAge* pA = &vdp->m_picAge; - - // while we are waiting to recover we can't do anything -- CSharedLock lock(vdp->m_DecoderSection); -+ CSingleLock lock(vdp->m_DecoderSection); - -- { CSharedLock dLock(vdp->m_DisplaySection); -- if(vdp->m_DisplayState != VDPAU_OPEN) -- { -- CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - returning due to awaiting recovery"); -- return -1; -- } -+ if(vdp->m_DisplayState != VDPAU_OPEN) -+ { -+ CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - returning due to awaiting recovery"); -+ return -1; - } - - vdpau_render_state * render = NULL; - - // find unused surface -- for(unsigned int i = 0; i < vdp->m_videoSurfaces.size(); i++) -- { -- if(!(vdp->m_videoSurfaces[i]->state & (FF_VDPAU_STATE_USED_FOR_REFERENCE | FF_VDPAU_STATE_USED_FOR_RENDER))) -+ { CSingleLock lock(vdp->m_videoSurfaceSec); -+ for(unsigned int i = 0; i < vdp->m_videoSurfaces.size(); i++) - { -- render = vdp->m_videoSurfaces[i]; -- render->state = 0; -- break; -+ if(!(vdp->m_videoSurfaces[i]->state & (FF_VDPAU_STATE_USED_FOR_REFERENCE | FF_VDPAU_STATE_USED_FOR_RENDER))) -+ { -+ render = vdp->m_videoSurfaces[i]; -+ render->state = 0; -+ break; -+ } - } - } - -@@ -1160,21 +741,22 @@ - { - // create a new surface - VdpDecoderProfile profile; -- ReadFormatOf(avctx->pix_fmt, profile, vdp->vdp_chroma_type); -+ ReadFormatOf(avctx->pix_fmt, profile, vdp->m_vdpauConfig.vdpChromaType); - render = (vdpau_render_state*)calloc(sizeof(vdpau_render_state), 1); - if (render == NULL) - { - CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - calloc failed"); - return -1; - } -+ CSingleLock lock(vdp->m_videoSurfaceSec); - render->surface = VDP_INVALID_HANDLE; - vdp->m_videoSurfaces.push_back(render); - } - - if (render->surface == VDP_INVALID_HANDLE) - { -- vdp_st = vdp->vdp_video_surface_create(vdp->vdp_device, -- vdp->vdp_chroma_type, -+ vdp_st = vdp->m_vdpauConfig.vdpProcs.vdp_video_surface_create(vdp->m_vdpauConfig.vdpDevice, -+ vdp->m_vdpauConfig.vdpChromaType, - avctx->coded_width, - avctx->coded_height, - &render->surface); -@@ -1214,15 +796,16 @@ - return 0; - } - --void CVDPAU::FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic) -+void CDecoder::FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic) - { - //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); -+ - vdpau_render_state * render; - unsigned int i; - -- CSharedLock lock(vdp->m_DecoderSection); -+ CSingleLock lock(vdp->m_DecoderSection); - - render=(vdpau_render_state*)pic->data[0]; - if(!render) -@@ -1231,6 +814,8 @@ - return; - } - -+ CSingleLock vLock(vdp->m_videoSurfaceSec); -+ render->state &= ~FF_VDPAU_STATE_USED_FOR_REFERENCE; - for(i=0; i<4; i++) - pic->data[i]= NULL; - -@@ -1245,21 +830,18 @@ - } - - --void CVDPAU::FFDrawSlice(struct AVCodecContext *s, -+void CDecoder::FFDrawSlice(struct AVCodecContext *s, - const AVFrame *src, int offset[4], - int y, int type, int height) - { - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)s->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); - - // while we are waiting to recover we can't do anything -- CSharedLock lock(vdp->m_DecoderSection); -- -- { CSharedLock dLock(vdp->m_DisplaySection); -- if(vdp->m_DisplayState != VDPAU_OPEN) -- return; -- } -+ CSingleLock lock(vdp->m_DecoderSection); - -+ if(vdp->m_DisplayState != VDPAU_OPEN) -+ return; - - if(src->linesize[0] || src->linesize[1] || src->linesize[2] - || offset[0] || offset[1] || offset[2]) -@@ -1289,59 +871,41 @@ - if(s->pix_fmt == PIX_FMT_VDPAU_H264) - max_refs = render->info.h264.num_ref_frames; - -- if(vdp->decoder == VDP_INVALID_HANDLE -- || vdp->vdpauConfigured == false -- || vdp->max_references < max_refs) -+ if(vdp->m_vdpauConfig.vdpDecoder == VDP_INVALID_HANDLE -+ || vdp->m_vdpauConfigured == false -+ || vdp->m_vdpauConfig.maxReferences < max_refs) - { - if(!vdp->ConfigVDPAU(s, max_refs)) - return; - } - -- vdp_st = vdp->vdp_decoder_render(vdp->decoder, -+ uint64_t startTime = CurrentHostCounter(); -+ uint16_t decoded, processed, rend; -+ vdp->m_bufferStats.Get(decoded, processed, rend); -+ vdp_st = vdp->m_vdpauConfig.vdpProcs.vdp_decoder_render(vdp->m_vdpauConfig.vdpDecoder, - render->surface, - (VdpPictureInfo const *)&(render->info), - render->bitstream_buffers_used, - render->bitstream_buffers); - vdp->CheckStatus(vdp_st, __LINE__); -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (diff*1000/CurrentHostFrequency() > 30) -+ CLog::Log(LOGWARNING,"CVDPAU::DrawSlice - VdpDecoderRender long decoding: %d ms, dec: %d, proc: %d, rend: %d", (int)((diff*1000)/CurrentHostFrequency()), decoded, processed, rend); -+ - } - --int CVDPAU::Decode(AVCodecContext *avctx, AVFrame *pFrame) --{ -- //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); -- VdpStatus vdp_st; -- VdpTime time; - -+int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bool bHardDrain) -+{ - int result = Check(avctx); - if (result) - return result; - -- CSharedLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - -- if (!vdpauConfigured) -+ if (!m_vdpauConfigured) - return VC_ERROR; - -- // configure vdpau output -- if (!ConfigOutputMethod(avctx, pFrame)) -- return VC_FLUSHED; -- -- outputSurface = outputSurfaces[surfaceNum]; -- -- CheckFeatures(); -- -- if (( (int)outRectVid.x1 != OutWidth ) || -- ( (int)outRectVid.y1 != OutHeight )) -- { -- outRectVid.x0 = 0; -- outRectVid.y0 = 0; -- outRectVid.x1 = OutWidth; -- outRectVid.y1 = OutHeight; -- } -- -- EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (method == VS_INTERLACEMETHOD_AUTO) -- method = AutoInterlaceMethod(); -- - if(pFrame) - { // we have a new frame from decoder - -@@ -1349,7 +913,10 @@ - if(!render) // old style ffmpeg gave data on plane 0 - render = (vdpau_render_state*)pFrame->data[0]; - if(!render) -+ { -+ CLog::Log(LOGERROR, "CVDPAU::Decode: no valid frame"); - return VC_ERROR; -+ } - - // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid - if (!IsSurfaceValid(render)) -@@ -1358,256 +925,175 @@ - return VC_BUFFER; - } - -+ CSingleLock lock(m_videoSurfaceSec); - render->state |= FF_VDPAU_STATE_USED_FOR_RENDER; -+ lock.Leave(); -+ -+ // send frame to output for processing -+ CVdpauDecodedPicture pic; -+ memset(&pic.DVDPic, 0, sizeof(pic.DVDPic)); -+ ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&pic.DVDPic); -+ pic.render = render; -+ m_bufferStats.IncDecoded(); -+ m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); - -- ClearUsedForRender(&past[0]); -- past[0] = past[1]; -- past[1] = current; -- current = future; -- future = render; -- -- DVDVideoPicture DVDPic; -- memset(&DVDPic, 0, sizeof(DVDVideoPicture)); -- ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&DVDPic); -- m_DVDVideoPics.push(DVDPic); -- -- int pics = m_DVDVideoPics.size(); -- if (pics < 2) -- return VC_BUFFER; -- else if (pics > 2) -- { -- // this should not normally happen -- CLog::Log(LOGERROR, "CVDPAU::Decode - invalid number of pictures in queue"); -- while (pics-- != 2) -- m_DVDVideoPics.pop(); -+ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); -+ if (m_codecControl & DVP_FLAG_SKIP_PROC) -+ { -+ m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); - } -+ } - -- if (mode == VS_DEINTERLACEMODE_FORCE -- || (mode == VS_DEINTERLACEMODE_AUTO && m_DVDVideoPics.front().iFlags & DVP_FLAG_INTERLACED)) -+ int retval = 0; -+ uint16_t decoded, processed, render; -+ Message *msg; -+ while (m_vdpauOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::ERROR) - { -- if((method == VS_INTERLACEMETHOD_VDPAU_BOB -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE )) -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ m_bufferStats.Get(decoded, processed, render); -+ -+ uint64_t startTime = CurrentHostCounter(); -+ while (!retval) -+ { -+ if (m_vdpauOutput.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) - { -- if(method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -- || avctx->skip_frame == AVDISCARD_NONREF) -- m_mixerstep = 0; -- else -- m_mixerstep = 1; -- -- if(m_DVDVideoPics.front().iFlags & DVP_FLAG_TOP_FIELD_FIRST) -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -- else -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ if (m_presentPicture) -+ { -+ m_presentPicture->ReturnUnused(); -+ m_presentPicture = 0; -+ } -+ -+ m_presentPicture = *(CVdpauRenderPicture**)msg->data; -+ m_presentPicture->vdpau = this; -+ m_bufferStats.DecRender(); -+ m_bufferStats.Get(decoded, processed, render); -+ retval |= VC_PICTURE; -+ msg->Release(); -+ break; -+ } -+ msg->Release(); -+ } -+ else if (m_vdpauOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::STATS) -+ { -+ m_bufferStats.Get(decoded, processed, render); - } - else - { -- m_mixerstep = 0; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; - } -+ msg->Release(); - } -- else -+ -+ if ((m_codecControl & DVP_FLAG_DRAIN)) - { -- m_mixerstep = 0; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ if (decoded + processed + render < 4) -+ { -+ retval |= VC_BUFFER; -+ } - } -- -- } -- else if(m_mixerstep == 1) -- { // no new frame given, output second field of old frame -- -- if(avctx->skip_frame == AVDISCARD_NONREF) -+ else - { -- ClearUsedForRender(&past[1]); -- m_DVDVideoPics.pop(); -- return VC_BUFFER; -+ if (decoded < 4 && (processed + render) < 3) -+ { -+ retval |= VC_BUFFER; -+ } - } - -- m_mixerstep = 2; -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD) -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -- else -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ if (!retval && !m_inMsgEvent.WaitMSec(2000)) -+ break; - } -- else -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (retval & VC_PICTURE) - { -- CLog::Log(LOGERROR, "CVDPAU::Decode - invalid mixer state reached"); -- return VC_BUFFER; -+ m_bufferStats.SetParams(diff, m_speed); - } -+ if (diff*1000/CurrentHostFrequency() > 50) -+ CLog::Log(LOGDEBUG,"CVDPAU::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); - -- VdpVideoSurface past_surfaces[2] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -- VdpVideoSurface futu_surfaces[1] = { VDP_INVALID_HANDLE }; -- -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -- { -- if (past[0]) -- past_surfaces[1] = past[0]->surface; -- if (past[1]) -- past_surfaces[0] = past[1]->surface; -- futu_surfaces[0] = future->surface; -- } -- else -+ if (!retval) - { -- if(m_mixerstep == 1) -- { // first field -- if (past[1]) -- { -- past_surfaces[1] = past[1]->surface; -- past_surfaces[0] = past[1]->surface; -- } -- futu_surfaces[0] = current->surface; -- } -- else -- { // second field -- if (past[1]) -- past_surfaces[1] = past[1]->surface; -- past_surfaces[0] = current->surface; -- futu_surfaces[0] = future->surface; -- } -+ CLog::Log(LOGERROR, "VDPAU::%s - timed out waiting for output message", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; - } - -- vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,outputSurface,&time); -- -- VdpRect sourceRect = {0,0,vid_width, vid_height}; -- -- vdp_st = vdp_video_mixer_render(videoMixer, -- VDP_INVALID_HANDLE, -- 0, -- m_mixerfield, -- 2, -- past_surfaces, -- current->surface, -- 1, -- futu_surfaces, -- &sourceRect, -- outputSurface, -- &(outRectVid), -- &(outRectVid), -- 0, -- NULL); -- CheckStatus(vdp_st, __LINE__); -- -- surfaceNum++; -- if (surfaceNum >= totalAvailableOutputSurfaces) surfaceNum = 0; -+ return retval; -+} - -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -- { -- ClearUsedForRender(&past[0]); -- return VC_BUFFER | VC_PICTURE; -- } -- else -- { -- // in order to clip top and bottom lines when de-interlacing -- // we black those lines as a work around for not working -- // background colour using the mixer -- // pixel perfect is preferred over overscanning or zooming -+bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+{ -+ CSingleLock lock(m_DecoderSection); - -- VdpRect clipRect = outRectVid; -- clipRect.y1 = clipRect.y0 + 2; -- uint32_t *data[] = {m_BlackBar}; -- uint32_t pitches[] = {outRectVid.x1}; -- vdp_st = vdp_output_surface_put_bits_native(outputSurface, -- (void**)data, -- pitches, -- &clipRect); -- CheckStatus(vdp_st, __LINE__); -+ if (m_DisplayState != VDPAU_OPEN) -+ return false; - -- clipRect = outRectVid; -- clipRect.y0 = clipRect.y1 - 2; -- vdp_st = vdp_output_surface_put_bits_native(outputSurface, -- (void**)data, -- pitches, -- &clipRect); -- CheckStatus(vdp_st, __LINE__); -+ *picture = m_presentPicture->DVDPic; -+ picture->vdpau = m_presentPicture; - -- if(m_mixerstep == 1) -- return VC_PICTURE; -- else -- { -- ClearUsedForRender(&past[1]); -- return VC_BUFFER | VC_PICTURE; -- } -- } -+ return true; - } - --bool CVDPAU::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+void CDecoder::Reset() - { -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return false; -- } -+ CSingleLock lock(m_DecoderSection); - -- *picture = m_DVDVideoPics.front(); -- // if this is the first field of an interlaced frame, we'll need -- // this same picture for the second field later -- if (m_mixerstep != 1) -- m_DVDVideoPics.pop(); -- -- picture->format = DVDVideoPicture::FMT_VDPAU; -- picture->iFlags &= DVP_FLAG_DROPPED; -- picture->iWidth = OutWidth; -- picture->iHeight = OutHeight; -- picture->vdpau = this; -+ if (!m_vdpauConfigured) -+ return; - -- if(m_mixerstep) -- { -- picture->iRepeatPicture = -0.5; -- if(m_mixerstep > 1) -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) - { -- picture->dts = DVD_NOPTS_VALUE; -- picture->pts = DVD_NOPTS_VALUE; -+ CLog::Log(LOGERROR, "VDPAU::%s - flush returned error", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; - } -+ else -+ m_bufferStats.Reset(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - flush timed out", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; - } -- return true; - } - --void CVDPAU::Reset() -+bool CDecoder::CanSkipDeint() - { -- // invalidate surfaces and picture queue when seeking -- ClearUsedForRender(&past[0]); -- ClearUsedForRender(&past[1]); -- ClearUsedForRender(¤t); -- ClearUsedForRender(&future); -- -- while (!m_DVDVideoPics.empty()) -- m_DVDVideoPics.pop(); -+ return m_bufferStats.CanSkipDeint(); - } - --void CVDPAU::Present() -+void CDecoder::SetSpeed(int speed) - { -- //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); -- VdpStatus vdp_st; -- -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- presentSurface = outputSurface; -+ m_speed = speed; -+} - -- vdp_st = vdp_presentation_queue_display(vdp_flip_queue, -- presentSurface, -- 0, -- 0, -- 0); -- CheckStatus(vdp_st, __LINE__); -+void CDecoder::ReturnRenderPicture(CVdpauRenderPicture *renderPic) -+{ -+ m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); - } - --bool CVDPAU::CheckStatus(VdpStatus vdp_st, int line) -+bool CDecoder::CheckStatus(VdpStatus vdp_st, int line) - { - if (vdp_st != VDP_STATUS_OK) - { -- CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -- -- CExclusiveLock lock(m_DisplaySection); -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_vdpauConfig.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); - - if(m_DisplayState == VDPAU_OPEN) - { -@@ -1625,4 +1111,2432 @@ - return false; - } - -+//----------------------------------------------------------------------------- -+// RenderPicture -+//----------------------------------------------------------------------------- -+ -+CVdpauRenderPicture* CVdpauRenderPicture::Acquire() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (refCount == 0) -+ vdpau->Acquire(); -+ -+ refCount++; -+ return this; -+} -+ -+long CVdpauRenderPicture::Release() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ refCount--; -+ if (refCount > 0) -+ return refCount; -+ -+ lock.Leave(); -+ vdpau->ReturnRenderPicture(this); -+ vdpau->ReleasePicReference(); -+ -+ return refCount; -+} -+ -+void CVdpauRenderPicture::ReturnUnused() -+{ -+ { CSingleLock lock(*renderPicSection); -+ if (refCount > 0) -+ return; -+ } -+ if (vdpau) -+ vdpau->ReturnRenderPicture(this); -+} -+ -+//----------------------------------------------------------------------------- -+// Mixer -+//----------------------------------------------------------------------------- -+CMixer::CMixer(CEvent *inMsgEvent) : -+ CThread("Vdpau Mixer Thread"), -+ m_controlPort("ControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("DataPort", inMsgEvent, &m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+} -+ -+CMixer::~CMixer() -+{ -+ Dispose(); -+} -+ -+void CMixer::Start() -+{ -+ Create(); -+} -+ -+void CMixer::Dispose() -+{ -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void CMixer::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "CMixer::OnStartup: Output Thread created"); -+} -+ -+void CMixer::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "CMixer::OnExit: Output Thread terminated"); -+} -+ -+enum MIXER_STATES -+{ -+ M_TOP = 0, // 0 -+ M_TOP_ERROR, // 1 -+ M_TOP_UNCONFIGURED, // 2 -+ M_TOP_CONFIGURED, // 3 -+ M_TOP_CONFIGURED_WAIT1, // 4 -+ M_TOP_CONFIGURED_STEP1, // 5 -+ M_TOP_CONFIGURED_WAIT2, // 6 -+ M_TOP_CONFIGURED_STEP2, // 7 -+}; -+ -+int MIXER_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_WAIT1 -+ 3, //TOP_CONFIGURED_STEP1 -+ 3, //TOP_CONFIGURED_WAIT2 -+ 3, //TOP_CONFIGURED_STEP2 -+}; -+ -+void CMixer::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = MIXER_parentStates[state]) -+ { -+ switch (state) -+ { -+ case M_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::FLUSH: -+ Flush(); -+ msg->Reply(CMixerControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "CMixer::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case M_TOP_ERROR: // TOP -+ break; -+ -+ case M_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::INIT: -+ CVdpauConfig *data; -+ data = (CVdpauConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ if (!m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ msg->Reply(CMixerControlProtocol::ACC); -+ } -+ else -+ { -+ msg->Reply(CMixerControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED: -+ if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CMixerDataProtocol::FRAME: -+ CVdpauDecodedPicture *frame; -+ frame = (CVdpauDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_decodedPics.push(*frame); -+ } -+ m_extTimeout = 0; -+ return; -+ case CMixerDataProtocol::BUFFER: -+ VdpOutputSurface *surf; -+ surf = (VdpOutputSurface*)msg->data; -+ if (surf) -+ { -+ m_outputSurfaces.push(*surf); -+ } -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_WAIT1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ if (!m_decodedPics.empty() && !m_outputSurfaces.empty()) -+ { -+ m_state = M_TOP_CONFIGURED_STEP1; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+// if (m_extTimeout != 0) -+// { -+// SetPostProcFeatures(false); -+// CLog::Log(LOGWARNING,"CVDPAU::Mixer timeout - decoded: %d, outputSurf: %d", (int)m_decodedPics.size(), (int)m_outputSurfaces.size()); -+// } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_STEP1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ m_mixerInput.push_front(m_decodedPics.front()); -+ m_decodedPics.pop(); -+ if (m_mixerInput.size() < 2) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ return; -+ } -+ InitCycle(); -+ ProcessPicture(); -+ if (m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 1000; -+ return; -+ } -+ if (m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ m_outputSurfaces.pop(); -+ m_config.stats->IncProcessed(); -+ m_config.stats->DecDecoded(); -+ m_dataPort.SendInMessage(CMixerDataProtocol::PICTURE,&m_processPicture,sizeof(m_processPicture)); -+ if (m_mixersteps > 1) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT2; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ FiniCycle(); -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_WAIT2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ if (!m_outputSurfaces.empty()) -+ { -+ m_state = M_TOP_CONFIGURED_STEP2; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+// if (m_extTimeout != 0) -+// { -+// SetPostProcFeatures(false); -+// CLog::Log(LOGNOTICE,"---mixer wait2 decoded: %d, outputSurf: %d", (int)m_decodedPics.size(), (int)m_outputSurfaces.size()); -+// } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_STEP2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ m_processPicture.outputSurface = m_outputSurfaces.front(); -+ m_mixerstep = 1; -+ ProcessPicture(); -+ if (m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 1000; -+ return; -+ } -+ if (m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ m_outputSurfaces.pop(); -+ m_config.stats->IncProcessed(); -+ m_dataPort.SendInMessage(CMixerDataProtocol::PICTURE,&m_processPicture,sizeof(m_processPicture)); -+ FiniCycle(); -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "CMixer::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void CMixer::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = M_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = CMixerControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Uninit(); -+} -+ -+void CMixer::CreateVdpauMixer() -+{ -+ CLog::Log(LOGNOTICE, " (VDPAU) Creating the video mixer"); -+ -+ InitCSCMatrix(m_config.vidWidth); -+ -+ VdpVideoMixerParameter parameters[] = { -+ VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, -+ VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, -+ VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE}; -+ -+ void const * parameter_values[] = { -+ &m_config.surfaceWidth, -+ &m_config.surfaceHeight, -+ &m_config.vdpChromaType}; -+ -+ VdpStatus vdp_st = VDP_STATUS_ERROR; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_create(m_config.vdpDevice, -+ m_config.featureCount, -+ m_config.vdpFeatures, -+ ARSIZE(parameters), -+ parameters, -+ parameter_values, -+ &m_videoMixer); -+ CheckStatus(vdp_st, __LINE__); -+ -+ // create 3 pitches of black lines needed for clipping top -+ // and bottom lines when de-interlacing -+ m_BlackBar = new uint32_t[3*m_config.outWidth]; -+ memset(m_BlackBar, 0, 3*m_config.outWidth*sizeof(uint32_t)); -+ -+} -+ -+void CMixer::InitCSCMatrix(int Width) -+{ -+ VdpStatus vdp_st; -+ m_Procamp.struct_version = VDP_PROCAMP_VERSION; -+ m_Procamp.brightness = 0.0; -+ m_Procamp.contrast = 1.0; -+ m_Procamp.saturation = 1.0; -+ m_Procamp.hue = 0; -+ vdp_st = m_config.vdpProcs.vdp_generate_csc_matrix(&m_Procamp, -+ (Width < 1000)? VDP_COLOR_STANDARD_ITUR_BT_601 : VDP_COLOR_STANDARD_ITUR_BT_709, -+ &m_CSCMatrix); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::CheckFeatures() -+{ -+ if (m_Upscale != m_config.upscale) -+ { -+ SetHWUpscaling(); -+ m_Upscale = m_config.upscale; -+ } -+ if (m_Brightness != g_settings.m_currentVideoSettings.m_Brightness || -+ m_Contrast != g_settings.m_currentVideoSettings.m_Contrast) -+ { -+ SetColor(); -+ m_Brightness = g_settings.m_currentVideoSettings.m_Brightness; -+ m_Contrast = g_settings.m_currentVideoSettings.m_Contrast; -+ } -+ if (m_NoiseReduction != g_settings.m_currentVideoSettings.m_NoiseReduction) -+ { -+ m_NoiseReduction = g_settings.m_currentVideoSettings.m_NoiseReduction; -+ SetNoiseReduction(); -+ } -+ if (m_Sharpness != g_settings.m_currentVideoSettings.m_Sharpness) -+ { -+ m_Sharpness = g_settings.m_currentVideoSettings.m_Sharpness; -+ SetSharpness(); -+ } -+ if (m_DeintMode != g_settings.m_currentVideoSettings.m_DeinterlaceMode || -+ m_Deint != g_settings.m_currentVideoSettings.m_InterlaceMethod) -+ { -+ m_DeintMode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ m_Deint = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ SetDeinterlacing(); -+ } -+} -+ -+void CMixer::SetPostProcFeatures(bool postProcEnabled) -+{ -+ if (m_PostProc != postProcEnabled) -+ { -+ if (postProcEnabled) -+ { -+ SetNoiseReduction(); -+ SetSharpness(); -+ SetDeinterlacing(); -+ SetHWUpscaling(); -+ } -+ else -+ PostProcOff(); -+ m_PostProc = postProcEnabled; -+ } -+} -+ -+void CMixer::PostProcOff() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -+ VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE}; -+ -+ VdpBool enabled[]={0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION}; -+ -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS}; -+ -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ DisableHQScaling(); -+} -+ -+ -+bool CMixer::GenerateStudioCSCMatrix(VdpColorStandard colorStandard, VdpCSCMatrix &studioCSCMatrix) -+{ -+ // instead use studioCSCKCoeffs601[3], studioCSCKCoeffs709[3] to generate float[3][4] matrix (float studioCSC[3][4]) -+ // m00 = mRY = red: luma factor (contrast factor) (1.0) -+ // m10 = mGY = green: luma factor (contrast factor) (1.0) -+ // m20 = mBY = blue: luma factor (contrast factor) (1.0) -+ // -+ // m01 = mRB = red: blue color diff coeff (0.0) -+ // m11 = mGB = green: blue color diff coeff (-2Kb(1-Kb)/(Kg)) -+ // m21 = mBB = blue: blue color diff coeff ((1-Kb)/0.5) -+ // -+ // m02 = mRR = red: red color diff coeff ((1-Kr)/0.5) -+ // m12 = mGR = green: red color diff coeff (-2Kr(1-Kr)/(Kg)) -+ // m22 = mBR = blue: red color diff coeff (0.0) -+ // -+ // m03 = mRC = red: colour zero offset (brightness factor) (-(1-Kr)/0.5 * (128/255)) -+ // m13 = mGC = green: colour zero offset (brightness factor) ((256/255) * (Kb(1-Kb) + Kr(1-Kr)) / Kg) -+ // m23 = mBC = blue: colour zero offset (brightness factor) (-(1-Kb)/0.5 * (128/255)) -+ -+ // columns -+ int Y = 0; -+ int Cb = 1; -+ int Cr = 2; -+ int C = 3; -+ // rows -+ int R = 0; -+ int G = 1; -+ int B = 2; -+ // colour standard coefficients for red, geen, blue -+ double Kr, Kg, Kb; -+ // colour diff zero position (use standard 8-bit coding precision) -+ double CDZ = 128; //256*0.5 -+ // range excursion (use standard 8-bit coding precision) -+ double EXC = 255; //256-1 -+ -+ if (colorStandard == VDP_COLOR_STANDARD_ITUR_BT_601) -+ { -+ Kr = studioCSCKCoeffs601[0]; -+ Kg = studioCSCKCoeffs601[1]; -+ Kb = studioCSCKCoeffs601[2]; -+ } -+ else // assume VDP_COLOR_STANDARD_ITUR_BT_709 -+ { -+ Kr = studioCSCKCoeffs709[0]; -+ Kg = studioCSCKCoeffs709[1]; -+ Kb = studioCSCKCoeffs709[2]; -+ } -+ // we keep luma unscaled to retain the levels present in source so that 16-235 luma is converted to RGB 16-235 -+ studioCSCMatrix[R][Y] = 1.0; -+ studioCSCMatrix[G][Y] = 1.0; -+ studioCSCMatrix[B][Y] = 1.0; -+ -+ studioCSCMatrix[R][Cb] = 0.0; -+ studioCSCMatrix[G][Cb] = (double)-2 * Kb * (1 - Kb) / Kg; -+ studioCSCMatrix[B][Cb] = (double)(1 - Kb) / 0.5; -+ -+ studioCSCMatrix[R][Cr] = (double)(1 - Kr) / 0.5; -+ studioCSCMatrix[G][Cr] = (double)-2 * Kr * (1 - Kr) / Kg; -+ studioCSCMatrix[B][Cr] = 0.0; -+ -+ studioCSCMatrix[R][C] = (double)-1 * studioCSCMatrix[R][Cr] * CDZ/EXC; -+ studioCSCMatrix[G][C] = (double)-1 * (studioCSCMatrix[G][Cb] + studioCSCMatrix[G][Cr]) * CDZ/EXC; -+ studioCSCMatrix[B][C] = (double)-1 * studioCSCMatrix[B][Cb] * CDZ/EXC; -+ -+ return true; -+} -+ -+void CMixer::SetColor() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_Brightness != g_settings.m_currentVideoSettings.m_Brightness) -+ m_Procamp.brightness = (float)((g_settings.m_currentVideoSettings.m_Brightness)-50) / 100; -+ if (m_Contrast != g_settings.m_currentVideoSettings.m_Contrast) -+ m_Procamp.contrast = (float)((g_settings.m_currentVideoSettings.m_Contrast)+50) / 100; -+ -+ VdpColorStandard colorStandard; -+// if(vid_height >= 600 || vid_width > 1024) -+ if(m_config.surfaceWidth > 1000) -+ colorStandard = VDP_COLOR_STANDARD_ITUR_BT_709; -+ //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_709, &m_CSCMatrix); -+ else -+ colorStandard = VDP_COLOR_STANDARD_ITUR_BT_601; -+ //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); -+ -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; -+ if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) -+ { -+ float studioCSC[3][4]; -+ GenerateStudioCSCMatrix(colorStandard, studioCSC); -+ void const * pm_CSCMatix[] = { &studioCSC }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -+ } -+ else -+ { -+ vdp_st = m_config.vdpProcs.vdp_generate_csc_matrix(&m_Procamp, colorStandard, &m_CSCMatrix); -+ void const * pm_CSCMatix[] = { &m_CSCMatrix }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -+ } -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetNoiseReduction() -+{ -+ if(!m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION }; -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL }; -+ VdpStatus vdp_st; -+ -+ if (!g_settings.m_currentVideoSettings.m_NoiseReduction) -+ { -+ VdpBool enabled[]= {0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ return; -+ } -+ VdpBool enabled[]={1}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ void* nr[] = { &g_settings.m_currentVideoSettings.m_NoiseReduction }; -+ CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",g_settings.m_currentVideoSettings.m_NoiseReduction); -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, nr); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetSharpness() -+{ -+ if(!m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS }; -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL }; -+ VdpStatus vdp_st; -+ -+ if (!g_settings.m_currentVideoSettings.m_Sharpness) -+ { -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ return; -+ } -+ VdpBool enabled[]={1}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ void* sh[] = { &g_settings.m_currentVideoSettings.m_Sharpness }; -+ CLog::Log(LOGNOTICE,"Setting Sharpness to %f",g_settings.m_currentVideoSettings.m_Sharpness); -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, sh); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+EINTERLACEMETHOD CMixer::GetDeinterlacingMethod(bool log /* = false */) -+{ -+ EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ if (method == VS_INTERLACEMETHOD_AUTO) -+ { -+ int deint = -1; -+ if (m_config.outHeight >= 720) -+ deint = g_advancedSettings.m_videoVDPAUdeintHD; -+ else -+ deint = g_advancedSettings.m_videoVDPAUdeintSD; -+ -+ if (deint != -1) -+ { -+ if (m_config.vdpau->Supports(EINTERLACEMETHOD(deint))) -+ { -+ method = EINTERLACEMETHOD(deint); -+ if (log) -+ CLog::Log(LOGNOTICE, "CVDPAU::GetDeinterlacingMethod: set de-interlacing to %d", deint); -+ } -+ else -+ { -+ if (log) -+ CLog::Log(LOGWARNING, "CVDPAU::GetDeinterlacingMethod: method for de-interlacing (advanced settings) not supported"); -+ } -+ } -+ } -+ return method; -+} -+ -+void CMixer::SetDeinterlacing() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = GetDeinterlacingMethod(true); -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -+ VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE }; -+ -+ if (mode == VS_DEINTERLACEMODE_OFF) -+ { -+ VdpBool enabled[] = {0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else -+ { -+ if (method == VS_INTERLACEMETHOD_AUTO) -+ { -+ VdpBool enabled[] = {1,1,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF) -+ { -+ VdpBool enabled[] = {1,0,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF) -+ { -+ VdpBool enabled[] = {1,1,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else -+ { -+ VdpBool enabled[]={0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ } -+ CheckStatus(vdp_st, __LINE__); -+ -+ SetDeintSkipChroma(); -+ -+ m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); -+} -+ -+void CMixer::SetDeintSkipChroma() -+{ -+ VdpVideoMixerAttribute attribute[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE}; -+ VdpStatus vdp_st; -+ -+ uint8_t val; -+ if (g_advancedSettings.m_videoVDPAUdeintSkipChromaHD && m_config.outHeight >= 720) -+ val = 1; -+ else -+ val = 0; -+ -+ void const *values[]={&val}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attribute), attribute, values); -+ -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetHWUpscaling() -+{ -+#ifdef VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 -+ -+ VdpStatus vdp_st; -+ VdpBool enabled[]={1}; -+ switch (m_config.upscale) -+ { -+ case 9: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 8: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 7: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 6: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 5: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 4: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 3: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 2: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 1: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ default: -+ DisableHQScaling(); -+ return; -+ } -+ CheckStatus(vdp_st, __LINE__); -+#endif -+} -+ -+void CMixer::DisableHQScaling() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+} -+ -+ -+void CMixer::Init() -+{ -+ m_Brightness = 0.0; -+ m_Contrast = 0.0; -+ m_NoiseReduction = 0.0; -+ m_Sharpness = 0.0; -+ m_DeintMode = 0; -+ m_Deint = 0; -+ m_PostProc = false; -+ m_vdpError = false; -+ -+ m_config.upscale = g_advancedSettings.m_videoVDPAUScaling; -+ m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); -+ -+ CreateVdpauMixer(); -+} -+ -+void CMixer::Uninit() -+{ -+ Flush(); -+ while (!m_outputSurfaces.empty()) -+ { -+ m_outputSurfaces.pop(); -+ } -+ m_config.vdpProcs.vdp_video_mixer_destroy(m_videoMixer); -+} -+ -+void CMixer::Flush() -+{ -+ while (!m_mixerInput.empty()) -+ { -+ CVdpauDecodedPicture pic = m_mixerInput.back(); -+ m_mixerInput.pop_back(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ while (!m_decodedPics.empty()) -+ { -+ CVdpauDecodedPicture pic = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ Message *msg; -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == CMixerDataProtocol::FRAME) -+ { -+ CVdpauDecodedPicture pic = *(CVdpauDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (msg->signal == CMixerDataProtocol::BUFFER) -+ { -+ VdpOutputSurface *surf; -+ surf = (VdpOutputSurface*)msg->data; -+ m_outputSurfaces.push(*surf); -+ } -+ msg->Release(); -+ } -+} -+ -+void CMixer::InitCycle() -+{ -+ CheckFeatures(); -+ uint64_t latency; -+ int speed; -+ m_config.stats->GetParams(latency, speed); -+ latency = (latency*1000)/CurrentHostFrequency(); -+ if (speed != DVD_PLAYSPEED_NORMAL) -+ SetPostProcFeatures(false); -+ else -+ SetPostProcFeatures(true); -+ -+ m_config.stats->SetCanSkipDeint(false); -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = GetDeinterlacingMethod(); -+ bool interlaced = m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_INTERLACED; -+ -+ if (mode == VS_DEINTERLACEMODE_FORCE || -+ (mode == VS_DEINTERLACEMODE_AUTO && interlaced)) -+ { -+ if((method == VS_INTERLACEMETHOD_AUTO && interlaced) -+ || method == VS_INTERLACEMETHOD_VDPAU_BOB -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE ) -+ { -+ if(method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -+ || !g_graphicsContext.IsFullScreenVideo()) -+ m_mixersteps = 1; -+ else -+ { -+ m_mixersteps = 2; -+ m_config.stats->SetCanSkipDeint(true); -+ } -+ -+ if (m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_DROPDEINT) -+ { -+ m_mixersteps = 1; -+ } -+ -+ if(m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ else -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ m_config.useInteropYuv = false; -+ } -+ else if (method == VS_INTERLACEMETHOD_RENDER_BOB && m_config.useInteropYuv) -+ { -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU_420; -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "CMixer::%s - interlace method not supported", __FUNCTION__); -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ } -+ } -+ else -+ { -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ -+ if (m_config.useInteropYuv) -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU_420; -+ else -+ { -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ } -+ } -+ m_mixerstep = 0; -+ -+ if (m_mixerInput[1].DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ m_processPicture.outputSurface = m_outputSurfaces.front(); -+ m_mixerInput[1].DVDPic.iWidth = m_config.outWidth; -+ m_mixerInput[1].DVDPic.iHeight = m_config.outHeight; -+ } -+ else -+ { -+ m_mixerInput[1].DVDPic.iWidth = m_config.vidWidth; -+ m_mixerInput[1].DVDPic.iHeight = m_config.vidHeight; -+ } -+ -+ m_processPicture.DVDPic = m_mixerInput[1].DVDPic; -+ m_processPicture.render = m_mixerInput[1].render; -+} -+ -+void CMixer::FiniCycle() -+{ -+ while (m_mixerInput.size() > 3) -+ { -+ CVdpauDecodedPicture &tmp = m_mixerInput.back(); -+ if (tmp.render && m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ tmp.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ m_mixerInput.pop_back(); -+// m_config.stats->DecDecoded(); -+ } -+} -+ -+void CMixer::ProcessPicture() -+{ -+ if (m_processPicture.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ return; -+ -+ int cmd = 0; -+ m_config.stats->GetCmd(cmd); -+ if (cmd & DVP_FLAG_SKIP_PROC) -+ { -+ m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; -+ return; -+ } -+ -+ VdpStatus vdp_st; -+ -+ if (m_mixerstep == 1) -+ { -+ if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD) -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ else -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ } -+ -+ VdpVideoSurface past_surfaces[4] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE, VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -+ VdpVideoSurface futu_surfaces[2] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -+ uint32_t pastCount = 4; -+ uint32_t futuCount = 2; -+ -+ if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -+ { -+ // use only 2 past 1 future for progressive/weave -+ // (only used for postproc anyway eg noise reduction) -+ if (m_mixerInput.size() > 3) -+ past_surfaces[1] = m_mixerInput[3].render->surface; -+ if (m_mixerInput.size() > 2) -+ past_surfaces[0] = m_mixerInput[2].render->surface; -+ futu_surfaces[0] = m_mixerInput[0].render->surface; -+ pastCount = 2; -+ futuCount = 1; -+ } -+ else -+ { -+ if(m_mixerstep == 0) -+ { // first field -+ if (m_mixerInput.size() > 3) -+ { -+ past_surfaces[3] = m_mixerInput[3].render->surface; -+ past_surfaces[2] = m_mixerInput[3].render->surface; -+ } -+ if (m_mixerInput.size() > 2) -+ { -+ past_surfaces[1] = m_mixerInput[2].render->surface; -+ past_surfaces[0] = m_mixerInput[2].render->surface; -+ } -+ futu_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[1] = m_mixerInput[0].render->surface;; -+ } -+ else -+ { // second field -+ if (m_mixerInput.size() > 3) -+ { -+ past_surfaces[3] = m_mixerInput[3].render->surface; -+ } -+ if (m_mixerInput.size() > 2) -+ { -+ past_surfaces[2] = m_mixerInput[2].render->surface; -+ past_surfaces[1] = m_mixerInput[2].render->surface; -+ } -+ past_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[1] = m_mixerInput[1].render->surface; -+ -+ m_processPicture.DVDPic.pts = DVD_NOPTS_VALUE; -+ m_processPicture.DVDPic.dts = DVD_NOPTS_VALUE; -+ } -+ m_processPicture.DVDPic.iRepeatPicture = 0.0; -+ } // interlaced -+ -+ VdpRect sourceRect; -+ sourceRect.x0 = 0; -+ sourceRect.y0 = 0; -+ sourceRect.x1 = m_config.vidWidth; -+ sourceRect.y1 = m_config.vidHeight; -+ -+ VdpRect destRect; -+ destRect.x0 = 0; -+ destRect.y0 = 0; -+ destRect.x1 = m_config.outWidth; -+ destRect.y1 = m_config.outHeight; -+ -+ // start vdpau video mixer -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_render(m_videoMixer, -+ VDP_INVALID_HANDLE, -+ 0, -+ m_mixerfield, -+ pastCount, -+ past_surfaces, -+ m_mixerInput[1].render->surface, -+ futuCount, -+ futu_surfaces, -+ &sourceRect, -+ m_processPicture.outputSurface, -+ &destRect, -+ &destRect, -+ 0, -+ NULL); -+ CheckStatus(vdp_st, __LINE__); -+ -+ if (m_mixerfield != VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -+ { -+ // in order to clip top and bottom lines when de-interlacing -+ // we black those lines as a work around for not working -+ // background colour using the mixer -+ // pixel perfect is preferred over overscanning or zooming -+ -+ VdpRect clipRect = destRect; -+ clipRect.y1 = clipRect.y0 + 2; -+ uint32_t *data[] = {m_BlackBar}; -+ uint32_t pitches[] = {destRect.x1}; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_put_bits_native(m_processPicture.outputSurface, -+ (void**)data, -+ pitches, -+ &clipRect); -+ CheckStatus(vdp_st, __LINE__); -+ -+ clipRect = destRect; -+ clipRect.y0 = clipRect.y1 - 2; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_put_bits_native(m_processPicture.outputSurface, -+ (void**)data, -+ pitches, -+ &clipRect); -+ CheckStatus(vdp_st, __LINE__); -+ } -+} -+ -+ -+bool CMixer::CheckStatus(VdpStatus vdp_st, int line) -+{ -+ if (vdp_st != VDP_STATUS_OK) -+ { -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_config.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -+ m_vdpError = true; -+ return true; -+ } -+ return false; -+} -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+COutput::COutput(CEvent *inMsgEvent) : -+ CThread("Vdpau Output Thread"), -+ m_controlPort("OutputControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("OutputDataPort", inMsgEvent, &m_outMsgEvent), -+ m_mixer(&m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+ -+ CVdpauRenderPicture pic; -+ pic.renderPicSection = &m_bufferPool.renderPicSec; -+ pic.refCount = 0; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; i++) -+ { -+ m_bufferPool.allRenderPics.push_back(pic); -+ } -+ for (unsigned int i = 0; i < m_bufferPool.allRenderPics.size(); ++i) -+ { -+ m_bufferPool.freeRenderPics.push_back(&m_bufferPool.allRenderPics[i]); -+ } -+} -+ -+void COutput::Start() -+{ -+ Create(); -+} -+ -+COutput::~COutput() -+{ -+ Dispose(); -+ -+ m_bufferPool.freeRenderPics.clear(); -+ m_bufferPool.usedRenderPics.clear(); -+ m_bufferPool.allRenderPics.clear(); -+} -+ -+void COutput::Dispose() -+{ -+ CSingleLock lock(g_graphicsContext); -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void COutput::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnStartup: Output Thread created"); -+} -+ -+void COutput::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnExit: Output Thread terminated"); -+} -+ -+enum OUTPUT_STATES -+{ -+ O_TOP = 0, // 0 -+ O_TOP_ERROR, // 1 -+ O_TOP_UNCONFIGURED, // 2 -+ O_TOP_CONFIGURED, // 3 -+ O_TOP_CONFIGURED_IDLE, // 4 -+ O_TOP_CONFIGURED_WORK, // 5 -+}; -+ -+int VDPAU_OUTPUT_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_IDLE -+ 3, //TOP_CONFIGURED_WORK -+}; -+ -+void COutput::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = VDPAU_OUTPUT_parentStates[state]) -+ { -+ switch (state) -+ { -+ case O_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::RETURNPIC: -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "COutput::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case O_TOP_ERROR: -+ break; -+ -+ case O_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::INIT: -+ CVdpauConfig *data; -+ data = (CVdpauConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ Message *reply; -+ if (m_mixer.m_controlPort.SendOutMessageSync(CMixerControlProtocol::INIT, -+ &reply, 1000, &m_config, sizeof(m_config))) -+ { -+ if (reply->signal != CMixerControlProtocol::ACC) -+ m_vdpError = true; -+ reply->Release(); -+ } -+ -+ // set initial number of -+ m_bufferPool.numOutputSurfaces = 4; -+ EnsureBufferPool(); -+ if (!m_vdpError) -+ { -+ m_state = O_TOP_CONFIGURED_IDLE; -+ msg->Reply(COutputControlProtocol::ACC); -+ } -+ else -+ { -+ m_state = O_TOP_ERROR; -+ msg->Reply(COutputControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::NEWFRAME: -+ CVdpauDecodedPicture *frame; -+ frame = (CVdpauDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::FRAME, -+ frame,sizeof(CVdpauDecodedPicture)); -+ } -+ return; -+ case COutputDataProtocol::RETURNPIC: -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ m_controlPort.SendInMessage(COutputControlProtocol::STATS); -+ m_state = O_TOP_CONFIGURED_WORK; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_mixer.m_dataPort) -+ { -+ switch (signal) -+ { -+ case CMixerDataProtocol::PICTURE: -+ CVdpauProcessedPicture *pic; -+ pic = (CVdpauProcessedPicture*)msg->data; -+ m_bufferPool.processedPics.push(*pic); -+ m_state = O_TOP_CONFIGURED_WORK; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_IDLE: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+// uint16_t decoded, processed, render; -+// m_config.stats->Get(decoded, processed, render); -+// CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WORK: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (HasWork()) -+ { -+ CVdpauRenderPicture *pic; -+ pic = ProcessMixerPicture(); -+ if (pic) -+ { -+ m_config.stats->DecProcessed(); -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ m_extTimeout = 1; -+ } -+ else -+ { -+ m_state = O_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "COutput::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void COutput::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = O_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ // check mixer data port -+ else if (m_mixer.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_mixer.m_dataPort; -+ } -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = COutputControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Flush(); -+ Uninit(); -+} -+ -+bool COutput::Init() -+{ -+ if (!CreateGlxContext()) -+ return false; -+ -+ if (!GLInit()) -+ return false; -+ -+ m_mixer.Start(); -+ m_vdpError = false; -+ -+ return true; -+} -+ -+bool COutput::Uninit() -+{ -+ m_mixer.Dispose(); -+ GLUnmapSurfaces(); -+ GLUnbindPixmaps(); -+ ReleaseBufferPool(); -+ DestroyGlxContext(); -+ return true; -+} -+ -+void COutput::Flush() -+{ -+ Message *reply; -+ if (m_mixer.m_controlPort.SendOutMessageSync(CMixerControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ reply->Release(); -+ } -+ else -+ CLog::Log(LOGERROR, "Coutput::%s - failed to flush mixer", __FUNCTION__); -+ -+ Message *msg; -+ while (m_mixer.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == CMixerDataProtocol::PICTURE) -+ { -+ CVdpauProcessedPicture pic = *(CVdpauProcessedPicture*)msg->data; -+ if (pic.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::NEWFRAME) -+ { -+ CVdpauDecodedPicture pic = *(CVdpauDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (msg->signal == COutputDataProtocol::RETURNPIC) -+ { -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ } -+ -+ // reset used render flag which was cleared on mixer flush -+ std::deque::iterator it; -+ for (it = m_bufferPool.usedRenderPics.begin(); it != m_bufferPool.usedRenderPics.end(); ++it) -+ { -+ if ((*it)->DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ std::map::iterator it2; -+ it2 = m_bufferPool.glVideoSurfaceMap.find((*it)->sourceIdx); -+ if (it2 == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::Flush - gl surface not found"); -+ continue; -+ } -+ vdpau_render_state *render = it2->second.sourceVuv; -+ if (render) -+ render->state |= FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ } -+} -+ -+bool COutput::HasWork() -+{ -+ if (m_config.usePixmaps) -+ { -+ if (!m_bufferPool.processedPics.empty() && FindFreePixmap() >= 0) -+ return true; -+ if (!m_bufferPool.notVisiblePixmaps.empty() && !m_bufferPool.freeRenderPics.empty()) -+ return true; -+ return false; -+ } -+ else -+ { -+ if (!m_bufferPool.processedPics.empty() && !m_bufferPool.freeRenderPics.empty()) -+ return true; -+ return false; -+ } -+} -+ -+CVdpauRenderPicture* COutput::ProcessMixerPicture() -+{ -+ CVdpauRenderPicture *retPic = 0; -+ -+ if (m_config.usePixmaps) -+ { -+ if (!m_bufferPool.processedPics.empty() && FindFreePixmap() >= 0) -+ { -+ unsigned int i = FindFreePixmap(); -+ VdpauBufferPool::Pixmaps *pixmap = &m_bufferPool.pixmaps[i]; -+ pixmap->used = true; -+ CVdpauProcessedPicture pic = m_bufferPool.processedPics.front(); -+ m_bufferPool.processedPics.pop(); -+ pixmap->surface = pic.outputSurface; -+ pixmap->DVDPic = pic.DVDPic; -+ pixmap->id = i; -+ m_bufferPool.notVisiblePixmaps.push_back(pixmap); -+ VdpStatus vdp_st; -+ m_config.vdpProcs.vdp_presentation_queue_display(pixmap->vdp_flip_queue, -+ pixmap->surface,0,0,0); -+ } -+ if (!m_bufferPool.notVisiblePixmaps.empty() && !m_bufferPool.freeRenderPics.empty()) -+ { -+ VdpStatus vdp_st; -+ VdpTime time; -+ VdpPresentationQueueStatus status; -+ VdpauBufferPool::Pixmaps *pixmap = m_bufferPool.notVisiblePixmaps.front(); -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_query_surface_status( -+ pixmap->vdp_flip_queue, pixmap->surface, &status, &time); -+ -+ if (vdp_st == VDP_STATUS_OK && status == VDP_PRESENTATION_QUEUE_STATUS_VISIBLE) -+ { -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ retPic->sourceIdx = pixmap->id; -+ retPic->DVDPic = pixmap->DVDPic; -+ retPic->valid = true; -+ retPic->texture[0] = pixmap->texture; -+ retPic->crop = CRect(0,0,0,0); -+ m_bufferPool.notVisiblePixmaps.pop_front(); -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, &pixmap->surface, sizeof(pixmap->surface)); -+ } -+ } -+ } // pixmap -+ else if (!m_bufferPool.processedPics.empty() && !m_bufferPool.freeRenderPics.empty()) -+ { -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ CVdpauProcessedPicture procPic = m_bufferPool.processedPics.front(); -+ m_bufferPool.processedPics.pop(); -+ -+ retPic->DVDPic = procPic.DVDPic; -+ retPic->valid = true; -+ if (retPic->DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ m_config.useInteropYuv = false; -+ m_bufferPool.numOutputSurfaces = NUM_RENDER_PICS; -+ EnsureBufferPool(); -+ GLMapSurfaces(); -+ retPic->sourceIdx = procPic.outputSurface; -+ retPic->texture[0] = m_bufferPool.glOutputSurfaceMap[procPic.outputSurface].texture[0]; -+ retPic->crop = CRect(0,0,0,0); -+ } -+ else -+ { -+ m_config.useInteropYuv = true; -+ GLMapSurfaces(); -+ retPic->sourceIdx = procPic.render->surface; -+ for (unsigned int i=0; i<4; ++i) -+ retPic->texture[i] = m_bufferPool.glVideoSurfaceMap[procPic.render->surface].texture[i]; -+ retPic->texWidth = m_config.surfaceWidth; -+ retPic->texHeight = m_config.surfaceHeight; -+ retPic->crop.x1 = 0; -+ retPic->crop.y1 = 0; -+ retPic->crop.x2 = m_config.surfaceWidth - m_config.vidWidth; -+ retPic->crop.y2 = m_config.surfaceHeight - m_config.vidHeight; -+ } -+ } -+ return retPic; -+} -+ -+void COutput::ProcessReturnPicture(CVdpauRenderPicture *pic) -+{ -+ std::deque::iterator it; -+ it = std::find(m_bufferPool.usedRenderPics.begin(), m_bufferPool.usedRenderPics.end(), pic); -+ if (it == m_bufferPool.usedRenderPics.end()) -+ { -+ CLog::Log(LOGWARNING, "COutput::ProcessReturnPicture - pic not found"); -+ return; -+ } -+ m_bufferPool.usedRenderPics.erase(it); -+ m_bufferPool.freeRenderPics.push_back(pic); -+ if (!pic->valid) -+ { -+ CLog::Log(LOGDEBUG, "COutput::%s - return of invalid render pic", __FUNCTION__); -+ return; -+ } -+ -+ if (m_config.usePixmaps) -+ { -+ m_bufferPool.pixmaps[pic->sourceIdx].used = false; -+ return; -+ } -+ else if (pic->DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ std::map::iterator it; -+ it = m_bufferPool.glVideoSurfaceMap.find(pic->sourceIdx); -+ if (it == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); -+ return; -+ } -+ vdpau_render_state *render = it->second.sourceVuv; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (pic->DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ std::map::iterator it; -+ it = m_bufferPool.glOutputSurfaceMap.find(pic->sourceIdx); -+ if (it == m_bufferPool.glOutputSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); -+ return; -+ } -+ VdpOutputSurface outSurf = it->second.sourceRgb; -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, &outSurf, sizeof(outSurf)); -+ } -+} -+ -+int COutput::FindFreePixmap() -+{ -+ // find free pixmap -+ unsigned int i; -+ for (i = 0; i < m_bufferPool.pixmaps.size(); ++i) -+ { -+ if (!m_bufferPool.pixmaps[i].used) -+ break; -+ } -+ if (i == m_bufferPool.pixmaps.size()) -+ return -1; -+ else -+ return i; -+} -+ -+bool COutput::EnsureBufferPool() -+{ -+ VdpStatus vdp_st; -+ -+ // Creation of outputSurfaces -+ VdpOutputSurface outputSurface; -+ for (int i = m_bufferPool.outputSurfaces.size(); i < m_bufferPool.numOutputSurfaces; i++) -+ { -+ vdp_st = m_config.vdpProcs.vdp_output_surface_create(m_config.vdpDevice, -+ VDP_RGBA_FORMAT_B8G8R8A8, -+ m_config.outWidth, -+ m_config.outHeight, -+ &outputSurface); -+ if (CheckStatus(vdp_st, __LINE__)) -+ return false; -+ m_bufferPool.outputSurfaces.push_back(outputSurface); -+ -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, -+ &outputSurface, -+ sizeof(VdpOutputSurface)); -+ CLog::Log(LOGNOTICE, "VDPAU::COutput::InitBufferPool - Output Surface created"); -+ } -+ -+ -+ if (m_config.usePixmaps && m_bufferPool.pixmaps.empty()) -+ { -+ // create pixmpas -+ VdpauBufferPool::Pixmaps pixmap; -+ int numPixmaps = NUM_RENDER_PICS; -+ for (unsigned int i = 0; i < numPixmaps; i++) -+ { -+ pixmap.pixmap = None; -+ pixmap.glPixmap = None; -+ pixmap.vdp_flip_queue = VDP_INVALID_HANDLE; -+ pixmap.vdp_flip_target = VDP_INVALID_HANDLE; -+ MakePixmap(pixmap); -+ glXMakeCurrent(m_Display, None, NULL); -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_target_create_x11(m_config.vdpDevice, -+ pixmap.pixmap, //x_window, -+ &pixmap.vdp_flip_target); -+ -+ CheckStatus(vdp_st, __LINE__); -+ -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_create(m_config.vdpDevice, -+ pixmap.vdp_flip_target, -+ &pixmap.vdp_flip_queue); -+ CheckStatus(vdp_st, __LINE__); -+ glXMakeCurrent(m_Display, m_glPixmap, m_glContext); -+ -+ pixmap.id = i; -+ pixmap.used = false; -+ m_bufferPool.pixmaps.push_back(pixmap); -+ } -+ GLBindPixmaps(); -+ } -+ -+ return true; -+} -+ -+void COutput::ReleaseBufferPool() -+{ -+ VdpStatus vdp_st; -+ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.usePixmaps) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); ++i) -+ { -+ if (m_bufferPool.pixmaps[i].vdp_flip_queue != VDP_INVALID_HANDLE) -+ { -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_destroy(m_bufferPool.pixmaps[i].vdp_flip_queue); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ if (m_bufferPool.pixmaps[i].vdp_flip_target != VDP_INVALID_HANDLE) -+ { -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_target_destroy(m_bufferPool.pixmaps[i].vdp_flip_target); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ if (m_bufferPool.pixmaps[i].glPixmap) -+ { -+ glXDestroyPixmap(m_Display, m_bufferPool.pixmaps[i].glPixmap); -+ } -+ if (m_bufferPool.pixmaps[i].pixmap) -+ { -+ XFreePixmap(m_Display, m_bufferPool.pixmaps[i].pixmap); -+ } -+ } -+ m_bufferPool.pixmaps.clear(); -+ } -+ -+ // release all output surfaces -+ for (unsigned int i = 0; i < m_bufferPool.outputSurfaces.size(); ++i) -+ { -+ if (m_bufferPool.outputSurfaces[i] == VDP_INVALID_HANDLE) -+ continue; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_destroy(m_bufferPool.outputSurfaces[i]); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ m_bufferPool.outputSurfaces.clear(); -+ -+ // invalidate all used render pictures -+ for (unsigned int i = 0; i < m_bufferPool.usedRenderPics.size(); ++i) -+ { -+ m_bufferPool.usedRenderPics[i]->valid = false; -+ } -+} -+ -+void COutput::InitMixer() -+{ -+ for (unsigned int i = 0; i < m_bufferPool.outputSurfaces.size(); ++i) -+ { -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, -+ &m_bufferPool.outputSurfaces[i], -+ sizeof(VdpOutputSurface)); -+ } -+} -+ -+bool COutput::MakePixmap(VdpauBufferPool::Pixmaps &pixmap) -+{ -+ CLog::Log(LOGNOTICE,"Creating %ix%i pixmap", m_config.outWidth, m_config.outHeight); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, DefaultRootWindow(m_Display), &wndattribs); -+ -+ pixmap.pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ m_config.outWidth, -+ m_config.outHeight, -+ wndattribs.depth); -+ if (!pixmap.pixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COUtput::MakePixmap - GLX Error: MakePixmap: Unable to create XPixmap"); -+ return false; -+ } -+ -+// XGCValues values = {}; -+// GC xgc; -+// values.foreground = BlackPixel (m_Display, DefaultScreen (m_Display)); -+// xgc = XCreateGC(m_Display, pixmap.pixmap, GCForeground, &values); -+// XFillRectangle(m_Display, pixmap.pixmap, xgc, 0, 0, m_config.outWidth, m_config.outHeight); -+// XFreeGC(m_Display, xgc); -+ -+ if(!MakePixmapGL(pixmap)) -+ return false; -+ -+ return true; -+} -+ -+bool COutput::MakePixmapGL(VdpauBufferPool::Pixmaps &pixmap) -+{ -+ int num=0; -+ int fbConfigIndex = 0; -+ -+ int doubleVisAttributes[] = { -+ GLX_RENDER_TYPE, GLX_RGBA_BIT, -+ GLX_RED_SIZE, 8, -+ GLX_GREEN_SIZE, 8, -+ GLX_BLUE_SIZE, 8, -+ GLX_ALPHA_SIZE, 8, -+ GLX_DEPTH_SIZE, 8, -+ GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, -+ GLX_BIND_TO_TEXTURE_RGBA_EXT, True, -+ GLX_DOUBLEBUFFER, False, -+ GLX_Y_INVERTED_EXT, True, -+ GLX_X_RENDERABLE, True, -+ None -+ }; -+ -+ int pixmapAttribs[] = { -+ GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, -+ GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT, -+ None -+ }; -+ -+ GLXFBConfig *fbConfigs; -+ fbConfigs = glXChooseFBConfig(m_Display, DefaultScreen(m_Display), doubleVisAttributes, &num); -+ if (fbConfigs==NULL) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::MakPixmapGL - No compatible framebuffers found"); -+ return false; -+ } -+ fbConfigIndex = 0; -+ -+ pixmap.glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], pixmap.pixmap, pixmapAttribs); -+ -+ if (!pixmap.glPixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::MakPixmapGL - Could not create Pixmap"); -+ XFree(fbConfigs); -+ return false; -+ } -+ XFree(fbConfigs); -+ return true; -+} -+ -+bool COutput::GLInit() -+{ -+ glXBindTexImageEXT = NULL; -+ glXReleaseTexImageEXT = NULL; -+#ifdef GL_NV_vdpau_interop -+ glVDPAUInitNV = NULL; -+ glVDPAUFiniNV = NULL; -+ glVDPAURegisterOutputSurfaceNV = NULL; -+ glVDPAURegisterVideoSurfaceNV = NULL; -+ glVDPAUIsSurfaceNV = NULL; -+ glVDPAUUnregisterSurfaceNV = NULL; -+ glVDPAUSurfaceAccessNV = NULL; -+ glVDPAUMapSurfacesNV = NULL; -+ glVDPAUUnmapSurfacesNV = NULL; -+ glVDPAUGetSurfaceivNV = NULL; -+#endif -+ -+ m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"); -+ -+#ifdef GL_NV_vdpau_interop -+ if (glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ if (!glVDPAUInitNV) -+ glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUInitNV"); -+ if (!glVDPAUFiniNV) -+ glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glXGetProcAddress((GLubyte *) "glVDPAUFiniNV"); -+ if (!glVDPAURegisterOutputSurfaceNV) -+ glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterOutputSurfaceNV"); -+ if (!glVDPAURegisterVideoSurfaceNV) -+ glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterVideoSurfaceNV"); -+ if (!glVDPAUIsSurfaceNV) -+ glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUIsSurfaceNV"); -+ if (!glVDPAUUnregisterSurfaceNV) -+ glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnregisterSurfaceNV"); -+ if (!glVDPAUSurfaceAccessNV) -+ glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUSurfaceAccessNV"); -+ if (!glVDPAUMapSurfacesNV) -+ glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUMapSurfacesNV"); -+ if (!glVDPAUUnmapSurfacesNV) -+ glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnmapSurfacesNV"); -+ if (!glVDPAUGetSurfaceivNV) -+ glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUGetSurfaceivNV"); -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput GL interop supported"); -+ } -+ else -+#endif -+ { -+ m_config.usePixmaps = true; -+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); -+ } -+ if (!glXBindTexImageEXT) -+ glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); -+ if (!glXReleaseTexImageEXT) -+ glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT"); -+ -+#ifdef GL_NV_vdpau_interop -+ if (!m_config.usePixmaps) -+ { -+ while (glGetError() != GL_NO_ERROR); -+ glVDPAUInitNV(reinterpret_cast(m_config.vdpDevice), reinterpret_cast(m_config.vdpProcs.vdp_get_proc_address)); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput - GLInitInterop glVDPAUInitNV failed"); -+ m_vdpError = true; -+ return false; -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: vdpau gl interop initialized"); -+ } -+#endif -+ return true; -+} -+ -+void COutput::GLMapSurfaces() -+{ -+#ifdef GL_NV_vdpau_interop -+ if (m_config.usePixmaps) -+ return; -+ -+ if (m_config.useInteropYuv) -+ { -+ VdpauBufferPool::GLVideoSurface glSurface; -+ if (m_config.videoSurfaces->size() != m_bufferPool.glVideoSurfaceMap.size()) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ for (int i = 0; i < m_config.videoSurfaces->size(); i++) -+ { -+ if ((*m_config.videoSurfaces)[i]->surface == VDP_INVALID_HANDLE) -+ continue; -+ -+ if (m_bufferPool.glVideoSurfaceMap.find((*m_config.videoSurfaces)[i]->surface) == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ glSurface.sourceVuv = (*m_config.videoSurfaces)[i]; -+ while (glGetError() != GL_NO_ERROR) ; -+ glGenTextures(4, glSurface.texture); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error creating texture"); -+ m_vdpError = true; -+ } -+ glSurface.glVdpauSurface = glVDPAURegisterVideoSurfaceNV(reinterpret_cast((*m_config.videoSurfaces)[i]->surface), -+ GL_TEXTURE_2D, 4, glSurface.texture); -+ -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error register video surface"); -+ m_vdpError = true; -+ } -+ glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); -+ m_vdpError = true; -+ } -+ glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); -+ m_vdpError = true; -+ } -+ m_bufferPool.glVideoSurfaceMap[(*m_config.videoSurfaces)[i]->surface] = glSurface; -+ if (m_vdpError) -+ return; -+ CLog::Log(LOGNOTICE, "VDPAU::COutput registered surface"); -+ } -+ } -+ } -+ } -+ else -+ { -+ if (m_bufferPool.glOutputSurfaceMap.size() != m_bufferPool.numOutputSurfaces) -+ { -+ VdpauBufferPool::GLVideoSurface glSurface; -+ for (int i=m_bufferPool.glOutputSurfaceMap.size(); i(m_bufferPool.outputSurfaces[i]), -+ GL_TEXTURE_2D, 1, glSurface.texture); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error register output surface"); -+ m_vdpError = true; -+ } -+ glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); -+ m_vdpError = true; -+ } -+ glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); -+ m_vdpError = true; -+ } -+ m_bufferPool.glOutputSurfaceMap[m_bufferPool.outputSurfaces[i]] = glSurface; -+ if (m_vdpError) -+ return; -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput registered output surfaces"); -+ } -+ } -+#endif -+} -+ -+void COutput::GLUnmapSurfaces() -+{ -+#ifdef GL_NV_vdpau_interop -+ if (m_config.usePixmaps) -+ return; -+ -+ { CSingleLock lock(*m_config.videoSurfaceSec); -+ std::map::iterator it; -+ for (it = m_bufferPool.glVideoSurfaceMap.begin(); it != m_bufferPool.glVideoSurfaceMap.end(); ++it) -+ { -+ glVDPAUUnregisterSurfaceNV(it->second.glVdpauSurface); -+ glDeleteTextures(4, it->second.texture); -+ } -+ m_bufferPool.glVideoSurfaceMap.clear(); -+ } -+ -+ std::map::iterator it; -+ for (it = m_bufferPool.glOutputSurfaceMap.begin(); it != m_bufferPool.glOutputSurfaceMap.end(); ++it) -+ { -+ glVDPAUUnregisterSurfaceNV(it->second.glVdpauSurface); -+ glDeleteTextures(1, it->second.texture); -+ } -+ m_bufferPool.glOutputSurfaceMap.clear(); -+ -+ glVDPAUFiniNV(); -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: vdpau gl interop finished"); -+ -+#endif -+} -+ -+void COutput::GLBindPixmaps() -+{ -+ if (!m_config.usePixmaps) -+ return; -+ -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); i++) -+ { -+ // create texture -+ glGenTextures(1, &m_bufferPool.pixmaps[i].texture); -+ -+ //bind texture -+ glBindTexture(GL_TEXTURE_2D, m_bufferPool.pixmaps[i].texture); -+ -+ // bind pixmap -+ glXBindTexImageEXT(m_Display, m_bufferPool.pixmaps[i].glPixmap, GLX_FRONT_LEFT_EXT, NULL); -+ -+ glBindTexture(GL_TEXTURE_2D, 0); -+ } -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: bound pixmaps"); -+} -+ -+void COutput::GLUnbindPixmaps() -+{ -+ if (!m_config.usePixmaps) -+ return; -+ -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); i++) -+ { -+ // create texture -+ if (!glIsTexture(m_bufferPool.pixmaps[i].texture)) -+ continue; -+ -+ //bind texture -+ glBindTexture(GL_TEXTURE_2D, m_bufferPool.pixmaps[i].texture); -+ -+ // release pixmap -+ glXReleaseTexImageEXT(m_Display, m_bufferPool.pixmaps[i].glPixmap, GLX_FRONT_LEFT_EXT); -+ -+ glBindTexture(GL_TEXTURE_2D, 0); -+ -+ glDeleteTextures(1, &m_bufferPool.pixmaps[i].texture); -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: unbound pixmaps"); -+} -+ -+bool COutput::CheckStatus(VdpStatus vdp_st, int line) -+{ -+ if (vdp_st != VDP_STATUS_OK) -+ { -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_config.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -+ m_vdpError = true; -+ return true; -+ } -+ return false; -+} -+ -+bool COutput::CreateGlxContext() -+{ -+ GLXContext glContext; -+ Window window; -+ -+ m_Display = g_Windowing.GetDisplay(); -+ glContext = g_Windowing.GetGlxContext(); -+ m_Window = g_Windowing.GetWmWindow(); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, m_Window, &wndattribs); -+ -+ // Get visual Info -+ XVisualInfo visInfo; -+ visInfo.visualid = wndattribs.visual->visualid; -+ int nvisuals = 0; -+ XVisualInfo* visuals = XGetVisualInfo(m_Display, VisualIDMask, &visInfo, &nvisuals); -+ if (nvisuals != 1) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::CreateGlxContext - could not find visual"); -+ return false; -+ } -+ visInfo = visuals[0]; -+ XFree(visuals); -+ -+ m_pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ 192, -+ 108, -+ visInfo.depth); -+ if (!m_pixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::CreateGlxContext - Unable to create XPixmap"); -+ return false; -+ } -+ -+ // create gl pixmap -+ m_glPixmap = glXCreateGLXPixmap(m_Display, &visInfo, m_pixmap); -+ -+ if (!m_glPixmap) -+ { -+ CLog::Log(LOGINFO, "VDPAU::COutput::CreateGlxContext - Could not create glPixmap"); -+ return false; -+ } -+ -+ m_glContext = glXCreateContext(m_Display, &visInfo, glContext, True); -+ -+ if (!glXMakeCurrent(m_Display, m_glPixmap, m_glContext)) -+ { -+ CLog::Log(LOGINFO, "VDPAU::COutput::CreateGlxContext - Could not make Pixmap current"); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput::CreateGlxContext - created context"); -+ return true; -+} -+ -+bool COutput::DestroyGlxContext() -+{ -+ if (m_glContext) -+ { -+ glXMakeCurrent(m_Display, None, NULL); -+ glXDestroyContext(m_Display, m_glContext); -+ } -+ m_glContext = 0; -+ -+ if (m_glPixmap) -+ glXDestroyPixmap(m_Display, m_glPixmap); -+ m_glPixmap = 0; -+ -+ if (m_pixmap) -+ XFreePixmap(m_Display, m_pixmap); -+ m_pixmap = 0; -+ -+ return true; -+} -+ -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h 2012-05-14 14:15:12.131220406 +0200 -@@ -1,4 +1,3 @@ -- - #pragma once - /* - * Copyright (C) 2005-2009 Team XBMC -@@ -21,6 +20,24 @@ - * - */ - -+/** -+ * design goals: -+ * - improve performance -+ * max out hw resources: e.g. make 1080p60 play on ION2 -+ * allow advanced de-interlacing on ION -+ * -+ * - add vdpau/opengl interop -+ * -+ * - remove tight dependency to render thread -+ * prior design needed to hijack render thread in order to do -+ * gl interop functions. In particular this was a problem for -+ * init and clear down. Introduction of GL_NV_vdpau_interop -+ * increased the need to be independent from render thread -+ * -+ * - move to an actor based design in order to reduce the number -+ * of locks needed. -+ */ -+ - #include "DllAvUtil.h" - #include "DVDVideoCodec.h" - #include "DVDVideoCodecFFmpeg.h" -@@ -37,118 +54,31 @@ - #include "settings/VideoSettings.h" - #include "guilib/DispResource.h" - #include "threads/Event.h" --namespace Surface { class CSurface; } -- --#define NUM_OUTPUT_SURFACES 4 --#define NUM_VIDEO_SURFACES_MPEG2 10 // (1 frame being decoded, 2 reference) --#define NUM_VIDEO_SURFACES_H264 32 // (1 frame being decoded, up to 16 references) --#define NUM_VIDEO_SURFACES_VC1 10 // (same as MPEG-2) --#define NUM_OUTPUT_SURFACES_FOR_FULLHD 2 --#define FULLHD_WIDTH 1920 -- --class CVDPAU -- : public CDVDVideoCodecFFmpeg::IHardwareDecoder -- , public IDispResource --{ --public: -- -- struct pictureAge -- { -- int b_age; -- int ip_age[2]; -- }; -- -- struct Desc -- { -- const char *name; -- uint32_t id; -- uint32_t aux; /* optional extra parameter... */ -- }; -+#include "threads/Thread.h" -+#include "utils/ActorProtocol.h" - -- CVDPAU(); -- virtual ~CVDPAU(); -- -- virtual bool Open (AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces = 0); -- virtual int Decode (AVCodecContext* avctx, AVFrame* frame); -- virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -- virtual void Reset(); -- virtual void Close(); -- -- virtual int Check(AVCodecContext* avctx); -- -- virtual const std::string Name() { return "vdpau"; } -- -- bool MakePixmap(int width, int height); -- bool MakePixmapGL(); -- -- void ReleasePixmap(); -- void BindPixmap(); -- -- PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT; -- PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT; -- GLXPixmap m_glPixmap; -- Pixmap m_Pixmap; -+using namespace Actor; - -- static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -- static void FFDrawSlice(struct AVCodecContext *s, -- const AVFrame *src, int offset[4], -- int y, int type, int height); -- static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); - -- void Present(); -- bool ConfigVDPAU(AVCodecContext *avctx, int ref_frames); -- void SpewHardwareAvailable(); -- void InitCSCMatrix(int Height); -- bool CheckStatus(VdpStatus vdp_st, int line); -- bool IsSurfaceValid(vdpau_render_state *render); -- -- void CheckFeatures(); -- void SetColor(); -- void SetNoiseReduction(); -- void SetSharpness(); -- void SetDeinterlacing(); -- void SetHWUpscaling(); -+#define FULLHD_WIDTH 1920 -+#define MAX_PIC_Q_LENGTH 20 //for non-interop_yuv this controls the max length of the decoded pic to render completion Q - -- pictureAge picAge; -- vdpau_render_state *past[2], *current, *future; -- int tmpDeintMode, tmpDeintGUI, tmpDeint; -- float tmpNoiseReduction, tmpSharpness; -- float tmpBrightness, tmpContrast; -- int OutWidth, OutHeight; -- bool upScale; -- std::queue m_DVDVideoPics; -- -- static inline void ClearUsedForRender(vdpau_render_state **st) -- { -- if (*st) { -- (*st)->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -- *st = NULL; -- } -- } -+namespace VDPAU -+{ - -- VdpProcamp m_Procamp; -- VdpCSCMatrix m_CSCMatrix; -- VdpDevice HasDevice() { return vdp_device != VDP_INVALID_HANDLE; }; -- VdpChromaType vdp_chroma_type; -+/** -+ * VDPAU interface to driver -+ */ - -+struct VDPAU_procs -+{ -+ VdpGetProcAddress * vdp_get_proc_address; -+ VdpDeviceDestroy * vdp_device_destroy; - -- // protected: -- void InitVDPAUProcs(); -- void FiniVDPAUProcs(); -- void FiniVDPAUOutput(); -- bool ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame); -- bool FiniOutputMethod(); -- -- VdpDevice vdp_device; -- VdpGetProcAddress * vdp_get_proc_address; -- VdpPresentationQueueTarget vdp_flip_target; -- VdpPresentationQueue vdp_flip_queue; -- VdpDeviceDestroy * vdp_device_destroy; -- -- VdpVideoSurfaceCreate * vdp_video_surface_create; -- VdpVideoSurfaceDestroy * vdp_video_surface_destroy; -- VdpVideoSurfacePutBitsYCbCr * vdp_video_surface_put_bits_y_cb_cr; -- VdpVideoSurfaceGetBitsYCbCr * vdp_video_surface_get_bits_y_cb_cr; -+ VdpVideoSurfaceCreate * vdp_video_surface_create; -+ VdpVideoSurfaceDestroy * vdp_video_surface_destroy; -+ VdpVideoSurfacePutBitsYCbCr * vdp_video_surface_put_bits_y_cb_cr; -+ VdpVideoSurfaceGetBitsYCbCr * vdp_video_surface_get_bits_y_cb_cr; - - VdpOutputSurfacePutBitsYCbCr * vdp_output_surface_put_bits_y_cb_cr; - VdpOutputSurfacePutBitsNative * vdp_output_surface_put_bits_native; -@@ -158,15 +88,15 @@ - VdpOutputSurfaceRenderOutputSurface * vdp_output_surface_render_output_surface; - VdpOutputSurfacePutBitsIndexed * vdp_output_surface_put_bits_indexed; - -- VdpVideoMixerCreate * vdp_video_mixer_create; -- VdpVideoMixerSetFeatureEnables * vdp_video_mixer_set_feature_enables; -- VdpVideoMixerQueryParameterSupport * vdp_video_mixer_query_parameter_support; -- VdpVideoMixerQueryFeatureSupport * vdp_video_mixer_query_feature_support; -- VdpVideoMixerDestroy * vdp_video_mixer_destroy; -- VdpVideoMixerRender * vdp_video_mixer_render; -- VdpVideoMixerSetAttributeValues * vdp_video_mixer_set_attribute_values; -+ VdpVideoMixerCreate * vdp_video_mixer_create; -+ VdpVideoMixerSetFeatureEnables * vdp_video_mixer_set_feature_enables; -+ VdpVideoMixerQueryParameterSupport * vdp_video_mixer_query_parameter_support; -+ VdpVideoMixerQueryFeatureSupport * vdp_video_mixer_query_feature_support; -+ VdpVideoMixerDestroy * vdp_video_mixer_destroy; -+ VdpVideoMixerRender * vdp_video_mixer_render; -+ VdpVideoMixerSetAttributeValues * vdp_video_mixer_set_attribute_values; - -- VdpGenerateCSCMatrix * vdp_generate_csc_matrix; -+ VdpGenerateCSCMatrix * vdp_generate_csc_matrix; - - VdpPresentationQueueTargetDestroy * vdp_presentation_queue_target_destroy; - VdpPresentationQueueCreate * vdp_presentation_queue_create; -@@ -179,64 +109,467 @@ - - VdpGetErrorString * vdp_get_error_string; - -- VdpDecoderCreate * vdp_decoder_create; -- VdpDecoderDestroy * vdp_decoder_destroy; -- VdpDecoderRender * vdp_decoder_render; -- VdpDecoderQueryCapabilities * vdp_decoder_query_caps; -+ VdpDecoderCreate * vdp_decoder_create; -+ VdpDecoderDestroy * vdp_decoder_destroy; -+ VdpDecoderRender * vdp_decoder_render; -+ VdpDecoderQueryCapabilities * vdp_decoder_query_caps; - - VdpPreemptionCallbackRegister * vdp_preemption_callback_register; - -- VdpOutputSurface outputSurfaces[NUM_OUTPUT_SURFACES]; -- VdpOutputSurface outputSurface; -- VdpOutputSurface presentSurface; -- -- VdpDecoder decoder; -- VdpVideoMixer videoMixer; -- VdpRect outRect; -- VdpRect outRectVid; -+}; - -- static void* dl_handle; -- VdpStatus (*dl_vdp_device_create_x11)(Display* display, int screen, VdpDevice* device, VdpGetProcAddress **get_proc_address); -- VdpStatus (*dl_vdp_get_proc_address)(VdpDevice device, VdpFuncId function_id, void** function_pointer); -- VdpStatus (*dl_vdp_preemption_callback_register)(VdpDevice device, VdpPreemptionCallback callback, void* context); -+//----------------------------------------------------------------------------- -+// VDPAU data structs -+//----------------------------------------------------------------------------- - -- int surfaceNum; -- int presentSurfaceNum; -- int totalAvailableOutputSurfaces; -- uint32_t vid_width, vid_height; -- int surface_width, surface_height; -- uint32_t max_references; -- Display* m_Display; -- bool vdpauConfigured; -- uint32_t *m_BlackBar; -+class CDecoder; -+ -+/** -+ * Buffer statistics used to control number of frames in queue -+ */ -+ -+class CVdpauBufferStats -+{ -+public: -+ uint16_t decodedPics; -+ uint16_t processedPics; -+ uint16_t renderPics; -+ uint64_t latency; // time decoder has waited for a frame, ideally there is no latency -+ int playSpeed; -+ bool canSkipDeint; -+ int processCmd; -+ -+ void IncDecoded() { CSingleLock l(m_sec); decodedPics++;} -+ void DecDecoded() { CSingleLock l(m_sec); decodedPics--;} -+ void IncProcessed() { CSingleLock l(m_sec); processedPics++;} -+ void DecProcessed() { CSingleLock l(m_sec); processedPics--;} -+ void IncRender() { CSingleLock l(m_sec); renderPics++;} -+ void DecRender() { CSingleLock l(m_sec); renderPics--;} -+ void Reset() { CSingleLock l(m_sec); decodedPics=0; processedPics=0;renderPics=0;latency=0;} -+ void Get(uint16_t &decoded, uint16_t &processed, uint16_t &render) {CSingleLock l(m_sec); decoded = decodedPics, processed=processedPics, render=renderPics;} -+ void SetParams(uint64_t time, int speed) { CSingleLock l(m_sec); latency = time; playSpeed = speed; } -+ void GetParams(uint64_t &lat, int &speed) { CSingleLock l(m_sec); lat = latency; speed = playSpeed; } -+ void SetCmd(int cmd) { CSingleLock l(m_sec); processCmd = cmd; } -+ void GetCmd(int &cmd) { CSingleLock l(m_sec); cmd = processCmd; processCmd = 0; } -+ void SetCanSkipDeint(bool canSkip) { CSingleLock l(m_sec); canSkipDeint = canSkip; } -+ bool CanSkipDeint() { CSingleLock l(m_sec); if (canSkipDeint) return true; else return false;} -+private: -+ CCriticalSection m_sec; -+}; -+ -+/** -+ * CVdpauConfig holds all configuration parameters needed by vdpau -+ * The structure is sent to the internal classes CMixer and COutput -+ * for init. -+ */ -+ -+struct CVdpauConfig -+{ -+ int surfaceWidth; -+ int surfaceHeight; -+ int vidWidth; -+ int vidHeight; -+ int outWidth; -+ int outHeight; -+ VDPAU_procs vdpProcs; -+ VdpDevice vdpDevice; -+ VdpDecoder vdpDecoder; -+ VdpChromaType vdpChromaType; -+ CVdpauBufferStats *stats; -+ CDecoder *vdpau; -+ int featureCount; -+ int upscale; -+ VdpVideoMixerFeature vdpFeatures[10]; -+ std::vector *videoSurfaces; -+ CCriticalSection *videoSurfaceSec; -+ bool usePixmaps; -+ int numRenderBuffers; -+ uint32_t maxReferences; -+ bool useInteropYuv; -+}; -+ -+/** -+ * Holds a decoded frame -+ * Input to COutput for further processing -+ */ -+struct CVdpauDecodedPicture -+{ -+ DVDVideoPicture DVDPic; -+ vdpau_render_state *render; -+}; -+ -+/** -+ * Frame after having been processed by vdpau mixer -+ */ -+struct CVdpauProcessedPicture -+{ -+ DVDVideoPicture DVDPic; -+ vdpau_render_state *render; -+ VdpOutputSurface outputSurface; -+}; - -+/** -+ * Ready to render textures -+ * Sent from COutput back to CDecoder -+ * Objects are referenced by DVDVideoPicture and are sent -+ * to renderer -+ */ -+class CVdpauRenderPicture -+{ -+ friend class CDecoder; -+ friend class COutput; -+public: -+ DVDVideoPicture DVDPic; -+ int texWidth, texHeight; -+ CRect crop; -+ GLuint texture[4]; -+ uint32_t sourceIdx; -+ bool valid; -+ CDecoder *vdpau; -+ CVdpauRenderPicture* Acquire(); -+ long Release(); -+private: -+ void ReturnUnused(); -+ int refCount; -+ CCriticalSection *renderPicSection; -+}; - -+//----------------------------------------------------------------------------- -+// Mixer -+//----------------------------------------------------------------------------- -+ -+class CMixerControlProtocol : public Protocol -+{ -+public: -+ CMixerControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT = 0, -+ FLUSH, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ }; -+}; -+ -+class CMixerDataProtocol : public Protocol -+{ -+public: -+ CMixerDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ FRAME, -+ BUFFER, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * Embeds the vdpau video mixer -+ * Embedded by COutput class, gets decoded frames from COutput, processes -+ * them in mixer ands sends processed frames back to COutput -+ */ -+class CMixer : private CThread -+{ -+public: -+ CMixer(CEvent *inMsgEvent); -+ virtual ~CMixer(); -+ void Start(); -+ void Dispose(); -+ CMixerControlProtocol m_controlPort; -+ CMixerDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ void Init(); -+ void Uninit(); -+ void Flush(); -+ void CreateVdpauMixer(); -+ void ProcessPicture(); -+ void InitCycle(); -+ void FiniCycle(); -+ void CheckFeatures(); -+ void SetPostProcFeatures(bool postProcEnabled); -+ void PostProcOff(); -+ void InitCSCMatrix(int Width); -+ bool GenerateStudioCSCMatrix(VdpColorStandard colorStandard, VdpCSCMatrix &studioCSCMatrix); -+ void SetColor(); -+ void SetNoiseReduction(); -+ void SetSharpness(); -+ void SetDeintSkipChroma(); -+ void SetDeinterlacing(); -+ void SetHWUpscaling(); -+ void DisableHQScaling(); -+ EINTERLACEMETHOD GetDeinterlacingMethod(bool log = false); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_vdpError; -+ CVdpauConfig m_config; -+ VdpVideoMixer m_videoMixer; -+ VdpProcamp m_Procamp; -+ VdpCSCMatrix m_CSCMatrix; -+ bool m_PostProc; -+ float m_Brightness; -+ float m_Contrast; -+ float m_NoiseReduction; -+ float m_Sharpness; -+ int m_DeintMode; -+ int m_Deint; -+ int m_Upscale; -+ uint32_t *m_BlackBar; - VdpVideoMixerPictureStructure m_mixerfield; -- int m_mixerstep; -+ int m_mixerstep; -+ int m_mixersteps; -+ CVdpauProcessedPicture m_processPicture; -+ std::queue m_outputSurfaces; -+ std::queue m_decodedPics; -+ std::deque m_mixerInput; -+}; -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+ -+/** -+ * Buffer pool holds allocated vdpau and gl resources -+ * Embedded in COutput -+ */ -+struct VdpauBufferPool -+{ -+ struct Pixmaps -+ { -+ unsigned short id; -+ bool used; -+ DVDVideoPicture DVDPic; -+ GLuint texture; -+ Pixmap pixmap; -+ GLXPixmap glPixmap; -+ VdpPresentationQueueTarget vdp_flip_target; -+ VdpPresentationQueue vdp_flip_queue; -+ VdpOutputSurface surface; -+ }; -+ struct GLVideoSurface -+ { -+ GLuint texture[4]; -+#ifdef GL_NV_vdpau_interop -+ GLvdpauSurfaceNV glVdpauSurface; -+#endif -+ vdpau_render_state *sourceVuv; -+ VdpOutputSurface sourceRgb; -+ }; -+ unsigned short numOutputSurfaces; -+ std::vector pixmaps; -+ std::vector outputSurfaces; -+ std::deque notVisiblePixmaps; -+ std::vector allRenderPics; -+ std::map glVideoSurfaceMap; -+ std::map glOutputSurfaceMap; -+ std::queue processedPics; -+ std::deque usedRenderPics; -+ std::deque freeRenderPics; -+ CCriticalSection renderPicSec; -+}; -+ -+class COutputControlProtocol : public Protocol -+{ -+public: -+ COutputControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT, -+ FLUSH, -+ PRECLEANUP, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ STATS, -+ }; -+}; -+ -+class COutputDataProtocol : public Protocol -+{ -+public: -+ COutputDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ NEWFRAME = 0, -+ RETURNPIC, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * COutput is embedded in CDecoder and embeds CMixer -+ * The class has its own OpenGl context which is shared with render thread -+ * COuput generated ready to render textures and passes them back to -+ * CDecoder -+ */ -+class COutput : private CThread -+{ -+public: -+ COutput(CEvent *inMsgEvent); -+ virtual ~COutput(); -+ void Start(); -+ void Dispose(); -+ COutputControlProtocol m_controlPort; -+ COutputDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ bool HasWork(); -+ CVdpauRenderPicture *ProcessMixerPicture(); -+ void ProcessReturnPicture(CVdpauRenderPicture *pic); -+ int FindFreePixmap(); -+ bool Init(); -+ bool Uninit(); -+ void Flush(); -+ bool CreateGlxContext(); -+ bool DestroyGlxContext(); -+ bool EnsureBufferPool(); -+ void ReleaseBufferPool(); -+ void InitMixer(); -+ bool GLInit(); -+ void GLMapSurfaces(); -+ void GLUnmapSurfaces(); -+ void GLBindPixmaps(); -+ void GLUnbindPixmaps(); -+ bool MakePixmap(VdpauBufferPool::Pixmaps &pixmap); -+ bool MakePixmapGL(VdpauBufferPool::Pixmaps &pixmap); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_vdpError; -+ CVdpauConfig m_config; -+ VdpauBufferPool m_bufferPool; -+ CMixer m_mixer; -+ Display *m_Display; -+ Window m_Window; -+ GLXContext m_glContext; -+ GLXWindow m_glWindow; -+ Pixmap m_pixmap; -+ GLXPixmap m_glPixmap; -+ -+ // gl functions -+ PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT; -+ PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT; -+#ifdef GL_NV_vdpau_interop -+ PFNGLVDPAUINITNVPROC glVDPAUInitNV; -+ PFNGLVDPAUFININVPROC glVDPAUFiniNV; -+ PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC glVDPAURegisterOutputSurfaceNV; -+ PFNGLVDPAUREGISTERVIDEOSURFACENVPROC glVDPAURegisterVideoSurfaceNV; -+ PFNGLVDPAUISSURFACENVPROC glVDPAUIsSurfaceNV; -+ PFNGLVDPAUUNREGISTERSURFACENVPROC glVDPAUUnregisterSurfaceNV; -+ PFNGLVDPAUSURFACEACCESSNVPROC glVDPAUSurfaceAccessNV; -+ PFNGLVDPAUMAPSURFACESNVPROC glVDPAUMapSurfacesNV; -+ PFNGLVDPAUUNMAPSURFACESNVPROC glVDPAUUnmapSurfacesNV; -+ PFNGLVDPAUGETSURFACEIVNVPROC glVDPAUGetSurfaceivNV; -+#endif -+}; -+ -+//----------------------------------------------------------------------------- -+// VDPAU decoder -+//----------------------------------------------------------------------------- -+ -+/** -+ * VDPAU main class -+ */ -+class CDecoder -+ : public CDVDVideoCodecFFmpeg::IHardwareDecoder -+ , public IDispResource -+{ -+ friend class CVdpauRenderPicture; -+ -+public: -+ -+ struct PictureAge -+ { -+ int b_age; -+ int ip_age[2]; -+ }; -+ -+ struct Desc -+ { -+ const char *name; -+ uint32_t id; -+ uint32_t aux; /* optional extra parameter... */ -+ }; -+ -+ CDecoder(); -+ virtual ~CDecoder(); -+ -+ virtual bool Open (AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces = 0); -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame) {return Decode(avctx, frame, false, false);}; -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame, bool bSoftDrain = false, bool bHardDrain = false); -+ virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -+ virtual void Reset(); -+ virtual void Close(); -+ virtual long Release(); -+ virtual bool CanSkipDeint(); -+ virtual void SetSpeed(int speed); -+ -+ virtual int Check(AVCodecContext* avctx); -+ virtual const std::string Name() { return "vdpau"; } - - bool Supports(VdpVideoMixerFeature feature); - bool Supports(EINTERLACEMETHOD method); - EINTERLACEMETHOD AutoInterlaceMethod(); -+ static bool IsVDPAUFormat(PixelFormat fmt); - -- VdpVideoMixerFeature m_features[10]; -- int m_feature_count; -+ static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -+ static void FFDrawSlice(struct AVCodecContext *s, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height); -+ static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); -+ -+ virtual void OnLostDevice(); -+ virtual void OnResetDevice(); -+ -+protected: -+ void SetWidthHeight(int width, int height); -+ bool ConfigVDPAU(AVCodecContext *avctx, int ref_frames); -+ void SpewHardwareAvailable(); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ bool IsSurfaceValid(vdpau_render_state *render); -+ void InitVDPAUProcs(); -+ void FiniVDPAUProcs(); -+ void FiniVDPAUOutput(); -+ void ReturnRenderPicture(CVdpauRenderPicture *renderPic); -+ long ReleasePicReference(); - -- static bool IsVDPAUFormat(PixelFormat fmt); - static void ReadFormatOf( PixelFormat fmt - , VdpDecoderProfile &decoder_profile - , VdpChromaType &chroma_type); - -- std::vector m_videoSurfaces; -- DllAvUtil m_dllAvUtil; -- -- enum VDPAUOutputMethod -- { -- OUTPUT_NONE, -- OUTPUT_PIXMAP, -- OUTPUT_GL_INTEROP_RGB, -- OUTPUT_GL_INTEROP_YUV -- }; -- VDPAUOutputMethod m_vdpauOutputMethod; -+ VdpStatus (*dl_vdp_device_create_x11)(Display* display, int screen, VdpDevice* device, VdpGetProcAddress **get_proc_address); -+ VdpStatus (*dl_vdp_get_proc_address)(VdpDevice device, VdpFuncId function_id, void** function_pointer); -+ VdpStatus (*dl_vdp_preemption_callback_register)(VdpDevice device, VdpPreemptionCallback callback, void* context); - - // OnLostDevice triggers transition from all states to LOST - // internal errors trigger transition from OPEN to RESET -@@ -247,9 +580,27 @@ - , VDPAU_LOST - , VDPAU_ERROR - } m_DisplayState; -- CSharedSection m_DecoderSection; -- CSharedSection m_DisplaySection; -+ CCriticalSection m_DecoderSection; - CEvent m_DisplayEvent; -- virtual void OnLostDevice(); -- virtual void OnResetDevice(); -+ -+ static void* dl_handle; -+ DllAvUtil m_dllAvUtil; -+ Display* m_Display; -+ ThreadIdentifier m_decoderThread; -+ bool m_vdpauConfigured; -+ CVdpauConfig m_vdpauConfig; -+ std::vector m_videoSurfaces; -+ CCriticalSection m_videoSurfaceSec; -+ PictureAge m_picAge; -+ -+ COutput m_vdpauOutput; -+ CVdpauBufferStats m_bufferStats; -+ CEvent m_inMsgEvent; -+ CVdpauRenderPicture *m_presentPicture; -+ -+ int m_speed; -+ int m_codecControl; - }; -+ -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 2012-05-14 14:15:12.135220486 +0200 -@@ -0,0 +1,2382 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include "system.h" -+#ifdef HAVE_LIBXVBA -+#include -+#include -+#include "XVBA.h" -+#include "windowing/WindowingFactory.h" -+#include "guilib/GraphicContext.h" -+#include "settings/GUISettings.h" -+#include "settings/Settings.h" -+#include "utils/TimeUtils.h" -+#include "cores/dvdplayer/DVDClock.h" -+ -+using namespace XVBA; -+ -+// XVBA interface -+ -+#define XVBA_LIBRARY "libXvBAW.so.1" -+ -+typedef Bool (*XVBAQueryExtensionProc) (Display *dpy, int *vers); -+typedef Status (*XVBACreateContextProc) (void *input, void *output); -+typedef Status (*XVBADestroyContextProc) (void *context); -+typedef Bool (*XVBAGetSessionInfoProc) (void *input, void *output); -+typedef Status (*XVBACreateSurfaceProc) (void *input, void *output); -+typedef Status (*XVBACreateGLSharedSurfaceProc)(void *input, void *output); -+typedef Status (*XVBADestroySurfaceProc) (void *surface); -+typedef Status (*XVBACreateDecodeBuffersProc) (void *input, void *output); -+typedef Status (*XVBADestroyDecodeBuffersProc) (void *input); -+typedef Status (*XVBAGetCapDecodeProc) (void *input, void *output); -+typedef Status (*XVBACreateDecodeProc) (void *input, void *output); -+typedef Status (*XVBADestroyDecodeProc) (void *session); -+typedef Status (*XVBAStartDecodePictureProc) (void *input); -+typedef Status (*XVBADecodePictureProc) (void *input); -+typedef Status (*XVBAEndDecodePictureProc) (void *input); -+typedef Status (*XVBASyncSurfaceProc) (void *input, void *output); -+typedef Status (*XVBAGetSurfaceProc) (void *input); -+typedef Status (*XVBATransferSurfaceProc) (void *input); -+ -+static struct -+{ -+ XVBAQueryExtensionProc QueryExtension; -+ XVBACreateContextProc CreateContext; -+ XVBADestroyContextProc DestroyContext; -+ XVBAGetSessionInfoProc GetSessionInfo; -+ XVBACreateSurfaceProc CreateSurface; -+ XVBACreateGLSharedSurfaceProc CreateGLSharedSurface; -+ XVBADestroySurfaceProc DestroySurface; -+ XVBACreateDecodeBuffersProc CreateDecodeBuffers; -+ XVBADestroyDecodeBuffersProc DestroyDecodeBuffers; -+ XVBAGetCapDecodeProc GetCapDecode; -+ XVBACreateDecodeProc CreateDecode; -+ XVBADestroyDecodeProc DestroyDecode; -+ XVBAStartDecodePictureProc StartDecodePicture; -+ XVBADecodePictureProc DecodePicture; -+ XVBAEndDecodePictureProc EndDecodePicture; -+ XVBASyncSurfaceProc SyncSurface; -+ XVBAGetSurfaceProc GetSurface; -+ XVBATransferSurfaceProc TransferSurface; -+}g_XVBA_vtable; -+ -+//----------------------------------------------------------------------------- -+//----------------------------------------------------------------------------- -+ -+CXVBAContext *CXVBAContext::m_context = 0; -+CCriticalSection CXVBAContext::m_section; -+Display *CXVBAContext::m_display = 0; -+void *CXVBAContext::m_dlHandle = 0; -+ -+CXVBAContext::CXVBAContext() -+{ -+ m_context = 0; -+// m_dlHandle = 0; -+ m_xvbaContext = 0; -+ m_refCount = 0; -+} -+ -+void CXVBAContext::Release() -+{ -+ CSingleLock lock(m_section); -+ -+ m_refCount--; -+ if (m_refCount <= 0) -+ { -+ Close(); -+ delete this; -+ m_context = 0; -+ } -+} -+ -+void CXVBAContext::Close() -+{ -+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder context"); -+ -+ DestroyContext(); -+// if (m_dlHandle) -+// { -+// dlclose(m_dlHandle); -+// m_dlHandle = 0; -+// } -+} -+ -+bool CXVBAContext::EnsureContext(CXVBAContext **ctx) -+{ -+ CSingleLock lock(m_section); -+ -+ if (m_context) -+ { -+ m_context->m_refCount++; -+ *ctx = m_context; -+ return true; -+ } -+ -+ m_context = new CXVBAContext(); -+ *ctx = m_context; -+ { -+ CSingleLock gLock(g_graphicsContext); -+ if (!m_context->LoadSymbols() || !m_context->CreateContext()) -+ { -+ delete m_context; -+ m_context = 0; -+ return false; -+ } -+ } -+ -+ m_context->m_refCount++; -+ -+ *ctx = m_context; -+ return true; -+} -+ -+bool CXVBAContext::LoadSymbols() -+{ -+ if (!m_dlHandle) -+ { -+ m_dlHandle = dlopen(XVBA_LIBRARY, RTLD_LAZY); -+ if (!m_dlHandle) -+ { -+ const char* error = dlerror(); -+ if (!error) -+ error = "dlerror() returned NULL"; -+ -+ CLog::Log(LOGERROR,"XVBA::LoadSymbols: Unable to get handle to lib: %s", error); -+ return false; -+ } -+ } -+ else -+ return true; -+ -+#define INIT_PROC(PREFIX, PROC) do { \ -+ g_##PREFIX##_vtable.PROC = (PREFIX##PROC##Proc) \ -+ dlsym(m_dlHandle, #PREFIX #PROC); \ -+ } while (0) -+ -+#define INIT_PROC_CHECK(PREFIX, PROC) do { \ -+ dlerror(); \ -+ INIT_PROC(PREFIX, PROC); \ -+ if (dlerror()) { \ -+ dlclose(m_dlHandle); \ -+ m_dlHandle = NULL; \ -+ return false; \ -+ } \ -+ } while (0) -+ -+#define XVBA_INIT_PROC(PROC) INIT_PROC_CHECK(XVBA, PROC) -+ -+ XVBA_INIT_PROC(QueryExtension); -+ XVBA_INIT_PROC(CreateContext); -+ XVBA_INIT_PROC(DestroyContext); -+ XVBA_INIT_PROC(GetSessionInfo); -+ XVBA_INIT_PROC(CreateSurface); -+ XVBA_INIT_PROC(CreateGLSharedSurface); -+ XVBA_INIT_PROC(DestroySurface); -+ XVBA_INIT_PROC(CreateDecodeBuffers); -+ XVBA_INIT_PROC(DestroyDecodeBuffers); -+ XVBA_INIT_PROC(GetCapDecode); -+ XVBA_INIT_PROC(CreateDecode); -+ XVBA_INIT_PROC(DestroyDecode); -+ XVBA_INIT_PROC(StartDecodePicture); -+ XVBA_INIT_PROC(DecodePicture); -+ XVBA_INIT_PROC(EndDecodePicture); -+ XVBA_INIT_PROC(SyncSurface); -+ XVBA_INIT_PROC(GetSurface); -+ XVBA_INIT_PROC(TransferSurface); -+ -+#undef XVBA_INIT_PROC -+#undef INIT_PROC -+ -+ return true; -+} -+ -+bool CXVBAContext::CreateContext() -+{ -+ if (m_xvbaContext) -+ return true; -+ -+ CLog::Log(LOGNOTICE,"XVBA::CreateContext - creating decoder context"); -+ -+ Drawable window; -+ { CSingleLock lock(g_graphicsContext); -+ if (!m_display) -+ m_display = XOpenDisplay(NULL); -+ window = 0; -+ } -+ -+ int version; -+ if (!g_XVBA_vtable.QueryExtension(m_display, &version)) -+ return false; -+ CLog::Log(LOGNOTICE,"XVBA::CreateContext - opening xvba version: %i", version); -+ -+ // create XVBA Context -+ XVBA_Create_Context_Input contextInput; -+ XVBA_Create_Context_Output contextOutput; -+ contextInput.size = sizeof(contextInput); -+ contextInput.display = m_display; -+ contextInput.draw = window; -+ contextOutput.size = sizeof(contextOutput); -+ if(Success != g_XVBA_vtable.CreateContext(&contextInput, &contextOutput)) -+ { -+ CLog::Log(LOGERROR,"XVBA::CreateContext - failed to create context"); -+ return false; -+ } -+ m_xvbaContext = contextOutput.context; -+ -+ return true; -+} -+ -+void CXVBAContext::DestroyContext() -+{ -+ if (!m_xvbaContext) -+ return; -+ -+ g_XVBA_vtable.DestroyContext(m_xvbaContext); -+ m_xvbaContext = 0; -+// XCloseDisplay(m_display); -+} -+ -+void *CXVBAContext::GetContext() -+{ -+ return m_xvbaContext; -+} -+ -+//----------------------------------------------------------------------------- -+//----------------------------------------------------------------------------- -+ -+static unsigned int decoderId = 0; -+ -+CDecoder::CDecoder() : m_xvbaOutput(&m_inMsgEvent) -+{ -+ m_xvbaConfig.context = 0; -+ m_xvbaConfig.xvbaSession = 0; -+ m_xvbaConfig.videoSurfaces = &m_videoSurfaces; -+ m_xvbaConfig.videoSurfaceSec = &m_videoSurfaceSec; -+ m_xvbaConfig.apiSec = &m_apiSec; -+ -+ m_displayState = XVBA_OPEN; -+} -+ -+CDecoder::~CDecoder() -+{ -+ Close(); -+} -+ -+typedef struct { -+ unsigned int size; -+ unsigned int num_of_decodecaps; -+ XVBADecodeCap decode_caps_list[]; -+} XVBA_GetCapDecode_Output_Base; -+ -+void CDecoder::OnLostDevice() -+{ -+ CLog::Log(LOGNOTICE,"XVBA::OnLostDevice event"); -+ -+ CSingleLock lock(m_decoderSection); -+ DestroySession(); -+ if (m_xvbaConfig.context) -+ m_xvbaConfig.context->Release(); -+ m_xvbaConfig.context = 0; -+ -+ m_displayState = XVBA_LOST; -+ m_displayEvent.Reset(); -+} -+ -+void CDecoder::OnResetDevice() -+{ -+ CLog::Log(LOGNOTICE,"XVBA::OnResetDevice event"); -+ -+ CSingleLock lock(m_decoderSection); -+ if (m_displayState == XVBA_LOST) -+ { -+ m_displayState = XVBA_RESET; -+ lock.Leave(); -+ m_displayEvent.Set(); -+ } -+} -+ -+bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned int surfaces) -+{ -+ std::string Vendor = g_Windowing.GetRenderVendor(); -+ std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); -+ if (Vendor.compare(0, 3, "ati") != 0) -+ { -+ return false; -+ } -+ -+ m_decoderId = decoderId++; -+ -+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening xvba decoder, id: %d", m_decoderId); -+ -+ if(avctx->coded_width == 0 -+ || avctx->coded_height == 0) -+ { -+ CLog::Log(LOGWARNING,"(XVBA) no width/height available, can't init"); -+ return false; -+ } -+ -+ if (!m_dllAvUtil.Load()) -+ return false; -+ -+ if (!CXVBAContext::EnsureContext(&m_xvbaConfig.context)) -+ return false; -+ -+ // xvba get session info -+ XVBA_GetSessionInfo_Input sessionInput; -+ XVBA_GetSessionInfo_Output sessionOutput; -+ sessionInput.size = sizeof(sessionInput); -+ sessionInput.context = m_xvbaConfig.context->GetContext(); -+ sessionOutput.size = sizeof(sessionOutput); -+ if (Success != g_XVBA_vtable.GetSessionInfo(&sessionInput, &sessionOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) can't get session info"); -+ return false; -+ } -+ if (sessionOutput.getcapdecode_output_size == 0) -+ { -+ CLog::Log(LOGERROR,"(XVBA) session decode not supported"); -+ return false; -+ } -+ -+ // get decoder capabilities -+ XVBA_GetCapDecode_Input capInput; -+ XVBA_GetCapDecode_Output *capOutput; -+ capInput.size = sizeof(capInput); -+ capInput.context = m_xvbaConfig.context->GetContext(); -+ capOutput = (XVBA_GetCapDecode_Output *)calloc(sessionOutput.getcapdecode_output_size, 1); -+ capOutput->size = sessionOutput.getcapdecode_output_size; -+ if (Success != g_XVBA_vtable.GetCapDecode(&capInput, capOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) can't get decode capabilities"); -+ return false; -+ } -+ -+ int match = -1; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_H264 && -+ capOutput->decode_caps_list[i].flags == XVBA_H264_HIGH) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_H264_HIGH not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_VC1) -+ { -+ // search for profile advanced -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_VC1 && -+ capOutput->decode_caps_list[i].flags == XVBA_VC1_ADVANCED) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_VC1_ADVANCED not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_MPEG2VIDEO) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_MPEG2_VLD) -+ { -+ // XXX: uncomment when implemented -+ // match = (int) i; -+ // break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_MPEG2_VLD not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_WMV3) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_VC1 && -+ capOutput->decode_caps_list[i].flags == XVBA_VC1_MAIN) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_VC1_MAIN not found"); -+ } -+ } -+ -+ if (match < 0) -+ { -+ free(capOutput); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE,"(XVBA) using decoder capability id: %i flags: %i", -+ capOutput->decode_caps_list[match].capability_id, -+ capOutput->decode_caps_list[match].flags); -+ CLog::Log(LOGNOTICE,"(XVBA) using surface type: %x", -+ capOutput->decode_caps_list[match].surface_type); -+ -+ m_xvbaConfig.decoderCap = capOutput->decode_caps_list[match]; -+ -+ free(capOutput); -+ -+ // set some varables -+ m_xvbaConfig.xvbaSession = 0; -+ m_xvbaBufferPool.data_buffer = 0; -+ m_xvbaBufferPool.iq_matrix_buffer = 0; -+ m_xvbaBufferPool.picture_descriptor_buffer = 0; -+ picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -+ m_presentPicture = 0; -+ m_xvbaConfig.numRenderBuffers = surfaces; -+ m_decoderThread = CThread::GetCurrentThreadId(); -+ m_speed = DVD_PLAYSPEED_NORMAL; -+ -+ if (1) //g_guiSettings.GetBool("videoplayer.usexvbasharedsurface")) -+ m_xvbaConfig.useSharedSurfaces = true; -+ else -+ m_xvbaConfig.useSharedSurfaces = false; -+ -+ m_displayState = XVBA_OPEN; -+ -+ // setup ffmpeg -+ avctx->thread_count = 1; -+ avctx->get_buffer = CDecoder::FFGetBuffer; -+ avctx->release_buffer = CDecoder::FFReleaseBuffer; -+ avctx->draw_horiz_band = CDecoder::FFDrawSlice; -+ avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; -+ -+ g_Windowing.Register(this); -+ return true; -+} -+ -+void CDecoder::Close() -+{ -+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder, id: %d", m_decoderId); -+ -+ if (!m_xvbaConfig.context) -+ return; -+ -+ DestroySession(); -+ if (m_xvbaConfig.context) -+ m_xvbaConfig.context->Release(); -+ m_xvbaConfig.context = 0; -+ -+ while (!m_videoSurfaces.empty()) -+ { -+ xvba_render_state *render = m_videoSurfaces.back(); -+ if(render->buffers_alllocated > 0) -+ m_dllAvUtil.av_free(render->buffers); -+ m_videoSurfaces.pop_back(); -+ free(render); -+ } -+ -+ g_Windowing.Unregister(this); -+ m_dllAvUtil.Unload(); -+} -+ -+long CDecoder::Release() -+{ -+ // check if we should do some pre-cleanup here -+ // a second decoder might need resources -+ if (m_xvbaConfig.xvbaSession) -+ { -+ CSingleLock lock(m_decoderSection); -+ CLog::Log(LOGNOTICE,"XVBA::Release pre-cleanup"); -+ -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - pre-cleanup returned error", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - pre-cleanup timed out", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ xvba_render_state *render = m_videoSurfaces[i]; -+ if (render->surface && !(render->state & FF_XVBA_STATE_USED_FOR_RENDER)) -+ { -+ g_XVBA_vtable.DestroySurface(render->surface); -+ render->surface = 0; -+ render->picture_descriptor = 0; -+ render->iq_matrix = 0; -+ } -+ } -+ } -+ IHardwareDecoder::Release(); -+} -+ -+long CDecoder::ReleasePicReference() -+{ -+ return IHardwareDecoder::Release(); -+} -+ -+bool CDecoder::Supports(EINTERLACEMETHOD method) -+{ -+ if(method == VS_INTERLACEMETHOD_AUTO) -+ return true; -+ -+ if (1) //g_guiSettings.GetBool("videoplayer.usexvbasharedsurface")) -+ { -+ if (method == VS_INTERLACEMETHOD_XVBA) -+ return true; -+ } -+ -+ return false; -+} -+ -+void CDecoder::ResetState() -+{ -+ picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -+ -+ m_displayState = XVBA_OPEN; -+} -+ -+int CDecoder::Check(AVCodecContext* avctx) -+{ -+ EDisplayState state; -+ -+ { CSingleLock lock(m_decoderSection); -+ state = m_displayState; -+ } -+ -+ if (state == XVBA_LOST) -+ { -+ CLog::Log(LOGNOTICE,"XVBA::Check waiting for display reset event"); -+ if (!m_displayEvent.WaitMSec(2000)) -+ { -+ CLog::Log(LOGERROR, "XVBA::Check - device didn't reset in reasonable time"); -+ state = XVBA_RESET;; -+ } -+ else -+ { CSingleLock lock(m_decoderSection); -+ state = m_displayState; -+ } -+ } -+ if (state == XVBA_RESET || state == XVBA_ERROR) -+ { -+ CLog::Log(LOGNOTICE,"XVBA::Check - Attempting recovery"); -+ -+ CSingleLock gLock(g_graphicsContext); -+ CSingleLock lock(m_decoderSection); -+ -+ DestroySession(); -+ ResetState(); -+ CXVBAContext::EnsureContext(&m_xvbaConfig.context); -+ -+ if (state == XVBA_RESET) -+ return VC_FLUSHED; -+ else -+ return VC_ERROR; -+ } -+ return 0; -+} -+ -+void CDecoder::SetError(const char* function, const char* msg, int line) -+{ -+ CLog::Log(LOGERROR, "XVBA::%s - %s, line %d", function, msg, line); -+ CSingleLock lock(m_decoderSection); -+ m_displayState = XVBA_ERROR; -+} -+ -+bool CDecoder::CreateSession(AVCodecContext* avctx) -+{ -+ m_xvbaConfig.surfaceWidth = (avctx->coded_width+15) & ~15; -+ m_xvbaConfig.surfaceHeight = (avctx->coded_height+15) & ~15; -+ -+ m_xvbaConfig.vidWidth = avctx->width; -+ m_xvbaConfig.vidHeight = avctx->height; -+ -+ XVBA_Create_Decode_Session_Input sessionInput; -+ XVBA_Create_Decode_Session_Output sessionOutput; -+ -+ sessionInput.size = sizeof(sessionInput); -+ sessionInput.width = m_xvbaConfig.surfaceWidth; -+ sessionInput.height = m_xvbaConfig.surfaceHeight; -+ sessionInput.context = m_xvbaConfig.context->GetContext(); -+ sessionInput.decode_cap = &m_xvbaConfig.decoderCap; -+ sessionOutput.size = sizeof(sessionOutput); -+ -+ if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput)) -+ { -+ SetError(__FUNCTION__, "failed to create decoder session", __LINE__); -+ CLog::Log(LOGERROR, "Decoder failed with following stats: m_surfaceWidth %u, m_surfaceHeight %u," -+ " m_vidWidth %u, m_vidHeight %u, coded_width %d, coded_height %d", -+ m_xvbaConfig.surfaceWidth, -+ m_xvbaConfig.surfaceHeight, -+ m_xvbaConfig.vidWidth, -+ m_xvbaConfig.vidHeight, -+ avctx->coded_width, -+ avctx->coded_height); -+ return false; -+ } -+ m_xvbaConfig.xvbaSession = sessionOutput.session; -+ -+ // create decode buffers -+ XVBA_Create_DecodeBuff_Input bufferInput; -+ XVBA_Create_DecodeBuff_Output bufferOutput; -+ -+ bufferInput.size = sizeof(bufferInput); -+ bufferInput.session = m_xvbaConfig.xvbaSession; -+ bufferInput.buffer_type = XVBA_PICTURE_DESCRIPTION_BUFFER; -+ bufferInput.num_of_buffers = 1; -+ bufferOutput.size = sizeof(bufferOutput); -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create picture buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.picture_descriptor_buffer = bufferOutput.buffer_list; -+ -+ // data buffer -+ bufferInput.buffer_type = XVBA_DATA_BUFFER; -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create data buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.data_buffer = bufferOutput.buffer_list; -+ -+ // QO Buffer -+ bufferInput.buffer_type = XVBA_QM_BUFFER; -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create qm buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.iq_matrix_buffer = bufferOutput.buffer_list; -+ -+ -+ // initialize output -+ CSingleLock lock(g_graphicsContext); -+ m_xvbaConfig.stats = &m_bufferStats; -+ m_bufferStats.Reset(); -+ m_xvbaOutput.Start(); -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::INIT, -+ &reply, -+ 2000, -+ &m_xvbaConfig, -+ sizeof(m_xvbaConfig))) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - vdpau output returned error", __FUNCTION__); -+ m_xvbaOutput.Dispose(); -+ return false; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - failed to init output", __FUNCTION__); -+ m_xvbaOutput.Dispose(); -+ return false; -+ } -+ m_inMsgEvent.Reset(); -+ -+ return true; -+} -+ -+void CDecoder::DestroySession() -+{ -+ m_xvbaOutput.Dispose(); -+ -+ XVBA_Destroy_Decode_Buffers_Input bufInput; -+ bufInput.size = sizeof(bufInput); -+ bufInput.num_of_buffers_in_list = 1; -+ -+ for (unsigned int i=0; isurface) -+ { -+ g_XVBA_vtable.DestroySurface(render->surface); -+ render->surface = 0; -+ render->picture_descriptor = 0; -+ render->iq_matrix = 0; -+ } -+ } -+ -+ if (m_xvbaConfig.xvbaSession) -+ g_XVBA_vtable.DestroyDecode(m_xvbaConfig.xvbaSession); -+ m_xvbaConfig.xvbaSession = 0; -+} -+ -+bool CDecoder::IsSurfaceValid(xvba_render_state *render) -+{ -+ // find render state in queue -+ bool found(false); -+ unsigned int i; -+ for(i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ if(m_videoSurfaces[i] == render) -+ { -+ found = true; -+ break; -+ } -+ } -+ if (!found) -+ { -+ CLog::Log(LOGERROR,"%s - video surface not found", __FUNCTION__); -+ return false; -+ } -+ if (m_videoSurfaces[i]->surface == 0) -+ { -+ m_videoSurfaces[i]->state = 0; -+ return false; -+ } -+ -+ return true; -+} -+ -+bool CDecoder::EnsureDataControlBuffers(unsigned int num) -+{ -+ if (m_xvbaBufferPool.data_control_buffers.size() >= num) -+ return true; -+ -+ unsigned int missing = num - m_xvbaBufferPool.data_control_buffers.size(); -+ -+ XVBA_Create_DecodeBuff_Input bufferInput; -+ XVBA_Create_DecodeBuff_Output bufferOutput; -+ bufferInput.size = sizeof(bufferInput); -+ bufferInput.session = m_xvbaConfig.xvbaSession; -+ bufferInput.buffer_type = XVBA_DATA_CTRL_BUFFER; -+ bufferInput.num_of_buffers = 1; -+ bufferOutput.size = sizeof(bufferOutput); -+ -+ for (unsigned int i=0; iopaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ unsigned int i; -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ xvba_render_state * render = NULL; -+ render = (xvba_render_state*)pic->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFReleaseBuffer - invalid context handle provided"); -+ return; -+ } -+ -+ for(i=0; i<4; i++) -+ pic->data[i]= NULL; -+ -+ // find render state in queue -+ if (!xvba->IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGDEBUG, "XVBA::FFReleaseBuffer - ignoring invalid buffer"); -+ return; -+ } -+ -+ render->state &= ~FF_XVBA_STATE_USED_FOR_REFERENCE; -+} -+ -+void CDecoder::FFDrawSlice(struct AVCodecContext *avctx, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height) -+{ -+ CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ if(xvba->m_displayState != XVBA_OPEN) -+ return; -+ -+ if(src->linesize[0] || src->linesize[1] || src->linesize[2] -+ || offset[0] || offset[1] || offset[2]) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFDrawSlice - invalid linesizes or offsets provided"); -+ return; -+ } -+ -+ xvba_render_state * render; -+ -+ render = (xvba_render_state*)src->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFDrawSlice - invalid context handle provided"); -+ return; -+ } -+ -+ // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid -+ if (!xvba->IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGWARNING, "XVBA::FFDrawSlice - ignoring invalid buffer"); -+ return; -+ } -+ -+ // decoding -+ XVBA_Decode_Picture_Start_Input startInput; -+ startInput.size = sizeof(startInput); -+ startInput.session = xvba->m_xvbaConfig.xvbaSession; -+ startInput.target_surface = render->surface; -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.StartDecodePicture(&startInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to start decoding", __LINE__); -+ return; -+ } -+ } -+ -+ XVBA_Decode_Picture_Input picInput; -+ picInput.size = sizeof(picInput); -+ picInput.session = xvba->m_xvbaConfig.xvbaSession; -+ XVBABufferDescriptor *list[2]; -+ picInput.buffer_list = list; -+ list[0] = xvba->m_xvbaBufferPool.picture_descriptor_buffer; -+ picInput.num_of_buffers_in_list = 1; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ list[1] = xvba->m_xvbaBufferPool.iq_matrix_buffer; -+ picInput.num_of_buffers_in_list = 2; -+ } -+ -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.DecodePicture(&picInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 1", __LINE__); -+ return; -+ } -+ } -+ -+ if (!xvba->EnsureDataControlBuffers(render->num_slices)) -+ return; -+ -+ XVBADataCtrl *dataControl; -+ int location = 0; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer = 0; -+ for (unsigned int j = 0; j < render->num_slices; ++j) -+ { -+ int startCodeSize = 0; -+ uint8_t startCode[] = {0x00,0x00,0x01}; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ startCodeSize = 3; -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location, -+ startCode, 3); -+ } -+ else if (avctx->codec_id == CODEC_ID_VC1 && -+ (memcmp(render->buffers[j].buffer, startCode, 3) != 0)) -+ { -+ startCodeSize = 4; -+ uint8_t sdf = 0x0d; -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location, -+ startCode, 3); -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location+3, -+ &sdf, 1); -+ } -+ // check for potential buffer overwrite -+ unsigned int bytesToCopy = render->buffers[j].size; -+ unsigned int freeBufferSize = xvba->m_xvbaBufferPool.data_buffer->buffer_size - -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer; -+ if (bytesToCopy >= freeBufferSize) -+ { -+ xvba->SetError(__FUNCTION__, "bitstream buffer too large, maybe corrupted packet", __LINE__); -+ return; -+ } -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location+startCodeSize, -+ render->buffers[j].buffer, -+ render->buffers[j].size); -+ dataControl = (XVBADataCtrl*)xvba->m_xvbaBufferPool.data_control_buffers[j]->bufferXVBA; -+ dataControl->SliceDataLocation = location; -+ dataControl->SliceBytesInBuffer = render->buffers[j].size+startCodeSize; -+ dataControl->SliceBitsInBuffer = dataControl->SliceBytesInBuffer * 8; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer += dataControl->SliceBytesInBuffer; -+ location += dataControl->SliceBytesInBuffer; -+ } -+ -+ int bufSize = xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer; -+ int padding = bufSize % 128; -+ if (padding) -+ { -+ padding = 128 - padding; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer += padding; -+ memset((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+bufSize,0,padding); -+ } -+ -+ picInput.num_of_buffers_in_list = 2; -+ for (unsigned int i = 0; i < render->num_slices; ++i) -+ { -+ list[0] = xvba->m_xvbaBufferPool.data_buffer; -+ list[0]->data_offset = 0; -+ list[1] = xvba->m_xvbaBufferPool.data_control_buffers[i]; -+ list[1]->data_size_in_buffer = sizeof(*dataControl); -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.DecodePicture(&picInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 2", __LINE__); -+ return; -+ } -+ } -+ } -+ XVBA_Decode_Picture_End_Input endInput; -+ endInput.size = sizeof(endInput); -+ endInput.session = xvba->m_xvbaConfig.xvbaSession; -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.EndDecodePicture(&endInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 3", __LINE__); -+ return; -+ } -+ } -+ -+ // decode sync and error -+ XVBA_Surface_Sync_Input syncInput; -+ XVBA_Surface_Sync_Output syncOutput; -+ syncInput.size = sizeof(syncInput); -+ syncInput.session = xvba->m_xvbaConfig.xvbaSession; -+ syncInput.surface = render->surface; -+ syncInput.query_status = XVBA_GET_SURFACE_STATUS; -+ syncOutput.size = sizeof(syncOutput); -+ int64_t start = CurrentHostCounter(); -+ while (1) -+ { -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed sync surface 1", __LINE__); -+ return; -+ } -+ } -+ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) -+ break; -+ if (CurrentHostCounter() - start > CurrentHostFrequency()) -+ { -+ xvba->SetError(__FUNCTION__, "timed out waiting for surface", __LINE__); -+ break; -+ } -+ usleep(100); -+ } -+ render->state |= FF_XVBA_STATE_DECODED; -+} -+ -+int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) -+{ -+ CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ struct pictureAge* pA = &xvba->picAge; -+ -+ pic->data[0] = -+ pic->data[1] = -+ pic->data[2] = -+ pic->data[3] = 0; -+ -+ pic->linesize[0] = -+ pic->linesize[1] = -+ pic->linesize[2] = -+ pic->linesize[3] = 0; -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ if(xvba->m_displayState != XVBA_OPEN) -+ return -1; -+ -+ if (xvba->m_xvbaConfig.xvbaSession == 0) -+ { -+ if (!xvba->CreateSession(avctx)) -+ return -1; -+ } -+ -+ xvba_render_state * render = NULL; -+ // find unused surface -+ { CSingleLock lock(xvba->m_videoSurfaceSec); -+ for(unsigned int i = 0; i < xvba->m_videoSurfaces.size(); ++i) -+ { -+ if(!(xvba->m_videoSurfaces[i]->state & (FF_XVBA_STATE_USED_FOR_REFERENCE | FF_XVBA_STATE_USED_FOR_RENDER))) -+ { -+ render = xvba->m_videoSurfaces[i]; -+ render->state = 0; -+ break; -+ } -+ } -+ } -+ -+ // create a new render state -+ if (render == NULL) -+ { -+ render = (xvba_render_state*)calloc(sizeof(xvba_render_state), 1); -+ if (render == NULL) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFGetBuffer - calloc failed"); -+ return -1; -+ } -+ render->surface = 0; -+ render->buffers_alllocated = 0; -+ CSingleLock lock(xvba->m_videoSurfaceSec); -+ xvba->m_videoSurfaces.push_back(render); -+ } -+ -+ // create a new surface -+ if (render->surface == 0) -+ { -+ XVBA_Create_Surface_Input surfaceInput; -+ XVBA_Create_Surface_Output surfaceOutput; -+ surfaceInput.size = sizeof(surfaceInput); -+ surfaceInput.surface_type = xvba->m_xvbaConfig.decoderCap.surface_type; -+ surfaceInput.width = xvba->m_xvbaConfig.surfaceWidth; -+ surfaceInput.height = xvba->m_xvbaConfig.surfaceHeight; -+ surfaceInput.session = xvba->m_xvbaConfig.xvbaSession; -+ surfaceOutput.size = sizeof(surfaceOutput); -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.CreateSurface(&surfaceInput, &surfaceOutput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to create video surface", __LINE__); -+ return -1; -+ } -+ } -+ render->surface = surfaceOutput.surface; -+ render->picture_descriptor = (XVBAPictureDescriptor *)xvba->m_xvbaBufferPool.picture_descriptor_buffer->bufferXVBA; -+ render->iq_matrix = (XVBAQuantMatrixAvc *)xvba->m_xvbaBufferPool.iq_matrix_buffer->bufferXVBA; -+ CLog::Log(LOGDEBUG, "XVBA::FFGetBuffer - created video surface"); -+ } -+ -+ if (render == NULL) -+ return -1; -+ -+ pic->data[0] = (uint8_t*)render; -+ -+ if(pic->reference) -+ { -+ pic->age = pA->ip_age[0]; -+ pA->ip_age[0]= pA->ip_age[1]+1; -+ pA->ip_age[1]= 1; -+ pA->b_age++; -+ } -+ else -+ { -+ pic->age = pA->b_age; -+ pA->ip_age[0]++; -+ pA->ip_age[1]++; -+ pA->b_age = 1; -+ } -+ pic->type= FF_BUFFER_TYPE_USER; -+ -+ render->state |= FF_XVBA_STATE_USED_FOR_REFERENCE; -+ render->state &= ~FF_XVBA_STATE_DECODED; -+ pic->reordered_opaque= avctx->reordered_opaque; -+ -+ return 0; -+} -+ -+int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) -+{ -+ int result = Check(avctx); -+ if (result) -+ return result; -+ -+ CSingleLock lock(m_decoderSection); -+ -+ if(frame) -+ { // we have a new frame from decoder -+ -+ xvba_render_state * render = (xvba_render_state*)frame->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::Decode - no render buffer"); -+ return VC_ERROR; -+ } -+ -+ // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid -+ if (!IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGWARNING, "XVBA::Decode - ignoring invalid buffer"); -+ return VC_BUFFER; -+ } -+ if (!(render->state & FF_XVBA_STATE_DECODED)) -+ { -+ CLog::Log(LOGDEBUG, "XVBA::Decode - ffmpeg failed"); -+ return VC_BUFFER; -+ } -+ -+ CSingleLock lock(m_videoSurfaceSec); -+ render->state |= FF_XVBA_STATE_USED_FOR_RENDER; -+ lock.Leave(); -+ -+ // send frame to output for processing -+ CXvbaDecodedPicture pic; -+ memset(&pic.DVDPic, 0, sizeof(pic.DVDPic)); -+ ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&pic.DVDPic); -+ pic.render = render; -+ m_bufferStats.IncDecoded(); -+ m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); -+ -+ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); -+ if (m_codecControl & DVP_FLAG_SKIP_PROC) -+ { -+ m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); -+ } -+ } -+ -+ int retval = 0; -+ uint16_t decoded, processed, render; -+ Message *msg; -+ while (m_xvbaOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::ERROR) -+ { -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ m_bufferStats.Get(decoded, processed, render); -+ -+ uint64_t startTime = CurrentHostCounter(); -+ while (!retval) -+ { -+ if (m_xvbaOutput.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ if (m_presentPicture) -+ { -+ m_presentPicture->ReturnUnused(); -+ m_presentPicture = 0; -+ } -+ -+ m_presentPicture = *(CXvbaRenderPicture**)msg->data; -+ m_presentPicture->xvba = this; -+ m_bufferStats.DecRender(); -+ m_bufferStats.Get(decoded, processed, render); -+ retval |= VC_PICTURE; -+ } -+ msg->Release(); -+ } -+ else if (m_xvbaOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::STATS) -+ { -+ m_bufferStats.Get(decoded, processed, render); -+ } -+ else -+ { -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ if ((m_codecControl & DVP_FLAG_DRAIN)) -+ { -+ if (decoded + processed + render < 2) -+ { -+ retval |= VC_BUFFER; -+ } -+ } -+ else -+ { -+ if (decoded + processed + render < 4) -+ { -+ retval |= VC_BUFFER; -+ } -+ } -+ -+ if (!retval && !m_inMsgEvent.WaitMSec(2000)) -+ break; -+ } -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (retval & VC_PICTURE) -+ { -+ m_bufferStats.SetParams(diff, m_speed); -+ if (diff*1000/CurrentHostFrequency() > 50) -+ CLog::Log(LOGDEBUG,"XVBA::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); -+ } -+ -+ if (!retval) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - timed out waiting for output message", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ -+ return retval; -+ -+} -+ -+bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+{ -+ CSingleLock lock(m_decoderSection); -+ -+ if (m_displayState != XVBA_OPEN) -+ return false; -+ -+ *picture = m_presentPicture->DVDPic; -+ picture->xvba = m_presentPicture; -+ -+ return true; -+} -+ -+void CDecoder::ReturnRenderPicture(CXvbaRenderPicture *renderPic) -+{ -+ m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); -+} -+ -+ -+//void CDecoder::CopyYV12(int index, uint8_t *dest) -+//{ -+// CSharedLock lock(m_decoderSection); -+// -+// { CSharedLock dLock(m_displaySection); -+// if(m_displayState != XVBA_OPEN) -+// return; -+// } -+// -+// if (!m_flipBuffer[index].outPic) -+// { -+// CLog::Log(LOGWARNING, "XVBA::Present: present picture is NULL"); -+// return; -+// } -+// -+// XVBA_GetSurface_Target target; -+// target.size = sizeof(target); -+// target.surfaceType = XVBA_YV12; -+// target.flag = XVBA_FRAME; -+// -+// XVBA_Get_Surface_Input input; -+// input.size = sizeof(input); -+// input.session = m_xvbaSession; -+// input.src_surface = m_flipBuffer[index].outPic->render->surface; -+// input.target_buffer = dest; -+// input.target_pitch = m_surfaceWidth; -+// input.target_width = m_surfaceWidth; -+// input.target_height = m_surfaceHeight; -+// input.target_parameter = target; -+// { CSingleLock lock(m_apiSec); -+// if (Success != g_XVBA_vtable.GetSurface(&input)) -+// { -+// CLog::Log(LOGERROR,"(XVBA::CopyYV12) failed to get surface"); -+// } -+// } -+//} -+ -+void CDecoder::Reset() -+{ -+ CSingleLock lock(m_decoderSection); -+ -+ if (!m_xvbaConfig.xvbaSession) -+ return; -+ -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - flush returned error", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ else -+ m_bufferStats.Reset(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - flush timed out", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+} -+ -+bool CDecoder::CanSkipDeint() -+{ -+ return m_bufferStats.CanSkipDeint(); -+} -+ -+void CDecoder::SetSpeed(int speed) -+{ -+ m_speed = speed; -+} -+ -+//----------------------------------------------------------------------------- -+// RenderPicture -+//----------------------------------------------------------------------------- -+ -+CXvbaRenderPicture* CXvbaRenderPicture::Acquire() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (refCount == 0) -+ xvba->Acquire(); -+ -+ refCount++; -+ return this; -+} -+ -+long CXvbaRenderPicture::Release() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ refCount--; -+ if (refCount > 0) -+ return refCount; -+ -+ lock.Leave(); -+ xvba->ReturnRenderPicture(this); -+ xvba->ReleasePicReference(); -+ -+ return refCount; -+} -+ -+void CXvbaRenderPicture::Transfer() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (valid) -+ xvbaOutput->TransferSurface(sourceIdx); -+} -+ -+void CXvbaRenderPicture::ReturnUnused() -+{ -+ { CSingleLock lock(*renderPicSection); -+ if (refCount > 0) -+ return; -+ } -+ if (xvba) -+ xvba->ReturnRenderPicture(this); -+} -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+COutput::COutput(CEvent *inMsgEvent) : -+ CThread("XVBA Output Thread"), -+ m_controlPort("OutputControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("OutputDataPort", inMsgEvent, &m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+ -+ CXvbaRenderPicture pic; -+ pic.renderPicSection = &m_bufferPool.renderPicSec; -+ pic.refCount = 0; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; i++) -+ { -+ m_bufferPool.allRenderPics.push_back(pic); -+ } -+ for (unsigned int i = 0; i < m_bufferPool.allRenderPics.size(); ++i) -+ { -+ m_bufferPool.freeRenderPics.push_back(&m_bufferPool.allRenderPics[i]); -+ } -+} -+ -+void COutput::Start() -+{ -+ Create(); -+} -+ -+COutput::~COutput() -+{ -+ Dispose(); -+ -+ m_bufferPool.freeRenderPics.clear(); -+ m_bufferPool.usedRenderPics.clear(); -+ m_bufferPool.allRenderPics.clear(); -+} -+ -+void COutput::Dispose() -+{ -+ CSingleLock lock(g_graphicsContext); -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void COutput::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnStartup: Output Thread created"); -+} -+ -+void COutput::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnExit: Output Thread terminated"); -+} -+ -+enum OUTPUT_STATES -+{ -+ O_TOP = 0, // 0 -+ O_TOP_ERROR, // 1 -+ O_TOP_UNCONFIGURED, // 2 -+ O_TOP_CONFIGURED, // 3 -+ O_TOP_CONFIGURED_WAIT_RES1, // 4 -+ O_TOP_CONFIGURED_WAIT_DEC, // 5 -+ O_TOP_CONFIGURED_STEP1, // 6 -+ O_TOP_CONFIGURED_WAIT_RES2, // 7 -+ O_TOP_CONFIGURED_STEP2, // 8 -+}; -+ -+int OUTPUT_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_WAIT_RES1 -+ 3, //TOP_CONFIGURED_WAIT_DEC -+ 3, //TOP_CONFIGURED_STEP1 -+ 3, //TOP_CONFIGURED_WAIT_RES2 -+ 3, //TOP_CONFIGURED_STEP2 -+}; -+ -+void COutput::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = OUTPUT_parentStates[state]) -+ { -+ switch (state) -+ { -+ case O_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::RETURNPIC: -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "COutput::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case O_TOP_ERROR: -+ m_extTimeout = 1000; -+ break; -+ -+ case O_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::INIT: -+ CXvbaConfig *data; -+ data = (CXvbaConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ EnsureBufferPool(); -+ if (!m_xvbaError) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ msg->Reply(COutputControlProtocol::ACC); -+ } -+ else -+ { -+ m_state = O_TOP_ERROR; -+ msg->Reply(COutputControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ Flush(); -+ PreReleaseBufferPool(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::NEWFRAME: -+ CXvbaDecodedPicture *frame; -+ frame = (CXvbaDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_decodedPics.push(*frame); -+ m_extTimeout = 0; -+ } -+ return; -+ case COutputDataProtocol::RETURNPIC: -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ m_controlPort.SendInMessage(COutputControlProtocol::STATS); -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_RES1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (!m_decodedPics.empty() && FindFreeSurface() >= 0 && !m_bufferPool.freeRenderPics.empty()) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_DEC; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ if (m_extTimeout != 0) -+ { -+ uint16_t decoded, processed, render; -+ m_config.stats->Get(decoded, processed, render); -+// CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_DEC: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (IsDecodingFinished()) -+ { -+ m_state = O_TOP_CONFIGURED_STEP1; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ m_extTimeout = 1; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_STEP1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ m_processPicture = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ InitCycle(); -+ CXvbaRenderPicture *pic; -+ pic = ProcessPicture(); -+ if (pic) -+ { -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ if (m_xvbaError) -+ { -+ m_state = O_TOP_ERROR; -+ return; -+ } -+ if (m_deinterlacing && !m_deintSkip) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_RES2; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ FiniCycle(); -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ m_extTimeout = 0; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_RES2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (FindFreeSurface() >= 0 && !m_bufferPool.freeRenderPics.empty()) -+ { -+ m_state = O_TOP_CONFIGURED_STEP2; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ if (m_extTimeout != 0) -+ { -+ uint16_t decoded, processed, render; -+ m_config.stats->Get(decoded, processed, render); -+ CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_STEP2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ CXvbaRenderPicture *pic; -+ m_deintStep = 1; -+ pic = ProcessPicture(); -+ if (pic) -+ { -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ if (m_xvbaError) -+ { -+ m_state = O_TOP_ERROR; -+ return; -+ } -+ FiniCycle(); -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "COutput::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void COutput::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = O_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = COutputControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Flush(); -+ Uninit(); -+} -+ -+bool COutput::Init() -+{ -+ if (!CreateGlxContext()) -+ return false; -+ -+ m_xvbaError = false; -+ m_processPicture.render = 0; -+ -+ return true; -+} -+ -+bool COutput::Uninit() -+{ -+ ReleaseBufferPool(); -+ DestroyGlxContext(); -+ return true; -+} -+ -+void COutput::Flush() -+{ -+ while (!m_decodedPics.empty()) -+ { -+ CXvbaDecodedPicture pic = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ -+ if (m_processPicture.render) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ m_processPicture.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ m_processPicture.render = 0; -+ } -+ -+ Message *msg; -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::NEWFRAME) -+ { -+ CXvbaDecodedPicture pic = *(CXvbaDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ else if (msg->signal == COutputDataProtocol::RETURNPIC) -+ { -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ } -+} -+ -+bool COutput::IsDecodingFinished() -+{ -+ return true; -+ -+ // check for decoding to be finished -+ CXvbaDecodedPicture decodedPic = m_decodedPics.front(); -+ -+ XVBA_Surface_Sync_Input syncInput; -+ XVBA_Surface_Sync_Output syncOutput; -+ syncInput.size = sizeof(syncInput); -+ syncInput.session = m_config.xvbaSession; -+ syncInput.surface = decodedPic.render->surface; -+ syncInput.query_status = XVBA_GET_SURFACE_STATUS; -+ syncOutput.size = sizeof(syncOutput); -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) -+ { -+ CLog::Log(LOGERROR,"XVBA - failed sync surface"); -+ m_xvbaError = true; -+ return false; -+ } -+ } -+ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) -+ return true; -+ -+ return false; -+} -+ -+void COutput::TransferSurface(uint32_t source) -+{ -+ XvbaBufferPool::GLVideoSurface *glSurface = &m_bufferPool.glSurfaces[source]; -+ -+ if (glSurface->transferred) -+ return; -+ -+ glSurface->transferred = true; -+ -+ // transfer surface -+ XVBA_Transfer_Surface_Input transInput; -+ transInput.size = sizeof(transInput); -+ transInput.session = m_config.xvbaSession; -+ transInput.src_surface = glSurface->render->surface; -+ transInput.target_surface = glSurface->glSurface; -+ transInput.flag = glSurface->field; -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.TransferSurface(&transInput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to transfer surface"); -+ m_xvbaError = true; -+ return; -+ } -+ } -+} -+ -+CXvbaRenderPicture* COutput::ProcessPicture() -+{ -+ CXvbaRenderPicture *retPic = 0; -+ -+ if (m_deintStep == 1) -+ { -+ if(m_field == XVBA_TOP_FIELD) -+ m_field = XVBA_BOTTOM_FIELD; -+ else -+ m_field = XVBA_TOP_FIELD; -+ } -+ -+ // find unused shared surface -+ unsigned int idx = FindFreeSurface(); -+ XvbaBufferPool::GLVideoSurface *glSurface = &m_bufferPool.glSurfaces[idx]; -+ glSurface->used = true; -+ glSurface->field = m_field; -+ glSurface->render = m_processPicture.render; -+ glSurface->transferred = false; -+ -+ int cmd = 0; -+ m_config.stats->GetCmd(cmd); -+ -+// if (!(cmd & DVP_FLAG_SKIP_PROC)) -+// { -+ // transfer surface -+ XVBA_Transfer_Surface_Input transInput; -+ transInput.size = sizeof(transInput); -+ transInput.session = m_config.xvbaSession; -+ transInput.src_surface = m_processPicture.render->surface; -+ transInput.target_surface = glSurface->glSurface; -+ transInput.flag = m_field; -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.TransferSurface(&transInput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to transfer surface"); -+ m_xvbaError = true; -+ return retPic; -+ } -+ } -+ -+ // make sure that transfer is completed -+// uint64_t maxTimeout = 1000000000LL; -+// GLsync ReadyFence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); -+// glClientWaitSync(ReadyFence, GL_SYNC_FLUSH_COMMANDS_BIT, maxTimeout); -+// glDeleteSync(ReadyFence); -+// glFinish();GL_SYNC_FLUSH_COMMANDS_BIT -+// } -+// else -+// { -+// CLog::Log(LOGDEBUG,"XVBA::ProcessPicture - skipped transfer surface"); -+// m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; -+// } -+ -+ // prepare render pic -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ retPic->sourceIdx = glSurface->id; -+ retPic->DVDPic = m_processPicture.DVDPic; -+ retPic->valid = true; -+ retPic->texture = glSurface->texture; -+ retPic->crop = CRect(0,0,0,0); -+ retPic->texWidth = m_config.surfaceWidth; -+ retPic->texHeight = m_config.surfaceHeight; -+ retPic->xvbaOutput = this; -+ -+ // set repeat pic for de-interlacing -+ if (m_deinterlacing) -+ { -+ if (m_deintStep == 1) -+ { -+ retPic->DVDPic.pts = DVD_NOPTS_VALUE; -+ retPic->DVDPic.dts = DVD_NOPTS_VALUE; -+ } -+ retPic->DVDPic.iRepeatPicture = 0.0; -+ } -+ -+ return retPic; -+} -+ -+void COutput::ProcessReturnPicture(CXvbaRenderPicture *pic) -+{ -+ std::deque::iterator it; -+ it = std::find(m_bufferPool.usedRenderPics.begin(), m_bufferPool.usedRenderPics.end(), pic); -+ if (it == m_bufferPool.usedRenderPics.end()) -+ { -+ CLog::Log(LOGWARNING, "COutput::ProcessReturnPicture - pic not found"); -+ return; -+ } -+ m_bufferPool.usedRenderPics.erase(it); -+ m_bufferPool.freeRenderPics.push_back(pic); -+ if (!pic->valid) -+ { -+ CLog::Log(LOGDEBUG, "COutput::%s - return of invalid render pic", __FUNCTION__); -+ return; -+ } -+ -+ if (m_config.useSharedSurfaces) -+ { -+ xvba_render_state *render = m_bufferPool.glSurfaces[pic->sourceIdx].render; -+ if (render) -+ { -+ // check if video surface if referenced by other glSurfaces -+ bool referenced(false); -+ for (unsigned int i=0; isourceIdx) -+ continue; -+ if (m_bufferPool.glSurfaces[i].render == render) -+ { -+ referenced = true; -+ break; -+ } -+ } -+ if (m_processPicture.render == render) -+ referenced = true; -+ -+ // release video surface -+ if (!referenced) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ -+ // unreference video surface -+ m_bufferPool.glSurfaces[pic->sourceIdx].render = 0; -+ } -+ m_bufferPool.glSurfaces[pic->sourceIdx].used = false; -+ return; -+ } -+} -+ -+int COutput::FindFreeSurface() -+{ -+ // find free shared surface -+ unsigned int i; -+ for (i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].used) -+ break; -+ } -+ if (i == m_bufferPool.glSurfaces.size()) -+ return -1; -+ else -+ return i; -+} -+ -+void COutput::InitCycle() -+{ -+ uint64_t latency; -+ int speed; -+ m_config.stats->GetParams(latency, speed); -+ latency = (latency*1000)/CurrentHostFrequency(); -+ -+ m_config.stats->SetCanSkipDeint(false); -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ bool interlaced = m_processPicture.DVDPic.iFlags & DVP_FLAG_INTERLACED; -+ -+ if (mode == VS_DEINTERLACEMODE_FORCE || -+ (mode == VS_DEINTERLACEMODE_AUTO && interlaced)) -+ { -+ if((method == VS_INTERLACEMETHOD_AUTO && interlaced) -+ || method == VS_INTERLACEMETHOD_XVBA) -+ { -+ m_deinterlacing = true; -+ m_deintSkip = false; -+ m_config.stats->SetCanSkipDeint(true); -+ -+ if (m_processPicture.DVDPic.iFlags & DVP_FLAG_DROPDEINT) -+ { -+ m_deintSkip = true; -+ } -+ -+ // do only half deinterlacing -+ if (speed != DVD_PLAYSPEED_NORMAL || !g_graphicsContext.IsFullScreenVideo()) -+ { -+ m_config.stats->SetCanSkipDeint(false); -+ m_deintSkip = true; -+ } -+ -+ if(m_processPicture.DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) -+ m_field = XVBA_TOP_FIELD; -+ else -+ m_field = XVBA_BOTTOM_FIELD; -+ } -+ } -+ else -+ { -+ m_deinterlacing = false; -+ m_field = XVBA_FRAME; -+ } -+ -+ m_processPicture.DVDPic.format = DVDVideoPicture::FMT_XVBA; -+ m_processPicture.DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ m_processPicture.DVDPic.iWidth = m_config.vidWidth; -+ m_processPicture.DVDPic.iHeight = m_config.vidHeight; -+ -+ m_deintStep = 0; -+} -+ -+void COutput::FiniCycle() -+{ -+// { CSingleLock lock(*m_config.videoSurfaceSec); -+// m_processPicture.render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER; -+// } -+ m_processPicture.render = 0; -+ m_config.stats->DecDecoded(); -+} -+ -+bool COutput::EnsureBufferPool() -+{ -+ if (m_config.useSharedSurfaces && m_bufferPool.glSurfaces.empty()) -+ { -+ GLenum textureTarget; -+ if (!glewIsSupported("GL_ARB_texture_non_power_of_two") && glewIsSupported("GL_ARB_texture_rectangle")) -+ { -+ textureTarget = GL_TEXTURE_RECTANGLE_ARB; -+ } -+ else -+ textureTarget = GL_TEXTURE_2D; -+ -+ // create shared surfaces -+ XvbaBufferPool::GLVideoSurface surface; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; ++i) -+ { -+ glEnable(textureTarget); -+ glGenTextures(1, &surface.texture); -+ glBindTexture(textureTarget, surface.texture); -+ glTexParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4); -+ glTexImage2D(textureTarget, 0, GL_RGBA, m_config.surfaceWidth, m_config.surfaceHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); -+ -+ XVBA_Create_GLShared_Surface_Input surfInput; -+ XVBA_Create_GLShared_Surface_Output surfOutput; -+ surfInput.size = sizeof(surfInput); -+ surfInput.session = m_config.xvbaSession; -+ surfInput.gltexture = surface.texture; -+ surfInput.glcontext = m_glContext; -+ surfOutput.size = sizeof(surfOutput); -+ surfOutput.surface = 0; -+ if (Success != g_XVBA_vtable.CreateGLSharedSurface(&surfInput, &surfOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to create shared surface"); -+ m_xvbaError = true; -+ break; -+ } -+ CLog::Log(LOGDEBUG, "XVBA::GetTexture - created shared surface"); -+ -+ surface.glSurface = surfOutput.surface; -+ surface.id = i; -+ surface.used = false; -+ surface.render = 0; -+ m_bufferPool.glSurfaces.push_back(surface); -+ } -+ glDisable(textureTarget); -+ } -+ -+ return true; -+} -+ -+void COutput::ReleaseBufferPool() -+{ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.useSharedSurfaces) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].glSurface) -+ continue; -+ g_XVBA_vtable.DestroySurface(m_bufferPool.glSurfaces[i].glSurface); -+ glDeleteTextures(1, &m_bufferPool.glSurfaces[i].texture); -+ } -+ m_bufferPool.glSurfaces.clear(); -+ } -+ // invalidate all used render pictures -+ for (unsigned int i = 0; i < m_bufferPool.usedRenderPics.size(); ++i) -+ { -+ m_bufferPool.usedRenderPics[i]->valid = false; -+ unsigned int idx = m_bufferPool.usedRenderPics[i]->sourceIdx; -+ if (m_bufferPool.glSurfaces[idx].render) -+ { -+ { CSingleLock lock(*m_config.videoSurfaceSec); -+ m_bufferPool.glSurfaces[idx].render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ m_bufferPool.glSurfaces[idx].render = 0; -+ } -+ } -+ } -+} -+ -+void COutput::PreReleaseBufferPool() -+{ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.useSharedSurfaces) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].used) -+ { -+ g_XVBA_vtable.DestroySurface(m_bufferPool.glSurfaces[i].glSurface); -+ glDeleteTextures(1, &m_bufferPool.glSurfaces[i].texture); -+ m_bufferPool.glSurfaces[i].glSurface = 0; -+ m_bufferPool.glSurfaces[i].used = true; -+ } -+ } -+ } -+} -+ -+bool COutput::CreateGlxContext() -+{ -+ GLXContext glContext; -+ Window window; -+ -+ m_Display = g_Windowing.GetDisplay(); -+ glContext = g_Windowing.GetGlxContext(); -+ m_Window = g_Windowing.GetWmWindow(); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, m_Window, &wndattribs); -+ -+ // Get visual Info -+ XVisualInfo visInfo; -+ visInfo.visualid = wndattribs.visual->visualid; -+ int nvisuals = 0; -+ XVisualInfo* visuals = XGetVisualInfo(m_Display, VisualIDMask, &visInfo, &nvisuals); -+ if (nvisuals != 1) -+ { -+ CLog::Log(LOGERROR, "XVBA::COutput::CreateGlxContext - could not find visual"); -+ return false; -+ } -+ visInfo = visuals[0]; -+ XFree(visuals); -+ -+ m_pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ 192, -+ 108, -+ visInfo.depth); -+ if (!m_pixmap) -+ { -+ CLog::Log(LOGERROR, "XVBA::COutput::CreateGlxContext - Unable to create XPixmap"); -+ return false; -+ } -+ -+ // create gl pixmap -+ m_glPixmap = glXCreateGLXPixmap(m_Display, &visInfo, m_pixmap); -+ -+ if (!m_glPixmap) -+ { -+ CLog::Log(LOGINFO, "XVBA::COutput::CreateGlxContext - Could not create glPixmap"); -+ return false; -+ } -+ -+ m_glContext = glXCreateContext(m_Display, &visInfo, glContext, True); -+ -+ if (!glXMakeCurrent(m_Display, m_glPixmap, m_glContext)) -+ { -+ CLog::Log(LOGINFO, "XVBA::COutput::CreateGlxContext - Could not make Pixmap current"); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE, "XVBA::COutput::CreateGlxContext - created context"); -+ return true; -+} -+ -+bool COutput::DestroyGlxContext() -+{ -+ if (m_glContext) -+ { -+ glXMakeCurrent(m_Display, None, NULL); -+ glXDestroyContext(m_Display, m_glContext); -+ } -+ m_glContext = 0; -+ -+ if (m_glPixmap) -+ glXDestroyPixmap(m_Display, m_glPixmap); -+ m_glPixmap = 0; -+ -+ if (m_pixmap) -+ XFreePixmap(m_Display, m_pixmap); -+ m_pixmap = 0; -+ -+ return true; -+} -+ -+#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 2012-05-14 14:15:12.137220527 +0200 -@@ -0,0 +1,386 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+#pragma once -+ -+#include "X11/Xlib.h" -+#include "amd/amdxvba.h" -+#include "DllAvCodec.h" -+#include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" -+#include "threads/Thread.h" -+#include "threads/CriticalSection.h" -+#include "threads/SharedSection.h" -+#include "threads/Event.h" -+#include "guilib/DispResource.h" -+#include "guilib/Geometry.h" -+#include "libavcodec/xvba.h" -+#include "utils/ActorProtocol.h" -+#include "settings/VideoSettings.h" -+#include -+#include -+#include -+#include -+ -+using namespace Actor; -+ -+ -+namespace XVBA -+{ -+ -+//----------------------------------------------------------------------------- -+// XVBA data structs -+//----------------------------------------------------------------------------- -+ -+class CDecoder; -+class CXVBAContext; -+class COutput; -+ -+#define NUM_RENDER_PICS 9 -+ -+/** -+ * Buffer statistics used to control number of frames in queue -+ */ -+ -+class CXvbaBufferStats -+{ -+public: -+ uint16_t decodedPics; -+ uint16_t processedPics; -+ uint16_t renderPics; -+ uint64_t latency; // time decoder has waited for a frame, ideally there is no latency -+ int playSpeed; -+ bool canSkipDeint; -+ int processCmd; -+ -+ void IncDecoded() { CSingleLock l(m_sec); decodedPics++;} -+ void DecDecoded() { CSingleLock l(m_sec); decodedPics--;} -+ void IncProcessed() { CSingleLock l(m_sec); processedPics++;} -+ void DecProcessed() { CSingleLock l(m_sec); processedPics--;} -+ void IncRender() { CSingleLock l(m_sec); renderPics++;} -+ void DecRender() { CSingleLock l(m_sec); renderPics--;} -+ void Reset() { CSingleLock l(m_sec); decodedPics=0; processedPics=0;renderPics=0;latency=0;} -+ void Get(uint16_t &decoded, uint16_t &processed, uint16_t &render) {CSingleLock l(m_sec); decoded = decodedPics, processed=processedPics, render=renderPics;} -+ void SetParams(uint64_t time, int speed) { CSingleLock l(m_sec); latency = time; playSpeed = speed; } -+ void GetParams(uint64_t &lat, int &speed) { CSingleLock l(m_sec); lat = latency; speed = playSpeed; } -+ void SetCmd(int cmd) { CSingleLock l(m_sec); processCmd = cmd; } -+ void GetCmd(int &cmd) { CSingleLock l(m_sec); cmd = processCmd; processCmd = 0; } -+ void SetCanSkipDeint(bool canSkip) { CSingleLock l(m_sec); canSkipDeint = canSkip; } -+ bool CanSkipDeint() { CSingleLock l(m_sec); if (canSkipDeint) return true; else return false;} -+private: -+ CCriticalSection m_sec; -+}; -+ -+/** -+ * CXvbaConfig holds all configuration parameters needed by vdpau -+ * The structure is sent to the internal classes CMixer and COutput -+ * for init. -+ */ -+ -+struct CXvbaConfig -+{ -+ int surfaceWidth; -+ int surfaceHeight; -+ int vidWidth; -+ int vidHeight; -+ int outWidth; -+ int outHeight; -+ bool useSharedSurfaces; -+ -+ CXVBAContext *context; -+ XVBADecodeCap decoderCap; -+ void *xvbaSession; -+ std::vector *videoSurfaces; -+ CCriticalSection *videoSurfaceSec; -+ CCriticalSection *apiSec; -+ -+ CXvbaBufferStats *stats; -+ int numRenderBuffers; -+ uint32_t maxReferences; -+}; -+ -+/** -+ * Holds a decoded frame -+ * Input to COutput for further processing -+ */ -+struct CXvbaDecodedPicture -+{ -+ DVDVideoPicture DVDPic; -+ xvba_render_state *render; -+}; -+ -+/** -+ * Ready to render textures -+ * Sent from COutput back to CDecoder -+ * Objects are referenced by DVDVideoPicture and are sent -+ * to renderer -+ */ -+class CXvbaRenderPicture -+{ -+ friend class CDecoder; -+ friend class COutput; -+public: -+ DVDVideoPicture DVDPic; -+ int texWidth, texHeight; -+ CRect crop; -+ GLuint texture; -+ uint32_t sourceIdx; -+ bool valid; -+ CDecoder *xvba; -+ CXvbaRenderPicture* Acquire(); -+ long Release(); -+ void Transfer(); -+private: -+ void ReturnUnused(); -+ int refCount; -+ CCriticalSection *renderPicSection; -+ COutput *xvbaOutput; -+}; -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+ -+/** -+ * Buffer pool holds allocated xvba and gl resources -+ * Embedded in COutput -+ */ -+struct XvbaBufferPool -+{ -+ struct GLVideoSurface -+ { -+ unsigned int id; -+ bool used; -+ bool transferred; -+ GLuint texture; -+ void *glSurface; -+ xvba_render_state *render; -+ XVBA_SURFACE_FLAG field; -+ }; -+ std::vector glSurfaces; -+ std::vector allRenderPics; -+ std::deque usedRenderPics; -+ std::deque freeRenderPics; -+ CCriticalSection renderPicSec; -+}; -+ -+class COutputControlProtocol : public Protocol -+{ -+public: -+ COutputControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT, -+ FLUSH, -+ PRECLEANUP, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ STATS, -+ }; -+}; -+ -+class COutputDataProtocol : public Protocol -+{ -+public: -+ COutputDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ NEWFRAME = 0, -+ RETURNPIC, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * COutput is embedded in CDecoder and embeds CMixer -+ * The class has its own OpenGl context which is shared with render thread -+ * COuput generated ready to render textures and passes them back to -+ * CDecoder -+ */ -+class COutput : private CThread -+{ -+public: -+ COutput(CEvent *inMsgEvent); -+ virtual ~COutput(); -+ void Start(); -+ void Dispose(); -+ void TransferSurface(uint32_t source); -+ COutputControlProtocol m_controlPort; -+ COutputDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ bool HasWork(); -+ bool IsDecodingFinished(); -+ CXvbaRenderPicture* ProcessPicture(); -+ void ProcessReturnPicture(CXvbaRenderPicture *pic); -+ int FindFreeSurface(); -+ void InitCycle(); -+ void FiniCycle(); -+ bool Init(); -+ bool Uninit(); -+ void Flush(); -+ bool CreateGlxContext(); -+ bool DestroyGlxContext(); -+ bool EnsureBufferPool(); -+ void ReleaseBufferPool(); -+ void PreReleaseBufferPool(); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_xvbaError; -+ CXvbaConfig m_config; -+ XvbaBufferPool m_bufferPool; -+ Display *m_Display; -+ Window m_Window; -+ GLXContext m_glContext; -+ GLXWindow m_glWindow; -+ Pixmap m_pixmap; -+ GLXPixmap m_glPixmap; -+ std::queue m_decodedPics; -+ CXvbaDecodedPicture m_processPicture; -+ XVBA_SURFACE_FLAG m_field; -+ bool m_deinterlacing; -+ int m_deintStep; -+ bool m_deintSkip; -+}; -+ -+//----------------------------------------------------------------------------- -+// XVBA decoder -+//----------------------------------------------------------------------------- -+ -+class CXVBAContext -+{ -+public: -+ static bool EnsureContext(CXVBAContext **ctx); -+ void *GetContext(); -+ void Release(); -+private: -+ CXVBAContext(); -+ void Close(); -+ bool LoadSymbols(); -+ bool CreateContext(); -+ void DestroyContext(); -+ static CXVBAContext *m_context; -+ static CCriticalSection m_section; -+ static Display *m_display; -+ int m_refCount; -+ static void *m_dlHandle; -+ void *m_xvbaContext; -+}; -+ -+class CDecoder : public CDVDVideoCodecFFmpeg::IHardwareDecoder, -+ public IDispResource -+{ -+ friend class CXvbaRenderPicture; -+ -+public: -+ -+ struct pictureAge -+ { -+ int b_age; -+ int ip_age[2]; -+ }; -+ -+ enum EDisplayState -+ { XVBA_OPEN -+ , XVBA_RESET -+ , XVBA_LOST -+ , XVBA_ERROR -+ }; -+ -+ CDecoder(); -+ virtual ~CDecoder(); -+ virtual void OnLostDevice(); -+ virtual void OnResetDevice(); -+ -+ virtual bool Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned int surfaces = 0); -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame); -+ virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -+ virtual void Reset(); -+ virtual void Close(); -+ virtual int Check(AVCodecContext* avctx); -+ virtual long Release(); -+ virtual const std::string Name() { return "xvba"; } -+ virtual bool CanSkipDeint(); -+ virtual void SetSpeed(int speed); -+ -+ bool Supports(EINTERLACEMETHOD method); -+ long ReleasePicReference(); -+ -+protected: -+ bool CreateSession(AVCodecContext* avctx); -+ void DestroySession(); -+ bool EnsureDataControlBuffers(unsigned int num); -+ void ResetState(); -+ void SetError(const char* function, const char* msg, int line); -+ bool IsSurfaceValid(xvba_render_state *render); -+ void ReturnRenderPicture(CXvbaRenderPicture *renderPic); -+ -+ // callbacks for ffmpeg -+ static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -+ static void FFDrawSlice(struct AVCodecContext *avctx, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height); -+ static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); -+ -+ DllAvUtil m_dllAvUtil; -+ CCriticalSection m_decoderSection; -+ CEvent m_displayEvent; -+ EDisplayState m_displayState; -+ CXvbaConfig m_xvbaConfig; -+ std::vector m_videoSurfaces; -+ CCriticalSection m_apiSec, m_videoSurfaceSec; -+ ThreadIdentifier m_decoderThread; -+ -+ unsigned int m_decoderId; -+ struct XVBABufferPool -+ { -+ XVBABufferDescriptor *picture_descriptor_buffer; -+ XVBABufferDescriptor *iq_matrix_buffer; -+ XVBABufferDescriptor *data_buffer; -+ std::vector data_control_buffers; -+ }; -+ XVBABufferPool m_xvbaBufferPool; -+ -+ pictureAge picAge; -+ -+ COutput m_xvbaOutput; -+ CXvbaBufferStats m_bufferStats; -+ CEvent m_inMsgEvent; -+ CXvbaRenderPicture *m_presentPicture; -+ -+ int m_speed; -+ int m_codecControl; -+}; -+ -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-05-14 14:11:52.793931617 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-05-14 14:35:25.789526441 +0200 -@@ -19,7 +19,6 @@ - * - */ - --#include "threads/SystemClock.h" - #include "system.h" - #ifndef __STDC_CONSTANT_MACROS - #define __STDC_CONSTANT_MACROS -@@ -44,6 +43,7 @@ - #include "filesystem/Directory.h" - #include "utils/log.h" - #include "threads/Thread.h" -+#include "threads/SystemClock.h" - #include "utils/TimeUtils.h" - - void CDemuxStreamAudioFFmpeg::GetStreamInfo(std::string& strInfo) -@@ -154,16 +154,12 @@ - ++it; - } - --#ifdef _MSC_VER --static __declspec(thread) CDVDDemuxFFmpeg* g_demuxer = 0; --#else --static TLS g_tls; --#define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) --#endif -+static XbmcThreads::ThreadLocal g_demuxer; - - static int interrupt_cb(void* unused) - { -- if(g_demuxer && g_demuxer->Aborted()) -+ CDVDDemuxFFmpeg* demuxer = g_demuxer.get(); -+ if(demuxer && demuxer->Aborted()) - return 1; - return 0; - } -@@ -235,7 +231,7 @@ - std::string strFile; - m_iCurrentPts = DVD_NOPTS_VALUE; - m_speed = DVD_PLAYSPEED_NORMAL; -- g_demuxer = this; -+ g_demuxer.set(this); - m_program = UINT_MAX; - const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; - -@@ -499,7 +495,7 @@ - - void CDVDDemuxFFmpeg::Dispose() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if (m_pFormatContext) - { -@@ -540,7 +536,7 @@ - - void CDVDDemuxFFmpeg::Flush() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - // naughty usage of an internal ffmpeg function - if (m_pFormatContext) -@@ -556,7 +552,7 @@ - - void CDVDDemuxFFmpeg::SetSpeed(int iSpeed) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if(!m_pFormatContext) - return; -@@ -618,7 +614,7 @@ - - DemuxPacket* CDVDDemuxFFmpeg::Read() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - AVPacket pkt; - DemuxPacket* pPacket = NULL; -@@ -810,7 +806,7 @@ - - bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if(time < 0) - time = 0; -@@ -870,7 +866,7 @@ - - bool CDVDDemuxFFmpeg::SeekByte(__int64 pos) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - CSingleLock lock(m_critSection); - int ret = m_dllAvFormat.av_seek_frame(m_pFormatContext, -1, pos, AVSEEK_FLAG_BYTE); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-05-14 14:15:12.140220588 +0200 -@@ -21,6 +21,7 @@ - - #include "DVDPerformanceCounter.h" - #include "DVDMessageQueue.h" -+#include "utils/TimeUtils.h" - - #include "dvd_config.h" - -@@ -68,22 +69,16 @@ - - inline __int64 get_thread_cpu_usage(ProcessPerformance* p) - { -- if (p->hThread) -+ if (p->thread) - { -- FILETIME dummy; -- FILETIME current_time_thread; -- FILETIME current_time_system; - ULARGE_INTEGER old_time_thread; - ULARGE_INTEGER old_time_system; - - old_time_thread.QuadPart = p->timer_thread.QuadPart; - old_time_system.QuadPart = p->timer_system.QuadPart; - -- GetThreadTimes(p->hThread, &dummy, &dummy, ¤t_time_thread, &dummy); -- GetSystemTimeAsFileTime(¤t_time_system); -- -- FILETIME_TO_ULARGE_INTEGER(p->timer_thread, current_time_thread); -- FILETIME_TO_ULARGE_INTEGER(p->timer_system, current_time_system); -+ p->timer_thread.QuadPart = p->thread->GetAbsoluteUsage(); -+ p->timer_system.QuadPart = CurrentHostCounter(); - - __int64 threadTime = (p->timer_thread.QuadPart - old_time_thread.QuadPart); - __int64 systemTime = (p->timer_system.QuadPart - old_time_system.QuadPart); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-05-14 14:15:12.141220608 +0200 -@@ -24,7 +24,7 @@ - #define FILETIME_TO_ULARGE_INTEGER(ularge, filetime) { ularge.u.HighPart = filetime.dwHighDateTime; ularge.u.LowPart = filetime.dwLowDateTime; } - - #include "system.h" -- -+#include "threads/Thread.h" - #include "threads/SingleLock.h" - - class CDVDMessageQueue; -@@ -33,7 +33,7 @@ - { - ULARGE_INTEGER timer_thread; - ULARGE_INTEGER timer_system; -- HANDLE hThread; -+ CThread* thread; - } ProcessPerformance; - - class CDVDPerformanceCounter -@@ -45,20 +45,20 @@ - bool Initialize(); - void DeInitialize(); - -- void EnableAudioQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pAudioQueue = pQueue; } -- void DisableAudioQueue() { CSingleLock lock(m_critSection); m_pAudioQueue = NULL; } -+ void EnableAudioQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pAudioQueue = pQueue; } -+ void DisableAudioQueue() { CSingleLock lock(m_critSection); m_pAudioQueue = NULL; } - -- void EnableVideoQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pVideoQueue = pQueue; } -- void DisableVideoQueue() { CSingleLock lock(m_critSection); m_pVideoQueue = NULL; } -+ void EnableVideoQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pVideoQueue = pQueue; } -+ void DisableVideoQueue() { CSingleLock lock(m_critSection); m_pVideoQueue = NULL; } - -- void EnableVideoDecodePerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_videoDecodePerformance.hThread = hThread; } -- void DisableVideoDecodePerformance() { CSingleLock lock(m_critSection); m_videoDecodePerformance.hThread = NULL; } -+ void EnableVideoDecodePerformance(CThread *thread) { CSingleLock lock(m_critSection); m_videoDecodePerformance.thread = thread; } -+ void DisableVideoDecodePerformance() { CSingleLock lock(m_critSection); m_videoDecodePerformance.thread = NULL; } - -- void EnableAudioDecodePerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_audioDecodePerformance.hThread = hThread; } -- void DisableAudioDecodePerformance() { CSingleLock lock(m_critSection); m_audioDecodePerformance.hThread = NULL; } -+ void EnableAudioDecodePerformance(CThread *thread) { CSingleLock lock(m_critSection); m_audioDecodePerformance.thread = thread; } -+ void DisableAudioDecodePerformance() { CSingleLock lock(m_critSection); m_audioDecodePerformance.thread = NULL; } - -- void EnableMainPerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_mainPerformance.hThread = hThread; } -- void DisableMainPerformance() { CSingleLock lock(m_critSection); m_mainPerformance.hThread = NULL; } -+ void EnableMainPerformance(CThread *thread) { CSingleLock lock(m_critSection); m_mainPerformance.thread = thread; } -+ void DisableMainPerformance() { CSingleLock lock(m_critSection); m_mainPerformance.thread = NULL; } - - CDVDMessageQueue* m_pAudioQueue; - CDVDMessageQueue* m_pVideoQueue; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-05-14 14:15:12.142220628 +0200 -@@ -518,7 +518,7 @@ - m_decode.msg = NULL; - m_decode.Release(); - -- g_dvdPerformanceCounter.EnableAudioDecodePerformance(ThreadHandle()); -+ g_dvdPerformanceCounter.EnableAudioDecodePerformance(this); - - #ifdef _WIN32 - CoInitializeEx(NULL, COINIT_MULTITHREADED); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-05-14 14:15:12.145220688 +0200 -@@ -348,7 +348,7 @@ - - // if playing a file close it first - // this has to be changed so we won't have to close it. -- if(ThreadHandle()) -+ if(IsRunning()) - CloseFile(); - - m_bAbortRequest = false; -@@ -366,7 +366,7 @@ - m_ready.Reset(); - - #if defined(HAS_VIDEO_PLAYBACK) -- g_renderManager.PreInit(); -+ g_renderManager.PreInit(&m_clock); - #endif - - Create(); -@@ -440,9 +440,8 @@ - - m_messenger.Init(); - -- g_dvdPerformanceCounter.EnableMainPerformance(ThreadHandle()); -- - CUtil::ClearTempFonts(); -+ g_dvdPerformanceCounter.EnableMainPerformance(this); - } - - bool CDVDPlayer::OpenInputStream() -@@ -1585,7 +1584,7 @@ - - } - else if (m_CurrentVideo.id >= 0 -- && m_CurrentVideo.inited == true -+ && (m_CurrentVideo.inited == true || GetPlaySpeed() < 0) - && m_SpeedState.lastpts != m_dvdPlayerVideo.GetCurrentPts() - && m_SpeedState.lasttime != GetTime()) - { -@@ -2262,6 +2261,11 @@ - if (speed != DVD_PLAYSPEED_PAUSE && m_playSpeed != DVD_PLAYSPEED_PAUSE && speed != m_playSpeed) - m_callback.OnPlayBackSpeedChanged(speed / DVD_PLAYSPEED_NORMAL); - -+ if (m_playSpeed < 0 && speed >= 0) -+ { -+ m_messenger.Put(new CDVDMsgPlayerSeek(GetTime(), true, true, true)); -+ } -+ - // if playspeed is different then DVD_PLAYSPEED_NORMAL or DVD_PLAYSPEED_PAUSE - // audioplayer, stops outputing audio to audiorendere, but still tries to - // sleep an correct amount for each packet -@@ -2278,6 +2282,7 @@ - // until our buffers are somewhat filled - if(m_pDemuxer) - m_pDemuxer->SetSpeed(speed); -+ - } - else if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_SELECT_NUMBER) && m_messenger.GetPacketCount(CDVDMsg::PLAYER_CHANNEL_SELECT_NUMBER) == 0) - { -@@ -2897,7 +2902,7 @@ - m_dvdPlayerAudio.SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); - - /* audio normally won't consume full cpu, so let it have prio */ -- m_dvdPlayerAudio.SetPriority(GetThreadPriority(*this)+1); -+ m_dvdPlayerAudio.SetPriority(GetPriority()+1); - - return true; - } -@@ -2962,11 +2967,11 @@ - // the CoreAudio audio device handler thread. We do the same for - // the DVDPlayerVideo thread so it can run to sleep without getting - // swapped out by a busy OS. -- m_dvdPlayerVideo.SetPrioritySched_RR(); -+ m_dvdPlayerVideo.SetPriority(GetSchedRRPriority()); - #else - /* use same priority for video thread as demuxing thread, as */ - /* otherwise demuxer will starve if video consumes the full cpu */ -- m_dvdPlayerVideo.SetPriority(GetThreadPriority(*this)); -+ m_dvdPlayerVideo.SetPriority(GetPriority()); - #endif - return true; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-05-14 14:11:52.795931658 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-05-14 14:38:53.481710398 +0200 -@@ -189,7 +189,7 @@ - return false; - } - -- if(g_guiSettings.GetBool("videoplayer.usedisplayasclock") && g_VideoReferenceClock.ThreadHandle() == NULL) -+ if(g_guiSettings.GetBool("videoplayer.usedisplayasclock") && !g_VideoReferenceClock.IsRunning()) - { - g_VideoReferenceClock.Create(); - //we have to wait for the clock to start otherwise alsa can cause trouble -@@ -247,6 +247,7 @@ - m_stalled = m_messageQueue.GetPacketCount(CDVDMsg::DEMUXER_PACKET) == 0; - m_started = false; - m_codecname = m_pVideoCodec->GetName(); -+ g_renderManager.EnableBuffering(false); - } - - void CDVDPlayerVideo::CloseStream(bool bWaitForBuffers) -@@ -291,7 +292,7 @@ - m_iCurrentPts = DVD_NOPTS_VALUE; - m_FlipTimeStamp = m_pClock->GetAbsoluteClock(); - -- g_dvdPerformanceCounter.EnableVideoDecodePerformance(ThreadHandle()); -+ g_dvdPerformanceCounter.EnableVideoDecodePerformance(this); - } - - void CDVDPlayerVideo::Process() -@@ -311,8 +312,10 @@ - - int iDropped = 0; //frames dropped in a row - bool bRequestDrop = false; -+ int iDropDirective; - - m_videoStats.Start(); -+ m_droppingStats.Reset(); - - while (!m_bStop) - { -@@ -416,6 +419,8 @@ - picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - m_started = false; -+ m_droppingStats.Reset(); -+ g_renderManager.EnableBuffering(false); - } - else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (CDVDPlayerVideo::Flush()) - { -@@ -428,6 +433,8 @@ - //we need to recalculate the framerate - //TODO: this needs to be set on a streamchange instead - ResetFrameRateCalc(); -+ m_droppingStats.Reset(); -+ g_renderManager.EnableBuffering(false); - - m_stalled = true; - m_started = false; -@@ -445,6 +452,10 @@ - m_speed = static_cast(pMsg)->m_value; - if(m_speed == DVD_PLAYSPEED_PAUSE) - m_iNrOfPicturesNotToSkip = 0; -+ m_droppingStats.Reset(); -+// g_renderManager.EnableBuffering(m_speed == DVD_PLAYSPEED_NORMAL); -+ if (m_pVideoCodec) -+ m_pVideoCodec->SetSpeed(m_speed); - } - else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED)) - { -@@ -479,6 +490,29 @@ - m_iNrOfPicturesNotToSkip = 1; - } - -+ bRequestDrop = false; -+ iDropDirective = CalcDropRequirement(pts); -+ if (iDropDirective & EOS_VERYLATE) -+ { -+ if (m_bAllowDrop) -+ { -+ m_pullupCorrection.Flush(); -+ bRequestDrop = true; -+ } -+ } -+ int codecControl = 0; -+ if (iDropDirective & EOS_BUFFER_LEVEL) -+ { -+ if (iDropDirective & EOS_BUFFER_LEVEL) -+ codecControl |= DVP_FLAG_DRAIN; -+ } -+ m_pVideoCodec->SetCodecControl(codecControl); -+ if (iDropDirective & EOS_DROPPED) -+ { -+ m_iDroppedFrames++; -+ iDropped++; -+ } -+ - #ifdef PROFILE - bRequestDrop = false; - #else -@@ -488,6 +522,7 @@ - bRequestDrop = false; - m_iDroppedRequest = 0; - m_iLateFrames = 0; -+ m_droppingStats.m_requestOutputDrop = false; - } - #endif - -@@ -526,7 +561,7 @@ - if(m_pVideoCodec->GetConvergeCount() > 0) - { - m_packets.push_back(DVDMessageListItem(pMsg, 0)); -- if(m_packets.size() > m_pVideoCodec->GetConvergeCount() -+ if(m_packets.size() > m_pVideoCodec->GetConvergeCount() - || m_packets.size() * frametime > DVD_SEC_TO_TIME(10)) - m_packets.pop_front(); - } -@@ -536,11 +571,13 @@ - // picture from a demux packet, this should be reasonable - // for libavformat as a demuxer as it normally packetizes - // pictures when they come from demuxer -- if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) -- { -- m_iDroppedFrames++; -- iDropped++; -- } -+// if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) -+// { -+// m_iDroppedFrames++; -+// iDropped++; -+// } -+ -+ bRequestDrop = false; - - // loop while no error - while (!m_bStop) -@@ -563,6 +600,8 @@ - - m_pVideoCodec->Reset(); - m_packets.clear(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; -+ g_renderManager.DiscardBuffer(); - break; - } - -@@ -672,11 +711,15 @@ - CDVDCodecUtils::FreePicture(pTempYUVPackedPicture); - #endif - -+ if (!m_bFpsInvalid) -+ frametime = (double)DVD_TIME_BASE/m_fFrameRate; -+ - if(m_started == false) - { - m_codecname = m_pVideoCodec->GetName(); - m_started = true; - m_messageParent.Put(new CDVDMsgInt(CDVDMsg::PLAYER_STARTED, DVDPLAYER_VIDEO)); -+ g_renderManager.EnableBuffering(true); - } - - // guess next frame pts. iDuration is always valid -@@ -1039,6 +1082,10 @@ - flags |= CONF_FLAGS_FORMAT_VDPAU; - formatstr = "VDPAU"; - break; -+ case DVDVideoPicture::FMT_VDPAU_420: -+ flags |= CONF_FLAGS_FORMAT_VDPAU_420; -+ formatstr = "VDPAU_420"; -+ break; - case DVDVideoPicture::FMT_DXVA: - flags |= CONF_FLAGS_FORMAT_DXVA; - formatstr = "DXVA"; -@@ -1054,6 +1101,10 @@ - flags |= CONF_FLAGS_FORMAT_CVBREF; - formatstr = "BGRA"; - break; -+ case DVDVideoPicture::FMT_XVBA: -+ flags |= CONF_FLAGS_FORMAT_XVBA; -+ formatstr = "XVBA"; -+ break; - } - - if(m_bAllowFullscreen) -@@ -1162,50 +1213,63 @@ - m_FlipTimeStamp += max(0.0, iSleepTime); - m_FlipTimeStamp += iFrameDuration; - -- if (iSleepTime <= 0 && m_speed) -- m_iLateFrames++; -- else -- m_iLateFrames = 0; -+// if (iSleepTime <= 0 && m_speed) -+// m_iLateFrames++; -+// else -+// m_iLateFrames = 0; -+// -+// // ask decoder to drop frames next round, as we are very late -+// if(m_iLateFrames > 10) -+// { -+// if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+// { -+// //if we're calculating the framerate, -+// //don't drop frames until we've calculated a stable framerate -+// if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) -+// { -+// result |= EOS_VERYLATE; -+// m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it -+// } -+// -+// //if we requested 5 drops in a row and we're still late, drop on output -+// //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate -+// if (m_iDroppedRequest > 5) -+// { -+// m_iDroppedRequest--; //decrease so we only drop half the frames -+// return result | EOS_DROPPED; -+// } -+// m_iDroppedRequest++; -+// } -+// } -+// else -+// { -+// m_iDroppedRequest = 0; -+// } -+ -+ if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+ || (pPicture->iFlags & DVP_FLAG_DROPPED)) -+ { -+ m_droppingStats.AddOutputDropGain(pts, 1/m_fFrameRate); -+ m_droppingStats.m_requestOutputDrop = false; -+ CLog::Log(LOGDEBUG,"%s - dropped in output", __FUNCTION__); -+ return result | EOS_DROPPED; -+ } - -- // ask decoder to drop frames next round, as we are very late -- if(m_iLateFrames > 10) -+ if( m_speed < 0 ) - { -- if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+ double decoderPts = m_droppingStats.m_lastDecoderPts; -+ double renderPts = m_droppingStats.m_lastRenderPts; -+ if (pts > renderPts) - { -- //if we're calculating the framerate, -- //don't drop frames until we've calculated a stable framerate -- if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) -+ if (decoderPts >= renderPts) - { -- result |= EOS_VERYLATE; -- m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it -+ Sleep(200); - } -- -- //if we requested 5 drops in a row and we're still late, drop on output -- //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate -- if (m_iDroppedRequest > 5) -- { -- m_iDroppedRequest--; //decrease so we only drop half the frames -- return result | EOS_DROPPED; -- } -- m_iDroppedRequest++; -- } -- } -- else -- { -- m_iDroppedRequest = 0; -- } -- -- if( m_speed < 0 ) -- { -- if( iClockSleep < -DVD_MSEC_TO_TIME(200) -- && !(pPicture->iFlags & DVP_FLAG_NOSKIP) ) - return result | EOS_DROPPED; -+ } - } - -- if( (pPicture->iFlags & DVP_FLAG_DROPPED) ) -- return result | EOS_DROPPED; -- -- if( m_speed != DVD_PLAYSPEED_NORMAL && limited ) -+ if( m_speed != DVD_PLAYSPEED_NORMAL && m_speed >= 0 && limited ) - { - // calculate frame dropping pattern to render at this speed - // we do that by deciding if this or next frame is closest -@@ -1241,6 +1305,16 @@ - mDisplayField = FS_BOT; - } - -+ int buffer = g_renderManager.WaitForBuffer(m_bStop); -+ while (buffer < 0 && !CThread::m_bStop && -+ CDVDClock::GetAbsoluteClock(false) < iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500) ) -+ { -+ Sleep(1); -+ buffer = g_renderManager.WaitForBuffer(m_bStop); -+ } -+ if (buffer < 0) -+ return EOS_DROPPED; -+ - ProcessOverlays(pPicture, pts); - AutoCrop(pPicture); - -@@ -1257,7 +1331,7 @@ - if (index < 0) - return EOS_DROPPED; - -- g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, mDisplayField); -+ g_renderManager.FlipPage(CThread::m_bStop, pts, -1, mDisplayField, m_speed); - - return result; - #else -@@ -1271,7 +1345,8 @@ - if ((pPicture->format == DVDVideoPicture::FMT_YUV420P) || - (pPicture->format == DVDVideoPicture::FMT_NV12) || - (pPicture->format == DVDVideoPicture::FMT_YUY2) || -- (pPicture->format == DVDVideoPicture::FMT_UYVY)) -+ (pPicture->format == DVDVideoPicture::FMT_UYVY) || -+ (pPicture->format == DVDVideoPicture::FMT_VDPAU_420)) - { - RECT crop; - -@@ -1500,7 +1575,7 @@ - double frameduration = m_pullupCorrection.GetFrameDuration(); - - if (frameduration == DVD_NOPTS_VALUE || -- (g_advancedSettings.m_videoFpsDetect == 1 && m_pullupCorrection.GetPatternLength() > 1)) -+ (g_advancedSettings.m_videoFpsDetect == 1 && (m_pullupCorrection.GetPatternLength() > 1 && !m_bFpsInvalid))) - { - //reset the stored framerates if no good framerate was detected - m_fStableFrameRate = 0.0; -@@ -1556,3 +1631,142 @@ - m_iFrameRateCount = 0; - } - } -+ -+int CDVDPlayerVideo::CalcDropRequirement(double pts) -+{ -+ int result = 0; -+ double iSleepTime; -+ double iDecoderPts, iRenderPts; -+ double iInterval; -+ int interlaced; -+ double iGain; -+ double iLateness; -+ bool bNewFrame; -+ int iSkippedDeint = 0; -+ int iBufferLevel; -+ -+ // get decoder stats -+ if (!m_pVideoCodec->GetPts(iDecoderPts, iSkippedDeint, interlaced)) -+ iDecoderPts = pts; -+ -+ // get render stats -+ g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); -+ -+ if (iBufferLevel < 2) -+ { -+ result |= EOS_BUFFER_LEVEL; -+ if (iBufferLevel < 1) -+ CLog::Log(LOGDEBUG,"--------------------- hurry: %d", iBufferLevel); -+ } -+ -+ bNewFrame = iDecoderPts != m_droppingStats.m_lastDecoderPts; -+ -+ if (interlaced) -+ iInterval = 2/m_fFrameRate*(double)DVD_TIME_BASE; -+ else -+ iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; -+ -+ // add any gains regardless of being late -+ if (m_droppingStats.m_lastDecoderPts > 0 -+ && bNewFrame -+ && m_bAllowDrop -+ && m_droppingStats.m_dropRequests > 0) -+ { -+ iGain = (iDecoderPts - m_droppingStats.m_lastDecoderPts - iInterval)/(double)DVD_TIME_BASE; -+ if (iSkippedDeint) -+ { -+ CDroppingStats::CGain gain; -+ gain.gain = 1/m_fFrameRate; -+ gain.pts = iDecoderPts; -+ m_droppingStats.m_gain.push_back(gain); -+ m_droppingStats.m_totalGain += gain.gain; -+ result |= EOS_DROPPED; -+ m_droppingStats.m_dropRequests = 0; -+ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - dropped de-interlacing cycle, Sleeptime: %f, Bufferlevel: %d", iSleepTime, iBufferLevel); -+ } -+ else if (iGain > 1/m_fFrameRate) -+ { -+ CDroppingStats::CGain gain; -+ gain.gain = iGain; -+ gain.pts = iDecoderPts; -+ m_droppingStats.m_gain.push_back(gain); -+ m_droppingStats.m_totalGain += iGain; -+ result |= EOS_DROPPED; -+ m_droppingStats.m_dropRequests = 0; -+ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - dropped in decoder, Sleeptime: %f, Bufferlevel: %d, Gain: %f", iSleepTime, iBufferLevel, iGain); -+ } -+ -+ } -+ m_droppingStats.m_lastDecoderPts = iDecoderPts; -+ -+ // subtract gains -+ while (!m_droppingStats.m_gain.empty() && -+ iRenderPts >= m_droppingStats.m_gain.front().pts) -+ { -+ m_droppingStats.m_totalGain -= m_droppingStats.m_gain.front().gain; -+ m_droppingStats.m_gain.pop_front(); -+ } -+ -+// if (iSleepTime < 0) -+// { -+// CLog::Log(LOGNOTICE,"----- sleep: %f, gain :%f", -+// iSleepTime, m_droppingStats.m_totalGain); -+// } -+ -+ // calculate lateness -+ iLateness = iSleepTime + m_droppingStats.m_totalGain; -+ if (iLateness < 0 && m_speed) -+ { -+ if (bNewFrame) -+ m_droppingStats.m_lateFrames++; -+ -+ // if lateness is smaller than frametime, we observe this state -+ // for 10 cycles -+ if (m_droppingStats.m_lateFrames > 10 || iLateness < -2/m_fFrameRate) -+ { -+ // is frame allowed to skip -+ if (m_iNrOfPicturesNotToSkip <= 0) -+ { -+ result |= EOS_VERYLATE; -+ -+ // drop in output -+ if (m_droppingStats.m_dropRequests > 7 && g_graphicsContext.IsFullScreenVideo()) -+ { -+ m_droppingStats.m_dropRequests--; //decrease so we only drop half the frames -+ m_droppingStats.m_requestOutputDrop = true; -+ CLog::Log(LOGNOTICE,"-------- drop output"); -+ } -+ else if (bNewFrame) -+ m_droppingStats.m_dropRequests++; -+ } -+ } -+ } -+ else -+ { -+ m_droppingStats.m_dropRequests = 0; -+ m_droppingStats.m_lateFrames = 0; -+ m_droppingStats.m_requestOutputDrop = false; -+ } -+ m_droppingStats.m_lastRenderPts = iRenderPts; -+ return result; -+} -+ -+void CDroppingStats::Reset() -+{ -+ m_gain.clear(); -+ m_totalGain = 0; -+ m_lastDecoderPts = 0; -+ m_lastRenderPts = 0; -+ m_lateFrames = 0; -+ m_dropRequests = 0; -+ m_requestOutputDrop = false; -+} -+ -+void CDroppingStats::AddOutputDropGain(double pts, double frametime) -+{ -+ CDroppingStats::CGain gain; -+ gain.gain = frametime; -+ gain.pts = pts; -+ m_gain.push_back(gain); -+ m_totalGain += frametime; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.h 2012-05-14 14:15:12.150220789 +0200 -@@ -38,6 +38,26 @@ - - #define VIDEO_PICTURE_QUEUE_SIZE 1 - -+class CDroppingStats -+{ -+public: -+ void Reset(); -+ void AddOutputDropGain(double pts, double frametime); -+ struct CGain -+ { -+ double gain; -+ double pts; -+ }; -+ std::deque m_gain; -+ double m_totalGain; -+ double m_lastDecoderPts; -+ double m_lastRenderPts; -+ unsigned int m_lateFrames; -+ unsigned int m_dropRequests; -+ bool m_requestOutputDrop; -+}; -+ -+ - class CDVDPlayerVideo : public CThread - { - public: -@@ -111,6 +131,7 @@ - #define EOS_ABORT 1 - #define EOS_DROPPED 2 - #define EOS_VERYLATE 4 -+#define EOS_BUFFER_LEVEL 8 - - void AutoCrop(DVDVideoPicture* pPicture); - void AutoCrop(DVDVideoPicture *pPicture, RECT &crop); -@@ -130,9 +151,11 @@ - int m_iLateFrames; - int m_iDroppedFrames; - int m_iDroppedRequest; -+ double m_iLastSleepTime; - - void ResetFrameRateCalc(); - void CalcFrameRate(); -+ int CalcDropRequirement(double pts); - - double m_fFrameRate; //framerate of the video currently playing - bool m_bCalcFrameRate; //if we should calculate the framerate from the timestamps -@@ -193,5 +216,7 @@ - CPullupCorrection m_pullupCorrection; - - std::list m_packets; -+ -+ CDroppingStats m_droppingStats; - }; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/paplayer/PAPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/paplayer/PAPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/paplayer/PAPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/paplayer/PAPlayer.cpp 2012-05-14 14:15:12.151220809 +0200 -@@ -52,7 +52,7 @@ - // Supporting all open audio codec standards. - // First one being nullsoft's nsv audio decoder format - --PAPlayer::PAPlayer(IPlayerCallback& callback) : IPlayer(callback) -+PAPlayer::PAPlayer(IPlayerCallback& callback) : CThread("PAPlayer"), IPlayer(callback) - { - m_bIsPlaying = false; - m_bPaused = false; -@@ -168,7 +168,7 @@ - - *m_currentFile = file; - -- if (ThreadHandle() == NULL) -+ if (!IsRunning()) - Create(); - - m_startEvent.Set(); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-05-14 14:15:12.155220890 +0200 -@@ -61,6 +61,9 @@ - VA_MICRO_VERSION == 0 && VA_SDS_VERSION < 5))) - - #endif -+#ifdef HAVE_LIBXVBA -+#include "cores/dvdplayer/DVDCodecs/Video/XVBA.h" -+#endif - - #ifdef HAS_GLX - #include -@@ -121,6 +124,9 @@ - #ifdef HAVE_LIBVDPAU - vdpau = NULL; - #endif -+#ifdef HAVE_LIBXVBA -+ xvba = NULL; -+#endif - } - - CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() -@@ -224,7 +230,7 @@ - - void CLinuxRendererGL::ManageTextures() - { -- m_NumYV12Buffers = 2; -+// m_NumYV12Buffers = NUM_BUFFERS; - //m_iYV12RenderBuffer = 0; - return; - } -@@ -241,6 +247,11 @@ - else - CLog::Log(LOGNOTICE,"Using GL_TEXTURE_2D"); - -+ // function pointer for texture might change in -+ // call to LoadShaders -+ for (int i = 0 ; i < m_NumYV12Buffers ; i++) -+ (this->*m_textureDelete)(i); -+ - // create the yuv textures - LoadShaders(); - -@@ -567,6 +578,18 @@ - - glFinish(); - m_bValidated = false; -+ m_iYV12RenderBuffer = 0; -+} -+ -+void CLinuxRendererGL::ReleaseBuffer(int idx) -+{ -+ YUVBUFFER &buf = m_buffers[idx]; -+#ifdef HAVE_LIBVDPAU -+ SAFE_RELEASE(buf.vdpau); -+#endif -+#ifdef HAVE_LIBXVBA -+ SAFE_RELEASE(buf.xvba); -+#endif - } - - void CLinuxRendererGL::Update(bool bPauseDrawing) -@@ -640,6 +663,18 @@ - - glDisable(GL_POLYGON_STIPPLE); - } -+ else if( CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420 -+ && !(flags & (RENDER_FLAG_TOP | RENDER_FLAG_BOT))) -+ { -+ glDisable(GL_BLEND); -+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); -+ Render(flags | RENDER_FLAG_TOP, index); -+ -+ glEnable(GL_BLEND); -+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -+ glColor4f(1.0f, 1.0f, 1.0f, 128 / 255.0f); -+ Render(flags | RENDER_FLAG_BOT , index); -+ } - else - Render(flags, index); - -@@ -718,11 +753,6 @@ - - m_buffers[m_iYV12RenderBuffer].flipindex = ++m_flipindex; - --#ifdef HAVE_LIBVDPAU -- if((m_renderMethod & RENDER_VDPAU) && m_buffers[m_iYV12RenderBuffer].vdpau) -- m_buffers[m_iYV12RenderBuffer].vdpau->Present(); --#endif -- - return; - } - -@@ -737,7 +767,6 @@ - m_resolution = RES_DESKTOP; - - m_iYV12RenderBuffer = 0; -- m_NumYV12Buffers = 2; - - // setup the background colour - m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff; -@@ -817,7 +846,7 @@ - case VS_SCALINGMETHOD_LINEAR: - SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR); - m_renderQuality = RQ_SINGLEPASS; -- if (((m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) && m_nonLinStretch) -+ if (((m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || (m_renderMethod & RENDER_XVBA)) && m_nonLinStretch) - { - m_pVideoFilterShader = new StretchFilterShader(); - if (!m_pVideoFilterShader->CompileAndLink()) -@@ -898,6 +927,11 @@ - CLog::Log(LOGNOTICE, "GL: Using VAAPI render method"); - m_renderMethod = RENDER_VAAPI; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA) -+ { -+ CLog::Log(LOGNOTICE, "GL: Using XVBA render method"); -+ m_renderMethod = RENDER_XVBA; -+ } - else - { - int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod"); -@@ -1026,12 +1060,24 @@ - m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture; - m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420) -+ { -+ m_textureUpload = &CLinuxRendererGL::UploadVDPAUTexture420; -+ m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture420; -+ m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture420; -+ } - else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VAAPI) - { - m_textureUpload = &CLinuxRendererGL::UploadVAAPITexture; - m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture; - m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA) -+ { -+ m_textureUpload = &CLinuxRendererGL::UploadXVBATexture; -+ m_textureCreate = &CLinuxRendererGL::CreateXVBATexture; -+ m_textureDelete = &CLinuxRendererGL::DeleteXVBATexture; -+ } - else - { - // setup default YV12 texture handlers -@@ -1132,6 +1178,13 @@ - RenderVAAPI(renderBuffer, m_currentField); - } - #endif -+#ifdef HAVE_LIBXVBA -+ else if (m_renderMethod & RENDER_XVBA) -+ { -+ UpdateVideoFilter(); -+ RenderXVBA(renderBuffer, m_currentField); -+ } -+#endif - else - { - RenderSoftware(renderBuffer, m_currentField); -@@ -1434,17 +1487,12 @@ - void CLinuxRendererGL::RenderVDPAU(int index, int field) - { - #ifdef HAVE_LIBVDPAU -- YUVPLANE &plane = m_buffers[index].fields[field][0]; -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- -- if (!vdpau) -- return; -+ YUVPLANE &plane = m_buffers[index].fields[0][1]; - - glEnable(m_textureTarget); - glActiveTextureARB(GL_TEXTURE0); -- glBindTexture(m_textureTarget, plane.id); - -- vdpau->BindPixmap(); -+ glBindTexture(m_textureTarget, plane.id); - - // Try some clamping or wrapping - glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -@@ -1502,8 +1550,6 @@ - if (m_pVideoFilterShader) - m_pVideoFilterShader->Disable(); - -- vdpau->ReleasePixmap(); -- - glBindTexture (m_textureTarget, 0); - glDisable(m_textureTarget); - #endif -@@ -1598,6 +1644,77 @@ - #endif - } - -+void CLinuxRendererGL::RenderXVBA(int index, int field) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[0][1]; -+ -+ glEnable(m_textureTarget); -+ glActiveTextureARB(GL_TEXTURE0); -+ -+ glBindTexture(m_textureTarget, plane.id); -+ -+ // Try some clamping or wrapping -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ -+ if (m_pVideoFilterShader) -+ { -+ GLint filter; -+ if (!m_pVideoFilterShader->GetTextureFilter(filter)) -+ filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR; -+ -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, filter); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, filter); -+ m_pVideoFilterShader->SetSourceTexture(0); -+ m_pVideoFilterShader->SetWidth(m_sourceWidth); -+ m_pVideoFilterShader->SetHeight(m_sourceHeight); -+ -+ //disable non-linear stretch when a dvd menu is shown, parts of the menu are rendered through the overlay renderer -+ //having non-linear stretch on breaks the alignment -+ if (g_application.m_pPlayer && g_application.m_pPlayer->IsInMenu()) -+ m_pVideoFilterShader->SetNonLinStretch(1.0); -+ else -+ m_pVideoFilterShader->SetNonLinStretch(pow(g_settings.m_fPixelRatio, g_advancedSettings.m_videoNonLinStretchRatio)); -+ -+ m_pVideoFilterShader->Enable(); -+ } -+ else -+ { -+ GLint filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR; -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, filter); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, filter); -+ } -+ -+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); -+ VerifyGLState(); -+ -+ glBegin(GL_QUADS); -+ if (m_textureTarget==GL_TEXTURE_2D) -+ { -+ glTexCoord2f(plane.rect.x1, plane.rect.y1); glVertex2f(m_destRect.x1, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y1); glVertex2f(m_destRect.x2, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y2); glVertex2f(m_destRect.x2, m_destRect.y2); -+ glTexCoord2f(plane.rect.x1, plane.rect.y2); glVertex2f(m_destRect.x1, m_destRect.y2); -+ } -+ else -+ { -+ glTexCoord2f(m_destRect.x1, m_destRect.y1); glVertex4f(m_destRect.x1, m_destRect.y1, 0.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y1); glVertex4f(m_destRect.x2, m_destRect.y1, 1.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y2); glVertex4f(m_destRect.x2, m_destRect.y2, 1.0f, 1.0f); -+ glTexCoord2f(m_destRect.x1, m_destRect.y2); glVertex4f(m_destRect.x1, m_destRect.y2, 0.0f, 1.0f); -+ } -+ glEnd(); -+ VerifyGLState(); -+ -+ if (m_pVideoFilterShader) -+ m_pVideoFilterShader->Disable(); -+ -+ glBindTexture (m_textureTarget, 0); -+ glDisable(m_textureTarget); -+#endif -+} -+ - void CLinuxRendererGL::RenderSoftware(int index, int field) - { - YUVPLANES &planes = m_buffers[index].fields[field]; -@@ -2162,12 +2279,14 @@ - { - #ifdef HAVE_LIBVDPAU - YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; - - SAFE_RELEASE(m_buffers[index].vdpau); - - if(plane.id && glIsTexture(plane.id)) - glDeleteTextures(1, &plane.id); - plane.id = 0; -+ fields[0][1].id = 0; - #endif - } - -@@ -2201,8 +2320,156 @@ - void CLinuxRendererGL::UploadVDPAUTexture(int index) - { - #ifdef HAVE_LIBVDPAU -+ VDPAU::CVdpauRenderPicture *vdpau = m_buffers[index].vdpau; -+ -+ unsigned int flipindex = m_buffers[index].flipindex; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ if (!vdpau) -+ { -+ fields[0][1].id = plane.id; -+ m_eventTexturesDone[index]->Set(); -+ CLog::Log(LOGWARNING,"--------- no vdpau texture, index: %d", index); -+ return; -+ } -+ -+// CLog::Log(LOGNOTICE,"-------- rendered output surf: %d", vdpau->sourceIdx); -+// CLog::Log(LOGNOTICE,"-------- pts: %f", vdpau->DVDPic.pts); -+ fields[0][1].id = vdpau->texture[0]; -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+} -+ -+void CLinuxRendererGL::DeleteVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ -+ SAFE_RELEASE(m_buffers[index].vdpau); -+ -+ if(plane.id && glIsTexture(plane.id)) -+ glDeleteTextures(1, &plane.id); -+ plane.id = 0; -+ fields[1][0].id = 0; -+ fields[1][1].id = 0; -+ fields[2][0].id = 0; -+ fields[2][1].id = 0; -+ -+#endif -+} -+ -+bool CLinuxRendererGL::CreateVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ YV12Image &im = m_buffers[index].image; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ GLuint *pbo = m_buffers[index].pbo; -+ -+ DeleteVDPAUTexture420(index); -+ -+ memset(&im , 0, sizeof(im)); -+ memset(&fields, 0, sizeof(fields)); -+ -+ im.cshift_x = 1; -+ im.cshift_y = 1; -+ -+ im.plane[0] = NULL; -+ im.plane[1] = NULL; -+ im.plane[2] = NULL; -+ -+ for(int p = 0;p<3;p++) -+ { -+ pbo[p] = None; -+ } -+ -+ glEnable(m_textureTarget); -+ glGenTextures(1, &plane.id); -+ glDisable(m_textureTarget); -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ VDPAU::CVdpauRenderPicture *vdpau = m_buffers[index].vdpau; -+ YV12Image &im = m_buffers[index].image; -+ -+ unsigned int flipindex = m_buffers[index].flipindex; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ if (!vdpau) -+ { -+ fields[1][0].id = plane.id; -+ fields[1][1].id = plane.id; -+ fields[2][0].id = plane.id; -+ fields[2][1].id = plane.id; -+ m_eventTexturesDone[index]->Set(); -+ return; -+ } -+ -+ im.height = vdpau->texHeight; -+ im.width = vdpau->texWidth; -+ -+ // YUV -+ for (int f = FIELD_FULL; f<=FIELD_BOT ; f++) -+ { -+ int fieldshift = (f==FIELD_FULL) ? 0 : 1; -+ YUVPLANES &planes = fields[f]; -+ -+ planes[0].texwidth = im.width; -+ planes[0].texheight = im.height >> fieldshift; -+ -+ planes[1].texwidth = planes[0].texwidth >> im.cshift_x; -+ planes[1].texheight = planes[0].texheight >> im.cshift_y; -+ planes[2].texwidth = planes[1].texwidth; -+ planes[2].texheight = planes[1].texheight; -+ -+ for (int p = 0; p < 3; p++) -+ { -+ planes[p].pixpertex_x = 1; -+ planes[p].pixpertex_y = 1; -+ } -+ } -+ // crop -+// m_sourceRect.x1 += vdpau->crop.x1; -+// m_sourceRect.x2 -= vdpau->crop.x2; -+// m_sourceRect.y1 += vdpau->crop.y1; -+// m_sourceRect.y2 -= vdpau->crop.y2; -+ -+ // set textures -+ fields[1][0].id = vdpau->texture[0]; -+ fields[1][1].id = vdpau->texture[2]; -+ fields[2][0].id = vdpau->texture[1]; -+ fields[2][1].id = vdpau->texture[3]; -+ -+ glEnable(m_textureTarget); -+ for (int f = 1; f < 3; f++) -+ { -+ for (int p=0;p<2;p++) -+ { -+ glBindTexture(m_textureTarget,fields[f][p].id); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ -+ glBindTexture(m_textureTarget,0); -+ VerifyGLState(); -+ } -+ fields[f][2].id = fields[f][1].id; -+ } -+ CalculateTextureSourceRects(index, 3); -+ glDisable(m_textureTarget); -+ - m_eventTexturesDone[index]->Set(); -- glPixelStorei(GL_UNPACK_ALIGNMENT,1); //what's this for? - #endif - } - -@@ -2352,6 +2619,93 @@ - #endif - } - -+void CLinuxRendererGL::DeleteXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ -+ SAFE_RELEASE(m_buffers[index].xvba); -+ -+ if(plane.id && glIsTexture(plane.id)) -+ glDeleteTextures(1, &plane.id); -+ plane.id = 0; -+ fields[0][1].id = 0; -+#endif -+} -+ -+bool CLinuxRendererGL::CreateXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YV12Image &im = m_buffers[index].image; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ DeleteXVBATexture(index); -+ -+ memset(&im , 0, sizeof(im)); -+ memset(&fields, 0, sizeof(fields)); -+ -+ glGenTextures(1, &plane.id); -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba = m_buffers[index].xvba; -+ YV12Image &im = m_buffers[index].image; -+ -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][1]; -+ -+ if (!xvba) -+ { -+ fields[0][1].id = fields[0][0].id; -+ m_eventTexturesDone[index]->Set(); -+ CLog::Log(LOGWARNING,"CLinuxRendererGL::UploadXVBATexture no xvba texture, index: %d", index); -+ return; -+ } -+// xvba->Transfer(); -+ -+ fields[0][1].id = xvba->texture; -+ -+ im.height = xvba->texHeight; -+ im.width = xvba->texWidth; -+ -+ plane.texwidth = xvba->texWidth; -+ plane.texheight = xvba->texHeight; -+ plane.pixpertex_x = 1; -+ plane.pixpertex_y = 1; -+ -+ plane.rect = m_sourceRect; -+ plane.width = im.width; -+ plane.height = im.height; -+ -+ plane.height /= plane.pixpertex_y; -+ plane.rect.y1 /= plane.pixpertex_y; -+ plane.rect.y2 /= plane.pixpertex_y; -+ plane.width /= plane.pixpertex_x; -+ plane.rect.x1 /= plane.pixpertex_x; -+ plane.rect.x2 /= plane.pixpertex_x; -+ -+ if (m_textureTarget == GL_TEXTURE_2D) -+ { -+ plane.height /= plane.texheight; -+ plane.rect.y1 /= plane.texheight; -+ plane.rect.y2 /= plane.texheight; -+ plane.width /= plane.texwidth; -+ plane.rect.x1 /= plane.texwidth; -+ plane.rect.x2 /= plane.texwidth; -+ } -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+} -+ - void CLinuxRendererGL::UploadYUV422PackedTexture(int source) - { - YUVBUFFER& buf = m_buffers[source]; -@@ -2935,6 +3289,9 @@ - if (m_renderMethod & RENDER_VAAPI) - return false; - -+ if (m_renderMethod & RENDER_XVBA) -+ return false; -+ - return (m_renderMethod & RENDER_GLSL) - || (m_renderMethod & RENDER_ARB) - || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -2948,6 +3305,9 @@ - if (m_renderMethod & RENDER_VAAPI) - return false; - -+ if (m_renderMethod & RENDER_XVBA) -+ return false; -+ - return (m_renderMethod & RENDER_GLSL) - || (m_renderMethod & RENDER_ARB) - || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -2971,7 +3331,8 @@ - if (feature == RENDERFEATURE_NONLINSTRETCH) - { - if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) || -- (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) -+ (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || -+ (m_renderMethod & RENDER_XVBA)) - return true; - } - -@@ -2998,12 +3359,13 @@ - if(method == VS_INTERLACEMETHOD_AUTO) - return true; - -- if(m_renderMethod & RENDER_VDPAU) -+ if(m_renderMethod & RENDER_VDPAU || -+ CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420) - { - #ifdef HAVE_LIBVDPAU -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- if(vdpau) -- return vdpau->Supports(method); -+ VDPAU::CVdpauRenderPicture *vdpauPic = m_buffers[m_iYV12RenderBuffer].vdpau; -+ if(vdpauPic && vdpauPic->vdpau) -+ return vdpauPic->vdpau->Supports(method); - #endif - return false; - } -@@ -3027,6 +3389,16 @@ - return false; - } - -+ if(m_renderMethod & RENDER_XVBA) -+ { -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba = m_buffers[m_iYV12RenderBuffer].xvba; -+ if(xvba) -+ return xvba->xvba->Supports(method); -+#endif -+ return false; -+ } -+ - #ifdef TARGET_DARWIN - // YADIF too slow for HD but we have no methods to fall back - // to something that works so just turn it off. -@@ -3069,7 +3441,7 @@ - || method == VS_SCALINGMETHOD_LANCZOS3) - { - if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) || -- (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) -+ (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || (m_renderMethod & RENDER_XVBA)) - { - // spline36 and lanczos3 are only allowed through advancedsettings.xml - if(method != VS_SCALINGMETHOD_SPLINE36 -@@ -3088,9 +3460,9 @@ - if(m_renderMethod & RENDER_VDPAU) - { - #ifdef HAVE_LIBVDPAU -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- if(vdpau) -- return vdpau->AutoInterlaceMethod(); -+ VDPAU::CVdpauRenderPicture *vdpauPic = m_buffers[m_iYV12RenderBuffer].vdpau; -+ if(vdpauPic && vdpauPic->vdpau) -+ return vdpauPic->vdpau->AutoInterlaceMethod(); - #endif - return VS_INTERLACEMETHOD_NONE; - } -@@ -3136,20 +3508,31 @@ - } - - #ifdef HAVE_LIBVDPAU --void CLinuxRendererGL::AddProcessor(CVDPAU* vdpau) -+void CLinuxRendererGL::AddProcessor(VDPAU::CVdpauRenderPicture *vdpau, int index) - { -- YUVBUFFER &buf = m_buffers[NextYV12Texture()]; -+ YUVBUFFER &buf = m_buffers[index]; -+ VDPAU::CVdpauRenderPicture *pic = vdpau->Acquire(); - SAFE_RELEASE(buf.vdpau); -- buf.vdpau = (CVDPAU*)vdpau->Acquire(); -+ buf.vdpau = pic; - } - #endif - - #ifdef HAVE_LIBVA --void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder) -+void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder, int index) - { -- YUVBUFFER &buf = m_buffers[NextYV12Texture()]; -+ YUVBUFFER &buf = m_buffers[index]; - buf.vaapi.surface = holder.surface; - } - #endif - -+#ifdef HAVE_LIBXVBA -+void CLinuxRendererGL::AddProcessor(XVBA::CXvbaRenderPicture* xvba, int index) -+{ -+ YUVBUFFER &buf = m_buffers[index]; -+ XVBA::CXvbaRenderPicture *pic = xvba->Acquire(); -+ SAFE_RELEASE(buf.xvba); -+ buf.xvba = pic; -+} -+#endif -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-05-14 14:15:12.156220910 +0200 -@@ -35,13 +35,14 @@ - - class CRenderCapture; - --class CVDPAU; - class CBaseTexture; - namespace Shaders { class BaseYUV2RGBShader; } - namespace Shaders { class BaseVideoFilterShader; } - namespace VAAPI { struct CHolder; } -+namespace VDPAU { class CVdpauRenderPicture; } -+namespace XVBA { class CXvbaRenderPicture; } - --#define NUM_BUFFERS 3 -+#define NUM_BUFFERS 10 - - - #undef ALIGN -@@ -94,6 +95,7 @@ - RENDER_VDPAU=0x08, - RENDER_POT=0x10, - RENDER_VAAPI=0x20, -+ RENDER_XVBA=0x40, - }; - - enum RenderQuality -@@ -141,14 +143,19 @@ - virtual void UnInit(); - virtual void Reset(); /* resets renderer after seek for example */ - virtual void Flush(); -+ virtual void ReleaseBuffer(int idx); -+ virtual void SetProcessorSize(int numBuffers) { m_NumYV12Buffers = numBuffers; } -+ virtual unsigned int GetProcessorSize() { return m_NumYV12Buffers; } - - #ifdef HAVE_LIBVDPAU -- virtual void AddProcessor(CVDPAU* vdpau); -+ virtual void AddProcessor(VDPAU::CVdpauRenderPicture* vdpau, int index); - #endif - #ifdef HAVE_LIBVA -- virtual void AddProcessor(VAAPI::CHolder& holder); -+ virtual void AddProcessor(VAAPI::CHolder& holder, int index); -+#endif -+#ifdef HAVE_LIBXVBA -+ virtual void AddProcessor(XVBA::CXvbaRenderPicture* xvba, int index); - #endif -- - virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255); - - // Feature support -@@ -190,6 +197,10 @@ - void DeleteVDPAUTexture(int index); - bool CreateVDPAUTexture(int index); - -+ void UploadVDPAUTexture420(int index); -+ void DeleteVDPAUTexture420(int index); -+ bool CreateVDPAUTexture420(int index); -+ - void UploadVAAPITexture(int index); - void DeleteVAAPITexture(int index); - bool CreateVAAPITexture(int index); -@@ -198,6 +209,10 @@ - void DeleteYUV422PackedTexture(int index); - bool CreateYUV422PackedTexture(int index); - -+ void UploadXVBATexture(int index); -+ void DeleteXVBATexture(int index); -+ bool CreateXVBATexture(int index); -+ - void UploadRGBTexture(int index); - void ToRGBFrame(YV12Image* im, unsigned flipIndexPlane, unsigned flipIndexBuf); - void ToRGBFields(YV12Image* im, unsigned flipIndexPlaneTop, unsigned flipIndexPlaneBot, unsigned flipIndexBuf); -@@ -210,7 +225,9 @@ - void RenderSinglePass(int renderBuffer, int field); // single pass glsl renderer - void RenderSoftware(int renderBuffer, int field); // single pass s/w yuv2rgb renderer - void RenderVDPAU(int renderBuffer, int field); // render using vdpau hardware -+ void RenderVDPAUYV12(int renderBuffer, int field); // render using vdpau hardware - void RenderVAAPI(int renderBuffer, int field); // render using vdpau hardware -+ void RenderXVBA(int renderBuffer, int field); // render using xvba hardware - - CFrameBufferObject m_fbo; - -@@ -265,11 +282,14 @@ - GLuint pbo[MAX_PLANES]; - - #ifdef HAVE_LIBVDPAU -- CVDPAU* vdpau; -+ VDPAU::CVdpauRenderPicture *vdpau; - #endif - #ifdef HAVE_LIBVA - VAAPI::CHolder& vaapi; - #endif -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba; -+#endif - }; - - typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.cpp 2012-05-14 14:15:12.157220930 +0200 -@@ -89,7 +89,7 @@ - CRenderer::CRenderer() - { - m_render = 0; -- m_decode = (m_render + 1) % 2; -+// m_decode = (m_render + 1) % 2; - } - - CRenderer::~CRenderer() -@@ -154,9 +154,10 @@ - { - CSingleLock lock(m_section); - -- for(int i = 0; i < 2; i++) -+ for(int i = 0; i < m_iNumBuffers; i++) - Release(m_buffers[i]); - -+ m_render = 0; - Release(m_cleanup); - } - -@@ -164,10 +165,23 @@ - { - CSingleLock lock(m_section); - -- m_render = m_decode; -- m_decode =(m_decode + 1) % 2; -+// m_render = m_decode; -+ m_render = (m_render + 1) % m_iNumBuffers; -+ -+// Release(m_buffers[m_decode]); -+} -+ -+void CRenderer::SetBuffer(int idx) -+{ -+ CSingleLock lock(m_section); -+ Release(m_buffers[idx]); -+ m_decode = idx; -+} - -- Release(m_buffers[m_decode]); -+void CRenderer::ReleaseBuffer(int idx) -+{ -+ CSingleLock lock(m_section); -+ Release(m_buffers[idx]); - } - - void CRenderer::Render() -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.h 2012-05-14 14:15:12.157220930 +0200 -@@ -99,6 +99,9 @@ - void Flip(); - void Render(); - void Flush(); -+ void SetNumBuffers(int numBuffers) { m_iNumBuffers = numBuffers; } -+ void SetBuffer(int idx); -+ void ReleaseBuffer(int idx); - - protected: - -@@ -124,7 +127,8 @@ - void Release(SElementV& list); - - CCriticalSection m_section; -- SElementV m_buffers[2]; -+ SElementV m_buffers[10]; -+ int m_iNumBuffers; - int m_decode; - int m_render; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderFlags.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderFlags.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderFlags.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderFlags.h 2012-05-14 14:15:12.158220950 +0200 -@@ -76,8 +76,10 @@ - #define CONF_FLAGS_FORMAT_YUY2 0x008000 - #define CONF_FLAGS_FORMAT_DXVA 0x010000 - #define CONF_FLAGS_FORMAT_VDPAU 0x020000 -+#define CONF_FLAGS_FORMAT_VDPAU_420 0x22000 - #define CONF_FLAGS_FORMAT_VAAPI 0x030000 - #define CONF_FLAGS_FORMAT_OMXEGL 0x040000 - #define CONF_FLAGS_FORMAT_CVBREF 0x080000 - #define CONF_FLAGS_FORMAT_BYPASS 0x100000 -+#define CONF_FLAGS_FORMAT_XVBA 0x200000 - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-05-14 14:15:12.160220990 +0200 -@@ -26,6 +26,7 @@ - #include "utils/MathUtils.h" - #include "threads/SingleLock.h" - #include "utils/log.h" -+#include "utils/TimeUtils.h" - - #include "Application.h" - #include "settings/Settings.h" -@@ -53,6 +54,8 @@ - #include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" - #include "../dvdplayer/DVDCodecs/DVDCodecUtils.h" - -+#include "windowing/WindowingFactory.h" -+ - #define MAXPRESENTDELAY 0.500 - - /* at any point we want an exclusive lock on rendermanager */ -@@ -246,6 +249,7 @@ - m_bReconfigured = true; - m_presentstep = PRESENT_IDLE; - m_presentevent.Set(); -+// ResetRenderBuffer(); - } - - return result; -@@ -277,8 +281,12 @@ - if (!m_pRenderer) - return; - -+ if (m_presentstep == PRESENT_IDLE) -+ PrepareNextRender(); -+ - if(m_presentstep == PRESENT_FLIP) - { -+ FlipRenderBuffer(); - m_overlays.Flip(); - m_pRenderer->FlipPage(m_presentsource); - m_presentstep = PRESENT_FRAME; -@@ -286,6 +294,8 @@ - } - } - -+// CLog::Log(LOGNOTICE,"------ current: %d", m_iCurrentRenderBuffer); -+ - if (g_advancedSettings.m_videoDisableBackgroundDeinterlace) - { - CSharedLock lock(m_sharedSection); -@@ -297,7 +307,7 @@ - m_presentevent.Set(); - } - --unsigned int CXBMCRenderManager::PreInit() -+unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) - { - CRetakeLock lock(m_sharedSection); - -@@ -305,6 +315,7 @@ - m_presenterr = 0.0; - m_errorindex = 0; - memset(m_errorbuff, 0, sizeof(m_errorbuff)); -+ m_pClock = pClock; - - m_bIsStarted = false; - m_bPauseDrawing = false; -@@ -323,6 +334,17 @@ - - UpdateDisplayLatency(); - -+ m_swapCount = 1; -+// std::string Vendor = g_Windowing.GetRenderVendor(); -+// std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); -+// if (Vendor.compare(0, 3, "ati") == 0) -+// { -+// m_swapCount = 2; -+// } -+ ResetRenderBuffer(); -+ m_bUseBuffering = false; -+ m_overlays.SetNumBuffers(m_iNumRenderBuffers); -+ m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); - return m_pRenderer->PreInit(); - } - -@@ -351,7 +373,9 @@ - - CRetakeLock lock(m_sharedSection); - m_pRenderer->Flush(); -+ m_overlays.Flush(); - m_flushEvent.Set(); -+ ResetRenderBuffer(); - } - else - { -@@ -512,25 +536,21 @@ - m_captures.erase(it); - } - --void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/) -+void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/, int speed /*= 0*/) - { -- if(timestamp - GetPresentTime() > MAXPRESENTDELAY) -- timestamp = GetPresentTime() + MAXPRESENTDELAY; -- -- /* can't flip, untill timestamp */ -- if(!g_graphicsContext.IsFullScreenVideo()) -- WaitPresentTime(timestamp); -- -- /* make sure any queued frame was fully presented */ -- double timeout = m_presenttime + 1.0; -- while(m_presentstep != PRESENT_IDLE && !bStop) -+ if (!m_bUseBuffering) - { -- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop) -+ /* make sure any queued frame was fully presented */ -+ double timeout = m_presenttime + 1.0; -+ while(m_presentstep != PRESENT_IDLE && !bStop) - { -- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame"); -- return; -+ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop) -+ { -+ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame"); -+ return; -+ } - } -- }; -+ } - - if(bStop) - return; -@@ -538,58 +558,67 @@ - { CRetakeLock lock(m_sharedSection); - if(!m_pRenderer) return; - -- m_presenttime = timestamp; -- m_presentfield = sync; -- m_presentstep = PRESENT_FLIP; -- m_presentsource = source; -+ double presenttime = timestamp; -+ EFIELDSYNC presentfield = sync; -+ EPRESENTMETHOD presentmethod; -+ - EDEINTERLACEMODE deinterlacemode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; - EINTERLACEMETHOD interlacemethod = AutoInterlaceMethodInternal(g_settings.m_currentVideoSettings.m_InterlaceMethod); - - bool invert = false; - - if (deinterlacemode == VS_DEINTERLACEMODE_OFF) -- m_presentmethod = PRESENT_METHOD_SINGLE; -+ presentmethod = PRESENT_METHOD_SINGLE; - else - { -- if (deinterlacemode == VS_DEINTERLACEMODE_AUTO && m_presentfield == FS_NONE) -- m_presentmethod = PRESENT_METHOD_SINGLE; -+ if (deinterlacemode == VS_DEINTERLACEMODE_AUTO && presentfield == FS_NONE) -+ presentmethod = PRESENT_METHOD_SINGLE; - else - { -- if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BLEND) m_presentmethod = PRESENT_METHOD_BLEND; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE) m_presentmethod = PRESENT_METHOD_WEAVE; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED) { m_presentmethod = PRESENT_METHOD_WEAVE ; invert = true; } -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB) m_presentmethod = PRESENT_METHOD_BOB; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) { m_presentmethod = PRESENT_METHOD_BOB; invert = true; } -- else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BOB) m_presentmethod = PRESENT_METHOD_BOB; -- else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BEST) m_presentmethod = PRESENT_METHOD_BOB; -- else m_presentmethod = PRESENT_METHOD_SINGLE; -+ if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BLEND) presentmethod = PRESENT_METHOD_BLEND; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE) presentmethod = PRESENT_METHOD_WEAVE; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED) { presentmethod = PRESENT_METHOD_WEAVE ; invert = true; } -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB) presentmethod = PRESENT_METHOD_BOB; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) { presentmethod = PRESENT_METHOD_BOB; invert = true; } -+ else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BOB) presentmethod = PRESENT_METHOD_BOB; -+ else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BEST) presentmethod = PRESENT_METHOD_BOB; -+ else presentmethod = PRESENT_METHOD_SINGLE; - - /* default to odd field if we want to deinterlace and don't know better */ -- if (deinterlacemode == VS_DEINTERLACEMODE_FORCE && m_presentfield == FS_NONE) -- m_presentfield = FS_TOP; -+ if (deinterlacemode == VS_DEINTERLACEMODE_FORCE && presentfield == FS_NONE) -+ presentfield = FS_TOP; - - /* invert present field */ - if(invert) - { -- if( m_presentfield == FS_BOT ) -- m_presentfield = FS_TOP; -+ if( presentfield == FS_BOT ) -+ presentfield = FS_TOP; - else -- m_presentfield = FS_BOT; -+ presentfield = FS_BOT; - } - } - } - -+ FlipFreeBuffer(); -+ m_renderBuffers[m_iOutputRenderBuffer].pts = timestamp; -+ m_renderBuffers[m_iOutputRenderBuffer].presentfield = presentfield; -+ m_renderBuffers[m_iOutputRenderBuffer].presentmethod = presentmethod; -+ m_speed = speed; - } - - g_application.NewFrame(); -- /* wait untill render thread have flipped buffers */ -- timeout = m_presenttime + 1.0; -- while(m_presentstep == PRESENT_FLIP && !bStop) -+ -+ if (!m_bUseBuffering) - { -- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop) -+ /* wait untill render thread have flipped buffers */ -+ double timeout = m_presenttime + 1.0; -+ while(m_presentstep == PRESENT_FLIP && !bStop) - { -- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete"); -- return; -+ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop) -+ { -+ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete"); -+ return; -+ } - } - } - } -@@ -631,8 +660,12 @@ - if (!m_pRenderer) - return; - -+ if (m_presentstep == PRESENT_IDLE) -+ PrepareNextRender(); -+ - if(m_presentstep == PRESENT_FLIP) - { -+ FlipRenderBuffer(); - m_overlays.Flip(); - m_pRenderer->FlipPage(m_presentsource); - m_presentstep = PRESENT_FRAME; -@@ -647,6 +680,8 @@ - WaitPresentTime(m_presenttime); - - m_presentevent.Set(); -+ -+ m_rendertime = CurrentHostCounter(); - } - - /* simple present method */ -@@ -753,7 +788,7 @@ - return 1; - - YV12Image image; -- int index = m_pRenderer->GetImage(&image); -+ int index = m_pRenderer->GetImage(&image, (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); - - if(index < 0) - return index; -@@ -776,8 +811,9 @@ - CDVDCodecUtils::CopyDXVA2Picture(&image, &pic); - } - #ifdef HAVE_LIBVDPAU -- else if(pic.format == DVDVideoPicture::FMT_VDPAU) -- m_pRenderer->AddProcessor(pic.vdpau); -+ else if(pic.format == DVDVideoPicture::FMT_VDPAU -+ || pic.format == DVDVideoPicture::FMT_VDPAU_420) -+ m_pRenderer->AddProcessor(pic.vdpau, index); - #endif - #ifdef HAVE_LIBOPENMAX - else if(pic.format == DVDVideoPicture::FMT_OMXEGL) -@@ -789,7 +825,11 @@ - #endif - #ifdef HAVE_LIBVA - else if(pic.format == DVDVideoPicture::FMT_VAAPI) -- m_pRenderer->AddProcessor(*pic.vaapi); -+ m_pRenderer->AddProcessor(*pic.vaapi, index); -+#endif -+#ifdef HAVE_LIBXVBA -+ else if(pic.format == DVDVideoPicture::FMT_XVBA) -+ m_pRenderer->AddProcessor(pic.xvba, index); - #endif - m_pRenderer->ReleaseImage(index, false); - -@@ -809,3 +849,212 @@ - - return mInt; - } -+ -+int CXBMCRenderManager::WaitForBuffer(volatile bool& bStop) -+{ -+ CSharedLock lock(m_sharedSection); -+ if (!m_pRenderer) -+ return -1; -+ -+ //wait up to a second as this is our slowest allowed output rate -+ double timeout = GetPresentTime() + 0.1; -+ while(!HasFreeBuffer() && !bStop) -+ { -+ lock.Leave(); -+ m_flipEvent.WaitMSec(50); -+ if(GetPresentTime() > timeout && !bStop) -+ { -+ CLog::Log(LOGWARNING, "CRenderManager::WaitForBuffer - timeout waiting for buffer"); -+ return -1; -+ } -+ lock.Enter(); -+ } -+ lock.Leave(); -+ -+ { CRetakeLock lock(m_sharedSection); -+ m_overlays.SetBuffer((m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); -+ } -+ -+ if (bStop) -+ return -1; -+ -+ return 1; -+} -+ -+int CXBMCRenderManager::GetNextRenderBufferIndex() -+{ -+ if (m_iOutputRenderBuffer == m_iCurrentRenderBuffer) -+ return -1; -+ return (m_iCurrentRenderBuffer + 1) % m_iNumRenderBuffers; -+} -+ -+void CXBMCRenderManager::FlipRenderBuffer() -+{ -+ m_iCurrentRenderBuffer = GetNextRenderBufferIndex(); -+// CLog::Log(LOGNOTICE,"-------- flip render: %d", m_iCurrentRenderBuffer); -+} -+ -+int CXBMCRenderManager::FlipFreeBuffer() -+{ -+ // See "Render Buffer State Description" in header for information. -+ if (HasFreeBuffer()) -+ { -+ m_bAllRenderBuffersDisplayed = false; -+ m_iOutputRenderBuffer = (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers; -+ return m_iOutputRenderBuffer; -+ } -+} -+ -+bool CXBMCRenderManager::HasFreeBuffer() -+{ -+ if (!m_bUseBuffering) -+ { -+ if (m_iOutputRenderBuffer != m_iCurrentRenderBuffer) -+ return false; -+ else -+ return true; -+ } -+ -+ int outputPlusSwap = (m_iOutputRenderBuffer + m_swapCount) % m_iNumRenderBuffers; -+ if ((m_iOutputRenderBuffer == m_iDisplayedRenderBuffer && !m_bAllRenderBuffersDisplayed) -+ || outputPlusSwap == m_iCurrentRenderBuffer) -+ return false; -+ else -+ return true; -+} -+ -+void CXBMCRenderManager::ResetRenderBuffer() -+{ -+ m_iNumRenderBuffers = 5; -+ m_iCurrentRenderBuffer = 0; -+ m_iFlipRequestRenderBuffer = 0; -+ m_iOutputRenderBuffer = 0; -+ m_iDisplayedRenderBuffer = 0; -+ m_bAllRenderBuffersDisplayed = true; -+ m_sleeptime = 1.0; -+ m_presentPts = DVD_NOPTS_VALUE; -+// m_bUseBuffering = true; -+ m_speed = 0; -+} -+ -+void CXBMCRenderManager::PrepareNextRender() -+{ -+ int idx = GetNextRenderBufferIndex(); -+ if (idx < 0) -+ { -+ if (m_speed >= DVD_PLAYSPEED_NORMAL && g_graphicsContext.IsFullScreenVideo()) -+ CLog::Log(LOGNOTICE,"----------- no buffer, out: %d, current: %d, display: %d", -+ m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); -+ return; -+ } -+ -+ double iClockSleep, iPlayingClock, iCurrentClock; -+ iPlayingClock = m_pClock->GetClock(iCurrentClock, false); -+ iClockSleep = m_renderBuffers[idx].pts - iPlayingClock; -+ -+ if (m_speed) -+ iClockSleep = iClockSleep * DVD_PLAYSPEED_NORMAL / m_speed; -+ -+ double presenttime = (iCurrentClock + iClockSleep) / DVD_TIME_BASE; -+ double clocktime = iCurrentClock / DVD_TIME_BASE; -+ if(presenttime - clocktime > MAXPRESENTDELAY) -+ presenttime = clocktime + MAXPRESENTDELAY; -+ -+ m_sleeptime = presenttime - clocktime; -+ -+// double interval; -+// if (g_VideoReferenceClock.GetRefreshRate(&interval) > 0) -+// { -+// if (m_swaptime > interval * 0.7) -+// { -+// presenttime += interval; -+// CLog::Log(LOGDEBUG,"------------ very long swaptime"); -+// } -+// } -+ -+ if (g_graphicsContext.IsFullScreenVideo() || presenttime <= clocktime+0.01) -+ { -+ m_presentPts = m_renderBuffers[idx].pts; -+ m_presenttime = presenttime; -+ m_presentmethod = m_renderBuffers[idx].presentmethod; -+ m_presentfield = m_renderBuffers[idx].presentfield; -+ m_presentstep = PRESENT_FLIP; -+ m_presentsource = idx; -+ } -+} -+ -+void CXBMCRenderManager::EnableBuffering(bool enable) -+{ -+ CRetakeLock lock(m_sharedSection); -+ m_bUseBuffering = enable; -+ if (!m_bUseBuffering) -+ m_iOutputRenderBuffer = m_iCurrentRenderBuffer; -+ -+ CLog::Log(LOGDEBUG, "CXBMCRenderManager::EnableBuffering - %d", m_bUseBuffering); -+} -+ -+void CXBMCRenderManager::DiscardBuffer() -+{ -+ CRetakeLock lock(m_sharedSection); -+ m_iOutputRenderBuffer = m_iCurrentRenderBuffer; -+} -+ -+void CXBMCRenderManager::NotifyDisplayFlip() -+{ -+ CRetakeLock lock(m_sharedSection); -+ if (!m_pRenderer) -+ return; -+ -+// if (g_graphicsContext.IsFullScreenVideo()) -+// { -+// uint64_t diff = CurrentHostCounter() - m_rendertime; -+// m_swaptime = ((double)(diff))/CurrentHostFrequency(); -+// int waittime = (int)((diff*1000LL)/CurrentHostFrequency()); -+// if (waittime > 15) -+// { -+// CLog::Log(LOGNOTICE,"------------------ wait swap buffers: %f, sleep: %f", m_swaptime, m_sleeptime); -+// } -+// } -+ -+ int last = m_iDisplayedRenderBuffer; -+ m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - m_swapCount) % m_iNumRenderBuffers; -+ m_iFlipRequestRenderBuffer = m_iCurrentRenderBuffer; -+ -+// // we have caught up with output so all buffers are re-usable -+// if (last != m_iDisplayedRenderBuffer -+// && m_iDisplayedRenderBuffer == m_iOutputRenderBuffer) -+// { -+// CLog::Log(LOGNOTICE,"-------------- all displayed"); -+// m_bAllRenderBuffersDisplayed = true; -+// } -+ -+ if (last != m_iDisplayedRenderBuffer -+ && m_iDisplayedRenderBuffer != m_iCurrentRenderBuffer) -+ { -+ m_pRenderer->ReleaseBuffer(m_iDisplayedRenderBuffer); -+ m_overlays.ReleaseBuffer(m_iDisplayedRenderBuffer); -+ } -+ -+ lock.Leave(); -+ m_flipEvent.Set(); -+} -+ -+bool CXBMCRenderManager::GetStats(double &sleeptime, double &pts, int &bufferLevel) -+{ -+ CSharedLock lock(m_sharedSection); -+ sleeptime = m_sleeptime; -+ pts = m_presentPts; -+ bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; -+ return true; -+} -+ -+bool CXBMCRenderManager::HasFrame() -+{ -+ CSharedLock lock(m_sharedSection); -+ if (m_presentstep == PRESENT_IDLE && -+ GetNextRenderBufferIndex() < 0 && -+ m_speed > 0) -+ return false; -+ else -+ return true; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.h 2012-05-14 14:15:12.161221010 +0200 -@@ -39,10 +39,11 @@ - #include "OverlayRenderer.h" - - class CRenderCapture; -+class CDVDClock; - - namespace DXVA { class CProcessor; } - namespace VAAPI { class CSurfaceHolder; } --class CVDPAU; -+namespace VDPAU { struct CVdpauRenderPicture; } - struct DVDVideoPicture; - - #define ERRORBUFFSIZE 30 -@@ -73,8 +74,8 @@ - - int AddVideoPicture(DVDVideoPicture& picture); - -- void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE); -- unsigned int PreInit(); -+ void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE, int speed = 0); -+ unsigned int PreInit(CDVDClock *pClock); - void UnInit(); - bool Flush(); - -@@ -182,6 +183,13 @@ - - CSharedSection& GetSection() { return m_sharedSection; }; - -+ int WaitForBuffer(volatile bool& bStop); -+ void NotifyDisplayFlip(); -+ bool GetStats(double &sleeptime, double &pts, int &bufferLevel); -+ bool HasFrame(); -+ void EnableBuffering(bool enable); -+ void DiscardBuffer(); -+ - protected: - void Render(bool clear, DWORD flags, DWORD alpha); - -@@ -190,6 +198,13 @@ - void PresentBob(bool clear, DWORD flags, DWORD alpha); - void PresentBlend(bool clear, DWORD flags, DWORD alpha); - -+ int GetNextRenderBufferIndex(); -+ void FlipRenderBuffer(); -+ int FlipFreeBuffer(); -+ bool HasFreeBuffer(); -+ void ResetRenderBuffer(); -+ void PrepareNextRender(); -+ - EINTERLACEMETHOD AutoInterlaceMethodInternal(EINTERLACEMETHOD mInt); - - bool m_bPauseDrawing; // true if we should pause rendering -@@ -220,6 +235,43 @@ - double m_displayLatency; - void UpdateDisplayLatency(); - -+ // Render Buffer State Description: -+ // -+ // Output: is the buffer about to or having its texture prepared for render (ie from output thread). -+ // Cannot go past the "Displayed" buffer (otherwise we will probably overwrite buffers not yet -+ // displayed or even rendered). -+ // Current: is the current buffer being or having been submitted for render to back buffer. -+ // Cannot go past "Output" buffer (else it would be rendering old output). -+ // FlipRequest: is the render buffer that has last been submitted for render AND importantly has had -+ // swap-buffer flip subsequently invoked (thus flip to front buffer is requested for vblank -+ // subsequent to render completion). -+ // Displayed: is the buffer that is now considered to be safely copied from back buffer to front buffer -+ // (we assume that after two swap-buffer flips for the same "Current" render buffer that that -+ // buffer will be safe, but otherwise we consider that only the previous-to-"Current" is guaranteed). -+ // Last: is the last buffer successfully submitted for render to back buffer (purpose: to rollback to in -+ // unexpected case where a texture render fails). -+ -+ int m_iCurrentRenderBuffer; -+ int m_iNumRenderBuffers; -+// int m_iLastRenderBuffer; -+ int m_iFlipRequestRenderBuffer; -+ int m_iOutputRenderBuffer; -+ int m_iDisplayedRenderBuffer; -+ bool m_bAllRenderBuffersDisplayed; -+ bool m_bUseBuffering; -+ int m_speed; -+ CEvent m_flipEvent; -+ -+ struct -+ { -+ double pts; -+ EFIELDSYNC presentfield; -+ EPRESENTMETHOD presentmethod; -+ }m_renderBuffers[5]; -+ -+ double m_sleeptime; -+ double m_presentPts; -+ - double m_presenttime; - double m_presentcorr; - double m_presenterr; -@@ -231,7 +283,10 @@ - int m_presentsource; - CEvent m_presentevent; - CEvent m_flushEvent; -- -+ CDVDClock *m_pClock; -+ uint64_t m_rendertime; -+ double m_swaptime; -+ unsigned int m_swapCount; - - OVERLAY::CRenderer m_overlays; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-05-14 14:15:12.162221031 +0200 -@@ -186,6 +186,8 @@ - m_defines += "#define XBMC_YUY2\n"; - else if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_UYVY) - m_defines += "#define XBMC_UYVY\n"; -+ else if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_VDPAU_420) -+ m_defines += "#define XBMC_VDPAU_NV12\n"; - - VertexShader()->LoadSource("yuv2rgb_vertex.glsl", m_defines); - #elif HAS_GLES == 2 -diff -Naur xbmc-pvr-11.0.1/xbmc/dialogs/GUIDialogCache.cpp xbmc-pvr-11.0.1.patch/xbmc/dialogs/GUIDialogCache.cpp ---- xbmc-pvr-11.0.1/xbmc/dialogs/GUIDialogCache.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/dialogs/GUIDialogCache.cpp 2012-05-14 14:15:12.163221052 +0200 -@@ -29,7 +29,7 @@ - #include "threads/SingleLock.h" - #include "utils/TimeUtils.h" - --CGUIDialogCache::CGUIDialogCache(DWORD dwDelay, const CStdString& strHeader, const CStdString& strMsg) -+CGUIDialogCache::CGUIDialogCache(DWORD dwDelay, const CStdString& strHeader, const CStdString& strMsg) : CThread("CGUIDialogCache") - { - m_pDlg = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FileCache.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileCache.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FileCache.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileCache.cpp 2012-05-14 14:15:12.163221052 +0200 -@@ -79,7 +79,7 @@ - }; - - --CFileCache::CFileCache() -+CFileCache::CFileCache() : CThread("CFileCache") - { - m_bDeleteCache = true; - m_nSeekResult = 0; -@@ -95,7 +95,7 @@ - m_cacheFull = false; - } - --CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache) -+CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache) : CThread("CFileCache") - { - m_pCache = pCache; - m_bDeleteCache = bDeleteCache; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FilePipe.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FilePipe.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FilePipe.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FilePipe.cpp 2012-05-14 14:15:12.164221072 +0200 -@@ -24,6 +24,8 @@ - #include "PipesManager.h" - #include "utils/StringUtils.h" - -+#define INFINITE 0xFFFFFFFF -+ - using namespace XFILE; - - CFilePipe::CFilePipe() : m_pos(0), m_length(-1), m_pipe(NULL) -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FileRar.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileRar.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FileRar.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileRar.cpp 2012-05-14 14:15:12.165221092 +0200 -@@ -43,7 +43,7 @@ - #define SEEKTIMOUT 30000 - - #ifdef HAS_FILESYSTEM_RAR --CFileRarExtractThread::CFileRarExtractThread() : hRunning(true), hQuit(true) -+CFileRarExtractThread::CFileRarExtractThread() : CThread("CFileRarExtractThread"), hRunning(true), hQuit(true) - { - m_pArc = NULL; - m_pCmd = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/HTSPDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/HTSPDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/HTSPDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/HTSPDirectory.cpp 2012-05-14 14:15:12.166221112 +0200 -@@ -76,7 +76,7 @@ - static CCriticalSection g_section; - - --CHTSPDirectorySession::CHTSPDirectorySession() -+CHTSPDirectorySession::CHTSPDirectorySession() : CThread("CHTSPDirectorySession") - { - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/LastFMDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/LastFMDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/LastFMDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/LastFMDirectory.cpp 2012-05-14 14:15:12.167221132 +0200 -@@ -69,7 +69,7 @@ - m_dlgProgress->Progress(); - } - -- CThread thread(this); -+ CThread thread(this, "CLastFMDirectory"); - m_strSource = url; - m_strDestination = "special://temp/lastfm.xml"; - thread.Create(); -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/MythSession.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/MythSession.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/MythSession.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/MythSession.cpp 2012-05-14 14:15:12.168221152 +0200 -@@ -359,7 +359,7 @@ - return; - } - --CMythSession::CMythSession(const CURL& url) -+CMythSession::CMythSession(const CURL& url) : CThread("CMythSession") - { - m_control = NULL; - m_event = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/PipesManager.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/PipesManager.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/PipesManager.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/PipesManager.cpp 2012-05-14 14:15:12.169221172 +0200 -@@ -23,6 +23,8 @@ - #include "threads/SingleLock.h" - #include "Application.h" - -+#define INFINITE 0xFFFFFFFF -+ - #ifndef min - #define min(a,b) ((a) < (b) ? (a) : (b)) - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/RarManager.h xbmc-pvr-11.0.1.patch/xbmc/filesystem/RarManager.h ---- xbmc-pvr-11.0.1/xbmc/filesystem/RarManager.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/RarManager.h 2012-05-14 14:15:12.169221172 +0200 -@@ -71,7 +71,7 @@ - CRarManager(); - ~CRarManager(); - bool CacheRarredFile(CStdString& strPathInCache, const CStdString& strRarPath, -- const CStdString& strPathInRar, BYTE bOptions = EXFILE_AUTODELETE, -+ const CStdString& strPathInRar, uint8_t bOptions = EXFILE_AUTODELETE, - const CStdString& strDir =RAR_DEFAULT_CACHE, const int64_t iSize=-1); - bool GetPathInCache(CStdString& strPathInCache, const CStdString& strRarPath, - const CStdString& strPathInRar = ""); -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/SAPDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/SAPDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/SAPDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/SAPDirectory.cpp 2012-05-14 14:15:12.170221192 +0200 -@@ -272,7 +272,7 @@ - using namespace SDP; - - --CSAPSessions::CSAPSessions() -+CSAPSessions::CSAPSessions() : CThread("CSAPSessions") - { - m_socket = INVALID_SOCKET; - } -@@ -486,7 +486,7 @@ - - CSingleLock lock(g_sapsessions.m_section); - -- if(g_sapsessions.ThreadHandle() == NULL) -+ if(!g_sapsessions.IsRunning()) - g_sapsessions.Create(); - - // check if we can find this session in our cache -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-05-14 14:15:12.171221212 +0200 -@@ -181,9 +181,9 @@ - m_threadState = state; - } - --void CGUIPythonWindow::WaitForActionEvent(unsigned int timeout) -+void CGUIPythonWindow::WaitForActionEvent() - { -- g_pythonParser.WaitForEvent(m_actionEvent, timeout); -+ g_pythonParser.WaitForEvent(m_actionEvent); - m_actionEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-05-14 14:15:12.171221212 +0200 -@@ -51,7 +51,7 @@ - virtual bool OnAction(const CAction &action); - virtual bool OnBack(int actionID); - void SetCallbackWindow(void* state, void *object); -- void WaitForActionEvent(unsigned int timeout); -+ void WaitForActionEvent(); - void PulseActionEvent(); - void SetDestroyAfterDeinit(bool destroy = true); - protected: -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-05-14 14:15:12.172221232 +0200 -@@ -279,9 +279,9 @@ - UpdateButtons(); - } - --void CGUIPythonWindowXML::WaitForActionEvent(unsigned int timeout) -+void CGUIPythonWindowXML::WaitForActionEvent() - { -- g_pythonParser.WaitForEvent(m_actionEvent, timeout); -+ g_pythonParser.WaitForEvent(m_actionEvent); - m_actionEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-05-14 14:15:12.173221252 +0200 -@@ -40,7 +40,7 @@ - virtual void AllocResources(bool forceLoad = false); - virtual void FreeResources(bool forceUnLoad = false); - void Process(unsigned int currentTime, CDirtyRegionList ®ions); -- void WaitForActionEvent(unsigned int timeout); -+ void WaitForActionEvent(); - void PulseActionEvent(); - void AddItem(CFileItemPtr fileItem,int itemPosition); - void RemoveItem(int itemPosition); -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-05-14 14:15:12.174221272 +0200 -@@ -540,11 +540,11 @@ - - CPyThreadState pyState; - if (WindowXML_Check(self)) -- ((CGUIPythonWindowXML*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindowXML*)self->pWindow)->WaitForActionEvent(); - else if (WindowXMLDialog_Check(self)) -- ((CGUIPythonWindowXMLDialog*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindowXMLDialog*)self->pWindow)->WaitForActionEvent(); - else -- ((CGUIPythonWindow*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindow*)self->pWindow)->WaitForActionEvent(); - } - } - Py_INCREF(Py_None); -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.cpp 2012-05-14 14:15:12.175221293 +0200 -@@ -676,11 +676,11 @@ - m_globalEvent.Set(); - } - --void XBPython::WaitForEvent(CEvent& hEvent, unsigned int timeout) -+void XBPython::WaitForEvent(CEvent& hEvent) - { - // wait for either this event our our global event - XbmcThreads::CEventGroup eventGroup(&hEvent, &m_globalEvent, NULL); -- eventGroup.wait(timeout); -+ eventGroup.wait(); - m_globalEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.h 2012-05-14 14:15:12.176221314 +0200 -@@ -61,7 +61,7 @@ - void Process(); - - void PulseGlobalEvent(); -- void WaitForEvent(CEvent& hEvent, unsigned int timeout); -+ void WaitForEvent(CEvent& hEvent); - - int ScriptsSize(); - int GetPythonScriptId(int scriptPosition); -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/Makefile.in xbmc-pvr-11.0.1.patch/xbmc/linux/Makefile.in ---- xbmc-pvr-11.0.1/xbmc/linux/Makefile.in 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/Makefile.in 2012-05-14 14:15:12.176221314 +0200 -@@ -10,14 +10,11 @@ - LinuxResourceCounter.cpp \ - LinuxTimezone.cpp \ - PosixMountProvider.cpp \ -- XEventUtils.cpp \ - XFileUtils.cpp \ - XHandle.cpp \ - XLCDproc.cpp \ - XMemUtils.cpp \ -- XSyncUtils.cpp \ - XTimeUtils.cpp \ -- XThreadUtils.cpp \ - - LIB=linux.a - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/PlatformDefs.h xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformDefs.h ---- xbmc-pvr-11.0.1/xbmc/linux/PlatformDefs.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformDefs.h 2012-05-14 14:15:12.177221334 +0200 -@@ -182,8 +182,6 @@ - #define EXCEPTION_EXECUTE_HANDLER ... - //NOTE: dont try to define __except because it breaks g++ (already uses it). - --typedef pthread_t ThreadIdentifier; -- - struct CXHandle; // forward declaration - typedef CXHandle* HANDLE; - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/PlatformInclude.h xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformInclude.h ---- xbmc-pvr-11.0.1/xbmc/linux/PlatformInclude.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformInclude.h 2012-05-14 14:15:12.178221354 +0200 -@@ -25,10 +25,7 @@ - #include "PlatformDefs.h" - #include "XHandlePublic.h" - #include "XFileUtils.h" --#include "XSyncUtils.h" --#include "XEventUtils.h" - #include "XTimeUtils.h" --#include "XThreadUtils.h" - #include "XMemUtils.h" - #include "ConvUtils.h" - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,144 +0,0 @@ --/* -- * Copyright (C) 2005-2008 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to -- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#include "system.h" --#include "PlatformDefs.h" --#include "XEventUtils.h" --#include "XHandle.h" --#include "utils/log.h" --#include "threads/SingleLock.h" -- --using namespace std; -- --HANDLE WINAPI CreateEvent(void *pDummySec, bool bManualReset, bool bInitialState, char *szDummyName) --{ -- CXHandle *pHandle = new CXHandle(CXHandle::HND_EVENT); -- pHandle->m_bManualEvent = bManualReset; -- pHandle->m_hCond = new XbmcThreads::ConditionVariable(); -- pHandle->m_hMutex = new CCriticalSection(); -- pHandle->m_bEventSet = false; -- -- if (bInitialState) -- SetEvent(pHandle); -- -- return pHandle; --} -- --// --// The state of a manual-reset event object remains signaled until it is set explicitly to the nonsignaled --// state by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait --// operations for the specified event object by calling one of the wait functions, can be released while the --// object's state is signaled. --// --// The state of an auto-reset event object remains signaled until a single waiting thread is released, at --// which time the system automatically sets the state to nonsignaled. If no threads are waiting, the event --// object's state remains signaled. --// --bool WINAPI SetEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = true; -- -- // we must guarantee that these handle's won't be deleted, until we are done -- list events = hEvent->m_hParents; -- for(list::iterator it = events.begin();it != events.end();it++) -- DuplicateHandle(GetCurrentProcess(), *it, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- lock.Leave(); -- -- for(list::iterator it = events.begin();it != events.end();it++) -- { -- SetEvent(*it); -- CloseHandle(*it); -- } -- -- DuplicateHandle(GetCurrentProcess(), hEvent, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- if (hEvent->m_bManualEvent == true) -- hEvent->m_hCond->notifyAll(); -- else -- hEvent->m_hCond->notify(); -- -- CloseHandle(hEvent); -- -- return true; --} -- --bool WINAPI ResetEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = false; -- -- return true; --} -- --bool WINAPI PulseEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- // we must guarantee that these handle's won't be deleted, until we are done -- list events = hEvent->m_hParents; -- for(list::iterator it = events.begin();it != events.end();it++) -- DuplicateHandle(GetCurrentProcess(), *it, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- if(events.size()) -- { -- CLog::Log(LOGWARNING,"PulseEvent - ineffecient multiwait detected"); -- hEvent->m_bEventSet = true; -- } -- -- lock.Leave(); -- -- for(list::iterator it = events.begin();it != events.end();it++) -- { -- SetEvent(*it); -- CloseHandle(*it); -- -- if (hEvent->m_bManualEvent == false) -- break; -- } -- -- // for multiwaits, we must yield some time to get the multiwaits to notice it was signaled -- if(events.size()) -- Sleep(10); -- -- // we should always unset the event on pulse -- { -- CSingleLock lock2(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = false; -- } -- -- if (hEvent->m_bManualEvent == true) -- hEvent->m_hCond->notifyAll(); -- else -- hEvent->m_hCond->notify(); -- -- return true; --} -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,38 +0,0 @@ --#ifndef __X_EVENT_UTIL_H__ --#define __X_EVENT_UTIL_H__ -- --/* -- * Copyright (C) 2005-2008 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to -- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#include "XHandlePublic.h" -- --#ifdef _LINUX -- --HANDLE WINAPI CreateEvent(void *pDummySec, bool bManualReset, bool bInitialState, char *szDummyName); --bool WINAPI SetEvent(HANDLE hEvent); --bool WINAPI ResetEvent(HANDLE hEvent); --bool WINAPI PulseEvent(HANDLE hEvent); -- --#endif -- -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XHandle.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XHandle.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.cpp 2012-05-14 14:15:12.185221494 +0200 -@@ -20,12 +20,15 @@ - */ - - #include "XHandle.h" --#include "XThreadUtils.h" - #include "utils/log.h" - #include "threads/SingleLock.h" - - int CXHandle::m_objectTracker[10] = {0}; - -+HANDLE WINAPI GetCurrentProcess(void) { -+ return (HANDLE)-1; // -1 a special value - pseudo handle -+} -+ - CXHandle::CXHandle() - { - Init(); -@@ -47,11 +50,6 @@ - - Init(); - -- if (m_threadValid) -- { -- CLog::Log(LOGERROR, "%s - thread handle copied instead of passed!", __FUNCTION__); -- } -- - if (src.m_hMutex) - m_hMutex = new CCriticalSection(); - -@@ -80,7 +78,7 @@ - CLog::Log(LOGERROR,"%s, destroying handle with ref count %d", __FUNCTION__, m_nRefCount); - assert(false); - } -- -+ - if (m_hMutex) { - delete m_hMutex; - } -@@ -93,10 +91,6 @@ - delete m_hCond; - } - -- if (m_threadValid) { -- pthread_join(m_hThread, NULL); -- } -- - if ( fd != 0 ) { - close(fd); - } -@@ -107,11 +101,9 @@ - { - fd=0; - m_hMutex=NULL; -- m_threadValid=false; - m_hCond=NULL; - m_type = HND_NULL; - RecursionCount=0; -- OwningThread=0; - m_bManualEvent=FALSE; - m_bEventSet=FALSE; - m_nFindFileIterator=0 ; -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XHandle.h xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.h ---- xbmc-pvr-11.0.1/xbmc/linux/XHandle.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.h 2012-05-14 14:15:12.186221514 +0200 -@@ -25,7 +25,6 @@ - #ifndef _WIN32 - - #include --#include - - #include "PlatformDefs.h" - #include "XHandlePublic.h" -@@ -36,7 +35,7 @@ - struct CXHandle { - - public: -- typedef enum { HND_NULL = 0, HND_FILE, HND_EVENT, HND_MUTEX, HND_THREAD, HND_FIND_FILE } HandleType; -+ typedef enum { HND_NULL = 0, HND_FILE, HND_EVENT, HND_MUTEX, HND_FIND_FILE } HandleType; - - CXHandle(); - CXHandle(HandleType nType); -@@ -47,8 +46,6 @@ - inline HandleType GetType() { return m_type; } - void ChangeType(HandleType newType); - -- ThreadIdentifier m_hThread; -- bool m_threadValid; - XbmcThreads::ConditionVariable *m_hCond; - std::list m_hParents; - -@@ -62,7 +59,6 @@ - // simulate mutex and critical section - CCriticalSection *m_hMutex; - int RecursionCount; // for mutex - for compatibility with WIN32 critical section -- pthread_t OwningThread; - int fd; - bool m_bManualEvent; - time_t m_tmCreation; -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.cpp 2012-05-14 14:15:12.187221534 +0200 -@@ -25,6 +25,10 @@ - - #include "XMemUtils.h" - -+#ifdef __APPLE__ -+#include -+#endif -+ - #undef ALIGN - #define ALIGN(value, alignment) (((value)+(alignment-1))&~(alignment-1)) - -@@ -49,4 +53,130 @@ - free(pFull); - } - -+#ifndef _WIN32 -+ -+#if defined(_LINUX) && !defined(__APPLE__) && !defined(__FreeBSD__) -+static FILE* procMeminfoFP = NULL; -+#endif -+ -+void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) -+{ -+ if (!lpBuffer) -+ return; -+ -+ memset(lpBuffer, 0, sizeof(MEMORYSTATUSEX)); -+ -+#ifdef __APPLE__ -+ uint64_t physmem; -+ size_t len = sizeof physmem; -+ int mib[2] = { CTL_HW, HW_MEMSIZE }; -+ size_t miblen = sizeof(mib) / sizeof(mib[0]); -+ -+ // Total physical memory. -+ if (sysctl(mib, miblen, &physmem, &len, NULL, 0) == 0 && len == sizeof (physmem)) -+ lpBuffer->ullTotalPhys = physmem; -+ -+ // Virtual memory. -+ mib[0] = CTL_VM; mib[1] = VM_SWAPUSAGE; -+ struct xsw_usage swap; -+ len = sizeof(struct xsw_usage); -+ if (sysctl(mib, miblen, &swap, &len, NULL, 0) == 0) -+ { -+ lpBuffer->ullAvailPageFile = swap.xsu_avail; -+ lpBuffer->ullTotalVirtual = lpBuffer->ullTotalPhys + swap.xsu_total; -+ } -+ -+ // In use. -+ mach_port_t stat_port = mach_host_self(); -+ vm_statistics_data_t vm_stat; -+ mach_msg_type_number_t count = sizeof(vm_stat) / sizeof(natural_t); -+ if (host_statistics(stat_port, HOST_VM_INFO, (host_info_t)&vm_stat, &count) == 0) -+ { -+ // Find page size. -+ int pageSize; -+ mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; -+ len = sizeof(int); -+ if (sysctl(mib, miblen, &pageSize, &len, NULL, 0) == 0) -+ { -+ uint64_t used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pageSize; -+ -+ lpBuffer->ullAvailPhys = lpBuffer->ullTotalPhys - used; -+ lpBuffer->ullAvailVirtual = lpBuffer->ullAvailPhys; // FIXME. -+ } -+ } -+#elif defined(__FreeBSD__) -+ /* sysctl hw.physmem */ -+ size_t physmem = 0, mem_free = 0, pagesize = 0, swap_free = 0; -+ size_t mem_avail = 0, mem_inactive = 0, mem_cache = 0, len = 0; -+ -+ /* physmem */ -+ len = sizeof(physmem); -+ if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0) { -+ lpBuffer->ullTotalPhys = physmem; -+ lpBuffer->ullTotalVirtual = physmem; -+ } -+ /* pagesize */ -+ len = sizeof(pagesize); -+ if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0) -+ pagesize = 4096; -+ /* mem_inactive */ -+ len = sizeof(mem_inactive); -+ if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0) -+ mem_inactive *= pagesize; -+ /* mem_cache */ -+ len = sizeof(mem_cache); -+ if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0) -+ mem_cache *= pagesize; -+ /* mem_free */ -+ len = sizeof(mem_free); -+ if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0) -+ mem_free *= pagesize; -+ -+ /* mem_avail = mem_inactive + mem_cache + mem_free */ -+ lpBuffer->ullAvailPhys = mem_inactive + mem_cache + mem_free; -+ lpBuffer->ullAvailVirtual = mem_inactive + mem_cache + mem_free; -+ -+ if (sysctlbyname("vm.stats.vm.v_swappgsout", &swap_free, &len, NULL, 0) == 0) -+ lpBuffer->ullAvailPageFile = swap_free * pagesize; -+#else -+ struct sysinfo info; -+ char name[32]; -+ unsigned val; -+ if (!procMeminfoFP && (procMeminfoFP = fopen("/proc/meminfo", "r")) == NULL) -+ sysinfo(&info); -+ else -+ { -+ memset(&info, 0, sizeof(struct sysinfo)); -+ info.mem_unit = 4096; -+ while (fscanf(procMeminfoFP, "%31s %u%*[^\n]\n", name, &val) != EOF) -+ { -+ if (strncmp("MemTotal:", name, 9) == 0) -+ info.totalram = val/4; -+ else if (strncmp("MemFree:", name, 8) == 0) -+ info.freeram = val/4; -+ else if (strncmp("Buffers:", name, 8) == 0) -+ info.bufferram += val/4; -+ else if (strncmp("Cached:", name, 7) == 0) -+ info.bufferram += val/4; -+ else if (strncmp("SwapTotal:", name, 10) == 0) -+ info.totalswap = val/4; -+ else if (strncmp("SwapFree:", name, 9) == 0) -+ info.freeswap = val/4; -+ else if (strncmp("HighTotal:", name, 10) == 0) -+ info.totalhigh = val/4; -+ else if (strncmp("HighFree:", name, 9) == 0) -+ info.freehigh = val/4; -+ } -+ rewind(procMeminfoFP); -+ fflush(procMeminfoFP); -+ } -+ lpBuffer->ullAvailPageFile = (info.freeswap * info.mem_unit); -+ lpBuffer->ullAvailPhys = ((info.freeram + info.bufferram) * info.mem_unit); -+ lpBuffer->ullAvailVirtual = ((info.freeram + info.bufferram) * info.mem_unit); -+ lpBuffer->ullTotalPhys = (info.totalram * info.mem_unit); -+ lpBuffer->ullTotalVirtual = (info.totalram * info.mem_unit); -+#endif -+} -+ -+#endif - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.h 2012-05-14 14:15:12.187221534 +0200 -@@ -22,10 +22,14 @@ - * - */ - -+#include "linux/PlatformDefs.h" -+ - // aligned memory allocation and free. memory returned will be aligned to "alignTo" bytes. - // this is a linux (actually platfom free) implementation of the win32 CRT methods _aligned_malloc and _aligned_free. - void *_aligned_malloc(size_t s, size_t alignTo); - void _aligned_free(void *p) ; - -+void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); -+ - #endif - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,169 +0,0 @@ --/* -- * Copyright (C) 2005-2008 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to -- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#ifndef _WIN32 -- -- --#include --#include --#include --#include --#include --#ifdef __APPLE__ --#include --#endif -- --#include "XSyncUtils.h" --#include "XTimeUtils.h" --#include "PlatformDefs.h" --#include "XHandle.h" --#include "XEventUtils.h" -- --using namespace std; --using namespace XbmcThreads; -- --#include "../utils/log.h" --#include "../utils/TimeUtils.h" -- --#if defined(_LINUX) && !defined(__APPLE__) && !defined(__FreeBSD__) --static FILE* procMeminfoFP = NULL; --#endif -- --void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) --{ -- if (!lpBuffer) -- return; -- -- memset(lpBuffer, 0, sizeof(MEMORYSTATUSEX)); -- --#ifdef __APPLE__ -- uint64_t physmem; -- size_t len = sizeof physmem; -- int mib[2] = { CTL_HW, HW_MEMSIZE }; -- size_t miblen = sizeof(mib) / sizeof(mib[0]); -- -- // Total physical memory. -- if (sysctl(mib, miblen, &physmem, &len, NULL, 0) == 0 && len == sizeof (physmem)) -- lpBuffer->ullTotalPhys = physmem; -- -- // Virtual memory. -- mib[0] = CTL_VM; mib[1] = VM_SWAPUSAGE; -- struct xsw_usage swap; -- len = sizeof(struct xsw_usage); -- if (sysctl(mib, miblen, &swap, &len, NULL, 0) == 0) -- { -- lpBuffer->ullAvailPageFile = swap.xsu_avail; -- lpBuffer->ullTotalVirtual = lpBuffer->ullTotalPhys + swap.xsu_total; -- } -- -- // In use. -- mach_port_t stat_port = mach_host_self(); -- vm_statistics_data_t vm_stat; -- mach_msg_type_number_t count = sizeof(vm_stat) / sizeof(natural_t); -- if (host_statistics(stat_port, HOST_VM_INFO, (host_info_t)&vm_stat, &count) == 0) -- { -- // Find page size. -- int pageSize; -- mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; -- len = sizeof(int); -- if (sysctl(mib, miblen, &pageSize, &len, NULL, 0) == 0) -- { -- uint64_t used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pageSize; -- -- lpBuffer->ullAvailPhys = lpBuffer->ullTotalPhys - used; -- lpBuffer->ullAvailVirtual = lpBuffer->ullAvailPhys; // FIXME. -- } -- } --#elif defined(__FreeBSD__) -- /* sysctl hw.physmem */ -- size_t physmem = 0, mem_free = 0, pagesize = 0, swap_free = 0; -- size_t mem_avail = 0, mem_inactive = 0, mem_cache = 0, len = 0; -- -- /* physmem */ -- len = sizeof(physmem); -- if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0) { -- lpBuffer->ullTotalPhys = physmem; -- lpBuffer->ullTotalVirtual = physmem; -- } -- /* pagesize */ -- len = sizeof(pagesize); -- if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0) -- pagesize = 4096; -- /* mem_inactive */ -- len = sizeof(mem_inactive); -- if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0) -- mem_inactive *= pagesize; -- /* mem_cache */ -- len = sizeof(mem_cache); -- if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0) -- mem_cache *= pagesize; -- /* mem_free */ -- len = sizeof(mem_free); -- if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0) -- mem_free *= pagesize; -- -- /* mem_avail = mem_inactive + mem_cache + mem_free */ -- lpBuffer->ullAvailPhys = mem_inactive + mem_cache + mem_free; -- lpBuffer->ullAvailVirtual = mem_inactive + mem_cache + mem_free; -- -- if (sysctlbyname("vm.stats.vm.v_swappgsout", &swap_free, &len, NULL, 0) == 0) -- lpBuffer->ullAvailPageFile = swap_free * pagesize; --#else -- struct sysinfo info; -- char name[32]; -- unsigned val; -- if (!procMeminfoFP && (procMeminfoFP = fopen("/proc/meminfo", "r")) == NULL) -- sysinfo(&info); -- else -- { -- memset(&info, 0, sizeof(struct sysinfo)); -- info.mem_unit = 4096; -- while (fscanf(procMeminfoFP, "%31s %u%*[^\n]\n", name, &val) != EOF) -- { -- if (strncmp("MemTotal:", name, 9) == 0) -- info.totalram = val/4; -- else if (strncmp("MemFree:", name, 8) == 0) -- info.freeram = val/4; -- else if (strncmp("Buffers:", name, 8) == 0) -- info.bufferram += val/4; -- else if (strncmp("Cached:", name, 7) == 0) -- info.bufferram += val/4; -- else if (strncmp("SwapTotal:", name, 10) == 0) -- info.totalswap = val/4; -- else if (strncmp("SwapFree:", name, 9) == 0) -- info.freeswap = val/4; -- else if (strncmp("HighTotal:", name, 10) == 0) -- info.totalhigh = val/4; -- else if (strncmp("HighFree:", name, 9) == 0) -- info.freehigh = val/4; -- } -- rewind(procMeminfoFP); -- fflush(procMeminfoFP); -- } -- lpBuffer->ullAvailPageFile = (info.freeswap * info.mem_unit); -- lpBuffer->ullAvailPhys = ((info.freeram + info.bufferram) * info.mem_unit); -- lpBuffer->ullAvailVirtual = ((info.freeram + info.bufferram) * info.mem_unit); -- lpBuffer->ullTotalPhys = (info.totalram * info.mem_unit); -- lpBuffer->ullTotalVirtual = (info.totalram * info.mem_unit); --#endif --} -- --#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,44 +0,0 @@ --#ifndef __X_SYNC_UTILS_ --#define __X_SYNC_UTILS_ -- --/* -- * Copyright (C) 2005-2008 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to -- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#include "PlatformDefs.h" --#include "XHandlePublic.h" -- --#ifdef _LINUX -- --#define STATUS_WAIT_0 ((DWORD )0x00000000L) --#define WAIT_FAILED ((DWORD)0xFFFFFFFF) --#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) --#define WAIT_TIMEOUT 258L --#define INFINITE 0xFFFFFFFF --#define STATUS_ABANDONED_WAIT_0 0x00000080 --#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) --#define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0 ) + 0 ) -- --void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); -- --#endif -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XThreadUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XThreadUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XThreadUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XThreadUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,210 +0,0 @@ --/* -- * Copyright (C) 2005-2009 Team XBMC -- * http://www.xbmc.org -- * -- * 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, 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 XBMC; see the file COPYING. If not, write to -- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#include "PlatformDefs.h" --#include "XHandle.h" --#include "XThreadUtils.h" --#include "XTimeUtils.h" --#include "XEventUtils.h" --#include "system.h" --#include "utils/log.h" -- --#ifdef _LINUX --#include --#include --#include -- --HANDLE WINAPI CreateThread( -- LPSECURITY_ATTRIBUTES lpThreadAttributes, -- SIZE_T dwStackSize, -- LPTHREAD_START_ROUTINE lpStartAddress, -- LPVOID lpParameter, -- DWORD dwCreationFlags, -- LPDWORD lpThreadId -- ) { -- -- // a thread handle would actually contain an event -- // the event would mark if the thread is running or not. it will be used in the Wait functions. -- HANDLE h = CreateEvent(NULL, TRUE, FALSE, NULL); -- h->ChangeType(CXHandle::HND_THREAD); --#ifdef __APPLE__ -- h->m_machThreadPort = MACH_PORT_NULL; --#endif -- pthread_attr_t attr; -- pthread_attr_init(&attr); -- if (dwStackSize > PTHREAD_STACK_MIN) -- pthread_attr_setstacksize(&attr, dwStackSize); -- if (pthread_create(&(h->m_hThread), &attr, (void*(*)(void*))lpStartAddress, lpParameter) == 0) -- h->m_threadValid = true; -- else -- { -- CloseHandle(h); -- h = NULL; -- } -- pthread_attr_destroy(&attr); -- -- if (h && lpThreadId) -- // WARNING: This can truncate thread IDs on x86_64. -- *lpThreadId = (DWORD)h->m_hThread; -- return h; --} -- -- --#if 0 // Deprecated, use CThread::GetCurrentThreadId() instead --DWORD WINAPI GetCurrentThreadId(void) { -- // WARNING: This can truncate thread IDs on x86_64. -- return (DWORD)pthread_self(); --} --#endif -- --HANDLE WINAPI GetCurrentThread(void) { -- return (HANDLE)-1; // -1 a special value - pseudo handle --} -- --HANDLE WINAPI GetCurrentProcess(void) { -- return (HANDLE)-1; // -1 a special value - pseudo handle --} -- --HANDLE _beginthreadex( -- void *security, -- unsigned stack_size, -- int ( *start_address )( void * ), -- void *arglist, -- unsigned initflag, -- unsigned *thrdaddr --) { -- -- HANDLE h = CreateThread(NULL, stack_size, start_address, arglist, initflag, (LPDWORD)thrdaddr); -- return h; -- --} -- --uintptr_t _beginthread( -- void( *start_address )( void * ), -- unsigned stack_size, -- void *arglist --) { -- HANDLE h = CreateThread(NULL, stack_size, (LPTHREAD_START_ROUTINE)start_address, arglist, 0, NULL); -- return (uintptr_t)h; --} -- --BOOL WINAPI GetThreadTimes ( -- HANDLE hThread, -- LPFILETIME lpCreationTime, -- LPFILETIME lpExitTime, -- LPFILETIME lpKernelTime, -- LPFILETIME lpUserTime --) { -- if (!hThread) -- return false; -- if (!hThread->m_threadValid) -- return false; -- -- if (hThread == (HANDLE)-1) { -- if (lpCreationTime) -- TimeTToFileTime(0,lpCreationTime); -- if (lpExitTime) -- TimeTToFileTime(time(NULL),lpExitTime); -- if (lpKernelTime) -- TimeTToFileTime(0,lpKernelTime); -- if (lpUserTime) -- TimeTToFileTime(0,lpUserTime); -- -- return true; -- } -- -- if (lpCreationTime) -- TimeTToFileTime(hThread->m_tmCreation,lpCreationTime); -- if (lpExitTime) -- TimeTToFileTime(time(NULL),lpExitTime); -- if (lpKernelTime) -- TimeTToFileTime(0,lpKernelTime); -- --#ifdef __APPLE__ -- thread_info_data_t threadInfo; -- mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX; -- -- if (hThread->m_machThreadPort == MACH_PORT_NULL) -- hThread->m_machThreadPort = pthread_mach_thread_np(hThread->m_hThread); -- -- kern_return_t ret = thread_info(hThread->m_machThreadPort, THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount); -- if (ret == KERN_SUCCESS) -- { -- thread_basic_info_t threadBasicInfo = (thread_basic_info_t)threadInfo; -- -- if (lpUserTime) -- { -- // User time. -- unsigned long long time = ((__int64)threadBasicInfo->user_time.seconds * 10000000L) + threadBasicInfo->user_time.microseconds*10L; -- lpUserTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpUserTime->dwHighDateTime = (time >> 32); -- } -- -- if (lpKernelTime) -- { -- // System time. -- unsigned long long time = ((__int64)threadBasicInfo->system_time.seconds * 10000000L) + threadBasicInfo->system_time.microseconds*10L; -- lpKernelTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpKernelTime->dwHighDateTime = (time >> 32); -- } -- } -- else -- { -- if (lpUserTime) -- lpUserTime->dwLowDateTime = lpUserTime->dwHighDateTime = 0; -- -- if (lpKernelTime) -- lpKernelTime->dwLowDateTime = lpKernelTime->dwHighDateTime = 0; -- } --#elif _POSIX_THREAD_CPUTIME != -1 -- if(lpUserTime) -- { -- lpUserTime->dwLowDateTime = 0; -- lpUserTime->dwHighDateTime = 0; -- clockid_t clock; -- if (pthread_getcpuclockid(hThread->m_hThread, &clock) == 0) -- { -- struct timespec tp = {}; -- clock_gettime(clock, &tp); -- unsigned long long time = (unsigned long long)tp.tv_sec * 10000000 + (unsigned long long)tp.tv_nsec/100; -- lpUserTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpUserTime->dwHighDateTime = (time >> 32); -- } -- } --#else -- if (lpUserTime) -- TimeTToFileTime(0,lpUserTime); --#endif -- return true; --} -- --BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority) --{ -- return true; --} -- --int GetThreadPriority(HANDLE hThread) --{ -- return 0; --} -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScanner.cpp xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp ---- xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-05-14 14:15:12.192221636 +0200 -@@ -57,7 +57,7 @@ - using namespace XFILE; - using namespace MUSIC_GRABBER; - --CMusicInfoScanner::CMusicInfoScanner() -+CMusicInfoScanner::CMusicInfoScanner() : CThread("CMusicInfoScanner") - { - m_bRunning = false; - m_pObserver = NULL; -@@ -99,7 +99,7 @@ - - // Create the thread to count all files to be scanned - SetPriority( GetMinPriority() ); -- CThread fileCountReader(this); -+ CThread fileCountReader(this, "CMusicInfoScanner"); - if (m_pObserver) - fileCountReader.Create(); - -diff -Naur xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScraper.cpp xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp ---- xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-05-14 14:15:12.192221636 +0200 -@@ -28,7 +28,7 @@ - using namespace ADDON; - using namespace std; - --CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr &scraper) -+CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr &scraper) : CThread("CMusicInfoScraper") - { - m_bSucceeded=false; - m_bCanceled=false; -diff -Naur xbmc-pvr-11.0.1/xbmc/music/LastFmManager.cpp xbmc-pvr-11.0.1.patch/xbmc/music/LastFmManager.cpp ---- xbmc-pvr-11.0.1/xbmc/music/LastFmManager.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/LastFmManager.cpp 2012-05-14 14:15:12.193221656 +0200 -@@ -70,7 +70,7 @@ - - CLastFmManager* CLastFmManager::m_pInstance=NULL; - --CLastFmManager::CLastFmManager() -+CLastFmManager::CLastFmManager() : CThread("CLastFmManager") - { - m_RadioTrackQueue = new CPlayList; - } -@@ -534,7 +534,7 @@ - if (iNrCachedTracks == 0) - { - //get more tracks -- if (ThreadHandle() != NULL) -+ if (IsRunning()) - { - m_hWorkerEvent.Set(); - } -@@ -633,7 +633,7 @@ - { - m_RadioSession = ""; - } -- if (m_ThreadHandle) -+ if (IsRunning()) - { - m_bStop = true; - m_hWorkerEvent.Set(); -diff -Naur xbmc-pvr-11.0.1/xbmc/network/AirPlayServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/AirPlayServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/AirPlayServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/AirPlayServer.cpp 2012-05-14 14:15:12.194221676 +0200 -@@ -184,7 +184,7 @@ - } - } - --CAirPlayServer::CAirPlayServer(int port, bool nonlocal) -+CAirPlayServer::CAirPlayServer(int port, bool nonlocal) : CThread("AirPlayServer") - { - m_port = port; - m_nonlocal = nonlocal; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/AirTunesServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/AirTunesServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/AirTunesServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/AirTunesServer.cpp 2012-05-14 14:15:12.195221696 +0200 -@@ -292,7 +292,7 @@ - } - } - --CAirTunesServer::CAirTunesServer(int port, bool nonlocal) -+CAirTunesServer::CAirTunesServer(int port, bool nonlocal) : CThread("CAirTunesServer") - { - m_port = port; - m_pLibShairport = new DllLibShairport(); -diff -Naur xbmc-pvr-11.0.1/xbmc/network/libscrobbler/scrobbler.cpp xbmc-pvr-11.0.1.patch/xbmc/network/libscrobbler/scrobbler.cpp ---- xbmc-pvr-11.0.1/xbmc/network/libscrobbler/scrobbler.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/libscrobbler/scrobbler.cpp 2012-05-14 14:15:12.196221716 +0200 -@@ -46,7 +46,7 @@ - #define SCROBBLER_ACTION_NOWPLAYING 2 - - CScrobbler::CScrobbler(const CStdString &strHandshakeURL, const CStdString &strLogPrefix) -- : CThread() -+ : CThread("CScrobbler") - { - m_bBanned = false; - m_bBadAuth = false; -@@ -67,7 +67,7 @@ - ResetState(); - LoadCredentials(); - LoadJournal(); -- if (!ThreadHandle()) -+ if (!IsRunning()) - Create(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/network/Network.h xbmc-pvr-11.0.1.patch/xbmc/network/Network.h ---- xbmc-pvr-11.0.1/xbmc/network/Network.h 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/Network.h 2012-05-14 14:15:12.197221736 +0200 -@@ -24,6 +24,7 @@ - - #include - #include "utils/StdString.h" -+#include "system.h" - - enum EncMode { ENC_NONE = 0, ENC_WEP = 1, ENC_WPA = 2, ENC_WPA2 = 3 }; - enum NetworkAssignment { NETWORK_DASH = 0, NETWORK_DHCP = 1, NETWORK_STATIC = 2, NETWORK_DISABLED = 3 }; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/TCPServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/TCPServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/TCPServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/TCPServer.cpp 2012-05-14 14:15:12.197221736 +0200 -@@ -85,7 +85,7 @@ - } - } - --CTCPServer::CTCPServer(int port, bool nonlocal) -+CTCPServer::CTCPServer(int port, bool nonlocal) : CThread("CTCPServer") - { - m_port = port; - m_nonlocal = nonlocal; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/UdpClient.cpp xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.cpp ---- xbmc-pvr-11.0.1/xbmc/network/UdpClient.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.cpp 2012-05-14 14:15:12.198221756 +0200 -@@ -35,7 +35,7 @@ - - #define UDPCLIENT_DEBUG_LEVEL LOGDEBUG - --CUdpClient::CUdpClient(void) : CThread() -+CUdpClient::CUdpClient(void) : CThread("CUdpClient") - {} - - CUdpClient::~CUdpClient(void) -diff -Naur xbmc-pvr-11.0.1/xbmc/network/UdpClient.h xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.h ---- xbmc-pvr-11.0.1/xbmc/network/UdpClient.h 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.h 2012-05-14 14:15:12.199221776 +0200 -@@ -25,6 +25,7 @@ - #include "threads/CriticalSection.h" - #include - #include -+#include "system.h" - - class CUdpClient : CThread - { -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-05-14 14:15:12.199221776 +0200 -@@ -19,6 +19,7 @@ - * - */ - -+#include "system.h" - #include "Peripherals.h" - #include "bus/PeripheralBus.h" - #include "devices/PeripheralBluetooth.h" -diff -Naur xbmc-pvr-11.0.1/xbmc/pictures/GUIWindowSlideShow.cpp xbmc-pvr-11.0.1.patch/xbmc/pictures/GUIWindowSlideShow.cpp ---- xbmc-pvr-11.0.1/xbmc/pictures/GUIWindowSlideShow.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/pictures/GUIWindowSlideShow.cpp 2012-05-14 14:15:12.201221817 +0200 -@@ -67,7 +67,7 @@ - - static float zoomamount[10] = { 1.0f, 1.2f, 1.5f, 2.0f, 2.8f, 4.0f, 6.0f, 9.0f, 13.5f, 20.0f }; - --CBackgroundPicLoader::CBackgroundPicLoader() -+CBackgroundPicLoader::CBackgroundPicLoader() : CThread("CBackgroundPicLoader") - { - m_pCallback = NULL; - m_isLoading = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/rendering/dx/RenderSystemDX.cpp xbmc-pvr-11.0.1.patch/xbmc/rendering/dx/RenderSystemDX.cpp ---- xbmc-pvr-11.0.1/xbmc/rendering/dx/RenderSystemDX.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/rendering/dx/RenderSystemDX.cpp 2012-05-14 14:15:12.202221838 +0200 -@@ -569,7 +569,7 @@ - - //CVideoReferenceClock polls GetRasterStatus too, - //polling it from two threads at the same time is bad -- if (g_advancedSettings.m_sleepBeforeFlip > 0 && g_VideoReferenceClock.ThreadHandle() == NULL) -+ if (g_advancedSettings.m_sleepBeforeFlip > 0 && !g_VideoReferenceClock.IsRunning()) - { - //save current thread priority and set thread priority to THREAD_PRIORITY_TIME_CRITICAL - int priority = GetThreadPriority(GetCurrentThread()); -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.cpp 2012-05-14 14:15:12.203221858 +0200 -@@ -96,12 +96,18 @@ - m_videoAllowMpeg4VAAPI = false; - m_videoDisableBackgroundDeinterlace = false; - m_videoCaptureUseOcclusionQuery = -1; //-1 is auto detect -+ m_videoVDPAUdeintHD = -1; -+ m_videoVDPAUdeintSD = -1; -+ m_videoVDPAUtelecine = false; -+ m_videoVDPAUmaxHeight = -1; -+ m_videoVDPAUdeintSkipChromaHD = false; - m_DXVACheckCompatibility = false; - m_DXVACheckCompatibilityPresent = false; - m_DXVAForceProcessorRenderer = true; - m_DXVANoDeintProcForProgressive = false; - m_videoFpsDetect = 1; - m_videoDefaultLatency = 0.0; -+ m_vblankPolling = false; - - m_musicUseTimeSeeking = true; - m_musicTimeSeekForward = 10; -@@ -470,6 +476,11 @@ - XMLUtils::GetBoolean(pElement,"allowmpeg4vaapi",m_videoAllowMpeg4VAAPI); - XMLUtils::GetBoolean(pElement, "disablebackgrounddeinterlace", m_videoDisableBackgroundDeinterlace); - XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1); -+ XMLUtils::GetInt(pElement,"vdpauHDdeint",m_videoVDPAUdeintHD); -+ XMLUtils::GetInt(pElement,"vdpauSDdeint",m_videoVDPAUdeintSD); -+ XMLUtils::GetInt(pElement,"vdpauMaxHeight",m_videoVDPAUmaxHeight); -+ XMLUtils::GetBoolean(pElement,"vdpauInvTelecine",m_videoVDPAUtelecine); -+ XMLUtils::GetBoolean(pElement,"vdpauHDdeintSkipChroma",m_videoVDPAUdeintSkipChromaHD); - - TiXmlElement* pAdjustRefreshrate = pElement->FirstChildElement("adjustrefreshrate"); - if (pAdjustRefreshrate) -@@ -559,6 +570,8 @@ - //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps - XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2); - -+ XMLUtils::GetBoolean(pElement,"vblankpolling", m_vblankPolling); -+ - // Store global display latency settings - TiXmlElement* pVideoLatency = pElement->FirstChildElement("latency"); - if (pVideoLatency) -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.h xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.h ---- xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.h 2012-05-14 14:15:12.204221878 +0200 -@@ -111,6 +111,11 @@ - int m_videoPercentSeekBackwardBig; - CStdString m_videoPPFFmpegDeint; - CStdString m_videoPPFFmpegPostProc; -+ int m_videoVDPAUdeintHD; -+ int m_videoVDPAUdeintSD; -+ bool m_videoVDPAUtelecine; -+ int m_videoVDPAUmaxHeight; -+ bool m_videoVDPAUdeintSkipChromaHD; - bool m_musicUseTimeSeeking; - int m_musicTimeSeekForward; - int m_musicTimeSeekBackward; -@@ -143,6 +148,7 @@ - bool m_DXVAForceProcessorRenderer; - bool m_DXVANoDeintProcForProgressive; - int m_videoFpsDetect; -+ bool m_vblankPolling; - - CStdString m_videoDefaultPlayer; - CStdString m_videoDefaultDVDPlayer; -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/GUISettings.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/GUISettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/GUISettings.cpp 2012-05-14 14:15:12.205221898 +0200 -@@ -588,10 +588,15 @@ - - #ifdef HAVE_LIBVDPAU - AddBool(vp, "videoplayer.usevdpau", 13425, true); -+ AddBool(vp, "videoplayer.usevdpauinteroprgb", 13433, true); -+ AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); - #endif - #ifdef HAVE_LIBVA - AddBool(vp, "videoplayer.usevaapi", 13426, true); - #endif -+#ifdef HAVE_LIBXVBA -+ AddBool(vp, "videoplayer.usexvba", 13435, true); -+#endif - #ifdef HAS_DX - AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false); - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-05-14 14:15:12.207221938 +0200 -@@ -557,6 +557,40 @@ - pControl->SetEnabled(true); - } - } -+ else if (strSetting.Equals("videoplayer.usevdpauinteropyuv")) -+ { -+ bool hasInterop = false; -+#ifdef GL_NV_vdpau_interop -+ hasInterop = true; -+#endif -+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); -+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ pControl->SetEnabled(true); -+ } -+ else -+ { -+ pControl->SetEnabled(false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); -+ } -+ } -+ else if (strSetting.Equals("videoplayer.usevdpauinteroprgb")) -+ { -+ bool hasInterop = false; -+#ifdef GL_NV_vdpau_interop -+ hasInterop = true; -+#endif -+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); -+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ pControl->SetEnabled(true); -+ } -+ else -+ { -+ pControl->SetEnabled(false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); -+ } -+ } - else - #endif - if (strSetting.Equals("videoscreen.resolution")) -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/VideoSettings.h xbmc-pvr-11.0.1.patch/xbmc/settings/VideoSettings.h ---- xbmc-pvr-11.0.1/xbmc/settings/VideoSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/VideoSettings.h 2012-05-14 14:15:12.208221958 +0200 -@@ -66,6 +66,8 @@ - VS_INTERLACEMETHOD_SW_BLEND = 20, - VS_INTERLACEMETHOD_AUTO_ION = 21, - -+ VS_INTERLACEMETHOD_XVBA = 22, -+ - VS_INTERLACEMETHOD_MAX // do not use and keep as last enum value. - }; - -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 2012-05-14 14:15:12.208221958 +0200 -@@ -0,0 +1,47 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return 96; -+} -+ -+bool CThread::SetPrioritySched_RR(int iPriority) -+{ -+ // Changing to SCHED_RR is safe under OSX, you don't need elevated privileges and the -+ // OSX scheduler will monitor SCHED_RR threads and drop to SCHED_OTHER if it detects -+ // the thread running away. OSX automatically does this with the CoreAudio audio -+ // device handler thread. -+ int32_t result; -+ thread_extended_policy_data_t theFixedPolicy; -+ -+ // make thread fixed, set to 'true' for a non-fixed thread -+ theFixedPolicy.timeshare = false; -+ result = thread_policy_set(pthread_mach_thread_np(ThreadId()), THREAD_EXTENDED_POLICY, -+ (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT); -+ -+ int policy; -+ struct sched_param param; -+ result = pthread_getschedparam(ThreadId(), &policy, ¶m ); -+ // change from default SCHED_OTHER to SCHED_RR -+ policy = SCHED_RR; -+ result = pthread_setschedparam(ThreadId(), policy, ¶m ); -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/linux/ThreadSchedImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 2012-05-14 14:15:12.209221978 +0200 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return GetNormalPriority(); -+} -+ -+bool CThread::SetPrioritySched_RR(int iPriority) -+{ -+ return false; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp 2012-05-14 14:15:12.210221998 +0200 -@@ -0,0 +1,220 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+ -+void CThread::Create(bool bAutoDelete, unsigned stacksize) -+{ -+ if (m_ThreadId != 0) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread- old thread id not null", __FUNCTION__); -+ exit(1); -+ } -+ m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -+ m_iLastUsage = 0; -+ m_fLastUsage = 0.0f; -+ m_bAutoDelete = bAutoDelete; -+ m_bStop = false; -+ m_StopEvent.Reset(); -+ m_TermEvent.Reset(); -+ m_StartEvent.Reset(); -+ -+ pthread_attr_t attr; -+ pthread_attr_init(&attr); -+ if (stacksize > PTHREAD_STACK_MIN) -+ pthread_attr_setstacksize(&attr, stacksize); -+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); -+ if (pthread_create(&m_ThreadId, &attr, (void*(*)(void*))staticThread, this) != 0) -+ { -+ CLog::Log(LOGNOTICE, "%s - fatal error creating thread",__FUNCTION__); -+ } -+ pthread_attr_destroy(&attr); -+} -+ -+void CThread::TermHandler() -+{ -+ -+} -+ -+void CThread::SetThreadInfo() -+{ -+ m_ThreadOpaque.LwpId = syscall(SYS_gettid); -+ -+ // start thread with nice level of appication -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ if (setpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId, appNice) != 0) -+ CLog::Log(LOGERROR, "%s: error %s", __FUNCTION__, strerror(errno)); -+} -+ -+ThreadIdentifier CThread::GetCurrentThreadId() -+{ -+ return pthread_self(); -+} -+ -+bool CThread::IsCurrentThread(const ThreadIdentifier tid) -+{ -+ return pthread_equal(pthread_self(), tid); -+} -+ -+int CThread::GetMinPriority(void) -+{ -+ // one level lower than application -+ return -1; -+} -+ -+int CThread::GetMaxPriority(void) -+{ -+ // one level higher than application -+ return 1; -+} -+ -+int CThread::GetNormalPriority(void) -+{ -+ // same level as application -+ return 0; -+} -+ -+bool CThread::SetPriority(const int iPriority) -+{ -+ bool bReturn = false; -+ -+ // wait until thread is running, it needs to get its lwp id -+ m_StartEvent.Wait(); -+ -+ CSingleLock lock(m_CriticalSection); -+ -+ // get min prio for SCHED_RR -+ int minRR = GetMaxPriority() + 1; -+ -+ if (!m_ThreadId) -+ bReturn = false; -+ else if (iPriority >= minRR) -+ bReturn = SetPrioritySched_RR(iPriority); -+ else -+ { -+ // get user max prio -+ struct rlimit limit; -+ int userMaxPrio; -+ if (getrlimit(RLIMIT_NICE, &limit) == 0) -+ { -+ userMaxPrio = limit.rlim_cur - 20; -+ } -+ else -+ userMaxPrio = 0; -+ -+ // keep priority in bounds -+ int prio = iPriority; -+ if (prio >= GetMaxPriority()) -+ prio = std::min(GetMaxPriority(), userMaxPrio); -+ if (prio < GetMinPriority()) -+ prio = GetMinPriority(); -+ -+ // nice level of application -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ if (prio) -+ prio = prio > 0 ? appNice-1 : appNice+1; -+ -+ if (setpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId, prio) == 0) -+ bReturn = true; -+ else -+ CLog::Log(LOGERROR, "%s: error %s", __FUNCTION__, strerror(errno)); -+ } -+ -+ return bReturn; -+} -+ -+int CThread::GetPriority() -+{ -+ int iReturn; -+ -+ // lwp id is valid after start signel has fired -+ m_StartEvent.Wait(); -+ -+ CSingleLock lock(m_CriticalSection); -+ -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ int prio = getpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId); -+ iReturn = appNice - prio; -+ -+ return iReturn; -+} -+ -+bool CThread::WaitForThreadExit(unsigned int milliseconds) -+{ -+ bool bReturn = m_TermEvent.WaitMSec(milliseconds); -+ -+ return bReturn; -+} -+ -+int64_t CThread::GetAbsoluteUsage() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ if (!m_ThreadId) -+ return 0; -+ -+ clockid_t clock; -+ int64_t time = 0; -+ if (pthread_getcpuclockid(m_ThreadId, &clock) == 0) -+ { -+ struct timespec tp; -+ clock_gettime(clock, &tp); -+ time = (int64_t)tp.tv_sec * 10000000 + tp.tv_nsec/100; -+ } -+ return time; -+} -+ -+float CThread::GetRelativeUsage() -+{ -+ unsigned int iTime = XbmcThreads::SystemClockMillis(); -+ iTime *= 10000; // convert into 100ns tics -+ -+ // only update every 1 second -+ if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -+ -+ int64_t iUsage = GetAbsoluteUsage(); -+ -+ if (m_iLastUsage > 0 && m_iLastTime > 0) -+ m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -+ -+ m_iLastUsage = iUsage; -+ m_iLastTime = iTime; -+ -+ return m_fLastUsage; -+} -+ -+int64_t CThread::GetCurrentThreadUsage() -+{ -+ pthread_t tid = pthread_self(); -+ clockid_t clock; -+ int64_t time = 0; -+ if (pthread_getcpuclockid(tid, &clock) == 0) -+ { -+ struct timespec tp; -+ clock_gettime(clock, &tp); -+ time = (int64_t)tp.tv_sec * 10000000 + tp.tv_nsec/100; -+ } -+ return time; -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-05-14 14:15:12.210221998 +0200 -@@ -0,0 +1,39 @@ -+/* -+* Copyright (C) 2005-2011 Team XBMC -+* http://www.xbmc.org -+* -+* 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, 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 XBMC; see the file COPYING. If not, write to -+* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+* http://www.gnu.org/copyleft/gpl.html -+* -+*/ -+ -+#pragma once -+ -+#include -+ -+struct threadOpaque -+{ -+ pid_t LwpId; -+}; -+ -+typedef pthread_t ThreadIdentifier; -+typedef threadOpaque ThreadOpaque; -+typedef int THREADFUNC; -+ -+namespace XbmcThreads -+{ -+ inline static void ThreadSleep(unsigned int millis) { usleep(millis*1000); } -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.cpp 2012-05-14 14:15:12.211222019 +0200 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#pragma once -+ -+#if (defined TARGET_POSIX) -+#include "threads/platform/pthreads/ThreadImpl.cpp" -+#if defined(TARGET_DARWIN_IOS) -+#include "threads/platform/darwin/ThreadSchedImpl.cpp" -+#else -+#include "threads/platform/linux/ThreadSchedImpl.cpp" -+#endif -+#elif (defined TARGET_WINDOWS) -+#include "threads/platform/win/ThreadImpl.cpp" -+#endif -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.h 2012-05-14 14:15:12.211222019 +0200 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#pragma once -+ -+#if (defined TARGET_POSIX) -+#include "threads/platform/pthreads/ThreadImpl.h" -+#elif (defined TARGET_WINDOWS) -+#include "threads/platform/win/ThreadImpl.h" -+#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.cpp 2012-05-14 14:15:12.212222039 +0200 -@@ -0,0 +1,207 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include -+ -+ -+void CThread::Create(bool bAutoDelete, unsigned stacksize) -+{ -+ if (m_ThreadId != 0) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread- old thread id not null", __FUNCTION__); -+ exit(1); -+ } -+ m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -+ m_iLastUsage = 0; -+ m_fLastUsage = 0.0f; -+ m_bAutoDelete = bAutoDelete; -+ m_bStop = false; -+ m_StopEvent.Reset(); -+ m_TermEvent.Reset(); -+ m_StartEvent.Reset(); -+ -+ m_ThreadOpaque.handle = CreateThread(NULL,stacksize, (LPTHREAD_START_ROUTINE)&staticThread, this, 0, &m_ThreadId); -+ if (m_ThreadOpaque.handle == NULL) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread", __FUNCTION__); -+ } -+} -+ -+void CThread::TermHandler() -+{ -+ CloseHandle(m_ThreadOpaque.handle); -+ m_ThreadOpaque.handle = NULL; -+} -+ -+void CThread::SetThreadInfo() -+{ -+ const unsigned int MS_VC_EXCEPTION = 0x406d1388; -+ struct THREADNAME_INFO -+ { -+ DWORD dwType; // must be 0x1000 -+ LPCSTR szName; // pointer to name (in same addr space) -+ DWORD dwThreadID; // thread ID (-1 caller thread) -+ DWORD dwFlags; // reserved for future use, most be zero -+ } info; -+ -+ info.dwType = 0x1000; -+ info.szName = m_ThreadName.c_str(); -+ info.dwThreadID = m_ThreadId; -+ info.dwFlags = 0; -+ -+ try -+ { -+ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); -+ } -+ catch(...) -+ { -+ } -+} -+ -+ThreadIdentifier CThread::GetCurrentThreadId() -+{ -+ return ::GetCurrentThreadId(); -+} -+ -+bool CThread::IsCurrentThread(const ThreadIdentifier tid) -+{ -+ return (::GetCurrentThreadId() == tid); -+} -+ -+int CThread::GetMinPriority(void) -+{ -+ return(THREAD_PRIORITY_IDLE); -+} -+ -+int CThread::GetMaxPriority(void) -+{ -+ return(THREAD_PRIORITY_HIGHEST); -+} -+ -+int CThread::GetNormalPriority(void) -+{ -+ return(THREAD_PRIORITY_NORMAL); -+} -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return GetNormalPriority(); -+} -+ -+bool CThread::SetPriority(const int iPriority) -+{ -+ bool bReturn = false; -+ -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadOpaque.handle) -+ { -+ bReturn = SetThreadPriority(m_ThreadOpaque.handle, iPriority) == TRUE; -+ } -+ -+ return bReturn; -+} -+ -+int CThread::GetPriority() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ int iReturn = THREAD_PRIORITY_NORMAL; -+ if (m_ThreadOpaque.handle) -+ { -+ iReturn = GetThreadPriority(m_ThreadOpaque.handle); -+ } -+ return iReturn; -+} -+ -+bool CThread::WaitForThreadExit(unsigned int milliseconds) -+{ -+ bool bReturn = true; -+ -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadId && m_ThreadOpaque.handle != NULL) -+ { -+ // boost priority of thread we are waiting on to same as caller -+ int callee = GetThreadPriority(m_ThreadOpaque.handle); -+ int caller = GetThreadPriority(GetCurrentThread()); -+ if(caller > callee) -+ SetThreadPriority(m_ThreadOpaque.handle, caller); -+ -+ lock.Leave(); -+ bReturn = m_TermEvent.WaitMSec(milliseconds); -+ lock.Enter(); -+ -+ // restore thread priority if thread hasn't exited -+ if(caller > callee && m_ThreadOpaque.handle) -+ SetThreadPriority(m_ThreadOpaque.handle, callee); -+ } -+ return bReturn; -+} -+ -+int64_t CThread::GetAbsoluteUsage() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ if (!m_ThreadOpaque.handle) -+ return 0; -+ -+ uint64_t time = 0; -+ FILETIME CreationTime, ExitTime, UserTime, KernelTime; -+ if( GetThreadTimes(m_ThreadOpaque.handle, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -+ { -+ time = (((uint64_t)UserTime.dwHighDateTime) << 32) + ((uint64_t)UserTime.dwLowDateTime); -+ time += (((uint64_t)KernelTime.dwHighDateTime) << 32) + ((uint64_t)KernelTime.dwLowDateTime); -+ } -+ return time; -+} -+ -+float CThread::GetRelativeUsage() -+{ -+ unsigned int iTime = XbmcThreads::SystemClockMillis(); -+ iTime *= 10000; // convert into 100ns tics -+ -+ // only update every 1 second -+ if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -+ -+ int64_t iUsage = GetAbsoluteUsage(); -+ -+ if (m_iLastUsage > 0 && m_iLastTime > 0) -+ m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -+ -+ m_iLastUsage = iUsage; -+ m_iLastTime = iTime; -+ -+ return m_fLastUsage; -+} -+ -+int64_t CThread::GetCurrentThreadUsage() -+{ -+ HANDLE h = GetCurrentThread(); -+ -+ uint64_t time = 0; -+ FILETIME CreationTime, ExitTime, UserTime, KernelTime; -+ if( GetThreadTimes(h, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -+ { -+ time = (((uint64_t)UserTime.dwHighDateTime) << 32) + ((uint64_t)UserTime.dwLowDateTime); -+ time += (((uint64_t)KernelTime.dwHighDateTime) << 32) + ((uint64_t)KernelTime.dwLowDateTime); -+ } -+ return time; -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.h 2012-05-14 14:15:12.212222039 +0200 -@@ -0,0 +1,40 @@ -+/* -+* Copyright (C) 2005-2011 Team XBMC -+* http://www.xbmc.org -+* -+* 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, 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 XBMC; see the file COPYING. If not, write to -+* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+* http://www.gnu.org/copyleft/gpl.html -+* -+*/ -+ -+#pragma once -+ -+#include -+ -+ -+struct threadOpaque -+{ -+ HANDLE handle; -+}; -+ -+typedef DWORD ThreadIdentifier; -+typedef threadOpaque ThreadOpaque; -+typedef DWORD THREADFUNC; -+ -+namespace XbmcThreads -+{ -+ inline static void ThreadSleep(unsigned int millis) { Sleep(millis); } -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/Thread.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/Thread.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.cpp 2012-05-14 14:15:12.214222079 +0200 -@@ -20,41 +20,27 @@ - - #include "threads/SystemClock.h" - #include "Thread.h" --#ifndef _LINUX --#include --#include "utils/win32exception.h" --#ifndef _MT --#pragma message( "Please compile using multithreaded run-time libraries" ) --#endif --typedef unsigned (WINAPI *PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter); --#else --#include "PlatformInclude.h" --#include "XHandle.h" --#include --typedef int (*PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter); --#endif -- --#if defined(__GNUC__) && !defined(__clang__) --#include --using namespace __cxxabiv1; --#endif -- - #include "utils/log.h" - #include "utils/TimeUtils.h" - #include "threads/ThreadLocal.h" - -+#define __STDC_FORMAT_MACROS -+#include -+ - static XbmcThreads::ThreadLocal currentThread; - -+#include "threads/platform/ThreadImpl.cpp" -+ - ////////////////////////////////////////////////////////////////////// - // Construction/Destruction - ////////////////////////////////////////////////////////////////////// - --CThread::CThread(const char* ThreadName) : m_StopEvent(true,true) -+CThread::CThread(const char* ThreadName) -+: m_StopEvent(true,true), m_TermEvent(true), m_StartEvent(true) - { - m_bStop = false; - - m_bAutoDelete = false; -- m_ThreadHandle = NULL; - m_ThreadId = 0; - m_iLastTime = 0; - m_iLastUsage = 0; -@@ -66,12 +52,12 @@ - m_ThreadName = ThreadName; - } - --CThread::CThread(IRunnable* pRunnable, const char* ThreadName) : m_StopEvent(true,true) -+CThread::CThread(IRunnable* pRunnable, const char* ThreadName) -+: m_StopEvent(true,true), m_TermEvent(true), m_StartEvent(true) - { - m_bStop = false; - - m_bAutoDelete = false; -- m_ThreadHandle = NULL; - m_ThreadId = 0; - m_iLastTime = 0; - m_iLastUsage = 0; -@@ -85,171 +71,62 @@ - - CThread::~CThread() - { -- if (m_ThreadHandle != NULL) -- { -- CloseHandle(m_ThreadHandle); -- } -- m_ThreadHandle = NULL; -- -+ StopThread(); - } - --#ifndef _WIN32 --void CThread::term_handler (int signum) -+bool CThread::IsRunning() - { -- CLog::Log(LOGERROR,"thread 0x%lx (%lu) got signal %d. calling OnException and terminating thread abnormally.", (long unsigned int)pthread_self(), (long unsigned int)pthread_self(), signum); -- -- CThread* curThread = currentThread.get(); -- if (curThread) -- { -- curThread->m_bStop = TRUE; -- curThread->m_StopEvent.Set(); -- -- curThread->OnException(); -- if( curThread->IsAutoDelete() ) -- delete curThread; -- } -- -- pthread_exit(NULL); -+ return m_ThreadId ? true : false; - } - --int CThread::staticThread(void* data) --#else --DWORD WINAPI CThread::staticThread(LPVOID* data) --#endif -+THREADFUNC CThread::staticThread(void* data) - { - CThread* pThread = (CThread*)(data); -+ std::string name; -+ ThreadIdentifier id; -+ bool autodelete; -+ - if (!pThread) { - CLog::Log(LOGERROR,"%s, sanity failed. thread is NULL.",__FUNCTION__); - return 1; - } - -- if (pThread->m_ThreadName.empty()) -- pThread->m_ThreadName = pThread->GetTypeName(); -- pThread->SetDebugCallStackName(pThread->m_ThreadName.c_str()); -+ name = pThread->m_ThreadName; -+ id = pThread->m_ThreadId; -+ autodelete = pThread->m_bAutoDelete; - -- CLog::Log(LOGDEBUG,"Thread %s start, auto delete: %d", pThread->m_ThreadName.c_str(), pThread->IsAutoDelete()); -+ pThread->SetThreadInfo(); -+ -+ CLog::Log(LOGNOTICE,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false")); - - currentThread.set(pThread); --#ifndef _LINUX -- /* install win32 exception translator */ -- win32_exception::install_handler(); --#else -- struct sigaction action; -- action.sa_handler = term_handler; -- sigemptyset (&action.sa_mask); -- action.sa_flags = 0; -- //sigaction (SIGABRT, &action, NULL); -- //sigaction (SIGSEGV, &action, NULL); --#endif -+ pThread->m_StartEvent.Set(); - -+ pThread->OnStartup(); -+ pThread->Process(); -+ pThread->OnExit(); - -- try -- { -- pThread->OnStartup(); -- } --#ifndef _LINUX -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- if( pThread->IsAutoDelete() ) -- { -- delete pThread; -- _endthreadex(123); -- return 0; -- } -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread startup, aborting. auto delete: %d", __FUNCTION__, pThread->m_ThreadName.c_str(), pThread->IsAutoDelete()); -- if( pThread->IsAutoDelete() ) -- { -- delete pThread; --#ifndef _LINUX -- _endthreadex(123); --#endif -- return 0; -- } -- } -+ // lock during termination -+ CSingleLock lock(pThread->m_CriticalSection); - -- try -- { -- pThread->Process(); -- } --#ifndef _LINUX -- catch (const access_violation &e) -- { -- e.writelog(__FUNCTION__); -- } -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread process, attemping cleanup in OnExit", __FUNCTION__, pThread->m_ThreadName.c_str()); -- } -+ pThread->m_ThreadId = 0; -+ pThread->m_TermEvent.Set(); -+ pThread->TermHandler(); - -- try -- { -- pThread->OnExit(); -- } --#ifndef _LINUX -- catch (const access_violation &e) -- { -- e.writelog(__FUNCTION__); -- } -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread exit", __FUNCTION__, pThread->m_ThreadName.c_str()); -- } -+ lock.Leave(); - -- if ( pThread->IsAutoDelete() ) -+ if (autodelete) - { -- CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating (autodelete)", pThread->m_ThreadName.c_str(), (uint64_t)CThread::GetCurrentThreadId()); -+ CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating (autodelete)", name.c_str(), (uint64_t)id); - delete pThread; - pThread = NULL; - } - else -- CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating", pThread->m_ThreadName.c_str(), (uint64_t)CThread::GetCurrentThreadId()); -- --// DXMERGE - this looks like it might have used to have been useful for something... --// g_graphicsContext.DeleteThreadContext(); -+ CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating", name.c_str(), (uint64_t)id); - --#ifndef _LINUX -- _endthreadex(123); --#endif - return 0; - } - --void CThread::Create(bool bAutoDelete, unsigned stacksize) --{ -- if (m_ThreadHandle != NULL) -- { -- throw 1; //ERROR should not b possible!!! -- } -- m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -- m_iLastUsage = 0; -- m_fLastUsage = 0.0f; -- m_bAutoDelete = bAutoDelete; -- m_bStop = false; -- m_StopEvent.Reset(); -- -- m_ThreadHandle = (HANDLE)_beginthreadex(NULL, stacksize, (PBEGINTHREADEX_THREADFUNC)staticThread, (void*)this, 0, &m_ThreadId); -- --#ifdef _LINUX -- if (m_ThreadHandle && m_ThreadHandle->m_threadValid && m_bAutoDelete) -- // FIXME: WinAPI can truncate 64bit pthread ids -- pthread_detach(m_ThreadHandle->m_hThread); --#endif --} -- - bool CThread::IsAutoDelete() const - { - return m_bAutoDelete; -@@ -259,213 +136,17 @@ - { - m_bStop = true; - m_StopEvent.Set(); -- if (m_ThreadHandle && bWait) -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadId && bWait) - { -- WaitForThreadExit(INFINITE); -- CloseHandle(m_ThreadHandle); -- m_ThreadHandle = NULL; -+ lock.Leave(); -+ WaitForThreadExit(0xFFFFFFFF); - } - } - - ThreadIdentifier CThread::ThreadId() const - { --#ifdef _LINUX -- if (m_ThreadHandle && m_ThreadHandle->m_threadValid) -- return m_ThreadHandle->m_hThread; -- else -- return 0; --#else - return m_ThreadId; --#endif --} -- -- --CThread::operator HANDLE() --{ -- return m_ThreadHandle; --} -- --CThread::operator HANDLE() const --{ -- return m_ThreadHandle; --} -- --bool CThread::SetPriority(const int iPriority) --// Set thread priority --// Return true for success --{ -- bool rtn = false; -- -- if (m_ThreadHandle) -- { -- rtn = SetThreadPriority( m_ThreadHandle, iPriority ) == TRUE; -- } -- -- return(rtn); --} -- --void CThread::SetPrioritySched_RR(void) --{ --#ifdef __APPLE__ -- // Changing to SCHED_RR is safe under OSX, you don't need elevated privileges and the -- // OSX scheduler will monitor SCHED_RR threads and drop to SCHED_OTHER if it detects -- // the thread running away. OSX automatically does this with the CoreAudio audio -- // device handler thread. -- int32_t result; -- thread_extended_policy_data_t theFixedPolicy; -- -- // make thread fixed, set to 'true' for a non-fixed thread -- theFixedPolicy.timeshare = false; -- result = thread_policy_set(pthread_mach_thread_np(ThreadId()), THREAD_EXTENDED_POLICY, -- (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT); -- -- int policy; -- struct sched_param param; -- result = pthread_getschedparam(ThreadId(), &policy, ¶m ); -- // change from default SCHED_OTHER to SCHED_RR -- policy = SCHED_RR; -- result = pthread_setschedparam(ThreadId(), policy, ¶m ); --#endif --} -- --int CThread::GetMinPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int min = sched_get_priority_min(policy); -- -- return(min); --#else -- return(THREAD_PRIORITY_IDLE); --#endif --} -- --int CThread::GetMaxPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int max = sched_get_priority_max(policy); -- -- return(max); --#else -- return(THREAD_PRIORITY_HIGHEST); --#endif --} -- --int CThread::GetNormalPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int min = sched_get_priority_min(policy); -- int max = sched_get_priority_max(policy); -- -- return( min + ((max-min) / 2) ); --#else -- return(THREAD_PRIORITY_NORMAL); --#endif --} -- -- --void CThread::SetDebugCallStackName( const char *name ) --{ --#ifdef _WIN32 -- const unsigned int MS_VC_EXCEPTION = 0x406d1388; -- struct THREADNAME_INFO -- { -- DWORD dwType; // must be 0x1000 -- LPCSTR szName; // pointer to name (in same addr space) -- DWORD dwThreadID; // thread ID (-1 caller thread) -- DWORD dwFlags; // reserved for future use, most be zero -- } info; -- -- info.dwType = 0x1000; -- info.szName = name; -- info.dwThreadID = m_ThreadId; -- info.dwFlags = 0; -- -- try -- { -- RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); -- } -- catch(...) -- { -- } --#endif --} -- --// Get the thread name using the implementation dependant typeid() class --// and attempt to clean it. --std::string CThread::GetTypeName(void) --{ -- std::string name = typeid(*this).name(); -- --#if defined(_MSC_VER) -- // Visual Studio 2010 returns the name as "class CThread" etc -- if (name.substr(0, 6) == "class ") -- name = name.substr(6, name.length() - 6); --#elif defined(__GNUC__) && !defined(__clang__) -- // gcc provides __cxa_demangle to demangle the name -- char* demangled = NULL; -- int status; -- -- demangled = __cxa_demangle(name.c_str(), NULL, 0, &status); -- if (status == 0) -- name = demangled; -- else -- CLog::Log(LOGDEBUG,"%s, __cxa_demangle(%s) failed with status %d", __FUNCTION__, name.c_str(), status); -- -- if (demangled) -- free(demangled); --#endif -- -- return name; --} -- --bool CThread::WaitForThreadExit(unsigned int milliseconds) --// Waits for thread to exit, timeout in given number of msec. --// Returns true when thread ended --{ -- if (!m_ThreadHandle) return true; -- --#ifndef _LINUX -- // boost priority of thread we are waiting on to same as caller -- int callee = GetThreadPriority(m_ThreadHandle); -- int caller = GetThreadPriority(GetCurrentThread()); -- if(caller > callee) -- SetThreadPriority(m_ThreadHandle, caller); -- -- if (::WaitForSingleObject(m_ThreadHandle, milliseconds) != WAIT_TIMEOUT) -- return true; -- -- // restore thread priority if thread hasn't exited -- if(caller > callee) -- SetThreadPriority(m_ThreadHandle, callee); --#else -- if (!(m_ThreadHandle->m_threadValid) || pthread_join(m_ThreadHandle->m_hThread, NULL) == 0) -- { -- m_ThreadHandle->m_threadValid = false; -- return true; -- } --#endif -- -- return false; --} -- --HANDLE CThread::ThreadHandle() --{ -- return m_ThreadHandle; - } - - void CThread::Process() -@@ -474,54 +155,14 @@ - m_pRunnable->Run(); - } - --float CThread::GetRelativeUsage() --{ -- unsigned __int64 iTime = XbmcThreads::SystemClockMillis(); -- iTime *= 10000; // convert into 100ns tics -- -- // only update every 1 second -- if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -- -- FILETIME CreationTime, ExitTime, UserTime, KernelTime; -- if( GetThreadTimes( m_ThreadHandle, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -- { -- unsigned __int64 iUsage = 0; -- iUsage += (((unsigned __int64)UserTime.dwHighDateTime) << 32) + ((unsigned __int64)UserTime.dwLowDateTime); -- iUsage += (((unsigned __int64)KernelTime.dwHighDateTime) << 32) + ((unsigned __int64)KernelTime.dwLowDateTime); -- -- if(m_iLastUsage > 0 && m_iLastTime > 0) -- m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -- -- m_iLastUsage = iUsage; -- m_iLastTime = iTime; -- -- return m_fLastUsage; -- } -- return 0.0f; --} -- - bool CThread::IsCurrentThread() const - { - return IsCurrentThread(ThreadId()); - } - -- --ThreadIdentifier CThread::GetCurrentThreadId() -+CThread* CThread::GetCurrentThread() - { --#ifdef _LINUX -- return pthread_self(); --#else -- return ::GetCurrentThreadId(); --#endif --} -- --bool CThread::IsCurrentThread(const ThreadIdentifier tid) --{ --#ifdef _LINUX -- return pthread_equal(pthread_self(), tid); --#else -- return (::GetCurrentThreadId() == tid); --#endif -+ return currentThread.get(); - } - - void CThread::Sleep(unsigned int milliseconds) -@@ -529,7 +170,7 @@ - if(milliseconds > 10 && IsCurrentThread()) - m_StopEvent.WaitMSec(milliseconds); - else -- ::Sleep(milliseconds); -+ XbmcThreads::ThreadSleep(milliseconds); - } - - -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/Thread.h xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.h ---- xbmc-pvr-11.0.1/xbmc/threads/Thread.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.h 2012-05-14 14:15:12.215222099 +0200 -@@ -23,19 +23,13 @@ - // - ////////////////////////////////////////////////////////////////////// - --#if !defined(AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_) && !defined(AFX_THREAD_H__67621B15_8724_4B5D_9343_7667075C89F2__INCLUDED_) --#define AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_ -- --#if _MSC_VER > 1000 - #pragma once --#endif // _MSC_VER > 1000 - - #include --#include "system.h" // for HANDLE --#ifdef _LINUX --#include "PlatformInclude.h" --#endif -+#include - #include "Event.h" -+#include "threads/ThreadImpl.h" -+#include "threads/ThreadLocal.h" - - class IRunnable - { -@@ -44,37 +38,36 @@ - virtual ~IRunnable() {} - }; - --#ifdef CTHREAD --#undef CTHREAD --#endif -- - // minimum as mandated by XTL - #define THREAD_MINSTACKSIZE 0x10000 - - class CThread - { - public: -- CThread(const char* ThreadName = NULL); -- CThread(IRunnable* pRunnable, const char* ThreadName = NULL); -+ CThread(const char* ThreadName); -+ CThread(IRunnable* pRunnable, const char* ThreadName); - virtual ~CThread(); - void Create(bool bAutoDelete = false, unsigned stacksize = 0); - bool WaitForThreadExit(unsigned int milliseconds); - void Sleep(unsigned int milliseconds); - bool SetPriority(const int iPriority); -- void SetPrioritySched_RR(void); -+ int GetPriority(void); - int GetMinPriority(void); - int GetMaxPriority(void); - int GetNormalPriority(void); -- HANDLE ThreadHandle(); -- operator HANDLE(); -- operator HANDLE() const; -+ int GetSchedRRPriority(void); -+ bool SetPrioritySched_RR(int iPriority); - bool IsAutoDelete() const; - virtual void StopThread(bool bWait = true); - float GetRelativeUsage(); // returns the relative cpu usage of this thread since last call -+ int64_t GetAbsoluteUsage(); - bool IsCurrentThread() const; -+ bool IsRunning(); - - static bool IsCurrentThread(const ThreadIdentifier tid); - static ThreadIdentifier GetCurrentThreadId(); -+ static CThread* GetCurrentThread(); -+ static int64_t GetCurrentThreadUsage(); - protected: - virtual void OnStartup(){}; - virtual void OnExit(){}; -@@ -82,7 +75,6 @@ - virtual void Process(); - - volatile bool m_bStop; -- HANDLE m_ThreadHandle; - - enum WaitResponse { WAIT_INTERRUPTED = -1, WAIT_SIGNALED = 0, WAIT_TIMEDOUT = 1 }; - -@@ -108,36 +100,22 @@ - } - - private: -- /*! \brief set the threadname for the debugger/callstack, implementation dependent. -- */ -- void SetDebugCallStackName( const char *threadName ); -- std::string GetTypeName(void); -- --private: -+ static THREADFUNC staticThread(void *data); - ThreadIdentifier ThreadId() const; -+ void SetThreadInfo(); -+ void TermHandler(); -+ -+ ThreadIdentifier m_ThreadId; -+ ThreadOpaque m_ThreadOpaque; - bool m_bAutoDelete; - CEvent m_StopEvent; -- unsigned m_ThreadId; // This value is unreliable on platforms using pthreads -- // Use m_ThreadHandle->m_hThread instead -+ CEvent m_TermEvent; -+ CEvent m_StartEvent; -+ CCriticalSection m_CriticalSection; - IRunnable* m_pRunnable; -- -- unsigned __int64 m_iLastUsage; -- unsigned __int64 m_iLastTime; -+ uint64_t m_iLastUsage; -+ uint64_t m_iLastTime; - float m_fLastUsage; - - std::string m_ThreadName; -- --#ifdef _LINUX -- static void term_handler (int signum); --#endif -- --#ifndef _WIN32 -- static int staticThread(void* data); --#else -- static DWORD WINAPI staticThread(LPVOID* data); --#endif -- --private: - }; -- --#endif // !defined(AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_) -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/ThreadImpl.h 2012-05-14 14:15:12.215222099 +0200 -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#pragma once -+ -+#include "threads/platform/ThreadImpl.h" -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.cpp 2012-05-14 14:15:12.216222119 +0200 -@@ -0,0 +1,254 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include "ActorProtocol.h" -+ -+using namespace Actor; -+ -+void Message::Release() -+{ -+ bool skip; -+ origin->Lock(); -+ skip = isSync ? !isSyncFini : false; -+ isSyncFini = true; -+ origin->Unlock(); -+ -+ if (skip) -+ return; -+ -+ // free data buffer -+ if (data != buffer) -+ delete [] data; -+ -+ // delete event in case of sync message -+ if (event) -+ delete event; -+ -+ origin->ReturnMessage(this); -+} -+ -+bool Message::Reply(int sig, void *data /* = NULL*/, int size /* = 0 */) -+{ -+ if (!isSync) -+ { -+ if (isOut) -+ return origin->SendInMessage(sig, data, size); -+ else -+ return origin->SendOutMessage(sig, data, size); -+ } -+ -+ origin->Lock(); -+ -+ if (!isSyncTimeout) -+ { -+ Message *msg = origin->GetMessage(); -+ msg->signal = sig; -+ msg->isOut = !isOut; -+ replyMessage = msg; -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ } -+ -+ origin->Unlock(); -+ -+ if (event) -+ event->Set(); -+ -+ return true; -+} -+ -+Protocol::~Protocol() -+{ -+ Message *msg; -+ Purge(); -+ while (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ delete msg; -+ } -+} -+ -+Message *Protocol::GetMessage() -+{ -+ Message *msg; -+ -+ CSingleLock lock(criticalSection); -+ -+ if (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ } -+ else -+ msg = new Message(); -+ -+ msg->isSync = false; -+ msg->isSyncFini = false; -+ msg->isSyncTimeout = false; -+ msg->event = NULL; -+ msg->data = NULL; -+ msg->payloadSize = 0; -+ msg->replyMessage = NULL; -+ msg->origin = this; -+ -+ return msg; -+} -+ -+void Protocol::ReturnMessage(Message *msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ freeMessageQueue.push(msg); -+} -+ -+bool Protocol::SendOutMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = true; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ outMessages.push(msg); -+ } -+ containerOutEvent->Set(); -+ -+ return true; -+} -+ -+bool Protocol::SendInMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = false; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ inMessages.push(msg); -+ } -+ containerInEvent->Set(); -+ -+ return true; -+} -+ -+ -+bool Protocol::SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data /* = NULL */, int size /* = 0 */) -+{ -+ Message *msg = GetMessage(); -+ msg->isOut = true; -+ msg->isSync = true; -+ msg->event = new CEvent; -+ msg->event->Reset(); -+ SendOutMessage(signal, data, size, msg); -+ -+ if (!msg->event->WaitMSec(timeout)) -+ { -+ msg->origin->Lock(); -+ if (msg->replyMessage) -+ *retMsg = msg->replyMessage; -+ else -+ { -+ *retMsg = NULL; -+ msg->isSyncTimeout = true; -+ } -+ msg->origin->Unlock(); -+ } -+ else -+ *retMsg = msg->replyMessage; -+ -+ msg->Release(); -+ -+ if (*retMsg) -+ return true; -+ else -+ return false; -+} -+ -+bool Protocol::ReceiveOutMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (outMessages.empty() || outDefered) -+ return false; -+ -+ *msg = outMessages.front(); -+ outMessages.pop(); -+ -+ return true; -+} -+ -+bool Protocol::ReceiveInMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (inMessages.empty() || inDefered) -+ return false; -+ -+ *msg = inMessages.front(); -+ inMessages.pop(); -+ -+ return true; -+} -+ -+ -+void Protocol::Purge() -+{ -+ Message *msg; -+ -+ while (ReceiveInMessage(&msg)) -+ msg->Release(); -+ -+ while (ReceiveOutMessage(&msg)) -+ msg->Release(); -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.h xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.h ---- xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.h 2012-05-14 14:15:12.217222140 +0200 -@@ -0,0 +1,89 @@ -+ -+#pragma once -+ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include "threads/Thread.h" -+#include "utils/log.h" -+#include -+#include "memory.h" -+ -+#define MSG_INTERNAL_BUFFER_SIZE 32 -+ -+namespace Actor -+{ -+ -+class Protocol; -+ -+class Message -+{ -+ friend class Protocol; -+public: -+ int signal; -+ bool isSync; -+ bool isSyncFini; -+ bool isOut; -+ bool isSyncTimeout; -+ int payloadSize; -+ uint8_t buffer[MSG_INTERNAL_BUFFER_SIZE]; -+ uint8_t *data; -+ Message *replyMessage; -+ Protocol *origin; -+ CEvent *event; -+ -+ void Release(); -+ bool Reply(int sig, void *data = NULL, int size = 0); -+ -+private: -+ Message() {isSync = false; data = NULL; event = NULL; replyMessage = NULL;}; -+}; -+ -+class Protocol -+{ -+public: -+ Protocol(std::string name, CEvent* inEvent, CEvent *outEvent) -+ : inDefered(false), outDefered(false), portName(name) {containerInEvent = inEvent; containerOutEvent = outEvent;}; -+ virtual ~Protocol(); -+ Message *GetMessage(); -+ void ReturnMessage(Message *msg); -+ bool SendOutMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendInMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data = NULL, int size = 0); -+ bool ReceiveOutMessage(Message **msg); -+ bool ReceiveInMessage(Message **msg); -+ void Purge(); -+ void DeferIn(bool value) {inDefered = value;}; -+ void DeferOut(bool value) {outDefered = value;}; -+ void Lock() {criticalSection.lock();}; -+ void Unlock() {criticalSection.unlock();}; -+ std::string portName; -+ -+protected: -+ CEvent *containerInEvent, *containerOutEvent; -+ CCriticalSection criticalSection; -+ std::queue outMessages; -+ std::queue inMessages; -+ std::queue freeMessageQueue; -+ bool inDefered, outDefered; -+}; -+ -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/AlarmClock.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/AlarmClock.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/AlarmClock.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/AlarmClock.cpp 2012-05-14 14:15:12.217222140 +0200 -@@ -28,7 +28,7 @@ - - using namespace std; - --CAlarmClock::CAlarmClock() : m_bIsRunning(false) -+CAlarmClock::CAlarmClock() : CThread("CAlarmClock"), m_bIsRunning(false) - { - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/AsyncFileCopy.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/AsyncFileCopy.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/AsyncFileCopy.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/AsyncFileCopy.cpp 2012-05-14 14:15:12.218222160 +0200 -@@ -26,7 +26,7 @@ - #include "log.h" - #include "utils/TimeUtils.h" - --CAsyncFileCopy::CAsyncFileCopy() -+CAsyncFileCopy::CAsyncFileCopy() : CThread("CAsyncFileCopy") - { - m_cancelled = false; - m_succeeded = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.cpp 2012-05-14 14:15:12.218222160 +0200 -@@ -32,7 +32,7 @@ - - WORD CDownloadQueue::m_wNextQueueId = 0; - --CDownloadQueue::CDownloadQueue(void) : CThread() -+CDownloadQueue::CDownloadQueue(void) : CThread("CDownloadQueue") - { - m_bStop = false; - m_wQueueId = m_wNextQueueId++; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.h xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.h ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.h 2012-05-14 14:15:12.219222180 +0200 -@@ -26,6 +26,8 @@ - #include "threads/CriticalSection.h" - #include "StdString.h" - -+#include "system.h" -+ - struct TICKET - { - TICKET(WORD aQueueId, DWORD aItemId) -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueueManager.h xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueueManager.h ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueueManager.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueueManager.h 2012-05-14 14:15:12.220222200 +0200 -@@ -22,6 +22,7 @@ - */ - - #include "DownloadQueue.h" -+#include "system.h" - - #define MAX_DOWNLOAD_QUEUES 3 - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/JobManager.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/JobManager.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/JobManager.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/JobManager.cpp 2012-05-14 14:15:12.220222200 +0200 -@@ -24,6 +24,9 @@ - #include "threads/SingleLock.h" - #include "utils/log.h" - -+#include "system.h" -+ -+ - using namespace std; - - bool CJob::ShouldCancel(unsigned int progress, unsigned int total) const -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/LCD.h xbmc-pvr-11.0.1.patch/xbmc/utils/LCD.h ---- xbmc-pvr-11.0.1/xbmc/utils/LCD.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/LCD.h 2012-05-14 14:15:12.221222220 +0200 -@@ -68,8 +68,9 @@ - void LoadSkin(const CStdString &xmlFile); - void Reset(); - void Render(LCD_MODE mode); -- ILCD() : m_disableOnPlay(DISABLE_ON_PLAY_NONE), -- m_eCurrentCharset(CUSTOM_CHARSET_DEFAULT) {} -+ ILCD() : CThread("ILCD"), -+ m_disableOnPlay(DISABLE_ON_PLAY_NONE), -+ m_eCurrentCharset(CUSTOM_CHARSET_DEFAULT) {} - protected: - virtual void Process() = 0; - void StringToLCDCharSet(CStdString& strText); -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/Makefile xbmc-pvr-11.0.1.patch/xbmc/utils/Makefile ---- xbmc-pvr-11.0.1/xbmc/utils/Makefile 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/Makefile 2012-05-14 14:15:12.222222240 +0200 -@@ -59,6 +59,7 @@ - Weather.cpp \ - Win32Exception.cpp \ - XMLUtils.cpp \ -+ ActorProtocol.cpp \ - - LIB=utils.a - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/RssReader.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/RssReader.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.cpp 2012-05-14 14:15:12.223222260 +0200 -@@ -44,7 +44,7 @@ - // Construction/Destruction - ////////////////////////////////////////////////////////////////////// - --CRssReader::CRssReader() : CThread() -+CRssReader::CRssReader() : CThread("CRssReader") - { - m_pObserver = NULL; - m_spacesBetweenFeeds = 0; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/RssReader.h xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.h ---- xbmc-pvr-11.0.1/xbmc/utils/RssReader.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.h 2012-05-14 14:15:12.223222260 +0200 -@@ -39,6 +39,9 @@ - - #include "tinyXML/tinyxml.h" - -+#include "system.h" -+ -+ - #define RSS_COLOR_BODY 0 - #define RSS_COLOR_HEADLINE 1 - #define RSS_COLOR_CHANNEL 2 -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/Splash.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/Splash.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/Splash.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/Splash.cpp 2012-05-14 14:15:12.224222280 +0200 -@@ -31,7 +31,7 @@ - - using namespace XFILE; - --CSplash::CSplash(const CStdString& imageName) -+CSplash::CSplash(const CStdString& imageName) : CThread("CSplash") - { - m_ImageName = imageName; - fade = 0.5; -@@ -139,5 +139,5 @@ - - bool CSplash::IsRunning() - { -- return (m_ThreadHandle != NULL); -+ return (IsRunning()); - } -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/TuxBoxUtil.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/TuxBoxUtil.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/TuxBoxUtil.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/TuxBoxUtil.cpp 2012-05-14 14:15:12.225222300 +0200 -@@ -48,7 +48,7 @@ - CTuxBoxUtil g_tuxbox; - CTuxBoxService g_tuxboxService; - --CTuxBoxService::CTuxBoxService() -+CTuxBoxService::CTuxBoxService() : CThread("CTuxBoxService") - { - } - CTuxBoxService::~CTuxBoxService() -diff -Naur xbmc-pvr-11.0.1/xbmc/video/dialogs/GUIDialogVideoSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/video/dialogs/GUIDialogVideoSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2012-05-14 14:14:51.709808795 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2012-05-14 14:15:12.226222321 +0200 -@@ -107,12 +107,12 @@ - entries.push_back(make_pair(VS_INTERLACEMETHOD_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , 16311)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL , 16310)); -- entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16021)); -+ entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16326)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, 16318)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , 16317)); -- entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BOB , 16320)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BEST , 16321)); -+ entries.push_back(make_pair(VS_INTERLACEMETHOD_XVBA , 16327)); - - /* remove unsupported methods */ - for(vector >::iterator it = entries.begin(); it != entries.end();) -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.cpp 2012-05-14 14:15:12.227222342 +0200 -@@ -116,7 +116,7 @@ - m_state = FIND_MOVIE; - m_strMovie = strMovie; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (m_state != DO_NOTHING) -@@ -160,7 +160,7 @@ - { // threaded version - m_state = GET_DETAILS; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -@@ -195,7 +195,7 @@ - { // threaded version - m_state = GET_EPISODE_DETAILS; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -@@ -230,7 +230,7 @@ - { // threaded version - m_state = GET_EPISODE_LIST; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.h xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.h ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.h 2012-05-14 14:15:12.228222362 +0200 -@@ -42,7 +42,7 @@ - class CVideoInfoDownloader : public CThread - { - public: -- CVideoInfoDownloader(const ADDON::ScraperPtr &scraper) : m_info(scraper) {} -+ CVideoInfoDownloader(const ADDON::ScraperPtr &scraper) : CThread("CVideoInfoDownloader"), m_info(scraper) {} - virtual ~CVideoInfoDownloader() {} - - // threaded lookup functions -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoScanner.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoScanner.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoScanner.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoScanner.cpp 2012-05-14 14:15:12.229222382 +0200 -@@ -54,7 +54,7 @@ - namespace VIDEO - { - -- CVideoInfoScanner::CVideoInfoScanner() -+ CVideoInfoScanner::CVideoInfoScanner() : CThread("CVideoInfoScanner") - { - m_bRunning = false; - m_pObserver = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.cpp 2012-05-14 14:15:12.231222422 +0200 -@@ -31,6 +31,7 @@ - #include - #include - #include "windowing/WindowingFactory.h" -+ #include "settings/AdvancedSettings.h" - #define NVSETTINGSCMD "nvidia-settings -nt -q RefreshRate3" - #elif defined(__APPLE__) && !defined(__arm__) - #include -@@ -107,7 +108,7 @@ - - #endif - --CVideoReferenceClock::CVideoReferenceClock() -+CVideoReferenceClock::CVideoReferenceClock() : CThread("CVideoReferenceClock") - { - m_SystemFrequency = CurrentHostFrequency(); - m_ClockSpeed = 1.0; -@@ -118,7 +119,7 @@ - - #if defined(HAS_GLX) && defined(HAS_XRANDR) - m_Dpy = NULL; -- m_UseNvSettings = true; -+ m_UseNvSettings = false; - #endif - } - -@@ -270,12 +271,21 @@ - return false; - } - -+ m_bIsATI = false; -+ m_bPolling = false; -+ - CStdString Vendor = g_Windowing.GetRenderVendor(); - Vendor.ToLower(); - if (Vendor.compare(0, 3, "ati") == 0) - { - CLog::Log(LOGDEBUG, "CVideoReferenceClock: GL_VENDOR: %s, using ati workaround", Vendor.c_str()); - m_bIsATI = true; -+ m_bPolling = true; -+ } -+ if (g_advancedSettings.m_vblankPolling) -+ { -+ m_bPolling = true; -+ CLog::Log(LOGDEBUG, "CVideoReferenceClock: use polling"); - } - - m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes); -@@ -285,7 +295,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - { - Swa.border_pixel = 0; - Swa.event_mask = StructureNotifyMask; -@@ -313,7 +323,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - ReturnV = glXMakeCurrent(m_Dpy, m_Window, m_Context); - else - ReturnV = glXMakeCurrent(m_Dpy, m_glPixmap, m_Context); -@@ -324,7 +334,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - { - m_glXWaitVideoSyncSGI = (int (*)(int, int, unsigned int*))glXGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI"); - if (!m_glXWaitVideoSyncSGI) -@@ -369,6 +379,9 @@ - UpdateRefreshrate(true); //forced refreshrate update - m_MissedVblanks = 0; - -+ if (m_bPolling) -+ SetPriority(1); -+ - return true; - } - -@@ -567,7 +580,7 @@ - while(!m_bStop) - { - //wait for the next vblank -- if (!m_bIsATI) -+ if (!m_bPolling) - { - ReturnV = m_glXWaitVideoSyncSGI(2, (VblankCount + 1) % 2, &VblankCount); - m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct -@@ -591,7 +604,7 @@ - sleepTime = std::max(int(300000LL/m_RefreshRate), sleepTime); - - unsigned int iterations = 0; -- while (VblankCount == PrevVblankCount && !m_bStop) -+ while (VblankCount == PrevVblankCount && iterations < 500 && !m_bStop) - { - usleep(sleepTime); - m_glXGetVideoSyncSGI(&VblankCount); -@@ -652,7 +665,7 @@ - } - - CLog::Log(LOGDEBUG, "CVideoReferenceClock: Attaching glX context"); -- if (!m_bIsATI) -+ if (!m_bPolling) - ReturnV = glXMakeCurrent(m_Dpy, m_Window, m_Context); - else - ReturnV = glXMakeCurrent(m_Dpy, m_glPixmap, m_Context); -@@ -1275,6 +1288,9 @@ - - if (m_UseVblank) //when true the vblank is used as clock source - { -+ if (Target < m_CurrTime) -+ Target = m_CurrTime + 0.5/m_RefreshRate; -+ - while (m_CurrTime < Target) - { - //calculate how long to sleep before we should have gotten a signal that a vblank happened -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.h xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.h ---- xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.h 2012-05-14 14:15:12.232222442 +0200 -@@ -125,6 +125,7 @@ - - bool m_UseNvSettings; - bool m_bIsATI; -+ bool m_bPolling; - - #elif defined(_WIN32) && defined(HAS_DX) - bool SetupD3D(); -diff -Naur xbmc-pvr-11.0.1/xbmc/win32/PlatformDefs.h xbmc-pvr-11.0.1.patch/xbmc/win32/PlatformDefs.h ---- xbmc-pvr-11.0.1/xbmc/win32/PlatformDefs.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/win32/PlatformDefs.h 2012-05-14 14:15:12.232222442 +0200 -@@ -33,7 +33,6 @@ - typedef __int64 fpos64_t; - typedef __int64 __off64_t; - typedef long __off_t; --typedef unsigned long ThreadIdentifier; - - #define ssize_t int - -diff -Naur xbmc-pvr-11.0.1/xbmc/win32/WindowHelper.cpp xbmc-pvr-11.0.1.patch/xbmc/win32/WindowHelper.cpp ---- xbmc-pvr-11.0.1/xbmc/win32/WindowHelper.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/win32/WindowHelper.cpp 2012-05-14 14:15:12.233222462 +0200 -@@ -28,7 +28,7 @@ - - CWHelper g_windowHelper; - --CWHelper::CWHelper(void) -+CWHelper::CWHelper(void) : CThread("CWHelper") - { - m_hwnd = NULL; - m_hProcess = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.cpp xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.cpp ---- xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.cpp 2012-05-14 14:15:12.234222482 +0200 -@@ -35,6 +35,8 @@ - #include - #include "cores/VideoRenderers/RenderManager.h" - #include "utils/TimeUtils.h" -+#include "settings/AdvancedSettings.h" -+#include "settings/GUISettings.h" - - #if defined(HAS_XRANDR) - #include -@@ -52,6 +54,7 @@ - m_wmWindow = 0; - m_bWasFullScreenBeforeMinimize = false; - m_dpyLostTime = 0; -+ m_internalModeSwitch = false; - - XSetErrorHandler(XErrorHandler); - } -@@ -178,6 +181,45 @@ - return false; - } - -+void CWinSystemX11::RefreshWindow() -+{ -+ // save current mode if this is not an internal request -+ if (!m_internalModeSwitch) -+ { -+ CLog::Log(LOGNOTICE, "CWinSystemX11::RefreshWindow - external or initial xrandr event"); -+ m_xrandrOut = g_xrandr.GetCurrentOutput(); -+ m_xrandrMode = g_xrandr.GetCurrentMode(m_xrandrOut.name); -+ } -+ m_internalModeSwitch = false; -+ -+ g_xrandr.Query(true); -+ XOutput out = g_xrandr.GetCurrentOutput(); -+ XMode mode = g_xrandr.GetCurrentMode(out.name); -+ -+ RESOLUTION_INFO res; -+ unsigned int i; -+ bool found(false); -+ for (i = RES_DESKTOP; i < g_settings.m_ResInfo.size(); ++i) -+ { -+ if (g_settings.m_ResInfo[i].strId == mode.id) -+ { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ { -+ CLog::Log(LOGERROR, "CWinSystemX11::RefreshWindow - could not find resolution"); -+ return; -+ } -+ -+ g_graphicsContext.SetVideoResolution((RESOLUTION)i, true); -+ g_guiSettings.SetInt("window.width", mode.w); -+ g_guiSettings.SetInt("window.height", mode.h); -+ g_settings.Save(); -+} -+ - bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) - { - m_nWidth = res.iWidth; -@@ -193,13 +235,32 @@ - mode.hz = res.fRefreshRate; - mode.id = res.strId; - -- if(m_bFullScreen) -+ XOutput currout = g_xrandr.GetCurrentOutput(); -+ XMode currmode = g_xrandr.GetCurrentMode(currout.name); -+ -+ if (m_xrandrOut.name.empty()) -+ { -+ m_xrandrOut = currout; -+ m_xrandrMode = currmode; -+ } -+ -+ if(!m_bFullScreen) - { -+ // reset to mode we had before internal mode switch -+ out = m_xrandrOut; -+ mode = m_xrandrMode; -+ } -+ -+ // only call xrandr if mode changes -+ if (currout.name != out.name || currmode.w != mode.w || currmode.h != mode.h || -+ currmode.hz != mode.hz || currmode.id != mode.id) -+ { -+ CLog::Log(LOGNOTICE, "CWinSystemX11::SetFullScreen - calling xrandr"); - OnLostDevice(); -+ m_internalModeSwitch = true; - g_xrandr.SetMode(out, mode); - } -- else -- g_xrandr.RestoreState(); -+ - #endif - - int options = SDL_OPENGL; -@@ -493,6 +554,7 @@ - if (bGotEvent || bTimeout) - { - CLog::Log(LOGDEBUG, "%s - notify display reset event", __FUNCTION__); -+ RefreshWindow(); - - CSingleLock lock(m_resourceSection); - -diff -Naur xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.h xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.h ---- xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.h 2012-05-14 14:15:12.234222482 +0200 -@@ -27,6 +27,7 @@ - #include "utils/Stopwatch.h" - #include - #include "threads/CriticalSection.h" -+#include "XRandR.h" - - class IDispResource; - -@@ -60,6 +61,9 @@ - // Local to WinSystemX11 only - Display* GetDisplay() { return m_dpy; } - GLXWindow GetWindow() { return m_glWindow; } -+ GLXContext GetGlxContext() { return m_glContext; } -+ Window GetWmWindow() { return m_wmWindow; } -+ void RefreshWindow(); - - protected: - bool RefreshGlxContext(); -@@ -76,6 +80,9 @@ - CCriticalSection m_resourceSection; - std::vector m_resources; - uint64_t m_dpyLostTime; -+ XOutput m_xrandrOut; -+ XMode m_xrandrMode; -+ bool m_internalModeSwitch; - - private: - bool IsSuitableVisual(XVisualInfo *vInfo); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch deleted file mode 100644 index 078997f175..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h ---- xbmc-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-03-23 07:22:04.215885089 +0100 -+++ xbmc-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-03-23 07:24:07.875383186 +0100 -@@ -22,6 +22,7 @@ - #pragma once - - #include -+#include - - struct threadOpaque - { diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.11-disable_interop.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.11-disable_interop.patch deleted file mode 100644 index 18b28b23f7..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.11-disable_interop.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-06-30 19:13:51.558262433 +0200 -+++ xbmc-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-06-30 19:59:14.545818328 +0200 -@@ -553,7 +553,7 @@ - { - bool hasInterop = false; - #ifdef GL_NV_vdpau_interop -- hasInterop = true; -+ hasInterop = false; - #endif - CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); - if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch deleted file mode 100644 index 5f4ae3111c..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 9687cc6b6f90fb40e39060eff9e4d8283254b770 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Fri, 13 Jul 2012 18:57:37 +0200 -Subject: [PATCH] linuxrenderer: delete texture targets on reconfigure - ---- - xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 7c46cfd..85fc50c 100644 ---- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -261,6 +261,12 @@ bool CLinuxRendererGL::ValidateRenderTarget() - else - CLog::Log(LOGNOTICE,"Using GL_TEXTURE_2D"); - -+ // function pointer for texture might change in -+ // call to LoadShaders -+ glFinish(); -+ for (int i = 0 ; i < m_NumYV12Buffers ; i++) -+ (this->*m_textureDelete)(i); -+ - // create the yuv textures - LoadShaders(); - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch deleted file mode 100644 index 0cfaf7fff4..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 497941802e56121adf03428d964e225c80989afd Mon Sep 17 00:00:00 2001 -From: elupus -Date: Sat, 7 Apr 2012 00:08:34 +0200 -Subject: [PATCH] fixed: still frames at the start of a VTS in dvd could end - up not showing - -This occured due to a change in behavior in updated ffmpeg. Old code would -return EOF once after a VTS change to trigger demuxer flush, however -updated ffmpeg will read multiple times causing demuxer reset actions -to get executed after actual data having been processed by demuxer. ---- - .../cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -index dbdff52..3ae4843 100644 ---- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -+++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -@@ -419,9 +419,12 @@ int CDVDInputStreamNavigator::ProcessBlock(BYTE* dest_buffer, int* read) - iNavresult = NAVRESULT_HOLD; - } - else -+ { - iNavresult = m_pDVDPlayer->OnDVDNavResult(buf, DVDNAV_VTS_CHANGE); -- -- m_bInMenu = (0 == m_dll.dvdnav_is_domain_vts(m_dvdnav)); -+ m_holdmode = HOLDMODE_HELD; -+ m_lastevent = DVDNAV_NOP; -+ m_bInMenu = (0 == m_dll.dvdnav_is_domain_vts(m_dvdnav)); -+ } - } - break; - --- -1.7.10 - - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-981-toggleButtonState.patch deleted file mode 100644 index 17a606f1b1..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-981-toggleButtonState.patch +++ /dev/null @@ -1,304 +0,0 @@ -diff -Naur xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h ---- xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h 2011-12-10 22:16:22.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h 2011-12-17 18:43:42.183704449 +0100 -@@ -57,6 +57,7 @@ - virtual CStdString GetDescription() const; - void SetToggleSelect(const CStdString &toggleSelect); - void SetAltClickActions(const CGUIAction &clickActions); -+ bool IsSelected() const { return m_bSelected; }; - - protected: - virtual bool UpdateColors(); -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-17 18:43:42.216705084 +0100 -@@ -135,6 +135,11 @@ - - typedef struct { - PyObject_HEAD_XBMC_CONTROL -+ bool bIsSelected; -+ } ControlToggle; -+ -+ typedef struct { -+ PyObject_HEAD_XBMC_CONTROL - std::string strFont; - color_t textColor; - std::vector vecLabels; -@@ -263,7 +268,8 @@ - extern PyTypeObject ControlRadioButton_Type; - extern PyTypeObject ControlSlider_Type; - extern PyTypeObject ControlEdit_Type; -- -+ extern PyTypeObject ControlToggle_Type; -+ - CGUIControl* ControlLabel_Create(ControlLabel* pControl); - CGUIControl* ControlFadeLabel_Create(ControlFadeLabel* pControl); - CGUIControl* ControlTextBox_Create(ControlTextBox* pControl); -@@ -276,6 +282,7 @@ - CGUIControl* ControlRadioButton_Create(ControlRadioButton* pControl); - CGUIControl* ControlSlider_Create(ControlSlider* pControl); - CGUIControl* ControlEdit_Create(ControlEdit* pControl); -+ CGUIControl* ControlToggle_Create(ControlToggle* pControl); - - void initControl_Type(); - void initControlSpin_Type(); -@@ -291,6 +298,7 @@ - void initControlRadioButton_Type(); - void initControlSlider_Type(); - void initControlEdit_Type(); -+ void initControlToggle_Type(); - } - - #ifdef __cplusplus -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 2011-12-17 18:43:42.217705104 +0100 -@@ -0,0 +1,181 @@ -+/* -+ * Copyright (C) 2005-2011 Team XBMC -+ * http://www.xbmc.org -+ * -+ * 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, 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 XBMC; see the file COPYING. If not, write to -+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -+ * http://www.gnu.org/copyleft/gpl.html -+ * -+ */ -+ -+#include -+ -+#include "guilib/GUIToggleButtonControl.h" -+#include "guilib/GUIFontManager.h" -+#include "control.h" -+#include "pyutil.h" -+ -+using namespace std; -+ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+namespace PYXBMC -+{ -+ PyObject* ControlToggle_New( -+ PyTypeObject *type, -+ PyObject *args, -+ PyObject *kwds ) -+ { -+ static const char *keywords[] = { -+ "x", "y", "width", "height", "label", -+ "focusTexture", "noFocusTexture", -+ "textOffsetX", "textOffsetY", "alignment", -+ "font", "textColor", "disabledColor", "angle", "shadowColor", "focusedColor", NULL }; -+ ControlToggle *self; -+ char* cFont = NULL; -+ char* cTextureFocus = NULL; -+ char* cTextureNoFocus = NULL; -+ char* cTextColor = NULL; -+ char* cDisabledColor = NULL; -+ char* cShadowColor = NULL; -+ char* cFocusedColor = NULL; -+ -+ PyObject* pObjectText; -+ -+ self = (ControlToggle*)type->tp_alloc(type, 0); -+ if (!self) return NULL; -+ new(&self->bIsSelected) bool(); -+ -+ if (!PyArg_ParseTupleAndKeywords( -+ args, -+ kwds, -+ (char*)"llllO|sslllssslss", -+ (char**)keywords, -+ &self->dwPosX, -+ &self->dwPosY, -+ &self->dwWidth, -+ &self->dwHeight, -+ &pObjectText, -+ &cTextureFocus, -+ &cTextureNoFocus, -+ &cFont, -+ &cTextColor, -+ &cDisabledColor, -+ &cShadowColor, -+ &cFocusedColor)) -+ { -+ Py_DECREF( self ); -+ return NULL; -+ } -+ -+ -+ cTextureFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturefocus", (char*)"button-focus.png"); -+ cTextureNoFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturenofocus", (char*)"button-nofocus.jpg"); -+ -+ return (PyObject*)self; -+ } -+ -+ void ControlToggle_Dealloc(ControlToggle* self) -+ { -+ self->ob_type->tp_free((PyObject*)self); -+ } -+ -+ -+ // isSelected() Method -+ PyDoc_STRVAR(isSelected__doc__, -+ "isSelected() -- Returns the toggle buttons's selected status.\n" -+ "\n" -+ "example:\n" -+ " - is = self.togglebutton.isSelected()\n"); -+ -+ PyObject* ControlToggle_IsSelected(ControlToggle *self, PyObject *args) -+ { -+ bool isSelected = false; -+ -+ PyXBMCGUILock(); -+ if (self->pGUIControl) -+ isSelected = ((CGUIToggleButtonControl*)self->pGUIControl)->IsSelected(); -+ PyXBMCGUIUnlock(); -+ -+ return Py_BuildValue((char*)"b", isSelected); -+ } -+ -+ -+ PyMethodDef ControlToggle_methods[] = { -+ {(char*)"isSelected", (PyCFunction)ControlToggle_IsSelected, METH_VARARGS, isSelected__doc__}, -+ {NULL, NULL, 0, NULL} -+ }; -+ -+ // ControlRadioButton class -+ PyDoc_STRVAR(ControlToggle__doc__, -+ "ControlRadioButton class.\n" -+ "\n" -+ "ControlRadioButton(x, y, width, height, label[, focusTexture, noFocusTexture, textOffsetX, textOffsetY,\n" -+ " alignment, font, textColor, disabledColor, angle, shadowColor, focusedColor,\n" -+ " radioFocusTexture, noRadioFocusTexture])\n" -+ "\n" -+ "x : integer - x coordinate of control.\n" -+ "y : integer - y coordinate of control.\n" -+ "width : integer - width of control.\n" -+ "height : integer - height of control.\n" -+ "label : string or unicode - text string.\n" -+ "focusTexture : [opt] string - filename for focus texture.\n" -+ "noFocusTexture : [opt] string - filename for no focus texture.\n" -+ "textOffsetX : [opt] integer - x offset of label.\n" -+ "textOffsetY : [opt] integer - y offset of label.\n" -+ "alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n" -+ "font : [opt] string - font used for label text. (e.g. 'font13')\n" -+ "textColor : [opt] hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')\n" -+ "disabledColor : [opt] hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')\n" -+ "angle : [opt] integer - angle of control. (+ rotates CCW, - rotates CW)\n" -+ "shadowColor : [opt] hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')\n" -+ "focusedColor : [opt] hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')\n" -+ "radioFocusTexture : [opt] string - filename for radio focus texture.\n" -+ "noRadioFocusTexture : [opt] string - filename for radio no focus texture.\n" -+ "\n" -+ "*Note, You can use the above as keywords for arguments and skip certain optional arguments.\n" -+ " Once you use a keyword, all following arguments require the keyword.\n" -+ " After you create the control, you need to add it to the window with addControl().\n" -+ "\n" -+ "example:\n" -+ " - self.radiobutton = xbmcgui.ControlToggleButton(100, 250, 200, 50, 'Status', font='font14')\n"); -+ -+ // Restore code and data sections to normal. -+ -+ PyTypeObject ControlToggle_Type; -+ -+ void initControlToggle_Type() -+ { -+ PyXBMCInitializeTypeObject(&ControlToggle_Type); -+ -+ ControlToggle_Type.tp_name = (char*)"xbmcgui.ControlToggleButton"; -+ ControlToggle_Type.tp_basicsize = sizeof(ControlToggle); -+ ControlToggle_Type.tp_dealloc = (destructor)ControlToggle_Dealloc; -+ ControlToggle_Type.tp_compare = 0; -+ ControlToggle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; -+ ControlToggle_Type.tp_doc = ControlToggle__doc__; -+ ControlToggle_Type.tp_methods = ControlToggle_methods; -+ ControlToggle_Type.tp_base = &Control_Type; -+ ControlToggle_Type.tp_new = ControlToggle_New; -+ } -+} -+ -+#ifdef __cplusplus -+} -+#endif -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-17 18:44:47.447960296 +0100 -@@ -13,6 +13,7 @@ - controlslider.cpp \ - controlspin.cpp \ - controltextbox.cpp \ -+ controltogglebutton.cpp \ - dialog.cpp \ - GUIPythonWindow.cpp \ - GUIPythonWindowDialog.cpp \ -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-17 18:43:42.218705123 +0100 -@@ -277,6 +277,12 @@ - if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); - ((ControlButton*)pControl)->align = li.align; - break; -+ case CGUIControl::GUICONTROL_TOGGLEBUTTON: -+ pControl = (Control*)ControlToggle_Type.tp_alloc(&ControlToggle_Type, 0); -+ new(&((ControlToggle*)pControl)->bIsSelected) bool(); -+ -+ break; -+ - default: - break; - } -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-17 18:43:42.219705142 +0100 -@@ -138,6 +138,7 @@ - initAction_Type(); - initControlRadioButton_Type(); - initControlEdit_Type(); -+ initControlToggle_Type(); - - if (PyType_Ready(&Window_Type) < 0 || - PyType_Ready(&WindowDialog_Type) < 0 || -@@ -160,7 +161,8 @@ - PyType_Ready(&ControlSlider_Type) < 0 || - PyType_Ready(&ControlRadioButton_Type) < 0 || - PyType_Ready(&ControlEdit_Type) < 0 || -- PyType_Ready(&Action_Type) < 0) -+ PyType_Ready(&Action_Type) < 0 || -+ PyType_Ready(&ControlToggle_Type) < 0) - return; - - } -@@ -200,6 +202,7 @@ - Py_INCREF(&Action_Type); - Py_INCREF(&ControlRadioButton_Type); - Py_INCREF(&ControlEdit_Type); -+ Py_INCREF(&ControlToggle_Type); - - pXbmcGuiModule = Py_InitModule3((char*)"xbmcgui", xbmcGuiMethods, xbmcgui_module_documentation); - -@@ -227,7 +230,8 @@ - PyModule_AddObject(pXbmcGuiModule, (char*)"Action", (PyObject *)&Action_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlRadioButton", (PyObject*)&ControlRadioButton_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlEdit", (PyObject*)&ControlEdit_Type); -- -+ PyModule_AddObject(pXbmcGuiModule, (char*)"ControlToggle", (PyObject*)&ControlToggle_Type); -+ - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__author__", (char*)PY_XBMC_AUTHOR); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__date__", (char*)"14 July 2006"); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__version__", (char*)"1.2"); -diff -Naur xbmc-f3b0020/XBMC.xcodeproj/project.pbxproj xbmc-f3b0020.patch/XBMC.xcodeproj/project.pbxproj diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch deleted file mode 100644 index 8a8a5d49e8..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch +++ /dev/null @@ -1,27 +0,0 @@ -From f025c39679b438cb91a0ef0f205736ff92fddeac Mon Sep 17 00:00:00 2001 -From: Vic Lee -Date: Thu, 10 Feb 2011 09:36:15 +0800 -Subject: [PATCH 5/5] UDisk: device must be remount in DeviceChanged event - - -Signed-off-by: Vic Lee ---- - xbmc/linux/UDisksProvider.cpp | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -diff --git a/xbmc/storage/linux/UDisksProvider.cpp b/xbmc/storage/linux/UDisksProvider.cpp -index 8e9b378..e24502a 100644 ---- a/xbmc/storage/linux/UDisksProvider.cpp -+++ b/xbmc/storage/linux/UDisksProvider.cpp -@@ -368,6 +368,8 @@ void CUDisksProvider::DeviceChanged(const char *object, IStorageEventsCallback * - { - bool mounted = device->m_isMounted; - device->Update(); -+ if (g_advancedSettings.m_handleMounting) -+ device->Mount(); - if (!mounted && device->m_isMounted && callback) - callback->OnStorageAdded(device->m_Label, device->m_MountPath); - else if (mounted && !device->m_isMounted && callback) --- -1.7.2.3 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch deleted file mode 100644 index 24af12df39..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f52dd9a555e8e4b087ec6fbf040dc1f1155c4136 Mon Sep 17 00:00:00 2001 -From: "S. Davilla" -Date: Sat, 21 Apr 2012 14:11:56 -0400 -Subject: [PATCH] fixed, failure to broswe for smb shares. this hits all 1st - time installs - ---- - xbmc/filesystem/SmbFile.cpp | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/xbmc/filesystem/FileSmb.cpp b/xbmc/filesystem/FileSmb.cpp -index 382553c..c390031 100644 ---- a/xbmc/filesystem/FileSmb.cpp -+++ b/xbmc/filesystem/FileSmb.cpp -@@ -61,7 +61,6 @@ SMBCSRV* xb_smbc_cache(SMBCCTX* c, const char* server, const char* share, const - m_IdleTimeout = 0; - #endif - m_context = NULL; -- smbc_init(xb_smbc_auth, 0); - } - - CSMB::~CSMB() -@@ -149,6 +148,10 @@ void CSMB::Init() - } - #endif - -+ // reads smb.conf so this MUST be after we create smb.conf -+ // multiple smbc_init calls are ignored by libsmbclient. -+ smbc_init(xb_smbc_auth, 0); -+ - #ifdef TARGET_WINDOWS - // set the log function - set_log_callback(xb_smbc_log); --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch deleted file mode 100644 index 6163872d60..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/xbmc/storage/linux/UDisksProvider.cpp b/xbmc/storage/linux/UDisksProvider.cpp -index 6afc1a8..c940e69 100644 ---- a/xbmc/storage/linux/UDisksProvider.cpp -+++ b/xbmc/storage/linux/UDisksProvider.cpp -@@ -356,7 +356,7 @@ void CUDisksProvider::DeviceChanged(const char *object, IStorageEventsCallback * - { - bool mounted = device->m_isMounted; - device->Update(); -- if (g_advancedSettings.m_handleMounting) -+ if (g_advancedSettings.m_handleMounting && device->m_isOptical) - device->Mount(); - if (!mounted && device->m_isMounted && callback) - callback->OnStorageAdded(device->m_Label, device->m_MountPath); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-990-wiimote.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-990-wiimote.patch deleted file mode 100644 index 05379ebdf6..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-990-wiimote.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h b/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -index dbdbb94..6f68715 100644 ---- a/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -+++ b/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -@@ -27,7 +27,7 @@ - #include "../../lib/c++/xbmcclient.h" - #endif - //#ifndef WIN32 --// #include -+ #include - //#endif - #include "wiiuse.h" - //#define ICON_PATH "../../" diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch deleted file mode 100644 index f2cbebb687..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch +++ /dev/null @@ -1,101 +0,0 @@ -diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp -index 7ef2027..bea711b 100644 ---- a/xbmc/ApplicationMessenger.cpp -+++ b/xbmc/ApplicationMessenger.cpp -@@ -73,6 +73,9 @@ - #include "utils/JobManager.h" - #include "storage/DetectDVDType.h" - -+#include "pvr/PVRManager.h" -+ -+using namespace PVR; - using namespace std; - - CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) -@@ -261,12 +264,14 @@ void CApplicationMessenger::ProcessMessage(ThreadMessage *pMsg) - - case TMSG_HIBERNATE: - { -+ g_PVRManager.SetWakeupCommand(); - g_powerManager.Hibernate(); - } - break; - - case TMSG_SUSPEND: - { -+ g_PVRManager.SetWakeupCommand(); - g_powerManager.Suspend(); - } - break; -diff --git a/xbmc/pvr/PVRManager.h b/xbmc/pvr/PVRManager.h -index 94a8c9a..99280c6 100644 ---- a/xbmc/pvr/PVRManager.h -+++ b/xbmc/pvr/PVRManager.h -@@ -450,6 +450,11 @@ namespace PVR - */ - void LoadCurrentChannelSettings(void); - -+ /*! -+ * @brief Executes "pvrpowermanagement.setwakeupcmd" -+ */ -+ bool SetWakeupCommand(void); -+ - protected: - /*! - * @brief PVR update and control thread. -@@ -525,11 +530,6 @@ namespace PVR - void ShowProgressDialog(const CStdString &strText, int iProgress); - - /*! -- * @brief Executes "pvrpowermanagement.setwakeupcmd" -- */ -- bool SetWakeupCommand(void); -- -- /*! - * @brief Hide the progress dialog if it's visible. - */ - void HideProgressDialog(void); -diff --git a/xbmc/pvr/timers/PVRTimers.cpp b/xbmc/pvr/timers/PVRTimers.cpp -index cfba9bb..4e757d6 100644 ---- a/xbmc/pvr/timers/PVRTimers.cpp -+++ b/xbmc/pvr/timers/PVRTimers.cpp -@@ -714,8 +714,7 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTimeSpan prewakeup(0, 0, g_guiSettings.GetInt("pvrpowermanagement.prewakeup"), 0); - const CDateTimeSpan idle(0, 0, g_guiSettings.GetInt("pvrpowermanagement.backendidletime"), 0); - -- CDateTime timerwakeuptime; -- CDateTime dailywakeuptime; -+ CDateTime retVal; - - /* Check next active time */ - CPVRTimerInfoTag timer; -@@ -724,15 +723,16 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTime start = timer.StartAsUTC(); - - if ((start - idle) > now) { -- timerwakeuptime = start - prewakeup; -+ retVal = start - prewakeup; - } else { -- timerwakeuptime = now + idle; -+ retVal = now + idle; - } - } - - /* check daily wake up */ - if (dailywakup) - { -+ CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(g_guiSettings.GetString("pvrpowermanagement.dailywakeuptime", false)); - dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); - -@@ -746,8 +746,9 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTimeSpan oneDay(1,0,0,0); - dailywakeuptime += oneDay; - } -+ if (dailywakeuptime < retVal) -+ retVal = dailywakeuptime; - } - -- const CDateTime retVal((dailywakeuptime < timerwakeuptime) ? dailywakeuptime : timerwakeuptime); - return retVal; - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999-crosscompile.patch deleted file mode 100644 index 9c73a9644e..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999-crosscompile.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/Makefile.include.in b/Makefile.include.in -index b70245d..0537b86 100644 ---- a/Makefile.include.in -+++ b/Makefile.include.in -@@ -1,4 +1,4 @@ --AR=ar -+AR=@AR@ - ARFLAGS=crus - RM=rm -rf - SHELL=@SHELL@ -diff --git a/configure.in b/configure.in -index 7348529..baea8e0 100755 ---- a/configure.in -+++ b/configure.in -@@ -22,7 +22,7 @@ AC_DEFUN([XB_FIND_SONAME], - AC_MSG_CHECKING([for lib$2 soname]) - $1_FILENAME=$($CC -nostdlib -o /dev/null $LDFLAGS -l$2 -Wl,-M 2>/dev/null | grep "^LOAD.*$2" | awk '{V=2; print $V}') - if [[ ! -z $$1_FILENAME ]]; then -- $1_SONAME=$(objdump -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') -+ $1_SONAME=$($OBJDUMP -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') - fi - else - AC_MSG_CHECKING([for lib$2 dylib]) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch deleted file mode 100644 index 9f209e8e04..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 268d6a01b6a7dea0d53b042c246c95e87f4fc3d8 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Thu, 26 Jul 2012 15:43:24 +0200 -Subject: [PATCH] move deleting gl textures to TextureManager, fixes asic hang - on AMD - ---- - xbmc/Application.cpp | 4 ++-- - xbmc/guilib/GUIFontTTFGL.cpp | 3 ++- - xbmc/guilib/TextureManager.cpp | 13 +++++++++++++ - xbmc/guilib/TextureManager.h | 2 ++ - 4 files changed, 19 insertions(+), 3 deletions(-) - -diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index 71d8a4e..b66459a 100644 ---- a/xbmc/Application.cpp -+++ b/xbmc/Application.cpp -@@ -2231,8 +2231,6 @@ void CApplication::Render() - - g_Windowing.EndRender(); - -- g_TextureManager.FreeUnusedTextures(); -- - // reset our info cache - we do this at the end of Render so that it is - // fresh for the next process(), or after a windowclose animation (where process() - // isn't called) -@@ -2270,6 +2268,8 @@ void CApplication::Render() - } - CTimeUtils::UpdateFrameTime(flip); - -+ g_TextureManager.FreeUnusedTextures(); -+ - g_renderManager.UpdateResolution(); - g_renderManager.ManageCaptures(); - } -diff --git a/xbmc/guilib/GUIFontTTFGL.cpp b/xbmc/guilib/GUIFontTTFGL.cpp -index 87e07ca..6c93eb8 100644 ---- a/xbmc/guilib/GUIFontTTFGL.cpp -+++ b/xbmc/guilib/GUIFontTTFGL.cpp -@@ -24,6 +24,7 @@ - #include "GUIFontTTFGL.h" - #include "GUIFontManager.h" - #include "Texture.h" -+#include "TextureManager.h" - #include "GraphicContext.h" - #include "gui3d.h" - #include "utils/log.h" -@@ -234,7 +235,7 @@ void CGUIFontTTFGL::DeleteHardwareTexture() - if (m_bTextureLoaded) - { - if (glIsTexture(m_nTexture)) -- glDeleteTextures(1, (GLuint*) &m_nTexture); -+ g_TextureManager.ReleaseHwTexture(m_nTexture); - m_bTextureLoaded = false; - } - } -diff --git a/xbmc/guilib/TextureManager.cpp b/xbmc/guilib/TextureManager.cpp -index 9ef7889..ccd0d03 100644 ---- a/xbmc/guilib/TextureManager.cpp -+++ b/xbmc/guilib/TextureManager.cpp -@@ -457,6 +457,19 @@ void CGUITextureManager::FreeUnusedTextures() - for (ivecTextures i = m_unusedTextures.begin(); i != m_unusedTextures.end(); ++i) - delete *i; - m_unusedTextures.clear(); -+ -+#if defined(HAS_GL) || defined(HAS_GLES) -+ for (unsigned int i = 0; i < m_unusedHwTextures.size(); ++i) -+ { -+ glDeleteTextures(1, (GLuint*) &m_unusedHwTextures[i]); -+ } -+#endif -+ m_unusedHwTextures.clear(); -+} -+ -+void CGUITextureManager::ReleaseHwTexture(unsigned int texture) -+{ -+ m_unusedHwTextures.push_back(texture); - } - - void CGUITextureManager::Cleanup() -diff --git a/xbmc/guilib/TextureManager.h b/xbmc/guilib/TextureManager.h -index dd47f48..001f470 100644 ---- a/xbmc/guilib/TextureManager.h -+++ b/xbmc/guilib/TextureManager.h -@@ -124,9 +124,11 @@ class CGUITextureManager - void RemoveTexturePath(const CStdString &texturePath); ///< Remove a path from the paths to check when loading media - - void FreeUnusedTextures(); ///< Free textures (called from app thread only) -+ void ReleaseHwTexture(unsigned int texture); - protected: - std::vector m_vecTextures; - std::vector m_unusedTextures; -+ std::vector m_unusedHwTextures; - typedef std::vector::iterator ivecTextures; - // we have 2 texture bundles (one for the base textures, one for the theme) - CTextureBundle m_TexBundle[2]; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.003-rar-PR1147.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.003-rar-PR1147.patch deleted file mode 100644 index a6a73bf20c..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.003-rar-PR1147.patch +++ /dev/null @@ -1,148 +0,0 @@ -From f01f95af95f287847c850572abe16b6969967ba7 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 19:01:17 +0300 -Subject: [PATCH 1/3] fixed: crashes with corrupted rar files - -UnrarXLib does not handle invalid files gracefully enough, and some -files can cause it to tell CRarFile that it has written more data into -its buffer than actually fits there, causing CRarFile::Read() to -eventually overread the buffer. - -Add checks in CRarFile for the validity of byte counts retrieved from -UnrarXLib to prevent crashes in such situations. -(cherry picked from commit ca9457286994ef0b021744797b8d78fb78260436) ---- - xbmc/filesystem/FileRar.cpp | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/xbmc/filesystem/FileRar.cpp b/xbmc/filesystem/FileRar.cpp -index 9c87a35..d026f8f 100644 ---- a/xbmc/filesystem/FileRar.cpp -+++ b/xbmc/filesystem/FileRar.cpp -@@ -310,6 +310,14 @@ unsigned int CFileRar::Read(void *lpBuf, int64_t uiBufSize) - - m_iDataInBuffer = MAXWINMEMSIZE-m_pExtract->GetDataIO().UnpackToMemorySize; - -+ if (m_iDataInBuffer < 0 || -+ m_iDataInBuffer > MAXWINMEMSIZE - (m_szStartOfBuffer - m_szBuffer)) -+ { -+ // invalid data returned by UnrarXLib, prevent a crash -+ CLog::Log(LOGERROR, "CRarFile::Read - Data buffer in inconsistent state"); -+ m_iDataInBuffer = 0; -+ } -+ - if (m_iDataInBuffer == 0) - break; - -@@ -471,6 +479,15 @@ int64_t CFileRar::Seek(int64_t iFilePosition, int iWhence) - } - m_iDataInBuffer = m_pExtract->GetDataIO().m_iSeekTo; // keep data - m_iBufferStart = m_pExtract->GetDataIO().m_iStartOfBuffer; -+ -+ if (m_iDataInBuffer < 0 || m_iDataInBuffer > MAXWINMEMSIZE) -+ { -+ // invalid data returned by UnrarXLib, prevent a crash -+ CLog::Log(LOGERROR, "CRarFile::Seek - Data buffer in inconsistent state"); -+ m_iDataInBuffer = 0; -+ return -1; -+ } -+ - m_szStartOfBuffer = m_szBuffer+MAXWINMEMSIZE-m_iDataInBuffer; - m_iFilePosition = iFilePosition; - --- -1.7.10 - - -From de1be4534cf410896b3102f95b6e02019ed64a90 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 17:13:07 +0300 -Subject: [PATCH 2/3] fixed: rars that have unpacked size stored on first - volume only - -Some multi-volume RAR files have their unpacked size set as 0 in all -volumes except the first one. - -Use the previous unpacked size instead of 0 in such cases in order to -support such files properly. -(cherry picked from commit 683457d27736c09415a11d80933553f75139a253) ---- - lib/UnrarXLib/volume.cpp | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/UnrarXLib/volume.cpp b/lib/UnrarXLib/volume.cpp -index 1f4d5e3..b24e98b 100644 ---- a/lib/UnrarXLib/volume.cpp -+++ b/lib/UnrarXLib/volume.cpp -@@ -15,6 +15,7 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman - Log(Arc.FileName,St(MDataBadCRC),hd->FileName,Arc.FileName); - } - -+ Int64 PrevFullUnpSize = hd->FullUnpSize; - Int64 PosBeforeClose=Arc.Tell(); - Arc.Close(); - -@@ -144,6 +145,13 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman - } - } - #endif -+ -+ if (hd->FullUnpSize == 0) -+ { -+ // some archives only have correct UnpSize in the first volume -+ hd->FullUnpSize = PrevFullUnpSize; -+ } -+ - if (DataIO!=NULL) - { - if (HeaderType==ENDARC_HEAD) --- -1.7.10 - - -From d7bed5ddbbc98d7fedac663410d8e7e64bdf20c7 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 00:14:49 +0300 -Subject: [PATCH 3/3] fixed: CRarFile::Read() returning wrong data after some - seek patterns - -Certain seek patterns on a file inside a non-compressed rar file can -cause CmdExtract::UnstoreFile() to think that the destination buffer has -been filled (as DestUnpSize counter, originally set to the file size, -reaches zero). - -However, counting written bytes using DestUnpSize doesn't make sense for -the UnpackToMemory codepath used for non-compressed rar files, as there -can be seeks which can eventually cause more data to be read than what -the actual file size was. The actual output buffer is internally handled -by ComprDataIO. - -The check in UnstoreFile() will result in not all data being written to -the destination buffer, causing CRarFile::Read() to return old stale -data. - -Fix that by dropping the unnecessary DestUnpSize handling in -UnpackToMemory codepath of CmdExtract::UnstoreFile(). -(cherry picked from commit 840cd4ce4ac8c781e7d35db2ed86d575a42c37e7) ---- - lib/UnrarXLib/extract.cpp | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/lib/UnrarXLib/extract.cpp b/lib/UnrarXLib/extract.cpp -index b4a8091..368a899 100644 ---- a/lib/UnrarXLib/extract.cpp -+++ b/lib/UnrarXLib/extract.cpp -@@ -863,10 +863,7 @@ void CmdExtract::UnstoreFile(ComprDataIO &DataIO,Int64 DestUnpSize) - } - if (Code > 0) - { -- Code=Code=0) -- DestUnpSize-=Code; - } - else - { --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch deleted file mode 100644 index 4885fe33e9..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ab175ba28508445f6aff57386a8ce04b58a86f60 Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Fri, 11 May 2012 19:56:37 +0200 -Subject: [PATCH] [fix] - reapply fix for airtunes with AE which was lost - during merge - ---- - xbmc/network/AirTunesServer.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index 285a0a6..a60ad09 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -125,11 +125,11 @@ ao_device* CAirTunesServer::AudioOutputFunctions::ao_open_live(int driver_id, ao - if (ao_get_option(option, "name")) - item.GetMusicInfoTag()->SetTitle(ao_get_option(option, "name")); - -- g_application.getApplicationMessenger().PlayFile(item); -- - ThreadMessage tMsg2 = { TMSG_GUI_ACTIVATE_WINDOW, WINDOW_VISUALISATION, 0 }; - g_application.getApplicationMessenger().SendMessage(tMsg2, true); - -+ g_application.getApplicationMessenger().PlayFile(item); -+ - return (ao_device*) device; - } - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch deleted file mode 100644 index 9ea05b6281..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch +++ /dev/null @@ -1,527 +0,0 @@ -From b73018af2ae69c7cfad0a4461d169a49c7d0dfbf Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Tue, 15 May 2012 19:12:07 +0200 -Subject: [PATCH] [airtunes] - implementation for windows using libshairplay - ---- - xbmc/network/AirTunesServer.cpp | 330 +++++++++++++++++++++++++++++++++++++-- - xbmc/network/AirTunesServer.h | 23 +++ - 2 files changed, 343 insertions(+), 10 deletions(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index a60ad09..e14da90 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -17,7 +17,9 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#if !defined(TARGET_WINDOWS) - #pragma GCC diagnostic ignored "-Wwrite-strings" -+#endif - - #include "AirTunesServer.h" - -@@ -37,15 +39,243 @@ - #include "music/tags/MusicInfoTag.h" - #include "FileItem.h" - #include "GUIInfoManager.h" -+#include "guilib/GUIWindowManager.h" - #include "utils/Variant.h" - #include "settings/AdvancedSettings.h" -+#include "utils/EndianSwap.h" -+ -+#include -+#include -+ - - using namespace XFILE; - -+#if defined(TARGET_WINDOWS) -+DllLibShairplay *CAirTunesServer::m_pLibShairplay = NULL; -+#else - DllLibShairport *CAirTunesServer::m_pLibShairport = NULL; -+#endif - CAirTunesServer *CAirTunesServer::ServerInstance = NULL; - CStdString CAirTunesServer::m_macAddress; - -+//parse daap metadata - thx to project MythTV -+std::map decodeDMAP(const char *buffer, unsigned int size) -+{ -+ std::map result; -+ unsigned int offset = 8; -+ while (offset < size) -+ { -+ std::string tag; -+ tag.append(buffer + offset, 4); -+ offset += 4; -+ uint32_t length = Endian_SwapBE32(*(uint32_t *)(buffer + offset)); -+ offset += sizeof(uint32_t); -+ std::string content; -+ content.append(buffer + offset, length);//possible fixme - utf8? -+ offset += length; -+ result[tag] = content; -+ } -+ return result; -+} -+ -+void CAirTunesServer::SetMetadataFromBuffer(const char *buffer, unsigned int size) -+{ -+ MUSIC_INFO::CMusicInfoTag tag; -+ std::map metadata = decodeDMAP(buffer, size); -+ if(metadata["asal"].length()) -+ tag.SetAlbum(metadata["asal"]);//album -+ if(metadata["minm"].length()) -+ tag.SetTitle(metadata["minm"]);//title -+ if(metadata["asar"].length()) -+ tag.SetArtist(metadata["asar"]);//artist -+ g_infoManager.SetCurrentSongTag(tag); -+} -+ -+void CAirTunesServer::SetCoverArtFromBuffer(const char *buffer, unsigned int size) -+{ -+ XFILE::CFile tmpFile; -+ const char *tmpFileName = "special://temp/airtunes_album_thumb.jpg"; -+ -+ if(!size) -+ return; -+ -+ if (tmpFile.OpenForWrite(tmpFileName, true)) -+ { -+ int writtenBytes=0; -+ writtenBytes = tmpFile.Write(buffer, size); -+ tmpFile.Close(); -+ -+ if(writtenBytes) -+ { -+ //reset to empty before setting the new one -+ //else it won't get refreshed because the name didn't change -+ g_infoManager.SetCurrentAlbumThumb(""); -+ g_infoManager.SetCurrentAlbumThumb(tmpFileName); -+ //update the ui -+ CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_REFRESH_THUMBS); -+ g_windowManager.SendThreadMessage(msg); -+ } -+ } -+} -+ -+#if defined(TARGET_WINDOWS) -+#define RSA_KEY " \ -+-----BEGIN RSA PRIVATE KEY-----\ -+MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\ -+wC5vOYvfDmFI6oSFXi5ELabWJmT2dKHzBJKa3k9ok+8t9ucRqMd6DZHJ2YCCLlDRKSKv6kDqnw4U\ -+wPdpOMXziC/AMj3Z/lUVX1G7WSHCAWKf1zNS1eLvqr+boEjXuBOitnZ/bDzPHrTOZz0Dew0uowxf\ -+/+sG+NCK3eQJVxqcaJ/vEHKIVd2M+5qL71yJQ+87X6oV3eaYvt3zWZYD6z5vYTcrtij2VZ9Zmni/\ -+UAaHqn9JdsBWLUEpVviYnhimNVvYFZeCXg/IdTQ+x4IRdiXNv5hEewIDAQABAoIBAQDl8Axy9XfW\ -+BLmkzkEiqoSwF0PsmVrPzH9KsnwLGH+QZlvjWd8SWYGN7u1507HvhF5N3drJoVU3O14nDY4TFQAa\ -+LlJ9VM35AApXaLyY1ERrN7u9ALKd2LUwYhM7Km539O4yUFYikE2nIPscEsA5ltpxOgUGCY7b7ez5\ -+NtD6nL1ZKauw7aNXmVAvmJTcuPxWmoktF3gDJKK2wxZuNGcJE0uFQEG4Z3BrWP7yoNuSK3dii2jm\ -+lpPHr0O/KnPQtzI3eguhe0TwUem/eYSdyzMyVx/YpwkzwtYL3sR5k0o9rKQLtvLzfAqdBxBurciz\ -+aaA/L0HIgAmOit1GJA2saMxTVPNhAoGBAPfgv1oeZxgxmotiCcMXFEQEWflzhWYTsXrhUIuz5jFu\ -+a39GLS99ZEErhLdrwj8rDDViRVJ5skOp9zFvlYAHs0xh92ji1E7V/ysnKBfsMrPkk5KSKPrnjndM\ -+oPdevWnVkgJ5jxFuNgxkOLMuG9i53B4yMvDTCRiIPMQ++N2iLDaRAoGBAO9v//mU8eVkQaoANf0Z\ -+oMjW8CN4xwWA2cSEIHkd9AfFkftuv8oyLDCG3ZAf0vrhrrtkrfa7ef+AUb69DNggq4mHQAYBp7L+\ -+k5DKzJrKuO0r+R0YbY9pZD1+/g9dVt91d6LQNepUE/yY2PP5CNoFmjedpLHMOPFdVgqDzDFxU8hL\ -+AoGBANDrr7xAJbqBjHVwIzQ4To9pb4BNeqDndk5Qe7fT3+/H1njGaC0/rXE0Qb7q5ySgnsCb3DvA\ -+cJyRM9SJ7OKlGt0FMSdJD5KG0XPIpAVNwgpXXH5MDJg09KHeh0kXo+QA6viFBi21y340NonnEfdf\ -+54PX4ZGS/Xac1UK+pLkBB+zRAoGAf0AY3H3qKS2lMEI4bzEFoHeK3G895pDaK3TFBVmD7fV0Zhov\ -+17fegFPMwOII8MisYm9ZfT2Z0s5Ro3s5rkt+nvLAdfC/PYPKzTLalpGSwomSNYJcB9HNMlmhkGzc\ -+1JnLYT4iyUyx6pcZBmCd8bD0iwY/FzcgNDaUmbX9+XDvRA0CgYEAkE7pIPlE71qvfJQgoA9em0gI\ -+LAuE4Pu13aKiJnfft7hIjbK+5kyb3TysZvoyDnb3HOKvInK7vXbKuU4ISgxB2bB3HcYzQMGsz1qJ\ -+2gG0N5hvJpzwwhbhXqFKA4zaaSrw622wDniAK5MlIE0tIAKKP4yxNGjoD2QYjhBGuhvkWKY=\ -+-----END RSA PRIVATE KEY-----" -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_metadata(void *cls, void *session, const void *buffer, int buflen) -+{ -+ CAirTunesServer::SetMetadataFromBuffer((char *)buffer, buflen); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_coverart(void *cls, void *session, const void *buffer, int buflen) -+{ -+ CAirTunesServer::SetCoverArtFromBuffer((char *)buffer, buflen); -+} -+ -+void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->OpenForWrite(XFILE::PipesManager::GetInstance().GetUniquePipeName()); -+ pipe->SetOpenThreashold(300); -+ -+ BXA_FmtHeader header; -+ strncpy(header.fourcc, "BXA ", 4); -+ header.type = BXA_PACKET_TYPE_FMT; -+ header.bitsPerSample = bits; -+ header.channels = channels; -+ header.sampleRate = samplerate; -+ header.durationMs = 0; -+ -+ if (pipe->Write(&header, sizeof(header)) == 0) -+ return 0; -+ -+ ThreadMessage tMsg = { TMSG_MEDIA_STOP }; -+ g_application.getApplicationMessenger().SendMessage(tMsg, true); -+ -+ CFileItem item; -+ item.SetPath(pipe->GetName()); -+ item.SetMimeType("audio/x-xbmc-pcm"); -+ -+ ThreadMessage tMsg2 = { TMSG_GUI_ACTIVATE_WINDOW, WINDOW_VISUALISATION, 0 }; -+ g_application.getApplicationMessenger().SendMessage(tMsg2, true); -+ -+ g_application.getApplicationMessenger().PlayFile(item); -+ -+ return "XBMC-AirTunes";//session -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_volume(void *cls, void *session, float volume) -+{ -+ //volume from -144 - 0 -+ float volPercent = 1 - volume/-144; -+ g_application.SetVolume(volPercent, false);//non-percent volume 0.0-1.0 -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_process(void *cls, void *session, const void *buffer, int buflen) -+{ -+ #define NUM_OF_BYTES 64 -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ int sentBytes = 0; -+ unsigned char buf[NUM_OF_BYTES]; -+ -+ while (sentBytes < buflen) -+ { -+ int n = (buflen - sentBytes < NUM_OF_BYTES ? buflen - sentBytes : NUM_OF_BYTES); -+ memcpy(buf, (char*) buffer + sentBytes, n); -+ -+ if (pipe->Write(buf, n) == 0) -+ return; -+ -+ sentBytes += n; -+ } -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_flush(void *cls, void *session) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->Flush(); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_destroy(void *cls, void *session) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->SetEof(); -+ pipe->Close(); -+ -+ //fix airplay video for ios5 devices -+ //on ios5 when airplaying video -+ //the client first opens an airtunes stream -+ //while the movie is loading -+ //in that case we don't want to stop the player here -+ //because this would stop the airplaying video -+#ifdef HAS_AIRPLAY -+ if (!CAirPlayServer::IsPlaying()) -+#endif -+ { -+ ThreadMessage tMsg = { TMSG_MEDIA_STOP }; -+ g_application.getApplicationMessenger().SendMessage(tMsg, true); -+ CLog::Log(LOGDEBUG, "AIRTUNES: AirPlay not running - stopping player"); -+ } -+} -+ -+void shairplay_log(int level, const char *msg) -+{ -+ int xbmcLevel = LOGINFO; -+ -+ switch(level) -+ { -+ case RAOP_LOG_EMERG: // system is unusable -+ xbmcLevel = LOGFATAL; -+ break; -+ case RAOP_LOG_ALERT: // action must be taken immediately -+ case RAOP_LOG_CRIT: // critical conditions -+ xbmcLevel = LOGSEVERE; -+ break; -+ case RAOP_LOG_ERR: // error conditions -+ xbmcLevel = LOGERROR; -+ break; -+ case RAOP_LOG_WARNING: // warning conditions -+ xbmcLevel = LOGWARNING; -+ break; -+ case RAOP_LOG_NOTICE: // normal but significant condition -+ xbmcLevel = LOGNOTICE; -+ break; -+ case RAOP_LOG_INFO: // informational -+ xbmcLevel = LOGINFO; -+ break; -+ case RAOP_LOG_DEBUG: // debug-level messages -+ xbmcLevel = LOGDEBUG; -+ break; -+ default: -+ break; -+ } -+ CLog::Log(xbmcLevel, "AIRTUNES: %s", msg); -+} -+ -+#else -+ - struct ao_device_xbmc - { - XFILE::CPipeFile *pipe; -@@ -214,6 +444,17 @@ char* CAirTunesServer::AudioOutputFunctions::ao_get_option(ao_option *options, c - return NULL; - } - -+int shairport_log(const char* msg, size_t msgSize) -+{ -+ if( g_advancedSettings.m_logEnableAirtunes) -+ { -+ CLog::Log(LOGDEBUG, "AIRTUNES: %s", msg); -+ } -+ return 1; -+} -+ -+#endif -+ - bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, const CStdString &password/*=""*/) - { - bool success = false; -@@ -243,7 +484,9 @@ bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, con - ServerInstance = new CAirTunesServer(port, nonlocal); - if (ServerInstance->Initialize(password)) - { -+#ifndef TARGET_WINDOWS - ServerInstance->Create(); -+#endif - success = true; - } - -@@ -264,6 +507,9 @@ bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, con - txt["sr"] = "44100"; - txt["pw"] = "false"; - txt["vn"] = "3"; -+ txt["da"] = "true"; -+ txt["vs"] = "130.14"; -+ txt["md"] = "0,1,2"; - txt["txtvers"] = "1"; - - CZeroconf::GetInstance()->PublishService("servers.airtunes", "_raop._tcp", appName, port, txt); -@@ -276,10 +522,12 @@ void CAirTunesServer::StopServer(bool bWait) - { - if (ServerInstance) - { -+#if !defined(TARGET_WINDOWS) - if (m_pLibShairport->IsLoaded()) - { - m_pLibShairport->shairport_exit(); - } -+#endif - ServerInstance->StopThread(bWait); - ServerInstance->Deinitialize(); - if (bWait) -@@ -295,47 +543,98 @@ void CAirTunesServer::StopServer(bool bWait) - CAirTunesServer::CAirTunesServer(int port, bool nonlocal) : CThread("AirTunesServer") - { - m_port = port; -+#if defined(TARGET_WINDOWS) -+ m_pLibShairplay = new DllLibShairplay(); -+ m_pPipe = new XFILE::CPipeFile; -+#else - m_pLibShairport = new DllLibShairport(); -+#endif - } - - CAirTunesServer::~CAirTunesServer() - { -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay->IsLoaded()) -+ { -+ m_pLibShairplay->Unload(); -+ } -+ delete m_pLibShairplay; -+ delete m_pPipe; -+#else - if (m_pLibShairport->IsLoaded()) - { - m_pLibShairport->Unload(); - } - delete m_pLibShairport; -+#endif - } - - void CAirTunesServer::Process() - { - m_bStop = false; - -+#if !defined(TARGET_WINDOWS) - while (!m_bStop && m_pLibShairport->shairport_is_running()) - { - m_pLibShairport->shairport_loop(); - } -+#endif - } - --int shairport_log(const char* msg, size_t msgSize) -+bool CAirTunesServer::Initialize(const CStdString &password) - { -- if( g_advancedSettings.m_logEnableAirtunes) -+ bool ret = false; -+ -+ Deinitialize(); -+ -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay->Load()) - { -- CLog::Log(LOGDEBUG, "AIRTUNES: %s", msg); -+ -+ raop_callbacks_t ao; -+ ao.cls = m_pPipe; -+ ao.audio_init = AudioOutputFunctions::audio_init; -+ ao.audio_set_volume = AudioOutputFunctions::audio_set_volume; -+ ao.audio_set_metadata = AudioOutputFunctions::audio_set_metadata; -+ ao.audio_set_coverart = AudioOutputFunctions::audio_set_coverart; -+ ao.audio_process = AudioOutputFunctions::audio_process; -+ ao.audio_flush = AudioOutputFunctions::audio_flush; -+ ao.audio_destroy = AudioOutputFunctions::audio_destroy; -+ m_pLibShairplay->EnableDelayedUnload(false); -+ m_pRaop = m_pLibShairplay->raop_init(1, &ao, RSA_KEY);//1 - we handle one client at a time max -+ ret = m_pRaop != NULL; -+ -+ if(ret) -+ { -+ char macAdr[6]; -+ unsigned short port = (unsigned short)m_port; -+ -+ m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_WARNING); -+ if(g_advancedSettings.m_logEnableAirtunes) -+ { -+ m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_DEBUG); -+ } -+ -+ m_pLibShairplay->raop_set_log_callback(m_pRaop, shairplay_log); -+ -+ CNetworkInterface *net = g_application.getNetwork().GetFirstConnectedInterface(); -+ -+ if (net) -+ { -+ net->GetMacAddressRaw(macAdr); -+ } -+ -+ ret = m_pLibShairplay->raop_start(m_pRaop, &port, macAdr, 6, password.c_str()) >= 0; -+ } - } -- return 1; --} - --bool CAirTunesServer::Initialize(const CStdString &password) --{ -- bool ret = false; -+#else -+ - int numArgs = 3; - CStdString hwStr; - CStdString pwStr; - CStdString portStr; - -- Deinitialize(); -- - hwStr.Format("--mac=%s", m_macAddress.c_str()); - pwStr.Format("--password=%s",password.c_str()); - portStr.Format("--server_port=%d",m_port); -@@ -368,16 +667,27 @@ bool CAirTunesServer::Initialize(const CStdString &password) - m_pLibShairport->shairport_main(numArgs, argv); - ret = true; - } -+#endif - return ret; - } - - void CAirTunesServer::Deinitialize() - { -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay && m_pLibShairplay->IsLoaded()) -+ { -+ m_pLibShairplay->raop_stop(m_pRaop); -+ m_pLibShairplay->raop_destroy(m_pRaop); -+ m_pLibShairplay->Unload(); -+ } -+#else - if (m_pLibShairport && m_pLibShairport->IsLoaded()) - { - m_pLibShairport->shairport_exit(); - m_pLibShairport->Unload(); - } -+#endif - } - - #endif -+ -diff --git a/xbmc/network/AirTunesServer.h b/xbmc/network/AirTunesServer.h -index da893df..4a30e0a 100644 ---- a/xbmc/network/AirTunesServer.h -+++ b/xbmc/network/AirTunesServer.h -@@ -26,7 +26,11 @@ - - #ifdef HAS_AIRTUNES - -+#if defined(TARGET_WINDOWS) -+#include "DllLibShairplay.h" -+#else - #include "DllLibShairport.h" -+#endif - #include - #include - #include -@@ -41,11 +45,14 @@ - - class DllLibShairport; - -+ - class CAirTunesServer : public CThread - { - public: - static bool StartServer(int port, bool nonlocal, bool usePassword, const CStdString &password=""); - static void StopServer(bool bWait); -+ static void SetMetadataFromBuffer(const char *buffer, unsigned int size); -+ static void SetCoverArtFromBuffer(const char *buffer, unsigned int size); - - protected: - void Process(); -@@ -57,13 +64,28 @@ class CAirTunesServer : public CThread - void Deinitialize(); - - int m_port; -+#if defined(TARGET_WINDOWS) -+ static DllLibShairplay *m_pLibShairplay;//the lib -+ raop_t *m_pRaop; -+ XFILE::CPipeFile *m_pPipe; -+#else - static DllLibShairport *m_pLibShairport;//the lib -+#endif - static CAirTunesServer *ServerInstance; - static CStdString m_macAddress; - - class AudioOutputFunctions - { - public: -+#if defined(TARGET_WINDOWS) -+ static void* audio_init(void *cls, int bits, int channels, int samplerate); -+ static void audio_set_volume(void *cls, void *session, float volume); -+ static void audio_set_metadata(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_set_coverart(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_process(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_flush(void *cls, void *session); -+ static void audio_destroy(void *cls, void *session); -+#else - static void ao_initialize(void); - static int ao_play(ao_device *device, char *output_samples, uint32_t num_bytes); - static int ao_default_driver_id(void); -@@ -74,6 +96,7 @@ class CAirTunesServer : public CThread - static int ao_append_option(ao_option **options, const char *key, const char *value); - static void ao_free_options(ao_option *options); - static char* ao_get_option(ao_option *options, const char* key); -+#endif - }; - }; - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch deleted file mode 100644 index 44bd4b83a9..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch +++ /dev/null @@ -1,64 +0,0 @@ -From b7fb4615609c684a98dc1cc27906aaa0f117837f Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Wed, 9 May 2012 18:53:45 +0200 -Subject: [PATCH] [airtunes] - add dmap metadata parsing - ---- - xbmc/network/AirTunesServer.cpp | 13 ++++++++++++- - xbmc/network/AirTunesServer.h | 2 ++ - 2 files changed, 14 insertions(+), 1 deletion(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index e14da90..2ad097e 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -47,7 +47,6 @@ - #include - #include - -- - using namespace XFILE; - - #if defined(TARGET_WINDOWS) -@@ -390,6 +389,16 @@ int CAirTunesServer::AudioOutputFunctions::ao_close(ao_device *device) - return 0; - } - -+void CAirTunesServer::AudioOutputFunctions::ao_set_metadata(const char *buffer, unsigned int size) -+{ -+ CAirTunesServer::SetMetadataFromBuffer(buffer, size); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::ao_set_metadata_coverart(const char *buffer, unsigned int size) -+{ -+ CAirTunesServer::SetCoverArtFromBuffer(buffer, size); -+} -+ - /* -- Device Setup/Playback/Teardown -- */ - int CAirTunesServer::AudioOutputFunctions::ao_append_option(ao_option **options, const char *key, const char *value) - { -@@ -658,6 +667,8 @@ bool CAirTunesServer::Initialize(const CStdString &password) - ao.ao_append_option = AudioOutputFunctions::ao_append_option; - ao.ao_free_options = AudioOutputFunctions::ao_free_options; - ao.ao_get_option = AudioOutputFunctions::ao_get_option; -+ ao.ao_set_metadata = AudioOutputFunctions::ao_set_metadata; -+ ao.ao_set_metadata_coverart = AudioOutputFunctions::ao_set_metadata_coverart; - struct printfPtr funcPtr; - funcPtr.extprintf = shairport_log; - -diff --git a/xbmc/network/AirTunesServer.h b/xbmc/network/AirTunesServer.h -index 4a30e0a..0a4ce5a 100644 ---- a/xbmc/network/AirTunesServer.h -+++ b/xbmc/network/AirTunesServer.h -@@ -96,6 +96,8 @@ class CAirTunesServer : public CThread - static int ao_append_option(ao_option **options, const char *key, const char *value); - static void ao_free_options(ao_option *options); - static char* ao_get_option(ao_option *options, const char* key); -+ static void ao_set_metadata(const char *buffer, unsigned int size); -+ static void ao_set_metadata_coverart(const char *buffer, unsigned int size); - #endif - }; - }; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch deleted file mode 100644 index 9b256ef6ac..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 23ce80d7f303aa3fb282a67b973c20a2e84e48d2 Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Fri, 4 May 2012 19:19:26 +0200 -Subject: [PATCH 2/2] [nfs] - make impl compatible with latest libnfs and - avoid usage of off64_t and size_t - ---- - xbmc/filesystem/DllLibNfs.h | 36 ++++++++++++++++++------------------ - xbmc/filesystem/NFSFile.cpp | 10 +++++----- - xbmc/filesystem/NFSFile.h | 8 ++++---- - 3 files changed, 27 insertions(+), 27 deletions(-) - -diff --git a/xbmc/filesystem/DllLibNfs.h b/xbmc/filesystem/DllLibNfs.h -index 37dfc9c..54c6872 100644 ---- a/xbmc/filesystem/DllLibNfs.h -+++ b/xbmc/filesystem/DllLibNfs.h -@@ -44,8 +44,8 @@ class DllLibNfsInterface - virtual void free_nfs_srvr_list(struct nfs_server_list *srv)=0; - virtual struct nfs_context *nfs_init_context(void)=0; - virtual void nfs_destroy_context(struct nfs_context *nfs)=0; -- virtual size_t nfs_get_readmax(struct nfs_context *nfs)=0; -- virtual size_t nfs_get_writemax(struct nfs_context *nfs)=0; -+ virtual uint64_t nfs_get_readmax(struct nfs_context *nfs)=0; -+ virtual uint64_t nfs_get_writemax(struct nfs_context *nfs)=0; - virtual char *nfs_get_error(struct nfs_context *nfs)=0; - virtual int nfs_close(struct nfs_context *nfs, struct nfsfh *nfsfh)=0; - virtual int nfs_fsync(struct nfs_context *nfs, struct nfsfh *nfsfh)=0; -@@ -57,8 +57,8 @@ class DllLibNfsInterface - virtual int nfs_mount(struct nfs_context *nfs, const char *server, const char *exportname)=0; - virtual int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st)=0; - virtual int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st)=0; -- virtual int nfs_truncate(struct nfs_context *nfs, const char *path, off64_t length)=0; -- virtual int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t length)=0; -+ virtual int nfs_truncate(struct nfs_context *nfs, const char *path, uint64_t length)=0; -+ virtual int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t length)=0; - virtual int nfs_opendir(struct nfs_context *nfs, const char *path, struct nfsdir **nfsdir)=0; - virtual int nfs_statvfs(struct nfs_context *nfs, const char *path, struct statvfs *svfs)=0; - virtual int nfs_chmod(struct nfs_context *nfs, const char *path, int mode)=0; -@@ -73,12 +73,12 @@ class DllLibNfsInterface - virtual int nfs_chown(struct nfs_context *nfs, const char *path, int uid, int gid)=0; - virtual int nfs_fchown(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid)=0; - virtual int nfs_open(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh)=0; -- virtual int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf)=0; -- virtual int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf)=0; -+ virtual int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buf)=0; -+ virtual int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buf)=0; - virtual int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh)=0; -- virtual int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, size_t count, char *buf)=0; -- virtual int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, size_t count, char *buf)=0; -- virtual int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, int whence, off64_t *current_offset)=0; -+ virtual int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buf)=0; -+ virtual int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buf)=0; -+ virtual int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, uint64_t *current_offset)=0; - }; - - class DllLibNfs : public DllDynamic, DllLibNfsInterface -@@ -90,8 +90,8 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - DEFINE_METHOD1(struct exportnode *, mount_getexports, (const char *p1)) - DEFINE_METHOD1(void, mount_free_export_list, (struct exportnode *p1)) - DEFINE_METHOD1(void, nfs_destroy_context, (struct nfs_context *p1)) -- DEFINE_METHOD1(size_t, nfs_get_readmax, (struct nfs_context *p1)) -- DEFINE_METHOD1(size_t, nfs_get_writemax, (struct nfs_context *p1)) -+ DEFINE_METHOD1(uint64_t, nfs_get_readmax, (struct nfs_context *p1)) -+ DEFINE_METHOD1(uint64_t, nfs_get_writemax, (struct nfs_context *p1)) - DEFINE_METHOD1(char *, nfs_get_error, (struct nfs_context *p1)) - DEFINE_METHOD2(struct nfsdirent *, nfs_readdir, (struct nfs_context *p1, struct nfsdir *p2)) - DEFINE_METHOD2(int, nfs_fsync, (struct nfs_context *p1, struct nfsfh *p2)) -@@ -103,8 +103,8 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - DEFINE_METHOD3(int, nfs_mount, (struct nfs_context *p1, const char *p2, const char *p3)) - DEFINE_METHOD3(int, nfs_stat, (struct nfs_context *p1, const char *p2, struct stat *p3)) - DEFINE_METHOD3(int, nfs_fstat, (struct nfs_context *p1, struct nfsfh *p2, struct stat *p3)) -- DEFINE_METHOD3(int, nfs_truncate, (struct nfs_context *p1, const char *p2, off64_t p3)) -- DEFINE_METHOD3(int, nfs_ftruncate, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3)) -+ DEFINE_METHOD3(int, nfs_truncate, (struct nfs_context *p1, const char *p2, uint64_t p3)) -+ DEFINE_METHOD3(int, nfs_ftruncate, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3)) - DEFINE_METHOD3(int, nfs_opendir, (struct nfs_context *p1, const char *p2, struct nfsdir **p3)) - DEFINE_METHOD3(int, nfs_statvfs, (struct nfs_context *p1, const char *p2, struct statvfs *p3)) - DEFINE_METHOD3(int, nfs_chmod, (struct nfs_context *p1, const char *p2, int p3)) -@@ -116,15 +116,15 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - DEFINE_METHOD3(int, nfs_rename, (struct nfs_context *p1, const char *p2, const char *p3)) - DEFINE_METHOD3(int, nfs_link, (struct nfs_context *p1, const char *p2, const char *p3)) - DEFINE_METHOD4(int, nfs_open, (struct nfs_context *p1, const char *p2, int p3, struct nfsfh **p4)) -- DEFINE_METHOD4(int, nfs_read, (struct nfs_context *p1, struct nfsfh *p2, size_t p3, char *p4)) -- DEFINE_METHOD4(int, nfs_write, (struct nfs_context *p1, struct nfsfh *p2, size_t p3, char *p4)) -+ DEFINE_METHOD4(int, nfs_read, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, char *p4)) -+ DEFINE_METHOD4(int, nfs_write, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, char *p4)) - DEFINE_METHOD4(int, nfs_creat, (struct nfs_context *p1, const char *p2, int p3, struct nfsfh **p4)) - DEFINE_METHOD4(int, nfs_readlink, (struct nfs_context *p1, const char *p2, char *p3, int p4)) - DEFINE_METHOD4(int, nfs_chown, (struct nfs_context *p1, const char *p2, int p3, int p4)) - DEFINE_METHOD4(int, nfs_fchown, (struct nfs_context *p1, struct nfsfh *p2, int p3, int p4)) -- DEFINE_METHOD5(int, nfs_pread, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, size_t p4, char *p5)) -- DEFINE_METHOD5(int, nfs_pwrite, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, size_t p4, char *p5)) -- DEFINE_METHOD5(int, nfs_lseek, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, int p4, off64_t *p5)) -+ DEFINE_METHOD5(int, nfs_pread, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, uint64_t p4, char *p5)) -+ DEFINE_METHOD5(int, nfs_pwrite, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, uint64_t p4, char *p5)) -+ DEFINE_METHOD5(int, nfs_lseek, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, int p4, uint64_t *p5)) - - - -diff --git a/xbmc/filesystem/FileNFS.cpp b/xbmc/filesystem/FileNFS.cpp -index 2f820f7..751eb54 100644 ---- a/xbmc/filesystem/FileNFS.cpp -+++ b/xbmc/filesystem/FileNFS.cpp -@@ -375,7 +375,7 @@ void CNfsConnection::resetKeepAlive(struct nfsfh *_pFileHandle) - //we were before - void CNfsConnection::keepAlive(struct nfsfh *_pFileHandle) - { -- off64_t offset = 0; -+ uint64_t offset = 0; - char buffer[32]; - CLog::Log(LOGNOTICE, "NFS: sending keep alive after %i s.",KEEP_ALIVE_TIMEOUT/2); - CSingleLock lock(*this); -@@ -461,7 +461,7 @@ void CNfsConnection::AddIdleConnection() - int64_t CNFSFile::GetPosition() - { - int ret = 0; -- off64_t offset = 0; -+ uint64_t offset = 0; - CSingleLock lock(gNfsConnection); - - if (gNfsConnection.GetNfsContext() == NULL || m_pFileHandle == NULL) return 0; -@@ -587,7 +587,7 @@ unsigned int CNFSFile::Read(void *lpBuf, int64_t uiBufSize) - - if (m_pFileHandle == NULL || m_pNfsContext == NULL ) return 0; - -- numberOfBytesRead = gNfsConnection.GetImpl()->nfs_read(m_pNfsContext, m_pFileHandle, (size_t)uiBufSize, (char *)lpBuf); -+ numberOfBytesRead = gNfsConnection.GetImpl()->nfs_read(m_pNfsContext, m_pFileHandle, uiBufSize, (char *)lpBuf); - - lock.Leave();//no need to keep the connection lock after that - -@@ -605,7 +605,7 @@ unsigned int CNFSFile::Read(void *lpBuf, int64_t uiBufSize) - int64_t CNFSFile::Seek(int64_t iFilePosition, int iWhence) - { - int ret = 0; -- off64_t offset = 0; -+ uint64_t offset = 0; - - CSingleLock lock(gNfsConnection); - if (m_pFileHandle == NULL || m_pNfsContext == NULL) return -1; -@@ -667,7 +667,7 @@ int CNFSFile::Write(const void* lpBuf, int64_t uiBufSize) - //write chunk - writtenBytes = gNfsConnection.GetImpl()->nfs_write(m_pNfsContext, - m_pFileHandle, -- (size_t)chunkSize, -+ chunkSize, - (char *)lpBuf + numberOfBytesWritten); - //decrease left bytes - leftBytes-= writtenBytes; -diff --git a/xbmc/filesystem/FileNFS.h b/xbmc/filesystem/FileNFS.h -index 47d8d4a..df131b0 100644 ---- a/xbmc/filesystem/FileNFS.h -+++ b/xbmc/filesystem/FileNFS.h -@@ -65,8 +65,8 @@ class CNfsConnection : public CCriticalSection - ~CNfsConnection(); - bool Connect(const CURL &url, CStdString &relativePath); - struct nfs_context *GetNfsContext(){return m_pNfsContext;} -- size_t GetMaxReadChunkSize(){return m_readChunkSize;} -- size_t GetMaxWriteChunkSize(){return m_writeChunkSize;} -+ uint64_t GetMaxReadChunkSize(){return m_readChunkSize;} -+ uint64_t GetMaxWriteChunkSize(){return m_writeChunkSize;} - DllLibNfs *GetImpl(){return m_pLibNfs;} - std::list GetExportList(const CURL &url); - //this functions splits the url into the exportpath (feed to mount) and the rest of the path -@@ -96,8 +96,8 @@ class CNfsConnection : public CCriticalSection - CStdString m_exportPath;//current connected export path - CStdString m_hostName;//current connected host - CStdString m_resolvedHostName;//current connected host - as ip -- size_t m_readChunkSize;//current read chunksize of connected server -- size_t m_writeChunkSize;//current write chunksize of connected server -+ uint64_t m_readChunkSize;//current read chunksize of connected server -+ uint64_t m_writeChunkSize;//current write chunksize of connected server - int m_OpenConnections;//number of open connections - unsigned int m_IdleTimeout;//timeout for idle connection close and dyunload - tFileKeepAliveMap m_KeepAliveTimeouts;//mapping filehandles to its idle timeout --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch deleted file mode 100644 index f37fef13c2..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/xbmc/filesystem/PluginDirectory.cpp b/xbmc/filesystem/PluginDirectory.cpp -index 9e519fb..b64267b 100644 ---- a/xbmc/filesystem/PluginDirectory.cpp -+++ b/xbmc/filesystem/PluginDirectory.cpp -@@ -479,7 +479,7 @@ bool CPluginDirectory::WaitOnScriptResult(const CStdString &scriptPath, const CS - } - - // check whether we should pop up the progress dialog -- if (!progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar) -+ if (!progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar && !g_windowManager.HasModalDialog()) - { // loading takes more then 1.5 secs, show a progress dialog - progressBar = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - -diff --git a/xbmc/interfaces/python/xbmcmodule/keyboard.cpp b/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -index 0330215..0604a65 100644 ---- a/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -+++ b/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -@@ -92,6 +92,9 @@ namespace PYXBMC - - if (!PyArg_ParseTuple(args, (char*)"|i", &autoClose)) return NULL; - -+ if (g_windowManager.IsWindowActive(WINDOW_DIALOG_PROGRESS)) -+ g_windowManager.CloseDialogs(); -+ - PyXBMCGUILock(); - pKeyboard->Initialize(); - pKeyboard->SetHeading(self->strHeading); diff --git a/packages/multimedia/libaacs/meta b/packages/multimedia/libaacs/meta index 3a278677ff..934e1e5177 100644 --- a/packages/multimedia/libaacs/meta +++ b/packages/multimedia/libaacs/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libaacs" -PKG_VERSION="0.4.0" +PKG_VERSION="0.5.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/multimedia/libaacs/patches/libaacs-0.4.0-bison_2.6.patch b/packages/multimedia/libaacs/patches/libaacs-0.5.0-bison_2.6.patch similarity index 100% rename from packages/multimedia/libaacs/patches/libaacs-0.4.0-bison_2.6.patch rename to packages/multimedia/libaacs/patches/libaacs-0.5.0-bison_2.6.patch diff --git a/packages/multimedia/libbluray/meta b/packages/multimedia/libbluray/meta index 55144a0080..fb6bc7d77e 100644 --- a/packages/multimedia/libbluray/meta +++ b/packages/multimedia/libbluray/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libbluray" -PKG_VERSION="0.2.2" +PKG_VERSION="0.2.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch b/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch new file mode 100644 index 0000000000..456fb08e11 --- /dev/null +++ b/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch @@ -0,0 +1,25 @@ +--- busybox-1.20.2/libbb/kernel_version.c ++++ busybox-1.20.2-kernel_ver/libbb/kernel_version.c +@@ -20,18 +20,15 @@ + int FAST_FUNC get_linux_version_code(void) + { + struct utsname name; +- char *s; ++ char *s, *t; + int i, r; + +- if (uname(&name) == -1) { +- bb_perror_msg("can't get system information"); +- return 0; +- } +- ++ uname(&name); /* never fails */ + s = name.release; + r = 0; + for (i = 0; i < 3; i++) { +- r = r * 256 + atoi(strtok(s, ".")); ++ t = strtok(s, "."); ++ r = r * 256 + (t ? atoi(t) : 0); + s = NULL; + } + return r; diff --git a/packages/sysutils/rpi-cecd/init.d/64_rpi-cecd b/packages/sysutils/rpi-cecd/init.d/64_rpi-cecd deleted file mode 100644 index 1f8dc04e63..0000000000 --- a/packages/sysutils/rpi-cecd/init.d/64_rpi-cecd +++ /dev/null @@ -1,25 +0,0 @@ -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ -# start the RPi-CEC daemon -# -# runlevels: openelec - -progress "starting RPi-CEC daemon" - rpi-cecd &>/var/log/rpi-cecd.log & diff --git a/packages/sysutils/rpi-cecd/install b/packages/sysutils/rpi-cecd/install deleted file mode 100755 index f3ec9192f3..0000000000 --- a/packages/sysutils/rpi-cecd/install +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -. config/options $1 - -mkdir -p $INSTALL/usr/bin - cp -P $PKG_BUILD/rpi-cecd $INSTALL/usr/bin diff --git a/packages/toolchain/devel/autotools/automake/meta b/packages/toolchain/devel/autotools/automake/meta index e565d6d416..21b89ee9f1 100644 --- a/packages/toolchain/devel/autotools/automake/meta +++ b/packages/toolchain/devel/autotools/automake/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="automake" -PKG_VERSION="1.12.2" +PKG_VERSION="1.12.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/toolchain/devel/cmake/meta b/packages/toolchain/devel/cmake/meta index 6818e15f18..e736fae130 100644 --- a/packages/toolchain/devel/cmake/meta +++ b/packages/toolchain/devel/cmake/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="cmake" -PKG_VERSION="2.8.8" +PKG_VERSION="2.8.9" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD" diff --git a/packages/toolchain/devel/eglibc/install b/packages/toolchain/devel/eglibc/install index c602eab016..dd2855ba0f 100755 --- a/packages/toolchain/devel/eglibc/install +++ b/packages/toolchain/devel/eglibc/install @@ -27,6 +27,10 @@ mkdir -p $INSTALL/lib cp $PKG_BUILD/objdir-$1/libc.so.6 $INSTALL/lib cp $PKG_BUILD/objdir-$1/math/libm.so.6 $INSTALL/lib +if [ "$TARGET_ARCH" = "arm" -a "$TARGET_FLOAT" = "hard" ]; then + ln -sf ld-linux.so.3 $INSTALL/lib/ld-linux-armhf.so.3 +fi + mkdir -p $INSTALL/usr/lib cp $PKG_BUILD/objdir-$1/crypt/libcrypt.so.1 $INSTALL/usr/lib cp $PKG_BUILD/objdir-$1/dlfcn/libdl.so.2 $INSTALL/usr/lib @@ -44,7 +48,7 @@ mkdir -p $INSTALL/usr/lib mkdir -p $INSTALL/usr/bin cp $PKG_BUILD/objdir-$1/elf/ldd $INSTALL/usr/bin - sed -i 's%bash%sh%g' $INSTALL/usr/bin/ldd + sed -i 's%/usr/bin/bash%/bin/sh%g' $INSTALL/usr/bin/ldd cp $PKG_BUILD/objdir-$1/locale/locale $INSTALL/usr/bin diff --git a/packages/toolchain/lang/nasm/meta b/packages/toolchain/lang/nasm/meta index cbe9565a7d..835e360507 100644 --- a/packages/toolchain/lang/nasm/meta +++ b/packages/toolchain/lang/nasm/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="nasm" -PKG_VERSION="2.10.03" +PKG_VERSION="2.10.04" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index 957bf6cbe5..81a72ac9ae 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -22,6 +22,10 @@ # usage: sudo ./create_sdcard # example: sudo ./create_sdcard /dev/sdb +# loop example: sudo ./create_sdcard /dev/loop0 ~/vSD.img + +# create an empty image file for use with loop device like this: +# dd if=/dev/zero of=~/vSD.img bs=1M count=910 if [ "$(id -u)" != "0" ]; then clear @@ -38,6 +42,9 @@ if [ -z "$1" ]; then echo "# please execute with your drive as option #" echo "# example: sudo ./create_sdcard /dev/sdb #" echo "# or: sudo ./create_sdcard /dev/mmcblk0 #" + echo "# or: sudo ./create_sdcard /dev/loop0 ~/vSD.img #" + echo "# to create an image file for /dev/loop0 option: #" + echo "# sudo dd if=/dev/zero of=~/vSD.img bs=1M count=910 #" echo "#########################################################" exit 1 fi @@ -46,6 +53,11 @@ DISK="$1" if [ "$DISK" = "/dev/mmcblk0" ]; then PART1="${DISK}p1" PART2="${DISK}p2" +elif [ "$DISK" = "/dev/loop0" ]; then + PART1="${DISK}p1" + PART2="${DISK}p2" + IMGFILE="$2" + losetup $DISK $IMGFILE else PART1="${DISK}1" PART2="${DISK}2" @@ -194,23 +206,30 @@ echo "#########################################################" # create filesystem echo "creating filesystem on $PART1..." - mkfs.vfat "$PART1" -n System + mkfs.vfat "$PART1" -I -n System echo "creating filesystem on $PART2..." mkfs.ext4 "$PART2" -L Storage +# remount loopback device + if [ "$DISK" = "/dev/loop0" ]; then + sync + losetup -d $DISK + losetup $DISK $IMGFILE -o 1048576 --sizelimit 131071488 + PART1=$DISK + fi # mount partition echo "mounting partition $PART1 ..." if [ -d /dev/shm ]; then rm -rf /dev/shm/openelec_install mkdir -p /dev/shm/openelec_install - mount "$PART1" /dev/shm/openelec_install + mount -t vfat "$PART1" /dev/shm/openelec_install MOUNTPOINT=/dev/shm/openelec_install else rm -rf /tmp/openelec_install mkdir -p /tmp/openelec_install - mount "$PART1" /tmp/openelec_install + mount -t vfat "$PART1" /tmp/openelec_install MOUNTPOINT=/tmp/openelec_install fi @@ -239,4 +258,9 @@ echo "#########################################################" echo "cleaning tempdir..." rmdir $MOUNTPOINT +# unmount loopback device + if [ "$DISK" = "/dev/loop0" ]; then + losetup -d $DISK + fi + echo "...installation finished" diff --git a/packages/tools/bcm2835-bootloader/meta b/packages/tools/bcm2835-bootloader/meta index 0dce1230e2..74d11f08ea 100644 --- a/packages/tools/bcm2835-bootloader/meta +++ b/packages/tools/bcm2835-bootloader/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bcm2835-bootloader" -PKG_VERSION="cb9513f" +PKG_VERSION="790681a" PKG_REV="1" PKG_ARCH="arm" PKG_LICENSE="nonfree" diff --git a/packages/x11/driver/xf86-video-fglrx/meta b/packages/x11/driver/xf86-video-fglrx/meta index 8b486517f8..2e695b7a03 100644 --- a/packages/x11/driver/xf86-video-fglrx/meta +++ b/packages/x11/driver/xf86-video-fglrx/meta @@ -19,12 +19,12 @@ ################################################################################ PKG_NAME="xf86-video-fglrx" -PKG_VERSION="12.8" +PKG_VERSION="12.6" PKG_REV="1" PKG_ARCH="i386 x86_64" PKG_LICENSE="nonfree" PKG_SITE="http://www.ati.com/" -PKG_URL="http://www2.ati.com/drivers/linux/amd-driver-installer-`echo $PKG_VERSION | sed 's/\./-/'`-x86.x86_64.zip" +PKG_URL="http://www2.ati.com/drivers/linux/amd-driver-installer-`echo $PKG_VERSION | sed 's/\./-/'`-x86.x86_64.run" PKG_DEPENDS="linux libX11 libXinerama libXcomposite" PKG_BUILD_DEPENDS="toolchain util-macros libX11 libXinerama libXcomposite linux" PKG_PRIORITY="optional" diff --git a/packages/x11/driver/xf86-video-fglrx/unpack b/packages/x11/driver/xf86-video-fglrx/unpack index 505888bc86..1f79207257 100755 --- a/packages/x11/driver/xf86-video-fglrx/unpack +++ b/packages/x11/driver/xf86-video-fglrx/unpack @@ -24,13 +24,10 @@ require_eglibc $1 -ZIP_PKG="`echo $PKG_URL | sed 's%.*/\(.*\)$%\1%'`" +ATI_PKG="`echo $PKG_URL | sed 's%.*/\(.*\)$%\1%'`" [ -d $PKG_BUILD ] && rm -rf $PKG_BUILD -mkdir -p $BUILD/${PKG_NAME}-${PKG_VERSION} - unzip $SOURCES/$1/$ZIP_PKG -d $BUILD/${PKG_NAME}-${PKG_VERSION} >/dev/null 2>&1 - ATI_PKG=`ls -d $BUILD/${PKG_NAME}-${PKG_VERSION}/amd-driver-installer-*.run` - sh $ATI_PKG --extract $BUILD/$PKG_NAME-$PKG_VERSION +sh $SOURCES/$1/$ATI_PKG --extract $BUILD/$PKG_NAME-$PKG_VERSION echo "### Applying upstream patches ###" diff --git a/packages/x11/driver/xf86-video-intel/meta b/packages/x11/driver/xf86-video-intel/meta index 0621216fbb..13b8aa9603 100644 --- a/packages/x11/driver/xf86-video-intel/meta +++ b/packages/x11/driver/xf86-video-intel/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xf86-video-intel" -PKG_VERSION="2.20.4" +PKG_VERSION="2.20.6" PKG_REV="1" PKG_ARCH="i386 x86_64" PKG_LICENSE="OSS" diff --git a/packages/x11/toolkits/gdk-pixbuf/meta b/packages/x11/toolkits/gdk-pixbuf/meta index febb29cb34..2d3aa572dc 100644 --- a/packages/x11/toolkits/gdk-pixbuf/meta +++ b/packages/x11/toolkits/gdk-pixbuf/meta @@ -19,12 +19,12 @@ ################################################################################ PKG_NAME="gdk-pixbuf" -PKG_VERSION="2.24.1" +PKG_VERSION="2.26.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="http://www.gtk.org/" -PKG_URL="http://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/2.24/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_URL="http://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/2.26/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS="glib" PKG_BUILD_DEPENDS="toolchain glib libjpeg-turbo libpng jasper" PKG_PRIORITY="optional" diff --git a/packages/x11/xserver/xorg-server/meta b/packages/x11/xserver/xorg-server/meta index 8777e07bb7..da38761fad 100644 --- a/packages/x11/xserver/xorg-server/meta +++ b/packages/x11/xserver/xorg-server/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xorg-server" -PKG_VERSION="1.12.3" +PKG_VERSION="1.12.4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-05_pkg_config.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-05_pkg_config.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-05_pkg_config.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-05_pkg_config.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-14-detect_radeon.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-14-detect_radeon.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-14-detect_radeon.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-14-detect_radeon.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-20_extra_modelines_fromxorg.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-20_extra_modelines_fromxorg.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-20_extra_modelines_fromxorg.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-20_extra_modelines_fromxorg.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-81-compile_fixes.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-81-compile_fixes.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-81-compile_fixes.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-81-compile_fixes.patch diff --git a/projects/ATV/linux/linux.i386.conf b/projects/ATV/linux/linux.i386.conf index 929d285e61..296ac06b0b 100644 --- a/projects/ATV/linux/linux.i386.conf +++ b/projects/ATV/linux/linux.i386.conf @@ -621,7 +621,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -633,26 +633,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -695,17 +676,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2651,7 +2621,7 @@ CONFIG_LIRC_IGORPLUGUSB=m # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/ATV/options b/projects/ATV/options index 7f565cd345..20f247a32b 100755 --- a/projects/ATV/options +++ b/projects/ATV/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -171,9 +167,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -301,10 +294,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Fusion/linux/linux.i386.conf b/projects/Fusion/linux/linux.i386.conf index fae81ca467..9535c141bf 100644 --- a/projects/Fusion/linux/linux.i386.conf +++ b/projects/Fusion/linux/linux.i386.conf @@ -624,7 +624,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -636,26 +636,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -698,17 +679,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2966,7 +2936,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Fusion/linux/linux.x86_64.conf b/projects/Fusion/linux/linux.x86_64.conf index bc95037ef1..37e7af3682 100644 --- a/projects/Fusion/linux/linux.x86_64.conf +++ b/projects/Fusion/linux/linux.x86_64.conf @@ -585,7 +585,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -597,26 +597,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -659,17 +640,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2906,7 +2876,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Fusion/options b/projects/Fusion/options index 721c563e09..0434431ed6 100755 --- a/projects/Fusion/options +++ b/projects/Fusion/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf index 0fd14a4192..1862c72ab5 100644 --- a/projects/Generic/linux/linux.i386.conf +++ b/projects/Generic/linux/linux.i386.conf @@ -628,7 +628,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -640,26 +640,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -702,17 +683,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -3139,7 +3109,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Generic/options b/projects/Generic/options index e7157be03a..ea8192c3be 100755 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Generic_OSS/linux/linux.i386.conf b/projects/Generic_OSS/linux/linux.i386.conf index 7ddf045c58..8bb6752a0c 100644 --- a/projects/Generic_OSS/linux/linux.i386.conf +++ b/projects/Generic_OSS/linux/linux.i386.conf @@ -628,7 +628,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -640,26 +640,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -702,17 +683,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -3141,7 +3111,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Generic_OSS/options b/projects/Generic_OSS/options index fdca97267a..eadb426acc 100755 --- a/projects/Generic_OSS/options +++ b/projects/Generic_OSS/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/ION/linux/linux.i386.conf b/projects/ION/linux/linux.i386.conf index 5d75362656..41181f123a 100644 --- a/projects/ION/linux/linux.i386.conf +++ b/projects/ION/linux/linux.i386.conf @@ -624,7 +624,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -636,26 +636,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -698,17 +679,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2960,7 +2930,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/ION/linux/linux.x86_64.conf b/projects/ION/linux/linux.x86_64.conf index 1ea50df616..088ae95c2e 100644 --- a/projects/ION/linux/linux.x86_64.conf +++ b/projects/ION/linux/linux.x86_64.conf @@ -572,7 +572,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -584,26 +584,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -646,17 +627,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2885,7 +2855,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/ION/options b/projects/ION/options index d5da8ca95c..4f7bc0bb21 100755 --- a/projects/ION/options +++ b/projects/ION/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Intel/linux/linux.i386.conf b/projects/Intel/linux/linux.i386.conf index 0b10bd744f..a69167d7a0 100644 --- a/projects/Intel/linux/linux.i386.conf +++ b/projects/Intel/linux/linux.i386.conf @@ -626,7 +626,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -638,26 +638,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -700,17 +681,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -3027,7 +2997,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Intel/linux/linux.x86_64.conf b/projects/Intel/linux/linux.x86_64.conf index 4415527ba3..5e8c7a53c5 100644 --- a/projects/Intel/linux/linux.x86_64.conf +++ b/projects/Intel/linux/linux.x86_64.conf @@ -575,7 +575,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -587,26 +587,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -649,17 +630,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2953,7 +2923,7 @@ CONFIG_LIRC_IGORPLUGUSB=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Intel/options b/projects/Intel/options index c172c033bd..f5c9870bf5 100755 --- a/projects/Intel/options +++ b/projects/Intel/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/RPi/linux/linux.arm.conf b/projects/RPi/linux/linux.arm.conf index 4ea146833c..4cd67a4609 100644 --- a/projects/RPi/linux/linux.arm.conf +++ b/projects/RPi/linux/linux.arm.conf @@ -1772,7 +1772,7 @@ CONFIG_LIRC_IGORPLUGUSB=y # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set CONFIG_CLKDEV_LOOKUP=y diff --git a/projects/RPi/linux/linux.arm.conf.3.1.10 b/projects/RPi/linux/linux.arm.conf.3.1.10 index 8c89f48729..1a5bd7f1e4 100644 --- a/projects/RPi/linux/linux.arm.conf.3.1.10 +++ b/projects/RPi/linux/linux.arm.conf.3.1.10 @@ -1640,7 +1640,7 @@ CONFIG_LIRC_IGORPLUGUSB=y # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # CONFIG_ATH6K_LEGACY is not set # CONFIG_USB_ENESTORAGE is not set diff --git a/projects/RPi/options b/projects/RPi/options index 48abefdd24..b7e8102d46 100755 --- a/projects/RPi/options +++ b/projects/RPi/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -111,10 +107,8 @@ SQUASHFS_COMPRESSION="lzo" # Mediacenter to use (xbmc / no) - if [ "$XBMC" = frodo ]; then + if [ "$XBMC" = frodo -o "$PROJECT" = RPi ]; then MEDIACENTER="xbmc-frodo" - elif [ "$PROJECT" = RPi ]; then - MEDIACENTER="xbmc-rpi" else MEDIACENTER="xbmc" fi @@ -172,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS aver_h826d hdhomerun-driver vtuner-driver" - fi # build with network support (yes / no) NETWORK="yes" @@ -302,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Ultra/linux/linux.x86_64.conf b/projects/Ultra/linux/linux.x86_64.conf index ffb44b60f0..627d557131 100644 --- a/projects/Ultra/linux/linux.x86_64.conf +++ b/projects/Ultra/linux/linux.x86_64.conf @@ -572,7 +572,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -584,26 +584,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -646,17 +627,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -2698,7 +2668,7 @@ CONFIG_LIRC_IGORPLUGUSB=m # CONFIG_LIRC_SASEM is not set # CONFIG_LIRC_SERIAL is not set # CONFIG_LIRC_SIR is not set -# CONFIG_LIRC_TTUSBIR is not set +CONFIG_LIRC_TTUSBIR=m # CONFIG_LIRC_ZILOG is not set # diff --git a/projects/Ultra/options b/projects/Ultra/options index 151dfbed68..ab0dcf8b2e 100755 --- a/projects/Ultra/options +++ b/projects/Ultra/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,9 +166,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Virtual/linux/linux.i386.conf b/projects/Virtual/linux/linux.i386.conf index c063c9a018..0ed728adf3 100644 --- a/projects/Virtual/linux/linux.i386.conf +++ b/projects/Virtual/linux/linux.i386.conf @@ -624,7 +624,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -636,26 +636,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -698,17 +679,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set diff --git a/projects/Virtual/linux/linux.x86_64.conf b/projects/Virtual/linux/linux.x86_64.conf index 6a350bcbca..97408877a8 100644 --- a/projects/Virtual/linux/linux.x86_64.conf +++ b/projects/Virtual/linux/linux.x86_64.conf @@ -572,7 +572,7 @@ CONFIG_IP_PIMSM_V2=y # 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_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -584,26 +584,7 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MROUTE is not set +# CONFIG_IPV6 is not set # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y @@ -646,17 +627,6 @@ CONFIG_IP_NF_FILTER=y # CONFIG_IP_NF_TARGET_ULOG is not set # CONFIG_IP_NF_MANGLE is not set # CONFIG_IP_NF_RAW is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_NF_DEFRAG_IPV6 is not set -CONFIG_IP6_NF_IPTABLES=y -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -CONFIG_IP6_NF_FILTER=y -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set diff --git a/projects/Virtual/options b/projects/Virtual/options index ac506b9aa6..fae6852b2f 100755 --- a/projects/Virtual/options +++ b/projects/Virtual/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -165,9 +161,6 @@ # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" ADDITIONAL_DRIVERS="RTL8192CU vboxguest" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS" - fi # build with network support (yes / no) NETWORK="yes" @@ -295,10 +288,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/tools/mkpkg/mkpkg_tvheadend b/tools/mkpkg/mkpkg_tvheadend index b8e14f154c..eea517819c 100755 --- a/tools/mkpkg/mkpkg_tvheadend +++ b/tools/mkpkg/mkpkg_tvheadend @@ -33,8 +33,8 @@ echo "copying sources..." rm -rf hts-tvheadend-$GIT_REV cp -R hts-tvheadend.git hts-tvheadend-$GIT_REV -echo "cleaning sources..." - rm -rf hts-tvheadend-$GIT_REV/.git +#echo "cleaning sources..." +# rm -rf hts-tvheadend-$GIT_REV/.git echo "packing sources..." tar cvJf hts-tvheadend-$GIT_REV.tar.xz hts-tvheadend-$GIT_REV diff --git a/tools/mkpkg/mkpkg_xbmc-frodo-pvr b/tools/mkpkg/mkpkg_xbmc-frodo-pvr deleted file mode 100755 index 8d93733912..0000000000 --- a/tools/mkpkg/mkpkg_xbmc-frodo-pvr +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc-frodo" -PKG_VERSION="pvr" -GIT_REPO="-b master git://github.com/opdenkamp/xbmc.git" -DEST_DIR="$PKG_NAME-pvr" - -echo "getting sources..." - if [ ! -d $DEST_DIR-latest ]; then - git clone $GIT_REPO $DEST_DIR-latest - fi - - cd $DEST_DIR-latest - git pull - -echo "getting version..." - GIT_REV=`git log -n1 --format=%h` - echo $GIT_REV - cd .. - PKG_VERSION="$PKG_VERSION-$GIT_REV" - -echo "copying sources..." - rm -rf $PKG_NAME-$PKG_VERSION - cp -R $DEST_DIR-latest $PKG_NAME-$PKG_VERSION - echo "$GIT_REV" > $PKG_NAME-$PKG_VERSION/git.version - -echo "cleaning sources..." - rm -rf $PKG_NAME-$PKG_VERSION/.git - -echo "seperating theme..." - rm -rf $PKG_NAME-theme-Confluence-$PKG_VERSION - mv $PKG_NAME-$PKG_VERSION/addons/skin.confluence $PKG_NAME-theme-Confluence-$PKG_VERSION - -echo "cleaning sources..." - rm -rf $PKG_NAME-$PKG_VERSION/visualisations - rm -rf $PKG_NAME-$PKG_VERSION/lib/libSDL-* - rm -rf $PKG_NAME-$PKG_VERSION/lib/libcurl-* - rm -rf $PKG_NAME-$PKG_VERSION/project - - for i in "Changelog" "Fake\ Episode\ Maker" "MingwBuildEnvironment" \ - "PackageMaker" "Translator" "XBMCLive" "XprPack" \ - "HardwareConfigure" "Mach5" "osx" "UpdateThumbs.py" "XBMCTex"; do - rm -rf $PKG_NAME-$PKG_VERSION/tools/$i - done - - for i in dll a lib so bat; do - find $PKG_NAME-$PKG_VERSION -name *.$i -exec rm -rf {} ";" - done - - # bundled win32 binaries - rm -r $PKG_NAME-$PKG_VERSION/xbmc/visualizations/XBMCProjectM/win32 - -echo "packing sources..." - tar cvJf $PKG_NAME-$PKG_VERSION.tar.xz $PKG_NAME-$PKG_VERSION - tar cvJf $PKG_NAME-theme-Confluence-$PKG_VERSION.tar.xz $PKG_NAME-theme-Confluence-$PKG_VERSION - -echo "remove temporary sourcedir..." - rm -rf $PKG_NAME-$PKG_VERSION - rm -rf $PKG_NAME-theme-Confluence-$PKG_VERSION diff --git a/packages/mediacenter/xbmc-rpi/scripts/gputemp b/tools/mkpkg/mkpkg_xbmc-pvr-addons similarity index 64% rename from packages/mediacenter/xbmc-rpi/scripts/gputemp rename to tools/mkpkg/mkpkg_xbmc-pvr-addons index d5152aa4f6..1ae56728dd 100755 --- a/packages/mediacenter/xbmc-rpi/scripts/gputemp +++ b/tools/mkpkg/mkpkg_xbmc-pvr-addons @@ -1,5 +1,4 @@ #!/bin/sh - ################################################################################ # This file is part of OpenELEC - http://www.openelec.tv # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) @@ -20,19 +19,25 @@ # http://www.gnu.org/copyleft/gpl.html ################################################################################ -TEMP="0" +echo "getting sources..." + if [ ! -d xbmc-pvr-addons.git ]; then + git clone git://github.com/opdenkamp/xbmc-pvr-addons.git xbmc-pvr-addons.git + fi -if lspci -n | grep 0300 | grep -q 10de; then - [ -f /usr/bin/nvidia-smi ] && TEMP=`/usr/bin/nvidia-smi -q -x | grep 'gpu_temp' | awk '{ print $1 }' | sed 's,,,g'` -fi + cd xbmc-pvr-addons.git + git pull + GIT_REV=`git log -n1 --format=%h` + cd .. -if lspci -n | grep 0300 | grep -q 1002; then - if [ -f /storage/.config/xorg.conf ]; then - XORG="/storage/.config/xorg.conf" - else - XORG="/etc/X11/xorg-fglrx.conf" - fi - [ -f /usr/bin/aticonfig ] && TEMP=`/usr/bin/aticonfig -i $XORG --od-gettemperature | grep Temperature | cut -f 2 -d "-" | cut -f 1 -d "." | sed -e "s, ,,"` -fi +echo "copying sources..." + rm -rf xbmc-pvr-addons-$GIT_REV + cp -R xbmc-pvr-addons.git xbmc-pvr-addons-$GIT_REV -echo "${TEMP} C" +echo "cleaning sources..." + rm -rf xbmc-pvr-addons-$GIT_REV/.git + +echo "packing sources..." + tar cvJf xbmc-pvr-addons-$GIT_REV.tar.xz xbmc-pvr-addons-$GIT_REV + +echo "remove temporary sourcedir..." + rm -rf xbmc-pvr-addons-$GIT_REV diff --git a/tools/mkpkg/mkpkg_xbmc-rpi b/tools/mkpkg/mkpkg_xbmc-rpi deleted file mode 100755 index 1a5d90f5bc..0000000000 --- a/tools/mkpkg/mkpkg_xbmc-rpi +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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, 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc-rpi" -GIT_REPO="-b master git@github.com:xbmc/xbmc-rbp.git" -DEST_DIR="$PKG_NAME" - -echo "getting sources..." - if [ ! -d $DEST_DIR-latest ]; then - git clone $GIT_REPO $DEST_DIR-latest - fi - - cd $DEST_DIR-latest - git pull - -echo "getting version..." - GIT_REV=`git log -n1 --format=%h` - echo $GIT_REV - cd .. - -echo "copying sources..." - rm -rf $PKG_NAME-$GIT_REV - cp -R $DEST_DIR-latest $PKG_NAME-$GIT_REV - echo "$GIT_REV" > $PKG_NAME-$GIT_REV/git.version - -echo "cleaning sources..." - rm -rf $PKG_NAME-$GIT_REV/.git - -echo "seperating theme..." - rm -rf $PKG_NAME-theme-Confluence-$GIT_REV - mv $PKG_NAME-$GIT_REV/addons/skin.confluence $PKG_NAME-theme-Confluence-$GIT_REV -# rm -rf $PKG_NAME-theme-Touched-$GIT_REV -# mv $PKG_NAME-$GIT_REV/addons/skin.touched $PKG_NAME-theme-Touched-$GIT_REV - -echo "cleaning sources..." - rm -rf $PKG_NAME-$GIT_REV/visualisations - rm -rf $PKG_NAME-$GIT_REV/lib/libSDL-* - rm -rf $PKG_NAME-$GIT_REV/lib/libcurl-* - rm -rf $PKG_NAME-$GIT_REV/project - - for i in "Changelog" "Fake\ Episode\ Maker" "MingwBuildEnvironment" \ - "PackageMaker" "Translator" "XBMCLive" "XprPack" \ - "HardwareConfigure" "Mach5" "osx" "UpdateThumbs.py" "XBMCTex"; do - rm -rf $PKG_NAME-$GIT_REV/tools/$i - done - - for i in dll a lib so bat; do - find $PKG_NAME-$GIT_REV -name *.$i -exec rm -rf {} ";" - done - - # bundled win32 binaries - rm -r $PKG_NAME-$GIT_REV/xbmc/visualizations/XBMCProjectM/win32 - -echo "packing sources..." - tar cvJf $PKG_NAME-$GIT_REV.tar.xz $PKG_NAME-$GIT_REV - tar cvJf $PKG_NAME-theme-Confluence-$GIT_REV.tar.xz $PKG_NAME-theme-Confluence-$GIT_REV -# tar cvJf $PKG_NAME-theme-Touched-$GIT_REV.tar.xz $PKG_NAME-theme-Touched-$GIT_REV - -echo "remove temporary sourcedir..." - rm -rf $PKG_NAME-$GIT_REV - rm -rf $PKG_NAME-theme-Confluence-$GIT_REV -# rm -rf $PKG_NAME-theme-Touched-$GIT_REV