| From 3f39628d2dd8bef74c96a810007e8e5c5d0cbd73 Mon Sep 17 00:00:00 2001 |
| From: Stephan Gerhold <stephan@gerhold.net> |
| Date: Thu, 10 Oct 2019 17:47:20 +0200 |
| Subject: [PATCH] extcon: sm5502: Reset registers during initialization |
| |
| commit 6942635032cfd3e003e980d2dfa4e6323a3ce145 upstream. |
| |
| On some devices (e.g. Samsung Galaxy A5 (2015)), the bootloader |
| seems to keep interrupts enabled for SM5502 when booting Linux. |
| Changing the cable state (i.e. plugging in a cable) - until the driver |
| is loaded - will therefore produce an interrupt that is never read. |
| |
| In this situation, the cable state will be stuck forever on the |
| initial state because SM5502 stops sending interrupts. |
| This can be avoided by clearing those pending interrupts after |
| the driver has been loaded. |
| |
| One way to do this is to reset all registers to default state |
| by writing to SM5502_REG_RESET. This ensures that we start from |
| a clean state, with all interrupts disabled. |
| |
| Suggested-by: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: Stephan Gerhold <stephan@gerhold.net> |
| Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c |
| index 98e4f616b8f1..ce511eaf366b 100644 |
| --- a/drivers/extcon/extcon-sm5502.c |
| +++ b/drivers/extcon/extcon-sm5502.c |
| @@ -65,6 +65,10 @@ struct sm5502_muic_info { |
| /* Default value of SM5502 register to bring up MUIC device. */ |
| static struct reg_data sm5502_reg_data[] = { |
| { |
| + .reg = SM5502_REG_RESET, |
| + .val = SM5502_REG_RESET_MASK, |
| + .invert = true, |
| + }, { |
| .reg = SM5502_REG_CONTROL, |
| .val = SM5502_REG_CONTROL_MASK_INT_MASK, |
| .invert = false, |
| diff --git a/drivers/extcon/extcon-sm5502.h b/drivers/extcon/extcon-sm5502.h |
| index 9dbb634d213b..ce1f1ec310c4 100644 |
| --- a/drivers/extcon/extcon-sm5502.h |
| +++ b/drivers/extcon/extcon-sm5502.h |
| @@ -237,6 +237,8 @@ enum sm5502_reg { |
| #define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \ |
| | (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT)) |
| |
| +#define SM5502_REG_RESET_MASK (0x1) |
| + |
| /* SM5502 Interrupts */ |
| enum sm5502_irq { |
| /* INT1 */ |
| -- |
| 2.7.4 |
| |