e6c68c6546773b6deeb2ee4969172a1898b38029
[pandora-kernel.git] / drivers / staging / udlfb / udlfb.h
1 #ifndef UDLFB_H
2 #define UDLFB_H
3
4 /* as libdlo */
5 #define BUF_HIGH_WATER_MARK     1024
6 #define BUF_SIZE                (64*1024)
7
8 struct urb_node {
9         struct list_head entry;
10         struct dlfb_data *dev;
11         struct urb *urb;
12 };
13
14 struct urb_list {
15         struct list_head list;
16         spinlock_t lock;
17         struct semaphore limit_sem;
18         int available;
19         int count;
20         size_t size;
21 };
22
23 struct dlfb_data {
24         struct usb_device *udev;
25         struct device *gdev; /* &udev->dev */
26         struct usb_interface *interface;
27         struct urb *tx_urb, *ctrl_urb;
28         struct fb_info *info;
29         struct urb_list urbs;
30         struct kref kref;
31         char *buf;
32         char *bufend;
33         char *backing_buffer;
34         struct delayed_work deferred_work;
35         struct mutex fb_open_lock;
36         struct mutex bulk_mutex;
37         int fb_count;
38         atomic_t usb_active; /* 0 = update virtual buffer, but no usb traffic */
39         atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
40         atomic_t use_defio; /* 0 = rely on ioctls and blit/copy/fill rects */
41         char edid[128];
42         int sku_pixel_limit;
43         int screen_size;
44         int line_length;
45         struct completion done;
46         int base16;
47         int base16d;
48         int base8;
49         int base8d;
50         u32 pseudo_palette[256];
51         /* blit-only rendering path metrics, exposed through sysfs */
52         atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */
53         atomic_t bytes_identical; /* saved effort with backbuffer comparison */
54         atomic_t bytes_sent; /* to usb, after compression including overhead */
55         atomic_t cpu_kcycles_used; /* transpired during pixel processing */
56         /* interface usage metrics. Clients can call driver via several */
57         atomic_t blit_count;
58         atomic_t copy_count;
59         atomic_t fill_count;
60         atomic_t damage_count;
61         atomic_t defio_fault_count;
62 };
63
64 #define NR_USB_REQUEST_I2C_SUB_IO 0x02
65 #define NR_USB_REQUEST_CHANNEL 0x12
66
67 /* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */
68 #define BULK_SIZE 512
69 #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
70 #define WRITES_IN_FLIGHT (4)
71
72 #define GET_URB_TIMEOUT HZ
73 #define FREE_URB_TIMEOUT (HZ*2)
74
75 static void dlfb_bulk_callback(struct urb *urb)
76 {
77         struct dlfb_data *dev_info = urb->context;
78         complete(&dev_info->done);
79 }
80
81 static void dlfb_edid(struct dlfb_data *dev_info)
82 {
83         int i;
84         int ret;
85         char rbuf[2];
86
87         for (i = 0; i < 128; i++) {
88                 ret =
89                     usb_control_msg(dev_info->udev,
90                                     usb_rcvctrlpipe(dev_info->udev, 0), (0x02),
91                                     (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2,
92                                     0);
93                 dev_info->edid[i] = rbuf[1];
94         }
95
96 }
97
98 static int dlfb_bulk_msg(struct dlfb_data *dev_info, int len)
99 {
100         int ret;
101
102         init_completion(&dev_info->done);
103
104         dev_info->tx_urb->actual_length = 0;
105         dev_info->tx_urb->transfer_buffer_length = len;
106
107         ret = usb_submit_urb(dev_info->tx_urb, GFP_KERNEL);
108         if (!wait_for_completion_timeout(&dev_info->done, 1000)) {
109                 usb_kill_urb(dev_info->tx_urb);
110                 printk("usb timeout !!!\n");
111         }
112
113         return dev_info->tx_urb->actual_length;
114 }
115
116 #define dlfb_set_register insert_command
117
118 /* remove once this gets added to sysfs.h */
119 #define __ATTR_RW(attr) __ATTR(attr, 0644, attr##_show, attr##_store)
120
121 #define dl_err(format, arg...) \
122         dev_err(dev->gdev, "dlfb: " format, ## arg)
123 #define dl_warn(format, arg...) \
124         dev_warn(dev->gdev, "dlfb: " format, ## arg)
125 #define dl_notice(format, arg...) \
126         dev_notice(dev->gdev, "dlfb: " format, ## arg)
127 #define dl_info(format, arg...) \
128         dev_info(dev->gdev, "dlfb: " format, ## arg)
129 #endif