diff --git a/patches/linux-4.19.90/0001-asound-time64.diff b/patches/linux-4.19.90/0001-asound-time64.diff new file mode 100644 index 0000000..a943961 --- /dev/null +++ b/patches/linux-4.19.90/0001-asound-time64.diff @@ -0,0 +1,289 @@ +diff -ur a/include/uapi/sound/asound.h b/include/uapi/sound/asound.h +--- a/include/uapi/sound/asound.h 2019-10-15 12:26:39.634141383 -0400 ++++ b/include/uapi/sound/asound.h 2020-01-30 21:43:56.477450321 -0500 +@@ -35,6 +35,8 @@ + #include + #endif + ++#include ++ + /* + * protocol version + */ +@@ -154,7 +156,7 @@ + * * + *****************************************************************************/ + +-#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 14) ++#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 15) + + typedef unsigned long snd_pcm_uframes_t; + typedef signed long snd_pcm_sframes_t; +@@ -301,7 +303,9 @@ + #define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */ + #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */ + +- ++#if (__BITS_PER_LONG == 32 && defined(__USE_TIME_BITS64)) || defined __KERNEL__ ++#define __SND_STRUCT_TIME64 ++#endif + + typedef int __bitwise snd_pcm_state_t; + #define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */ +@@ -317,8 +321,17 @@ + + enum { + SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000, +- SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000, +- SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000, ++ SNDRV_PCM_MMAP_OFFSET_STATUS_OLD = 0x80000000, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD = 0x81000000, ++ SNDRV_PCM_MMAP_OFFSET_STATUS_NEW = 0x82000000, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW = 0x83000000, ++#ifdef __SND_STRUCT_TIME64 ++ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_NEW, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW, ++#else ++ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_OLD, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD, ++#endif + }; + + union snd_pcm_sync_id { +@@ -456,8 +469,13 @@ + SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED + }; + ++#ifndef __KERNEL__ ++/* explicit padding avoids incompatibility between i386 and x86-64 */ ++typedef struct { unsigned char pad[sizeof(time_t) - sizeof(int)] } __time_pad; ++ + struct snd_pcm_status { + snd_pcm_state_t state; /* stream state */ ++ __time_pad pad1; /* align to timespec */ + struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */ + struct timespec tstamp; /* reference timestamp */ + snd_pcm_uframes_t appl_ptr; /* appl ptr */ +@@ -473,17 +491,48 @@ + __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */ + unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */ + }; ++#endif + +-struct snd_pcm_mmap_status { ++/* ++ * For mmap operations, we need the 64-bit layout, both for compat mode, ++ * and for y2038 compatibility. For 64-bit applications, the two definitions ++ * are identical, so we keep the traditional version. ++ */ ++#ifdef __SND_STRUCT_TIME64 ++#define __snd_pcm_mmap_status64 snd_pcm_mmap_status ++#define __snd_pcm_mmap_control64 snd_pcm_mmap_control ++#define __snd_pcm_sync_ptr64 snd_pcm_sync_ptr ++#ifdef __KERNEL__ ++#define __snd_timespec64 __kernel_timespec ++#else ++#define __snd_timespec64 timespec ++#endif ++struct __snd_timespec { ++ __s32 tv_sec; ++ __s32 tv_nsec; ++}; ++#else ++#define __snd_pcm_mmap_status snd_pcm_mmap_status ++#define __snd_pcm_mmap_control snd_pcm_mmap_control ++#define __snd_pcm_sync_ptr snd_pcm_sync_ptr ++#define __snd_timespec timespec ++struct __snd_timespec64 { ++ __s64 tv_sec; ++ __s64 tv_nsec; ++}; ++ ++#endif ++ ++struct __snd_pcm_mmap_status { + snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */ + int pad1; /* Needed for 64 bit alignment */ + snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ +- struct timespec tstamp; /* Timestamp */ ++ struct __snd_timespec tstamp; /* Timestamp */ + snd_pcm_state_t suspended_state; /* RO: suspended stream state */ +- struct timespec audio_tstamp; /* from sample counter or wall clock */ ++ struct __snd_timespec audio_tstamp; /* from sample counter or wall clock */ + }; + +-struct snd_pcm_mmap_control { ++struct __snd_pcm_mmap_control { + snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ + snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ + }; +@@ -492,14 +541,59 @@ + #define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */ + #define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */ + +-struct snd_pcm_sync_ptr { ++struct __snd_pcm_sync_ptr { + unsigned int flags; + union { +- struct snd_pcm_mmap_status status; ++ struct __snd_pcm_mmap_status status; + unsigned char reserved[64]; + } s; + union { +- struct snd_pcm_mmap_control control; ++ struct __snd_pcm_mmap_control control; ++ unsigned char reserved[64]; ++ } c; ++}; ++ ++#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN) ++typedef char __pad_before_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; ++typedef char __pad_after_uframe[0]; ++#endif ++ ++#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN) ++typedef char __pad_before_uframe[0]; ++typedef char __pad_after_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; ++#endif ++ ++struct __snd_pcm_mmap_status64 { ++ __s32 state; /* RO: state - SNDRV_PCM_STATE_XXXX */ ++ __u32 pad1; /* Needed for 64 bit alignment */ ++ __pad_before_uframe __pad1; ++ snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ ++ __pad_after_uframe __pad2; ++ struct __snd_timespec64 tstamp; /* Timestamp */ ++ __s32 suspended_state; /* RO: suspended stream state */ ++ __u32 pad3; /* Needed for 64 bit alignment */ ++ struct __snd_timespec64 audio_tstamp; /* sample counter or wall clock */ ++}; ++ ++struct __snd_pcm_mmap_control64 { ++ __pad_before_uframe __pad1; ++ snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ ++ __pad_before_uframe __pad2; ++ ++ __pad_before_uframe __pad3; ++ snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ ++ __pad_after_uframe __pad4; ++}; ++ ++struct __snd_pcm_sync_ptr64 { ++ __u32 flags; ++ __u32 pad1; ++ union { ++ struct __snd_pcm_mmap_status64 status; ++ unsigned char reserved[64]; ++ } s; ++ union { ++ struct __snd_pcm_mmap_control64 control; + unsigned char reserved[64]; + } c; + }; +@@ -584,6 +678,8 @@ + #define SNDRV_PCM_IOCTL_STATUS _IOR('A', 0x20, struct snd_pcm_status) + #define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t) + #define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22) ++#define __SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct __snd_pcm_sync_ptr) ++#define __SNDRV_PCM_IOCTL_SYNC_PTR64 _IOWR('A', 0x23, struct __snd_pcm_sync_ptr64) + #define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr) + #define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status) + #define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info) +@@ -614,7 +710,7 @@ + * Raw MIDI section - /dev/snd/midi?? + */ + +-#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0) ++#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 1) + + enum { + SNDRV_RAWMIDI_STREAM_OUTPUT = 0, +@@ -648,13 +744,16 @@ + unsigned char reserved[16]; /* reserved for future use */ + }; + ++#ifndef __KERNEL__ + struct snd_rawmidi_status { + int stream; ++ __time_pad pad1; + struct timespec tstamp; /* Timestamp */ + size_t avail; /* available bytes */ + size_t xruns; /* count of overruns since last status (in bytes) */ + unsigned char reserved[16]; /* reserved for future use */ + }; ++#endif + + #define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int) + #define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info) +@@ -667,7 +766,7 @@ + * Timer section - /dev/snd/timer + */ + +-#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6) ++#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7) + + enum { + SNDRV_TIMER_CLASS_NONE = -1, +@@ -761,6 +860,7 @@ + unsigned char reserved[60]; /* reserved */ + }; + ++#ifndef __KERNEL__ + struct snd_timer_status { + struct timespec tstamp; /* Timestamp - last update */ + unsigned int resolution; /* current period resolution in ns */ +@@ -769,10 +869,11 @@ + unsigned int queue; /* used queue size */ + unsigned char reserved[64]; /* reserved */ + }; ++#endif + + #define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int) + #define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id) +-#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int) ++#define SNDRV_TIMER_IOCTL_TREAD_OLD _IOW('T', 0x02, int) + #define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo) + #define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams) + #define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus) +@@ -785,6 +886,15 @@ + #define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1) + #define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2) + #define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3) ++#define SNDRV_TIMER_IOCTL_TREAD64 _IOW('T', 0xa4, int) ++ ++#if __BITS_PER_LONG == 64 ++#define SNDRV_TIMER_IOCTL_TREAD SNDRV_TIMER_IOCTL_TREAD_OLD ++#else ++#define SNDRV_TIMER_IOCTL_TREAD ((sizeof(__kernel_long_t) >= sizeof(time_t)) ? \ ++ SNDRV_TIMER_IOCTL_TREAD_OLD : \ ++ SNDRV_TIMER_IOCTL_TREAD64) ++#endif + + struct snd_timer_read { + unsigned int resolution; +@@ -810,11 +920,15 @@ + SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10, + }; + ++#ifndef __KERNEL__ + struct snd_timer_tread { + int event; ++ __time_pad pad1; + struct timespec tstamp; + unsigned int val; ++ __time_pad pad2; + }; ++#endif + + /**************************************************************************** + * * +@@ -955,8 +1069,7 @@ + } bytes; + struct snd_aes_iec958 iec958; + } value; /* RO */ +- struct timespec tstamp; +- unsigned char reserved[128-sizeof(struct timespec)]; ++ unsigned char reserved[128]; + }; + + struct snd_ctl_tlv { diff --git a/patches/linux-headers-4.19.88/0001-asound-time64.diff b/patches/linux-headers-4.19.88/0001-asound-time64.diff new file mode 100644 index 0000000..1a23259 --- /dev/null +++ b/patches/linux-headers-4.19.88/0001-asound-time64.diff @@ -0,0 +1,289 @@ +diff -ur a/generic/include/sound/asound.h b/generic/include/sound/asound.h +--- a/generic/include/sound/asound.h 2019-10-15 12:26:39.634141383 -0400 ++++ b/generic/include/sound/asound.h 2020-01-30 21:43:56.477450321 -0500 +@@ -35,6 +35,8 @@ + #include + #endif + ++#include ++ + /* + * protocol version + */ +@@ -154,7 +156,7 @@ + * * + *****************************************************************************/ + +-#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 14) ++#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 15) + + typedef unsigned long snd_pcm_uframes_t; + typedef signed long snd_pcm_sframes_t; +@@ -301,7 +303,9 @@ + #define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */ + #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */ + +- ++#if (__BITS_PER_LONG == 32 && defined(__USE_TIME_BITS64)) || defined __KERNEL__ ++#define __SND_STRUCT_TIME64 ++#endif + + typedef int __bitwise snd_pcm_state_t; + #define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */ +@@ -317,8 +321,17 @@ + + enum { + SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000, +- SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000, +- SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000, ++ SNDRV_PCM_MMAP_OFFSET_STATUS_OLD = 0x80000000, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD = 0x81000000, ++ SNDRV_PCM_MMAP_OFFSET_STATUS_NEW = 0x82000000, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW = 0x83000000, ++#ifdef __SND_STRUCT_TIME64 ++ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_NEW, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_NEW, ++#else ++ SNDRV_PCM_MMAP_OFFSET_STATUS = SNDRV_PCM_MMAP_OFFSET_STATUS_OLD, ++ SNDRV_PCM_MMAP_OFFSET_CONTROL = SNDRV_PCM_MMAP_OFFSET_CONTROL_OLD, ++#endif + }; + + union snd_pcm_sync_id { +@@ -456,8 +469,13 @@ + SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED + }; + ++#ifndef __KERNEL__ ++/* explicit padding avoids incompatibility between i386 and x86-64 */ ++typedef struct { unsigned char pad[sizeof(time_t) - sizeof(int)] } __time_pad; ++ + struct snd_pcm_status { + snd_pcm_state_t state; /* stream state */ ++ __time_pad pad1; /* align to timespec */ + struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */ + struct timespec tstamp; /* reference timestamp */ + snd_pcm_uframes_t appl_ptr; /* appl ptr */ +@@ -473,17 +491,48 @@ + __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */ + unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */ + }; ++#endif + +-struct snd_pcm_mmap_status { ++/* ++ * For mmap operations, we need the 64-bit layout, both for compat mode, ++ * and for y2038 compatibility. For 64-bit applications, the two definitions ++ * are identical, so we keep the traditional version. ++ */ ++#ifdef __SND_STRUCT_TIME64 ++#define __snd_pcm_mmap_status64 snd_pcm_mmap_status ++#define __snd_pcm_mmap_control64 snd_pcm_mmap_control ++#define __snd_pcm_sync_ptr64 snd_pcm_sync_ptr ++#ifdef __KERNEL__ ++#define __snd_timespec64 __kernel_timespec ++#else ++#define __snd_timespec64 timespec ++#endif ++struct __snd_timespec { ++ __s32 tv_sec; ++ __s32 tv_nsec; ++}; ++#else ++#define __snd_pcm_mmap_status snd_pcm_mmap_status ++#define __snd_pcm_mmap_control snd_pcm_mmap_control ++#define __snd_pcm_sync_ptr snd_pcm_sync_ptr ++#define __snd_timespec timespec ++struct __snd_timespec64 { ++ __s64 tv_sec; ++ __s64 tv_nsec; ++}; ++ ++#endif ++ ++struct __snd_pcm_mmap_status { + snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */ + int pad1; /* Needed for 64 bit alignment */ + snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ +- struct timespec tstamp; /* Timestamp */ ++ struct __snd_timespec tstamp; /* Timestamp */ + snd_pcm_state_t suspended_state; /* RO: suspended stream state */ +- struct timespec audio_tstamp; /* from sample counter or wall clock */ ++ struct __snd_timespec audio_tstamp; /* from sample counter or wall clock */ + }; + +-struct snd_pcm_mmap_control { ++struct __snd_pcm_mmap_control { + snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ + snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ + }; +@@ -492,14 +541,59 @@ + #define SNDRV_PCM_SYNC_PTR_APPL (1<<1) /* get appl_ptr from driver (r/w op) */ + #define SNDRV_PCM_SYNC_PTR_AVAIL_MIN (1<<2) /* get avail_min from driver */ + +-struct snd_pcm_sync_ptr { ++struct __snd_pcm_sync_ptr { + unsigned int flags; + union { +- struct snd_pcm_mmap_status status; ++ struct __snd_pcm_mmap_status status; + unsigned char reserved[64]; + } s; + union { +- struct snd_pcm_mmap_control control; ++ struct __snd_pcm_mmap_control control; ++ unsigned char reserved[64]; ++ } c; ++}; ++ ++#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN) ++typedef char __pad_before_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; ++typedef char __pad_after_uframe[0]; ++#endif ++ ++#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN) ++typedef char __pad_before_uframe[0]; ++typedef char __pad_after_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; ++#endif ++ ++struct __snd_pcm_mmap_status64 { ++ __s32 state; /* RO: state - SNDRV_PCM_STATE_XXXX */ ++ __u32 pad1; /* Needed for 64 bit alignment */ ++ __pad_before_uframe __pad1; ++ snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ ++ __pad_after_uframe __pad2; ++ struct __snd_timespec64 tstamp; /* Timestamp */ ++ __s32 suspended_state; /* RO: suspended stream state */ ++ __u32 pad3; /* Needed for 64 bit alignment */ ++ struct __snd_timespec64 audio_tstamp; /* sample counter or wall clock */ ++}; ++ ++struct __snd_pcm_mmap_control64 { ++ __pad_before_uframe __pad1; ++ snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ ++ __pad_before_uframe __pad2; ++ ++ __pad_before_uframe __pad3; ++ snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ ++ __pad_after_uframe __pad4; ++}; ++ ++struct __snd_pcm_sync_ptr64 { ++ __u32 flags; ++ __u32 pad1; ++ union { ++ struct __snd_pcm_mmap_status64 status; ++ unsigned char reserved[64]; ++ } s; ++ union { ++ struct __snd_pcm_mmap_control64 control; + unsigned char reserved[64]; + } c; + }; +@@ -584,6 +678,8 @@ + #define SNDRV_PCM_IOCTL_STATUS _IOR('A', 0x20, struct snd_pcm_status) + #define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t) + #define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22) ++#define __SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct __snd_pcm_sync_ptr) ++#define __SNDRV_PCM_IOCTL_SYNC_PTR64 _IOWR('A', 0x23, struct __snd_pcm_sync_ptr64) + #define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr) + #define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status) + #define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info) +@@ -614,7 +710,7 @@ + * Raw MIDI section - /dev/snd/midi?? + */ + +-#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0) ++#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 1) + + enum { + SNDRV_RAWMIDI_STREAM_OUTPUT = 0, +@@ -648,13 +744,16 @@ + unsigned char reserved[16]; /* reserved for future use */ + }; + ++#ifndef __KERNEL__ + struct snd_rawmidi_status { + int stream; ++ __time_pad pad1; + struct timespec tstamp; /* Timestamp */ + size_t avail; /* available bytes */ + size_t xruns; /* count of overruns since last status (in bytes) */ + unsigned char reserved[16]; /* reserved for future use */ + }; ++#endif + + #define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int) + #define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info) +@@ -667,7 +766,7 @@ + * Timer section - /dev/snd/timer + */ + +-#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6) ++#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7) + + enum { + SNDRV_TIMER_CLASS_NONE = -1, +@@ -761,6 +860,7 @@ + unsigned char reserved[60]; /* reserved */ + }; + ++#ifndef __KERNEL__ + struct snd_timer_status { + struct timespec tstamp; /* Timestamp - last update */ + unsigned int resolution; /* current period resolution in ns */ +@@ -769,10 +869,11 @@ + unsigned int queue; /* used queue size */ + unsigned char reserved[64]; /* reserved */ + }; ++#endif + + #define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int) + #define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id) +-#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int) ++#define SNDRV_TIMER_IOCTL_TREAD_OLD _IOW('T', 0x02, int) + #define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo) + #define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams) + #define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus) +@@ -785,6 +886,15 @@ + #define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1) + #define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2) + #define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3) ++#define SNDRV_TIMER_IOCTL_TREAD64 _IOW('T', 0xa4, int) ++ ++#if __BITS_PER_LONG == 64 ++#define SNDRV_TIMER_IOCTL_TREAD SNDRV_TIMER_IOCTL_TREAD_OLD ++#else ++#define SNDRV_TIMER_IOCTL_TREAD ((sizeof(__kernel_long_t) >= sizeof(time_t)) ? \ ++ SNDRV_TIMER_IOCTL_TREAD_OLD : \ ++ SNDRV_TIMER_IOCTL_TREAD64) ++#endif + + struct snd_timer_read { + unsigned int resolution; +@@ -810,11 +920,15 @@ + SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10, + }; + ++#ifndef __KERNEL__ + struct snd_timer_tread { + int event; ++ __time_pad pad1; + struct timespec tstamp; + unsigned int val; ++ __time_pad pad2; + }; ++#endif + + /**************************************************************************** + * * +@@ -955,8 +1069,7 @@ + } bytes; + struct snd_aes_iec958 iec958; + } value; /* RO */ +- struct timespec tstamp; +- unsigned char reserved[128-sizeof(struct timespec)]; ++ unsigned char reserved[128]; + }; + + struct snd_ctl_tlv {