board-mahimahi-microp.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262
  1. /* board-mahimahi-microp.c
  2. * Copyright (C) 2009 Google.
  3. * Copyright (C) 2009 HTC Corporation.
  4. *
  5. * The Microp on mahimahi is an i2c device that supports
  6. * the following functions
  7. * - LEDs (Green, Amber, Jogball backlight)
  8. * - Lightsensor
  9. * - Headset remotekeys
  10. * - G-sensor
  11. * - Interrupts
  12. *
  13. * This software is licensed under the terms of the GNU General Public
  14. * License version 2, as published by the Free Software Foundation, and
  15. * may be copied, distributed, and modified under those terms.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. */
  22. #include <linux/kernel.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/slab.h>
  25. #include <linux/init.h>
  26. #include <linux/leds.h>
  27. #include <linux/workqueue.h>
  28. #include <linux/i2c.h>
  29. #include <linux/delay.h>
  30. #include <linux/gpio.h>
  31. #include <linux/miscdevice.h>
  32. #include <linux/input.h>
  33. #include <asm/uaccess.h>
  34. #include <linux/wakelock.h>
  35. #include <asm/mach-types.h>
  36. #include <mach/htc_pwrsink.h>
  37. #include <linux/earlysuspend.h>
  38. #include <linux/bma150.h>
  39. #include <linux/lightsensor.h>
  40. #include <asm/mach/mmc.h>
  41. #include <mach/htc_35mm_jack.h>
  42. #include <asm/setup.h>
  43. #include <linux/debugfs.h>
  44. #include <linux/seq_file.h>
  45. #include <linux/mutex.h>
  46. #include <linux/jiffies.h>
  47. #include "board-mahimahi.h"
  48. #define MICROP_I2C_NAME "mahimahi-microp"
  49. #define MICROP_LSENSOR_ADC_CHAN 6
  50. #define MICROP_REMOTE_KEY_ADC_CHAN 7
  51. #define MICROP_I2C_WCMD_MISC 0x20
  52. #define MICROP_I2C_WCMD_SPI_EN 0x21
  53. #define MICROP_I2C_WCMD_AUTO_BL_CTL 0x23
  54. #define MICROP_I2C_RCMD_SPI_BL_STATUS 0x24
  55. #define MICROP_I2C_WCMD_BUTTONS_LED_CTRL 0x25
  56. #define MICROP_I2C_RCMD_VERSION 0x30
  57. #define MICROP_I2C_WCMD_ADC_TABLE 0x42
  58. #define MICROP_I2C_WCMD_LED_MODE 0x53
  59. #define MICROP_I2C_RCMD_GREEN_LED_REMAIN_TIME 0x54
  60. #define MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME 0x55
  61. #define MICROP_I2C_RCMD_BLUE_LED_REMAIN_TIME 0x57
  62. #define MICROP_I2C_WCMD_JOGBALL_LED_MODE 0x5A
  63. #define MICROP_I2C_RCMD_JOGBALL_LED_REMAIN_TIME 0x5B
  64. #define MICROP_I2C_WCMD_JOGBALL_LED_PWM_SET 0x5C
  65. #define MICROP_I2C_WCMD_JOGBALL_LED_PERIOD_SET 0x5D
  66. #define MICROP_I2C_WCMD_READ_ADC_VALUE_REQ 0x60
  67. #define MICROP_I2C_RCMD_ADC_VALUE 0x62
  68. #define MICROP_I2C_WCMD_REMOTEKEY_TABLE 0x63
  69. #define MICROP_I2C_WCMD_LCM_REGISTER 0x70
  70. #define MICROP_I2C_WCMD_GSENSOR_REG 0x73
  71. #define MICROP_I2C_WCMD_GSENSOR_REG_DATA_REQ 0x74
  72. #define MICROP_I2C_RCMD_GSENSOR_REG_DATA 0x75
  73. #define MICROP_I2C_WCMD_GSENSOR_DATA_REQ 0x76
  74. #define MICROP_I2C_RCMD_GSENSOR_X_DATA 0x77
  75. #define MICROP_I2C_RCMD_GSENSOR_Y_DATA 0x78
  76. #define MICROP_I2C_RCMD_GSENSOR_Z_DATA 0x79
  77. #define MICROP_I2C_RCMD_GSENSOR_DATA 0x7A
  78. #define MICROP_I2C_WCMD_OJ_REG 0x7B
  79. #define MICROP_I2C_WCMD_OJ_REG_DATA_REQ 0x7C
  80. #define MICROP_I2C_RCMD_OJ_REG_DATA 0x7D
  81. #define MICROP_I2C_WCMD_OJ_POS_DATA_REQ 0x7E
  82. #define MICROP_I2C_RCMD_OJ_POS_DATA 0x7F
  83. #define MICROP_I2C_WCMD_GPI_INT_CTL_EN 0x80
  84. #define MICROP_I2C_WCMD_GPI_INT_CTL_DIS 0x81
  85. #define MICROP_I2C_RCMD_GPI_INT_STATUS 0x82
  86. #define MICROP_I2C_RCMD_GPI_STATUS 0x83
  87. #define MICROP_I2C_WCMD_GPI_INT_STATUS_CLR 0x84
  88. #define MICROP_I2C_RCMD_GPI_INT_SETTING 0x85
  89. #define MICROP_I2C_RCMD_REMOTE_KEYCODE 0x87
  90. #define MICROP_I2C_WCMD_REMOTE_KEY_DEBN_TIME 0x88
  91. #define MICROP_I2C_WCMD_REMOTE_PLUG_DEBN_TIME 0x89
  92. #define MICROP_I2C_WCMD_SIMCARD_DEBN_TIME 0x8A
  93. #define MICROP_I2C_WCMD_GPO_LED_STATUS_EN 0x90
  94. #define MICROP_I2C_WCMD_GPO_LED_STATUS_DIS 0x91
  95. #define IRQ_GSENSOR (1<<10)
  96. #define IRQ_LSENSOR (1<<9)
  97. #define IRQ_REMOTEKEY (1<<7)
  98. #define IRQ_HEADSETIN (1<<2)
  99. #define IRQ_SDCARD (1<<0)
  100. #define READ_GPI_STATE_HPIN (1<<2)
  101. #define READ_GPI_STATE_SDCARD (1<<0)
  102. #define ALS_CALIBRATE_MODE 147
  103. /* Check pattern, to check if ALS has been calibrated */
  104. #define ALS_CALIBRATED 0x6DA5
  105. /* delay for deferred light sensor read */
  106. #define LS_READ_DELAY (HZ/2)
  107. /*#define DEBUG_BMA150 */
  108. #ifdef DEBUG_BMA150
  109. /* Debug logging of accelleration data */
  110. #define GSENSOR_LOG_MAX 2048 /* needs to be power of 2 */
  111. #define GSENSOR_LOG_MASK (GSENSOR_LOG_MAX - 1)
  112. struct gsensor_log {
  113. ktime_t timestamp;
  114. short x;
  115. short y;
  116. short z;
  117. };
  118. static DEFINE_MUTEX(gsensor_log_lock);
  119. static struct gsensor_log gsensor_log[GSENSOR_LOG_MAX];
  120. static unsigned gsensor_log_head;
  121. static unsigned gsensor_log_tail;
  122. void gsensor_log_status(ktime_t time, short x, short y, short z)
  123. {
  124. unsigned n;
  125. mutex_lock(&gsensor_log_lock);
  126. n = gsensor_log_head;
  127. gsensor_log[n].timestamp = time;
  128. gsensor_log[n].x = x;
  129. gsensor_log[n].y = y;
  130. gsensor_log[n].z = z;
  131. n = (n + 1) & GSENSOR_LOG_MASK;
  132. if (n == gsensor_log_tail)
  133. gsensor_log_tail = (gsensor_log_tail + 1) & GSENSOR_LOG_MASK;
  134. gsensor_log_head = n;
  135. mutex_unlock(&gsensor_log_lock);
  136. }
  137. static int gsensor_log_print(struct seq_file *sf, void *private)
  138. {
  139. unsigned n;
  140. mutex_lock(&gsensor_log_lock);
  141. seq_printf(sf, "timestamp X Y Z\n");
  142. for (n = gsensor_log_tail;
  143. n != gsensor_log_head;
  144. n = (n + 1) & GSENSOR_LOG_MASK) {
  145. seq_printf(sf, "%10d.%010d %6d %6d %6d\n",
  146. gsensor_log[n].timestamp.tv.sec,
  147. gsensor_log[n].timestamp.tv.nsec,
  148. gsensor_log[n].x, gsensor_log[n].y,
  149. gsensor_log[n].z);
  150. }
  151. mutex_unlock(&gsensor_log_lock);
  152. return 0;
  153. }
  154. static int gsensor_log_open(struct inode *inode, struct file *file)
  155. {
  156. return single_open(file, gsensor_log_print, NULL);
  157. }
  158. static struct file_operations gsensor_log_fops = {
  159. .open = gsensor_log_open,
  160. .read = seq_read,
  161. .llseek = seq_lseek,
  162. .release = single_release,
  163. };
  164. #endif /* def DEBUG_BMA150 */
  165. static int microp_headset_has_mic(void);
  166. static int microp_enable_headset_plug_event(void);
  167. static int microp_enable_key_event(void);
  168. static int microp_disable_key_event(void);
  169. static struct h35mm_platform_data mahimahi_h35mm_data = {
  170. .plug_event_enable = microp_enable_headset_plug_event,
  171. .headset_has_mic = microp_headset_has_mic,
  172. .key_event_enable = microp_enable_key_event,
  173. .key_event_disable = microp_disable_key_event,
  174. };
  175. static struct platform_device mahimahi_h35mm = {
  176. .name = "htc_headset",
  177. .id = -1,
  178. .dev = {
  179. .platform_data = &mahimahi_h35mm_data,
  180. },
  181. };
  182. enum led_type {
  183. GREEN_LED,
  184. AMBER_LED,
  185. RED_LED,
  186. BLUE_LED,
  187. JOGBALL_LED,
  188. BUTTONS_LED,
  189. NUM_LEDS,
  190. };
  191. static uint16_t lsensor_adc_table[10] = {
  192. 0x000, 0x001, 0x00F, 0x01E, 0x03C, 0x121, 0x190, 0x2BA, 0x26E, 0x3FF
  193. };
  194. static uint16_t remote_key_adc_table[6] = {
  195. 0, 33, 43, 110, 129, 220
  196. };
  197. static uint32_t golden_adc = 0xC0;
  198. static uint32_t als_kadc;
  199. static struct wake_lock microp_i2c_wakelock;
  200. static struct i2c_client *private_microp_client;
  201. struct microp_int_pin {
  202. uint16_t int_gsensor;
  203. uint16_t int_lsensor;
  204. uint16_t int_reset;
  205. uint16_t int_simcard;
  206. uint16_t int_hpin;
  207. uint16_t int_remotekey;
  208. };
  209. struct microp_led_data {
  210. int type;
  211. struct led_classdev ldev;
  212. struct mutex led_data_mutex;
  213. struct work_struct brightness_work;
  214. spinlock_t brightness_lock;
  215. enum led_brightness brightness;
  216. uint8_t mode;
  217. uint8_t blink;
  218. };
  219. struct microp_i2c_work {
  220. struct work_struct work;
  221. struct i2c_client *client;
  222. int (*intr_debounce)(uint8_t *pin_status);
  223. void (*intr_function)(uint8_t *pin_status);
  224. };
  225. struct microp_i2c_client_data {
  226. struct microp_led_data leds[NUM_LEDS];
  227. uint16_t version;
  228. struct microp_i2c_work work;
  229. struct delayed_work hpin_debounce_work;
  230. struct delayed_work ls_read_work;
  231. struct early_suspend early_suspend;
  232. uint8_t enable_early_suspend;
  233. uint8_t enable_reset_button;
  234. int microp_is_suspend;
  235. int auto_backlight_enabled;
  236. uint8_t light_sensor_enabled;
  237. uint8_t force_light_sensor_read;
  238. uint8_t button_led_value;
  239. int headset_is_in;
  240. int is_hpin_pin_stable;
  241. struct input_dev *ls_input_dev;
  242. uint32_t als_kadc;
  243. uint32_t als_gadc;
  244. uint8_t als_calibrating;
  245. };
  246. static char *hex2string(uint8_t *data, int len)
  247. {
  248. static char buf[101];
  249. int i;
  250. i = (sizeof(buf) - 1) / 4;
  251. if (len > i)
  252. len = i;
  253. for (i = 0; i < len; i++)
  254. sprintf(buf + i * 4, "[%02X]", data[i]);
  255. return buf;
  256. }
  257. #define I2C_READ_RETRY_TIMES 10
  258. #define I2C_WRITE_RETRY_TIMES 10
  259. static int i2c_read_block(struct i2c_client *client, uint8_t addr,
  260. uint8_t *data, int length)
  261. {
  262. int retry;
  263. int ret;
  264. struct i2c_msg msgs[] = {
  265. {
  266. .addr = client->addr,
  267. .flags = 0,
  268. .len = 1,
  269. .buf = &addr,
  270. },
  271. {
  272. .addr = client->addr,
  273. .flags = I2C_M_RD,
  274. .len = length,
  275. .buf = data,
  276. }
  277. };
  278. mdelay(1);
  279. for (retry = 0; retry <= I2C_READ_RETRY_TIMES; retry++) {
  280. ret = i2c_transfer(client->adapter, msgs, 2);
  281. if (ret == 2) {
  282. dev_dbg(&client->dev, "R [%02X] = %s\n", addr,
  283. hex2string(data, length));
  284. return 0;
  285. }
  286. msleep(10);
  287. }
  288. dev_err(&client->dev, "i2c_read_block retry over %d\n",
  289. I2C_READ_RETRY_TIMES);
  290. return -EIO;
  291. }
  292. #define MICROP_I2C_WRITE_BLOCK_SIZE 21
  293. static int i2c_write_block(struct i2c_client *client, uint8_t addr,
  294. uint8_t *data, int length)
  295. {
  296. int retry;
  297. uint8_t buf[MICROP_I2C_WRITE_BLOCK_SIZE];
  298. int ret;
  299. struct i2c_msg msg[] = {
  300. {
  301. .addr = client->addr,
  302. .flags = 0,
  303. .len = length + 1,
  304. .buf = buf,
  305. }
  306. };
  307. dev_dbg(&client->dev, "W [%02X] = %s\n", addr,
  308. hex2string(data, length));
  309. if (length + 1 > MICROP_I2C_WRITE_BLOCK_SIZE) {
  310. dev_err(&client->dev, "i2c_write_block length too long\n");
  311. return -E2BIG;
  312. }
  313. buf[0] = addr;
  314. memcpy((void *)&buf[1], (void *)data, length);
  315. mdelay(1);
  316. for (retry = 0; retry <= I2C_WRITE_RETRY_TIMES; retry++) {
  317. ret = i2c_transfer(client->adapter, msg, 1);
  318. if (ret == 1)
  319. return 0;
  320. msleep(10);
  321. }
  322. dev_err(&client->dev, "i2c_write_block retry over %d\n",
  323. I2C_WRITE_RETRY_TIMES);
  324. return -EIO;
  325. }
  326. static int microp_read_adc(uint8_t channel, uint16_t *value)
  327. {
  328. struct i2c_client *client;
  329. int ret;
  330. uint8_t cmd[2], data[2];
  331. client = private_microp_client;
  332. cmd[0] = 0;
  333. cmd[1] = channel;
  334. ret = i2c_write_block(client, MICROP_I2C_WCMD_READ_ADC_VALUE_REQ,
  335. cmd, 2);
  336. if (ret < 0) {
  337. dev_err(&client->dev, "%s: request adc fail\n", __func__);
  338. return -EIO;
  339. }
  340. ret = i2c_read_block(client, MICROP_I2C_RCMD_ADC_VALUE, data, 2);
  341. if (ret < 0) {
  342. dev_err(&client->dev, "%s: read adc fail\n", __func__);
  343. return -EIO;
  344. }
  345. *value = data[0] << 8 | data[1];
  346. return 0;
  347. }
  348. static int microp_read_gpi_status(struct i2c_client *client, uint16_t *status)
  349. {
  350. uint8_t data[2];
  351. int ret;
  352. ret = i2c_read_block(client, MICROP_I2C_RCMD_GPI_STATUS, data, 2);
  353. if (ret < 0) {
  354. dev_err(&client->dev, "%s: read failed\n", __func__);
  355. return -EIO;
  356. }
  357. *status = (data[0] << 8) | data[1];
  358. return 0;
  359. }
  360. static int microp_interrupt_enable(struct i2c_client *client,
  361. uint16_t interrupt_mask)
  362. {
  363. uint8_t data[2];
  364. int ret = -1;
  365. data[0] = interrupt_mask >> 8;
  366. data[1] = interrupt_mask & 0xFF;
  367. ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_CTL_EN, data, 2);
  368. if (ret < 0)
  369. dev_err(&client->dev, "%s: enable 0x%x interrupt failed\n",
  370. __func__, interrupt_mask);
  371. return ret;
  372. }
  373. static int microp_interrupt_disable(struct i2c_client *client,
  374. uint16_t interrupt_mask)
  375. {
  376. uint8_t data[2];
  377. int ret = -1;
  378. data[0] = interrupt_mask >> 8;
  379. data[1] = interrupt_mask & 0xFF;
  380. ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_CTL_DIS, data, 2);
  381. if (ret < 0)
  382. dev_err(&client->dev, "%s: disable 0x%x interrupt failed\n",
  383. __func__, interrupt_mask);
  384. return ret;
  385. }
  386. /*
  387. * SD slot card-detect support
  388. */
  389. static unsigned int sdslot_cd = 0;
  390. static void (*sdslot_status_cb)(int card_present, void *dev_id);
  391. static void *sdslot_mmc_dev;
  392. int mahimahi_microp_sdslot_status_register(
  393. void (*cb)(int card_present, void *dev_id),
  394. void *dev_id)
  395. {
  396. if (sdslot_status_cb)
  397. return -EBUSY;
  398. sdslot_status_cb = cb;
  399. sdslot_mmc_dev = dev_id;
  400. return 0;
  401. }
  402. unsigned int mahimahi_microp_sdslot_status(struct device *dev)
  403. {
  404. return sdslot_cd;
  405. }
  406. static void mahimahi_microp_sdslot_update_status(int status)
  407. {
  408. sdslot_cd = !(status & READ_GPI_STATE_SDCARD);
  409. if (sdslot_status_cb)
  410. sdslot_status_cb(sdslot_cd, sdslot_mmc_dev);
  411. }
  412. /*
  413. *Headset Support
  414. */
  415. static void hpin_debounce_do_work(struct work_struct *work)
  416. {
  417. uint16_t gpi_status = 0;
  418. struct microp_i2c_client_data *cdata;
  419. int insert = 0;
  420. struct i2c_client *client;
  421. client = private_microp_client;
  422. cdata = i2c_get_clientdata(client);
  423. microp_read_gpi_status(client, &gpi_status);
  424. insert = (gpi_status & READ_GPI_STATE_HPIN) ? 0 : 1;
  425. if (insert != cdata->headset_is_in) {
  426. cdata->headset_is_in = insert;
  427. pr_debug("headset %s\n", insert ? "inserted" : "removed");
  428. htc_35mm_jack_plug_event(cdata->headset_is_in,
  429. &cdata->is_hpin_pin_stable);
  430. }
  431. }
  432. static int microp_enable_headset_plug_event(void)
  433. {
  434. int ret;
  435. struct i2c_client *client;
  436. struct microp_i2c_client_data *cdata;
  437. uint16_t stat;
  438. client = private_microp_client;
  439. cdata = i2c_get_clientdata(client);
  440. /* enable microp interrupt to detect changes */
  441. ret = microp_interrupt_enable(client, IRQ_HEADSETIN);
  442. if (ret < 0) {
  443. dev_err(&client->dev, "%s: failed to enable irqs\n",
  444. __func__);
  445. return 0;
  446. }
  447. /* see if headset state has changed */
  448. microp_read_gpi_status(client, &stat);
  449. stat = !(stat & READ_GPI_STATE_HPIN);
  450. if(cdata->headset_is_in != stat) {
  451. cdata->headset_is_in = stat;
  452. pr_debug("Headset state changed\n");
  453. htc_35mm_jack_plug_event(stat, &cdata->is_hpin_pin_stable);
  454. }
  455. return 1;
  456. }
  457. static int microp_headset_detect_mic(void)
  458. {
  459. uint16_t data;
  460. microp_read_adc(MICROP_REMOTE_KEY_ADC_CHAN, &data);
  461. if (data >= 200)
  462. return 1;
  463. else
  464. return 0;
  465. }
  466. static int microp_headset_has_mic(void)
  467. {
  468. int mic1 = -1;
  469. int mic2 = -1;
  470. int count = 0;
  471. mic2 = microp_headset_detect_mic();
  472. /* debounce the detection wait until 2 consecutive read are equal */
  473. while ((mic1 != mic2) && (count < 10)) {
  474. mic1 = mic2;
  475. msleep(600);
  476. mic2 = microp_headset_detect_mic();
  477. count++;
  478. }
  479. pr_info("%s: microphone (%d) %s\n", __func__, count,
  480. mic1 ? "present" : "not present");
  481. return mic1;
  482. }
  483. static int microp_enable_key_event(void)
  484. {
  485. int ret;
  486. struct i2c_client *client;
  487. client = private_microp_client;
  488. if (!is_cdma_version(system_rev))
  489. gpio_set_value(MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN, 1);
  490. /* turn on key interrupt */
  491. /* enable microp interrupt to detect changes */
  492. ret = microp_interrupt_enable(client, IRQ_REMOTEKEY);
  493. if (ret < 0) {
  494. dev_err(&client->dev, "%s: failed to enable irqs\n",
  495. __func__);
  496. return ret;
  497. }
  498. return 0;
  499. }
  500. static int microp_disable_key_event(void)
  501. {
  502. int ret;
  503. struct i2c_client *client;
  504. client = private_microp_client;
  505. /* shutdown key interrupt */
  506. if (!is_cdma_version(system_rev))
  507. gpio_set_value(MAHIMAHI_GPIO_35MM_KEY_INT_SHUTDOWN, 0);
  508. /* disable microp interrupt to detect changes */
  509. ret = microp_interrupt_disable(client, IRQ_REMOTEKEY);
  510. if (ret < 0) {
  511. dev_err(&client->dev, "%s: failed to disable irqs\n",
  512. __func__);
  513. return ret;
  514. }
  515. return 0;
  516. }
  517. static int get_remote_keycode(int *keycode)
  518. {
  519. struct i2c_client *client = private_microp_client;
  520. int ret;
  521. uint8_t data[2];
  522. ret = i2c_read_block(client, MICROP_I2C_RCMD_REMOTE_KEYCODE, data, 2);
  523. if (ret < 0) {
  524. dev_err(&client->dev, "%s: read remote keycode fail\n",
  525. __func__);
  526. return -EIO;
  527. }
  528. pr_debug("%s: key = 0x%x\n", __func__, data[1]);
  529. if (!data[1]) {
  530. *keycode = 0;
  531. return 1; /* no keycode */
  532. } else {
  533. *keycode = data[1];
  534. }
  535. return 0;
  536. }
  537. static ssize_t microp_i2c_remotekey_adc_show(struct device *dev,
  538. struct device_attribute *attr, char *buf)
  539. {
  540. struct i2c_client *client;
  541. uint16_t value;
  542. int i, button = 0;
  543. int ret;
  544. client = to_i2c_client(dev);
  545. microp_read_adc(MICROP_REMOTE_KEY_ADC_CHAN, &value);
  546. for (i = 0; i < 3; i++) {
  547. if ((value >= remote_key_adc_table[2 * i]) &&
  548. (value <= remote_key_adc_table[2 * i + 1])) {
  549. button = i + 1;
  550. }
  551. }
  552. ret = sprintf(buf, "Remote Key[0x%03X] => button %d\n",
  553. value, button);
  554. return ret;
  555. }
  556. static DEVICE_ATTR(key_adc, 0644, microp_i2c_remotekey_adc_show, NULL);
  557. /*
  558. * LED support
  559. */
  560. static int microp_i2c_write_led_mode(struct i2c_client *client,
  561. struct led_classdev *led_cdev,
  562. uint8_t mode, uint16_t off_timer)
  563. {
  564. struct microp_i2c_client_data *cdata;
  565. struct microp_led_data *ldata;
  566. uint8_t data[7];
  567. int ret;
  568. cdata = i2c_get_clientdata(client);
  569. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  570. if (ldata->type == GREEN_LED) {
  571. data[0] = 0x01;
  572. data[1] = mode;
  573. data[2] = off_timer >> 8;
  574. data[3] = off_timer & 0xFF;
  575. data[4] = 0x00;
  576. data[5] = 0x00;
  577. data[6] = 0x00;
  578. } else if (ldata->type == AMBER_LED) {
  579. data[0] = 0x02;
  580. data[1] = 0x00;
  581. data[2] = 0x00;
  582. data[3] = 0x00;
  583. data[4] = mode;
  584. data[5] = off_timer >> 8;
  585. data[6] = off_timer & 0xFF;
  586. } else if (ldata->type == RED_LED) {
  587. data[0] = 0x02;
  588. data[1] = 0x00;
  589. data[2] = 0x00;
  590. data[3] = 0x00;
  591. data[4] = mode? 5: 0;
  592. data[5] = off_timer >> 8;
  593. data[6] = off_timer & 0xFF;
  594. } else if (ldata->type == BLUE_LED) {
  595. data[0] = 0x04;
  596. data[1] = mode;
  597. data[2] = off_timer >> 8;
  598. data[3] = off_timer & 0xFF;
  599. data[4] = 0x00;
  600. data[5] = 0x00;
  601. data[6] = 0x00;
  602. }
  603. ret = i2c_write_block(client, MICROP_I2C_WCMD_LED_MODE, data, 7);
  604. if (ret == 0) {
  605. mutex_lock(&ldata->led_data_mutex);
  606. if (mode > 1)
  607. ldata->blink = mode;
  608. else
  609. ldata->mode = mode;
  610. mutex_unlock(&ldata->led_data_mutex);
  611. }
  612. return ret;
  613. }
  614. static ssize_t microp_i2c_led_blink_show(struct device *dev,
  615. struct device_attribute *attr, char *buf)
  616. {
  617. struct led_classdev *led_cdev;
  618. struct microp_led_data *ldata;
  619. int ret;
  620. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  621. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  622. mutex_lock(&ldata->led_data_mutex);
  623. ret = sprintf(buf, "%d\n", ldata->blink ? ldata->blink - 1 : 0);
  624. mutex_unlock(&ldata->led_data_mutex);
  625. return ret;
  626. }
  627. static ssize_t microp_i2c_led_blink_store(struct device *dev,
  628. struct device_attribute *attr,
  629. const char *buf, size_t count)
  630. {
  631. struct led_classdev *led_cdev;
  632. struct microp_led_data *ldata;
  633. struct i2c_client *client;
  634. int val, ret;
  635. uint8_t mode;
  636. val = -1;
  637. sscanf(buf, "%u", &val);
  638. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  639. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  640. client = to_i2c_client(dev->parent);
  641. mutex_lock(&ldata->led_data_mutex);
  642. switch (val) {
  643. case 0: /* stop flashing */
  644. mode = ldata->mode;
  645. ldata->blink = 0;
  646. break;
  647. case 1:
  648. case 2:
  649. case 3:
  650. mode = val + 1;
  651. break;
  652. default:
  653. mutex_unlock(&ldata->led_data_mutex);
  654. return -EINVAL;
  655. }
  656. mutex_unlock(&ldata->led_data_mutex);
  657. ret = microp_i2c_write_led_mode(client, led_cdev, mode, 0xffff);
  658. if (ret)
  659. dev_err(&client->dev, "%s set blink failed\n", led_cdev->name);
  660. return count;
  661. }
  662. static DEVICE_ATTR(blink, 0644, microp_i2c_led_blink_show,
  663. microp_i2c_led_blink_store);
  664. static ssize_t microp_i2c_led_off_timer_show(struct device *dev,
  665. struct device_attribute *attr, char *buf)
  666. {
  667. struct microp_i2c_client_data *cdata;
  668. struct led_classdev *led_cdev;
  669. struct microp_led_data *ldata;
  670. struct i2c_client *client;
  671. uint8_t data[2];
  672. int ret, offtime;
  673. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  674. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  675. client = to_i2c_client(dev->parent);
  676. cdata = i2c_get_clientdata(client);
  677. dev_dbg(&client->dev, "Getting %s remaining time\n", led_cdev->name);
  678. if (ldata->type == GREEN_LED) {
  679. ret = i2c_read_block(client,
  680. MICROP_I2C_RCMD_GREEN_LED_REMAIN_TIME, data, 2);
  681. } else if (ldata->type == AMBER_LED) {
  682. ret = i2c_read_block(client,
  683. MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME,
  684. data, 2);
  685. } else if (ldata->type == RED_LED) {
  686. ret = i2c_read_block(client,
  687. MICROP_I2C_RCMD_AMBER_RED_LED_REMAIN_TIME,
  688. data, 2);
  689. } else if (ldata->type == BLUE_LED) {
  690. ret = i2c_read_block(client,
  691. MICROP_I2C_RCMD_BLUE_LED_REMAIN_TIME, data, 2);
  692. } else {
  693. dev_err(&client->dev, "Unknown led %s\n", ldata->ldev.name);
  694. return -EINVAL;
  695. }
  696. if (ret) {
  697. dev_err(&client->dev,
  698. "%s get off_timer failed\n", led_cdev->name);
  699. }
  700. offtime = (int)((data[1] | data[0] << 8) * 2);
  701. ret = sprintf(buf, "Time remains %d:%d\n", offtime / 60, offtime % 60);
  702. return ret;
  703. }
  704. static ssize_t microp_i2c_led_off_timer_store(struct device *dev,
  705. struct device_attribute *attr,
  706. const char *buf, size_t count)
  707. {
  708. struct led_classdev *led_cdev;
  709. struct microp_led_data *ldata;
  710. struct i2c_client *client;
  711. int min, sec, ret;
  712. uint16_t off_timer;
  713. min = -1;
  714. sec = -1;
  715. sscanf(buf, "%d %d", &min, &sec);
  716. if (min < 0 || min > 255)
  717. return -EINVAL;
  718. if (sec < 0 || sec > 255)
  719. return -EINVAL;
  720. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  721. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  722. client = to_i2c_client(dev->parent);
  723. dev_dbg(&client->dev, "Setting %s off_timer to %d min %d sec\n",
  724. led_cdev->name, min, sec);
  725. if (!min && !sec)
  726. off_timer = 0xFFFF;
  727. else
  728. off_timer = (min * 60 + sec) / 2;
  729. ret = microp_i2c_write_led_mode(client, led_cdev,
  730. ldata->mode, off_timer);
  731. if (ret) {
  732. dev_err(&client->dev,
  733. "%s set off_timer %d min %d sec failed\n",
  734. led_cdev->name, min, sec);
  735. }
  736. return count;
  737. }
  738. static DEVICE_ATTR(off_timer, 0644, microp_i2c_led_off_timer_show,
  739. microp_i2c_led_off_timer_store);
  740. static ssize_t microp_i2c_jogball_color_store(struct device *dev,
  741. struct device_attribute *attr,
  742. const char *buf, size_t count)
  743. {
  744. struct led_classdev *led_cdev;
  745. struct microp_led_data *ldata;
  746. struct i2c_client *client;
  747. int rpwm, gpwm, bpwm, ret;
  748. uint8_t data[4];
  749. rpwm = -1;
  750. gpwm = -1;
  751. bpwm = -1;
  752. sscanf(buf, "%d %d %d", &rpwm, &gpwm, &bpwm);
  753. if (rpwm < 0 || rpwm > 255)
  754. return -EINVAL;
  755. if (gpwm < 0 || gpwm > 255)
  756. return -EINVAL;
  757. if (bpwm < 0 || bpwm > 255)
  758. return -EINVAL;
  759. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  760. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  761. client = to_i2c_client(dev->parent);
  762. dev_dbg(&client->dev, "Setting %s color to R=%d, G=%d, B=%d\n",
  763. led_cdev->name, rpwm, gpwm, bpwm);
  764. data[0] = rpwm;
  765. data[1] = gpwm;
  766. data[2] = bpwm;
  767. data[3] = 0x00;
  768. ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_PWM_SET,
  769. data, 4);
  770. if (ret) {
  771. dev_err(&client->dev,
  772. "%s set color R=%d G=%d B=%d failed\n",
  773. led_cdev->name, rpwm, gpwm, bpwm);
  774. }
  775. return count;
  776. }
  777. static DEVICE_ATTR(color, 0644, NULL, microp_i2c_jogball_color_store);
  778. static ssize_t microp_i2c_jogball_period_store(struct device *dev,
  779. struct device_attribute *attr,
  780. const char *buf, size_t count)
  781. {
  782. struct led_classdev *led_cdev;
  783. struct microp_led_data *ldata;
  784. struct i2c_client *client;
  785. int period = -1;
  786. int ret;
  787. uint8_t data[4];
  788. sscanf(buf, "%d", &period);
  789. if (period < 2 || period > 12)
  790. return -EINVAL;
  791. led_cdev = (struct led_classdev *)dev_get_drvdata(dev);
  792. ldata = container_of(led_cdev, struct microp_led_data, ldev);
  793. client = to_i2c_client(dev->parent);
  794. dev_info(&client->dev, "Setting Jogball flash period to %d\n", period);
  795. data[0] = 0x00;
  796. data[1] = period;
  797. ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_PERIOD_SET,
  798. data, 2);
  799. if (ret) {
  800. dev_err(&client->dev, "%s set period=%d failed\n",
  801. led_cdev->name, period);
  802. }
  803. return count;
  804. }
  805. static DEVICE_ATTR(period, 0644, NULL, microp_i2c_jogball_period_store);
  806. static void microp_brightness_set(struct led_classdev *led_cdev,
  807. enum led_brightness brightness)
  808. {
  809. unsigned long flags;
  810. struct i2c_client *client = to_i2c_client(led_cdev->dev->parent);
  811. struct microp_led_data *ldata =
  812. container_of(led_cdev, struct microp_led_data, ldev);
  813. dev_dbg(&client->dev, "Setting %s brightness current %d new %d\n",
  814. led_cdev->name, led_cdev->brightness, brightness);
  815. if (brightness > 255)
  816. brightness = 255;
  817. led_cdev->brightness = brightness;
  818. spin_lock_irqsave(&ldata->brightness_lock, flags);
  819. ldata->brightness = brightness;
  820. spin_unlock_irqrestore(&ldata->brightness_lock, flags);
  821. schedule_work(&ldata->brightness_work);
  822. }
  823. static void microp_led_brightness_set_work(struct work_struct *work)
  824. {
  825. unsigned long flags;
  826. struct microp_led_data *ldata =
  827. container_of(work, struct microp_led_data, brightness_work);
  828. struct led_classdev *led_cdev = &ldata->ldev;
  829. struct i2c_client *client = to_i2c_client(led_cdev->dev->parent);
  830. enum led_brightness brightness;
  831. int ret;
  832. uint8_t mode;
  833. spin_lock_irqsave(&ldata->brightness_lock, flags);
  834. brightness = ldata->brightness;
  835. spin_unlock_irqrestore(&ldata->brightness_lock, flags);
  836. if (brightness)
  837. mode = 1;
  838. else
  839. mode = 0;
  840. ret = microp_i2c_write_led_mode(client, led_cdev, mode, 0xffff);
  841. if (ret) {
  842. dev_err(&client->dev,
  843. "led_brightness_set failed to set mode\n");
  844. }
  845. }
  846. struct device_attribute *green_amber_attrs[] = {
  847. &dev_attr_blink,
  848. &dev_attr_off_timer,
  849. };
  850. struct device_attribute *jogball_attrs[] = {
  851. &dev_attr_color,
  852. &dev_attr_period,
  853. };
  854. static void microp_led_buttons_brightness_set_work(struct work_struct *work)
  855. {
  856. unsigned long flags;
  857. struct microp_led_data *ldata =
  858. container_of(work, struct microp_led_data, brightness_work);
  859. struct led_classdev *led_cdev = &ldata->ldev;
  860. struct i2c_client *client = to_i2c_client(led_cdev->dev->parent);
  861. struct microp_i2c_client_data *cdata = i2c_get_clientdata(client);
  862. uint8_t data[4] = {0, 0, 0};
  863. int ret = 0;
  864. enum led_brightness brightness;
  865. uint8_t value;
  866. spin_lock_irqsave(&ldata->brightness_lock, flags);
  867. brightness = ldata->brightness;
  868. spin_unlock_irqrestore(&ldata->brightness_lock, flags);
  869. value = brightness >= 255 ? 0x20 : 0;
  870. /* avoid a flicker that can occur when writing the same value */
  871. if (cdata->button_led_value == value)
  872. return;
  873. cdata->button_led_value = value;
  874. /* in 40ms */
  875. data[0] = 0x05;
  876. /* duty cycle 0-255 */
  877. data[1] = value;
  878. /* bit2 == change brightness */
  879. data[3] = 0x04;
  880. ret = i2c_write_block(client, MICROP_I2C_WCMD_BUTTONS_LED_CTRL,
  881. data, 4);
  882. if (ret < 0)
  883. dev_err(&client->dev, "%s failed on set buttons\n", __func__);
  884. }
  885. static void microp_led_jogball_brightness_set_work(struct work_struct *work)
  886. {
  887. unsigned long flags;
  888. struct microp_led_data *ldata =
  889. container_of(work, struct microp_led_data, brightness_work);
  890. struct led_classdev *led_cdev = &ldata->ldev;
  891. struct i2c_client *client = to_i2c_client(led_cdev->dev->parent);
  892. uint8_t data[3] = {0, 0, 0};
  893. int ret = 0;
  894. enum led_brightness brightness;
  895. spin_lock_irqsave(&ldata->brightness_lock, flags);
  896. brightness = ldata->brightness;
  897. spin_unlock_irqrestore(&ldata->brightness_lock, flags);
  898. switch (brightness) {
  899. case 0:
  900. data[0] = 0;
  901. break;
  902. case 3:
  903. data[0] = 1;
  904. data[1] = data[2] = 0xFF;
  905. break;
  906. case 7:
  907. data[0] = 2;
  908. data[1] = 0;
  909. data[2] = 60;
  910. break;
  911. default:
  912. dev_warn(&client->dev, "%s: unknown value: %d\n",
  913. __func__, brightness);
  914. break;
  915. }
  916. ret = i2c_write_block(client, MICROP_I2C_WCMD_JOGBALL_LED_MODE,
  917. data, 3);
  918. if (ret < 0)
  919. dev_err(&client->dev, "%s failed on set jogball mode:0x%2.2X\n",
  920. __func__, data[0]);
  921. }
  922. /*
  923. * Light Sensor Support
  924. */
  925. static int microp_i2c_auto_backlight_mode(struct i2c_client *client,
  926. uint8_t enabled)
  927. {
  928. uint8_t data[2];
  929. int ret = 0;
  930. data[0] = 0;
  931. if (enabled)
  932. data[1] = 1;
  933. else
  934. data[1] = 0;
  935. ret = i2c_write_block(client, MICROP_I2C_WCMD_AUTO_BL_CTL, data, 2);
  936. if (ret != 0)
  937. pr_err("%s: set auto light sensor fail\n", __func__);
  938. return ret;
  939. }
  940. static int lightsensor_enable(void)
  941. {
  942. struct i2c_client *client;
  943. struct microp_i2c_client_data *cdata;
  944. int ret;
  945. client = private_microp_client;
  946. cdata = i2c_get_clientdata(client);
  947. if (cdata->microp_is_suspend) {
  948. pr_err("%s: abort, uP is going to suspend after #\n",
  949. __func__);
  950. return -EIO;
  951. }
  952. disable_irq(client->irq);
  953. ret = microp_i2c_auto_backlight_mode(client, 1);
  954. if (ret < 0) {
  955. pr_err("%s: set auto light sensor fail\n", __func__);
  956. enable_irq(client->irq);
  957. return ret;
  958. }
  959. cdata->auto_backlight_enabled = 1;
  960. /* TEMPORARY HACK: schedule a deferred light sensor read
  961. * to work around sensor manager race condition
  962. */
  963. schedule_delayed_work(&cdata->ls_read_work, LS_READ_DELAY);
  964. schedule_work(&cdata->work.work);
  965. return 0;
  966. }
  967. static int lightsensor_disable(void)
  968. {
  969. /* update trigger data when done */
  970. struct i2c_client *client;
  971. struct microp_i2c_client_data *cdata;
  972. int ret;
  973. client = private_microp_client;
  974. cdata = i2c_get_clientdata(client);
  975. if (cdata->microp_is_suspend) {
  976. pr_err("%s: abort, uP is going to suspend after #\n",
  977. __func__);
  978. return -EIO;
  979. }
  980. cancel_delayed_work(&cdata->ls_read_work);
  981. ret = microp_i2c_auto_backlight_mode(client, 0);
  982. if (ret < 0)
  983. pr_err("%s: disable auto light sensor fail\n",
  984. __func__);
  985. else
  986. cdata->auto_backlight_enabled = 0;
  987. return 0;
  988. }
  989. static int microp_lightsensor_read(uint16_t *adc_value,
  990. uint8_t *adc_level)
  991. {
  992. struct i2c_client *client;
  993. struct microp_i2c_client_data *cdata;
  994. uint8_t i;
  995. int ret;
  996. client = private_microp_client;
  997. cdata = i2c_get_clientdata(client);
  998. ret = microp_read_adc(MICROP_LSENSOR_ADC_CHAN, adc_value);
  999. if (ret != 0)
  1000. return -1;
  1001. if (*adc_value > 0x3FF) {
  1002. pr_warning("%s: get wrong value: 0x%X\n",
  1003. __func__, *adc_value);
  1004. return -1;
  1005. } else {
  1006. if (!cdata->als_calibrating) {
  1007. *adc_value = *adc_value
  1008. * cdata->als_gadc / cdata->als_kadc;
  1009. if (*adc_value > 0x3FF)
  1010. *adc_value = 0x3FF;
  1011. }
  1012. *adc_level = ARRAY_SIZE(lsensor_adc_table) - 1;
  1013. for (i = 0; i < ARRAY_SIZE(lsensor_adc_table); i++) {
  1014. if (*adc_value <= lsensor_adc_table[i]) {
  1015. *adc_level = i;
  1016. break;
  1017. }
  1018. }
  1019. pr_debug("%s: ADC value: 0x%X, level: %d #\n",
  1020. __func__, *adc_value, *adc_level);
  1021. }
  1022. return 0;
  1023. }
  1024. static ssize_t microp_i2c_lightsensor_adc_show(struct device *dev,
  1025. struct device_attribute *attr, char *buf)
  1026. {
  1027. uint8_t adc_level = 0;
  1028. uint16_t adc_value = 0;
  1029. int ret;
  1030. ret = microp_lightsensor_read(&adc_value, &adc_level);
  1031. ret = sprintf(buf, "ADC[0x%03X] => level %d\n", adc_value, adc_level);
  1032. return ret;
  1033. }
  1034. static DEVICE_ATTR(ls_adc, 0644, microp_i2c_lightsensor_adc_show, NULL);
  1035. static ssize_t microp_i2c_ls_auto_show(struct device *dev,
  1036. struct device_attribute *attr, char *buf)
  1037. {
  1038. struct i2c_client *client;
  1039. uint8_t data[2] = {0, 0};
  1040. int ret;
  1041. client = to_i2c_client(dev);
  1042. i2c_read_block(client, MICROP_I2C_RCMD_SPI_BL_STATUS, data, 2);
  1043. ret = sprintf(buf, "Light sensor Auto = %d, SPI enable = %d\n",
  1044. data[0], data[1]);
  1045. return ret;
  1046. }
  1047. static ssize_t microp_i2c_ls_auto_store(struct device *dev,
  1048. struct device_attribute *attr,
  1049. const char *buf, size_t count)
  1050. {
  1051. struct i2c_client *client;
  1052. struct microp_i2c_client_data *cdata;
  1053. uint8_t enable = 0;
  1054. int ls_auto;
  1055. ls_auto = -1;
  1056. sscanf(buf, "%d", &ls_auto);
  1057. if (ls_auto != 0 && ls_auto != 1 && ls_auto != ALS_CALIBRATE_MODE)
  1058. return -EINVAL;
  1059. client = to_i2c_client(dev);
  1060. cdata = i2c_get_clientdata(client);
  1061. if (ls_auto) {
  1062. enable = 1;
  1063. cdata->als_calibrating = (ls_auto == ALS_CALIBRATE_MODE) ? 1 : 0;
  1064. cdata->auto_backlight_enabled = 1;
  1065. } else {
  1066. enable = 0;
  1067. cdata->als_calibrating = 0;
  1068. cdata->auto_backlight_enabled = 0;
  1069. }
  1070. microp_i2c_auto_backlight_mode(client, enable);
  1071. return count;
  1072. }
  1073. static DEVICE_ATTR(ls_auto, 0644, microp_i2c_ls_auto_show,
  1074. microp_i2c_ls_auto_store);
  1075. DEFINE_MUTEX(api_lock);
  1076. static int lightsensor_opened;
  1077. static int lightsensor_open(struct inode *inode, struct file *file)
  1078. {
  1079. int rc = 0;
  1080. pr_debug("%s\n", __func__);
  1081. mutex_lock(&api_lock);
  1082. if (lightsensor_opened) {
  1083. pr_err("%s: already opened\n", __func__);
  1084. rc = -EBUSY;
  1085. }
  1086. lightsensor_opened = 1;
  1087. mutex_unlock(&api_lock);
  1088. return rc;
  1089. }
  1090. static int lightsensor_release(struct inode *inode, struct file *file)
  1091. {
  1092. pr_debug("%s\n", __func__);
  1093. mutex_lock(&api_lock);
  1094. lightsensor_opened = 0;
  1095. mutex_unlock(&api_lock);
  1096. return 0;
  1097. }
  1098. static long lightsensor_ioctl(struct file *file, unsigned int cmd,
  1099. unsigned long arg)
  1100. {
  1101. int rc, val;
  1102. struct i2c_client *client;
  1103. struct microp_i2c_client_data *cdata;
  1104. mutex_lock(&api_lock);
  1105. client = private_microp_client;
  1106. cdata = i2c_get_clientdata(client);
  1107. pr_debug("%s cmd %d\n", __func__, _IOC_NR(cmd));
  1108. switch (cmd) {
  1109. case LIGHTSENSOR_IOCTL_ENABLE:
  1110. if (get_user(val, (unsigned long __user *)arg)) {
  1111. rc = -EFAULT;
  1112. break;
  1113. }
  1114. rc = val ? lightsensor_enable() : lightsensor_disable();
  1115. break;
  1116. case LIGHTSENSOR_IOCTL_GET_ENABLED:
  1117. val = cdata->auto_backlight_enabled;
  1118. pr_debug("%s enabled %d\n", __func__, val);
  1119. rc = put_user(val, (unsigned long __user *)arg);
  1120. break;
  1121. default:
  1122. pr_err("%s: invalid cmd %d\n", __func__, _IOC_NR(cmd));
  1123. rc = -EINVAL;
  1124. }
  1125. mutex_unlock(&api_lock);
  1126. return rc;
  1127. }
  1128. static struct file_operations lightsensor_fops = {
  1129. .owner = THIS_MODULE,
  1130. .open = lightsensor_open,
  1131. .release = lightsensor_release,
  1132. .unlocked_ioctl = lightsensor_ioctl
  1133. };
  1134. struct miscdevice lightsensor_misc = {
  1135. .minor = MISC_DYNAMIC_MINOR,
  1136. .name = "lightsensor",
  1137. .fops = &lightsensor_fops
  1138. };
  1139. /*
  1140. * G-sensor
  1141. */
  1142. static int microp_spi_enable(uint8_t on)
  1143. {
  1144. struct i2c_client *client;
  1145. int ret;
  1146. client = private_microp_client;
  1147. ret = i2c_write_block(client, MICROP_I2C_WCMD_SPI_EN, &on, 1);
  1148. if (ret < 0) {
  1149. dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__);
  1150. return ret;
  1151. }
  1152. msleep(10);
  1153. return ret;
  1154. }
  1155. static int gsensor_read_reg(uint8_t reg, uint8_t *data)
  1156. {
  1157. struct i2c_client *client;
  1158. int ret;
  1159. uint8_t tmp[2];
  1160. client = private_microp_client;
  1161. ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_REG_DATA_REQ,
  1162. &reg, 1);
  1163. if (ret < 0) {
  1164. dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__);
  1165. return ret;
  1166. }
  1167. msleep(10);
  1168. ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_REG_DATA, tmp, 2);
  1169. if (ret < 0) {
  1170. dev_err(&client->dev,"%s: i2c_read_block fail\n", __func__);
  1171. return ret;
  1172. }
  1173. *data = tmp[1];
  1174. return ret;
  1175. }
  1176. static int gsensor_write_reg(uint8_t reg, uint8_t data)
  1177. {
  1178. struct i2c_client *client;
  1179. int ret;
  1180. uint8_t tmp[2];
  1181. client = private_microp_client;
  1182. tmp[0] = reg;
  1183. tmp[1] = data;
  1184. ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_REG, tmp, 2);
  1185. if (ret < 0) {
  1186. dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__);
  1187. return ret;
  1188. }
  1189. return ret;
  1190. }
  1191. static int gsensor_read_acceleration(short *buf)
  1192. {
  1193. struct i2c_client *client;
  1194. int ret;
  1195. uint8_t tmp[6];
  1196. struct microp_i2c_client_data *cdata;
  1197. client = private_microp_client;
  1198. cdata = i2c_get_clientdata(client);
  1199. tmp[0] = 1;
  1200. ret = i2c_write_block(client, MICROP_I2C_WCMD_GSENSOR_DATA_REQ,
  1201. tmp, 1);
  1202. if (ret < 0) {
  1203. dev_err(&client->dev,"%s: i2c_write_block fail\n", __func__);
  1204. return ret;
  1205. }
  1206. msleep(10);
  1207. if (cdata->version <= 0x615) {
  1208. /*
  1209. * Note the data is a 10bit signed value from the chip.
  1210. */
  1211. ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_X_DATA,
  1212. tmp, 2);
  1213. if (ret < 0) {
  1214. dev_err(&client->dev, "%s: i2c_read_block fail\n",
  1215. __func__);
  1216. return ret;
  1217. }
  1218. buf[0] = (short)(tmp[0] << 8 | tmp[1]);
  1219. buf[0] >>= 6;
  1220. ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_Y_DATA,
  1221. tmp, 2);
  1222. if (ret < 0) {
  1223. dev_err(&client->dev, "%s: i2c_read_block fail\n",
  1224. __func__);
  1225. return ret;
  1226. }
  1227. buf[1] = (short)(tmp[0] << 8 | tmp[1]);
  1228. buf[1] >>= 6;
  1229. ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_Z_DATA,
  1230. tmp, 2);
  1231. if (ret < 0) {
  1232. dev_err(&client->dev, "%s: i2c_read_block fail\n",
  1233. __func__);
  1234. return ret;
  1235. }
  1236. buf[2] = (short)(tmp[0] << 8 | tmp[1]);
  1237. buf[2] >>= 6;
  1238. } else {
  1239. ret = i2c_read_block(client, MICROP_I2C_RCMD_GSENSOR_DATA,
  1240. tmp, 6);
  1241. if (ret < 0) {
  1242. dev_err(&client->dev, "%s: i2c_read_block fail\n",
  1243. __func__);
  1244. return ret;
  1245. }
  1246. buf[0] = (short)(tmp[0] << 8 | tmp[1]);
  1247. buf[0] >>= 6;
  1248. buf[1] = (short)(tmp[2] << 8 | tmp[3]);
  1249. buf[1] >>= 6;
  1250. buf[2] = (short)(tmp[4] << 8 | tmp[5]);
  1251. buf[2] >>= 6;
  1252. }
  1253. #ifdef DEBUG_BMA150
  1254. /* Log this to debugfs */
  1255. gsensor_log_status(ktime_get(), buf[0], buf[1], buf[2]);
  1256. #endif
  1257. return 1;
  1258. }
  1259. static int gsensor_init_hw(void)
  1260. {
  1261. uint8_t reg;
  1262. int ret;
  1263. pr_debug("%s\n", __func__);
  1264. microp_spi_enable(1);
  1265. ret = gsensor_read_reg(RANGE_BWIDTH_REG, &reg);
  1266. if (ret < 0 )
  1267. return -EIO;
  1268. reg &= 0xe0;
  1269. ret = gsensor_write_reg(RANGE_BWIDTH_REG, reg);
  1270. if (ret < 0 )
  1271. return -EIO;
  1272. ret = gsensor_read_reg(SMB150_CONF2_REG, &reg);
  1273. if (ret < 0 )
  1274. return -EIO;
  1275. reg |= (1 << 3);
  1276. ret = gsensor_write_reg(SMB150_CONF2_REG, reg);
  1277. return ret;
  1278. }
  1279. static int bma150_set_mode(char mode)
  1280. {
  1281. uint8_t reg;
  1282. int ret;
  1283. pr_debug("%s mode = %d\n", __func__, mode);
  1284. if (mode == BMA_MODE_NORMAL)
  1285. microp_spi_enable(1);
  1286. ret = gsensor_read_reg(SMB150_CTRL_REG, &reg);
  1287. if (ret < 0 )
  1288. return -EIO;
  1289. reg = (reg & 0xfe) | mode;
  1290. ret = gsensor_write_reg(SMB150_CTRL_REG, reg);
  1291. if (mode == BMA_MODE_SLEEP)
  1292. microp_spi_enable(0);
  1293. return ret;
  1294. }
  1295. static int gsensor_read(uint8_t *data)
  1296. {
  1297. int ret;
  1298. uint8_t reg = data[0];
  1299. ret = gsensor_read_reg(reg, &data[1]);
  1300. pr_debug("%s reg = %x data = %x\n", __func__, reg, data[1]);
  1301. return ret;
  1302. }
  1303. static int gsensor_write(uint8_t *data)
  1304. {
  1305. int ret;
  1306. uint8_t reg = data[0];
  1307. pr_debug("%s reg = %x data = %x\n", __func__, reg, data[1]);
  1308. ret = gsensor_write_reg(reg, data[1]);
  1309. return ret;
  1310. }
  1311. static int bma150_open(struct inode *inode, struct file *file)
  1312. {
  1313. pr_debug("%s\n", __func__);
  1314. return nonseekable_open(inode, file);
  1315. }
  1316. static int bma150_release(struct inode *inode, struct file *file)
  1317. {
  1318. return 0;
  1319. }
  1320. static int bma150_ioctl(struct inode *inode, struct file *file,
  1321. unsigned int cmd, unsigned long arg)
  1322. {
  1323. void __user *argp = (void __user *)arg;
  1324. char rwbuf[8];
  1325. int ret = -1;
  1326. short buf[8], temp;
  1327. switch (cmd) {
  1328. case BMA_IOCTL_READ:
  1329. case BMA_IOCTL_WRITE:
  1330. case BMA_IOCTL_SET_MODE:
  1331. if (copy_from_user(&rwbuf, argp, sizeof(rwbuf)))
  1332. return -EFAULT;
  1333. break;
  1334. case BMA_IOCTL_READ_ACCELERATION:
  1335. if (copy_from_user(&buf, argp, sizeof(buf)))
  1336. return -EFAULT;
  1337. break;
  1338. default:
  1339. break;
  1340. }
  1341. switch (cmd) {
  1342. case BMA_IOCTL_INIT:
  1343. ret = gsensor_init_hw();
  1344. if (ret < 0)
  1345. return ret;
  1346. break;
  1347. case BMA_IOCTL_READ:
  1348. if (rwbuf[0] < 1)
  1349. return -EINVAL;
  1350. ret = gsensor_read(rwbuf);
  1351. if (ret < 0)
  1352. return ret;
  1353. break;
  1354. case BMA_IOCTL_WRITE:
  1355. if (rwbuf[0] < 2)
  1356. return -EINVAL;
  1357. ret = gsensor_write(rwbuf);
  1358. if (ret < 0)
  1359. return ret;
  1360. break;
  1361. case BMA_IOCTL_READ_ACCELERATION:
  1362. ret = gsensor_read_acceleration(&buf[0]);
  1363. if (ret < 0)
  1364. return ret;
  1365. break;
  1366. case BMA_IOCTL_SET_MODE:
  1367. bma150_set_mode(rwbuf[0]);
  1368. break;
  1369. case BMA_IOCTL_GET_INT:
  1370. temp = 0;
  1371. break;
  1372. default:
  1373. return -ENOTTY;
  1374. }
  1375. switch (cmd) {
  1376. case BMA_IOCTL_READ:
  1377. if (copy_to_user(argp, &rwbuf, sizeof(rwbuf)))
  1378. return -EFAULT;
  1379. break;
  1380. case BMA_IOCTL_READ_ACCELERATION:
  1381. if (copy_to_user(argp, &buf, sizeof(buf)))
  1382. return -EFAULT;
  1383. break;
  1384. case BMA_IOCTL_GET_INT:
  1385. if (copy_to_user(argp, &temp, sizeof(temp)))
  1386. return -EFAULT;
  1387. break;
  1388. default:
  1389. break;
  1390. }
  1391. return 0;
  1392. }
  1393. static struct file_operations bma_fops = {
  1394. .owner = THIS_MODULE,
  1395. .open = bma150_open,
  1396. .release = bma150_release,
  1397. .ioctl = bma150_ioctl,
  1398. };
  1399. static struct miscdevice spi_bma_device = {
  1400. .minor = MISC_DYNAMIC_MINOR,
  1401. .name = BMA150_G_SENSOR_NAME,
  1402. .fops = &bma_fops,
  1403. };
  1404. /*
  1405. * Interrupt
  1406. */
  1407. static irqreturn_t microp_i2c_intr_irq_handler(int irq, void *dev_id)
  1408. {
  1409. struct i2c_client *client;
  1410. struct microp_i2c_client_data *cdata;
  1411. client = to_i2c_client(dev_id);
  1412. cdata = i2c_get_clientdata(client);
  1413. dev_dbg(&client->dev, "intr_irq_handler\n");
  1414. disable_irq_nosync(client->irq);
  1415. schedule_work(&cdata->work.work);
  1416. return IRQ_HANDLED;
  1417. }
  1418. static void microp_i2c_intr_work_func(struct work_struct *work)
  1419. {
  1420. struct microp_i2c_work *up_work;
  1421. struct i2c_client *client;
  1422. struct microp_i2c_client_data *cdata;
  1423. uint8_t data[3], adc_level;
  1424. uint16_t intr_status = 0, adc_value, gpi_status = 0;
  1425. int keycode = 0, ret = 0;
  1426. up_work = container_of(work, struct microp_i2c_work, work);
  1427. client = up_work->client;
  1428. cdata = i2c_get_clientdata(client);
  1429. ret = i2c_read_block(client, MICROP_I2C_RCMD_GPI_INT_STATUS, data, 2);
  1430. if (ret < 0) {
  1431. dev_err(&client->dev, "%s: read interrupt status fail\n",
  1432. __func__);
  1433. }
  1434. intr_status = data[0]<<8 | data[1];
  1435. ret = i2c_write_block(client, MICROP_I2C_WCMD_GPI_INT_STATUS_CLR,
  1436. data, 2);
  1437. if (ret < 0) {
  1438. dev_err(&client->dev, "%s: clear interrupt status fail\n",
  1439. __func__);
  1440. }
  1441. pr_debug("intr_status=0x%02x\n", intr_status);
  1442. if ((intr_status & IRQ_LSENSOR) || cdata->force_light_sensor_read) {
  1443. ret = microp_lightsensor_read(&adc_value, &adc_level);
  1444. if (cdata->force_light_sensor_read) {
  1445. /* report an invalid value first to ensure we trigger an event
  1446. * when adc_level is zero.
  1447. */
  1448. input_report_abs(cdata->ls_input_dev, ABS_MISC, -1);
  1449. input_sync(cdata->ls_input_dev);
  1450. cdata->force_light_sensor_read = 0;
  1451. }
  1452. input_report_abs(cdata->ls_input_dev, ABS_MISC, (int)adc_level);
  1453. input_sync(cdata->ls_input_dev);
  1454. }
  1455. if (intr_status & IRQ_SDCARD) {
  1456. microp_read_gpi_status(client, &gpi_status);
  1457. mahimahi_microp_sdslot_update_status(gpi_status);
  1458. }
  1459. if (intr_status & IRQ_HEADSETIN) {
  1460. cdata->is_hpin_pin_stable = 0;
  1461. wake_lock_timeout(&microp_i2c_wakelock, 3*HZ);
  1462. if (!cdata->headset_is_in)
  1463. schedule_delayed_work(&cdata->hpin_debounce_work,
  1464. msecs_to_jiffies(500));
  1465. else
  1466. schedule_delayed_work(&cdata->hpin_debounce_work,
  1467. msecs_to_jiffies(300));
  1468. }
  1469. if (intr_status & IRQ_REMOTEKEY) {
  1470. if ((get_remote_keycode(&keycode) == 0) &&
  1471. (cdata->is_hpin_pin_stable)) {
  1472. htc_35mm_key_event(keycode, &cdata->is_hpin_pin_stable);
  1473. }
  1474. }
  1475. enable_irq(client->irq);
  1476. }
  1477. static void ls_read_do_work(struct work_struct *work)
  1478. {
  1479. struct i2c_client *client = private_microp_client;
  1480. struct microp_i2c_client_data *cdata = i2c_get_clientdata(client);
  1481. /* force a light sensor reading */
  1482. disable_irq(client->irq);
  1483. cdata->force_light_sensor_read = 1;
  1484. schedule_work(&cdata->work.work);
  1485. }
  1486. static int microp_function_initialize(struct i2c_client *client)
  1487. {
  1488. struct microp_i2c_client_data *cdata;
  1489. uint8_t data[20];
  1490. uint16_t stat, interrupts = 0;
  1491. int i;
  1492. int ret;
  1493. struct led_classdev *led_cdev;
  1494. cdata = i2c_get_clientdata(client);
  1495. /* Light Sensor */
  1496. if (als_kadc >> 16 == ALS_CALIBRATED)
  1497. cdata->als_kadc = als_kadc & 0xFFFF;
  1498. else {
  1499. cdata->als_kadc = 0;
  1500. pr_info("%s: no ALS calibrated\n", __func__);
  1501. }
  1502. if (cdata->als_kadc && golden_adc) {
  1503. cdata->als_kadc =
  1504. (cdata->als_kadc > 0 && cdata->als_kadc < 0x400)
  1505. ? cdata->als_kadc : golden_adc;
  1506. cdata->als_gadc =
  1507. (golden_adc > 0)
  1508. ? golden_adc : cdata->als_kadc;
  1509. } else {
  1510. cdata->als_kadc = 1;
  1511. cdata->als_gadc = 1;
  1512. }
  1513. pr_info("%s: als_kadc=0x%x, als_gadc=0x%x\n",
  1514. __func__, cdata->als_kadc, cdata->als_gadc);
  1515. for (i = 0; i < 10; i++) {
  1516. data[i] = (uint8_t)(lsensor_adc_table[i]
  1517. * cdata->als_kadc / cdata->als_gadc >> 8);
  1518. data[i + 10] = (uint8_t)(lsensor_adc_table[i]
  1519. * cdata->als_kadc / cdata->als_gadc);
  1520. }
  1521. ret = i2c_write_block(client, MICROP_I2C_WCMD_ADC_TABLE, data, 20);
  1522. if (ret)
  1523. goto exit;
  1524. ret = gpio_request(MAHIMAHI_GPIO_LS_EN_N, "microp_i2c");
  1525. if (ret < 0) {
  1526. dev_err(&client->dev, "failed on request gpio ls_on\n");
  1527. goto exit;
  1528. }
  1529. ret = gpio_direction_output(MAHIMAHI_GPIO_LS_EN_N, 0);
  1530. if (ret < 0) {
  1531. dev_err(&client->dev, "failed on gpio_direction_output"
  1532. "ls_on\n");
  1533. goto err_gpio_ls;
  1534. }
  1535. cdata->light_sensor_enabled = 1;
  1536. /* Headset */
  1537. for (i = 0; i < 6; i++) {
  1538. data[i] = (uint8_t)(remote_key_adc_table[i] >> 8);
  1539. data[i + 6] = (uint8_t)(remote_key_adc_table[i]);
  1540. }
  1541. ret = i2c_write_block(client,
  1542. MICROP_I2C_WCMD_REMOTEKEY_TABLE, data, 12);
  1543. if (ret)
  1544. goto exit;
  1545. INIT_DELAYED_WORK(
  1546. &cdata->hpin_debounce_work, hpin_debounce_do_work);
  1547. INIT_DELAYED_WORK(
  1548. &cdata->ls_read_work, ls_read_do_work);
  1549. /* SD Card */
  1550. interrupts |= IRQ_SDCARD;
  1551. /* set LED initial state */
  1552. for (i = 0; i < BLUE_LED; i++) {
  1553. led_cdev = &cdata->leds[i].ldev;
  1554. microp_i2c_write_led_mode(client, led_cdev, 0, 0xffff);
  1555. }
  1556. /* enable the interrupts */
  1557. ret = microp_interrupt_enable(client, interrupts);
  1558. if (ret < 0) {
  1559. dev_err(&client->dev, "%s: failed to enable gpi irqs\n",
  1560. __func__);
  1561. goto err_irq_en;
  1562. }
  1563. microp_read_gpi_status(client, &stat);
  1564. mahimahi_microp_sdslot_update_status(stat);
  1565. return 0;
  1566. err_irq_en:
  1567. err_gpio_ls:
  1568. gpio_free(MAHIMAHI_GPIO_LS_EN_N);
  1569. exit:
  1570. return ret;
  1571. }
  1572. #ifdef CONFIG_HAS_EARLYSUSPEND
  1573. void microp_early_suspend(struct early_suspend *h)
  1574. {
  1575. struct microp_i2c_client_data *cdata;
  1576. struct i2c_client *client = private_microp_client;
  1577. int ret;
  1578. if (!client) {
  1579. pr_err("%s: dataset: client is empty\n", __func__);
  1580. return;
  1581. }
  1582. cdata = i2c_get_clientdata(client);
  1583. cdata->microp_is_suspend = 1;
  1584. disable_irq(client->irq);
  1585. ret = cancel_work_sync(&cdata->work.work);
  1586. if (ret != 0) {
  1587. enable_irq(client->irq);
  1588. }
  1589. if (cdata->auto_backlight_enabled)
  1590. microp_i2c_auto_backlight_mode(client, 0);
  1591. if (cdata->light_sensor_enabled == 1) {
  1592. gpio_set_value(MAHIMAHI_GPIO_LS_EN_N, 1);
  1593. cdata->light_sensor_enabled = 0;
  1594. }
  1595. }
  1596. void microp_early_resume(struct early_suspend *h)
  1597. {
  1598. struct i2c_client *client = private_microp_client;
  1599. struct microp_i2c_client_data *cdata;
  1600. if (!client) {
  1601. pr_err("%s: dataset: client is empty\n", __func__);
  1602. return;
  1603. }
  1604. cdata = i2c_get_clientdata(client);
  1605. gpio_set_value(MAHIMAHI_GPIO_LS_EN_N, 0);
  1606. cdata->light_sensor_enabled = 1;
  1607. if (cdata->auto_backlight_enabled)
  1608. microp_i2c_auto_backlight_mode(client, 1);
  1609. cdata->microp_is_suspend = 0;
  1610. enable_irq(client->irq);
  1611. }
  1612. #endif
  1613. static int microp_i2c_suspend(struct i2c_client *client,
  1614. pm_message_t mesg)
  1615. {
  1616. return 0;
  1617. }
  1618. static int microp_i2c_resume(struct i2c_client *client)
  1619. {
  1620. return 0;
  1621. }
  1622. static struct {
  1623. const char *name;
  1624. void (*led_set_work)(struct work_struct *);
  1625. struct device_attribute **attrs;
  1626. int attr_cnt;
  1627. } microp_leds[] = {
  1628. [GREEN_LED] = {
  1629. .name = "green",
  1630. .led_set_work = microp_led_brightness_set_work,
  1631. .attrs = green_amber_attrs,
  1632. .attr_cnt = ARRAY_SIZE(green_amber_attrs)
  1633. },
  1634. [AMBER_LED] = {
  1635. .name = "amber",
  1636. .led_set_work = microp_led_brightness_set_work,
  1637. .attrs = green_amber_attrs,
  1638. .attr_cnt = ARRAY_SIZE(green_amber_attrs)
  1639. },
  1640. [RED_LED] = {
  1641. .name = "red",
  1642. .led_set_work = microp_led_brightness_set_work,
  1643. .attrs = green_amber_attrs,
  1644. .attr_cnt = ARRAY_SIZE(green_amber_attrs)
  1645. },
  1646. [BLUE_LED] = {
  1647. .name = "blue",
  1648. .led_set_work = microp_led_brightness_set_work,
  1649. .attrs = green_amber_attrs,
  1650. .attr_cnt = ARRAY_SIZE(green_amber_attrs)
  1651. },
  1652. [JOGBALL_LED] = {
  1653. .name = "jogball-backlight",
  1654. .led_set_work = microp_led_jogball_brightness_set_work,
  1655. .attrs = jogball_attrs,
  1656. .attr_cnt = ARRAY_SIZE(jogball_attrs)
  1657. },
  1658. [BUTTONS_LED] = {
  1659. .name = "button-backlight",
  1660. .led_set_work = microp_led_buttons_brightness_set_work
  1661. },
  1662. };
  1663. static int microp_i2c_probe(struct i2c_client *client,
  1664. const struct i2c_device_id *id)
  1665. {
  1666. struct microp_i2c_client_data *cdata;
  1667. uint8_t data[6];
  1668. int ret;
  1669. int i;
  1670. int j;
  1671. private_microp_client = client;
  1672. ret = i2c_read_block(client, MICROP_I2C_RCMD_VERSION, data, 2);
  1673. if (ret || !(data[0] && data[1])) {
  1674. ret = -ENODEV;
  1675. dev_err(&client->dev, "failed on get microp version\n");
  1676. goto err_exit;
  1677. }
  1678. dev_info(&client->dev, "microp version [%02X][%02X]\n",
  1679. data[0], data[1]);
  1680. ret = gpio_request(MAHIMAHI_GPIO_UP_RESET_N, "microp_i2c_wm");
  1681. if (ret < 0) {
  1682. dev_err(&client->dev, "failed on request gpio reset\n");
  1683. goto err_exit;
  1684. }
  1685. ret = gpio_direction_output(MAHIMAHI_GPIO_UP_RESET_N, 1);
  1686. if (ret < 0) {
  1687. dev_err(&client->dev,
  1688. "failed on gpio_direction_output reset\n");
  1689. goto err_gpio_reset;
  1690. }
  1691. cdata = kzalloc(sizeof(struct microp_i2c_client_data), GFP_KERNEL);
  1692. if (!cdata) {
  1693. ret = -ENOMEM;
  1694. dev_err(&client->dev, "failed on allocat cdata\n");
  1695. goto err_cdata;
  1696. }
  1697. i2c_set_clientdata(client, cdata);
  1698. cdata->version = data[0] << 8 | data[1];
  1699. cdata->microp_is_suspend = 0;
  1700. cdata->auto_backlight_enabled = 0;
  1701. cdata->light_sensor_enabled = 0;
  1702. wake_lock_init(&microp_i2c_wakelock, WAKE_LOCK_SUSPEND,
  1703. "microp_i2c_present");
  1704. /* Light Sensor */
  1705. ret = device_create_file(&client->dev, &dev_attr_ls_adc);
  1706. ret = device_create_file(&client->dev, &dev_attr_ls_auto);
  1707. cdata->ls_input_dev = input_allocate_device();
  1708. if (!cdata->ls_input_dev) {
  1709. pr_err("%s: could not allocate input device\n", __func__);
  1710. ret = -ENOMEM;
  1711. goto err_request_input_dev;
  1712. }
  1713. cdata->ls_input_dev->name = "lightsensor-level";
  1714. set_bit(EV_ABS, cdata->ls_input_dev->evbit);
  1715. input_set_abs_params(cdata->ls_input_dev, ABS_MISC, 0, 9, 0, 0);
  1716. ret = input_register_device(cdata->ls_input_dev);
  1717. if (ret < 0) {
  1718. dev_err(&client->dev, "%s: can not register input device\n",
  1719. __func__);
  1720. goto err_register_input_dev;
  1721. }
  1722. ret = misc_register(&lightsensor_misc);
  1723. if (ret < 0) {
  1724. dev_err(&client->dev, "%s: can not register misc device\n",
  1725. __func__);
  1726. goto err_register_misc_register;
  1727. }
  1728. /* LEDs */
  1729. ret = 0;
  1730. for (i = 0; i < ARRAY_SIZE(microp_leds) && !ret; ++i) {
  1731. struct microp_led_data *ldata = &cdata->leds[i];
  1732. ldata->type = i;
  1733. ldata->ldev.name = microp_leds[i].name;
  1734. ldata->ldev.brightness_set = microp_brightness_set;
  1735. mutex_init(&ldata->led_data_mutex);
  1736. INIT_WORK(&ldata->brightness_work, microp_leds[i].led_set_work);
  1737. spin_lock_init(&ldata->brightness_lock);
  1738. ret = led_classdev_register(&client->dev, &ldata->ldev);
  1739. if (ret) {
  1740. ldata->ldev.name = NULL;
  1741. break;
  1742. }
  1743. for (j = 0; j < microp_leds[i].attr_cnt && !ret; ++j)
  1744. ret = device_create_file(ldata->ldev.dev,
  1745. microp_leds[i].attrs[j]);
  1746. }
  1747. if (ret) {
  1748. dev_err(&client->dev, "failed to add leds\n");
  1749. goto err_add_leds;
  1750. }
  1751. /* Headset */
  1752. cdata->headset_is_in = 0;
  1753. cdata->is_hpin_pin_stable = 1;
  1754. platform_device_register(&mahimahi_h35mm);
  1755. ret = device_create_file(&client->dev, &dev_attr_key_adc);
  1756. /* G-sensor */
  1757. ret = misc_register(&spi_bma_device);
  1758. if (ret < 0) {
  1759. pr_err("%s: init bma150 misc_register fail\n",
  1760. __func__);
  1761. goto err_register_bma150;
  1762. }
  1763. #ifdef DEBUG_BMA150
  1764. debugfs_create_file("gsensor_log", 0444, NULL, NULL, &gsensor_log_fops);
  1765. #endif
  1766. /* Setup IRQ handler */
  1767. INIT_WORK(&cdata->work.work, microp_i2c_intr_work_func);
  1768. cdata->work.client = client;
  1769. ret = request_irq(client->irq,
  1770. microp_i2c_intr_irq_handler,
  1771. IRQF_TRIGGER_LOW,
  1772. "microp_interrupt",
  1773. &client->dev);
  1774. if (ret) {
  1775. dev_err(&client->dev, "request_irq failed\n");
  1776. goto err_intr;
  1777. }
  1778. ret = set_irq_wake(client->irq, 1);
  1779. if (ret) {
  1780. dev_err(&client->dev, "set_irq_wake failed\n");
  1781. goto err_intr;
  1782. }
  1783. #ifdef CONFIG_HAS_EARLYSUSPEND
  1784. if (cdata->enable_early_suspend) {
  1785. cdata->early_suspend.level =
  1786. EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
  1787. cdata->early_suspend.suspend = microp_early_suspend;
  1788. cdata->early_suspend.resume = microp_early_resume;
  1789. register_early_suspend(&cdata->early_suspend);
  1790. }
  1791. #endif
  1792. ret = microp_function_initialize(client);
  1793. if (ret) {
  1794. dev_err(&client->dev, "failed on microp function initialize\n");
  1795. goto err_fun_init;
  1796. }
  1797. return 0;
  1798. err_fun_init:
  1799. err_intr:
  1800. misc_deregister(&spi_bma_device);
  1801. err_register_bma150:
  1802. platform_device_unregister(&mahimahi_h35mm);
  1803. device_remove_file(&client->dev, &dev_attr_key_adc);
  1804. err_add_leds:
  1805. for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) {
  1806. if (!cdata->leds[i].ldev.name)
  1807. continue;
  1808. led_classdev_unregister(&cdata->leds[i].ldev);
  1809. for (j = 0; j < microp_leds[i].attr_cnt; ++j)
  1810. device_remove_file(cdata->leds[i].ldev.dev,
  1811. microp_leds[i].attrs[j]);
  1812. }
  1813. misc_deregister(&lightsensor_misc);
  1814. err_register_misc_register:
  1815. input_unregister_device(cdata->ls_input_dev);
  1816. err_register_input_dev:
  1817. input_free_device(cdata->ls_input_dev);
  1818. err_request_input_dev:
  1819. wake_lock_destroy(&microp_i2c_wakelock);
  1820. device_remove_file(&client->dev, &dev_attr_ls_adc);
  1821. device_remove_file(&client->dev, &dev_attr_ls_auto);
  1822. kfree(cdata);
  1823. i2c_set_clientdata(client, NULL);
  1824. err_cdata:
  1825. err_gpio_reset:
  1826. gpio_free(MAHIMAHI_GPIO_UP_RESET_N);
  1827. err_exit:
  1828. return ret;
  1829. }
  1830. static int __devexit microp_i2c_remove(struct i2c_client *client)
  1831. {
  1832. struct microp_i2c_client_data *cdata;
  1833. int i;
  1834. int j;
  1835. cdata = i2c_get_clientdata(client);
  1836. for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) {
  1837. struct microp_led_data *ldata = &cdata->leds[i];
  1838. cancel_work_sync(&ldata->brightness_work);
  1839. }
  1840. #ifdef CONFIG_HAS_EARLYSUSPEND
  1841. if (cdata->enable_early_suspend) {
  1842. unregister_early_suspend(&cdata->early_suspend);
  1843. }
  1844. #endif
  1845. for (i = 0; i < ARRAY_SIZE(microp_leds); ++i) {
  1846. if (!cdata->leds[i].ldev.name)
  1847. continue;
  1848. led_classdev_unregister(&cdata->leds[i].ldev);
  1849. for (j = 0; j < microp_leds[i].attr_cnt; ++j)
  1850. device_remove_file(cdata->leds[i].ldev.dev,
  1851. microp_leds[i].attrs[j]);
  1852. }
  1853. free_irq(client->irq, &client->dev);
  1854. gpio_free(MAHIMAHI_GPIO_UP_RESET_N);
  1855. misc_deregister(&lightsensor_misc);
  1856. input_unregister_device(cdata->ls_input_dev);
  1857. input_free_device(cdata->ls_input_dev);
  1858. device_remove_file(&client->dev, &dev_attr_ls_adc);
  1859. device_remove_file(&client->dev, &dev_attr_key_adc);
  1860. device_remove_file(&client->dev, &dev_attr_ls_auto);
  1861. platform_device_unregister(&mahimahi_h35mm);
  1862. /* G-sensor */
  1863. misc_deregister(&spi_bma_device);
  1864. kfree(cdata);
  1865. return 0;
  1866. }
  1867. #define ATAG_ALS 0x5441001b
  1868. static int __init parse_tag_als_kadc(const struct tag *tags)
  1869. {
  1870. int found = 0;
  1871. struct tag *t = (struct tag *)tags;
  1872. for (; t->hdr.size; t = tag_next(t)) {
  1873. if (t->hdr.tag == ATAG_ALS) {
  1874. found = 1;
  1875. break;
  1876. }
  1877. }
  1878. if (found)
  1879. als_kadc = t->u.revision.rev;
  1880. pr_debug("%s: als_kadc = 0x%x\n", __func__, als_kadc);
  1881. return 0;
  1882. }
  1883. __tagtable(ATAG_ALS, parse_tag_als_kadc);
  1884. static const struct i2c_device_id microp_i2c_id[] = {
  1885. { MICROP_I2C_NAME, 0 },
  1886. { }
  1887. };
  1888. static struct i2c_driver microp_i2c_driver = {
  1889. .driver = {
  1890. .name = MICROP_I2C_NAME,
  1891. },
  1892. .id_table = microp_i2c_id,
  1893. .probe = microp_i2c_probe,
  1894. .suspend = microp_i2c_suspend,
  1895. .resume = microp_i2c_resume,
  1896. .remove = __devexit_p(microp_i2c_remove),
  1897. };
  1898. static int __init microp_i2c_init(void)
  1899. {
  1900. return i2c_add_driver(&microp_i2c_driver);
  1901. }
  1902. static void __exit microp_i2c_exit(void)
  1903. {
  1904. i2c_del_driver(&microp_i2c_driver);
  1905. }
  1906. module_init(microp_i2c_init);
  1907. module_exit(microp_i2c_exit);
  1908. MODULE_AUTHOR("Eric Olsen <eolsen@android.com>");
  1909. MODULE_DESCRIPTION("MicroP I2C driver");
  1910. MODULE_LICENSE("GPL");