1717#include "amd_sfh_pcie.h"
1818#include "amd_sfh_hid.h"
1919
20- #define AMD_SFH_IDLE_LOOP 200
2120
2221struct request_list {
2322 struct hid_device * hid ;
@@ -123,14 +122,24 @@ static void amd_sfh_work_buffer(struct work_struct *work)
123122 int i ;
124123
125124 for (i = 0 ; i < cli_data -> num_hid_devices ; i ++ ) {
126- report_size = get_input_report (i , cli_data -> sensor_idx [i ], cli_data -> report_id [i ],
127- in_data );
128- hid_input_report (cli_data -> hid_sensor_hubs [i ], HID_INPUT_REPORT ,
129- in_data -> input_report [i ], report_size , 0 );
125+ if (cli_data -> sensor_sts [i ] == SENSOR_ENABLED ) {
126+ report_size = get_input_report
127+ (i , cli_data -> sensor_idx [i ], cli_data -> report_id [i ], in_data );
128+ hid_input_report (cli_data -> hid_sensor_hubs [i ], HID_INPUT_REPORT ,
129+ in_data -> input_report [i ], report_size , 0 );
130+ }
130131 }
131132 schedule_delayed_work (& cli_data -> work_buffer , msecs_to_jiffies (AMD_SFH_IDLE_LOOP ));
132133}
133134
135+ u32 amd_sfh_wait_for_response (struct amd_mp2_dev * mp2 , u8 sid , u32 sensor_sts )
136+ {
137+ if (mp2 -> mp2_ops -> response )
138+ sensor_sts = mp2 -> mp2_ops -> response (mp2 , sid , sensor_sts );
139+
140+ return sensor_sts ;
141+ }
142+
134143int amd_sfh_hid_client_init (struct amd_mp2_dev * privdata )
135144{
136145 struct amd_input_data * in_data = & privdata -> in_data ;
@@ -139,8 +148,8 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
139148 struct device * dev ;
140149 u32 feature_report_size ;
141150 u32 input_report_size ;
151+ int rc , i , status ;
142152 u8 cl_idx ;
143- int rc , i ;
144153
145154 dev = & privdata -> pdev -> dev ;
146155
@@ -155,7 +164,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
155164 in_data -> sensor_virt_addr [i ] = dma_alloc_coherent (dev , sizeof (int ) * 8 ,
156165 & cl_data -> sensor_dma_addr [i ],
157166 GFP_KERNEL );
158- cl_data -> sensor_sts [i ] = 0 ;
167+ cl_data -> sensor_sts [i ] = SENSOR_DISABLED ;
159168 cl_data -> sensor_requested_cnt [i ] = 0 ;
160169 cl_data -> cur_hid_dev = i ;
161170 cl_idx = cl_data -> sensor_idx [i ];
@@ -184,7 +193,7 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
184193 rc = - ENOMEM ;
185194 goto cleanup ;
186195 }
187- info .period = msecs_to_jiffies ( AMD_SFH_IDLE_LOOP ) ;
196+ info .period = AMD_SFH_IDLE_LOOP ;
188197 info .sensor_idx = cl_idx ;
189198 info .dma_address = cl_data -> sensor_dma_addr [i ];
190199
@@ -195,13 +204,27 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
195204 goto cleanup ;
196205 }
197206 rc = get_report_descriptor (cl_idx , cl_data -> report_descr [i ]);
198- if (rc )
199- return rc ;
200- rc = amdtp_hid_probe (cl_data -> cur_hid_dev , cl_data );
201207 if (rc )
202208 return rc ;
203209 privdata -> mp2_ops -> start (privdata , info );
204- cl_data -> sensor_sts [i ] = 1 ;
210+ status = amd_sfh_wait_for_response
211+ (privdata , cl_data -> sensor_idx [i ], SENSOR_ENABLED );
212+ if (status == SENSOR_ENABLED ) {
213+ cl_data -> sensor_sts [i ] = SENSOR_ENABLED ;
214+ rc = amdtp_hid_probe (cl_data -> cur_hid_dev , cl_data );
215+ if (rc ) {
216+ privdata -> mp2_ops -> stop (privdata , cl_data -> sensor_idx [i ]);
217+ status = amd_sfh_wait_for_response
218+ (privdata , cl_data -> sensor_idx [i ], SENSOR_DISABLED );
219+ if (status != SENSOR_ENABLED )
220+ cl_data -> sensor_sts [i ] = SENSOR_DISABLED ;
221+ dev_dbg (dev , "sid 0x%x status 0x%x\n" ,
222+ cl_data -> sensor_idx [i ], cl_data -> sensor_sts [i ]);
223+ goto cleanup ;
224+ }
225+ }
226+ dev_dbg (dev , "sid 0x%x status 0x%x\n" ,
227+ cl_data -> sensor_idx [i ], cl_data -> sensor_sts [i ]);
205228 }
206229 schedule_delayed_work (& cl_data -> work_buffer , msecs_to_jiffies (AMD_SFH_IDLE_LOOP ));
207230 return 0 ;
@@ -224,10 +247,19 @@ int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata)
224247{
225248 struct amdtp_cl_data * cl_data = privdata -> cl_data ;
226249 struct amd_input_data * in_data = cl_data -> in_data ;
227- int i ;
250+ int i , status ;
228251
229- for (i = 0 ; i < cl_data -> num_hid_devices ; i ++ )
230- privdata -> mp2_ops -> stop (privdata , i );
252+ for (i = 0 ; i < cl_data -> num_hid_devices ; i ++ ) {
253+ if (cl_data -> sensor_sts [i ] == SENSOR_ENABLED ) {
254+ privdata -> mp2_ops -> stop (privdata , cl_data -> sensor_idx [i ]);
255+ status = amd_sfh_wait_for_response
256+ (privdata , cl_data -> sensor_idx [i ], SENSOR_DISABLED );
257+ if (status != SENSOR_ENABLED )
258+ cl_data -> sensor_sts [i ] = SENSOR_DISABLED ;
259+ dev_dbg (& privdata -> pdev -> dev , "stopping sid 0x%x status 0x%x\n" ,
260+ cl_data -> sensor_idx [i ], cl_data -> sensor_sts [i ]);
261+ }
262+ }
231263
232264 cancel_delayed_work_sync (& cl_data -> work );
233265 cancel_delayed_work_sync (& cl_data -> work_buffer );
0 commit comments