1e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* 2e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * c67x00-hcd.h: Cypress C67X00 USB HCD 3e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 4e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Copyright (C) 2006-2008 Barco N.V. 5e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Derived from the Cypress cy7c67200/300 ezusb linux driver and 6e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * based on multiple host controller drivers inside the linux kernel. 7e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 8e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * This program is free software; you can redistribute it and/or modify 9e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * it under the terms of the GNU General Public License as published by 10e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * the Free Software Foundation; either version 2 of the License, or 11e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * (at your option) any later version. 12e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 13e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * This program is distributed in the hope that it will be useful, 14e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * but WITHOUT ANY WARRANTY; without even the implied warranty of 15e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * GNU General Public License for more details. 17e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 18e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * You should have received a copy of the GNU General Public License 19e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * along with this program; if not, write to the Free Software 20e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * MA 02110-1301 USA. 22e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 23e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 24e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#ifndef _USB_C67X00_HCD_H 25e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define _USB_C67X00_HCD_H 26e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 27e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#include <linux/kernel.h> 28e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#include <linux/spinlock.h> 29e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#include <linux/list.h> 30e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#include <linux/usb.h> 3127729aadd31dafddaaf64c24f8ef6d0ff750f3aaEric Lescouet#include <linux/usb/hcd.h> 32e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#include "c67x00.h" 33e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 34e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* 35e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * The following parameters depend on the CPU speed, bus speed, ... 36e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * These can be tuned for specific use cases, e.g. if isochronous transfers 3725985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * are very important, bandwidth can be sacrificed to guarantee that the 38e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 1ms deadline will be met. 39e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * If bulk transfers are important, the MAX_FRAME_BW can be increased, 40e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * but some (or many) isochronous deadlines might not be met. 41e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 42e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * The values are specified in bittime. 43e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 44e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 45e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* 46e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * The current implementation switches between _STD (default) and _ISO (when 47e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * isochronous transfers are scheduled), in order to optimize the throughput 48e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * in normal cicrumstances, but also provide good isochronous behaviour. 49e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * 50e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Bandwidth is described in bit time so with a 12MHz USB clock and 1ms 51e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * frames; there are 12000 bit times per frame. 52e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 53e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 54e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define TOTAL_FRAME_BW 12000 55e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define DEFAULT_EOT 2250 56e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 57e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define MAX_FRAME_BW_STD (TOTAL_FRAME_BW - DEFAULT_EOT) 58e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define MAX_FRAME_BW_ISO 2400 59e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 60e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* 61e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Periodic transfers may only use 90% of the full frame, but as 62e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * we currently don't even use 90% of the full frame, we may 63e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * use the full usable time for periodic transfers. 64e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 65e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define MAX_PERIODIC_BW(full_bw) full_bw 66e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 67e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* -------------------------------------------------------------------------- */ 68e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 69e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardstruct c67x00_hcd { 70e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard spinlock_t lock; 71e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct c67x00_sie *sie; 72e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard unsigned int low_speed_ports; /* bitmask of low speed ports */ 73e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard unsigned int urb_count; 74e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard unsigned int urb_iso_count; 75e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 76e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct list_head list[4]; /* iso, int, ctrl, bulk */ 77e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#if PIPE_BULK != 3 78e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#error "Sanity check failed, this code presumes PIPE_... to range from 0 to 3" 79e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#endif 80e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 81e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard /* USB bandwidth allocated to td_list */ 82e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard int bandwidth_allocated; 83e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard /* USB bandwidth allocated for isoc/int transfer */ 84e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard int periodic_bw_allocated; 85e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct list_head td_list; 86e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard int max_frame_bw; 87e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 88e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 td_base_addr; 89e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 buf_base_addr; 90e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 next_td_addr; 91e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 next_buf_addr; 92e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 93e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct tasklet_struct tasklet; 94e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 95e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct completion endpoint_disable; 96e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 97e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 current_frame; 98e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard u16 last_frame; 99e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard}; 100e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 101e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardstatic inline struct c67x00_hcd *hcd_to_c67x00_hcd(struct usb_hcd *hcd) 102e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard{ 103e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard return (struct c67x00_hcd *)(hcd->hcd_priv); 104e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard} 105e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 106e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardstatic inline struct usb_hcd *c67x00_hcd_to_hcd(struct c67x00_hcd *c67x00) 107e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard{ 108e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard return container_of((void *)c67x00, struct usb_hcd, hcd_priv); 109e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard} 110e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 111e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* --------------------------------------------------------------------- 112e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Functions used by c67x00-drv 113e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 114e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 115e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardint c67x00_hcd_probe(struct c67x00_sie *sie); 116e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardvoid c67x00_hcd_remove(struct c67x00_sie *sie); 117e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 118e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard/* --------------------------------------------------------------------- 119e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard * Transfer Descriptor scheduling functions 120e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard */ 121e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardint c67x00_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags); 122e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardint c67x00_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status); 123e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardvoid c67x00_endpoint_disable(struct usb_hcd *hcd, 124e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard struct usb_host_endpoint *ep); 125e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 126e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardvoid c67x00_hcd_msg_received(struct c67x00_sie *sie, u16 msg); 127e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardvoid c67x00_sched_kick(struct c67x00_hcd *c67x00); 128e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardint c67x00_sched_start_scheduler(struct c67x00_hcd *c67x00); 129e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaardvoid c67x00_sched_stop_scheduler(struct c67x00_hcd *c67x00); 130e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 131e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#define c67x00_hcd_dev(x) (c67x00_hcd_to_hcd(x)->self.controller) 132e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard 133e9b29ffc519b9e63d4e1c0b1278bb951bb418a9dPeter Korsgaard#endif /* _USB_C67X00_HCD_H */ 134