/*
 * Copyright (C) 2004-2006 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef __ASM_AVR32_POSIX_TYPES_H
#define __ASM_AVR32_POSIX_TYPES_H

/*
 * This file is generally used by user-level software, so you need to
 * be a little careful about namespace pollution etc.  Also, we cannot
 * assume GCC is being used.
 */

typedef unsigned long   __kernel_ino_t;
typedef unsigned short  __kernel_mode_t;
typedef unsigned short  __kernel_nlink_t;
typedef long            __kernel_off_t;
typedef int             __kernel_pid_t;
typedef unsigned short  __kernel_ipc_pid_t;
typedef unsigned int	__kernel_uid_t;
typedef unsigned int	__kernel_gid_t;
typedef unsigned long	__kernel_size_t;
typedef long		__kernel_ssize_t;
typedef int             __kernel_ptrdiff_t;
typedef long            __kernel_time_t;
typedef long            __kernel_suseconds_t;
typedef long            __kernel_clock_t;
typedef int             __kernel_timer_t;
typedef int             __kernel_clockid_t;
typedef int             __kernel_daddr_t;
typedef char *          __kernel_caddr_t;
typedef unsigned short  __kernel_uid16_t;
typedef unsigned short  __kernel_gid16_t;
typedef unsigned int    __kernel_uid32_t;
typedef unsigned int    __kernel_gid32_t;

typedef unsigned short  __kernel_old_uid_t;
typedef unsigned short  __kernel_old_gid_t;
typedef unsigned short  __kernel_old_dev_t;

#ifdef __GNUC__
typedef long long       __kernel_loff_t;
#endif

typedef struct {
#if defined(__KERNEL__) || defined(__USE_ALL)
    int     val[2];
#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
    int     __val[2];
#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
} __kernel_fsid_t;

#if defined(__KERNEL__)

#undef  __FD_SET
static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
{
    unsigned long __tmp = __fd / __NFDBITS;
    unsigned long __rem = __fd % __NFDBITS;
    __fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
}

#undef  __FD_CLR
static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
{
    unsigned long __tmp = __fd / __NFDBITS;
    unsigned long __rem = __fd % __NFDBITS;
    __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
}


#undef  __FD_ISSET
static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
{
    unsigned long __tmp = __fd / __NFDBITS;
    unsigned long __rem = __fd % __NFDBITS;
    return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
}

/*
 * This will unroll the loop for the normal constant case (8 ints,
 * for a 256-bit fd_set)
 */
#undef  __FD_ZERO
static __inline__ void __FD_ZERO(__kernel_fd_set *__p)
{
    unsigned long *__tmp = __p->fds_bits;
    int __i;

    if (__builtin_constant_p(__FDSET_LONGS)) {
        switch (__FDSET_LONGS) {
            case 16:
                __tmp[ 0] = 0; __tmp[ 1] = 0;
                __tmp[ 2] = 0; __tmp[ 3] = 0;
                __tmp[ 4] = 0; __tmp[ 5] = 0;
                __tmp[ 6] = 0; __tmp[ 7] = 0;
                __tmp[ 8] = 0; __tmp[ 9] = 0;
                __tmp[10] = 0; __tmp[11] = 0;
                __tmp[12] = 0; __tmp[13] = 0;
                __tmp[14] = 0; __tmp[15] = 0;
                return;

            case 8:
                __tmp[ 0] = 0; __tmp[ 1] = 0;
                __tmp[ 2] = 0; __tmp[ 3] = 0;
                __tmp[ 4] = 0; __tmp[ 5] = 0;
                __tmp[ 6] = 0; __tmp[ 7] = 0;
                return;

            case 4:
                __tmp[ 0] = 0; __tmp[ 1] = 0;
                __tmp[ 2] = 0; __tmp[ 3] = 0;
                return;
        }
    }
    __i = __FDSET_LONGS;
    while (__i) {
        __i--;
        *__tmp = 0;
        __tmp++;
    }
}

#endif /* defined(__KERNEL__) */

#endif /* __ASM_AVR32_POSIX_TYPES_H */
