2016-12-26 14:37:38 +03:00
# ifndef __LINUX_EXTCON_INTERNAL_H__
# define __LINUX_EXTCON_INTERNAL_H__
# include <linux/extcon.h>
/**
* struct extcon_dev - An extcon device represents one external connector .
* @ name : The name of this extcon device . Parent device name is
* used if NULL .
* @ supported_cable : Array of supported cable names ending with EXTCON_NONE .
* If supported_cable is NULL , cable name related APIs
* are disabled .
* @ mutually_exclusive : Array of mutually exclusive set of cables that cannot
* be attached simultaneously . The array should be
* ending with NULL or be NULL ( no mutually exclusive
* cables ) . For example , if it is { 0x7 , 0x30 , 0 } , then ,
* { 0 , 1 } , { 0 , 1 , 2 } , { 0 , 2 } , { 1 , 2 } , or { 4 , 5 } cannot
* be attached simulataneously . { 0x7 , 0 } is equivalent to
* { 0x3 , 0x6 , 0x5 , 0 } . If it is { 0xFFFFFFFF , 0 } , there
* can be no simultaneous connections .
* @ dev : Device of this extcon .
* @ state : Attach / detach state of this extcon . Do not provide at
* register - time .
2017-03-29 13:30:17 +03:00
* @ nh_all : Notifier for the state change events for all supported
* external connectors from this extcon .
2016-12-26 14:37:38 +03:00
* @ nh : Notifier for the state change events from this extcon
* @ entry : To support list of extcon devices so that users can
* search for extcon devices based on the extcon name .
* @ lock :
* @ max_supported : Internal value to store the number of cables .
* @ extcon_dev_type : Device_type struct to provide attribute_groups
* customized for each extcon device .
* @ cables : Sysfs subdirectories . Each represents one cable .
*
* In most cases , users only need to provide " User initializing data " of
* this struct when registering an extcon . In some exceptional cases ,
* optional callbacks may be needed . However , the values in " internal data "
* are overwritten by register function .
*/
struct extcon_dev {
/* Optional user initializing data */
const char * name ;
const unsigned int * supported_cable ;
const u32 * mutually_exclusive ;
/* Internal data. Please do not set. */
struct device dev ;
2017-03-29 13:30:17 +03:00
struct raw_notifier_head nh_all ;
2016-12-26 14:37:38 +03:00
struct raw_notifier_head * nh ;
struct list_head entry ;
int max_supported ;
spinlock_t lock ; /* could be called by irq handler */
u32 state ;
/* /sys/class/extcon/.../cable.n/... */
struct device_type extcon_dev_type ;
struct extcon_cable * cables ;
/* /sys/class/extcon/.../mutually_exclusive/... */
struct attribute_group attr_g_muex ;
struct attribute * * attrs_muex ;
struct device_attribute * d_attrs_muex ;
} ;
# endif /* __LINUX_EXTCON_INTERNAL_H__ */