2005-04-17 02:20:36 +04:00
/*
2005-05-20 22:33:25 +04:00
* w1 . h
2005-04-17 02:20:36 +04:00
*
2011-08-26 02:59:06 +04:00
* Copyright ( c ) 2004 Evgeniy Polyakov < zbr @ ioremap . net >
2005-05-20 22:33:25 +04:00
*
2005-04-17 02:20:36 +04:00
*
* 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 __W1_H
# define __W1_H
2014-01-16 08:29:25 +04:00
/**
* struct w1_reg_num - broken out slave device id
*
* @ family : identifies the type of device
* @ id : along with family is the unique device id
* @ crc : checksum of the other bytes
*/
2005-04-17 02:20:36 +04:00
struct w1_reg_num
{
# if defined(__LITTLE_ENDIAN_BITFIELD)
2005-06-04 01:30:43 +04:00
__u64 family : 8 ,
id : 48 ,
crc : 8 ;
2005-04-17 02:20:36 +04:00
# elif defined(__BIG_ENDIAN_BITFIELD)
__u64 crc : 8 ,
id : 48 ,
family : 8 ;
# else
# error "Please fix <asm / byteorder.h>"
# endif
} ;
# ifdef __KERNEL__
# include <linux/completion.h>
# include <linux/device.h>
2006-04-03 12:04:27 +04:00
# include <linux/mutex.h>
2005-04-17 02:20:36 +04:00
# include "w1_family.h"
# define W1_MAXNAMELEN 32
# define W1_SEARCH 0xF0
2006-03-23 19:11:58 +03:00
# define W1_ALARM_SEARCH 0xEC
2005-04-17 02:20:36 +04:00
# define W1_CONVERT_TEMP 0x44
# define W1_SKIP_ROM 0xCC
# define W1_READ_SCRATCHPAD 0xBE
# define W1_READ_ROM 0x33
# define W1_READ_PSUPPLY 0xB4
# define W1_MATCH_ROM 0x55
2011-05-27 03:26:01 +04:00
# define W1_RESUME_CMD 0xA5
2005-04-17 02:20:36 +04:00
2006-03-23 19:11:58 +03:00
# define W1_SLAVE_ACTIVE 0
2014-01-16 08:29:18 +04:00
# define W1_SLAVE_DETACH 1
2005-04-17 02:20:36 +04:00
2014-01-16 08:29:25 +04:00
/**
* struct w1_slave - holds a single slave device on the bus
*
* @ owner : Points to the one wire " wire " kernel module .
* @ name : Device id is ascii .
* @ w1_slave_entry : data for the linked list
* @ reg_num : the slave id in binary
* @ refcnt : reference count , delete when 0
* @ flags : bit flags for W1_SLAVE_ACTIVE W1_SLAVE_DETACH
* @ ttl : decrement per search this slave isn ' t found , deatch at 0
* @ master : bus which this slave is on
* @ family : module for device family type
* @ family_data : pointer for use by the family module
* @ dev : kernel device identifier
*
*/
2005-04-17 02:20:36 +04:00
struct w1_slave
{
struct module * owner ;
unsigned char name [ W1_MAXNAMELEN ] ;
struct list_head w1_slave_entry ;
struct w1_reg_num reg_num ;
atomic_t refcnt ;
int ttl ;
2013-11-13 03:11:42 +04:00
unsigned long flags ;
2005-04-17 02:20:36 +04:00
struct w1_master * master ;
2005-05-20 22:33:25 +04:00
struct w1_family * family ;
2005-08-17 15:19:08 +04:00
void * family_data ;
2005-05-20 22:33:25 +04:00
struct device dev ;
2005-04-17 02:20:36 +04:00
} ;
2008-10-16 09:04:38 +04:00
typedef void ( * w1_slave_found_callback ) ( struct w1_master * , u64 ) ;
2005-04-17 02:20:36 +04:00
2005-06-04 01:30:43 +04:00
/**
2014-01-16 08:29:25 +04:00
* struct w1_bus_master - operations available on a bus master
*
* @ data : the first parameter in all the functions below
*
* @ read_bit : Sample the line level @ return the level read ( 0 or 1 )
*
* @ write_bit : Sets the line level
*
* @ touch_bit : the lowest - level function for devices that really support the
* 1 - wire protocol .
* touch_bit ( 0 ) = write - 0 cycle
* touch_bit ( 1 ) = write - 1 / read cycle
* @ return the bit read ( 0 or 1 )
*
* @ read_byte : Reads a bytes . Same as 8 touch_bit ( 1 ) calls .
* @ return the byte read
*
* @ write_byte : Writes a byte . Same as 8 touch_bit ( x ) calls .
*
* @ read_block : Same as a series of read_byte ( ) calls
* @ return the number of bytes read
*
* @ write_block : Same as a series of write_byte ( ) calls
*
* @ triplet : Combines two reads and a smart write for ROM searches
* @ return bit0 = Id bit1 = comp_id bit2 = dir_taken
*
* @ reset_bus : long write - 0 with a read for the presence pulse detection
* @ return - 1 = Error , 0 = Device present , 1 = No device present
*
* @ set_pullup : Put out a strong pull - up pulse of the specified duration .
* @ return - 1 = Error , 0 = completed
*
* @ search : Really nice hardware can handles the different types of ROM search
* w1_master * is passed to the slave found callback .
* u8 is search_type , W1_SEARCH or W1_ALARM_SEARCH
*
2005-06-04 01:30:43 +04:00
* Note : read_bit and write_bit are very low level functions and should only
* be used with hardware that doesn ' t really support 1 - wire operations ,
* like a parallel / serial port .
* Either define read_bit and write_bit OR define , at minimum , touch_bit and
* reset_bus .
2014-01-16 08:29:25 +04:00
*
2005-06-04 01:30:43 +04:00
*/
2005-04-17 02:20:36 +04:00
struct w1_bus_master
{
2005-12-06 13:38:27 +03:00
void * data ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * read_bit ) ( void * ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
void ( * write_bit ) ( void * , u8 ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * touch_bit ) ( void * , u8 ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * read_byte ) ( void * ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
void ( * write_byte ) ( void * , u8 ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * read_block ) ( void * , u8 * , int ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
void ( * write_block ) ( void * , const u8 * , int ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * triplet ) ( void * , u8 ) ;
2005-06-04 01:30:43 +04:00
2005-12-06 13:38:27 +03:00
u8 ( * reset_bus ) ( void * ) ;
2005-06-04 01:30:43 +04:00
2008-10-16 09:04:42 +04:00
u8 ( * set_pullup ) ( void * , int ) ;
2008-10-16 09:04:38 +04:00
void ( * search ) ( void * , struct w1_master * ,
u8 , w1_slave_found_callback ) ;
2005-04-17 02:20:36 +04:00
} ;
2014-01-16 08:29:13 +04:00
/**
* enum w1_master_flags - bitfields used in w1_master . flags
* @ W1_ABORT_SEARCH : abort searching early on shutdown
2014-01-16 08:29:15 +04:00
* @ W1_WARN_MAX_COUNT : limit warning when the maximum count is reached
2014-01-16 08:29:13 +04:00
*/
enum w1_master_flags {
W1_ABORT_SEARCH = 0 ,
2014-01-16 08:29:15 +04:00
W1_WARN_MAX_COUNT = 1 ,
2014-01-16 08:29:13 +04:00
} ;
2014-01-16 08:29:25 +04:00
/**
* struct w1_master - one per bus master
* @ w1_master_entry : master linked list
* @ owner : module owner
* @ name : dynamically allocate bus name
* @ list_mutex : protect slist and async_list
* @ slist : linked list of slaves
* @ async_list : linked list of netlink commands to execute
* @ max_slave_count : maximum number of slaves to search for at a time
* @ slave_count : current number of slaves known
* @ attempts : number of searches ran
* @ slave_ttl : number of searches before a slave is timed out
* @ initialized : prevent init / removal race conditions
* @ id : w1 bus number
* @ search_count : number of automatic searches to run , - 1 unlimited
* @ search_id : allows continuing a search
* @ refcnt : reference count
* @ priv : private data storage
* @ enable_pullup : allows a strong pullup
* @ pullup_duration : time for the next strong pullup
* @ flags : one of w1_master_flags
* @ thread : thread for bus search and netlink commands
* @ mutex : protect most of w1_master
* @ bus_mutex : pretect concurrent bus access
* @ driver : sysfs driver
* @ dev : sysfs device
* @ bus_master : io operations available
* @ seq : sequence number used for netlink broadcasts
*/
2005-04-17 02:20:36 +04:00
struct w1_master
{
struct list_head w1_master_entry ;
struct module * owner ;
unsigned char name [ W1_MAXNAMELEN ] ;
2014-01-16 08:29:18 +04:00
/* list_mutex protects just slist and async_list so slaves can be
* searched for and async commands added while the master has
* w1_master . mutex locked and is operating on the bus .
2014-01-16 08:29:25 +04:00
* lock order w1_mlock , w1_master . mutex , w1_master . list_mutex
2014-01-16 08:29:18 +04:00
*/
struct mutex list_mutex ;
2005-04-17 02:20:36 +04:00
struct list_head slist ;
2014-01-16 08:29:18 +04:00
struct list_head async_list ;
2005-04-17 02:20:36 +04:00
int max_slave_count , slave_count ;
unsigned long attempts ;
int slave_ttl ;
int initialized ;
u32 id ;
2005-06-04 01:31:02 +04:00
int search_count ;
2014-01-16 08:29:16 +04:00
/* id to start searching on, to continue a search or 0 to restart */
u64 search_id ;
2005-04-17 02:20:36 +04:00
atomic_t refcnt ;
void * priv ;
2008-10-16 09:04:42 +04:00
/** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
int enable_pullup ;
/** 5V strong pullup duration in milliseconds, zero disabled. */
int pullup_duration ;
2014-01-16 08:29:13 +04:00
long flags ;
2006-02-20 11:15:37 +03:00
struct task_struct * thread ;
2006-04-03 12:04:27 +04:00
struct mutex mutex ;
2012-05-18 09:59:52 +04:00
struct mutex bus_mutex ;
2005-04-17 02:20:36 +04:00
struct device_driver * driver ;
2005-05-20 22:33:25 +04:00
struct device dev ;
2005-04-17 02:20:36 +04:00
struct w1_bus_master * bus_master ;
2006-03-23 19:11:58 +03:00
u32 seq ;
2005-04-17 02:20:36 +04:00
} ;
2014-01-16 08:29:18 +04:00
/**
* struct w1_async_cmd - execute callback from the w1_process kthread
* @ async_entry : link entry
* @ cb : callback function , must list_del and destroy this list before
* returning
*
* When inserted into the w1_master async_list , w1_process will execute
* the callback . Embed this into the structure with the command details .
*/
struct w1_async_cmd {
struct list_head async_entry ;
void ( * cb ) ( struct w1_master * dev , struct w1_async_cmd * async_cmd ) ;
} ;
2005-04-17 02:20:36 +04:00
int w1_create_master_attributes ( struct w1_master * ) ;
2008-10-16 09:04:38 +04:00
void w1_destroy_master_attributes ( struct w1_master * master ) ;
2006-03-23 19:11:58 +03:00
void w1_search ( struct w1_master * dev , u8 search_type , w1_slave_found_callback cb ) ;
void w1_search_devices ( struct w1_master * dev , u8 search_type , w1_slave_found_callback cb ) ;
2014-01-16 08:29:18 +04:00
/* call w1_unref_slave to release the reference counts w1_search_slave added */
2006-03-23 19:11:58 +03:00
struct w1_slave * w1_search_slave ( struct w1_reg_num * id ) ;
2014-01-16 08:29:18 +04:00
/* decrements the reference on sl->master and sl, and cleans up if zero
* returns the reference count after it has been decremented */
int w1_unref_slave ( struct w1_slave * sl ) ;
2011-05-27 03:26:03 +04:00
void w1_slave_found ( struct w1_master * dev , u64 rn ) ;
void w1_search_process_cb ( struct w1_master * dev , u8 search_type ,
w1_slave_found_callback cb ) ;
2014-01-16 08:29:17 +04:00
struct w1_slave * w1_slave_search_device ( struct w1_master * dev ,
struct w1_reg_num * rn ) ;
2006-03-23 19:11:58 +03:00
struct w1_master * w1_search_master_id ( u32 id ) ;
2008-10-16 09:04:38 +04:00
/* Disconnect and reconnect devices in the given family. Used for finding
* unclaimed devices after a family has been registered or releasing devices
* after a family has been unregistered . Set attach to 1 when a new family
* has just been registered , to 0 when it has been unregistered .
*/
void w1_reconnect_slaves ( struct w1_family * f , int attach ) ;
2014-01-16 08:29:17 +04:00
int w1_attach_slave_device ( struct w1_master * dev , struct w1_reg_num * rn ) ;
2014-01-16 08:29:18 +04:00
/* 0 success, otherwise EBUSY */
int w1_slave_detach ( struct w1_slave * sl ) ;
2008-10-16 09:04:38 +04:00
2006-03-23 19:11:58 +03:00
u8 w1_triplet ( struct w1_master * dev , int bdir ) ;
void w1_write_8 ( struct w1_master * , u8 ) ;
2008-11-13 00:27:08 +03:00
u8 w1_read_8 ( struct w1_master * ) ;
2006-03-23 19:11:58 +03:00
int w1_reset_bus ( struct w1_master * ) ;
u8 w1_calc_crc8 ( u8 * , int ) ;
void w1_write_block ( struct w1_master * , const u8 * , int ) ;
2009-01-08 05:09:01 +03:00
void w1_touch_block ( struct w1_master * , u8 * , int ) ;
2006-03-23 19:11:58 +03:00
u8 w1_read_block ( struct w1_master * , u8 * , int ) ;
int w1_reset_select_slave ( struct w1_slave * sl ) ;
2011-05-27 03:26:01 +04:00
int w1_reset_resume_command ( struct w1_master * ) ;
2008-10-16 09:04:42 +04:00
void w1_next_pullup ( struct w1_master * , int ) ;
2005-04-17 02:20:36 +04:00
2005-08-11 17:27:49 +04:00
static inline struct w1_slave * dev_to_w1_slave ( struct device * dev )
{
return container_of ( dev , struct w1_slave , dev ) ;
}
static inline struct w1_slave * kobj_to_w1_slave ( struct kobject * kobj )
{
return dev_to_w1_slave ( container_of ( kobj , struct device , kobj ) ) ;
}
static inline struct w1_master * dev_to_w1_master ( struct device * dev )
{
return container_of ( dev , struct w1_master , dev ) ;
}
2006-04-04 20:35:22 +04:00
extern struct device_driver w1_master_driver ;
extern struct device w1_master_device ;
extern int w1_max_slave_count ;
extern int w1_max_slave_ttl ;
extern struct list_head w1_masters ;
extern struct mutex w1_mlock ;
2014-01-16 08:29:18 +04:00
extern int w1_process_callbacks ( struct w1_master * dev ) ;
2006-04-04 20:35:22 +04:00
extern int w1_process ( void * ) ;
2005-04-17 02:20:36 +04:00
# endif /* __KERNEL__ */
# endif /* __W1_H */