1215976Sjmallett#ifndef __CVMX_USBD_H__
2215976Sjmallett#define __CVMX_USBD_H__
3215976Sjmallett/***********************license start***************
4232812Sjmallett * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights
5215976Sjmallett * reserved.
6215976Sjmallett *
7215976Sjmallett *
8215976Sjmallett * Redistribution and use in source and binary forms, with or without
9215976Sjmallett * modification, are permitted provided that the following conditions are
10215976Sjmallett * met:
11215976Sjmallett *
12215976Sjmallett *   * Redistributions of source code must retain the above copyright
13215976Sjmallett *     notice, this list of conditions and the following disclaimer.
14215976Sjmallett *
15215976Sjmallett *   * Redistributions in binary form must reproduce the above
16215976Sjmallett *     copyright notice, this list of conditions and the following
17215976Sjmallett *     disclaimer in the documentation and/or other materials provided
18215976Sjmallett *     with the distribution.
19215976Sjmallett
20232812Sjmallett *   * Neither the name of Cavium Inc. nor the names of
21215976Sjmallett *     its contributors may be used to endorse or promote products
22215976Sjmallett *     derived from this software without specific prior written
23215976Sjmallett *     permission.
24215976Sjmallett
25215976Sjmallett * This Software, including technical data, may be subject to U.S. export  control
26215976Sjmallett * laws, including the U.S. Export Administration Act and its  associated
27215976Sjmallett * regulations, and may be subject to export or import  regulations in other
28215976Sjmallett * countries.
29215976Sjmallett
30215976Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
31232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
32215976Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
33215976Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
34215976Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
35215976Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
36215976Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
37215976Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
38215976Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
39215976Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
40215976Sjmallett ***********************license end**************************************/
41215976Sjmallett
42215976Sjmallett
43215976Sjmallett/**
44215976Sjmallett * @file
45215976Sjmallett *
46215976Sjmallett * "cvmx-usbd.h" defines a set of low level USB functions to help developers
47215976Sjmallett * create Octeon USB devices for various operating systems. These functions
48215976Sjmallett * provide a generic API to the Octeon USB blocks, hiding the internal hardware
49215976Sjmallett * specific operations.
50215976Sjmallett *
51215976Sjmallett * <hr>$Revision: 32636 $<hr>
52215976Sjmallett */
53215976Sjmallett
54215976Sjmallett#ifdef	__cplusplus
55215976Sjmallettextern "C" {
56215976Sjmallett#endif
57215976Sjmallett
58215976Sjmalletttypedef enum
59215976Sjmallett{
60215976Sjmallett    CVMX_USBD_TRANSFER_CONTROL = 0,
61215976Sjmallett    CVMX_USBD_TRANSFER_ISOCHRONOUS = 1,
62215976Sjmallett    CVMX_USBD_TRANSFER_BULK = 2,
63215976Sjmallett    CVMX_USBD_TRANSFER_INTERRUPT = 3,
64215976Sjmallett} cvmx_usbd_transfer_t;
65215976Sjmallett
66215976Sjmalletttypedef enum
67215976Sjmallett{
68215976Sjmallett    CVMX_USBD_SPEED_HIGH = 0,
69215976Sjmallett    CVMX_USBD_SPEED_FULL = 1,
70215976Sjmallett    CVMX_USBD_SPEED_LOW = 2,
71215976Sjmallett} cvmx_usbd_speed_t;
72215976Sjmallett
73215976Sjmalletttypedef enum
74215976Sjmallett{
75215976Sjmallett    CVMX_USBD_CALLBACK_SUSPEND,
76215976Sjmallett    CVMX_USBD_CALLBACK_RESET,
77215976Sjmallett    CVMX_USBD_CALLBACK_ENUM_COMPLETE,
78215976Sjmallett    CVMX_USBD_CALLBACK_DEVICE_SETUP,
79215976Sjmallett    CVMX_USBD_CALLBACK_IN_COMPLETE,
80215976Sjmallett    CVMX_USBD_CALLBACK_OUT_COMPLETE,
81215976Sjmallett    __CVMX_USBD_CALLBACK_END
82215976Sjmallett} cvmx_usbd_callback_t;
83215976Sjmallett
84215976Sjmalletttypedef enum
85215976Sjmallett{
86215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_XO_XI = 1<<0,       /**< The USB port uses a 12MHz crystal as clock source
87215976Sjmallett                                                            at USB_XO and USB_XI. */
88215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_XO_GND = 1<<1,      /**< The USB port uses 12/24/48MHz 2.5V board clock
89215976Sjmallett                                                            source at USB_XO. USB_XI should be tied to GND.*/
90215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_AUTO = 0,           /**< Automatically determine clock type based on function
91215976Sjmallett                                                             in cvmx-helper-board.c. */
92215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_MHZ_MASK  = 3<<3,       /**< Mask for clock speed field */
93215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_12MHZ = 1<<3,       /**< Speed of reference clock or crystal */
94215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_24MHZ = 2<<3,       /**< Speed of reference clock */
95215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_CLOCK_48MHZ = 3<<3,       /**< Speed of reference clock */
96215976Sjmallett    /* Bits 3-4 used to encode the clock frequency */
97215976Sjmallett    CVMX_USBD_INITIALIZE_FLAGS_DEBUG = 1<<16
98215976Sjmallett} cvmx_usbd_initialize_flags_t;
99215976Sjmallett
100215976Sjmalletttypedef void (*cvmx_usbd_callback_func_t)(cvmx_usbd_callback_t reason, int endpoint_num, int bytes_transferred, void *user_data);
101215976Sjmallett
102215976Sjmalletttypedef struct
103215976Sjmallett{
104215976Sjmallett    int init_flags;
105215976Sjmallett    int index;
106215976Sjmallett    cvmx_usbd_callback_func_t callback[__CVMX_USBD_CALLBACK_END];
107215976Sjmallett    void *callback_data[__CVMX_USBD_CALLBACK_END];
108215976Sjmallett    struct {
109215976Sjmallett        int buffer_length;
110215976Sjmallett    } endpoint[16];
111215976Sjmallett} cvmx_usbd_state_t;
112215976Sjmallett
113215976Sjmallett/**
114215976Sjmallett * Initialize a USB port for use. This must be called before any
115215976Sjmallett * other access to the Octeon USB port is made. The port starts
116215976Sjmallett * off in the disabled state.
117215976Sjmallett *
118215976Sjmallett * @param usb    Pointer to an empty cvmx_usbd_state_t structure
119215976Sjmallett *               that will be populated by the initialize call.
120215976Sjmallett *               This structure is then passed to all other USB
121215976Sjmallett *               functions.
122215976Sjmallett * @param usb_port_number
123215976Sjmallett *               Which Octeon USB port to initialize.
124215976Sjmallett * @param flags  Flags to control hardware initialization. See
125215976Sjmallett *               cvmx_usbd_initialize_flags_t for the flag
126215976Sjmallett *               definitions. Some flags are mandatory.
127215976Sjmallett *
128215976Sjmallett * @return Zero or a negative on error.
129215976Sjmallett */
130215976Sjmallettint cvmx_usbd_initialize(cvmx_usbd_state_t *usb, int usb_port_number,
131215976Sjmallett    cvmx_usbd_initialize_flags_t flags);
132215976Sjmallett
133215976Sjmallett/**
134215976Sjmallett * Shutdown a USB port after a call to cvmx_usbd_initialize().
135215976Sjmallett *
136215976Sjmallett * @param usb    USB device state populated by
137215976Sjmallett *               cvmx_usbd_initialize().
138215976Sjmallett *
139215976Sjmallett * @return Zero or a negative on error.
140215976Sjmallett */
141215976Sjmallettint cvmx_usbd_shutdown(cvmx_usbd_state_t *usb);
142215976Sjmallett
143215976Sjmallett/**
144215976Sjmallett * Enable a USB port. After this call succeeds, the USB port is
145215976Sjmallett * online and servicing requests.
146215976Sjmallett *
147215976Sjmallett * @param usb  USB device state populated by
148215976Sjmallett *               cvmx_usb_initialize().
149215976Sjmallett *
150215976Sjmallett * @return Zero or negative on error.
151215976Sjmallett */
152215976Sjmallettint cvmx_usbd_enable(cvmx_usbd_state_t *usb);
153215976Sjmallett
154215976Sjmallett/**
155215976Sjmallett * Disable a USB port. After this call the USB port will not
156215976Sjmallett * generate data transfers and will not generate events.
157215976Sjmallett *
158215976Sjmallett * @param usb    USB device state populated by
159215976Sjmallett *               cvmx_usb_initialize().
160215976Sjmallett *
161215976Sjmallett * @return Zero or negative on error.
162215976Sjmallett */
163215976Sjmallettint cvmx_usbd_disable(cvmx_usbd_state_t *usb);
164215976Sjmallett
165215976Sjmallett/**
166215976Sjmallett * Register a callback function to process USB events
167215976Sjmallett *
168215976Sjmallett * @param usb       USB device state populated by
169215976Sjmallett *                  cvmx_usbd_initialize().
170215976Sjmallett * @param reason    The reason this callback should be called
171215976Sjmallett * @param func      Function to call
172215976Sjmallett * @param user_data User supplied data for the callback
173215976Sjmallett *
174215976Sjmallett * @return Zero on succes, negative on failure
175215976Sjmallett */
176215976Sjmallettint cvmx_usbd_register(cvmx_usbd_state_t *usb, cvmx_usbd_callback_t reason, cvmx_usbd_callback_func_t func, void *user_data);
177215976Sjmallett
178215976Sjmallett/**
179215976Sjmallett * Poll the USB block for status and call all needed callback
180215976Sjmallett * handlers. This function is meant to be called in the interrupt
181215976Sjmallett * handler for the USB controller. It can also be called
182215976Sjmallett * periodically in a loop for non-interrupt based operation.
183215976Sjmallett *
184215976Sjmallett * @param usb    USB device state populated by
185215976Sjmallett *               cvmx_usbd_initialize().
186215976Sjmallett *
187215976Sjmallett * @return Zero or negative on error.
188215976Sjmallett */
189215976Sjmallettint cvmx_usbd_poll(cvmx_usbd_state_t *usb);
190215976Sjmallett
191215976Sjmallett/**
192215976Sjmallett * Get the current USB address
193215976Sjmallett *
194215976Sjmallett * @param usb    USB device state populated by
195215976Sjmallett *               cvmx_usbd_initialize().
196215976Sjmallett *
197215976Sjmallett * @return The USB address
198215976Sjmallett */
199215976Sjmallettint cvmx_usbd_get_address(cvmx_usbd_state_t *usb);
200215976Sjmallett
201215976Sjmallett/**
202215976Sjmallett * Set the current USB address
203215976Sjmallett *
204215976Sjmallett * @param usb     USB device state populated by
205215976Sjmallett *                cvmx_usbd_initialize().
206215976Sjmallett * @param address Address to set
207215976Sjmallett */
208215976Sjmallettvoid cvmx_usbd_set_address(cvmx_usbd_state_t *usb, int address);
209215976Sjmallett
210215976Sjmallett/**
211215976Sjmallett * Get the current USB speed
212215976Sjmallett *
213215976Sjmallett * @param usb    USB device state populated by
214215976Sjmallett *               cvmx_usbd_initialize().
215215976Sjmallett *
216215976Sjmallett * @return The USB speed
217215976Sjmallett */
218215976Sjmallettcvmx_usbd_speed_t cvmx_usbd_get_speed(cvmx_usbd_state_t *usb);
219215976Sjmallett
220215976Sjmallett/**
221215976Sjmallett * Set the current USB speed
222215976Sjmallett *
223215976Sjmallett * @param usb    USB device state populated by
224215976Sjmallett *               cvmx_usbd_initialize().
225215976Sjmallett * @param speed  The requested speed
226215976Sjmallett */
227215976Sjmallettvoid cvmx_usbd_set_speed(cvmx_usbd_state_t *usb, cvmx_usbd_speed_t speed);
228215976Sjmallett
229215976Sjmallett/**
230215976Sjmallett * Enable an endpoint to respond to an OUT transaction
231215976Sjmallett *
232215976Sjmallett * @param usb    USB device state populated by
233215976Sjmallett *               cvmx_usbd_initialize().
234215976Sjmallett * @param endpoint_num
235215976Sjmallett *               Endpoint number to enable
236215976Sjmallett * @param transfer_type
237215976Sjmallett *               Transfer type for the endpoint
238215976Sjmallett * @param max_packet_size
239215976Sjmallett *               Maximum packet size for the endpoint
240215976Sjmallett * @param buffer Buffer to receive the data
241215976Sjmallett * @param buffer_length
242215976Sjmallett *               Length of the buffer in bytes
243215976Sjmallett *
244215976Sjmallett * @return Zero on success, negative on failure
245215976Sjmallett */
246215976Sjmallettint cvmx_usbd_out_endpoint_enable(cvmx_usbd_state_t *usb,
247215976Sjmallett    int endpoint_num, cvmx_usbd_transfer_t transfer_type,
248215976Sjmallett    int max_packet_size, uint64_t buffer, int buffer_length);
249215976Sjmallett
250215976Sjmallett/**
251215976Sjmallett * Disable an OUT endpoint
252215976Sjmallett *
253215976Sjmallett * @param usb    USB device state populated by
254215976Sjmallett *               cvmx_usbd_initialize().
255215976Sjmallett * @param endpoint_num
256215976Sjmallett *               Endpoint number to disable
257215976Sjmallett *
258215976Sjmallett * @return Zero on success, negative on failure
259215976Sjmallett */
260215976Sjmallettint cvmx_usbd_out_endpoint_disable(cvmx_usbd_state_t *usb, int endpoint_num);
261215976Sjmallett
262215976Sjmallett/**
263215976Sjmallett * Enable an endpoint to respond to an IN transaction
264215976Sjmallett *
265215976Sjmallett * @param usb    USB device state populated by
266215976Sjmallett *               cvmx_usbd_initialize().
267215976Sjmallett * @param endpoint_num
268215976Sjmallett *               Endpoint number to enable
269215976Sjmallett * @param transfer_type
270215976Sjmallett *               Transfer type for the endpoint
271215976Sjmallett * @param max_packet_size
272215976Sjmallett *               Maximum packet size for the endpoint
273215976Sjmallett * @param buffer Buffer to send
274215976Sjmallett * @param buffer_length
275215976Sjmallett *               Length of the buffer in bytes
276215976Sjmallett *
277215976Sjmallett * @return Zero on success, negative on failure
278215976Sjmallett */
279215976Sjmallettint cvmx_usbd_in_endpoint_enable(cvmx_usbd_state_t *usb,
280215976Sjmallett    int endpoint_num, cvmx_usbd_transfer_t transfer_type,
281215976Sjmallett    int max_packet_size, uint64_t buffer, int buffer_length);
282215976Sjmallett
283215976Sjmallett/**
284215976Sjmallett * Disable an IN endpoint
285215976Sjmallett *
286215976Sjmallett * @param usb    USB device state populated by
287215976Sjmallett *               cvmx_usbd_initialize().
288215976Sjmallett * @param endpoint_num
289215976Sjmallett *               Endpoint number to disable
290215976Sjmallett *
291215976Sjmallett * @return Zero on success, negative on failure
292215976Sjmallett */
293215976Sjmallettint cvmx_usbd_in_endpoint_disable(cvmx_usbd_state_t *usb, int endpoint_num);
294215976Sjmallett
295215976Sjmallett#ifdef	__cplusplus
296215976Sjmallett}
297215976Sjmallett#endif
298215976Sjmallett
299215976Sjmallett#endif /* __CVMX_USBD_H__ */
300215976Sjmallett
301