import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / power / mt8127 / ncp1851.c
1 #include <linux/interrupt.h>
2 #include <linux/i2c.h>
3 #include <linux/slab.h>
4 #include <linux/irq.h>
5 #include <linux/miscdevice.h>
6 #include <asm/uaccess.h>
7 #include <linux/delay.h>
8 #include <linux/input.h>
9 #include <linux/workqueue.h>
10 #include <linux/kobject.h>
11 #include <linux/earlysuspend.h>
12 #include <linux/platform_device.h>
13 #include <asm/atomic.h>
14
15 #include <cust_acc.h>
16 #include <linux/hwmsensor.h>
17 #include <linux/hwmsen_dev.h>
18 #include <linux/sensors_io.h>
19 #include <linux/hwmsen_helper.h>
20
21 #include <mach/mt_typedefs.h>
22 #include <mach/mt_gpio.h>
23 #include <mach/mt_pm_ldo.h>
24
25 #include "ncp1851.h"
26
27 /**********************************************************
28 *
29 * [I2C Slave Setting]
30 *
31 *********************************************************/
32 #define NCP1851_SLAVE_ADDR_WRITE 0x6C
33 #define NCP1851_SLAVE_ADDR_READ 0x6D
34
35 static struct i2c_client *new_client = NULL;
36 static const struct i2c_device_id ncp1851_i2c_id[] = {{"ncp1851",0},{}};
37
38 kal_bool chargin_hw_init_done = KAL_FALSE;
39 static int ncp1851_driver_probe(struct i2c_client *client, const struct i2c_device_id *id);
40
41 static struct i2c_driver ncp1851_driver = {
42 .driver = {
43 .name = "ncp1851",
44 },
45 .probe = ncp1851_driver_probe,
46 .id_table = ncp1851_i2c_id,
47 };
48
49 /**********************************************************
50 *
51 * [Global Variable]
52 *
53 *********************************************************/
54 #define ncp1851_REG_NUM 19
55 kal_uint8 ncp1851_reg[ncp1851_REG_NUM] = {0};
56
57 static DEFINE_MUTEX(ncp1851_i2c_access);
58 /**********************************************************
59 *
60 * [I2C Function For Read/Write ncp1851]
61 *
62 *********************************************************/
63 int ncp1851_read_byte(kal_uint8 cmd, kal_uint8 *returnData)
64 {
65 char cmd_buf[1]={0x00};
66 char readData = 0;
67 int ret=0;
68
69 mutex_lock(&ncp1851_i2c_access);
70
71 //new_client->addr = ((new_client->addr) & I2C_MASK_FLAG) | I2C_WR_FLAG;
72 new_client->ext_flag=((new_client->ext_flag ) & I2C_MASK_FLAG ) | I2C_WR_FLAG | I2C_DIRECTION_FLAG;
73
74 cmd_buf[0] = cmd;
75 ret = i2c_master_send(new_client, &cmd_buf[0], (1<<8 | 1));
76 if (ret < 0)
77 {
78 //new_client->addr = new_client->addr & I2C_MASK_FLAG;
79 new_client->ext_flag=0;
80
81 mutex_unlock(&ncp1851_i2c_access);
82 return 0;
83 }
84
85 readData = cmd_buf[0];
86 *returnData = readData;
87
88 //new_client->addr = new_client->addr & I2C_MASK_FLAG;
89 new_client->ext_flag=0;
90
91 mutex_unlock(&ncp1851_i2c_access);
92 return 1;
93 }
94
95 int ncp1851_write_byte(kal_uint8 cmd, kal_uint8 writeData)
96 {
97 char write_data[2] = {0};
98 int ret=0;
99
100 mutex_lock(&ncp1851_i2c_access);
101
102 write_data[0] = cmd;
103 write_data[1] = writeData;
104
105 new_client->ext_flag=((new_client->ext_flag ) & I2C_MASK_FLAG ) | I2C_DIRECTION_FLAG;
106
107 ret = i2c_master_send(new_client, write_data, 2);
108 if (ret < 0)
109 {
110 new_client->ext_flag=0;
111 mutex_unlock(&ncp1851_i2c_access);
112 return 0;
113 }
114
115 new_client->ext_flag=0;
116 mutex_unlock(&ncp1851_i2c_access);
117 return 1;
118 }
119
120 /**********************************************************
121 *
122 * [Read / Write Function]
123 *
124 *********************************************************/
125 kal_uint32 ncp1851_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT)
126 {
127 kal_uint8 ncp1851_reg = 0;
128 int ret = 0;
129
130 printk("--------------------------------------------------\n");
131
132 ret = ncp1851_read_byte(RegNum, &ncp1851_reg);
133 printk("[ncp1851_read_interface] Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
134
135 ncp1851_reg &= (MASK << SHIFT);
136 *val = (ncp1851_reg >> SHIFT);
137 printk("[ncp1851_read_interface] Val=0x%x\n", *val);
138
139 return ret;
140 }
141
142 kal_uint32 ncp1851_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT)
143 {
144 kal_uint8 ncp1851_reg = 0;
145 int ret = 0;
146
147 printk("--------------------------------------------------\n");
148
149 ret = ncp1851_read_byte(RegNum, &ncp1851_reg);
150 //printk("[ncp1851_config_interface] Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
151
152 ncp1851_reg &= ~(MASK << SHIFT);
153 ncp1851_reg |= (val << SHIFT);
154
155 ret = ncp1851_write_byte(RegNum, ncp1851_reg);
156 //printk("[ncp18516_config_interface] Write Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
157
158 // Check
159 //ncp1851_read_byte(RegNum, &ncp1851_reg);
160 //printk("[ncp1851_config_interface] Check Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
161
162 return ret;
163 }
164
165 /**********************************************************
166 *
167 * [Internal Function]
168 *
169 *********************************************************/
170 //CON0
171 kal_uint32 ncp1851_get_chip_status(void)
172 {
173 kal_uint32 ret=0;
174 kal_uint32 val=0;
175
176 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON0),
177 (kal_uint8*)(&val),
178 (kal_uint8)(CON0_STATE_MASK),
179 (kal_uint8)(CON0_STATE_SHIFT)
180 );
181 return val;
182 }
183
184 kal_uint32 ncp1851_get_batfet(void)
185 {
186 kal_uint32 ret=0;
187 kal_uint32 val=0;
188
189 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON0),
190 (kal_uint8*)(&val),
191 (kal_uint8)(CON0_BATFET_MASK),
192 (kal_uint8)(CON0_BATFET_SHIFT)
193 );
194 return val;
195 }
196
197 kal_uint32 ncp1851_get_ntc(void)
198 {
199 kal_uint32 ret=0;
200 kal_uint32 val=0;
201
202 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON0),
203 (kal_uint8*)(&val),
204 (kal_uint8)(CON0_NTC_MASK),
205 (kal_uint8)(CON0_NTC_SHIFT)
206 );
207 return val;
208 }
209
210 kal_uint32 ncp1851_get_statint(void)
211 {
212 kal_uint32 ret=0;
213 kal_uint32 val=0;
214
215 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON0),
216 (kal_uint8*)(&val),
217 (kal_uint8)(CON0_STATINT_MASK),
218 (kal_uint8)(CON0_STATINT_SHIFT)
219 );
220 return val;
221 }
222
223 kal_uint32 ncp1851_get_faultint(void)
224 {
225 kal_uint32 ret=0;
226 kal_uint32 val=0;
227
228 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON0),
229 (kal_uint8*)(&val),
230 (kal_uint8)(CON0_FAULTINT_MASK),
231 (kal_uint8)(CON0_FAULTINT_SHIFT)
232 );
233 return val;
234 }
235
236 //CON1
237 void ncp1851_set_reset(kal_uint32 val)
238 {
239 kal_uint32 ret=0;
240
241 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
242 (kal_uint8)(val),
243 (kal_uint8)(CON1_REG_RST_MASK),
244 (kal_uint8)(CON1_REG_RST_SHIFT)
245 );
246 }
247
248 void ncp1851_set_chg_en(kal_uint32 val)
249 {
250 kal_uint32 ret=0;
251
252 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
253 (kal_uint8)(val),
254 (kal_uint8)(CON1_CHG_EN_MASK),
255 (kal_uint8)(CON1_CHG_EN_SHIFT)
256 );
257 }
258
259 void ncp1851_set_otg_en(kal_uint32 val)
260 {
261 kal_uint32 ret=0;
262
263 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
264 (kal_uint8)(val),
265 (kal_uint8)(CON1_OTG_EN_MASK),
266 (kal_uint8)(CON1_OTG_EN_SHIFT)
267 );
268 }
269
270 kal_uint32 ncp1851_get_otg_en(void)
271 {
272 kal_uint32 ret=0;
273 kal_uint32 val=0;
274
275 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON1),
276 (kal_uint8*)(&val),
277 (kal_uint8)(CON1_OTG_EN_MASK),
278 (kal_uint8)(CON1_OTG_EN_SHIFT)
279 );
280 return val;
281 }
282
283 void ncp1851_set_ntc_en(kal_uint32 val)
284 {
285 kal_uint32 ret=0;
286
287 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
288 (kal_uint8)(val),
289 (kal_uint8)(CON1_NTC_EN_MASK),
290 (kal_uint8)(CON1_NTC_EN_SHIFT)
291 );
292 }
293
294 void ncp1851_set_tj_warn_opt(kal_uint32 val)
295 {
296 kal_uint32 ret=0;
297
298 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
299 (kal_uint8)(val),
300 (kal_uint8)(CON1_TJ_WARN_OPT_MASK),
301 (kal_uint8)(CON1_TJ_WARN_OPT_SHIFT)
302 );
303 }
304
305 void ncp1851_set_jeita_opt(kal_uint32 val)
306 {
307 kal_uint32 ret=0;
308
309 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
310 (kal_uint8)(val),
311 (kal_uint8)(CON1_JEITA_OPT_MASK),
312 (kal_uint8)(CON1_JEITA_OPT_SHIFT)
313 );
314 }
315
316 void ncp1851_set_tchg_rst(kal_uint32 val)
317 {
318 kal_uint32 ret=0;
319
320 ret=ncp1851_config_interface( (kal_uint8)(NCP1851_CON1),
321 (kal_uint8)(val),
322 (kal_uint8)(CON1_TCHG_RST_MASK),
323 (kal_uint8)(CON1_TCHG_RST_SHIFT)
324 );
325 }
326
327 void ncp1851_set_int_mask(kal_uint32 val)
328 {
329 kal_uint32 ret=0;
330
331 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON1),
332 (kal_uint8)(val),
333 (kal_uint8)(CON1_INT_MASK_MASK),
334 (kal_uint8)(CON1_INT_MASK_SHIFT)
335 );
336 }
337
338 //CON2
339 void ncp1851_set_wdto_dis(kal_uint32 val)
340 {
341 kal_uint32 ret=0;
342
343 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
344 (kal_uint8)(val),
345 (kal_uint8)(CON2_WDTO_DIS_MASK),
346 (kal_uint8)(CON2_WDTO_DIS_SHIFT)
347 );
348 }
349
350 void ncp1851_set_chgto_dis(kal_uint32 val)
351 {
352 kal_uint32 ret=0;
353
354 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
355 (kal_uint8)(val),
356 (kal_uint8)(CON2_CHGTO_DIS_MASK),
357 (kal_uint8)(CON2_CHGTO_DIS_SHIFT)
358 );
359 }
360
361 void ncp1851_set_pwr_path(kal_uint32 val)
362 {
363 kal_uint32 ret=0;
364
365 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
366 (kal_uint8)(val),
367 (kal_uint8)(CON2_PWR_PATH_MASK),
368 (kal_uint8)(CON2_PWR_PATH_SHIFT)
369 );
370 }
371
372 void ncp1851_set_trans_en(kal_uint32 val)
373 {
374 kal_uint32 ret=0;
375
376 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
377 (kal_uint8)(val),
378 (kal_uint8)(CON2_TRANS_EN_MASK),
379 (kal_uint8)(CON2_TRANS_EN_SHIFT)
380 );
381 }
382
383 void ncp1851_set_factory_mode(kal_uint32 val)
384 {
385 kal_uint32 ret=0;
386
387 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
388 (kal_uint8)(val),
389 (kal_uint8)(CON2_FCTRY_MOD_MASK),
390 (kal_uint8)(CON2_FCTRY_MOD_SHIFT)
391 );
392 }
393
394 void ncp1851_set_iinset_pin_en(kal_uint32 val)
395 {
396 kal_uint32 ret=0;
397
398 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
399 (kal_uint8)(val),
400 (kal_uint8)(CON2_IINSET_PIN_EN_MASK),
401 (kal_uint8)(CON2_IINSET_PIN_EN_SHIFT)
402 );
403 }
404
405 void ncp1851_set_iinlim_en(kal_uint32 val)
406 {
407 kal_uint32 ret=0;
408
409 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
410 (kal_uint8)(val),
411 (kal_uint8)(CON2_IINLIM_EN_MASK),
412 (kal_uint8)(CON2_IINLIM_EN_SHIFT)
413 );
414 }
415
416 void ncp1851_set_aicl_en(kal_uint32 val)
417 {
418 kal_uint32 ret=0;
419
420 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON2),
421 (kal_uint8)(val),
422 (kal_uint8)(CON2_AICL_EN_MASK),
423 (kal_uint8)(CON2_AICL_EN_SHIFT)
424 );
425 }
426
427 //CON8
428 kal_uint32 ncp1851_get_vfet_ok(void)
429 {
430 kal_uint32 ret=0;
431 kal_uint32 val=0;
432
433 ret=ncp1851_read_interface((kal_uint8)(NCP1851_CON8),
434 (kal_uint8*)(&val),
435 (kal_uint8)(CON8_VFET_OK_MASK),
436 (kal_uint8)(CON8_VFET_OK_SHIFT)
437 );
438 return val;
439 }
440
441
442 //CON14
443 void ncp1851_set_ctrl_vbat(kal_uint32 val)
444 {
445 kal_uint32 ret=0;
446
447 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON14),
448 (kal_uint8)(val),
449 (kal_uint8)(CON14_CTRL_VBAT_MASK),
450 (kal_uint8)(CON14_CTRL_VBAT_SHIFT)
451 );
452 }
453
454 //CON15
455 void ncp1851_set_ieoc(kal_uint32 val)
456 {
457 kal_uint32 ret=0;
458
459 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON15),
460 (kal_uint8)(val),
461 (kal_uint8)(CON15_IEOC_MASK),
462 (kal_uint8)(CON15_IEOC_SHIFT)
463 );
464 }
465
466 void ncp1851_set_ichg(kal_uint32 val)
467 {
468 kal_uint32 ret=0;
469
470 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON15),
471 (kal_uint8)(val),
472 (kal_uint8)(CON15_ICHG_MASK),
473 (kal_uint8)(CON15_ICHG_SHIFT)
474 );
475 }
476 kal_uint32 ncp1851_get_ichg(void)
477 {
478 kal_uint32 ret=0;
479 kal_uint32 val=0;
480
481 ret = ncp1851_read_interface((kal_uint8)NCP1851_CON15,
482 (kal_uint8*)&val,
483 (kal_uint8)CON15_ICHG_MASK,
484 (kal_uint8)CON15_ICHG_SHIFT);
485 return val;
486 }
487
488 //CON16
489 void ncp1851_set_iweak(kal_uint32 val)
490 {
491 kal_uint32 ret=0;
492
493 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON16),
494 (kal_uint8)(val),
495 (kal_uint8)(CON16_IWEAK_MASK),
496 (kal_uint8)(CON16_IWEAK_SHIFT)
497 );
498 }
499
500 void ncp1851_set_ctrl_vfet(kal_uint32 val)
501 {
502 kal_uint32 ret=0;
503
504 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON16),
505 (kal_uint8)(val),
506 (kal_uint8)(CON16_CTRL_VFET_MASK),
507 (kal_uint8)(CON16_CTRL_VFET_SHIFT)
508 );
509 }
510
511 void ncp1851_set_iinlim(kal_uint32 val)
512 {
513 kal_uint32 ret=0;
514
515 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON16),
516 (kal_uint8)(val),
517 (kal_uint8)(CON16_IINLIM_MASK),
518 (kal_uint8)(CON16_IINLIM_SHIFT)
519 );
520 }
521
522 //CON17
523 void ncp1851_set_vchred(kal_uint32 val)
524 {
525 kal_uint32 ret=0;
526
527 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON17),
528 (kal_uint8)(val),
529 (kal_uint8)(CON17_VCHRED_MASK),
530 (kal_uint8)(CON17_VCHRED_SHIFT)
531 );
532 }
533
534 void ncp1851_set_ichred(kal_uint32 val)
535 {
536 kal_uint32 ret=0;
537
538 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON17),
539 (kal_uint8)(val),
540 (kal_uint8)(CON17_ICHRED_MASK),
541 (kal_uint8)(CON17_ICHRED_SHIFT)
542 );
543 }
544
545 //CON18
546 void ncp1851_set_batcold(kal_uint32 val)
547 {
548 kal_uint32 ret=0;
549
550 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON18),
551 (kal_uint8)(val),
552 (kal_uint8)(CON18_BATCOLD_MASK),
553 (kal_uint8)(CON18_BATCOLD_SHIFT)
554 );
555 }
556
557 void ncp1851_set_bathot(kal_uint32 val)
558 {
559 kal_uint32 ret=0;
560
561 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON18),
562 (kal_uint8)(val),
563 (kal_uint8)(CON18_BATHOT_MASK),
564 (kal_uint8)(CON18_BATHOT_SHIFT)
565 );
566 }
567
568 void ncp1851_set_batchilly(kal_uint32 val)
569 {
570 kal_uint32 ret=0;
571
572 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON18),
573 (kal_uint8)(val),
574 (kal_uint8)(CON18_BATCHIL_MASK),
575 (kal_uint8)(CON18_BATCHIL_SHIFT)
576 );
577 }
578
579 void ncp1851_set_batwarm(kal_uint32 val)
580 {
581 kal_uint32 ret=0;
582
583 ret=ncp1851_config_interface((kal_uint8)(NCP1851_CON18),
584 (kal_uint8)(val),
585 (kal_uint8)(CON18_BATWARM_MASK),
586 (kal_uint8)(CON18_BATWARM_SHIFT)
587 );
588 }
589
590 /**********************************************************
591 *
592 * [Internal Function]
593 *
594 *********************************************************/
595 void ncp1851_dump_register(void)
596 {
597 int i=0;
598 for (i=0;i<ncp1851_REG_NUM;i++)
599 {
600 if((i == 3) || (i == 4) || (i == 5) || (i == 6)) //do not dump read clear status register
601 continue;
602 if((i == 10) || (i == 11) || (i == 12) || (i == 13)) //do not dump interrupt mask bit register
603 continue;
604 ncp1851_read_byte(i, &ncp1851_reg[i]);
605 printk("[ncp1851_dump_register] Reg[0x%X]=0x%X\n", i, ncp1851_reg[i]);
606 }
607 }
608
609 void ncp1851_read_register(int i)
610 {
611 ncp1851_read_byte(i, &ncp1851_reg[i]);
612 printk("[ncp1851_read_register] Reg[0x%X]=0x%X\n", i, ncp1851_reg[i]);
613 }
614
615 static int ncp1851_driver_probe(struct i2c_client *client, const struct i2c_device_id *id)
616 {
617 int err=0;
618
619 printk("[ncp1851_driver_probe] \n");
620
621 if (!(new_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL))) {
622 err = -ENOMEM;
623 goto exit;
624 }
625 memset(new_client, 0, sizeof(struct i2c_client));
626
627 new_client = client;
628
629 chargin_hw_init_done = KAL_TRUE;
630
631 //---------------------
632
633 return 0;
634
635 exit:
636 return err;
637
638 }
639
640 /**********************************************************
641 *
642 * [platform_driver API]
643 *
644 *********************************************************/
645 kal_uint8 g_reg_value_ncp1851=0;
646 static ssize_t show_ncp1851_access(struct device *dev,struct device_attribute *attr, char *buf)
647 {
648 printk("[show_ncp1851_access] 0x%x\n", g_reg_value_ncp1851);
649 return sprintf(buf, "%u\n", g_reg_value_ncp1851);
650 }
651 static ssize_t store_ncp1851_access(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
652 {
653 int ret=0;
654 char *pvalue = NULL;
655 unsigned int reg_value = 0;
656 unsigned int reg_address = 0;
657
658 printk("[store_ncp1851_access] \n");
659
660 if(buf != NULL && size != 0)
661 {
662 printk("[store_ncp1851_access] buf is %s and size is %d \n",buf,size);
663 reg_address = simple_strtoul(buf,&pvalue,16);
664
665 if(size > 3)
666 {
667 reg_value = simple_strtoul((pvalue+1),NULL,16);
668 printk("[store_ncp1851_access] write ncp1851 reg 0x%x with value 0x%x !\n",reg_address,reg_value);
669 ret=ncp1851_config_interface(reg_address, reg_value, 0xFF, 0x0);
670 }
671 else
672 {
673 ret=ncp1851_read_interface(reg_address, &g_reg_value_ncp1851, 0xFF, 0x0);
674 printk("[store_ncp1851_access] read ncp1851 reg 0x%x with value 0x%x !\n",reg_address,g_reg_value_ncp1851);
675 printk("[store_ncp1851_access] Please use \"cat ncp1851_access\" to get value\r\n");
676 }
677 }
678 return size;
679 }
680 static DEVICE_ATTR(ncp1851_access, 0664, show_ncp1851_access, store_ncp1851_access); //664
681
682 static int ncp1851_user_space_probe(struct platform_device *dev)
683 {
684 int ret_device_file = 0;
685
686 printk("******** ncp1851_user_space_probe!! ********\n" );
687
688 ret_device_file = device_create_file(&(dev->dev), &dev_attr_ncp1851_access);
689
690 return 0;
691 }
692
693 struct platform_device ncp1851_user_space_device = {
694 .name = "ncp1851-user",
695 .id = -1,
696 };
697
698 static struct platform_driver ncp1851_user_space_driver = {
699 .probe = ncp1851_user_space_probe,
700 .driver = {
701 .name = "ncp1851-user",
702 },
703 };
704 #ifndef NCP1851_BUSNUM
705 #define NCP1851_BUSNUM 1
706 #endif
707 static struct i2c_board_info __initdata i2c_ncp1851 = { I2C_BOARD_INFO("ncp1851", (0x6c>>1))};
708
709 static int __init ncp1851_init(void)
710 {
711 int ret=0;
712
713 printk("[ncp1851_init] init start\n");
714
715 i2c_register_board_info(NCP1851_BUSNUM, &i2c_ncp1851, 1);
716
717 if(i2c_add_driver(&ncp1851_driver)!=0)
718 {
719 printk("[ncp1851_init] failed to register ncp1851 i2c driver.\n");
720 }
721 else
722 {
723 printk("[ncp1851_init] Success to register ncp1851 i2c driver.\n");
724 }
725
726 // ncp1851 user space access interface
727 ret = platform_device_register(&ncp1851_user_space_device);
728 if (ret) {
729 printk("****[ncp1851_init] Unable to device register(%d)\n", ret);
730 return ret;
731 }
732 ret = platform_driver_register(&ncp1851_user_space_driver);
733 if (ret) {
734 printk("****[ncp1851_init] Unable to register driver (%d)\n", ret);
735 return ret;
736 }
737
738 return 0;
739 }
740
741 static void __exit ncp1851_exit(void)
742 {
743 i2c_del_driver(&ncp1851_driver);
744 }
745
746 module_init(ncp1851_init);
747 module_exit(ncp1851_exit);
748
749 MODULE_LICENSE("GPL");
750 MODULE_DESCRIPTION("I2C ncp1851 Driver");
751 MODULE_AUTHOR("YT Lee<yt.lee@mediatek.com>");
752