1 #include <linux/interrupt.h>
3 #include <linux/slab.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>
16 #include <linux/hwmsensor.h>
17 #include <linux/hwmsen_dev.h>
18 #include <linux/sensors_io.h>
19 #include <linux/hwmsen_helper.h>
21 #include <mach/mt_typedefs.h>
22 #include <mach/mt_gpio.h>
23 #include <mach/mt_pm_ldo.h>
27 /**********************************************************
31 *********************************************************/
32 #define NCP1851_SLAVE_ADDR_WRITE 0x6C
33 #define NCP1851_SLAVE_ADDR_READ 0x6D
35 static struct i2c_client
*new_client
= NULL
;
36 static const struct i2c_device_id ncp1851_i2c_id
[] = {{"ncp1851",0},{}};
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
);
41 static struct i2c_driver ncp1851_driver
= {
45 .probe
= ncp1851_driver_probe
,
46 .id_table
= ncp1851_i2c_id
,
49 /**********************************************************
53 *********************************************************/
54 #define ncp1851_REG_NUM 19
55 kal_uint8 ncp1851_reg
[ncp1851_REG_NUM
] = {0};
57 static DEFINE_MUTEX(ncp1851_i2c_access
);
58 /**********************************************************
60 * [I2C Function For Read/Write ncp1851]
62 *********************************************************/
63 int ncp1851_read_byte(kal_uint8 cmd
, kal_uint8
*returnData
)
65 char cmd_buf
[1]={0x00};
69 mutex_lock(&ncp1851_i2c_access
);
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
;
75 ret
= i2c_master_send(new_client
, &cmd_buf
[0], (1<<8 | 1));
78 //new_client->addr = new_client->addr & I2C_MASK_FLAG;
79 new_client
->ext_flag
=0;
81 mutex_unlock(&ncp1851_i2c_access
);
85 readData
= cmd_buf
[0];
86 *returnData
= readData
;
88 //new_client->addr = new_client->addr & I2C_MASK_FLAG;
89 new_client
->ext_flag
=0;
91 mutex_unlock(&ncp1851_i2c_access
);
95 int ncp1851_write_byte(kal_uint8 cmd
, kal_uint8 writeData
)
97 char write_data
[2] = {0};
100 mutex_lock(&ncp1851_i2c_access
);
103 write_data
[1] = writeData
;
105 new_client
->ext_flag
=((new_client
->ext_flag
) & I2C_MASK_FLAG
) | I2C_DIRECTION_FLAG
;
107 ret
= i2c_master_send(new_client
, write_data
, 2);
110 new_client
->ext_flag
=0;
111 mutex_unlock(&ncp1851_i2c_access
);
115 new_client
->ext_flag
=0;
116 mutex_unlock(&ncp1851_i2c_access
);
120 /**********************************************************
122 * [Read / Write Function]
124 *********************************************************/
125 kal_uint32
ncp1851_read_interface (kal_uint8 RegNum
, kal_uint8
*val
, kal_uint8 MASK
, kal_uint8 SHIFT
)
127 kal_uint8 ncp1851_reg
= 0;
130 printk("--------------------------------------------------\n");
132 ret
= ncp1851_read_byte(RegNum
, &ncp1851_reg
);
133 printk("[ncp1851_read_interface] Reg[%x]=0x%x\n", RegNum
, ncp1851_reg
);
135 ncp1851_reg
&= (MASK
<< SHIFT
);
136 *val
= (ncp1851_reg
>> SHIFT
);
137 printk("[ncp1851_read_interface] Val=0x%x\n", *val
);
142 kal_uint32
ncp1851_config_interface (kal_uint8 RegNum
, kal_uint8 val
, kal_uint8 MASK
, kal_uint8 SHIFT
)
144 kal_uint8 ncp1851_reg
= 0;
147 printk("--------------------------------------------------\n");
149 ret
= ncp1851_read_byte(RegNum
, &ncp1851_reg
);
150 //printk("[ncp1851_config_interface] Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
152 ncp1851_reg
&= ~(MASK
<< SHIFT
);
153 ncp1851_reg
|= (val
<< SHIFT
);
155 ret
= ncp1851_write_byte(RegNum
, ncp1851_reg
);
156 //printk("[ncp18516_config_interface] Write Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
159 //ncp1851_read_byte(RegNum, &ncp1851_reg);
160 //printk("[ncp1851_config_interface] Check Reg[%x]=0x%x\n", RegNum, ncp1851_reg);
165 /**********************************************************
167 * [Internal Function]
169 *********************************************************/
171 kal_uint32
ncp1851_get_chip_status(void)
176 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON0
),
178 (kal_uint8
)(CON0_STATE_MASK
),
179 (kal_uint8
)(CON0_STATE_SHIFT
)
184 kal_uint32
ncp1851_get_batfet(void)
189 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON0
),
191 (kal_uint8
)(CON0_BATFET_MASK
),
192 (kal_uint8
)(CON0_BATFET_SHIFT
)
197 kal_uint32
ncp1851_get_ntc(void)
202 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON0
),
204 (kal_uint8
)(CON0_NTC_MASK
),
205 (kal_uint8
)(CON0_NTC_SHIFT
)
210 kal_uint32
ncp1851_get_statint(void)
215 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON0
),
217 (kal_uint8
)(CON0_STATINT_MASK
),
218 (kal_uint8
)(CON0_STATINT_SHIFT
)
223 kal_uint32
ncp1851_get_faultint(void)
228 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON0
),
230 (kal_uint8
)(CON0_FAULTINT_MASK
),
231 (kal_uint8
)(CON0_FAULTINT_SHIFT
)
237 void ncp1851_set_reset(kal_uint32 val
)
241 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
243 (kal_uint8
)(CON1_REG_RST_MASK
),
244 (kal_uint8
)(CON1_REG_RST_SHIFT
)
248 void ncp1851_set_chg_en(kal_uint32 val
)
252 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
254 (kal_uint8
)(CON1_CHG_EN_MASK
),
255 (kal_uint8
)(CON1_CHG_EN_SHIFT
)
259 void ncp1851_set_otg_en(kal_uint32 val
)
263 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
265 (kal_uint8
)(CON1_OTG_EN_MASK
),
266 (kal_uint8
)(CON1_OTG_EN_SHIFT
)
270 kal_uint32
ncp1851_get_otg_en(void)
275 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON1
),
277 (kal_uint8
)(CON1_OTG_EN_MASK
),
278 (kal_uint8
)(CON1_OTG_EN_SHIFT
)
283 void ncp1851_set_ntc_en(kal_uint32 val
)
287 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
289 (kal_uint8
)(CON1_NTC_EN_MASK
),
290 (kal_uint8
)(CON1_NTC_EN_SHIFT
)
294 void ncp1851_set_tj_warn_opt(kal_uint32 val
)
298 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
300 (kal_uint8
)(CON1_TJ_WARN_OPT_MASK
),
301 (kal_uint8
)(CON1_TJ_WARN_OPT_SHIFT
)
305 void ncp1851_set_jeita_opt(kal_uint32 val
)
309 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
311 (kal_uint8
)(CON1_JEITA_OPT_MASK
),
312 (kal_uint8
)(CON1_JEITA_OPT_SHIFT
)
316 void ncp1851_set_tchg_rst(kal_uint32 val
)
320 ret
=ncp1851_config_interface( (kal_uint8
)(NCP1851_CON1
),
322 (kal_uint8
)(CON1_TCHG_RST_MASK
),
323 (kal_uint8
)(CON1_TCHG_RST_SHIFT
)
327 void ncp1851_set_int_mask(kal_uint32 val
)
331 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON1
),
333 (kal_uint8
)(CON1_INT_MASK_MASK
),
334 (kal_uint8
)(CON1_INT_MASK_SHIFT
)
339 void ncp1851_set_wdto_dis(kal_uint32 val
)
343 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
345 (kal_uint8
)(CON2_WDTO_DIS_MASK
),
346 (kal_uint8
)(CON2_WDTO_DIS_SHIFT
)
350 void ncp1851_set_chgto_dis(kal_uint32 val
)
354 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
356 (kal_uint8
)(CON2_CHGTO_DIS_MASK
),
357 (kal_uint8
)(CON2_CHGTO_DIS_SHIFT
)
361 void ncp1851_set_pwr_path(kal_uint32 val
)
365 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
367 (kal_uint8
)(CON2_PWR_PATH_MASK
),
368 (kal_uint8
)(CON2_PWR_PATH_SHIFT
)
372 void ncp1851_set_trans_en(kal_uint32 val
)
376 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
378 (kal_uint8
)(CON2_TRANS_EN_MASK
),
379 (kal_uint8
)(CON2_TRANS_EN_SHIFT
)
383 void ncp1851_set_factory_mode(kal_uint32 val
)
387 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
389 (kal_uint8
)(CON2_FCTRY_MOD_MASK
),
390 (kal_uint8
)(CON2_FCTRY_MOD_SHIFT
)
394 void ncp1851_set_iinset_pin_en(kal_uint32 val
)
398 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
400 (kal_uint8
)(CON2_IINSET_PIN_EN_MASK
),
401 (kal_uint8
)(CON2_IINSET_PIN_EN_SHIFT
)
405 void ncp1851_set_iinlim_en(kal_uint32 val
)
409 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
411 (kal_uint8
)(CON2_IINLIM_EN_MASK
),
412 (kal_uint8
)(CON2_IINLIM_EN_SHIFT
)
416 void ncp1851_set_aicl_en(kal_uint32 val
)
420 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON2
),
422 (kal_uint8
)(CON2_AICL_EN_MASK
),
423 (kal_uint8
)(CON2_AICL_EN_SHIFT
)
428 kal_uint32
ncp1851_get_vfet_ok(void)
433 ret
=ncp1851_read_interface((kal_uint8
)(NCP1851_CON8
),
435 (kal_uint8
)(CON8_VFET_OK_MASK
),
436 (kal_uint8
)(CON8_VFET_OK_SHIFT
)
443 void ncp1851_set_ctrl_vbat(kal_uint32 val
)
447 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON14
),
449 (kal_uint8
)(CON14_CTRL_VBAT_MASK
),
450 (kal_uint8
)(CON14_CTRL_VBAT_SHIFT
)
455 void ncp1851_set_ieoc(kal_uint32 val
)
459 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON15
),
461 (kal_uint8
)(CON15_IEOC_MASK
),
462 (kal_uint8
)(CON15_IEOC_SHIFT
)
466 void ncp1851_set_ichg(kal_uint32 val
)
470 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON15
),
472 (kal_uint8
)(CON15_ICHG_MASK
),
473 (kal_uint8
)(CON15_ICHG_SHIFT
)
476 kal_uint32
ncp1851_get_ichg(void)
481 ret
= ncp1851_read_interface((kal_uint8
)NCP1851_CON15
,
483 (kal_uint8
)CON15_ICHG_MASK
,
484 (kal_uint8
)CON15_ICHG_SHIFT
);
489 void ncp1851_set_iweak(kal_uint32 val
)
493 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON16
),
495 (kal_uint8
)(CON16_IWEAK_MASK
),
496 (kal_uint8
)(CON16_IWEAK_SHIFT
)
500 void ncp1851_set_ctrl_vfet(kal_uint32 val
)
504 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON16
),
506 (kal_uint8
)(CON16_CTRL_VFET_MASK
),
507 (kal_uint8
)(CON16_CTRL_VFET_SHIFT
)
511 void ncp1851_set_iinlim(kal_uint32 val
)
515 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON16
),
517 (kal_uint8
)(CON16_IINLIM_MASK
),
518 (kal_uint8
)(CON16_IINLIM_SHIFT
)
523 void ncp1851_set_vchred(kal_uint32 val
)
527 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON17
),
529 (kal_uint8
)(CON17_VCHRED_MASK
),
530 (kal_uint8
)(CON17_VCHRED_SHIFT
)
534 void ncp1851_set_ichred(kal_uint32 val
)
538 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON17
),
540 (kal_uint8
)(CON17_ICHRED_MASK
),
541 (kal_uint8
)(CON17_ICHRED_SHIFT
)
546 void ncp1851_set_batcold(kal_uint32 val
)
550 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON18
),
552 (kal_uint8
)(CON18_BATCOLD_MASK
),
553 (kal_uint8
)(CON18_BATCOLD_SHIFT
)
557 void ncp1851_set_bathot(kal_uint32 val
)
561 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON18
),
563 (kal_uint8
)(CON18_BATHOT_MASK
),
564 (kal_uint8
)(CON18_BATHOT_SHIFT
)
568 void ncp1851_set_batchilly(kal_uint32 val
)
572 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON18
),
574 (kal_uint8
)(CON18_BATCHIL_MASK
),
575 (kal_uint8
)(CON18_BATCHIL_SHIFT
)
579 void ncp1851_set_batwarm(kal_uint32 val
)
583 ret
=ncp1851_config_interface((kal_uint8
)(NCP1851_CON18
),
585 (kal_uint8
)(CON18_BATWARM_MASK
),
586 (kal_uint8
)(CON18_BATWARM_SHIFT
)
590 /**********************************************************
592 * [Internal Function]
594 *********************************************************/
595 void ncp1851_dump_register(void)
598 for (i
=0;i
<ncp1851_REG_NUM
;i
++)
600 if((i
== 3) || (i
== 4) || (i
== 5) || (i
== 6)) //do not dump read clear status register
602 if((i
== 10) || (i
== 11) || (i
== 12) || (i
== 13)) //do not dump interrupt mask bit register
604 ncp1851_read_byte(i
, &ncp1851_reg
[i
]);
605 printk("[ncp1851_dump_register] Reg[0x%X]=0x%X\n", i
, ncp1851_reg
[i
]);
609 void ncp1851_read_register(int i
)
611 ncp1851_read_byte(i
, &ncp1851_reg
[i
]);
612 printk("[ncp1851_read_register] Reg[0x%X]=0x%X\n", i
, ncp1851_reg
[i
]);
615 static int ncp1851_driver_probe(struct i2c_client
*client
, const struct i2c_device_id
*id
)
619 printk("[ncp1851_driver_probe] \n");
621 if (!(new_client
= kmalloc(sizeof(struct i2c_client
), GFP_KERNEL
))) {
625 memset(new_client
, 0, sizeof(struct i2c_client
));
629 chargin_hw_init_done
= KAL_TRUE
;
631 //---------------------
640 /**********************************************************
642 * [platform_driver API]
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
)
648 printk("[show_ncp1851_access] 0x%x\n", g_reg_value_ncp1851
);
649 return sprintf(buf
, "%u\n", g_reg_value_ncp1851
);
651 static ssize_t
store_ncp1851_access(struct device
*dev
,struct device_attribute
*attr
, const char *buf
, size_t size
)
655 unsigned int reg_value
= 0;
656 unsigned int reg_address
= 0;
658 printk("[store_ncp1851_access] \n");
660 if(buf
!= NULL
&& size
!= 0)
662 printk("[store_ncp1851_access] buf is %s and size is %d \n",buf
,size
);
663 reg_address
= simple_strtoul(buf
,&pvalue
,16);
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);
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");
680 static DEVICE_ATTR(ncp1851_access
, 0664, show_ncp1851_access
, store_ncp1851_access
); //664
682 static int ncp1851_user_space_probe(struct platform_device
*dev
)
684 int ret_device_file
= 0;
686 printk("******** ncp1851_user_space_probe!! ********\n" );
688 ret_device_file
= device_create_file(&(dev
->dev
), &dev_attr_ncp1851_access
);
693 struct platform_device ncp1851_user_space_device
= {
694 .name
= "ncp1851-user",
698 static struct platform_driver ncp1851_user_space_driver
= {
699 .probe
= ncp1851_user_space_probe
,
701 .name
= "ncp1851-user",
704 #ifndef NCP1851_BUSNUM
705 #define NCP1851_BUSNUM 1
707 static struct i2c_board_info __initdata i2c_ncp1851
= { I2C_BOARD_INFO("ncp1851", (0x6c>>1))};
709 static int __init
ncp1851_init(void)
713 printk("[ncp1851_init] init start\n");
715 i2c_register_board_info(NCP1851_BUSNUM
, &i2c_ncp1851
, 1);
717 if(i2c_add_driver(&ncp1851_driver
)!=0)
719 printk("[ncp1851_init] failed to register ncp1851 i2c driver.\n");
723 printk("[ncp1851_init] Success to register ncp1851 i2c driver.\n");
726 // ncp1851 user space access interface
727 ret
= platform_device_register(&ncp1851_user_space_device
);
729 printk("****[ncp1851_init] Unable to device register(%d)\n", ret
);
732 ret
= platform_driver_register(&ncp1851_user_space_driver
);
734 printk("****[ncp1851_init] Unable to register driver (%d)\n", ret
);
741 static void __exit
ncp1851_exit(void)
743 i2c_del_driver(&ncp1851_driver
);
746 module_init(ncp1851_init
);
747 module_exit(ncp1851_exit
);
749 MODULE_LICENSE("GPL");
750 MODULE_DESCRIPTION("I2C ncp1851 Driver");
751 MODULE_AUTHOR("YT Lee<yt.lee@mediatek.com>");