3 * Samsung MFC IC Charger Driver
5 * Copyright (C) 2016 Samsung Electronics
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #include "include/charger/mfc_charger.h"
19 #include <linux/errno.h>
20 #include <linux/version.h>
21 #include <linux/device.h>
23 #include <linux/gpio.h>
24 #include <linux/interrupt.h>
25 #include <linux/i2c.h>
26 #include <linux/module.h>
27 #include <linux/slab.h>
28 #include <linux/pm_runtime.h>
29 #include <linux/irqdomain.h>
31 #include <linux/of_gpio.h>
32 #include <linux/kernel.h>
33 #include <asm/uaccess.h>
34 #include <linux/sysctl.h>
35 #include <linux/proc_fs.h>
36 #include <linux/vmalloc.h>
37 #include <linux/ctype.h>
38 #include <linux/firmware.h>
44 int mfc_otp_update
= 0;
46 extern bool sleep_mode
;
48 static enum power_supply_property mfc_charger_props
[] = {
51 extern unsigned int lpcharge
;
52 int mfc_get_firmware_version(struct mfc_charger_data
*charger
, int firm_mode
);
53 static irqreturn_t
mfc_wpc_det_irq_thread(int irq
, void *irq_data
);
54 static irqreturn_t
mfc_wpc_irq_thread(int irq
, void *irq_data
);
56 #define MAX_I2C_ERROR_COUNT 30
57 static void mfc_check_i2c_error(struct mfc_charger_data
*charger
, bool is_error
)
59 charger
->i2c_error_count
=
60 (charger
->wc_w_state
&& gpio_get_value(charger
->pdata
->wpc_det
) && is_error
) ?
61 (charger
->i2c_error_count
+ 1) : 0;
63 if (charger
->i2c_error_count
> MAX_I2C_ERROR_COUNT
) {
64 charger
->i2c_error_count
= 0;
65 queue_delayed_work(charger
->wqueue
, &charger
->wpc_i2c_error_work
, 0);
69 static int mfc_reg_read(struct i2c_client
*client
, u16 reg
, u8
*val
)
71 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
73 struct i2c_msg msg
[2];
77 msg
[0].addr
= client
->addr
;
78 msg
[0].flags
= client
->flags
& I2C_M_TEN
;
82 wbuf
[0] = (reg
& 0xFF00) >> 8;
83 wbuf
[1] = (reg
& 0xFF);
85 msg
[1].addr
= client
->addr
;
86 msg
[1].flags
= I2C_M_RD
;
90 mutex_lock(&charger
->io_lock
);
91 ret
= i2c_transfer(client
->adapter
, msg
, 2);
92 mfc_check_i2c_error(charger
, (ret
< 0));
93 mutex_unlock(&charger
->io_lock
);
96 pr_err("%s: i2c read error, reg: 0x%x, ret: %d (called by %ps)\n",
97 __func__
, reg
, ret
, __builtin_return_address(0));
105 static int mfc_reg_multi_read(struct i2c_client
*client
, u16 reg
, u8
*val
, int size
)
107 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
109 struct i2c_msg msg
[2];
112 msg
[0].addr
= client
->addr
;
113 msg
[0].flags
= client
->flags
& I2C_M_TEN
;
117 wbuf
[0] = (reg
& 0xFF00) >> 8;
118 wbuf
[1] = (reg
& 0xFF);
120 msg
[1].addr
= client
->addr
;
121 msg
[1].flags
= I2C_M_RD
;
125 mutex_lock(&charger
->io_lock
);
126 ret
= i2c_transfer(client
->adapter
, msg
, 2);
127 mfc_check_i2c_error(charger
, (ret
< 0));
128 mutex_unlock(&charger
->io_lock
);
131 pr_err("%s: i2c transfer fail", __func__
);
138 static int mfc_reg_write(struct i2c_client
*client
, u16 reg
, u8 val
)
140 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
142 unsigned char data
[3] = { reg
>> 8, reg
& 0xff, val
};
144 mutex_lock(&charger
->io_lock
);
145 ret
= i2c_master_send(client
, data
, 3);
146 mfc_check_i2c_error(charger
, (ret
< 3));
147 mutex_unlock(&charger
->io_lock
);
149 pr_err("%s: i2c write error, reg: 0x%x, ret: %d (called by %ps)\n",
150 __func__
, reg
, ret
, __builtin_return_address(0));
151 return ret
< 0 ? ret
: -EIO
;
157 static int mfc_reg_update(struct i2c_client
*client
, u16 reg
, u8 val
, u8 mask
)
161 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
162 unsigned char data
[3] = { reg
>> 8, reg
& 0xff, val
};
166 ret
= mfc_reg_read(client
, reg
, &data2
);
168 u8 old_val
= data2
& 0xff;
169 u8 new_val
= (val
& mask
) | (old_val
& (~mask
));
172 mutex_lock(&charger
->io_lock
);
173 ret
= i2c_master_send(client
, data
, 3);
174 mfc_check_i2c_error(charger
, (ret
< 3));
175 mutex_unlock(&charger
->io_lock
);
177 pr_err("%s: i2c write error, reg: 0x%x, ret: %d\n",
179 return ret
< 0 ? ret
: -EIO
;
182 mfc_reg_read(client
, reg
, &data2
);
187 int mfc_get_firmware_version(struct mfc_charger_data
*charger
, int firm_mode
)
191 u8 fw_major
[2] = {0,};
192 u8 fw_minor
[2] = {0,};
194 pr_info("%s: called by (%ps)\n", __func__
, __builtin_return_address(0));
196 case MFC_RX_FIRMWARE
:
197 ret
= mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_L_REG
, &fw_major
[0]);
198 ret
= mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_H_REG
, &fw_major
[1]);
200 version
= fw_major
[0] | (fw_major
[1] << 8);
202 pr_info("%s rx major firmware version 0x%x \n", __func__
, version
);
204 ret
= mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_L_REG
, &fw_minor
[0]);
205 ret
= mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_H_REG
, &fw_minor
[1]);
207 version
= fw_minor
[0] | (fw_minor
[1] << 8);
209 pr_info("%s rx minor firmware version 0x%x \n", __func__
, version
);
212 pr_err("%s Wrong firmware mode \n", __func__
);
219 int mfc_get_chip_id(struct mfc_charger_data
*charger
)
223 mfc_reg_read(charger
->client
, MFC_CHIP_ID_L_REG
, &chip_id
);
224 if (chip_id
== 0x40) {
225 charger
->chip_id
= MFC_CHIP_LSI
;
226 pr_info("%s: LSI CHIP\n", __func__
);
228 charger
->chip_id
= MFC_CHIP_IDT
;
229 pr_info("%s: IDT CHIP\n", __func__
);
231 return charger
->chip_id
;
233 int mfc_get_ic_revision(struct mfc_charger_data
*charger
, int read_mode
)
238 pr_info("%s: called by (%ps)\n", __func__
, __builtin_return_address(0));
241 case MFC_IC_REVISION
:
242 ret
= mfc_reg_read(charger
->client
, MFC_CHIP_REVISION_REG
, &temp
);
245 temp
&= MFC_CHIP_REVISION_MASK
;
246 pr_info("%s ic revision = %d \n", __func__
, temp
);
253 ret
= mfc_reg_read(charger
->client
, MFC_CHIP_REVISION_REG
, &temp
);
256 temp
&= MFC_CHIP_FONT_MASK
;
257 pr_info("%s ic font = %d \n", __func__
, temp
);
270 int mfc_get_adc(struct mfc_charger_data
*charger
, int adc_type
)
277 ret
= mfc_reg_read(charger
->client
, MFC_ADC_VOUT_L_REG
, &data
[0]);
278 ret
= mfc_reg_read(charger
->client
, MFC_ADC_VOUT_H_REG
, &data
[1]);
280 ret
= (data
[0] | (data
[1] << 8));
285 ret
= mfc_reg_read(charger
->client
, MFC_ADC_VRECT_L_REG
, &data
[0]);
286 ret
= mfc_reg_read(charger
->client
, MFC_ADC_VRECT_H_REG
, &data
[1]);
288 ret
= (data
[0] | (data
[1] << 8));
292 case MFC_ADC_TX_ISENSE
:
293 ret
= mfc_reg_read(charger
->client
, MFC_ADC_TX_ISENSE_L_REG
, &data
[0]);
294 ret
= mfc_reg_read(charger
->client
, MFC_ADC_TX_ISENSE_H_REG
, &data
[1]);
296 ret
= (data
[0] | (data
[1] << 8));
300 case MFC_ADC_RX_IOUT
:
301 ret
= mfc_reg_read(charger
->client
, MFC_ADC_RX_IOUT_L_REG
, &data
[0]);
302 ret
= mfc_reg_read(charger
->client
, MFC_ADC_RX_IOUT_H_REG
, &data
[1]);
304 ret
= (data
[0] | (data
[1] << 8));
308 case MFC_ADC_DIE_TEMP
:
309 /* only 4 MSB[3:0] field is used, Celsius */
310 ret
= mfc_reg_read(charger
->client
, MFC_ADC_DIE_TEMP_L_REG
, &data
[0]);
311 ret
= mfc_reg_read(charger
->client
, MFC_ADC_DIE_TEMP_H_REG
, &data
[1]);
314 ret
= (data
[0] | (data
[1] << 8));
318 case MFC_ADC_OP_FRQ
: /* kHz */
319 ret
= mfc_reg_read(charger
->client
, MFC_RX_OP_FREQ_L_REG
, &data
[0]);
320 ret
= mfc_reg_read(charger
->client
, MFC_RX_OP_FREQ_H_REG
, &data
[1]);
322 ret
= (data
[0] | (data
[1] << 8));
326 case MFC_ADC_PING_FRQ
:
327 ret
= mfc_reg_read(charger
->client
, MFC_RX_PING_FREQ_L_REG
, &data
[0]);
328 ret
= mfc_reg_read(charger
->client
, MFC_RX_PING_FREQ_H_REG
, &data
[0]);
330 ret
= (data
[0] | (data
[1] << 8));
340 void mfc_set_vout(struct mfc_charger_data
*charger
, int vout
)
350 if (charger
->chip_id
== MFC_CHIP_IDT
)
351 mfc_reg_write(charger
->client
, MFC_VOUT_SET_REG
, mfc_idt_vout_val
[vout
]);
353 mfc_reg_write(charger
->client
, MFC_VOUT_SET_REG
, mfc_lsi_vout_val
[vout
]);
360 pr_info("%s vout(%d) read = %d mV \n", __func__
, vout
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
361 charger
->pdata
->vout_status
= vout
;
364 int mfc_get_vout(struct mfc_charger_data
*charger
)
368 ret
= mfc_reg_read(charger
->client
, MFC_VOUT_SET_REG
, &data
);
370 pr_err("%s: fail to read vout. (%d)\n", __func__
, ret
);
373 pr_info("%s: vout(0x%x)\n", __func__
, data
);
377 void mfc_rpp_set(struct mfc_charger_data
*charger
)
382 if (charger
->led_cover
) {
383 pr_info("%s: LED cover exists. RPP 3/4 (0x%x)\n", __func__
, charger
->pdata
->wc_cover_rpp
);
384 mfc_reg_write(charger
->client
, MFC_RPP_SCALE_COEF_REG
, charger
->pdata
->wc_cover_rpp
);
386 pr_info("%s: LED cover not exists. RPP 1/2 (0x%x)\n", __func__
, charger
->pdata
->wc_hv_rpp
);
387 mfc_reg_write(charger
->client
, MFC_RPP_SCALE_COEF_REG
, charger
->pdata
->wc_hv_rpp
);
390 ret
= mfc_reg_read(charger
->client
, MFC_RPP_SCALE_COEF_REG
, &data
);
392 pr_err("%s: fail to read RPP scaling coefficient. (%d)\n", __func__
, ret
);
394 pr_info("%s: RPP scaling coefficient(0x%x)\n", __func__
, data
);
397 void mfc_fod_set(struct mfc_charger_data
*charger
)
400 pr_info("%s \n", __func__
);
402 switch (charger
->pdata
->cable_type
) {
404 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
405 mfc_reg_write(charger
->client
, MFC_A4WP_FOD_0A_REG
+i
, charger
->pdata
->fod_a4wp_data
[i
]);
409 /* need to unify WPC and PMA */
411 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
412 mfc_reg_write(charger
->client
, MFC_PMA_FOD_0A_REG
+i
, charger
->pdata
->fod_pma_data
[i
]);
417 case MFC_PAD_WPC_AFC
:
418 case MFC_PAD_WPC_PACK
:
419 case MFC_PAD_WPC_PACK_HV
:
420 case MFC_PAD_WPC_STAND
:
421 case MFC_PAD_WPC_STAND_HV
:
422 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
423 mfc_reg_write(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, charger
->pdata
->fod_wpc_data
[i
]);
434 void mfc_fod_set_cv(struct mfc_charger_data
*charger
)
438 pr_info("%s \n", __func__
);
439 switch (charger
->pdata
->cable_type
) {
441 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
442 mfc_reg_write(charger
->client
, MFC_A4WP_FOD_0A_REG
+i
, charger
->pdata
->fod_a4wp_data_cv
[i
]);
445 /* need to unify WPC and PMA */
447 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
448 mfc_reg_write(charger
->client
, MFC_PMA_FOD_0A_REG
+i
, charger
->pdata
->fod_pma_data_cv
[i
]);
453 case MFC_PAD_WPC_AFC
:
454 case MFC_PAD_WPC_PACK
:
455 case MFC_PAD_WPC_PACK_HV
:
456 case MFC_PAD_WPC_STAND
:
457 case MFC_PAD_WPC_STAND_HV
:
459 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
460 mfc_reg_write(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, charger
->pdata
->fod_wpc_data_cv
[i
]);
470 void mfc_fod_set_cs100(struct mfc_charger_data
*charger
)
474 pr_info("%s \n", __func__
);
476 switch (charger
->pdata
->cable_type
) {
478 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
479 mfc_reg_write(charger
->client
, MFC_A4WP_FOD_0A_REG
+i
, 0x7f);
482 /* need to unify WPC and PMA */
484 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
485 mfc_reg_write(charger
->client
, MFC_PMA_FOD_0A_REG
+i
, 0x7f);
490 case MFC_PAD_WPC_AFC
:
491 case MFC_PAD_WPC_PACK
:
492 case MFC_PAD_WPC_PACK_HV
:
493 case MFC_PAD_WPC_STAND
:
494 case MFC_PAD_WPC_STAND_HV
:
496 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
497 mfc_reg_write(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, 0x7f);
506 void mfc_fod_set_hero_5v(struct mfc_charger_data
*charger
)
511 pr_info("%s \n", __func__
);
513 if (charger
->pdata
->fod_hero_5v_data
) {
514 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
515 mfc_reg_write(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, charger
->pdata
->fod_hero_5v_data
[i
]);
518 for(i
=0; i
< MFC_NUM_FOD_REG
; i
++) {
519 mfc_reg_read(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, &fod
[i
]);
521 pr_info("%s: HERO 5V FOD(%d %d %d %d %d %d %d %d %d %d %d %d)\n", __func__
,
522 fod
[0], fod
[1], fod
[2], fod
[3], fod
[4], fod
[5], fod
[6], fod
[7], fod
[8], fod
[9], fod
[10], fod
[11]);
526 void mfc_set_cmd_l_reg(struct mfc_charger_data
*charger
, u8 val
, u8 mask
)
532 pr_info("%s \n", __func__
);
533 ret
= mfc_reg_update(charger
->client
, MFC_AP2MFC_CMD_L_REG
, val
, mask
); // command
535 ret
= mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &temp
); // check out set bit exists
536 if(ret
< 0 || i
> 3 )
540 } while ((temp
!= 0) && (i
< 3));
543 void mfc_set_cmd_h_reg(struct mfc_charger_data
*charger
, u8 val
, u8 mask
)
549 pr_info("%s \n", __func__
);
550 ret
= mfc_reg_update(charger
->client
, MFC_AP2MFC_CMD_H_REG
, val
, mask
); // command
553 ret
= mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_H_REG
, &temp
); // check out set bit exists
554 if(ret
< 0 || i
> 3 )
558 } while ((temp
!= 0) && (i
< 3));
561 void mfc_send_eop(struct mfc_charger_data
*charger
, int health_mode
)
566 pr_info("%s: health_mode (0x%x)\n", __func__
, health_mode
);
567 switch(health_mode
) {
568 case POWER_SUPPLY_HEALTH_OVERHEAT
:
569 case POWER_SUPPLY_HEALTH_OVERHEATLIMIT
:
570 case POWER_SUPPLY_HEALTH_COLD
:
571 if (charger
->pdata
->cable_type
== MFC_PAD_PMA
) {
572 pr_info("%s pma mode\n", __func__
);
573 for (i
= 0; i
< CMD_CNT
; i
++) {
574 ret
= mfc_reg_write(charger
->client
, MFC_EPT_REG
, MFC_WPC_EPT_END_OF_CHG
);
576 mfc_set_cmd_l_reg(charger
, MFC_CMD_SEND_EOP_MASK
, MFC_CMD_SEND_EOP_MASK
);
581 } else if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
582 pr_info("%s a4wp mode\n", __func__
);
584 pr_info("%s wpc mode\n", __func__
);
585 for (i
= 0; i
< CMD_CNT
; i
++) {
586 ret
= mfc_reg_write(charger
->client
, MFC_EPT_REG
, MFC_WPC_EPT_OVER_TEMP
);
588 mfc_set_cmd_l_reg(charger
, MFC_CMD_SEND_EOP_MASK
, MFC_CMD_SEND_EOP_MASK
);
595 case POWER_SUPPLY_HEALTH_UNDERVOLTAGE
:
602 void mfc_send_packet(struct mfc_charger_data
*charger
, u8 header
, u8 rx_data_com
, u8
*data_val
, int data_size
)
606 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
607 /* set AP2BT COM, and VALUE, and trigger INT_B */
608 mfc_reg_write(charger
->client
, MFC_AP2BT_DATA_COM_REG
, rx_data_com
);
609 for(i
= 0; i
< data_size
; i
++) {
610 mfc_reg_write(charger
->client
, MFC_AP2BT_DATA_VALUE0_REG
+ i
, data_val
[i
]);
612 mfc_set_cmd_l_reg(charger
, MFC_CMD_AP2BT_DATA_MASK
, MFC_CMD_AP2BT_DATA_MASK
);
614 mfc_reg_write(charger
->client
, MFC_WPC_PCKT_HEADER_REG
, header
);
615 mfc_reg_write(charger
->client
, MFC_WPC_RX_DATA_COM_REG
, rx_data_com
);
617 for(i
= 0; i
< data_size
; i
++) {
618 mfc_reg_write(charger
->client
, MFC_WPC_RX_DATA_VALUE0_REG
+ i
, data_val
[i
]);
620 mfc_set_cmd_l_reg(charger
, MFC_CMD_SEND_RX_DATA_MASK
, MFC_CMD_SEND_RX_DATA_MASK
);
624 int mfc_send_cs100(struct mfc_charger_data
*charger
)
630 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
631 data_val
[0] = 0x80; /* charge complete */
632 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, AP2BT_COM_CHG_STATUS
, data_val
, 1);
634 for(i
= 0; i
< CMD_CNT
; i
++) {
635 ret
= mfc_reg_write(charger
->client
, MFC_BATTERY_CHG_STATUS_REG
, 100);
637 mfc_set_cmd_l_reg(charger
, MFC_CMD_SEND_CHG_STS_MASK
, MFC_CMD_SEND_CHG_STS_MASK
);
648 void mfc_send_command(struct mfc_charger_data
*charger
, int cmd_mode
)
654 case MFC_AFC_CONF_5V
:
655 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
656 pr_info("%s: A4WP set 5V\n", __func__
);
657 cmd
= AP2BT_COM_AFC_MODE
;
658 data_val
[0] = 0x00; /* Value for A4WP AFC_SET 5V */
659 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
662 charger
->vout_mode
= WIRELESS_VOUT_5V
;
663 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
664 wake_lock(&charger
->wpc_vout_mode_lock
);
665 queue_delayed_work(charger
->wqueue
,
666 &charger
->wpc_vout_mode_work
, 0);
667 pr_info("%s vout read = %d\n", __func__
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
669 mfc_reg_read(charger
->client
, MFC_AP2BT_DATA_COM_REG
, &data_val
[0]);
670 mfc_reg_read(charger
->client
, MFC_AP2BT_DATA_VALUE0_REG
, &data_val
[0]);
671 mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &data_val
[0]);
673 pr_info("%s: WPC/PMA set 5V\n", __func__
);
674 cmd
= WPC_COM_AFC_SET
;
675 data_val
[0] = 0x05; /* Value for WPC AFC_SET 5V */
676 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
679 charger
->vout_mode
= WIRELESS_VOUT_5V
;
680 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
681 wake_lock(&charger
->wpc_vout_mode_lock
);
682 queue_delayed_work(charger
->wqueue
,
683 &charger
->wpc_vout_mode_work
, 0);
684 pr_info("%s vout read = %d\n", __func__
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
686 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_COM_REG
, &data_val
[0]);
687 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_VALUE0_REG
, &data_val
[0]);
688 mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &data_val
[0]);
691 case MFC_AFC_CONF_10V
:
692 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) { /* PAD : A4WP */
693 pr_info("%s: A4WP set 10V\n", __func__
);
694 cmd
= AP2BT_COM_AFC_MODE
;
695 data_val
[0] = 0x01; /* Value for A4WP AFC_SET 10V */
696 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
699 charger
->vout_mode
= WIRELESS_VOUT_10V
;
700 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
701 wake_lock(&charger
->wpc_vout_mode_lock
);
702 queue_delayed_work(charger
->wqueue
,
703 &charger
->wpc_vout_mode_work
, 0);
704 pr_info("%s vout read = %d\n", __func__
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
706 mfc_reg_read(charger
->client
, MFC_AP2BT_DATA_COM_REG
, &data_val
[0]);
707 mfc_reg_read(charger
->client
, MFC_AP2BT_DATA_VALUE0_REG
, &data_val
[0]);
708 mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &data_val
[0]);
709 } else { /* PAD : WPC, PMA */
710 pr_info("%s: WPC set 10V\n", __func__
);
711 //trigger 10V vout work after 8sec
712 wake_lock(&charger
->wpc_afc_vout_lock
);
713 #if defined(CONFIG_SEC_FACTORY)
714 queue_delayed_work(charger
->wqueue
, &charger
->wpc_afc_vout_work
, msecs_to_jiffies(0));
716 queue_delayed_work(charger
->wqueue
, &charger
->wpc_afc_vout_work
, msecs_to_jiffies(8000));
720 case MFC_LED_CONTROL_ON
:
721 pr_info("%s led on\n", __func__
);
722 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
723 cmd
= AP2BT_COM_LED_CONTROL
;
724 data_val
[0] = 0x00; /* Value for A4WP LED ON */
726 cmd
= WPC_COM_LED_CONTROL
;
727 data_val
[0] = 0x00; /* Value for WPC LED ON */
729 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
731 case MFC_LED_CONTROL_OFF
:
732 pr_info("%s led off\n", __func__
);
733 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
734 cmd
= AP2BT_COM_LED_CONTROL
;
735 data_val
[0] = 0xff; /* Value for A4WP LED OFF */
737 cmd
= WPC_COM_LED_CONTROL
;
738 data_val
[0] = 0xff; /* Value for WPC LED OFF */
740 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
742 case MFC_FAN_CONTROL_ON
:
743 pr_info("%s fan on\n", __func__
);
744 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
745 cmd
= AP2BT_COM_COOLING_CTRL
;
746 data_val
[0] = 0x00; /* Value for A4WP FAN ON */
748 cmd
= WPC_COM_COOLING_CTRL
;
749 data_val
[0] = 0x00; /* Value for WPC FAN ON */
751 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
753 case MFC_FAN_CONTROL_OFF
:
754 pr_info("%s fan off\n", __func__
);
755 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
756 cmd
= AP2BT_COM_COOLING_CTRL
;
757 data_val
[0] = 0xff; /* Value for A4WP FAN OFF */
759 cmd
= WPC_COM_COOLING_CTRL
;
760 data_val
[0] = 0xff; /* Value for WPC FAN OFF */
762 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
765 case MFC_REQUEST_AFC_TX
:
766 pr_info("%s request afc tx, cable(0x%x)\n", __func__
, charger
->pdata
->cable_type
);
767 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
768 cmd
= AP2BT_COM_REQ_AFC_TX
;
769 data_val
[0] = 0x00; /* Value for A4WP Request AFC_TX */
771 cmd
= WPC_COM_REQ_AFC_TX
;
772 data_val
[0] = 0x00; /* Value for WPC Request AFC_TX */
774 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
776 case MFC_REQUEST_TX_ID
:
777 pr_info("%s request TX ID\n", __func__
);
778 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
779 cmd
= AP2BT_COM_TX_ID
;
780 data_val
[0] = 0x00; /* Value for A4WP TX ID */
783 data_val
[0] = 0x00; /* Value for WPC TX ID */
785 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
788 pr_info("%s Enter PHM\n", __func__
);
789 cmd
= WPC_COM_ENTER_PHM
;
790 data_val
[0] = 0x01; /* Enter PHM */
791 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
798 void mfc_led_control(struct mfc_charger_data
*charger
, bool on
)
803 for(i
=0; i
< CMD_CNT
; i
++)
804 mfc_send_command(charger
, MFC_LED_CONTROL_ON
);
806 for(i
=0; i
< CMD_CNT
; i
++)
807 mfc_send_command(charger
, MFC_LED_CONTROL_OFF
);
811 void mfc_fan_control(struct mfc_charger_data
*charger
, bool on
)
816 for(i
=0; i
< CMD_CNT
-1; i
++)
817 mfc_send_command(charger
, MFC_FAN_CONTROL_ON
);
819 for(i
=0; i
< CMD_CNT
-1; i
++)
820 mfc_send_command(charger
, MFC_FAN_CONTROL_OFF
);
824 void mfc_set_vrect_adjust(struct mfc_charger_data
*charger
, int set
)
831 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x0);
837 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x36);
843 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x61);
849 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x7f);
855 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x06);
861 mfc_reg_write(charger
->client
, MFC_VRECT_ADJ_REG
, 0x10);
866 pr_info("%s no headroom mode\n", __func__
);
871 void mfc_mis_align(struct mfc_charger_data
*charger
)
873 pr_info("%s: Reset M0\n",__func__
);
874 if (charger
->pdata
->cable_type
== MFC_PAD_WPC_AFC
||
875 charger
->pdata
->cable_type
== MFC_PAD_PMA
)
876 /* reset MCU of MFC IC */
877 mfc_set_cmd_l_reg(charger
, MFC_CMD_MCU_RESET_MASK
, MFC_CMD_MCU_RESET_MASK
);
880 static int datacmp(const char *cs
, const char *ct
, int count
)
882 unsigned char c1
, c2
;
888 pr_err("%s, cnt %d\n", __func__
, count
);
889 return c1
< c2
? -1 : 1;
896 static int mfc_reg_multi_write_verify(struct i2c_client
*client
, u16 reg
, const u8
* val
, int size
)
899 const int sendsz
= 16;
902 unsigned char data
[sendsz
+2];
905 // dev_dbg(&client->dev, "%s: size: 0x%x\n", __func__, size);
906 while(size
> sendsz
) {
907 data
[0] = (reg
+cnt
) >>8;
908 data
[1] = (reg
+cnt
) & 0xff;
909 memcpy(data
+2, val
+cnt
, sendsz
);
910 // dev_dbg(&client->dev, "%s: addr: 0x%x, cnt: 0x%x\n", __func__, reg+cnt, cnt);
911 ret
= i2c_master_send(client
, data
, sendsz
+2);
912 if (ret
< sendsz
+2) {
913 pr_err("%s: i2c write error, reg: 0x%x\n", __func__
, reg
);
914 return ret
< 0 ? ret
: -EIO
;
916 if (mfc_reg_multi_read(client
, reg
+cnt
, rdata
, sendsz
) < 0) {
917 pr_err("%s, read failed(%d)\n", __func__
, reg
+cnt
);
920 if (datacmp(val
+cnt
, rdata
, sendsz
)) {
921 pr_err("%s, data is not matched. retry(%d)\n", __func__
, retry_cnt
);
924 pr_err("%s, data is not matched. write failed\n", __func__
);
930 // pr_debug("%s, data is matched!\n", __func__);
936 data
[0] = (reg
+cnt
) >>8;
937 data
[1] = (reg
+cnt
) & 0xff;
938 memcpy(data
+2, val
+cnt
, size
);
939 // dev_dbg(&client->dev, "%s: addr: 0x%x, cnt: 0x%x, size: 0x%x\n", __func__, reg+cnt, cnt, size);
940 ret
= i2c_master_send(client
, data
, size
+2);
942 pr_err("%s: i2c write error, reg: 0x%x\n", __func__
, reg
);
943 return ret
< 0 ? ret
: -EIO
;
945 if (mfc_reg_multi_read(client
, reg
+cnt
, rdata
, size
) < 0) {
946 pr_err("%s, read failed(%d)\n", __func__
, reg
+cnt
);
949 if (datacmp(val
+cnt
, rdata
, size
)) {
950 pr_err("%s, data is not matched. retry(%d)\n", __func__
, retry_cnt
);
953 pr_err("%s, data is not matched. write failed\n", __func__
);
960 pr_err("%s, data is matched!\n", __func__
);
965 static int mfc_reg_multi_write(struct i2c_client
*client
, u16 reg
, const u8
* val
, int size
)
967 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
969 const int sendsz
= 16;
970 unsigned char data
[sendsz
+2];
973 pr_err("%s: size: 0x%x\n",
975 while(size
> sendsz
) {
976 data
[0] = (reg
+cnt
) >>8;
977 data
[1] = (reg
+cnt
) & 0xff;
978 memcpy(data
+2, val
+cnt
, sendsz
);
979 mutex_lock(&charger
->io_lock
);
980 ret
= i2c_master_send(client
, data
, sendsz
+2);
981 mutex_unlock(&charger
->io_lock
);
982 if (ret
< sendsz
+2) {
983 pr_err("%s: i2c write error, reg: 0x%x\n",
985 return ret
< 0 ? ret
: -EIO
;
988 size
= size
- sendsz
;
991 data
[0] = (reg
+cnt
) >>8;
992 data
[1] = (reg
+cnt
) & 0xff;
993 memcpy(data
+2, val
+cnt
, size
);
994 mutex_lock(&charger
->io_lock
);
995 ret
= i2c_master_send(client
, data
, size
+2);
996 mutex_unlock(&charger
->io_lock
);
998 dev_err(&client
->dev
, "%s: i2c write error, reg: 0x%x\n",
1000 return ret
< 0 ? ret
: -EIO
;
1007 static int LoadOTPLoaderInRAM(struct mfc_charger_data
*charger
, u16 addr
)
1011 if (mfc_reg_multi_write_verify(charger
->client
, addr
, MTPBootloader9320
, sizeof(MTPBootloader9320
)) < 0) {
1012 pr_err("%s,fail", __func__
);
1014 size
= sizeof(MTPBootloader9320
);
1017 if (mfc_reg_multi_read(charger
->client
, addr
+i
, data
+i
, 16) < 0) {
1018 pr_err("%s, read failed(%d)", __func__
, addr
+i
);
1024 size
= sizeof(MTPBootloader9320
);
1025 if (datacmp(data
, MTPBootloader9320
, size
)) {
1026 pr_err("%s, data is not matched\n", __func__
);
1032 static int mfc_firmware_verify(struct mfc_charger_data
*charger
)
1035 const u16 sendsz
= 16;
1041 /* I2C WR to prepare boot-loader write */
1043 if (mfc_reg_write(charger
->client
, 0x3000, 0x5a) < 0) {
1044 pr_err("%s: key error\n", __func__
);
1048 if (mfc_reg_write(charger
->client
, 0x3040, 0x11) < 0) {
1049 pr_err("%s: halt M0, OTP_I2C_EN set error\n", __func__
);
1053 dev_err(&charger
->client
->dev
, "%s, request_firmware\n", __func__
);
1054 ret
= request_firmware(&charger
->firm_data_bin
, MFC_FLASH_FW_HEX_PATH
,
1055 &charger
->client
->dev
);
1057 dev_err(&charger
->client
->dev
, "%s: failed to request firmware %s (%d) \n",
1058 __func__
, MFC_FLASH_FW_HEX_PATH
, ret
);
1062 wake_lock(&charger
->wpc_update_lock
);
1063 for (i
= 0; i
< charger
->firm_data_bin
->size
; i
+= sendsz
) {
1064 block_len
= (i
+ sendsz
) > charger
->firm_data_bin
->size
? charger
->firm_data_bin
->size
- i
: sendsz
;
1065 block_addr
= 0x8000 + i
;
1067 if (mfc_reg_multi_read(charger
->client
, block_addr
, rdata
, block_len
) < 0) {
1068 pr_err("%s, read failed\n", __func__
);
1072 if (datacmp(charger
->firm_data_bin
->data
+ i
, rdata
, block_len
)) {
1073 pr_err("%s, verify data is not matched. block_len(%d), block_addr(%d)\n",
1074 __func__
, block_len
, block_addr
);
1079 release_firmware(charger
->firm_data_bin
);
1081 wake_unlock(&charger
->wpc_update_lock
);
1085 bool WriteWordToMtp(struct mfc_charger_data
*charger
, u16 StartAddr
, u32 data
)
1089 u16 CheckSum
= StartAddr
;
1091 //*(u32*)&sBuf[8] = data;
1092 sBuf
[8] = (u8
)(data
>> 0);
1093 sBuf
[9] = (u8
)(data
>> 8);
1094 sBuf
[10] = (u8
)(data
>> 16);
1095 sBuf
[11] = (u8
)(data
>> 24);
1097 pr_info("%s: changed sBuf codes\n", __func__
);
1098 for (j
= 3; j
>= 0; j
--)
1099 CheckSum
+= sBuf
[j
+ 8]; // add the non zero values
1100 CheckSum
+= CodeLength
; // finish calculation of the check sum
1101 //*(u16*)&sBuf[2] = StartAddr;
1102 //*(u16*)&sBuf[4] = CodeLength;
1103 //*(u16*)&sBuf[6] = CheckSum;
1104 sBuf
[2] = (u8
)(StartAddr
>> 0);
1105 sBuf
[3] = (u8
)(StartAddr
>> 8);
1106 sBuf
[4] = (u8
)(CodeLength
>> 0);
1107 sBuf
[5] = (u8
)(CodeLength
>> 8);
1108 sBuf
[6] = (u8
)(CheckSum
>> 0);
1109 sBuf
[7] = (u8
)(CheckSum
>> 8);
1111 if (mfc_reg_multi_write(charger
->client
, 0x400, sBuf
, 4 + 8) < 0)
1113 pr_err("ERROR: on writing to OTP buffer");
1118 if (mfc_reg_write(charger
->client
, 0x400, sBuf
[0]) < 0)
1120 pr_err("ERROR: on OTP buffer validation");
1127 if (mfc_reg_read(charger
->client
, 0x400, sBuf
) < 0)
1129 pr_err("ERROR: on readign OTP buffer status(%d)", cnt
);
1134 pr_err("ERROR: time out on buffer program to OTP");
1138 } while ((sBuf
[0]&1) != 0);
1140 if (sBuf
[0] != 2) // not OK
1142 pr_err("ERROR: buffer write to OTP returned status %d ",sBuf
[0]);
1148 static int PgmOTPwRAM_IDT(struct mfc_charger_data
*charger
, unsigned short OtpAddr
,
1149 const u8
* srcData
, int srcOffs
, int size
)
1152 u8 fw_major
[2] = {0,};
1153 u8 fw_minor
[2] = {0,};
1155 mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_L_REG
, &fw_major
[0]);
1156 mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_H_REG
, &fw_major
[1]);
1157 mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_L_REG
, &fw_minor
[0]);
1158 mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_H_REG
, &fw_minor
[1]);
1161 if (mfc_reg_write(charger
->client
, 0x3000, 0x5a) < 0) {
1162 pr_err("%s: write key error\n", __func__
);
1163 return false; // write key
1166 if (mfc_reg_write(charger
->client
, 0x3040, 0x10) < 0) {
1167 pr_err("%s: halt M0 error\n", __func__
);
1168 return false; // halt M0
1171 if (!LoadOTPLoaderInRAM(charger
, 0x1c00)){
1172 pr_err("%s: LoadOTPLoaderInRAM error\n", __func__
);
1173 return false; // make sure load address and 1KB size are OK
1177 // Clear MTP program status byte
1178 if (mfc_reg_write(charger
->client
, 0x0400, 0x00) < 0) {
1179 pr_err("%s: clear MTP programming status byte error\n", __func__
);
1183 if (mfc_reg_write(charger
->client
, 0x3048, 0x80) < 0) {
1184 pr_err("%s: map RAM to OTP error\n", __func__
);
1185 return false; // map RAM to OTP
1188 // Check Key lock state
1189 mfc_reg_write(charger
->client
, 0x3040, 0x80); //M0 RESET : P9320 will not acknowledge for this transaction !!
1192 pr_info("%s: start to write f/w bin to mtp\n", __func__
);
1193 for (i
= 0; i
< size
; i
+= 128) // program pages of 128 bytes
1195 u8 sBuf
[144] = {0,}; // align size in 16 bytes boundary. may not be important for SS
1196 u16 StartAddr
= (u16
)i
;
1197 u16 CheckSum
= StartAddr
;
1198 u16 CodeLength
= 128;
1200 memcpy(sBuf
+ 8, srcData
+ i
+ srcOffs
, 128);
1202 if (i
== 0x1480) { // the FW rev address for rev 58 is 0x14a8. 0x1280 is the half page base address.
1203 //*(u32*)&sBuf[8 + 0x28] = 0;
1210 j
= size
- i
; // calculate how many bytes need to be programmed in the current run and round up to 16
1214 j
= ((j
+ 15) / 16) * 16;
1215 CodeLength
= (u16
)j
;
1221 j
-= 1; // compensate for index
1224 CheckSum
+= sBuf
[j
+8]; // add the non zero values
1225 CheckSum
+= CodeLength
; // finish calculation of the check sum
1226 memcpy(sBuf
+2, &StartAddr
, 2);
1227 memcpy(sBuf
+4, &CodeLength
, 2);
1228 memcpy(sBuf
+6, &CheckSum
, 2);
1230 // FOR REFERENCE HERE IS THE DATA STRUCTURE
1237 //} P9320PgmStrType; // the structure is located at address 0x400
1239 // TODO sBuf[0] = 0x00; // done during initialization.
1241 if (mfc_reg_multi_write(charger
->client
, 0x400, sBuf
, ((CodeLength
+8+15)/16)*16) < 0)
1242 { // TODO the write size is aligned to 16 bytes. SS may not need to do this.
1243 pr_err("ERROR: on writing to OTP buffer");
1246 sBuf
[0] = 0x01; // TODO write 0x11 if Vrect is powered from 5V
1247 //write 0x31 if Vrect is powered from 8.2V
1248 //write 0x01 if Vrect is 5V and there is a problem
1250 if (mfc_reg_write(charger
->client
, 0x400, sBuf
[0]) < 0)
1252 pr_err("ERROR: on OTP buffer validation");
1259 if (mfc_reg_read(charger
->client
, 0x400, sBuf
) < 0)
1261 pr_err("ERROR: on readign OTP buffer status(%d)", cnt
);
1265 pr_err("ERROR: time out on buffer program to OTP");
1269 } while ((sBuf
[0]&1) != 0);
1270 if (sBuf
[0] != 2) // not OK
1272 pr_err("ERROR: buffer write to OTP returned status %d in sector 0x%x ",sBuf
[0], i
);
1277 pr_info("%s: write current f/w rev (0x%x)\n", __func__
, MFC_FW_BIN_FULL_VERSION
);
1278 if (!WriteWordToMtp(charger
, MFC_FW_BIN_VERSION_ADDR
, MFC_FW_BIN_FULL_VERSION
)) {
1279 // The address for fw rev 58 is 0x14a8
1280 pr_err("ERROR: on writing FW rev to MTP\n");
1285 if (mfc_reg_write(charger
->client
, 0x3000, 0x5a) < 0) {
1286 pr_err("%s: write key error..\n", __func__
);
1287 return false; // write key
1291 if (mfc_reg_write(charger
->client
, 0x3048, 0x00) < 0) {
1292 pr_err("%s: remove code remapping error..\n", __func__
);
1293 return false; // remove code remapping
1296 pr_err("OTP Programming finished in");
1297 pr_info("%s------------------------------------------------- \n", __func__
);
1301 static int mfc_write_fw_flash_LSI(struct mfc_charger_data
*charger
, u8 addr_l
, u8 addr_h
, u8
*wdata
)
1303 if (mfc_reg_write(charger
->client
, 0x1F11, 0x04) < 0) {
1304 pr_err("%s: failed to write 0x04 at 0x1F11\n", __func__
);
1307 if (mfc_reg_write(charger
->client
, 0x1F12, addr_l
) < 0) {
1308 pr_err("%s: failed to write addr_l(0x%x) at 0x1F11\n", __func__
, addr_l
);
1311 if (mfc_reg_write(charger
->client
, 0x1F13, addr_h
) < 0) {
1312 pr_err("%s: failed to write addr_h(0x%x) at 0x1F11\n", __func__
, addr_h
);
1315 if (mfc_reg_write(charger
->client
, 0x1F14, wdata
[0]) < 0) {
1316 pr_err("%s: failed to write wdata[0]\n", __func__
);
1319 if (mfc_reg_write(charger
->client
, 0x1F15, wdata
[1]) < 0) {
1320 pr_err("%s: failed to write wdata[1]\n", __func__
);
1323 if (mfc_reg_write(charger
->client
, 0x1F16, wdata
[2]) < 0) {
1324 pr_err("%s: failed to write wdata[2]\n", __func__
);
1327 if (mfc_reg_write(charger
->client
, 0x1F17, wdata
[3]) < 0) {
1328 pr_err("%s: failed to write wdata[3]\n", __func__
);
1331 if (mfc_reg_write(charger
->client
, 0x1F10, 0x42) < 0) {
1332 pr_err("%s: failed to write 0x42 at 0x1F10\n", __func__
);
1339 #define LSI_MFC_FW_FLASH_START_ADDR 0x1000
1340 static int PgmOTPwRAM_LSI(struct mfc_charger_data
*charger
, unsigned short OtpAddr
,
1341 const u8
* srcData
, int srcOffs
, int size
)
1344 u8 fw_major
[2] = {0,};
1345 u8 fw_minor
[2] = {0,};
1347 // static int startAddr;
1351 mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_L_REG
, &fw_major
[0]);
1352 mfc_reg_read(charger
->client
, MFC_FW_MAJOR_REV_H_REG
, &fw_major
[1]);
1353 mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_L_REG
, &fw_minor
[0]);
1354 mfc_reg_read(charger
->client
, MFC_FW_MINOR_REV_H_REG
, &fw_minor
[1]);
1356 pr_info("%s: Enter the flash mode (0x1F10)\n", __func__
);
1357 if (mfc_reg_write(charger
->client
, 0x1F10, 0x10) < 0) {
1358 pr_err("%s: failed to enter the flash mode\n", __func__
);
1362 pr_info("%s: Erase the flash memory\n", __func__
);
1363 if (mfc_reg_write(charger
->client
, 0x1F10, 0x44) < 0) {
1364 pr_err("%s: failed to erase flash\n", __func__
);
1368 msleep(250); /* erasing flash needs 200ms delay at least */
1370 pr_info("%s: write fwimg by 4 bytes \n", __func__
);
1372 for (addr
= 0x00; addr
< size
; addr
+= 4) // program pages of 4bytes
1374 temp
= (0x1000 + addr
) & 0xff;
1376 temp
= (((0x1000 + addr
) & 0xff00) >> 8);
1378 pr_info("%s: addr_h(0x%x), addr_l(0x%x)\n", __func__
, addr_h
, addr_l
);
1379 memcpy(wdata
, srcData
+ LSI_MFC_FW_FLASH_START_ADDR
+ addr
, 4);
1381 mfc_write_fw_flash_LSI(charger
, addr_l
, addr_h
, wdata
);
1384 pr_info("%s: write fw length --------------------\n", __func__
);
1385 wdata
[0] = 0x8C; /* length */
1389 mfc_write_fw_flash_LSI(charger
, 0xf4, 0x6f, wdata
);
1391 pr_info("%s: write fw checksum --------------------\n", __func__
);
1392 wdata
[0] = 0x90; /* checksum */
1396 mfc_write_fw_flash_LSI(charger
, 0xf8, 0x6f, wdata
);
1398 pr_info("%s: write fw version --------------------\n", __func__
);
1399 wdata
[0] = 0x00; /* fw major rev l */
1400 wdata
[1] = 0x00; /* fw major rev h */
1401 wdata
[2] = 0x05; /* fw minor rev l */
1402 wdata
[3] = 0x11; /* fw minor rev h */
1403 mfc_write_fw_flash_LSI(charger
, 0x00, 0x6f, wdata
);
1405 pr_info("%s: write fw date and timer code --------------------\n", __func__
);
1406 wdata
[0] = 0x4A; /* J , date code start */
1407 wdata
[1] = 0x75; /* u */
1408 wdata
[2] = 0x6E; /* n */
1409 wdata
[3] = 0x20; /* space */
1410 mfc_write_fw_flash_LSI(charger
, 0x04, 0x6f, wdata
);
1411 wdata
[0] = 0x31; /* 1 */
1412 wdata
[1] = 0x35; /* 5 */
1413 wdata
[2] = 0x20; /* space */
1414 wdata
[3] = 0x32; /* 2 */
1415 mfc_write_fw_flash_LSI(charger
, 0x08, 0x6f, wdata
);
1416 wdata
[0] = 0x30; /* 0 */
1417 wdata
[1] = 0x31; /* 1 */
1418 wdata
[2] = 0x36; /* 6 */
1419 wdata
[3] = 0x31; /* 1 , timer code start */
1420 mfc_write_fw_flash_LSI(charger
, 0x0c, 0x6f, wdata
);
1421 wdata
[0] = 0x33; /* 3 */
1422 wdata
[1] = 0x3A; /* : */
1423 wdata
[2] = 0x30; /* 0 */
1424 wdata
[3] = 0x30; /* 0 */
1425 mfc_write_fw_flash_LSI(charger
, 0x10, 0x6f, wdata
);
1426 wdata
[0] = 0x3A; /* : */
1427 wdata
[1] = 0x30; /* 0 */
1428 wdata
[2] = 0x30; /* 0 */
1429 wdata
[3] = 0x00; /* reserved */
1430 mfc_write_fw_flash_LSI(charger
, 0x14, 0x6f, wdata
);
1432 pr_info("%s: write flash done flag --------------------*\n", __func__
);
1437 mfc_write_fw_flash_LSI(charger
, 0xfc, 0x6f, wdata
);
1440 pr_info("%s: Enter the normal mode\n", __func__
);
1441 if (mfc_reg_write(charger
->client
, 0x1F10, 0x20) < 0) {
1442 pr_err("%s: failed to enter the normal mode\n", __func__
);
1449 static void mfc_uno_on(struct mfc_charger_data
*charger
, bool onoff
)
1451 union power_supply_propval value
= {0, };
1453 if (onoff
) { /* UNO ON */
1454 psy_do_property("otg", get
,
1455 POWER_SUPPLY_PROP_ONLINE
, value
);
1457 charger
->is_otg_on
= true;
1458 psy_do_property(charger
->pdata
->wired_charger_name
, set
,
1459 POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
, value
);
1460 pr_info("%s CHGIN_OTG on, check OTG flag\n", __func__
);
1462 charger
->is_otg_on
= false;
1464 psy_do_property(charger
->pdata
->wired_charger_name
, set
,
1465 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
1466 pr_info("%s: ENABLE\n", __func__
);
1467 } else { /* UNO OFF */
1469 psy_do_property(charger
->pdata
->wired_charger_name
, set
,
1470 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
1471 psy_do_property("battery", get
,
1472 POWER_SUPPLY_PROP_ONLINE
, value
);
1474 if ((charger
->is_otg_on
) &&
1475 value
.intval
== SEC_BATTERY_CABLE_OTG
) { /* OTG status has to be recovered */
1477 psy_do_property(charger
->pdata
->wired_charger_name
, set
,
1478 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
1479 pr_info("%s CHGIN_OTG was ON, recover OTG status\n", __func__
);
1481 charger
->is_otg_on
= false;
1482 pr_info("%s: DISABLE\n", __func__
);
1486 static void mfc_wpc_cm_fet_work(struct work_struct
*work
)
1488 struct mfc_charger_data
*charger
=
1489 container_of(work
, struct mfc_charger_data
, wpc_cm_fet_work
.work
);
1492 /* disable all CM FETs for MST operation */
1493 mfc_reg_write(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, 0xf0);
1494 mfc_reg_read(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, &tmp
);
1495 pr_info("%s: disable CM FET (0x%x)\n", __func__
, tmp
);
1498 static void mfc_wpc_afc_vout_work(struct work_struct
*work
)
1500 struct mfc_charger_data
*charger
=
1501 container_of(work
, struct mfc_charger_data
, wpc_afc_vout_work
.work
);
1505 union power_supply_propval value
= {0, };
1507 pr_info("%s start\n", __func__
);
1509 /* change cable type */
1510 if (charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
)
1511 value
.intval
= SEC_WIRELESS_PAD_WPC_STAND_HV
;
1512 else if (charger
->pdata
->cable_type
== MFC_PAD_WPC_VEHICLE_HV
)
1513 value
.intval
= SEC_WIRELESS_PAD_VEHICLE_HV
;
1514 else if (charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
)
1515 value
.intval
= SEC_WIRELESS_PAD_WPC_PACK_HV
;
1517 charger
->pdata
->cable_type
= MFC_PAD_WPC_AFC
;
1518 value
.intval
= SEC_WIRELESS_PAD_WPC_HV
;
1520 psy_do_property("wireless", set
,
1521 POWER_SUPPLY_PROP_ONLINE
, value
);
1523 #if defined(CONFIG_BATTERY_SWELLING)
1524 /* check swelling mode */
1525 psy_do_property("battery", get
,
1526 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT
, value
);
1527 pr_info("%s: check swelling mode(%d)\n", __func__
, value
.intval
);
1530 goto skip_set_afc_vout
;
1533 for(i
= 0; i
< CMD_CNT
; i
++) {
1534 cmd
= WPC_COM_AFC_SET
;
1535 data_val
[0] = 0x2c; /* Value for WPC AFC_SET 10V */
1536 pr_info("%s set 10V , cnt = %d \n", __func__
, i
);
1537 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
1538 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_COM_REG
, &data_val
[0]);
1539 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_VALUE0_REG
, &data_val
[0]);
1540 mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &data_val
[0]);
1543 charger
->is_afc_tx
= true;
1544 pr_info("%s: is_afc_tx = %d vout read = %d\n",
1545 __func__
, charger
->is_afc_tx
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
1547 /* use all CM FETs for 10V wireless charging */
1548 mfc_reg_write(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, 0x00);
1549 mfc_reg_read(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, &cmd
);
1550 pr_info("%s: CM FET setting(0x%x) \n", __func__
, cmd
);
1552 psy_do_property("otg", get
,
1553 POWER_SUPPLY_PROP_ONLINE
, value
);
1554 pr_info("%s: check state(%d, %d, %d)\n", __func__
,
1555 charger
->vout_mode
, charger
->pdata
->vout_status
, value
.intval
);
1557 if (!charger
->is_full_status
&& !value
.intval
&&
1558 charger
->vout_mode
!= WIRELESS_VOUT_5V
&&
1559 charger
->vout_mode
!= WIRELESS_VOUT_5V_STEP
) {
1560 charger
->vout_mode
= WIRELESS_VOUT_10V
;
1561 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
1562 wake_lock(&charger
->wpc_vout_mode_lock
);
1563 queue_delayed_work(charger
->wqueue
,
1564 &charger
->wpc_vout_mode_work
, 0);
1567 #if defined(CONFIG_BATTERY_SWELLING)
1570 wake_unlock(&charger
->wpc_afc_vout_lock
);
1573 static void mfc_wpc_fw_update_work(struct work_struct
*work
)
1575 struct mfc_charger_data
*charger
=
1576 container_of(work
, struct mfc_charger_data
, wpc_fw_update_work
.work
);
1579 mm_segment_t old_fs
;
1585 char fwtime
[8] = {32, 32, 32, 32, 32, 32, 32, 32};
1586 char fwdate
[8] = {32, 32, 32, 32, 32, 32, 32, 32};
1587 u8 data
= 32; /* ascii space */
1589 pr_info("%s firmware update mode is = %d \n", __func__
, charger
->fw_cmd
);
1590 switch(charger
->fw_cmd
) {
1591 case SEC_WIRELESS_RX_SDCARD_MODE
:
1592 mfc_uno_on(charger
, true);
1593 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_DOWNLOADING
;
1595 disable_irq(charger
->pdata
->irq_wpc_int
);
1596 disable_irq(charger
->pdata
->irq_wpc_det
);
1600 fp
= filp_open(MFC_FW_SDCARD_BIN_PATH
, O_RDONLY
, S_IRUSR
);
1603 pr_err("%s: failed to open %s, (%d)\n", __func__
, MFC_FW_SDCARD_BIN_PATH
, IS_ERR(fp
));
1608 fsize
= fp
->f_path
.dentry
->d_inode
->i_size
;
1609 pr_err("%s: start, file path %s, size %ld Bytes\n",
1610 __func__
, MFC_FW_SDCARD_BIN_PATH
, fsize
);
1612 fw_img
= kmalloc(fsize
, GFP_KERNEL
);
1614 if (fw_img
== NULL
) {
1615 pr_err("%s, kmalloc failed\n", __func__
);
1619 nread
= vfs_read(fp
, (char __user
*)fw_img
,
1621 pr_err("nread %ld Bytes\n", nread
);
1622 if (nread
!= fsize
) {
1623 pr_err("failed to read firmware file, nread %ld Bytes\n", nread
);
1627 filp_close(fp
, current
->files
);
1629 mfc_get_chip_id(charger
);
1630 pr_info("%s chip_id(%d) \n", __func__
, charger
->chip_id
);
1633 if (charger
->chip_id
== MFC_CHIP_LSI
) {
1634 pr_info("%s: S.LSI MFC IC doesn't support sdcard f/w update\n", __func__
);
1637 else /* MFC_CHIP_IDT */
1638 ret
= PgmOTPwRAM_IDT(charger
, 0 ,fw_img
, 0, fsize
);
1640 charger
->pdata
->otp_firmware_ver
= mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
);
1641 charger
->pdata
->wc_ic_grade
= mfc_get_ic_revision(charger
, MFC_IC_FONT
);
1642 charger
->pdata
->wc_ic_rev
= mfc_get_ic_revision(charger
, MFC_IC_REVISION
);
1645 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_PASS
;
1647 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_FAIL
;
1650 enable_irq(charger
->pdata
->irq_wpc_int
);
1651 enable_irq(charger
->pdata
->irq_wpc_det
);
1653 case SEC_WIRELESS_RX_BUILT_IN_MODE
:
1654 mfc_uno_on(charger
, true);
1655 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_DOWNLOADING
;
1657 disable_irq(charger
->pdata
->irq_wpc_int
);
1658 disable_irq(charger
->pdata
->irq_wpc_det
);
1659 dev_err(&charger
->client
->dev
, "%s, request_firmware\n", __func__
);
1660 ret
= request_firmware(&charger
->firm_data_bin
, MFC_FLASH_FW_HEX_PATH
,
1661 &charger
->client
->dev
);
1663 dev_err(&charger
->client
->dev
, "%s: failed to request firmware %s (%d) \n", __func__
, MFC_FLASH_FW_HEX_PATH
, ret
);
1664 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_FAIL
;
1667 wake_lock(&charger
->wpc_update_lock
);
1668 mfc_get_chip_id(charger
);
1669 pr_info("%s data size = %ld, chip_id(%d) \n", __func__
, charger
->firm_data_bin
->size
, charger
->chip_id
);
1671 if (charger
->chip_id
== MFC_CHIP_LSI
)
1672 ret
= PgmOTPwRAM_LSI(charger
, 0 ,charger
->firm_data_bin
->data
, 0, charger
->firm_data_bin
->size
);
1673 else /* MFC_CHIP_IDT */
1674 ret
= PgmOTPwRAM_IDT(charger
, 0 ,charger
->firm_data_bin
->data
, 0, charger
->firm_data_bin
->size
);
1676 release_firmware(charger
->firm_data_bin
);
1678 for(i
= 0; i
< 8; i
++) {
1679 if (mfc_reg_read(charger
->client
, MFC_FW_DATA_CODE_0
+i
, &data
) > 0)
1680 fwdate
[i
] = (char)data
;
1682 for(i
= 0; i
< 8; i
++) {
1683 if (mfc_reg_read(charger
->client
, MFC_FW_TIMER_CODE_0
+i
, &data
) > 0)
1684 fwtime
[i
] = (char)data
;
1686 pr_info("%s: %d%d%d%d%d%d%d%d, %d%d%d%d%d%d%d%d\n", __func__
,
1687 fwdate
[0], fwdate
[1], fwdate
[2],fwdate
[3], fwdate
[4], fwdate
[5], fwdate
[6], fwdate
[7],
1688 fwtime
[0], fwtime
[1], fwtime
[2],fwtime
[3], fwtime
[4], fwtime
[5], fwtime
[6], fwtime
[7]);
1690 charger
->pdata
->otp_firmware_ver
= mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
);
1691 charger
->pdata
->wc_ic_grade
= mfc_get_ic_revision(charger
, MFC_IC_FONT
);
1692 charger
->pdata
->wc_ic_rev
= mfc_get_ic_revision(charger
, MFC_IC_REVISION
);
1695 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_PASS
;
1697 charger
->pdata
->otp_firmware_result
= MFC_FW_RESULT_FAIL
;
1699 for(i
= 0; i
< 8; i
++) {
1700 if (mfc_reg_read(charger
->client
, MFC_FW_DATA_CODE_0
+i
, &data
) > 0)
1701 fwdate
[i
] = (char)data
;
1703 for(i
= 0; i
< 8; i
++) {
1704 if (mfc_reg_read(charger
->client
, MFC_FW_TIMER_CODE_0
+i
, &data
) > 0)
1705 fwtime
[i
] = (char)data
;
1707 pr_info("%s: %d%d%d%d%d%d%d%d, %d%d%d%d%d%d%d%d\n", __func__
,
1708 fwdate
[0], fwdate
[1], fwdate
[2],fwdate
[3], fwdate
[4], fwdate
[5], fwdate
[6], fwdate
[7],
1709 fwtime
[0], fwtime
[1], fwtime
[2],fwtime
[3], fwtime
[4], fwtime
[5], fwtime
[6], fwtime
[7]);
1711 enable_irq(charger
->pdata
->irq_wpc_int
);
1712 enable_irq(charger
->pdata
->irq_wpc_det
);
1713 wake_unlock(&charger
->wpc_update_lock
);
1715 case SEC_WIRELESS_TX_ON_MODE
:
1716 charger
->pdata
->cable_type
= MFC_PAD_TX
;
1718 case SEC_WIRELESS_TX_OFF_MODE
:
1721 case SEC_WIRELESS_RX_INIT
:
1729 mfc_uno_on(charger
, false);
1730 pr_info("%s --------------------------------------------------------------- \n", __func__
);
1737 filp_close(fp
, current
->files
);
1740 mfc_uno_on(charger
, false);
1743 /*#if !defined(CONFIG_SEC_FACTORY)
1744 static void mfc_wpc_fw_booting_work(struct work_struct *work)
1746 struct mfc_charger_data *charger =
1747 container_of(work, struct mfc_charger_data, wpc_fw_booting_work.work);
1748 union power_supply_propval value = {0, };
1752 SEC_FUELGAUGE_CAPACITY_TYPE_SCALE;
1753 psy_do_property(charger->pdata->fuelgauge_name, get,
1754 POWER_SUPPLY_PROP_CAPACITY, value);
1755 pr_info("%s: battery capacity (%d)\n", __func__, value.intval);
1757 if (value.intval >= 10) {
1758 mfc_uno_on(charger, true);
1760 fw_version = mfc_get_firmware_version(charger, MFC_RX_FIRMWARE);
1761 pr_info("%s: fw version (0x%x)\n", __func__, fw_version);
1762 if (fw_version != MFC_FW_BIN_VERSION) {
1763 charger->fw_cmd = SEC_WIRELESS_RX_BUILT_IN_MODE;
1764 queue_delayed_work(charger->wqueue, &charger->wpc_fw_update_work, 0);
1766 mfc_uno_on(charger, false);
1772 static int mfc_chg_get_property(struct power_supply
*psy
,
1773 enum power_supply_property psp
,
1774 union power_supply_propval
*val
)
1776 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
1777 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
1778 // union power_supply_propval value;
1783 case POWER_SUPPLY_PROP_STATUS
:
1784 pr_info("%s charger->pdata->cs100_status %d \n",__func__
,charger
->pdata
->cs100_status
);
1785 val
->intval
= charger
->pdata
->cs100_status
;
1787 case POWER_SUPPLY_PROP_TECHNOLOGY
:
1788 val
->intval
= mfc_reg_read(charger
->client
, MFC_MST_MODE_SEL_REG
, &mst_mode
);
1789 if (val
->intval
< 0) {
1790 pr_info("%s mst mode(0x2) i2c write failed, val->intval = %d\n",
1791 __func__
, val
->intval
);
1795 val
->intval
= mfc_reg_read(charger
->client
, MFC_SYS_OP_MODE_REG
, ®_data
);
1796 if (val
->intval
< 0) {
1797 pr_info("%s mst mode change irq(0x4) read failed, val->intval = %d\n",
1798 __func__
, val
->intval
);
1801 reg_data
&= 0x0C; /* use only [3:2]bit of sys_op_mode register for MST */
1803 pr_info("%s mst mode check: mst_mode = %d, reg_data = %d\n",
1804 __func__
, mst_mode
, reg_data
);
1806 if (reg_data
== 0x4)
1807 val
->intval
= mst_mode
;
1809 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
1810 case POWER_SUPPLY_PROP_HEALTH
:
1812 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
1813 if(charger
->pdata
->ic_on_mode
|| charger
->pdata
->is_charging
) {
1814 val
->intval
= mfc_get_vout(charger
);
1818 case POWER_SUPPLY_PROP_CURRENT_NOW
:
1819 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
1820 case POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
:
1821 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN
:
1823 case POWER_SUPPLY_PROP_ONLINE
:
1824 pr_info("%s cable_type =%d \n ", __func__
, charger
->pdata
->cable_type
);
1825 val
->intval
= charger
->pdata
->cable_type
;
1827 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
:
1828 val
->intval
= charger
->pdata
->vout_status
;
1830 case POWER_SUPPLY_PROP_MANUFACTURER
:
1831 pr_info("%s: POWER_SUPPLY_PROP_MANUFACTURER, intval(0x%x), called by(%ps)\n", __func__
, val
->intval
, __builtin_return_address(0));
1832 if (val
->intval
== SEC_WIRELESS_OTP_FIRM_RESULT
) {
1833 pr_info("%s otp firmware result = %d,\n",__func__
, charger
->pdata
->otp_firmware_result
);
1834 val
->intval
= charger
->pdata
->otp_firmware_result
;
1835 } else if(val
->intval
== SEC_WIRELESS_IC_REVISION
) {
1836 pr_info("%s: check f/w revision\n", __func__
);
1837 val
->intval
= mfc_get_ic_revision(charger
, MFC_IC_REVISION
);
1838 } else if(val
->intval
== SEC_WIRELESS_IC_GRADE
) {
1839 pr_info("%s: check f/w revision\n", __func__
);
1840 val
->intval
= mfc_get_ic_revision(charger
, MFC_IC_FONT
);
1841 } else if(val
->intval
== SEC_WIRELESS_OTP_FIRM_VER_BIN
) {
1842 val
->intval
= MFC_FW_BIN_VERSION
; /* latest MFC F/W binary version */
1843 } else if(val
->intval
== SEC_WIRELESS_OTP_FIRM_VER
) {
1844 val
->intval
= mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
);
1845 pr_info("%s: check f/w revision (0x%x)\n", __func__
, val
->intval
);
1846 } else if(val
->intval
== SEC_WIRELESS_TX_FIRM_RESULT
) {
1847 val
->intval
= charger
->pdata
->tx_firmware_result
;
1848 } else if (val
->intval
== SEC_WIRELESS_TX_FIRM_VER
) {
1849 val
->intval
= charger
->pdata
->tx_firmware_ver
;
1850 } else if(val
->intval
== SEC_TX_FIRMWARE
) {
1851 val
->intval
= charger
->pdata
->tx_status
;
1852 } else if(val
->intval
== SEC_WIRELESS_OTP_FIRM_VERIFY
) {
1853 mfc_get_chip_id(charger
);
1854 if (charger
->chip_id
== MFC_CHIP_LSI
) {
1855 pr_info("%s: LSI FIRM_VERIFY is not implemented\n", __func__
);
1858 pr_info("%s: IDT FIRM_VERIFY\n", __func__
);
1860 val
->intval
= mfc_firmware_verify(charger
);
1862 } else if (val
->intval
== SEC_WIRELESS_MST_SWITCH_VERIFY
) {
1863 /* This is the WA codes that reduces VRECT invalid case. */
1864 charger
->mst_off_lock
= 1;
1865 gpio_direction_output(charger
->pdata
->mst_pwr_en
, 1);
1866 usleep_range(3600, 4000);
1867 gpio_direction_output(charger
->pdata
->mst_pwr_en
, 0);
1869 charger
->mst_off_lock
= 0;
1871 gpio_direction_output(charger
->pdata
->mst_pwr_en
, 1);
1872 msleep(charger
->pdata
->mst_switch_delay
);
1873 val
->intval
= mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
);
1874 pr_info("%s: check f/w revision, mst power on (0x%x)\n", __func__
, val
->intval
);
1875 gpio_direction_output(charger
->pdata
->mst_pwr_en
, 0);
1877 val
->intval
= -ENODATA
;
1878 pr_err("%s wrong mode \n", __func__
);
1881 case POWER_SUPPLY_PROP_ENERGY_NOW
: /* vout */
1882 if(charger
->pdata
->ic_on_mode
|| charger
->pdata
->is_charging
) {
1883 val
->intval
= mfc_get_adc(charger
, MFC_ADC_VOUT
);
1884 pr_info("%s: wc vout (%d)\n", __func__
, val
->intval
);
1888 case POWER_SUPPLY_PROP_ENERGY_AVG
: /* vrect */
1889 if(charger
->pdata
->ic_on_mode
|| charger
->pdata
->is_charging
) {
1890 val
->intval
= mfc_get_adc(charger
, MFC_ADC_VRECT
);
1894 case POWER_SUPPLY_PROP_SCOPE
:
1895 val
->intval
= mfc_get_adc(charger
, val
->intval
);
1897 case POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN
:
1899 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
1901 case POWER_SUPPLY_EXT_PROP_WIRELESS_OP_FREQ
:
1902 val
->intval
= mfc_get_adc(charger
, MFC_ADC_OP_FRQ
);
1903 pr_info("%s: Operating FQ %dkHz\n", __func__
, val
->intval
);
1905 case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CMD
:
1906 val
->intval
= charger
->pdata
->tx_data_cmd
;
1908 case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_VAL
:
1909 val
->intval
= charger
->pdata
->tx_data_val
;
1911 case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID
:
1912 val
->intval
= charger
->tx_id
;
1925 static void mfc_wpc_vout_mode_work(struct work_struct
*work
)
1927 struct mfc_charger_data
*charger
=
1928 container_of(work
, struct mfc_charger_data
, wpc_vout_mode_work
.work
);
1929 int vout_step
= charger
->pdata
->vout_status
;
1930 int vout
= MFC_VOUT_10V
;
1931 union power_supply_propval value
;
1933 pr_info("%s: start - vout_mode(%d), vout_status(%d)\n",
1934 __func__
, charger
->vout_mode
, charger
->pdata
->vout_status
);
1935 switch (charger
->vout_mode
) {
1936 case WIRELESS_VOUT_5V
:
1937 mfc_set_vout(charger
, MFC_VOUT_5V
);
1939 case WIRELESS_VOUT_9V
:
1940 mfc_set_vout(charger
, MFC_VOUT_9V
);
1942 case WIRELESS_VOUT_10V
:
1943 mfc_set_vout(charger
, MFC_VOUT_10V
);
1945 psy_do_property("wireless", set
,
1946 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
1948 case WIRELESS_VOUT_5V_STEP
:
1950 if (vout_step
>= MFC_VOUT_5V
) {
1951 mfc_set_vout(charger
, vout_step
);
1952 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
1953 queue_delayed_work(charger
->wqueue
,
1954 &charger
->wpc_vout_mode_work
, msecs_to_jiffies(250));
1958 case WIRELESS_VOUT_9V_STEP
:
1960 case WIRELESS_VOUT_10V_STEP
:
1962 if (vout_step
<= vout
) {
1963 mfc_set_vout(charger
, vout_step
);
1964 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
1965 queue_delayed_work(charger
->wqueue
,
1966 &charger
->wpc_vout_mode_work
, msecs_to_jiffies(250));
1970 case WIRELESS_VOUT_CV_CALL
:
1971 case WIRELESS_VOUT_CC_CALL
:
1972 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_3
);
1974 mfc_set_vout(charger
, MFC_VOUT_5V
);
1976 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_0
);
1978 case WIRELESS_VOUT_CC_CV_VOUT
:
1979 mfc_set_vout(charger
, MFC_VOUT_5_5V
);
1984 #if !defined(CONFIG_SEC_FACTORY)
1985 if ((charger
->pdata
->cable_type
== MFC_PAD_WPC_AFC
||
1986 charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
||
1987 charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
||
1988 charger
->pdata
->cable_type
== MFC_PAD_WPC_VEHICLE_HV
) &&
1989 charger
->pdata
->vout_status
<= MFC_VOUT_5V
&& charger
->is_full_status
) {
1991 /* send data for decreasing VRECT to 5V */
1992 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
,
1993 WPC_COM_AFC_SET
, &data
, 1);
1994 pr_info("%s: set TX 5V after cs100\n", __func__
);
1997 pr_info("%s: finish - vout_mode(%d), vout_status(%d)\n",
1998 __func__
, charger
->vout_mode
, charger
->pdata
->vout_status
);
1999 wake_unlock(&charger
->wpc_vout_mode_lock
);
2002 static void mfc_wpc_i2c_error_work(struct work_struct
*work
)
2004 struct mfc_charger_data
*charger
=
2005 container_of(work
, struct mfc_charger_data
, wpc_i2c_error_work
.work
);
2007 if (charger
->wc_w_state
&&
2008 gpio_get_value(charger
->pdata
->wpc_det
)) {
2009 union power_supply_propval value
;
2011 psy_do_property("battery", set
,
2012 POWER_SUPPLY_EXT_PROP_WC_CONTROL
, value
);
2016 #if defined(CONFIG_UPDATE_BATTERY_DATA)
2017 static int mfc_chg_parse_dt(struct device
*dev
, mfc_charger_platform_data_t
*pdata
);
2019 static int mfc_chg_set_property(struct power_supply
*psy
,
2020 enum power_supply_property psp
,
2021 const union power_supply_propval
*val
)
2023 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
2024 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
2025 int vout
, vrect
, iout
, freq
, i
= 0;
2028 union power_supply_propval value
;
2032 case POWER_SUPPLY_PROP_STATUS
:
2033 if (val
->intval
== POWER_SUPPLY_STATUS_FULL
) {
2034 pr_info("%s set cs100\n", __func__
);
2035 if (charger
->pdata
->cable_type
== SEC_WIRELESS_PAD_WPC
) {
2036 /* set fake FOD values before send cs100, need to tune */
2037 mfc_fod_set_cs100(charger
);
2039 charger
->pdata
->cs100_status
= mfc_send_cs100(charger
);
2040 #if !defined(CONFIG_SEC_FACTORY)
2041 charger
->is_full_status
= 1;
2042 if (charger
->pdata
->cable_type
== MFC_PAD_WPC_AFC
||
2043 charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
||
2044 charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
||
2045 charger
->pdata
->cable_type
== MFC_PAD_WPC_VEHICLE_HV
) {
2046 charger
->vout_mode
= WIRELESS_VOUT_5V_STEP
;
2047 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
2048 wake_lock(&charger
->wpc_vout_mode_lock
);
2049 queue_delayed_work(charger
->wqueue
,
2050 &charger
->wpc_vout_mode_work
, msecs_to_jiffies(250));
2053 } else if (val
->intval
== POWER_SUPPLY_STATUS_NOT_CHARGING
) {
2054 mfc_mis_align(charger
);
2055 } else if (val
->intval
== POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
) {
2056 mfc_fod_set_cv(charger
);
2059 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
2060 value
.intval
= charger
->pdata
->cable_type
;
2061 psy_do_property("wireless", set
, POWER_SUPPLY_PROP_ONLINE
, value
);
2063 case POWER_SUPPLY_PROP_HEALTH
:
2064 if (val
->intval
== POWER_SUPPLY_HEALTH_OVERHEAT
||
2065 val
->intval
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
||
2066 val
->intval
== POWER_SUPPLY_HEALTH_COLD
) {
2067 pr_info("%s ept-ot\n", __func__
);
2068 mfc_send_eop(charger
, val
->intval
);
2071 case POWER_SUPPLY_PROP_ONLINE
:
2072 if (is_wireless_type(val
->intval
))
2073 charger
->pdata
->ic_on_mode
= true;
2075 charger
->pdata
->ic_on_mode
= false;
2077 case POWER_SUPPLY_PROP_TECHNOLOGY
:
2079 charger
->is_mst_on
= MST_MODE_2
;
2080 pr_info("%s: set MST mode 2\n", __func__
);
2081 /* disable CM FETs to avoid MST/WPC crash situation */
2082 queue_delayed_work(charger
->wqueue
,
2083 &charger
->wpc_cm_fet_work
, msecs_to_jiffies(1000));
2085 if (charger
->chip_id
== MFC_CHIP_LSI
) {
2087 * Default Idle voltage of the INT_A is LOW.
2088 * Prevent the un-wanted INT_A Falling handling.
2089 * This is a work-around, and will be fixed by the revision.
2091 charger
->mst_off_lock
= 1;
2092 if (!delayed_work_pending(&charger
->mst_off_work
))
2093 queue_delayed_work(charger
->wqueue
, &charger
->mst_off_work
, 0);
2095 pr_info("%s: set MST mode off\n", __func__
);
2096 charger
->is_mst_on
= MST_MODE_0
;
2099 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN
:
2100 charger
->pdata
->siop_level
= val
->intval
;
2101 if (charger
->pdata
->siop_level
== 100) {
2102 pr_info("%s vrect headroom set ROOM 2, siop = %d\n", __func__
, charger
->pdata
->siop_level
);
2103 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_2
);
2104 } else if (charger
->pdata
->siop_level
< 100) {
2105 pr_info("%s vrect headroom set ROOM 0, siop = %d\n", __func__
, charger
->pdata
->siop_level
);
2106 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_0
);
2109 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
2111 charger
->pdata
->ic_on_mode
= true;
2113 charger
->pdata
->ic_on_mode
= false;
2115 case POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
:
2116 charger
->fw_cmd
= val
->intval
;
2117 queue_delayed_work(charger
->wqueue
, &charger
->wpc_fw_update_work
, 0);
2118 pr_info("%s: rx result = %d, tx result = %d\n", __func__
,
2119 charger
->pdata
->otp_firmware_result
, charger
->pdata
->tx_firmware_result
);
2121 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
:
2122 if (val
->intval
== WIRELESS_VOUT_NORMAL_VOLTAGE
) {
2123 pr_info("%s: Wireless Vout forced set to 5V. + PAD CMD\n", __func__
);
2124 for (i
= 0; i
< CMD_CNT
; i
++) {
2125 mfc_send_command(charger
, MFC_AFC_CONF_5V
);
2128 } else if (val
->intval
== WIRELESS_VOUT_HIGH_VOLTAGE
) {
2129 pr_info("%s: Wireless Vout forced set to 10V. + PAD CMD\n", __func__
);
2130 for (i
= 0; i
< CMD_CNT
; i
++) {
2131 mfc_send_command(charger
, MFC_AFC_CONF_10V
);
2134 } else if (val
->intval
== WIRELESS_VOUT_CC_CV_VOUT
||
2135 val
->intval
== WIRELESS_VOUT_CV_CALL
||
2136 val
->intval
== WIRELESS_VOUT_CC_CALL
) {
2137 charger
->vout_mode
= val
->intval
;
2138 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
2139 wake_lock(&charger
->wpc_vout_mode_lock
);
2140 queue_delayed_work(charger
->wqueue
,
2141 &charger
->wpc_vout_mode_work
, 0);
2142 } else if (val
->intval
== WIRELESS_VOUT_5V
||
2143 val
->intval
== WIRELESS_VOUT_5V_STEP
) {
2146 charger
->vout_mode
= val
->intval
;
2147 if ((charger
->pdata
->cable_type
== MFC_PAD_WPC_AFC
||
2148 charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
||
2149 charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
||
2150 charger
->pdata
->cable_type
== MFC_PAD_WPC_VEHICLE_HV
)) {
2153 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
2154 wake_lock(&charger
->wpc_vout_mode_lock
);
2155 queue_delayed_work(charger
->wqueue
,
2156 &charger
->wpc_vout_mode_work
, msecs_to_jiffies(def_delay
));
2157 } else if (val
->intval
== WIRELESS_VOUT_9V
||
2158 val
->intval
== WIRELESS_VOUT_10V
||
2159 val
->intval
== WIRELESS_VOUT_9V_STEP
||
2160 val
->intval
== WIRELESS_VOUT_10V_STEP
) {
2161 if (!charger
->is_full_status
) {
2162 if (!charger
->is_afc_tx
) {
2163 u8 data_val
[4], cmd
= 0;
2165 pr_info("%s: need to set afc tx before vout control\n", __func__
);
2166 for (i
= 0; i
< CMD_CNT
; i
++) {
2167 cmd
= WPC_COM_AFC_SET
;
2168 data_val
[0] = 0x2c; /* Value for WPC AFC_SET 10V */
2169 pr_info("%s set 10V , cnt = %d\n", __func__
, i
);
2170 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
, cmd
, data_val
, 1);
2171 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_COM_REG
, &data_val
[0]);
2172 mfc_reg_read(charger
->client
, MFC_WPC_RX_DATA_VALUE0_REG
, &data_val
[0]);
2173 mfc_reg_read(charger
->client
, MFC_AP2MFC_CMD_L_REG
, &data_val
[0]);
2176 charger
->is_afc_tx
= true;
2177 pr_info("%s: is_afc_tx = %d vout read = %d\n",
2178 __func__
, charger
->is_afc_tx
, mfc_get_adc(charger
, MFC_ADC_VOUT
));
2180 /* use all CM FETs for 10V wireless charging */
2181 mfc_reg_write(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, 0x00);
2182 mfc_reg_read(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, &cmd
);
2183 pr_info("%s: CM FET setting(0x%x)\n", __func__
, cmd
);
2185 charger
->vout_mode
= val
->intval
;
2186 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
2187 wake_lock(&charger
->wpc_vout_mode_lock
);
2188 queue_delayed_work(charger
->wqueue
,
2189 &charger
->wpc_vout_mode_work
, msecs_to_jiffies(250));
2191 pr_info("%s: block to set high vout level(vs=%d) because full status\n",
2192 __func__
, charger
->pdata
->vout_status
);
2194 } else if (val
->intval
== WIRELESS_PAD_FAN_OFF
) {
2195 pr_info("%s: fan off\n", __func__
);
2196 mfc_fan_control(charger
, 0);
2197 } else if (val
->intval
== WIRELESS_PAD_FAN_ON
) {
2198 pr_info("%s: fan on\n", __func__
);
2199 mfc_fan_control(charger
, 1);
2200 } else if (val
->intval
== WIRELESS_PAD_LED_OFF
) {
2201 pr_info("%s: led off\n", __func__
);
2202 mfc_led_control(charger
, 0);
2203 } else if (val
->intval
== WIRELESS_PAD_LED_ON
) {
2204 pr_info("%s: led on\n", __func__
);
2205 mfc_led_control(charger
, 1);
2206 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ON
) {
2207 pr_info("%s: vrect adjust to have big headroom(default value)\n", __func__
);
2208 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_1
);
2209 } else if (val
->intval
== WIRELESS_VRECT_ADJ_OFF
) {
2210 pr_info("%s: vrect adjust to have small headroom\n", __func__
);
2211 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_0
);
2212 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_0
) {
2213 pr_info("%s: vrect adjust to have headroom 0(0mV)\n", __func__
);
2214 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_0
);
2215 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_1
) {
2216 pr_info("%s: vrect adjust to have headroom 1(277mV)\n", __func__
);
2217 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_1
);
2218 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_2
) {
2219 pr_info("%s: vrect adjust to have headroom 2(497mV)\n", __func__
);
2220 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_2
);
2221 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_3
) {
2222 pr_info("%s: vrect adjust to have headroom 3(650mV)\n", __func__
);
2223 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_3
);
2224 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_4
) {
2225 pr_info("%s: vrect adjust to have headroom 4(30mV)\n", __func__
);
2226 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_4
);
2227 } else if (val
->intval
== WIRELESS_VRECT_ADJ_ROOM_5
) {
2228 pr_info("%s: vrect adjust to have headroom 5(82mV)\n", __func__
);
2229 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_5
);
2230 } else if (val
->intval
== WIRELESS_CLAMP_ENABLE
) {
2231 pr_info("%s: enable clamp1, clamp2 for WPC modulation\n", __func__
);
2232 //default enabled state. no need to config.
2233 //mfc_reg_update(charger->client, MFC_RX_COMM_MOD_FET_REG, 0x00, 0x00);
2235 pr_info("%s: Unknown Command(%d)\n", __func__
, val
->intval
);
2238 case POWER_SUPPLY_PROP_MANUFACTURER
:
2239 charger
->pdata
->otp_firmware_result
= val
->intval
;
2240 pr_info("%s: otp_firmware result initialize (%d)\n", __func__
,
2241 charger
->pdata
->otp_firmware_result
);
2243 #if defined(CONFIG_UPDATE_BATTERY_DATA)
2244 case POWER_SUPPLY_PROP_POWER_DESIGN
:
2245 mfc_chg_parse_dt(charger
->dev
, charger
->pdata
);
2248 case POWER_SUPPLY_PROP_ENERGY_NOW
:
2249 vout
= mfc_get_adc(charger
, MFC_ADC_VOUT
);
2250 vrect
= mfc_get_adc(charger
, MFC_ADC_VRECT
);
2251 iout
= mfc_get_adc(charger
, MFC_ADC_RX_IOUT
);
2252 freq
= mfc_get_adc(charger
, MFC_ADC_OP_FRQ
);
2253 pr_info("%s RX_VOUT = %dmV, RX_VRECT = %dmV, RX_IOUT = %dmA, OP_FREQ = %dKHz, IC Rev = 0x%x, IC Font = 0x%x, cable=%d\n",
2254 __func__
, vout
, vrect
, iout
, freq
, mfc_get_ic_revision(charger
, MFC_IC_REVISION
),
2255 mfc_get_ic_revision(charger
, MFC_IC_FONT
), charger
->pdata
->cable_type
);
2257 charger
->pdata
->capacity
= val
->intval
;
2258 if ((vout
< 6500) && (charger
->pdata
->capacity
>= 85)) {
2259 mfc_reg_read(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, &tmp
);
2261 /* use all CM FETs for 10V wireless charging */
2262 mfc_reg_write(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, 0x00);
2263 mfc_reg_read(charger
->client
, MFC_RX_COMM_MOD_FET_REG
, &tmp
);
2264 pr_info("%s: CM FET setting(0x%x)\n", __func__
, tmp
);
2268 for (i
= 0; i
< MFC_NUM_FOD_REG
; i
++)
2269 mfc_reg_read(charger
->client
, MFC_WPC_FOD_0A_REG
+i
, &fod
[i
]);
2270 pr_info("%s: FOD(%d %d %d %d %d %d %d %d %d %d %d %d)\n", __func__
,
2271 fod
[0], fod
[1], fod
[2], fod
[3], fod
[4], fod
[5],
2272 fod
[6], fod
[7], fod
[8], fod
[9], fod
[10], fod
[11]);
2274 case POWER_SUPPLY_PROP_FILTER_CFG
:
2275 charger
->led_cover
= val
->intval
;
2276 pr_info("%s: LED_COVER(%d)\n", __func__
, charger
->led_cover
);
2278 case POWER_SUPPLY_PROP_CHARGE_EMPTY
:
2279 mfc_reg_read(charger
->client
, MFC_STATUS_L_REG
, &tmp
);
2281 pr_info("%s: MFC LDO (%d), vout (%d)\n", __func__
, val
->intval
, tmp
);
2282 if (val
->intval
&& !tmp
) { /* LDO ON */
2283 mfc_set_cmd_l_reg(charger
, MFC_CMD_TOGGLE_LDO_MASK
, MFC_CMD_TOGGLE_LDO_MASK
);
2284 pr_info("%s: MFC LDO toggle ------------ cable_work\n", __func__
);
2286 mfc_reg_read(charger
->client
, MFC_STATUS_L_REG
, &tmp
);
2288 pr_info("%s: MFC LDO STAT(%d)\n", __func__
, tmp
);
2289 } else if (!val
->intval
&& tmp
) { /* LDO OFF */
2290 pr_info("%s: MFC LDO toggle ------------ cable_work\n", __func__
);
2291 mfc_set_cmd_l_reg(charger
, MFC_CMD_TOGGLE_LDO_MASK
, MFC_CMD_TOGGLE_LDO_MASK
);
2293 mfc_reg_read(charger
->client
, MFC_STATUS_L_REG
, &tmp
);
2295 pr_info("%s: MFC LDO STAT(%d)\n", __func__
, tmp
);
2298 case POWER_SUPPLY_PROP_SCOPE
:
2300 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
2302 case POWER_SUPPLY_EXT_PROP_WC_CONTROL
:
2303 if (val
->intval
== 0) {
2305 mfc_send_packet(charger
, MFC_HEADER_AFC_CONF
,
2307 pr_info("%s: send command after wc control\n", __func__
);
2311 case POWER_SUPPLY_EXT_PROP_CALL_EVENT
:
2312 if (val
->intval
& BATT_EXT_EVENT_CALL
) {
2313 charger
->device_event
|= BATT_EXT_EVENT_CALL
;
2315 /* call in is after wireless connection */
2316 if(charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK
||
2317 charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
||
2318 charger
->pdata
->cable_type
== MFC_PAD_TX
) {
2319 union power_supply_propval value2
;
2320 pr_info("%s : enter PHM \n", __func__
);
2321 /* notify "wireless" PHM status */
2323 psy_do_property("wireless", set
,
2324 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value2
);
2325 mfc_send_command(charger
, MFC_PHM_ON
);
2327 mfc_send_command(charger
, MFC_PHM_ON
);
2329 } else if (val
->intval
== BATT_EXT_EVENT_NONE
) {
2330 charger
->device_event
&= ~BATT_EXT_EVENT_CALL
;
2344 #define FREQ_OFFSET 384000 /* 64*6000 */
2345 static void mfc_wpc_opfq_work(struct work_struct
*work
)
2347 struct mfc_charger_data
*charger
=
2348 container_of(work
, struct mfc_charger_data
, wpc_opfq_work
.work
);
2352 union power_supply_propval value
;
2354 mfc_reg_read(charger
->client
, MFC_SYS_OP_MODE_REG
, &pad_mode
);
2355 if ((pad_mode
== PAD_MODE_WPC_BASIC
) ||\
2356 (pad_mode
== PAD_MODE_WPC_ADV
)) {
2357 op_fq
= mfc_get_adc(charger
, MFC_ADC_OP_FRQ
);
2358 pr_info("%s: Operating FQ %dkHz(0x%x)\n", __func__
, op_fq
, op_fq
);
2359 if (op_fq
> 230) { /* wpc threshold 230kHz */
2360 pr_info("%s: Reset M0\n",__func__
);
2361 mfc_reg_write(charger
->client
, 0x3040, 0x80); /*restart M0 */
2363 charger
->pdata
->opfq_cnt
++;
2364 if (charger
->pdata
->opfq_cnt
<= CMD_CNT
) {
2365 queue_delayed_work(charger
->wqueue
, &charger
->wpc_opfq_work
, msecs_to_jiffies(10000));
2369 } else if ((pad_mode
== PAD_MODE_PMA_SR1
) ||\
2370 (pad_mode
== PAD_MODE_PMA_SR1E
)) {
2371 charger
->pdata
->cable_type
= MFC_PAD_PMA
;
2372 value
.intval
= SEC_WIRELESS_PAD_PMA
;
2373 psy_do_property("wireless", set
, POWER_SUPPLY_PROP_ONLINE
, value
);
2375 charger
->pdata
->opfq_cnt
= 0;
2376 wake_unlock(&charger
->wpc_opfq_lock
);
2380 static void mfc_wpc_det_work(struct work_struct
*work
)
2382 struct mfc_charger_data
*charger
=
2383 container_of(work
, struct mfc_charger_data
, wpc_det_work
.work
);
2385 union power_supply_propval value
;
2389 mfc_get_chip_id(charger
);
2390 pr_info("%s : first chip_id read(%d)\n", __func__
, charger
->chip_id
);
2391 if (charger
->chip_id
== MFC_CHIP_LSI
) {
2393 * We don't have to handle the wpc detect handling,
2394 * when it's the MST mode.
2396 if(charger
->is_mst_on
== MST_MODE_2
) {
2397 pr_info("%s MST RETURN!\n",__func__
);
2401 if(charger
->mst_off_lock
== 1) {
2402 pr_info("%s MST Off Lock!\n",__func__
);
2407 if (charger
->is_mst_on
== MST_MODE_2
) {
2408 pr_info("%s: check wpc-state(%d - %d)\n", __func__
,
2409 charger
->wc_w_state
, gpio_get_value(charger
->pdata
->wpc_det
));
2411 if (charger
->wc_w_state
== 0) {
2412 pr_info("%s: skip wpc_det_work for MST operation\n", __func__
);
2417 wake_lock(&charger
->wpc_wake_lock
);
2418 pr_info("%s\n",__func__
);
2419 wc_w_state
= gpio_get_value(charger
->pdata
->wpc_det
);
2421 if ((charger
->wc_w_state
== 0) && (wc_w_state
== 1)) {
2422 charger
->pdata
->vout_status
= MFC_VOUT_5V
;
2424 #if 0 /* To prepare for the future issue */
2425 /* read firmware version */
2426 if(mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
) == MFC_OTP_FIRM_VERSION
&& adc_cal
> 0)
2427 mfc_runtime_sram_change(charger
);/* change sram */
2430 mfc_get_chip_id(charger
);
2432 /* enable Mode Change INT */
2433 mfc_reg_update(charger
->client
, MFC_INT_A_ENABLE_L_REG
,
2434 MFC_STAT_L_OP_MODE_MASK
, MFC_STAT_L_OP_MODE_MASK
);
2436 /* read vrect adjust */
2437 mfc_reg_read(charger
->client
, MFC_VRECT_ADJ_REG
, &vrect
);
2439 pr_info("%s: wireless charger activated, set V_INT as PN\n",__func__
);
2442 mfc_reg_read(charger
->client
, MFC_SYS_OP_MODE_REG
, &pad_mode
);
2443 pad_mode
= pad_mode
>> 5;
2444 pr_info("%s: Pad type (0x%x)\n", __func__
, pad_mode
);
2445 if ((pad_mode
== PAD_MODE_PMA_SR1
) ||
2446 (pad_mode
== PAD_MODE_PMA_SR1E
)) {
2447 charger
->pdata
->cable_type
= MFC_PAD_PMA
;
2448 value
.intval
= SEC_WIRELESS_PAD_PMA
;
2449 psy_do_property("wireless", set
,
2450 POWER_SUPPLY_PROP_ONLINE
, value
);
2451 } else if ((pad_mode
== PAD_MODE_WPC_BASIC
) ||
2452 (pad_mode
== PAD_MODE_WPC_ADV
)) {
2453 charger
->pdata
->cable_type
= MFC_PAD_WPC
;
2454 value
.intval
= SEC_WIRELESS_PAD_WPC
;
2455 psy_do_property("wireless", set
,
2456 POWER_SUPPLY_PROP_ONLINE
, value
);
2457 wake_lock(&charger
->wpc_opfq_lock
);
2458 queue_delayed_work(charger
->wqueue
, &charger
->wpc_opfq_work
, msecs_to_jiffies(10000));
2459 } else if ((pad_mode
== PAD_MODE_A4WP
) ||
2460 (pad_mode
== PAD_MODE_A4WP_LPM
)) {
2461 /* Enable BT2AP INT src */
2462 mfc_reg_write(charger
->client
, MFC_INT_A_ENABLE_L_REG
, 0x03); // ENABLE BT2AP INTR
2463 mfc_reg_write(charger
->client
, MFC_INT_A_ENABLE_H_REG
, 0x80); // ENABLE BT2AP INTR
2465 /* Enable AP2BT INT src */
2466 mfc_reg_write(charger
->client
, MFC_INT_B_ENABLE_REG
, 0x83); // ENABLE AP2BT INTR
2468 charger
->pdata
->cable_type
= MFC_PAD_A4WP
;
2469 value
.intval
= SEC_WIRELESS_PAD_WPC
;
2470 psy_do_property("wireless", set
,
2471 POWER_SUPPLY_PROP_ONLINE
, value
);
2475 if(charger
->pdata
->fod_data_check
)
2476 mfc_fod_set(charger
);
2477 #if !defined(CONFIG_WIRELESS_NO_HV)
2479 int vrect_level
, vout_level
;
2481 vrect_level
= mfc_get_adc(charger
, MFC_ADC_VRECT
);
2482 vout_level
= mfc_get_adc(charger
, MFC_ADC_VOUT
);
2483 pr_info("%s: read vrect(%dmV), vout(%dmV)\n", __func__
, vrect_level
, vout_level
);
2484 if (vrect_level
>= 8500 && vout_level
>= 8500) {
2485 /* re-set vout level */
2486 charger
->pad_vout
= PAD_VOUT_10V
;
2487 mfc_set_vout(charger
, MFC_VOUT_10V
);
2489 /* change cable type */
2490 charger
->pdata
->cable_type
= (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) ?
2491 MFC_PAD_A4WP
: MFC_PAD_WPC_AFC
;
2492 value
.intval
= SEC_WIRELESS_PAD_WPC_HV
;
2493 psy_do_property("wireless", set
,
2494 POWER_SUPPLY_PROP_ONLINE
, value
);
2496 /* send request afc_tx */
2497 mfc_send_command(charger
, MFC_REQUEST_AFC_TX
);
2501 /* set rpp scaling factor for LED cover */
2502 mfc_rpp_set(charger
);
2504 wake_lock(&charger
->wpc_tx_id_lock
);
2506 queue_delayed_work(charger
->wqueue
, &charger
->wpc_tx_id_work
, msecs_to_jiffies(2500));
2508 charger
->pdata
->is_charging
= 1;
2509 } else if ((charger
->wc_w_state
== 1) && (wc_w_state
== 0)) {
2511 charger
->pdata
->cable_type
= MFC_PAD_NONE
;
2512 charger
->pdata
->is_charging
= 0;
2513 charger
->pdata
->vout_status
= MFC_VOUT_5V
;
2514 charger
->pad_vout
= PAD_VOUT_5V
;
2515 charger
->pdata
->opfq_cnt
= 0;
2516 charger
->pdata
->tx_data_cmd
= 0;
2517 charger
->pdata
->tx_data_val
= 0;
2518 charger
->vout_mode
= 0;
2519 charger
->is_full_status
= 0;
2520 charger
->pdata
->capacity
= 101;
2521 charger
->is_afc_tx
= false;
2523 charger
->i2c_error_count
= 0;
2524 charger
->tx_id_cnt
= 0;
2525 charger
->tx_id_done
= false;
2526 charger
->device_event
= 0;
2528 value
.intval
= SEC_WIRELESS_PAD_NONE
;
2529 psy_do_property("wireless", set
,
2530 POWER_SUPPLY_PROP_ONLINE
, value
);
2531 pr_info("%s: wpc deactivated, set V_INT as PD\n",__func__
);
2534 /* if vrect >= 3000mV and vout <= 2000mV, restart M0 */
2535 if (mfc_get_adc(charger
, MFC_ADC_VRECT
) >= 3000 &&
2536 mfc_get_adc(charger
, MFC_ADC_VOUT
) <= 2000) {
2537 pr_err("%s Restart M0\n", __func__
);
2538 /* reset MCU of MFC IC */
2539 mfc_set_cmd_l_reg(charger
, MFC_CMD_MCU_RESET_MASK
, MFC_CMD_MCU_RESET_MASK
);
2542 if (delayed_work_pending(&charger
->wpc_opfq_work
)) {
2543 wake_unlock(&charger
->wpc_opfq_lock
);
2544 cancel_delayed_work(&charger
->wpc_opfq_work
);
2546 if (delayed_work_pending(&charger
->wpc_afc_vout_work
)) {
2547 wake_unlock(&charger
->wpc_afc_vout_lock
);
2548 cancel_delayed_work(&charger
->wpc_afc_vout_work
);
2550 if (delayed_work_pending(&charger
->wpc_vout_mode_work
)) {
2551 wake_unlock(&charger
->wpc_vout_mode_lock
);
2552 cancel_delayed_work(&charger
->wpc_vout_mode_work
);
2555 cancel_delayed_work(&charger
->wpc_isr_work
);
2556 cancel_delayed_work(&charger
->wpc_opfq_work
);
2557 cancel_delayed_work(&charger
->wpc_tx_id_work
);
2558 cancel_delayed_work(&charger
->wpc_i2c_error_work
);
2559 wake_unlock(&charger
->wpc_tx_id_lock
);
2562 pr_info("%s: w(%d to %d)\n", __func__
,
2563 charger
->wc_w_state
, wc_w_state
);
2565 charger
->wc_w_state
= wc_w_state
;
2566 wake_unlock(&charger
->wpc_wake_lock
);
2569 /* INT_A (BT2AP interrupt) */
2570 static void mfc_wpc_isr_work(struct work_struct
*work
)
2572 struct mfc_charger_data
*charger
=
2573 container_of(work
, struct mfc_charger_data
, wpc_isr_work
.work
);
2575 u8 cmd_data
, val_data
;
2576 #if !defined(CONFIG_WIRELESS_NO_HV)
2579 union power_supply_propval value
;
2581 if (!charger
->wc_w_state
) {
2582 pr_info("%s: charger->wc_w_state is 0. exit wpc_isr_work.\n",__func__
);
2586 pr_info("%s: cable_type (0x%x)\n", __func__
, charger
->pdata
->cable_type
);
2587 wake_lock(&charger
->wpc_wake_lock
);
2588 pr_info("%s\n",__func__
);
2591 if (charger
->pdata
->cable_type
== MFC_PAD_A4WP
) {
2592 mfc_reg_read(charger
->client
, MFC_BT2AP_DATA_COM_REG
, &cmd_data
);
2593 mfc_reg_read(charger
->client
, MFC_BT2AP_DATA_VALUE0_REG
, &val_data
);
2594 charger
->pdata
->tx_data_cmd
= cmd_data
;
2595 charger
->pdata
->tx_data_val
= val_data
;
2597 pr_info("%s: A4WP Interrupt Occured, CMD : 0x%x, DATA : 0x%x\n",
2598 __func__
, cmd_data
, val_data
);
2602 case BT2AP_COM_TX_ID
:
2605 case TX_ID_BATT_PACK_TA
:
2606 case TX_ID_BATT_PACK
:
2607 case TX_ID_STAND_TYPE_START
:
2610 } //cmd_data : BT2AP_COM_TX_ID switch end
2612 case BT2AP_COM_REQ_AFC_TX
:
2614 case BT2AP_COM_AFC_MODE
:
2617 charger
->pad_vout
= PAD_VOUT_5V
;
2619 case TX_AFC_SET_10V
:
2620 pr_info("%s data = 0x%x, might be 10V irq\n", __func__
, val_data
);
2621 if (!gpio_get_value(charger
->pdata
->wpc_det
)) {
2622 wake_unlock(&charger
->wpc_wake_lock
);
2624 } else if (sleep_mode
) {
2625 pr_info("%s: does not needs to check afc mode at sleep_mode\n", __func__
);
2626 charger
->pad_vout
= PAD_VOUT_5V
;
2629 #if !defined(CONFIG_WIRELESS_NO_HV)
2630 mfc_send_command(charger
, MFC_AFC_CONF_10V
);
2632 charger
->pdata
->cable_type
= MFC_PAD_A4WP
;
2633 /* If A4WP_HV is supported, then SEC_WIRELESS_PAD_A4WP_HV type should be used.
2634 and sec_battery and charger file also have to change wireless cable type.*/
2635 value
.intval
= SEC_WIRELESS_PAD_WPC_HV
;
2636 psy_do_property("wireless", set
,
2637 POWER_SUPPLY_PROP_ONLINE
, value
);
2639 for (i
= 0; i
< CMD_CNT
- 1; i
++) {
2640 if (!gpio_get_value(charger
->pdata
->wpc_det
)) {
2641 wake_unlock(&charger
->wpc_wake_lock
);
2644 if (mfc_get_adc(charger
, MFC_ADC_VOUT
) > 7500) {
2645 pr_info("%s 10V set is done\n", __func__
);
2648 pr_info("%s send AFC_CONF_10V again\n", __func__
);
2649 mfc_send_command(charger
, MFC_AFC_CONF_10V
);
2654 charger
->pad_vout
= PAD_VOUT_10V
;
2657 case TX_AFC_SET_12V
:
2658 case TX_AFC_SET_18V
:
2659 case TX_AFC_SET_19V
:
2660 case TX_AFC_SET_20V
:
2661 case TX_AFC_SET_24V
:
2663 pr_info("%s: unsupport : 0x%x", __func__
, val_data
);
2667 case BT2AP_COM_CHG_STATUS
:
2668 case BT2AP_COM_UNKNOWN
:
2669 case BT2AP_COM_PWR_STATUS
:
2670 case BT2AP_COM_SID_TAG
:
2671 case BT2AP_COM_SID_TOKEN
:
2672 case BT2AP_COM_TX_STANDBY
:
2673 case BT2AP_COM_COOLING_CTRL
:
2677 } else { /* WPC, PMA */
2679 mfc_reg_read(charger
->client
, MFC_WPC_TX_DATA_COM_REG
, &cmd_data
);
2680 mfc_reg_read(charger
->client
, MFC_WPC_TX_DATA_VALUE0_REG
, &val_data
);
2681 charger
->pdata
->tx_data_cmd
= cmd_data
;
2682 charger
->pdata
->tx_data_val
= val_data
;
2684 pr_info("%s: WPC Interrupt Occured, CMD : 0x%x, DATA : 0x%x\n",
2685 __func__
, cmd_data
, val_data
);
2687 if (cmd_data
== WPC_TX_COM_AFC_SET
) {
2690 pr_info("%s data = 0x%x, might be 5V irq\n", __func__
, val_data
);
2691 charger
->pad_vout
= PAD_VOUT_5V
;
2693 case TX_AFC_SET_10V
:
2694 pr_info("%s data = 0x%x, might be 10V irq\n", __func__
, val_data
);
2695 if (!gpio_get_value(charger
->pdata
->wpc_det
)) {
2696 pr_err("%s Wireless charging is paused during set high voltage.\n", __func__
);
2697 wake_unlock(&charger
->wpc_wake_lock
);
2699 } else if (sleep_mode
) {
2700 pr_info("%s: does not needs to check afc mode at sleep_mode\n", __func__
);
2701 charger
->pad_vout
= PAD_VOUT_5V
;
2704 #if !defined(CONFIG_WIRELESS_NO_HV)
2705 if (charger
->pdata
->cable_type
== MFC_PAD_WPC_AFC
||
2706 charger
->pdata
->cable_type
== MFC_PAD_PREPARE_HV
||
2707 charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
||
2708 charger
->pdata
->cable_type
== MFC_PAD_WPC_PACK_HV
||
2709 charger
->pdata
->cable_type
== MFC_PAD_WPC_VEHICLE_HV
) {
2710 pr_err("%s: It is already HV wireless cable. No need to set again\n", __func__
);
2711 wake_unlock(&charger
->wpc_wake_lock
);
2716 mfc_send_command(charger
, MFC_AFC_CONF_10V
);
2719 /* change cable type */
2720 charger
->pdata
->cable_type
= MFC_PAD_PREPARE_HV
;
2721 value
.intval
= SEC_WIRELESS_PAD_PREPARE_HV
;
2722 psy_do_property("wireless", set
,
2723 POWER_SUPPLY_PROP_ONLINE
, value
);
2725 charger
->pad_vout
= PAD_VOUT_10V
;
2728 case TX_AFC_SET_12V
:
2730 case TX_AFC_SET_18V
:
2731 case TX_AFC_SET_19V
:
2732 case TX_AFC_SET_20V
:
2733 case TX_AFC_SET_24V
:
2736 pr_info("%s: unsupport : 0x%x", __func__
, val_data
);
2739 } else if (cmd_data
== WPC_TX_COM_TX_ID
) {
2740 if (!charger
->tx_id_done
) {
2744 case TX_ID_VEHICLE_PAD
:
2745 if (charger
->pad_vout
== PAD_VOUT_10V
) {
2746 if (charger
->pdata
->cable_type
== MFC_PAD_PREPARE_HV
) {
2747 charger
->pdata
->cable_type
= MFC_PAD_WPC_VEHICLE_HV
;
2748 value
.intval
= SEC_WIRELESS_PAD_PREPARE_HV
;
2750 charger
->pdata
->cable_type
= MFC_PAD_WPC_VEHICLE_HV
;
2751 value
.intval
= SEC_WIRELESS_PAD_VEHICLE_HV
;
2754 charger
->pdata
->cable_type
= MFC_PAD_WPC_VEHICLE
;
2755 value
.intval
= SEC_WIRELESS_PAD_VEHICLE
;
2757 pr_info("%s: VEHICLE Wireless Charge PAD %s\n", __func__
,
2758 charger
->pad_vout
== PAD_VOUT_10V
? "HV" : "");
2761 case TX_ID_STAND_TYPE_START
:
2762 if (charger
->pad_vout
== PAD_VOUT_10V
) {
2763 if (charger
->pdata
->cable_type
== MFC_PAD_PREPARE_HV
) {
2764 charger
->pdata
->cable_type
= MFC_PAD_WPC_STAND_HV
;
2765 value
.intval
= SEC_WIRELESS_PAD_PREPARE_HV
;
2767 charger
->pdata
->cable_type
= MFC_PAD_WPC_STAND_HV
;
2768 value
.intval
= SEC_WIRELESS_PAD_WPC_STAND_HV
;
2771 charger
->pdata
->cable_type
= MFC_PAD_WPC_STAND
;
2772 value
.intval
= SEC_WIRELESS_PAD_WPC_STAND
;
2773 mfc_fod_set_hero_5v(charger
);
2775 pr_info("%s: STAND Wireless Charge PAD %s\n", __func__
,
2776 charger
->pad_vout
== PAD_VOUT_10V
? "HV" : "");
2777 pr_info("%s: cable_type(%d)\n", __func__
, charger
->pdata
->cable_type
);
2779 case TX_ID_BATT_PACK
... TX_ID_BATT_PACK_END
:
2780 if (charger
->pad_vout
== PAD_VOUT_10V
) {
2781 if (charger
->pdata
->cable_type
== MFC_PAD_PREPARE_HV
) {
2782 charger
->pdata
->cable_type
= MFC_PAD_WPC_PACK_HV
;
2783 value
.intval
= SEC_WIRELESS_PAD_PREPARE_HV
;
2784 pr_info("%s: WIRELESS HV BATTERY PACK (PREP) \n", __func__
);
2786 charger
->pdata
->cable_type
= MFC_PAD_WPC_PACK_HV
;
2787 value
.intval
= SEC_WIRELESS_PAD_WPC_PACK_HV
;
2788 pr_info("%s: WIRELESS HV BATTERY PACK\n", __func__
);
2791 charger
->pdata
->cable_type
= MFC_PAD_WPC_PACK
;
2792 value
.intval
= SEC_WIRELESS_PAD_WPC_PACK
;
2793 pr_info("%s: WIRELESS BATTERY PACK\n", __func__
);
2795 if (charger
->device_event
& BATT_EXT_EVENT_CALL
) {
2796 union power_supply_propval value2
;
2797 pr_info("%s enter PHM \n", __func__
);
2798 /* notify "wireless" PHM status */
2800 psy_do_property("wireless", set
,
2801 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value2
);
2802 mfc_send_command(charger
, MFC_PHM_ON
);
2804 mfc_send_command(charger
, MFC_PHM_ON
);
2808 case TX_ID_UNO_TX_B0
... TX_ID_UNO_TX_MAX
:
2809 charger
->pdata
->cable_type
= MFC_PAD_TX
;
2810 value
.intval
= SEC_WIRELESS_PAD_TX
;
2811 pr_info("%s: TX by UNO\n", __func__
);
2812 if (charger
->device_event
& BATT_EXT_EVENT_CALL
) {
2813 pr_info("%s: enter PHM \n", __func__
);
2814 mfc_send_command(charger
, MFC_PHM_ON
);
2816 mfc_send_command(charger
, MFC_PHM_ON
);
2820 value
.intval
= charger
->pdata
->cable_type
;
2821 pr_info("%s: UNDEFINED PAD : 0x%x\n", __func__
, val_data
);
2824 if (value
.intval
!= MFC_PAD_PREPARE_HV
)
2825 psy_do_property("wireless", set
, POWER_SUPPLY_PROP_ONLINE
, value
);
2827 charger
->tx_id_done
= true;
2828 charger
->tx_id
= val_data
;
2829 pr_info("%s: TX_ID : 0x%x\n", __func__
, val_data
);
2830 value
.intval
= val_data
;
2831 psy_do_property("wireless", set
, POWER_SUPPLY_PROP_AUTHENTIC
, value
);
2833 pr_err("%s: TX ID isr is already done\n", __func__
);
2835 } else if (cmd_data
== WPC_TX_COM_CHG_ERR
) {
2837 case TX_CHG_ERR_OTP
:
2838 case TX_CHG_ERR_OCP
:
2839 case TX_CHG_ERR_DARKZONE
:
2840 pr_info("%s: Received CHG error from the TX(0x%x)\n",
2841 __func__
, val_data
);
2843 case TX_CHG_ERR_FOD
:
2844 pr_info("%s: Received FOD state from the TX(0x%x)\n",
2845 __func__
, val_data
);
2846 value
.intval
= val_data
;
2847 psy_do_property("wireless", set
, POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CHG_ERR
, value
);
2850 pr_info("%s: Undefined Type(0x%x)\n", __func__
, val_data
);
2853 } else if (cmd_data
== WPC_TX_COM_WPS
) {
2855 case WPS_AICL_RESET
:
2857 pr_info("@Tx_mode %s Rx devic AICL Reset\n", __func__
);
2858 psy_do_property("wireless", set
, POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
2861 pr_info("%s : Undefined RX Power(0x%x)\n", __func__
, val_data
);
2866 wake_unlock(&charger
->wpc_wake_lock
);
2869 static void mfc_wpc_tx_id_work(struct work_struct
*work
)
2871 struct mfc_charger_data
*charger
=
2872 container_of(work
, struct mfc_charger_data
, wpc_tx_id_work
.work
);
2874 pr_info("%s\n",__func__
);
2876 mfc_send_command(charger
, MFC_REQUEST_TX_ID
);
2877 charger
->tx_id_cnt
++;
2879 if ((charger
->tx_id_cnt
<= 10) && !charger
->tx_id
) {
2880 pr_info("%s: request TX ID (%d)\n", __func__
, charger
->tx_id_cnt
);
2881 queue_delayed_work(charger
->wqueue
, &charger
->wpc_tx_id_work
, msecs_to_jiffies(1500));
2885 pr_info("%s: TX ID (0x%x)\n", __func__
, charger
->tx_id
);
2887 pr_info("%s: TX ID not Received\n", __func__
);
2888 charger
->tx_id_cnt
= 0;
2890 wake_unlock(&charger
->wpc_tx_id_lock
);
2894 * Prevent the un-wanted INT_A Falling handling.
2895 * This is a work-around, and will be fixed by the revision.
2897 static void mfc_mst_off_work(struct work_struct
*work
)
2899 struct mfc_charger_data
*charger
=
2900 container_of(work
, struct mfc_charger_data
, mst_off_work
.work
);
2901 pr_info("%s\n",__func__
);
2903 charger
->mst_off_lock
= 1;
2905 charger
->mst_off_lock
= 0;
2908 static irqreturn_t
mfc_wpc_det_irq_thread(int irq
, void *irq_data
)
2910 struct mfc_charger_data
*charger
= irq_data
;
2912 pr_info("%s !\n",__func__
);
2914 if (charger
->is_probed
)
2915 queue_delayed_work(charger
->wqueue
, &charger
->wpc_det_work
, 0);
2917 pr_info("%s: prevent work thread before device is probed.\n", __func__
);
2922 /* mfc_mst_routine : MST dedicated codes */
2923 void mfc_mst_routine(struct mfc_charger_data
*charger
, u8
*irq_src
)
2925 if(charger
->is_mst_on
== MST_MODE_2
) {
2926 /* clear intterupt */
2927 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_L_REG
, irq_src
[0]); // clear int
2928 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_H_REG
, irq_src
[1]); // clear int
2929 mfc_set_cmd_l_reg(charger
, 0x20, MFC_CMD_CLEAR_INT_MASK
); // command
2931 mfc_reg_write(charger
->client
, MFC_MST_MODE_SEL_REG
, 0x02); /* set MST mode2 */
2932 pr_info("%s 2AC Missing ! : MST on REV : %d\n", __func__
, charger
->pdata
->wc_ic_rev
);
2934 /* clear intterupt */
2935 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_L_REG
, irq_src
[0]); // clear int
2936 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_H_REG
, irq_src
[1]); // clear int
2937 mfc_set_cmd_l_reg(charger
, 0x20, MFC_CMD_CLEAR_INT_MASK
); // command
2943 static irqreturn_t
mfc_wpc_irq_thread(int irq
, void *irq_data
)
2945 struct mfc_charger_data
*charger
= irq_data
;
2952 if ((charger
->chip_id
== MFC_CHIP_LSI
) && (charger
->mst_off_lock
== 1)) {
2953 pr_info("%s MST Off Lock!\n",__func__
);
2957 pr_info("%s !\n",__func__
);
2958 wake_lock(&charger
->wpc_wake_lock
);
2960 ret
= mfc_reg_read(charger
->client
, MFC_INT_A_L_REG
, &irq_src
[0]);
2961 ret
= mfc_reg_read(charger
->client
, MFC_INT_A_H_REG
, &irq_src
[1]);
2963 wc_w_state_irq
= gpio_get_value(charger
->pdata
->wpc_int
);
2964 pr_info("%s wc_w_state_irq = %d\n", __func__
, wc_w_state_irq
);
2967 pr_err("%s: Failed to read interrupt source: %d\n",
2969 wake_unlock(&charger
->wpc_wake_lock
);
2974 if(irq_src
[1] & MFC_STAT_H_AC_MISSING_DET_MASK
) {
2975 pr_info("%s 1AC Missing ! : MST on REV : %d\n", __func__
, charger
->pdata
->wc_ic_rev
);
2976 mfc_mst_routine(charger
, irq_src
);
2979 pr_info("%s: interrupt source(0x%x)\n", __func__
, irq_src
[1] << 8 | irq_src
[0]);
2980 mfc_get_firmware_version(charger
, MFC_RX_FIRMWARE
);
2982 if(irq_src
[0] & MFC_STAT_L_OP_MODE_MASK
) {
2983 ret
= mfc_reg_read(charger
->client
, MFC_SYS_OP_MODE_REG
, ®_data
);
2984 reg_data
&= 0x0C; /* use only [3:2]bit of sys_op_mode register for MST */
2985 pr_info("%s MODE CHANGE IRQ ! (0x%x)\n", __func__
, reg_data
);
2988 if ((irq_src
[0] & MFC_STAT_L_OVER_VOL_MASK
) ||
2989 (irq_src
[0] & MFC_STAT_L_OVER_CURR_MASK
) ||
2990 (irq_src
[0] & MFC_STAT_L_OVER_TEMP_MASK
)) {
2991 pr_info("%s ABNORMAL STAT IRQ ! \n", __func__
);
2992 //ret = mfc_reg_read(charger->client, MFC_SYS_OP_MODE_REG, ®_data);
2995 if(irq_src
[0] & MFC_STAT_L_INT_LPM_MASK
) {
2996 pr_info("%s INT LPM IRQ ! \n", __func__
);
2999 if(irq_src
[0] & MFC_STAT_L_BT2AP_DATA_MASK
) {
3000 pr_info("%s BT2AP DATA IRQ ! \n", __func__
);
3001 if(!delayed_work_pending(&charger
->wpc_isr_work
))
3002 queue_delayed_work(charger
->wqueue
, &charger
->wpc_isr_work
, msecs_to_jiffies(1000));
3006 if(irq_src
[1] & MFC_STAT_H_TX_DATA_RECEIVED_MASK
) {
3007 pr_info("%s TX RECEIVED IRQ ! \n", __func__
);
3008 if(charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND
||
3009 charger
->pdata
->cable_type
== MFC_PAD_WPC_STAND_HV
)
3010 pr_info("%s Don't run ISR_WORK for NO ACK ! \n", __func__
);
3011 else if(!delayed_work_pending(&charger
->wpc_isr_work
))
3012 queue_delayed_work(charger
->wqueue
, &charger
->wpc_isr_work
, msecs_to_jiffies(500));
3016 if(irq_src
[1] & MFC_STAT_H_TX_OVER_CURR_MASK
) {
3017 pr_info("%s TX OVER CURRENT IRQ ! \n", __func__
);
3020 if(irq_src
[1] & MFC_STAT_H_TX_OVER_TEMP_MASK
) {
3021 pr_info("%s TX OVER TEMP IRQ ! \n", __func__
);
3024 if(irq_src
[1] & MFC_STAT_H_TX_CON_DISCON_MASK
) {
3025 pr_info("%s TX CONNECT IRQ ! \n", __func__
);
3026 charger
->pdata
->tx_status
= SEC_TX_POWER_TRANSFER
;
3029 /* clear intterupt */
3030 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_L_REG
, irq_src
[0]); // clear int
3031 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_H_REG
, irq_src
[1]); // clear int
3032 mfc_set_cmd_l_reg(charger
, 0x20, MFC_CMD_CLEAR_INT_MASK
); // command
3035 ret
= mfc_reg_read(charger
->client
, MFC_INT_A_L_REG
, &irq_src
[0]);
3036 ret
= mfc_reg_read(charger
->client
, MFC_INT_A_H_REG
, &irq_src
[1]);
3037 wc_w_state_irq
= gpio_get_value(charger
->pdata
->wpc_int
);
3038 pr_info("%s wc_w_state_irq = %d\n", __func__
, wc_w_state_irq
);
3039 wake_unlock(&charger
->wpc_wake_lock
);
3044 /* clear intterupt */
3045 pr_info("%s interrup error!\n", __func__
);
3046 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_L_REG
, irq_src
[0]); // clear int
3047 mfc_reg_write(charger
->client
, MFC_INT_A_CLEAR_H_REG
, irq_src
[1]); // clear int
3048 mfc_set_cmd_l_reg(charger
, 0x20, MFC_CMD_CLEAR_INT_MASK
); // command
3049 wake_unlock(&charger
->wpc_wake_lock
);
3055 static int mfc_chg_parse_dt(struct device
*dev
,
3056 mfc_charger_platform_data_t
*pdata
)
3059 struct device_node
*np
= dev
->of_node
;
3060 enum of_gpio_flags irq_gpio_flags
;
3065 pr_err("%s np NULL\n", __func__
);
3068 p
= of_get_property(np
, "battery,fod_wpc_data", &len
);
3070 len
= len
/ sizeof(u32
);
3071 pdata
->fod_wpc_data
= kzalloc(sizeof(*pdata
->fod_wpc_data
) * len
, GFP_KERNEL
);
3072 ret
= of_property_read_u32_array(np
, "battery,fod_wpc_data",
3073 pdata
->fod_wpc_data
, len
);
3074 pdata
->fod_data_check
= 1;
3076 for(i
= 0; i
<len
; i
++)
3077 pr_info("%s fod WPC data = %d ",__func__
,pdata
->fod_wpc_data
[i
]);
3079 pdata
->fod_data_check
= 0;
3080 pr_err("%s there is not fod_wpc_data\n", __func__
);
3083 p
= of_get_property(np
, "battery,fod_pma_data", &len
);
3085 len
= len
/ sizeof(u32
);
3086 pdata
->fod_pma_data
= kzalloc(sizeof(*pdata
->fod_pma_data
) * len
, GFP_KERNEL
);
3087 ret
= of_property_read_u32_array(np
, "battery,fod_pma_data",
3088 pdata
->fod_pma_data
, len
);
3089 pdata
->fod_data_check
= 1;
3091 for(i
= 0; i
<len
; i
++)
3092 pr_info("%s fod PMA data = %d ",__func__
,pdata
->fod_pma_data
[i
]);
3094 pdata
->fod_data_check
= 0;
3095 pr_err("%s there is not fod_pma_data\n", __func__
);
3098 p
= of_get_property(np
, "battery,fod_a4wp_data", &len
);
3100 len
= len
/ sizeof(u32
);
3101 pdata
->fod_a4wp_data
= kzalloc(sizeof(*pdata
->fod_a4wp_data
) * len
, GFP_KERNEL
);
3102 ret
= of_property_read_u32_array(np
, "battery,fod_a4wp_data",
3103 pdata
->fod_a4wp_data
, len
);
3104 pdata
->fod_data_check
= 1;
3106 for(i
= 0; i
<len
; i
++)
3107 pr_info("%s fod A4WP data = %d ",__func__
,pdata
->fod_a4wp_data
[i
]);
3109 pdata
->fod_data_check
= 0;
3110 pr_err("%s there is not fod_a4wp_data\n", __func__
);
3113 p
= of_get_property(np
, "battery,fod_wpc_data_cv", &len
);
3115 len
= len
/ sizeof(u32
);
3116 pdata
->fod_wpc_data_cv
= kzalloc(sizeof(*pdata
->fod_wpc_data_cv
) * len
, GFP_KERNEL
);
3117 ret
= of_property_read_u32_array(np
, "battery,fod_wpc_data_cv",
3118 pdata
->fod_wpc_data_cv
, len
);
3119 pdata
->fod_data_check
= 1;
3121 for(i
= 0; i
<len
; i
++)
3122 pr_info("%s fod WPC data_cv = %d ",__func__
,pdata
->fod_wpc_data_cv
[i
]);
3124 pdata
->fod_data_check
= 0;
3125 pr_err("%s there is not fod_wpc_data_cv\n", __func__
);
3128 p
= of_get_property(np
, "battery,fod_pma_data_cv", &len
);
3130 len
= len
/ sizeof(u32
);
3131 pdata
->fod_pma_data_cv
= kzalloc(sizeof(*pdata
->fod_pma_data_cv
) * len
, GFP_KERNEL
);
3132 ret
= of_property_read_u32_array(np
, "battery,fod_pma_data_cv",
3133 pdata
->fod_pma_data_cv
, len
);
3134 pdata
->fod_data_check
= 1;
3136 for(i
= 0; i
<len
; i
++)
3137 pr_info("%s fod PMA data_cv = %d ",__func__
,pdata
->fod_pma_data_cv
[i
]);
3139 pdata
->fod_data_check
= 0;
3140 pr_err("%s there is not fod_pma_data_cv\n", __func__
);
3143 p
= of_get_property(np
, "battery,fod_a4wp_data_cv", &len
);
3145 len
= len
/ sizeof(u32
);
3146 pdata
->fod_a4wp_data_cv
= kzalloc(sizeof(*pdata
->fod_a4wp_data_cv
) * len
, GFP_KERNEL
);
3147 ret
= of_property_read_u32_array(np
, "battery,fod_a4wp_data_cv",
3148 pdata
->fod_a4wp_data_cv
, len
);
3149 pdata
->fod_data_check
= 1;
3151 for(i
= 0; i
<len
; i
++)
3152 pr_info("%s fod A4WP data_cv = %d ",__func__
,pdata
->fod_a4wp_data_cv
[i
]);
3154 pdata
->fod_data_check
= 0;
3155 pr_err("%s there is not fod_a4wp_data_cv\n", __func__
);
3158 p
= of_get_property(np
, "battery,fod_hero_5v_data", &len
);
3160 len
= len
/ sizeof(u32
);
3161 pdata
->fod_hero_5v_data
= kzalloc(sizeof(*pdata
->fod_hero_5v_data
) * len
, GFP_KERNEL
);
3162 ret
= of_property_read_u32_array(np
, "battery,fod_hero_5v_data",
3163 pdata
->fod_hero_5v_data
, len
);
3165 for(i
= 0; i
<len
; i
++)
3166 pr_info("%s fod Hero 5V data = 0x%x ",__func__
,pdata
->fod_hero_5v_data
[i
]);
3168 pr_err("%s there is not fod_hero_5v_data\n", __func__
);
3171 ret
= of_property_read_string(np
,
3172 "battery,wireless_charger_name", (char const **)&pdata
->wireless_charger_name
);
3174 pr_info("%s: Wireless Charger name is Empty\n", __func__
);
3176 ret
= of_property_read_string(np
,
3177 "battery,charger_name", (char const **)&pdata
->wired_charger_name
);
3179 pr_info("%s: Charger name is Empty\n", __func__
);
3181 ret
= of_property_read_string(np
,
3182 "battery,fuelgauge_name", (char const **)&pdata
->fuelgauge_name
);
3184 pr_info("%s: Fuelgauge name is Empty\n", __func__
);
3186 ret
= of_property_read_u32(np
, "battery,wpc_cc_cv_vout",
3187 &pdata
->wpc_cc_cv_vout
);
3189 pr_info("%s: wpc_cv_call_vout is Empty \n", __func__
);
3191 ret
= of_property_read_u32(np
, "battery,wpc_cv_call_vout",
3192 &pdata
->wpc_cv_call_vout
);
3194 pr_info("%s: wpc_cv_call_vout is Empty \n", __func__
);
3196 ret
= of_property_read_u32(np
, "battery,wpc_cc_call_vout",
3197 &pdata
->wpc_cc_call_vout
);
3199 pr_info("%s: wpc_cc_call_vout is Empty \n", __func__
);
3201 ret
= of_property_read_u32(np
, "battery,hv_vout_wa",
3202 &pdata
->hv_vout_wa
);
3204 pr_info("%s: no need hv_vout_wa. \n", __func__
);
3205 pdata
->hv_vout_wa
= 0;
3208 ret
= of_property_read_u32(np
, "battery,mst_switch_delay",
3209 &pdata
->mst_switch_delay
);
3211 pr_info("%s: mst_switch_delay is Empty \n", __func__
);
3212 pdata
->mst_switch_delay
= 1000; /* set default value (dream) */
3215 ret
= of_property_read_u32(np
, "battery,wc_cover_rpp",
3216 &pdata
->wc_cover_rpp
);
3218 pr_info("%s: fail to read wc_cover_rpp. \n", __func__
);
3219 pdata
->wc_cover_rpp
= 0x55;
3222 ret
= of_property_read_u32(np
, "battery,wc_hv_rpp",
3225 pr_info("%s: fail to read wc_hv_rpp. \n", __func__
);
3226 pdata
->wc_hv_rpp
= 0x40;
3230 ret
= pdata
->wpc_det
= of_get_named_gpio_flags(np
, "battery,wpc_det",
3231 0, &irq_gpio_flags
);
3233 dev_err(dev
, "%s : can't get wpc_det\r\n", __FUNCTION__
);
3235 pdata
->irq_wpc_det
= gpio_to_irq(pdata
->wpc_det
);
3236 pr_info("%s wpc_det = 0x%x, irq_wpc_det = 0x%x \n",__func__
, pdata
->wpc_det
, pdata
->irq_wpc_det
);
3238 /* wpc_int (This GPIO means MFC_AP_INT) */
3239 ret
= pdata
->wpc_int
= of_get_named_gpio_flags(np
, "battery,wpc_int",
3240 0, &irq_gpio_flags
);
3242 dev_err(dev
, "%s : can't wpc_int\r\n", __FUNCTION__
);
3244 pdata
->irq_wpc_int
= gpio_to_irq(pdata
->wpc_int
);
3245 pr_info("%s wpc_int = 0x%x, irq_wpc_int = 0x%x \n",__func__
, pdata
->wpc_int
, pdata
->irq_wpc_int
);
3248 /* mst_pwr_en (MST PWR EN) */
3249 ret
= pdata
->mst_pwr_en
= of_get_named_gpio_flags(np
, "battery,mst_pwr_en",
3250 0, &irq_gpio_flags
);
3252 dev_err(dev
, "%s : can't mst_pwr_en\r\n", __FUNCTION__
);
3255 /* wpc_en (MFC EN) */
3256 ret
= pdata
->wpc_en
= of_get_named_gpio_flags(np
, "battery,wpc_en",
3257 0, &irq_gpio_flags
);
3259 dev_err(dev
, "%s : can't wpc_en\r\n", __FUNCTION__
);
3266 static ssize_t
mfc_store_addr(struct device
*dev
,
3267 struct device_attribute
*attr
,
3268 const char *buf
, size_t count
)
3270 struct power_supply
*psy
= dev_get_drvdata(dev
);
3271 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3274 if (sscanf(buf
, "0x%4x\n", &x
) == 1) {
3280 static ssize_t
mfc_show_addr(struct device
*dev
,
3281 struct device_attribute
*attr
,
3284 struct power_supply
*psy
= dev_get_drvdata(dev
);
3285 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3287 return sprintf(buf
, "0x%x\n", charger
->addr
);
3290 static ssize_t
mfc_store_size(struct device
*dev
,
3291 struct device_attribute
*attr
,
3292 const char *buf
, size_t count
)
3294 struct power_supply
*psy
= dev_get_drvdata(dev
);
3295 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3298 if (sscanf(buf
, "%5d\n", &x
) == 1) {
3304 static ssize_t
mfc_show_size(struct device
*dev
,
3305 struct device_attribute
*attr
,
3308 struct power_supply
*psy
= dev_get_drvdata(dev
);
3309 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3311 return sprintf(buf
, "0x%x\n", charger
->size
);
3313 static ssize_t
mfc_store_data(struct device
*dev
,
3314 struct device_attribute
*attr
,
3315 const char *buf
, size_t count
)
3317 struct power_supply
*psy
= dev_get_drvdata(dev
);
3318 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3321 if (sscanf(buf
, "0x%10x", &x
) == 1) {
3324 if (mfc_reg_write(charger
->client
, charger
->addr
, data
) < 0) {
3325 dev_info(charger
->dev
,
3326 "%s: addr: 0x%x write fail\n", __func__
, charger
->addr
);
3332 static ssize_t
mfc_show_data(struct device
*dev
,
3333 struct device_attribute
*attr
,
3336 struct power_supply
*psy
= dev_get_drvdata(dev
);
3337 struct mfc_charger_data
*charger
= power_supply_get_drvdata(psy
);
3340 if (charger
->size
== 0) {
3342 } else if (charger
->size
+ charger
->addr
<= 0xFFFF) {
3346 for (i
= 0; i
< charger
->size
; i
++) {
3347 if (mfc_reg_read(charger
->client
, charger
->addr
+ i
, &data
) < 0) {
3348 dev_info(charger
->dev
,
3349 "%s: read fail\n", __func__
);
3350 count
+= sprintf(buf
+ count
, "addr: 0x%x read fail\n", charger
->addr
+ i
);
3353 count
+= sprintf(buf
+ count
, "addr: 0x%x, data: 0x%x\n", charger
->addr
+ i
, data
);
3360 static DEVICE_ATTR(addr
, 0644, mfc_show_addr
, mfc_store_addr
);
3361 static DEVICE_ATTR(size
, 0644, mfc_show_size
, mfc_store_size
);
3362 static DEVICE_ATTR(data
, 0644, mfc_show_data
, mfc_store_data
);
3364 static struct attribute
*mfc_attributes
[] = {
3365 &dev_attr_addr
.attr
,
3366 &dev_attr_size
.attr
,
3367 &dev_attr_data
.attr
,
3371 static const struct attribute_group mfc_attr_group
= {
3372 .attrs
= mfc_attributes
,
3375 static const struct power_supply_desc mfc_charger_power_supply_desc
= {
3376 .name
= "mfc-charger",
3377 .type
= POWER_SUPPLY_TYPE_UNKNOWN
,
3378 .properties
= mfc_charger_props
,
3379 .num_properties
= ARRAY_SIZE(mfc_charger_props
),
3380 .get_property
= mfc_chg_get_property
,
3381 .set_property
= mfc_chg_set_property
,
3384 static void mfc_wpc_int_req_work(struct work_struct
*work
)
3386 struct mfc_charger_data
*charger
=
3387 container_of(work
, struct mfc_charger_data
, wpc_int_req_work
.work
);
3391 pr_info("%s\n", __func__
);
3393 if (charger
->pdata
->irq_wpc_int
) {
3395 ret
= request_threaded_irq(charger
->pdata
->irq_wpc_int
,
3396 NULL
, mfc_wpc_irq_thread
,
3397 IRQF_TRIGGER_FALLING
|
3399 "wpc-irq", charger
);
3401 pr_err("%s: Failed to Reqeust IRQ\n", __func__
);
3405 free_irq(charger
->pdata
->irq_wpc_det
, NULL
);
3408 static int mfc_charger_probe(
3409 struct i2c_client
*client
,
3410 const struct i2c_device_id
*id
)
3412 struct device_node
*of_node
= client
->dev
.of_node
;
3413 struct mfc_charger_data
*charger
;
3414 mfc_charger_platform_data_t
*pdata
= client
->dev
.platform_data
;
3415 struct power_supply_config mfc_cfg
= {};
3419 dev_info(&client
->dev
,
3420 "%s: MFC Charger Driver Loading\n", __func__
);
3423 pdata
= devm_kzalloc(&client
->dev
, sizeof(*pdata
), GFP_KERNEL
);
3425 dev_err(&client
->dev
, "Failed to allocate memory\n");
3428 ret
= mfc_chg_parse_dt(&client
->dev
, pdata
);
3432 pdata
= client
->dev
.platform_data
;
3434 dev_err(&client
->dev
, "Failed to get platform data\n");
3439 charger
= kzalloc(sizeof(*charger
), GFP_KERNEL
);
3440 if (charger
== NULL
) {
3441 dev_err(&client
->dev
, "Memory is not enough.\n");
3445 charger
->dev
= &client
->dev
;
3447 ret
= i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_BYTE_DATA
|
3448 I2C_FUNC_SMBUS_WORD_DATA
| I2C_FUNC_SMBUS_I2C_BLOCK
);
3450 ret
= i2c_get_functionality(client
->adapter
);
3451 dev_err(charger
->dev
, "I2C functionality is not supported.\n");
3453 goto err_i2cfunc_not_support
;
3456 charger
->client
= client
;
3457 charger
->pdata
= pdata
;
3459 pr_info("%s: %s\n", __func__
, charger
->pdata
->wireless_charger_name
);
3461 i2c_set_clientdata(client
, charger
);
3463 charger
->pdata
->cable_type
= MFC_PAD_NONE
;
3464 charger
->pdata
->is_charging
= 0;
3465 charger
->pdata
->tx_status
= 0;
3466 charger
->pdata
->cs100_status
= 0;
3467 charger
->pdata
->capacity
= 101;
3468 charger
->pdata
->vout_status
= MFC_VOUT_5V
;
3469 charger
->pdata
->opfq_cnt
= 0;
3471 charger
->is_mst_on
= MST_MODE_0
;
3472 charger
->chip_id
= MFC_CHIP_IDT
;
3473 charger
->is_otg_on
= false;
3474 charger
->led_cover
= 0;
3475 charger
->vout_mode
= MFC_VOUT_5V
;
3476 charger
->is_full_status
= 0;
3477 charger
->is_afc_tx
= false;
3478 charger
->tx_id_done
= false;
3479 charger
->device_event
= 0;
3481 mutex_init(&charger
->io_lock
);
3484 if (charger
->pdata
->irq_wpc_det
) {
3485 INIT_DELAYED_WORK(&charger
->wpc_det_work
, mfc_wpc_det_work
);
3486 INIT_DELAYED_WORK(&charger
->wpc_opfq_work
, mfc_wpc_opfq_work
);
3489 /* wpc_irq (INT_A) */
3490 if (charger
->pdata
->irq_wpc_int
) {
3491 INIT_DELAYED_WORK(&charger
->wpc_isr_work
, mfc_wpc_isr_work
);
3492 INIT_DELAYED_WORK(&charger
->wpc_tx_id_work
, mfc_wpc_tx_id_work
);
3493 INIT_DELAYED_WORK(&charger
->wpc_int_req_work
, mfc_wpc_int_req_work
);
3495 INIT_DELAYED_WORK(&charger
->wpc_vout_mode_work
, mfc_wpc_vout_mode_work
);
3496 INIT_DELAYED_WORK(&charger
->wpc_afc_vout_work
, mfc_wpc_afc_vout_work
);
3497 INIT_DELAYED_WORK(&charger
->wpc_fw_update_work
, mfc_wpc_fw_update_work
);
3498 INIT_DELAYED_WORK(&charger
->wpc_cm_fet_work
, mfc_wpc_cm_fet_work
);
3499 INIT_DELAYED_WORK(&charger
->wpc_i2c_error_work
, mfc_wpc_i2c_error_work
);
3500 /*#if !defined(CONFIG_SEC_FACTORY)
3501 INIT_DELAYED_WORK(&charger->wpc_fw_booting_work, mfc_wpc_fw_booting_work);
3505 * Default Idle voltage of the INT_A is LOW.
3506 * Prevent the un-wanted INT_A Falling handling.
3507 * This is a work-around, and will be fixed by the revision.
3509 INIT_DELAYED_WORK(&charger
->mst_off_work
, mfc_mst_off_work
);
3511 mfc_cfg
.drv_data
= charger
;
3512 charger
->psy_chg
= power_supply_register(charger
->dev
, &mfc_charger_power_supply_desc
, &mfc_cfg
);
3513 if ((void *)charger
->psy_chg
< 0) {
3514 pr_err("%s: Failed to Register psy_chg\n", __func__
);
3515 goto err_supply_unreg
;
3518 charger
->wqueue
= create_singlethread_workqueue("mfc_workqueue");
3519 if (!charger
->wqueue
) {
3520 pr_err("%s: Fail to Create Workqueue\n", __func__
);
3521 goto err_pdata_free
;
3524 wake_lock_init(&charger
->wpc_wake_lock
, WAKE_LOCK_SUSPEND
,
3526 wake_lock_init(&charger
->wpc_update_lock
, WAKE_LOCK_SUSPEND
,
3528 wake_lock_init(&charger
->wpc_opfq_lock
, WAKE_LOCK_SUSPEND
,
3530 wake_lock_init(&charger
->wpc_afc_vout_lock
, WAKE_LOCK_SUSPEND
,
3531 "wpc_afc_vout_lock");
3532 wake_lock_init(&charger
->wpc_vout_mode_lock
, WAKE_LOCK_SUSPEND
,
3533 "wpc_vout_mode_lock");
3534 wake_lock_init(&charger
->wpc_tx_id_lock
, WAKE_LOCK_SUSPEND
,
3537 /* Enable interrupts after battery driver load */
3539 if (charger
->pdata
->irq_wpc_det
) {
3540 ret
= request_threaded_irq(charger
->pdata
->irq_wpc_det
,
3541 NULL
, mfc_wpc_det_irq_thread
,
3542 IRQF_TRIGGER_FALLING
| IRQF_TRIGGER_RISING
|
3544 "wpd-det-irq", charger
);
3546 pr_err("%s: Failed to Reqeust IRQ\n", __func__
);
3547 goto err_irq_wpc_det
;
3552 queue_delayed_work(charger
->wqueue
, &charger
->wpc_int_req_work
, 0);
3554 wc_w_state_irq
= gpio_get_value(charger
->pdata
->wpc_int
);
3555 pr_info("%s wc_w_state_irq = %d\n", __func__
, wc_w_state_irq
);
3556 if (gpio_get_value(charger
->pdata
->wpc_det
)) {
3557 pr_info("%s: Charger interrupt occured during lpm \n", __func__
);
3558 queue_delayed_work(charger
->wqueue
, &charger
->wpc_det_work
, 0);
3559 if(!wc_w_state_irq
&& !delayed_work_pending(&charger
->wpc_isr_work
))
3560 queue_delayed_work(charger
->wqueue
, &charger
->wpc_isr_work
, msecs_to_jiffies(2000));
3562 /*#if !defined(CONFIG_SEC_FACTORY)
3563 else if (!lpcharge) {
3564 pr_info("%s: call wpc_fw_booting_work for firmware update\n", __func__);
3565 queue_delayed_work(charger->wqueue, &charger->wpc_fw_booting_work, 0);
3569 ret
= sysfs_create_group(&charger
->psy_chg
->dev
.kobj
, &mfc_attr_group
);
3571 dev_info(&client
->dev
,
3572 "%s: sysfs_create_group failed\n", __func__
);
3574 charger
->is_probed
= true;
3575 dev_info(&client
->dev
,
3576 "%s: MFC Charger Driver Loaded\n", __func__
);
3578 device_init_wakeup(charger
->dev
, 1);
3583 power_supply_unregister(charger
->psy_chg
);
3585 mutex_destroy(&charger
->io_lock
);
3586 err_i2cfunc_not_support
:
3590 devm_kfree(&client
->dev
, pdata
);
3594 static int mfc_charger_remove(struct i2c_client
*client
)
3599 #if defined(CONFIG_PM)
3600 static int mfc_charger_suspend(struct device
*dev
)
3602 struct mfc_charger_data
*charger
= dev_get_drvdata(dev
);
3604 if (device_may_wakeup(charger
->dev
)){
3605 enable_irq_wake(charger
->pdata
->irq_wpc_int
);
3606 enable_irq_wake(charger
->pdata
->irq_wpc_det
);
3608 disable_irq(charger
->pdata
->irq_wpc_int
);
3609 disable_irq(charger
->pdata
->irq_wpc_det
);
3614 static int mfc_charger_resume(struct device
*dev
)
3616 struct mfc_charger_data
*charger
= dev_get_drvdata(dev
);
3618 pr_info("%s \n", __func__
);
3620 if (device_may_wakeup(charger
->dev
)) {
3621 disable_irq_wake(charger
->pdata
->irq_wpc_int
);
3622 disable_irq_wake(charger
->pdata
->irq_wpc_det
);
3624 enable_irq(charger
->pdata
->irq_wpc_int
);
3625 enable_irq(charger
->pdata
->irq_wpc_det
);
3630 #define mfc_charger_suspend NULL
3631 #define mfc_charger_resume NULL
3634 static void mfc_charger_shutdown(struct i2c_client
*client
)
3636 struct mfc_charger_data
*charger
= i2c_get_clientdata(client
);
3638 pr_info("%s\n", __func__
);
3640 if (gpio_get_value(charger
->pdata
->wpc_det
)) {
3641 mfc_set_vrect_adjust(charger
, MFC_HEADROOM_1
);
3642 mfc_set_vout(charger
, MFC_VOUT_5V
);
3643 pr_info("%s: forced 5V Vout, wc_w_state_irq = %d\n",
3644 __func__
, gpio_get_value(charger
->pdata
->wpc_int
));
3648 static const struct i2c_device_id mfc_charger_id_table
[] = {
3649 { "mfc-charger", 0 },
3652 MODULE_DEVICE_TABLE(i2c
, mfc_id_table
);
3655 static struct of_device_id mfc_charger_match_table
[] = {
3656 { .compatible
= "idt,mfc-charger",},
3660 #define mfc_charger_match_table NULL
3663 const struct dev_pm_ops mfc_pm
= {
3664 .suspend
= mfc_charger_suspend
,
3665 .resume
= mfc_charger_resume
,
3668 static struct i2c_driver mfc_charger_driver
= {
3670 .name
= "mfc-charger",
3671 .owner
= THIS_MODULE
,
3672 #if defined(CONFIG_PM)
3674 #endif /* CONFIG_PM */
3675 .of_match_table
= mfc_charger_match_table
,
3677 .shutdown
= mfc_charger_shutdown
,
3678 .probe
= mfc_charger_probe
,
3679 .remove
= mfc_charger_remove
,
3680 .id_table
= mfc_charger_id_table
,
3683 static int __init
mfc_charger_init(void)
3685 pr_info("%s \n",__func__
);
3686 return i2c_add_driver(&mfc_charger_driver
);
3689 static void __exit
mfc_charger_exit(void)
3691 pr_info("%s \n",__func__
);
3692 i2c_del_driver(&mfc_charger_driver
);
3695 module_init(mfc_charger_init
);
3696 module_exit(mfc_charger_exit
);
3698 MODULE_DESCRIPTION("Samsung MFC Charger Driver");
3699 MODULE_AUTHOR("Samsung Electronics");
3700 MODULE_LICENSE("GPL");