$(shell perl -ne 'print "$$1 " if /^typedef\s+.*\s+(\S+)\;/' $(srctree)/include/uapi/linux/dvb/frontend.h)
 
 ENUMS = \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/videodev2.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/audio.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/ca.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/dmx.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/frontend.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/net.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/dvb/video.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/media.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-mediabus.h) \
-       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/v4l2-subdev.h)
+       $(shell perl -ne 'print "$$1 " if /^enum\s+([^\s]+)\s+/' \
+               $(srctree)/include/uapi/linux/videodev2.h \
+               $(srctree)/include/uapi/linux/dvb/audio.h \
+               $(srctree)/include/uapi/linux/dvb/ca.h \
+               $(srctree)/include/uapi/linux/dvb/dmx.h \
+               $(srctree)/include/uapi/linux/dvb/frontend.h \
+               $(srctree)/include/uapi/linux/dvb/net.h \
+               $(srctree)/include/uapi/linux/dvb/video.h \
+               $(srctree)/include/uapi/linux/media.h \
+               $(srctree)/include/uapi/linux/v4l2-mediabus.h \
+               $(srctree)/include/uapi/linux/v4l2-subdev.h)
+
+ENUM_DEFS = \
+       $(shell perl -e 'while (<>) { if ($$enum) {print "$$1\n" if (/\s*([A-Z]\S+)\b/); } $$enum = 0 if ($enum && /^\}/); $$enum = 1 if(/^\s*enum\s/); }' \
+               $(srctree)/include/uapi/linux/dvb/audio.h \
+               $(srctree)/include/uapi/linux/dvb/ca.h \
+               $(srctree)/include/uapi/linux/dvb/dmx.h \
+               $(srctree)/include/uapi/linux/dvb/frontend.h \
+               $(srctree)/include/uapi/linux/dvb/net.h \
+               $(srctree)/include/uapi/linux/dvb/video.h)
 
 STRUCTS = \
        $(shell perl -ne 'print "$$1 " if /^struct\s+([^\s]+)\s+/' $(srctree)/include/uapi/linux/videodev2.h) \
        @(                                      \
        echo "<programlisting>") > $@
        @(                                      \
+       for ident in $(ENUM_DEFS) ; do          \
+         entity=`echo $$ident | tr _ -` ;      \
+         r="$$r s/([^\w\-])$$ident([^\w\-])/\1\&$$entity\;\2/g;";\
+       done;                                   \
        expand --tabs=8 < $< |                  \
          sed $(ESCAPE) $(DVB_DOCUMENTED) |     \
-         sed 's/i\.e\./&ie;/') >> $@
+         sed 's/i\.e\./&ie;/' |                \
+         perl -ne "$$r print $$_;") >> $@
        @(                                      \
        echo "</programlisting>") >> $@
 
            "linkend='$$entity'>$$ident</link>\">" >>$@ ;               \
        done)
        @(                                                              \
+       echo -e "\n<!-- Enum definitions -->") >>$@
+       @(                                                              \
+       for ident in $(ENUM_DEFS) ; do                                  \
+         entity=`echo $$ident | tr _ -` ;                              \
+         echo "<!ENTITY $$entity \"<link"                              \
+           "linkend='$$entity'><constant>$$ident</constant></link>\">" \
+         >>$@ ;                                                        \
+       done)
+       @(                                                              \
        echo -e "\n<!-- Structures -->") >>$@
        @(                                                              \
        for ident in $(STRUCTS) ; do                                    \