2005-04-17 02:20:36 +04:00
/*
* include / asm - ppc / pmac_low_i2c . h
*
* Copyright ( C ) 2003 Ben . Herrenschmidt ( benh @ kernel . crashing . org )
*
* 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 .
*
*/
# ifndef __PMAC_LOW_I2C_H__
# define __PMAC_LOW_I2C_H__
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-04-17 02:20:36 +04:00
/* i2c mode (based on the platform functions format) */
enum {
2006-01-07 03:30:44 +03:00
pmac_i2c_mode_dumb = 1 ,
pmac_i2c_mode_std = 2 ,
pmac_i2c_mode_stdsub = 3 ,
pmac_i2c_mode_combined = 4 ,
2005-04-17 02:20:36 +04:00
} ;
/* RW bit in address */
enum {
2006-01-07 03:30:44 +03:00
pmac_i2c_read = 0x01 ,
pmac_i2c_write = 0x00
2005-04-17 02:20:36 +04:00
} ;
2006-01-07 03:30:44 +03:00
/* i2c bus type */
enum {
pmac_i2c_bus_keywest = 0 ,
pmac_i2c_bus_pmu = 1 ,
pmac_i2c_bus_smu = 2 ,
} ;
/* i2c bus features */
enum {
/* can_largesub : supports >1 byte subaddresses (SMU only) */
pmac_i2c_can_largesub = 0x00000001u ,
/* multibus : device node holds multiple busses, bus number is
* encoded in bits 0xff00 of " reg " of a given device
*/
pmac_i2c_multibus = 0x00000002u ,
} ;
/* i2c busses in the system */
struct pmac_i2c_bus ;
struct i2c_adapter ;
2005-04-17 02:20:36 +04:00
/* Init, called early during boot */
2006-01-07 03:30:44 +03:00
extern int pmac_i2c_init ( void ) ;
/* Lookup an i2c bus for a device-node. The node can be either the bus
* node itself or a device below it . In the case of a multibus , the bus
* node itself is the controller node , else , it ' s a child of the controller
* node
*/
extern struct pmac_i2c_bus * pmac_i2c_find_bus ( struct device_node * node ) ;
/* Get the address for an i2c device. This strips the bus number if
* necessary . The 7 bits address is returned 1 bit right shifted so that the
* direction can be directly ored in
*/
extern u8 pmac_i2c_get_dev_addr ( struct device_node * device ) ;
/* Get infos about a bus */
extern struct device_node * pmac_i2c_get_controller ( struct pmac_i2c_bus * bus ) ;
extern struct device_node * pmac_i2c_get_bus_node ( struct pmac_i2c_bus * bus ) ;
extern int pmac_i2c_get_type ( struct pmac_i2c_bus * bus ) ;
extern int pmac_i2c_get_flags ( struct pmac_i2c_bus * bus ) ;
2006-01-07 03:35:26 +03:00
extern int pmac_i2c_get_channel ( struct pmac_i2c_bus * bus ) ;
2006-01-07 03:30:44 +03:00
/* i2c layer adapter attach/detach */
extern void pmac_i2c_attach_adapter ( struct pmac_i2c_bus * bus ,
struct i2c_adapter * adapter ) ;
extern void pmac_i2c_detach_adapter ( struct pmac_i2c_bus * bus ,
struct i2c_adapter * adapter ) ;
extern struct i2c_adapter * pmac_i2c_get_adapter ( struct pmac_i2c_bus * bus ) ;
2006-01-07 03:35:26 +03:00
extern struct pmac_i2c_bus * pmac_i2c_adapter_to_bus ( struct i2c_adapter * adapter ) ;
2006-01-07 03:30:44 +03:00
/* March a device or bus with an i2c adapter structure, to be used by drivers
* to match device - tree nodes with i2c adapters during adapter discovery
* callbacks
*/
extern int pmac_i2c_match_adapter ( struct device_node * dev ,
struct i2c_adapter * adapter ) ;
2005-04-17 02:20:36 +04:00
2006-01-07 03:30:44 +03:00
/* (legacy) Locking functions exposed to i2c-keywest */
extern int pmac_low_i2c_lock ( struct device_node * np ) ;
extern int pmac_low_i2c_unlock ( struct device_node * np ) ;
2005-04-17 02:20:36 +04:00
/* Access functions for platform code */
2006-01-07 03:30:44 +03:00
extern int pmac_i2c_open ( struct pmac_i2c_bus * bus , int polled ) ;
extern void pmac_i2c_close ( struct pmac_i2c_bus * bus ) ;
extern int pmac_i2c_setmode ( struct pmac_i2c_bus * bus , int mode ) ;
extern int pmac_i2c_xfer ( struct pmac_i2c_bus * bus , u8 addrdir , int subsize ,
u32 subaddr , u8 * data , int len ) ;
2005-04-17 02:20:36 +04:00
2006-01-07 03:41:02 +03:00
/* Suspend/resume code called by via-pmu directly for now */
extern void pmac_pfunc_i2c_suspend ( void ) ;
extern void pmac_pfunc_i2c_resume ( void ) ;
2005-04-17 02:20:36 +04:00
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-04-17 02:20:36 +04:00
# endif /* __PMAC_LOW_I2C_H__ */