fw-device.h 4.1 KB
Newer Older
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef __fw_device_h
#define __fw_device_h

#include <linux/fs.h>
#include <linux/cdev.h>
24
#include <asm/atomic.h>
25 26 27 28

enum fw_device_state {
	FW_DEVICE_INITIALIZING,
	FW_DEVICE_RUNNING,
29
	FW_DEVICE_SHUTDOWN,
30 31
};

32 33 34 35 36 37
struct fw_attribute_group {
	struct attribute_group *groups[2];
	struct attribute_group group;
	struct attribute *attrs[11];
};

38 39 40 41 42 43 44 45 46 47 48 49
/*
 * Note, fw_device.generation always has to be read before fw_device.node_id.
 * Use SMP memory barriers to ensure this.  Otherwise requests will be sent
 * to an outdated node_id if the generation was updated in the meantime due
 * to a bus reset.
 *
 * Likewise, fw-core will take care to update .node_id before .generation so
 * that whenever fw_device.generation is current WRT the actual bus generation,
 * fw_device.node_id is guaranteed to be current too.
 *
 * The same applies to fw_device.card->node_id vs. fw_device.generation.
 */
50
struct fw_device {
51
	atomic_t state;
52 53 54
	struct fw_node *node;
	int node_id;
	int generation;
55
	unsigned max_speed;
56 57
	struct fw_card *card;
	struct device device;
58
	struct list_head link;
59
	struct list_head client_list;
60
	u32 *config_rom;
61 62 63
	size_t config_rom_length;
	int config_rom_retries;
	struct delayed_work work;
64
	struct fw_attribute_group attribute_group;
65 66 67 68 69
};

static inline struct fw_device *
fw_device(struct device *dev)
{
70
	return container_of(dev, struct fw_device, device);
71 72
}

73 74 75 76 77 78
static inline int
fw_device_is_shutdown(struct fw_device *device)
{
	return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN;
}

79 80 81 82 83 84 85 86 87 88 89 90 91 92
static inline struct fw_device *
fw_device_get(struct fw_device *device)
{
	get_device(&device->device);

	return device;
}

static inline void
fw_device_put(struct fw_device *device)
{
	put_device(&device->device);
}

93
struct fw_device *fw_device_get_by_devt(dev_t devt);
94 95
int fw_device_enable_phys_dma(struct fw_device *device);

96
void fw_device_cdev_update(struct fw_device *device);
97
void fw_device_cdev_remove(struct fw_device *device);
98

99 100
extern int fw_cdev_major;

101 102 103
struct fw_unit {
	struct device device;
	u32 *directory;
104
	struct fw_attribute_group attribute_group;
105 106 107 108 109
};

static inline struct fw_unit *
fw_unit(struct device *dev)
{
110
	return container_of(dev, struct fw_unit, device);
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
}

#define CSR_OFFSET	0x40
#define CSR_LEAF	0x80
#define CSR_DIRECTORY	0xc0

#define CSR_DESCRIPTOR		0x01
#define CSR_VENDOR		0x03
#define CSR_HARDWARE_VERSION	0x04
#define CSR_NODE_CAPABILITIES	0x0c
#define CSR_UNIT		0x11
#define CSR_SPECIFIER_ID	0x12
#define CSR_VERSION		0x13
#define CSR_DEPENDENT_INFO	0x14
#define CSR_MODEL		0x17
#define CSR_INSTANCE		0x18
127
#define CSR_DIRECTORY_ID	0x20
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155

struct fw_csr_iterator {
	u32 *p;
	u32 *end;
};

void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 *p);
int fw_csr_iterator_next(struct fw_csr_iterator *ci,
			 int *key, int *value);

#define FW_MATCH_VENDOR		0x0001
#define FW_MATCH_MODEL		0x0002
#define FW_MATCH_SPECIFIER_ID	0x0004
#define FW_MATCH_VERSION	0x0008

struct fw_device_id {
	u32 match_flags;
	u32 vendor;
	u32 model;
	u32 specifier_id;
	u32 version;
	void *driver_data;
};

struct fw_driver {
	struct device_driver driver;
	/* Called when the parent device sits through a bus reset. */
	void (*update) (struct fw_unit *unit);
156
	const struct fw_device_id *id_table;
157 158 159 160 161
};

static inline struct fw_driver *
fw_driver(struct device_driver *drv)
{
162
	return container_of(drv, struct fw_driver, driver);
163 164
}

165
extern const struct file_operations fw_device_ops;
166

167
#endif /* __fw_device_h */