Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/*
  2 * usb hub driver head file
  3 *
  4 * Copyright (C) 1999 Linus Torvalds
  5 * Copyright (C) 1999 Johannes Erdfelt
  6 * Copyright (C) 1999 Gregory P. Smith
  7 * Copyright (C) 2001 Brad Hards (bhards@bigpond.net.au)
  8 * Copyright (C) 2012 Intel Corp (tianyu.lan@intel.com)
  9 *
 10 *  move struct usb_hub to this file.
 11 *
 12 * This program is free software; you can redistribute it and/or modify
 13 * it under the terms of the GNU General Public License version 2 as
 14 * published by the Free Software Foundation.
 15 *
 16 * This program is distributed in the hope that it will be useful, but
 17 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 18 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 19 * for more details.
 20 */
 21
 22#include <linux/usb.h>
 23#include <linux/usb/ch11.h>
 24#include <linux/usb/hcd.h>
 25#include "usb.h"
 26
 27struct usb_hub {
 28	struct device		*intfdev;	/* the "interface" device */
 29	struct usb_device	*hdev;
 30	struct kref		kref;
 31	struct urb		*urb;		/* for interrupt polling pipe */
 32
 33	/* buffer for urb ... with extra space in case of babble */
 34	u8			(*buffer)[8];
 35	union {
 36		struct usb_hub_status	hub;
 37		struct usb_port_status	port;
 38	}			*status;	/* buffer for status reports */
 39	struct mutex		status_mutex;	/* for the status buffer */
 40
 41	int			error;		/* last reported error */
 42	int			nerrors;	/* track consecutive errors */
 43
 44	struct list_head	event_list;	/* hubs w/data or errs ready */
 45	unsigned long		event_bits[1];	/* status change bitmask */
 46	unsigned long		change_bits[1];	/* ports with logical connect
 47							status change */
 48	unsigned long		busy_bits[1];	/* ports being reset or
 49							resumed */
 50	unsigned long		removed_bits[1]; /* ports with a "removed"
 51							device present */
 52	unsigned long		wakeup_bits[1];	/* ports that have signaled
 53							remote wakeup */
 54#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
 55#error event_bits[] is too short!
 56#endif
 57
 58	struct usb_hub_descriptor *descriptor;	/* class descriptor */
 59	struct usb_tt		tt;		/* Transaction Translator */
 60
 61	unsigned		mA_per_port;	/* current for each child */
 62#ifdef	CONFIG_PM
 63	unsigned		wakeup_enabled_descendants;
 64#endif
 65
 66	unsigned		limited_power:1;
 67	unsigned		quiescing:1;
 68	unsigned		disconnected:1;
 69
 70	unsigned		quirk_check_port_auto_suspend:1;
 71
 72	unsigned		has_indicators:1;
 73	u8			indicator[USB_MAXCHILDREN];
 74	struct delayed_work	leds;
 75	struct delayed_work	init_work;
 76	struct usb_port		**ports;
 77};
 78
 79/**
 80 * struct usb port - kernel's representation of a usb port
 81 * @child: usb device attached to the port
 82 * @dev: generic device interface
 83 * @port_owner: port's owner
 84 * @connect_type: port's connect type
 85 * @portnum: port index num based one
 86 * @power_is_on: port's power state
 87 * @did_runtime_put: port has done pm_runtime_put().
 88 */
 89struct usb_port {
 90	struct usb_device *child;
 91	struct device dev;
 92	struct usb_dev_state *port_owner;
 93	enum usb_port_connect_type connect_type;
 94	u8 portnum;
 95	unsigned power_is_on:1;
 96	unsigned did_runtime_put:1;
 97};
 98
 99#define to_usb_port(_dev) \
100	container_of(_dev, struct usb_port, dev)
101
102extern int usb_hub_create_port_device(struct usb_hub *hub,
103		int port1);
104extern void usb_hub_remove_port_device(struct usb_hub *hub,
105		int port1);
106extern int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub,
107		int port1, bool set);
108extern struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev);
109extern int hub_port_debounce(struct usb_hub *hub, int port1,
110		bool must_be_connected);
111extern int usb_clear_port_feature(struct usb_device *hdev,
112		int port1, int feature);
113
114static inline int hub_port_debounce_be_connected(struct usb_hub *hub,
115		int port1)
116{
117	return hub_port_debounce(hub, port1, true);
118}
119
120static inline int hub_port_debounce_be_stable(struct usb_hub *hub,
121		int port1)
122{
123	return hub_port_debounce(hub, port1, false);
124}
125