1/* 2 * Copyright (C) 2005-2006 Kristian Hoegsberg <krh@bitplanet.net> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software Foundation, 16 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 19#ifndef __fw_device_h 20#define __fw_device_h 21 22#include <linux/fs.h> 23#include <linux/cdev.h> 24#include <asm/atomic.h> 25 26enum fw_device_state { 27 FW_DEVICE_INITIALIZING, 28 FW_DEVICE_RUNNING, 29 FW_DEVICE_SHUTDOWN, 30}; 31 32struct fw_attribute_group { 33 struct attribute_group *groups[2]; 34 struct attribute_group group; 35 struct attribute *attrs[11]; 36}; 37 38struct fw_device { 39 atomic_t state; 40 struct fw_node *node; 41 int node_id; 42 int generation; 43 struct fw_card *card; 44 struct device device; 45 struct list_head link; 46 struct list_head client_list; 47 u32 *config_rom; 48 size_t config_rom_length; 49 int config_rom_retries; 50 struct delayed_work work; 51 struct fw_attribute_group attribute_group; 52}; 53 54static inline struct fw_device * 55fw_device(struct device *dev) 56{ 57 return container_of(dev, struct fw_device, device); 58} 59 60static inline int 61fw_device_is_shutdown(struct fw_device *device) 62{ 63 return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN; 64} 65 66struct fw_device *fw_device_get(struct fw_device *device); 67void fw_device_put(struct fw_device *device); 68int fw_device_enable_phys_dma(struct fw_device *device); 69 70void fw_device_cdev_update(struct fw_device *device); 71void fw_device_cdev_remove(struct fw_device *device); 72 73struct fw_device *fw_device_from_devt(dev_t devt); 74extern int fw_cdev_major; 75 76struct fw_unit { 77 struct device device; 78 u32 *directory; 79 struct fw_attribute_group attribute_group; 80}; 81 82static inline struct fw_unit * 83fw_unit(struct device *dev) 84{ 85 return container_of(dev, struct fw_unit, device); 86} 87 88#define CSR_OFFSET 0x40 89#define CSR_LEAF 0x80 90#define CSR_DIRECTORY 0xc0 91 92#define CSR_DESCRIPTOR 0x01 93#define CSR_VENDOR 0x03 94#define CSR_HARDWARE_VERSION 0x04 95#define CSR_NODE_CAPABILITIES 0x0c 96#define CSR_UNIT 0x11 97#define CSR_SPECIFIER_ID 0x12 98#define CSR_VERSION 0x13 99#define CSR_DEPENDENT_INFO 0x14 100#define CSR_MODEL 0x17 101#define CSR_INSTANCE 0x18 102#define CSR_DIRECTORY_ID 0x20 103 104#define SBP2_COMMAND_SET_SPECIFIER 0x38 105#define SBP2_COMMAND_SET 0x39 106#define SBP2_COMMAND_SET_REVISION 0x3b 107#define SBP2_FIRMWARE_REVISION 0x3c 108 109struct fw_csr_iterator { 110 u32 *p; 111 u32 *end; 112}; 113 114void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 *p); 115int fw_csr_iterator_next(struct fw_csr_iterator *ci, 116 int *key, int *value); 117 118#define FW_MATCH_VENDOR 0x0001 119#define FW_MATCH_MODEL 0x0002 120#define FW_MATCH_SPECIFIER_ID 0x0004 121#define FW_MATCH_VERSION 0x0008 122 123struct fw_device_id { 124 u32 match_flags; 125 u32 vendor; 126 u32 model; 127 u32 specifier_id; 128 u32 version; 129 void *driver_data; 130}; 131 132struct fw_driver { 133 struct device_driver driver; 134 /* Called when the parent device sits through a bus reset. */ 135 void (*update) (struct fw_unit *unit); 136 const struct fw_device_id *id_table; 137}; 138 139static inline struct fw_driver * 140fw_driver(struct device_driver *drv) 141{ 142 return container_of(drv, struct fw_driver, driver); 143} 144 145extern const struct file_operations fw_device_ops; 146 147#endif /* __fw_device_h */ 148