Linked deque implementation in C
Looks good. Few notes:


There is no reason to #include &lt;stdlib.h&gt; in both linkedlist.h and linkedlist.c. Pick one (I recommend linkedlist.c).
Allocation of a struct llnode instance definitely belongs to ll_node_init, and its signature should be 

static struct ll_node * ll_node_init(char * data);


Notice static: there is no reason to expose struct ll_node to the client.
Maintain your invariants. It is clear that if (ll_head != NULL) then ll_tail != NULL, and vice versa. For example, push_head should have

    if (ll-&gt;head != NULL) {
        assert(ll-&gt;tail != NULL);
        ll-&gt;head-&gt;prev = node;
    } else {
        assert(ll-&gt;tail == NULL);
        ll-&gt;tail = node;
    }

The code doesn't really care what kind of data it queues. You may consider making the structure more generic with void * data.