2006-12-20 03:58:31 +03:00
/* -*- c-basic-offset: 8 -*-
*
* fw - device . h - Device probing and sysfs code .
*
* 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>
2007-01-27 12:34:55 +03:00
# include <asm/atomic.h>
2006-12-20 03:58:31 +03:00
enum fw_device_state {
FW_DEVICE_INITIALIZING ,
FW_DEVICE_RUNNING ,
2007-01-21 22:45:32 +03:00
FW_DEVICE_SHUTDOWN ,
2006-12-20 03:58:31 +03:00
} ;
struct fw_device {
2007-01-27 12:34:55 +03:00
atomic_t state ;
2006-12-20 03:58:31 +03:00
struct fw_node * node ;
int node_id ;
int generation ;
struct fw_card * card ;
struct device device ;
2007-03-07 20:12:44 +03:00
struct list_head link ;
2007-03-07 20:12:41 +03:00
struct list_head client_list ;
2006-12-20 03:58:31 +03:00
__be32 * config_rom ;
size_t config_rom_length ;
int config_rom_retries ;
struct delayed_work work ;
} ;
static inline struct fw_device *
fw_device ( struct device * dev )
{
2007-01-21 22:44:09 +03:00
return container_of ( dev , struct fw_device , device ) ;
2006-12-20 03:58:31 +03:00
}
2007-03-07 20:12:48 +03:00
static inline int
fw_device_is_shutdown ( struct fw_device * device )
{
return atomic_read ( & device - > state ) = = FW_DEVICE_SHUTDOWN ;
}
2006-12-20 03:58:31 +03:00
struct fw_device * fw_device_get ( struct fw_device * device ) ;
void fw_device_put ( struct fw_device * device ) ;
int fw_device_enable_phys_dma ( struct fw_device * device ) ;
2007-03-07 20:12:41 +03:00
void fw_device_cdev_update ( struct fw_device * device ) ;
2007-03-07 20:12:48 +03:00
void fw_device_cdev_remove ( struct fw_device * device ) ;
2007-03-07 20:12:41 +03:00
2007-03-07 20:12:44 +03:00
struct fw_device * fw_device_from_devt ( dev_t devt ) ;
extern int fw_cdev_major ;
2006-12-20 03:58:31 +03:00
struct fw_unit {
struct device device ;
u32 * directory ;
} ;
static inline struct fw_unit *
fw_unit ( struct device * dev )
{
2007-01-21 22:44:09 +03:00
return container_of ( dev , struct fw_unit , device ) ;
2006-12-20 03:58:31 +03:00
}
# 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
# define SBP2_COMMAND_SET_SPECIFIER 0x38
# define SBP2_COMMAND_SET 0x39
# define SBP2_COMMAND_SET_REVISION 0x3b
# define SBP2_FIRMWARE_REVISION 0x3c
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 ) ;
2007-01-14 17:29:07 +03:00
const struct fw_device_id * id_table ;
2006-12-20 03:58:31 +03:00
} ;
static inline struct fw_driver *
fw_driver ( struct device_driver * drv )
{
2007-01-21 22:44:09 +03:00
return container_of ( drv , struct fw_driver , driver ) ;
2006-12-20 03:58:31 +03:00
}
2007-01-14 17:29:07 +03:00
extern const struct file_operations fw_device_ops ;
2006-12-20 03:58:31 +03:00
2006-12-28 18:20:00 +03:00
# endif /* __fw_device_h */