ssp_dev.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. /*
  2. * Copyright (C) 2012, Samsung Electronics Co. Ltd. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include "ssp.h"
  16. #ifdef CONFIG_OF
  17. #include <linux/of_gpio.h>
  18. #endif
  19. /* ssp mcu device ID */
  20. #define DEVICE_ID 0x55
  21. #ifdef CONFIG_HAS_EARLYSUSPEND
  22. static void ssp_early_suspend(struct early_suspend *handler);
  23. static void ssp_late_resume(struct early_suspend *handler);
  24. #endif
  25. void ssp_enable(struct ssp_data *data, bool enable)
  26. {
  27. pr_info("%s, enable = %d, old enable = %d\n",
  28. __func__, enable, data->bSspShutdown);
  29. if (enable && data->bSspShutdown) {
  30. data->bSspShutdown = false;
  31. enable_irq(data->iIrq);
  32. if(data->mcu_int1 != 90) /* Temporary code for KS01 REV3 */
  33. enable_irq_wake(data->iIrq);
  34. } else if (!enable && !data->bSspShutdown) {
  35. data->bSspShutdown = true;
  36. disable_irq(data->iIrq);
  37. if(data->mcu_int1 != 90) /* Temporary code for KS01 REV3 */
  38. disable_irq_wake(data->iIrq);
  39. } else
  40. pr_err("%s, enable error\n", __func__);
  41. }
  42. /************************************************************************/
  43. /* interrupt happened due to transition/change of SSP MCU */
  44. /************************************************************************/
  45. static irqreturn_t sensordata_irq_thread_fn(int iIrq, void *dev_id)
  46. {
  47. struct ssp_data *data = dev_id;
  48. struct timespec ts;
  49. get_monotonic_boottime(&ts);
  50. data->timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
  51. select_irq_msg(data);
  52. data->uIrqCnt++;
  53. return IRQ_HANDLED;
  54. }
  55. /*************************************************************************/
  56. /* initialize sensor hub */
  57. /*************************************************************************/
  58. static void initialize_variable(struct ssp_data *data)
  59. {
  60. int iSensorIndex;
  61. for (iSensorIndex = 0; iSensorIndex < SENSOR_MAX; iSensorIndex++) {
  62. data->adDelayBuf[iSensorIndex] = DEFUALT_POLLING_DELAY;
  63. data->aiCheckStatus[iSensorIndex] = INITIALIZATION_STATE;
  64. }
  65. /* AKM Daemon Library */
  66. /*data->aiCheckStatus[GEOMAGNETIC_SENSOR] = NO_SENSOR_STATE;
  67. data->aiCheckStatus[ORIENTATION_SENSOR] = NO_SENSOR_STATE;*/
  68. memset(data->uFactorydata, 0, sizeof(char) * FACTORY_DATA_MAX);
  69. atomic_set(&data->aSensorEnable, 0);
  70. data->iLibraryLength = 0;
  71. data->uSensorState = 0;
  72. data->uFactorydataReady = 0;
  73. data->uFactoryProxAvg[0] = 0;
  74. data->uResetCnt = 0;
  75. data->uInstFailCnt = 0;
  76. data->uTimeOutCnt = 0;
  77. data->uSsdFailCnt = 0;
  78. data->uBusyCnt = 0;
  79. data->uIrqCnt = 0;
  80. data->uIrqFailCnt = 0;
  81. data->uMissSensorCnt = 0;
  82. data->bSspShutdown = true;
  83. data->bProximityRawEnabled = false;
  84. data->bGeomagneticRawEnabled = false;
  85. data->bMcuIRQTestSuccessed = false;
  86. data->bBarcodeEnabled = false;
  87. data->bAccelAlert = false;
  88. data->accelcal.x = 0;
  89. data->accelcal.y = 0;
  90. data->accelcal.z = 0;
  91. data->gyrocal.x = 0;
  92. data->gyrocal.y = 0;
  93. data->gyrocal.z = 0;
  94. data->magoffset.x = 0;
  95. data->magoffset.y = 0;
  96. data->magoffset.z = 0;
  97. data->iPressureCal = 0;
  98. data->uProxCanc = 0;
  99. data->uProxHiThresh = 0;
  100. data->uProxLoThresh = 0;
  101. data->uGyroDps = GYROSCOPE_DPS500;
  102. data->uIr_Current = 0;
  103. data->mcu_device = NULL;
  104. data->acc_device = NULL;
  105. data->gyro_device = NULL;
  106. data->mag_device = NULL;
  107. data->prs_device = NULL;
  108. data->prox_device = NULL;
  109. data->light_device = NULL;
  110. data->ges_device = NULL;
  111. data->step_count_total = 0;
  112. initialize_function_pointer(data);
  113. }
  114. int initialize_mcu(struct ssp_data *data)
  115. {
  116. int iRet = 0;
  117. iRet = get_chipid(data);
  118. pr_info("[SSP] MCU device ID = %d, reading ID = %d\n", DEVICE_ID, iRet);
  119. if (iRet != DEVICE_ID) {
  120. if (iRet < 0) {
  121. pr_err("[SSP]: %s - MCU is not working : 0x%x\n",
  122. __func__, iRet);
  123. } else {
  124. pr_err("[SSP]: %s - MCU identification failed\n",
  125. __func__);
  126. iRet = -ENODEV;
  127. }
  128. goto out;
  129. }
  130. iRet = set_sensor_position(data);
  131. if (iRet < 0) {
  132. pr_err("[SSP]: %s - set_sensor_position failed\n", __func__);
  133. goto out;
  134. }
  135. data->uSensorState = get_sensor_scanning_info(data);
  136. if (data->uSensorState == 0) {
  137. pr_err("[SSP]: %s - get_sensor_scanning_info failed\n",
  138. __func__);
  139. iRet = ERROR;
  140. goto out;
  141. }
  142. iRet = SUCCESS;
  143. out:
  144. return iRet;
  145. }
  146. static int initialize_irq(struct ssp_data *data)
  147. {
  148. int iRet, iIrq;
  149. iIrq = gpio_to_irq(data->mcu_int1);
  150. pr_info("[SSP]: requesting IRQ %d\n", iIrq);
  151. iRet = request_threaded_irq(iIrq, NULL, sensordata_irq_thread_fn,
  152. IRQF_TRIGGER_FALLING, "SSP_Int", data);
  153. if (iRet < 0) {
  154. pr_err("[SSP]: %s - request_irq(%d) failed for gpio %d (%d)\n",
  155. __func__, iIrq, iIrq, iRet);
  156. goto err_request_irq;
  157. }
  158. /* start with interrupts disabled */
  159. data->iIrq = iIrq;
  160. disable_irq(data->iIrq);
  161. return 0;
  162. err_request_irq:
  163. gpio_free(data->mcu_int1);
  164. return iRet;
  165. }
  166. static void work_function_firmware_update(struct work_struct *work)
  167. {
  168. struct ssp_data *data = container_of((struct delayed_work *)work,
  169. struct ssp_data, work_firmware);
  170. int iRet = 0;
  171. pr_info("[SSP] : %s\n", __func__);
  172. iRet = forced_to_download_binary(data, KERNEL_BINARY);
  173. if (iRet < 0) {
  174. ssp_dbg("[SSP]: %s - forced_to_download_binary failed!\n",
  175. __func__);
  176. return;
  177. }
  178. data->uCurFirmRev = get_firmware_rev(data);
  179. pr_info("[SSP] MCU Firm Rev : New = %8u\n",
  180. data->uCurFirmRev);
  181. }
  182. static int ssp_parse_dt(struct device *dev,
  183. struct ssp_data *data)
  184. {
  185. struct device_node *np = dev->of_node;
  186. enum of_gpio_flags flags;
  187. int errorno = 0;
  188. data->mcu_int1 = of_get_named_gpio_flags(np, "ssp,mcu_int1-gpio",
  189. 0, &flags);
  190. if (data->mcu_int1 < 0) {
  191. errorno = data->mcu_int1;
  192. goto dt_exit;
  193. }
  194. data->mcu_int2 = of_get_named_gpio_flags(np, "ssp,mcu_int2-gpio",
  195. 0, &flags);
  196. if (data->mcu_int2 < 0) {
  197. errorno = data->mcu_int2;
  198. goto dt_exit;
  199. }
  200. data->ap_int = of_get_named_gpio_flags(np, "ssp,ap_int-gpio",
  201. 0, &flags);
  202. if (data->ap_int < 0) {
  203. errorno = data->ap_int;
  204. goto dt_exit;
  205. }
  206. data->rst = of_get_named_gpio_flags(np, "ssp,rst-gpio",
  207. 0, &flags);
  208. if (data->rst < 0) {
  209. errorno = data->rst ;
  210. goto dt_exit;
  211. }
  212. data->chg = of_get_named_gpio_flags(np, "ssp,chg-gpio",
  213. 0, &flags);
  214. if (data->chg < 0) {
  215. errorno = data->chg ;
  216. goto dt_exit;
  217. }
  218. if (of_property_read_u32(np, "ssp,acc-position", &data->accel_position))
  219. data->accel_position = 0;
  220. if (of_property_read_u32(np, "ssp,mag-position", &data->mag_position))
  221. data->mag_position = 0;
  222. if (of_property_read_u32(np, "ssp,sns-combination", &data->sns_combination))
  223. data->sns_combination = 0;
  224. if (of_property_read_u32(np, "ssp,ap-rev", &data->ap_rev))
  225. data->ap_rev = 0;
  226. errorno = gpio_request(data->chg, "MCU_CHG");
  227. if (errorno) {
  228. printk(KERN_ERR "failed to request MCU_CHG for SSP\n");
  229. goto dt_exit;
  230. }
  231. gpio_direction_input(data->chg);
  232. errorno = gpio_request(data->mcu_int1, "mpu_ap_int1");
  233. if (errorno) {
  234. printk(KERN_ERR "failed to request MCU_INT2 for SSP\n");
  235. goto dt_exit;
  236. }
  237. errorno = gpio_direction_input(data->mcu_int1);
  238. if (errorno) {
  239. printk(KERN_ERR "failed to set mcu_int1 as input\n");
  240. goto dt_exit;
  241. }
  242. errorno = gpio_request(data->mcu_int2, "MCU_INT2");
  243. if (errorno) {
  244. printk(KERN_ERR "failed to request MCU_INT2 for SSP\n");
  245. goto dt_exit;
  246. }
  247. gpio_direction_input(data->mcu_int2);
  248. errorno = gpio_request(data->ap_int, "AP_MCU_INT");
  249. if (errorno) {
  250. printk(KERN_ERR "failed to request AP_INT for SSP\n");
  251. goto dt_exit;
  252. }
  253. gpio_direction_output(data->ap_int, 1);
  254. errorno = gpio_request(data->rst, "MCU_RST");
  255. if (errorno) {
  256. printk(KERN_ERR "failed to request MCU_RST for SSP\n");
  257. goto dt_exit;
  258. }
  259. gpio_direction_output(data->rst, 1);
  260. data->reg_hub = devm_regulator_get(dev, "hub_vreg");
  261. if (IS_ERR(data->reg_hub)) {
  262. pr_err("[SSP] could not get hub_vreg, %ld\n",
  263. PTR_ERR(data->reg_hub));
  264. } else {
  265. regulator_enable(data->reg_hub);
  266. }
  267. data->reg_sns= devm_regulator_get(dev, "psns_vreg");
  268. if (IS_ERR(data->reg_hub)) {
  269. pr_err("[SSP] could not get psns_vreg, %ld\n",
  270. PTR_ERR(data->reg_sns));
  271. } else {
  272. regulator_enable(data->reg_sns);
  273. }
  274. dt_exit:
  275. return errorno;
  276. }
  277. static int ssp_probe(struct i2c_client *client,
  278. const struct i2c_device_id *devid)
  279. {
  280. int iRet = 0;
  281. struct ssp_data *data;
  282. struct ssp_platform_data *pdata;
  283. #if 0 // not yet integrated in KK
  284. if (poweroff_charging == 1 || recovery_mode == 1) {
  285. pr_err("[SSP] probe exit : lpm %d recovery %d \n",
  286. poweroff_charging, recovery_mode);
  287. return -ENODEV;
  288. }
  289. #endif
  290. data = kzalloc(sizeof(*data), GFP_KERNEL);
  291. if (data == NULL) {
  292. pr_err("[SSP]: %s - failed to allocate memory for data\n",
  293. __func__);
  294. iRet = -ENOMEM;
  295. goto exit;
  296. }
  297. if (client->dev.of_node) {
  298. iRet = ssp_parse_dt(&client->dev, data);
  299. if (iRet) {
  300. pr_err("[SSP]: %s - Failed to parse DT\n", __func__);
  301. goto err_setup;
  302. }
  303. data->ssp_changes = SSP_MCU_L5; /* K330, MPU L5*/
  304. } else {
  305. pdata = client->dev.platform_data;
  306. if (pdata == NULL) {
  307. pr_err("[SSP]: %s - platform_data is null\n", __func__);
  308. iRet = -ENOMEM;
  309. goto err_setup;
  310. }
  311. data->wakeup_mcu = pdata->wakeup_mcu;
  312. data->check_mcu_ready = pdata->check_mcu_ready;
  313. data->check_mcu_busy = pdata->check_mcu_busy;
  314. data->set_mcu_reset = pdata->set_mcu_reset;
  315. data->read_chg = pdata->read_chg;
  316. /* AP system_rev */
  317. if (pdata->check_ap_rev)
  318. data->ap_rev = pdata->check_ap_rev();
  319. else
  320. data->ap_rev = 0;
  321. /* For changed devices */
  322. if (pdata->check_changes)
  323. data->ssp_changes = pdata->check_changes();
  324. else
  325. data->ssp_changes = SSP_MCU_L5; /* K330, MPU L5*/
  326. /* Get sensor positions */
  327. if (pdata->get_positions)
  328. pdata->get_positions(&data->accel_position,
  329. &data->mag_position);
  330. else if (client->dev.of_node == NULL) {
  331. data->accel_position = 0;
  332. data->mag_position = 0;
  333. }
  334. }
  335. data->bProbeIsDone = false;
  336. data->fw_dl_state = FW_DL_STATE_NONE;
  337. data->client = client;
  338. i2c_set_clientdata(client, data);
  339. #ifdef CONFIG_SENSORS_SSP_SHTC1
  340. mutex_init(&data->cp_temp_adc_lock);
  341. #endif
  342. if (((data->wakeup_mcu == NULL)
  343. || (data->check_mcu_ready == NULL)
  344. || (data->check_mcu_busy == NULL)
  345. || (data->set_mcu_reset == NULL)
  346. || (data->read_chg == NULL))
  347. && (client->dev.of_node == NULL)) {
  348. pr_err("[SSP]: %s - function callback is null\n", __func__);
  349. iRet = -EIO;
  350. goto err_reset_null;
  351. }
  352. pr_info("\n#####################################################\n");
  353. INIT_DELAYED_WORK(&data->work_firmware, work_function_firmware_update);
  354. /* check boot loader binary */
  355. data->fw_dl_state = check_fwbl(data);
  356. initialize_variable(data);
  357. if (data->fw_dl_state == FW_DL_STATE_NONE) {
  358. iRet = initialize_mcu(data);
  359. if (iRet == ERROR) {
  360. data->uResetCnt++;
  361. toggle_mcu_reset(data);
  362. msleep(SSP_SW_RESET_TIME);
  363. initialize_mcu(data);
  364. } else if (iRet < ERROR) {
  365. pr_err("[SSP]: %s - initialize_mcu failed\n", __func__);
  366. goto err_read_reg;
  367. }
  368. }
  369. wake_lock_init(&data->ssp_wake_lock,
  370. WAKE_LOCK_SUSPEND, "ssp_wake_lock");
  371. iRet = initialize_input_dev(data);
  372. if (iRet < 0) {
  373. pr_err("[SSP]: %s - could not create input device\n", __func__);
  374. goto err_input_register_device;
  375. }
  376. iRet = initialize_debug_timer(data);
  377. if (iRet < 0) {
  378. pr_err("[SSP]: %s - could not create workqueue\n", __func__);
  379. goto err_create_workqueue;
  380. }
  381. iRet = initialize_irq(data);
  382. if (iRet < 0) {
  383. pr_err("[SSP]: %s - could not create irq\n", __func__);
  384. goto err_setup_irq;
  385. }
  386. iRet = initialize_sysfs(data);
  387. if (iRet < 0) {
  388. pr_err("[SSP]: %s - could not create sysfs\n", __func__);
  389. goto err_sysfs_create;
  390. }
  391. iRet = initialize_event_symlink(data);
  392. if (iRet < 0) {
  393. pr_err("[SSP]: %s - could not create symlink\n", __func__);
  394. goto err_symlink_create;
  395. }
  396. #ifdef CONFIG_HAS_EARLYSUSPEND
  397. data->early_suspend.suspend = ssp_early_suspend;
  398. data->early_suspend.resume = ssp_late_resume;
  399. register_early_suspend(&data->early_suspend);
  400. #endif
  401. #ifdef CONFIG_SENSORS_SSP_SENSORHUB
  402. /* init sensorhub device */
  403. iRet = ssp_sensorhub_initialize(data);
  404. if (iRet < 0) {
  405. pr_err("%s: ssp_sensorhub_initialize err(%d)", __func__, iRet);
  406. ssp_sensorhub_remove(data);
  407. }
  408. #endif
  409. ssp_enable(data, true);
  410. pr_info("[SSP]: %s - probe success!\n", __func__);
  411. enable_debug_timer(data);
  412. iRet = 0;
  413. if (data->fw_dl_state == FW_DL_STATE_NEED_TO_SCHEDULE) {
  414. pr_info("[SSP]: Firmware update is scheduled\n");
  415. schedule_delayed_work(&data->work_firmware,
  416. msecs_to_jiffies(1000));
  417. data->fw_dl_state = FW_DL_STATE_SCHEDULED;
  418. } else if (data->fw_dl_state == FW_DL_STATE_FAIL)
  419. data->bSspShutdown = true;
  420. data->bProbeIsDone = true;
  421. goto exit;
  422. err_symlink_create:
  423. remove_sysfs(data);
  424. err_sysfs_create:
  425. free_irq(data->iIrq, data);
  426. gpio_free(data->mcu_int1);
  427. err_setup_irq:
  428. destroy_workqueue(data->debug_wq);
  429. err_create_workqueue:
  430. remove_input_dev(data);
  431. err_input_register_device:
  432. wake_lock_destroy(&data->ssp_wake_lock);
  433. err_read_reg:
  434. err_reset_null:
  435. #ifdef CONFIG_SENSORS_SSP_SHTC1
  436. mutex_destroy(&data->cp_temp_adc_lock);
  437. #endif
  438. err_setup:
  439. kfree(data);
  440. pr_err("[SSP]: %s - probe failed!\n", __func__);
  441. exit:
  442. pr_info("#####################################################\n\n");
  443. return iRet;
  444. }
  445. static void ssp_shutdown(struct i2c_client *client)
  446. {
  447. struct ssp_data *data = i2c_get_clientdata(client);
  448. func_dbg();
  449. if (data->bProbeIsDone == false)
  450. goto exit;
  451. if (data->fw_dl_state >= FW_DL_STATE_SCHEDULED &&
  452. data->fw_dl_state < FW_DL_STATE_DONE) {
  453. pr_err("%s, cancel_delayed_work_sync state = %d\n",
  454. __func__, data->fw_dl_state);
  455. cancel_delayed_work_sync(&data->work_firmware);
  456. }
  457. ssp_enable(data, false);
  458. #ifdef CONFIG_HAS_EARLYSUSPEND
  459. unregister_early_suspend(&data->early_suspend);
  460. #endif
  461. disable_debug_timer(data);
  462. free_irq(data->iIrq, data);
  463. gpio_free(data->mcu_int1);
  464. remove_sysfs(data);
  465. remove_event_symlink(data);
  466. remove_input_dev(data);
  467. #ifdef CONFIG_SENSORS_SSP_SENSORHUB
  468. ssp_sensorhub_remove(data);
  469. #endif
  470. del_timer_sync(&data->debug_timer);
  471. cancel_work_sync(&data->work_debug);
  472. destroy_workqueue(data->debug_wq);
  473. wake_lock_destroy(&data->ssp_wake_lock);
  474. #ifdef CONFIG_SENSORS_SSP_SHTC1
  475. mutex_destroy(&data->cp_temp_adc_lock);
  476. #endif
  477. toggle_mcu_reset(data);
  478. /* gpio_set_value_cansleep(data->rst, 0); */
  479. exit:
  480. kfree(data);
  481. }
  482. #ifdef CONFIG_HAS_EARLYSUSPEND
  483. static void ssp_early_suspend(struct early_suspend *handler)
  484. {
  485. struct ssp_data *data;
  486. data = container_of(handler, struct ssp_data, early_suspend);
  487. func_dbg();
  488. disable_debug_timer(data);
  489. #ifdef CONFIG_SENSORS_SSP_SENSORHUB
  490. /* give notice to user that AP goes to sleep */
  491. ssp_sensorhub_report_notice(data, MSG2SSP_AP_STATUS_SLEEP);
  492. ssp_sleep_mode(data);
  493. #else
  494. if (atomic_read(&data->aSensorEnable) > 0)
  495. ssp_sleep_mode(data);
  496. #endif
  497. }
  498. static void ssp_late_resume(struct early_suspend *handler)
  499. {
  500. struct ssp_data *data;
  501. data = container_of(handler, struct ssp_data, early_suspend);
  502. func_dbg();
  503. enable_debug_timer(data);
  504. #ifdef CONFIG_SENSORS_SSP_SENSORHUB
  505. /* give notice to user that AP goes to sleep */
  506. ssp_sensorhub_report_notice(data, MSG2SSP_AP_STATUS_WAKEUP);
  507. ssp_resume_mode(data);
  508. #else
  509. if (atomic_read(&data->aSensorEnable) > 0)
  510. ssp_resume_mode(data);
  511. #endif
  512. }
  513. #else /* CONFIG_HAS_EARLYSUSPEND */
  514. static int ssp_suspend(struct device *dev)
  515. {
  516. struct i2c_client *client = to_i2c_client(dev);
  517. struct ssp_data *data = i2c_get_clientdata(client);
  518. func_dbg();
  519. if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_SUSPEND))
  520. pr_err("[SSP]: %s MSG2SSP_AP_STATUS_SUSPEND failed\n",
  521. __func__);
  522. disable_irq(data->iIrq);
  523. return 0;
  524. }
  525. static int ssp_resume(struct device *dev)
  526. {
  527. struct i2c_client *client = to_i2c_client(dev);
  528. struct ssp_data *data = i2c_get_clientdata(client);
  529. enable_irq(data->iIrq);
  530. func_dbg();
  531. if (SUCCESS != ssp_send_cmd(data, MSG2SSP_AP_STATUS_RESUME))
  532. pr_err("[SSP]: %s MSG2SSP_AP_STATUS_RESUME failed\n",
  533. __func__);
  534. return 0;
  535. }
  536. static const struct dev_pm_ops ssp_pm_ops = {
  537. .suspend = ssp_suspend,
  538. .resume = ssp_resume
  539. };
  540. #endif /* CONFIG_HAS_EARLYSUSPEND */
  541. static const struct i2c_device_id ssp_id[] = {
  542. {"ssp", 0},
  543. {}
  544. };
  545. MODULE_DEVICE_TABLE(i2c, ssp_id);
  546. #ifdef CONFIG_OF
  547. static struct of_device_id ssp_match_table[] = {
  548. { .compatible = "ssp,ATUC128",},
  549. {},
  550. };
  551. #else
  552. #define mpu6500_match_table NULL
  553. #endif
  554. static struct i2c_driver ssp_driver = {
  555. .probe = ssp_probe,
  556. .shutdown = ssp_shutdown,
  557. .id_table = ssp_id,
  558. .driver = {
  559. #ifndef CONFIG_HAS_EARLYSUSPEND
  560. .pm = &ssp_pm_ops,
  561. #endif
  562. .owner = THIS_MODULE,
  563. .name = "ssp",
  564. .of_match_table = ssp_match_table
  565. },
  566. };
  567. module_i2c_driver(ssp_driver);
  568. MODULE_DESCRIPTION("ssp driver");
  569. MODULE_AUTHOR("Samsung Electronics");
  570. MODULE_LICENSE("GPL");