Blame view

Documentation/extcon/porting-android-switch-class 4.91 KB
3e971dbc7   MyungJoo Ham   Documentation/ext...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  
  	Staging/Android Switch Class Porting Guide
  	(linux/drivers/staging/android/switch)
  	(c) Copyright 2012 Samsung Electronics
  
  AUTHORS
  MyungJoo Ham <myungjoo.ham@samsung.com>
  
  /*****************************************************************
   * CHAPTER 1.                                                    *
   * PORTING SWITCH CLASS DEVICE DRIVERS                           *
   *****************************************************************/
  
  ****** STEP 1. Basic Functionality
  	No extcon extended feature, but switch features only.
  
  - struct switch_dev (fed to switch_dev_register/unregister)
      @name: no change
      @dev: no change
      @index: drop (not used in switch device driver side anyway)
      @state: no change
  	If you have used @state with magic numbers, keep it
  	at this step.
      @print_name: no change but type change (switch_dev->extcon_dev)
      @print_state: no change but type change (switch_dev->extcon_dev)
  
  - switch_dev_register(sdev, dev)
42d7d7539   Chanwoo Choi   extcon: Simplify ...
28
29
30
31
  	=> extcon_dev_register(edev)
  	: type change (sdev->edev)
  	: remove second param('dev'). if edev has parent device, should store
  	  'dev' to 'edev.dev.parent' before registering extcon device
3e971dbc7   MyungJoo Ham   Documentation/ext...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  - switch_dev_unregister(sdev)
  	=> extcon_dev_unregister(edev)
  	: no change but type change (sdev->edev)
  - switch_get_state(sdev)
  	=> extcon_get_state(edev)
  	: no change but type change (sdev->edev) and (return: int->u32)
  - switch_set_state(sdev, state)
  	=> extcon_set_state(edev, state)
  	: no change but type change (sdev->edev) and (state: int->u32)
  
  With this changes, the ex-switch extcon class device works as it once
  worked as switch class device. However, it will now have additional
  interfaces (both ABI and in-kernel API) and different ABI locations.
  However, if CONFIG_ANDROID is enabled without CONFIG_ANDROID_SWITCH,
  /sys/class/switch/* will be symbolically linked to /sys/class/extcon/
  so that they are still compatible with legacy userspace processes.
  
  ****** STEP 2. Multistate (no more magic numbers in state value)
  	Extcon's extended features for switch device drivers with
  	complex features usually required magic numbers in state
  	value of switch_dev. With extcon, such magic numbers that
686fb5df1   MyungJoo Ham   extcon: fix switc...
53
  	support multiple cables are no more required or supported.
3e971dbc7   MyungJoo Ham   Documentation/ext...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  
    1. Define cable names at edev->supported_cable.
    2. (Recommended) remove print_state callback.
    3. Use extcon_get_cable_state_(edev, index) or
     extcon_get_cable_state(edev, cable_name) instead of
     extcon_get_state(edev) if you intend to get a state of a specific
     cable. Same for set_state. This way, you can remove the usage of
     magic numbers in state value.
    4. Use extcon_update_state() if you are updating specific bits of
     the state value.
  
  Example: a switch device driver w/ magic numbers for two cables.
  	"0x00": no cables connected.
  	"0x01": cable 1 connected
  	"0x02": cable 2 connected
  	"0x03": cable 1 and 2 connected
    1. edev->supported_cable = {"1", "2", NULL};
    2. edev->print_state = NULL;
    3. extcon_get_cable_state_(edev, 0) shows cable 1's state.
       extcon_get_cable_state(edev, "1") shows cable 1's state.
       extcon_set_cable_state_(edev, 1) sets cable 2's state.
       extcon_set_cable_state(edev, "2") sets cable 2's state
    4. extcon_update_state(edev, 0x01, 0) sets the least bit's 0.
  
  ****** STEP 3. Notify other device drivers
  
    You can notify others of the cable attach/detach events with
  notifier chains.
  
    At the side of other device drivers (the extcon device itself
  does not need to get notified of its own events), there are two
  methods to register notifier_block for cable events:
  (a) for a specific cable or (b) for every cable.
  
    (a) extcon_register_interest(obj, extcon_name, cable_name, nb)
  	Example: want to get news of "MAX8997_MUIC"'s "USB" cable
  
  	obj = kzalloc(sizeof(struct extcon_specific_cable_nb),
  		      GFP_KERNEL);
  	nb->notifier_call = the_callback_to_handle_usb;
  
  	extcon_register_intereset(obj, "MAX8997_MUIC", "USB", nb);
  
    (b) extcon_register_notifier(edev, nb)
  	Call nb for any changes in edev.
  
    Please note that in order to properly behave with method (a),
  the extcon device driver should support multistate feature (STEP 2).
  
  ****** STEP 4. Inter-cable relation (mutually exclusive)
  
    You can provide inter-cable mutually exclusiveness information
  for an extcon device. When cables A and B are declared to be mutually
  exclusive, the two cables cannot be in ATTACHED state simulteneously.
  
  
  /*****************************************************************
   * CHAPTER 2.                                                    *
   * PORTING USERSPACE w/ SWITCH CLASS DEVICE SUPPORT              *
   *****************************************************************/
  
  ****** ABI Location
686fb5df1   MyungJoo Ham   extcon: fix switc...
116
117
    If "CONFIG_ANDROID" is enabled, /sys/class/switch/* are created
  as symbolic links to /sys/class/extcon/*.
3e971dbc7   MyungJoo Ham   Documentation/ext...
118
119
120
121
122
  
    The two files of switch class, name and state, are provided with
  extcon, too. When the multistate support (STEP 2 of CHAPTER 1.) is
  not enabled or print_state callback is supplied, the output of
  state ABI is same with switch class.