linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] extcon: sm5502: Add support for SM5504
@ 2021-05-20 11:23 Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 1/6] extcon: sm5502: Use devm_regmap_add_irq_chip() Stephan Gerhold
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

This patch series adds support for SM5504 to the existing extcon-sm5502
driver. SM5502 and SM5504 are fairly similar so support for SM5504 can
be added with a few simple if statements in the code.

I also put a few cleanup patches in front and convert the device tree
bindings to DT schema.

I tested this patch series on both SM5502 (Samsung Galaxy A5 2015)
and SM5504 (Samsung Galaxy S4 Mini Value Edition) and it seems to work
just fine for both.

Stephan Gerhold (6):
  extcon: sm5502: Use devm_regmap_add_irq_chip()
  extcon: sm5502: Implement i2c_driver->probe_new()
  extcon: sm5502: Drop invalid register write in sm5502_reg_data
  dt-bindings: extcon: sm5502: Convert to DT schema
  dt-bindings: extcon: sm5502: Document siliconmitus,sm5504-muic
  extcon: sm5502: Add support for SM5504

 .../bindings/extcon/extcon-sm5502.txt         |  21 --
 .../extcon/siliconmitus,sm5502-muic.yaml      |  52 +++++
 drivers/extcon/Kconfig                        |   2 +-
 drivers/extcon/extcon-sm5502.c                | 180 +++++++++++++++---
 drivers/extcon/extcon-sm5502.h                |  79 ++++++++
 5 files changed, 282 insertions(+), 52 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/extcon/extcon-sm5502.txt
 create mode 100644 Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml

-- 
2.31.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/6] extcon: sm5502: Use devm_regmap_add_irq_chip()
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 2/6] extcon: sm5502: Implement i2c_driver->probe_new() Stephan Gerhold
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

Use devm_regmap_add_irq_chip() to avoid having to remove the
irqchip explicitly in sm5502_muic_i2c_remove().

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 drivers/extcon/extcon-sm5502.c | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index db41d1c58efd..f0d155cf7518 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -600,8 +600,8 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c,
 
 	/* Support irq domain for SM5502 MUIC device */
 	irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_SHARED;
-	ret = regmap_add_irq_chip(info->regmap, info->irq, irq_flags, 0,
-				  &sm5502_muic_irq_chip, &info->irq_data);
+	ret = devm_regmap_add_irq_chip(info->dev, info->regmap, info->irq, irq_flags,
+				       0, &sm5502_muic_irq_chip, &info->irq_data);
 	if (ret != 0) {
 		dev_err(info->dev, "failed to request IRQ %d: %d\n",
 				    info->irq, ret);
@@ -661,15 +661,6 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c,
 	return 0;
 }
 
-static int sm5502_muic_i2c_remove(struct i2c_client *i2c)
-{
-	struct sm5502_muic_info *info = i2c_get_clientdata(i2c);
-
-	regmap_del_irq_chip(info->irq, info->irq_data);
-
-	return 0;
-}
-
 static const struct of_device_id sm5502_dt_match[] = {
 	{ .compatible = "siliconmitus,sm5502-muic" },
 	{ },
@@ -714,7 +705,6 @@ static struct i2c_driver sm5502_muic_i2c_driver = {
 		.of_match_table = sm5502_dt_match,
 	},
 	.probe	= sm5022_muic_i2c_probe,
-	.remove	= sm5502_muic_i2c_remove,
 	.id_table = sm5502_i2c_id,
 };
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/6] extcon: sm5502: Implement i2c_driver->probe_new()
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 1/6] extcon: sm5502: Use devm_regmap_add_irq_chip() Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 3/6] extcon: sm5502: Drop invalid register write in sm5502_reg_data Stephan Gerhold
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

sm5022_muic_i2c_probe() does not use the i2c_device_id,
so implement i2c_driver->probe_new() instead of probe().

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 drivers/extcon/extcon-sm5502.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index f0d155cf7518..907ecd01ebb7 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -563,8 +563,7 @@ static void sm5502_init_dev_type(struct sm5502_muic_info *info)
 	}
 }
 
-static int sm5022_muic_i2c_probe(struct i2c_client *i2c,
-				 const struct i2c_device_id *id)
+static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
 {
 	struct device_node *np = i2c->dev.of_node;
 	struct sm5502_muic_info *info;
@@ -704,7 +703,7 @@ static struct i2c_driver sm5502_muic_i2c_driver = {
 		.pm	= &sm5502_muic_pm_ops,
 		.of_match_table = sm5502_dt_match,
 	},
-	.probe	= sm5022_muic_i2c_probe,
+	.probe_new = sm5022_muic_i2c_probe,
 	.id_table = sm5502_i2c_id,
 };
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/6] extcon: sm5502: Drop invalid register write in sm5502_reg_data
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 1/6] extcon: sm5502: Use devm_regmap_add_irq_chip() Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 2/6] extcon: sm5502: Implement i2c_driver->probe_new() Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 4/6] dt-bindings: extcon: sm5502: Convert to DT schema Stephan Gerhold
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

When sm5502_init_dev_type() iterates over sm5502_reg_data to
initialize the registers it is limited by ARRAY_SIZE(sm5502_reg_data).
There is no need to add another empty element to sm5502_reg_data.

Having the additional empty element in sm5502_reg_data will just
result in writing 0xff to register 0x00, which does not really
make sense.

Fixes: 914b881f9452 ("extcon: sm5502: Add support new SM5502 extcon device driver")
Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 drivers/extcon/extcon-sm5502.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index 907ecd01ebb7..9f40bb9f1f81 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -88,7 +88,6 @@ static struct reg_data sm5502_reg_data[] = {
 			| SM5502_REG_INTM2_MHL_MASK,
 		.invert = true,
 	},
-	{ }
 };
 
 /* List of detectable cables */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/6] dt-bindings: extcon: sm5502: Convert to DT schema
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
                   ` (2 preceding siblings ...)
  2021-05-20 11:23 ` [PATCH 3/6] extcon: sm5502: Drop invalid register write in sm5502_reg_data Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 5/6] dt-bindings: extcon: sm5502: Document siliconmitus,sm5504-muic Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 6/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
  5 siblings, 0 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

Convert the extcon-sm5502 device tree bindings to DT schema.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 .../bindings/extcon/extcon-sm5502.txt         | 21 --------
 .../extcon/siliconmitus,sm5502-muic.yaml      | 50 +++++++++++++++++++
 2 files changed, 50 insertions(+), 21 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/extcon/extcon-sm5502.txt
 create mode 100644 Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml

diff --git a/Documentation/devicetree/bindings/extcon/extcon-sm5502.txt b/Documentation/devicetree/bindings/extcon/extcon-sm5502.txt
deleted file mode 100644
index fc3888e09549..000000000000
--- a/Documentation/devicetree/bindings/extcon/extcon-sm5502.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-
-* SM5502 MUIC (Micro-USB Interface Controller) device
-
-The Silicon Mitus SM5502 is a MUIC (Micro-USB Interface Controller) device
-which can detect the state of external accessory when external accessory is
-attached or detached and button is pressed or released. It is interfaced to
-the host controller using an I2C interface.
-
-Required properties:
-- compatible: Should be "siliconmitus,sm5502-muic"
-- reg: Specifies the I2C slave address of the MUIC block. It should be 0x25
-- interrupts: Interrupt specifiers for detection interrupt sources.
-
-Example:
-
-	sm5502@25 {
-		compatible = "siliconmitus,sm5502-muic";
-		interrupt-parent = <&gpx1>;
-		interrupts = <5 0>;
-		reg = <0x25>;
-	};
diff --git a/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml b/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml
new file mode 100644
index 000000000000..0432b0502e0b
--- /dev/null
+++ b/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml
@@ -0,0 +1,50 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/extcon/siliconmitus,sm5502-muic.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: SM5502 MUIC (Micro-USB Interface Controller) device
+
+maintainers:
+  - Chanwoo Choi <cw00.choi@samsung.com>
+
+description:
+  The Silicon Mitus SM5502 is a MUIC (Micro-USB Interface Controller) device
+  which can detect the state of external accessory when external accessory is
+  attached or detached and button is pressed or released. It is interfaced to
+  the host controller using an I2C interface.
+
+properties:
+  compatible:
+    enum:
+      - siliconmitus,sm5502-muic
+
+  reg:
+    maxItems: 1
+    description: I2C slave address of the device. Usually 0x25 for SM5502.
+
+  interrupts:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        extcon@25 {
+                compatible = "siliconmitus,sm5502-muic";
+                reg = <0x25>;
+                interrupt-parent = <&msmgpio>;
+                interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
+        };
+    };
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 5/6] dt-bindings: extcon: sm5502: Document siliconmitus,sm5504-muic
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
                   ` (3 preceding siblings ...)
  2021-05-20 11:23 ` [PATCH 4/6] dt-bindings: extcon: sm5502: Convert to DT schema Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-20 11:23 ` [PATCH 6/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
  5 siblings, 0 replies; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

Document support for SM5504 with the new siliconmitus,sm5504-muic
compatible.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
 .../bindings/extcon/siliconmitus,sm5502-muic.yaml           | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml b/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml
index 0432b0502e0b..fd2e55088888 100644
--- a/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml
+++ b/Documentation/devicetree/bindings/extcon/siliconmitus,sm5502-muic.yaml
@@ -4,7 +4,7 @@
 $id: http://devicetree.org/schemas/extcon/siliconmitus,sm5502-muic.yaml#
 $schema: http://devicetree.org/meta-schemas/core.yaml#
 
-title: SM5502 MUIC (Micro-USB Interface Controller) device
+title: SM5502/SM5504 MUIC (Micro-USB Interface Controller) device
 
 maintainers:
   - Chanwoo Choi <cw00.choi@samsung.com>
@@ -19,10 +19,12 @@ properties:
   compatible:
     enum:
       - siliconmitus,sm5502-muic
+      - siliconmitus,sm5504-muic
 
   reg:
     maxItems: 1
-    description: I2C slave address of the device. Usually 0x25 for SM5502.
+    description: I2C slave address of the device. Usually 0x25 for SM5502,
+      0x14 for SM5504.
 
   interrupts:
     maxItems: 1
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 6/6] extcon: sm5502: Add support for SM5504
  2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
                   ` (4 preceding siblings ...)
  2021-05-20 11:23 ` [PATCH 5/6] dt-bindings: extcon: sm5502: Document siliconmitus,sm5504-muic Stephan Gerhold
@ 2021-05-20 11:23 ` Stephan Gerhold
  2021-05-24  0:54   ` kernel test robot
  5 siblings, 1 reply; 8+ messages in thread
From: Stephan Gerhold @ 2021-05-20 11:23 UTC (permalink / raw)
  To: Chanwoo Choi, MyungJoo Ham
  Cc: Rob Herring, devicetree, linux-kernel, Nikita Travkin,
	~postmarketos/upstreaming, Stephan Gerhold

SM5504 is another MUIC from Silicon Mitus that is fairly similar
to SM5502. They seem to use the same register set, but:

  - SM5504 has some additional bits in SM5502_REG_CONTROL
  - SM5504 has a quite different set of interrupts
  - SM5504 reports USB OTG as dev_type1 = BIT(0) instead of BIT(7)

Overall it's minor and we can support this using the existing
enum sm5502_types plus a few switch/if statements.

Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
Interestingly enough the register set (and especially the interrupts)
also look *very* similar to Richtek RT8973A (extcon-rt8973a) but
I didn't investigate this further.

Note that the changes in this patch are mostly based on guesswork
based on a SM5504 driver from Nitin Chaudhary [1] used in some Samsung
vendor kernels, since I was not able to find a public datasheet for SM5504.

[1]: https://github.com/NitinChaudharyUSC/MSM8x16_8x26/blob/master/drivers/misc/sm5504.c
---
 drivers/extcon/Kconfig         |   2 +-
 drivers/extcon/extcon-sm5502.c | 164 +++++++++++++++++++++++++++++----
 drivers/extcon/extcon-sm5502.h |  79 ++++++++++++++++
 3 files changed, 228 insertions(+), 17 deletions(-)

diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
index e3db936becfd..c69d40ae5619 100644
--- a/drivers/extcon/Kconfig
+++ b/drivers/extcon/Kconfig
@@ -154,7 +154,7 @@ config EXTCON_RT8973A
 	  from abnormal high input voltage (up to 28V).
 
 config EXTCON_SM5502
-	tristate "Silicon Mitus SM5502 EXTCON support"
+	tristate "Silicon Mitus SM5502/SM5504 EXTCON support"
 	depends on I2C
 	select IRQ_DOMAIN
 	select REGMAP_I2C
diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index 9f40bb9f1f81..9d8f208c68cc 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -40,6 +40,7 @@ struct sm5502_muic_info {
 	struct i2c_client *i2c;
 	struct regmap *regmap;
 
+	enum sm5502_types type;
 	struct regmap_irq_chip_data *irq_data;
 	struct muic_irq *muic_irqs;
 	unsigned int num_muic_irqs;
@@ -90,6 +91,33 @@ static struct reg_data sm5502_reg_data[] = {
 	},
 };
 
+/* Default value of SM5504 register to bring up MUIC device. */
+static struct reg_data sm5504_reg_data[] = {
+	{
+		.reg = SM5502_REG_RESET,
+		.val = SM5502_REG_RESET_MASK,
+		.invert = true,
+	}, {
+		.reg = SM5502_REG_INTMASK1,
+		.val = SM5504_REG_INTM1_ATTACH_MASK
+			| SM5504_REG_INTM1_DETACH_MASK,
+		.invert = false,
+	}, {
+		.reg = SM5502_REG_INTMASK2,
+		.val = SM5504_REG_INTM2_RID_CHG_MASK
+			| SM5504_REG_INTM2_UVLO_MASK
+			| SM5504_REG_INTM2_POR_MASK,
+		.invert = true,
+	}, {
+		.reg = SM5502_REG_CONTROL,
+		.val = SM5502_REG_CONTROL_MANUAL_SW_MASK
+			| SM5504_REG_CONTROL_CHGTYP_MASK
+			| SM5504_REG_CONTROL_USBCHDEN_MASK
+			| SM5504_REG_CONTROL_ADC_EN_MASK,
+		.invert = true,
+	},
+};
+
 /* List of detectable cables */
 static const unsigned int sm5502_extcon_cable[] = {
 	EXTCON_USB,
@@ -198,6 +226,55 @@ static const struct regmap_irq_chip sm5502_muic_irq_chip = {
 	.num_irqs		= ARRAY_SIZE(sm5502_irqs),
 };
 
+/* List of supported interrupt for SM5504 */
+static struct muic_irq sm5504_muic_irqs[] = {
+	{ SM5504_IRQ_INT1_ATTACH,	"muic-attach" },
+	{ SM5504_IRQ_INT1_DETACH,	"muic-detach" },
+	{ SM5504_IRQ_INT1_CHG_DET,	"muic-chg-det" },
+	{ SM5504_IRQ_INT1_DCD_OUT,	"muic-dcd-out" },
+	{ SM5504_IRQ_INT1_OVP_EVENT,	"muic-ovp-event" },
+	{ SM5504_IRQ_INT1_CONNECT,	"muic-connect" },
+	{ SM5504_IRQ_INT1_ADC_CHG,	"muic-adc-chg" },
+	{ SM5504_IRQ_INT2_RID_CHG,	"muic-rid-chg" },
+	{ SM5504_IRQ_INT2_UVLO,		"muic-uvlo" },
+	{ SM5504_IRQ_INT2_POR,		"muic-por" },
+	{ SM5504_IRQ_INT2_OVP_FET,	"muic-ovp-fet" },
+	{ SM5504_IRQ_INT2_OCP_LATCH,	"muic-ocp-latch" },
+	{ SM5504_IRQ_INT2_OCP_EVENT,	"muic-ocp-event" },
+	{ SM5504_IRQ_INT2_OVP_OCP_EVENT, "muic-ovp-ocp-event" },
+};
+
+/* Define interrupt list of SM5504 to register regmap_irq */
+static const struct regmap_irq sm5504_irqs[] = {
+	/* INT1 interrupts */
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_ATTACH_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_DETACH_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_CHG_DET_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_DCD_OUT_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_OVP_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_CONNECT_MASK, },
+	{ .reg_offset = 0, .mask = SM5504_IRQ_INT1_ADC_CHG_MASK, },
+
+	/* INT2 interrupts */
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_RID_CHG_MASK,},
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_UVLO_MASK, },
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_POR_MASK, },
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_OVP_FET_MASK, },
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_OCP_LATCH_MASK, },
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_OCP_EVENT_MASK, },
+	{ .reg_offset = 1, .mask = SM5504_IRQ_INT2_OVP_OCP_EVENT_MASK, },
+};
+
+static const struct regmap_irq_chip sm5504_muic_irq_chip = {
+	.name			= "sm5504",
+	.status_base		= SM5502_REG_INT1,
+	.mask_base		= SM5502_REG_INTMASK1,
+	.mask_invert		= false,
+	.num_regs		= 2,
+	.irqs			= sm5504_irqs,
+	.num_irqs		= ARRAY_SIZE(sm5504_irqs),
+};
+
 /* Define regmap configuration of SM5502 for I2C communication  */
 static bool sm5502_muic_volatile_reg(struct device *dev, unsigned int reg)
 {
@@ -276,9 +353,14 @@ static int sm5502_muic_set_path(struct sm5502_muic_info *info,
 /* Return cable type of attached or detached accessories */
 static unsigned int sm5502_muic_get_cable_type(struct sm5502_muic_info *info)
 {
-	unsigned int cable_type, adc, dev_type1;
+	unsigned int cable_type, adc, dev_type1, otg_dev_type1;
 	int ret;
 
+	if (info->type == TYPE_SM5504)
+		otg_dev_type1 = SM5504_REG_DEV_TYPE1_USB_OTG_MASK;
+	else
+		otg_dev_type1 = SM5502_REG_DEV_TYPE1_USB_OTG_MASK;
+
 	/* Read ADC value according to external cable or button */
 	ret = regmap_read(info->regmap, SM5502_REG_ADC, &adc);
 	if (ret) {
@@ -301,11 +383,9 @@ static unsigned int sm5502_muic_get_cable_type(struct sm5502_muic_info *info)
 			return ret;
 		}
 
-		switch (dev_type1) {
-		case SM5502_REG_DEV_TYPE1_USB_OTG_MASK:
+		if (dev_type1 == otg_dev_type1) {
 			cable_type = SM5502_MUIC_ADC_GROUND_USB_OTG;
-			break;
-		default:
+		} else {
 			dev_dbg(info->dev,
 				"cannot identify the cable type: adc(0x%x), dev_type1(0x%x)\n",
 				adc, dev_type1);
@@ -358,6 +438,11 @@ static unsigned int sm5502_muic_get_cable_type(struct sm5502_muic_info *info)
 			return ret;
 		}
 
+		if (dev_type1 == otg_dev_type1) {
+			cable_type = SM5502_MUIC_ADC_OPEN_USB_OTG;
+			break;
+		}
+
 		switch (dev_type1) {
 		case SM5502_REG_DEV_TYPE1_USB_SDP_MASK:
 			cable_type = SM5502_MUIC_ADC_OPEN_USB;
@@ -365,9 +450,6 @@ static unsigned int sm5502_muic_get_cable_type(struct sm5502_muic_info *info)
 		case SM5502_REG_DEV_TYPE1_DEDICATED_CHG_MASK:
 			cable_type = SM5502_MUIC_ADC_OPEN_TA;
 			break;
-		case SM5502_REG_DEV_TYPE1_USB_OTG_MASK:
-			cable_type = SM5502_MUIC_ADC_OPEN_USB_OTG;
-			break;
 		default:
 			dev_dbg(info->dev,
 				"cannot identify the cable type: adc(0x%x)\n",
@@ -497,6 +579,34 @@ static int sm5502_parse_irq(struct sm5502_muic_info *info, int irq_type)
 	return 0;
 }
 
+static int sm5504_parse_irq(struct sm5502_muic_info *info, int irq_type)
+{
+	switch (irq_type) {
+	case SM5504_IRQ_INT1_ATTACH:
+		info->irq_attach = true;
+		break;
+	case SM5504_IRQ_INT1_DETACH:
+		info->irq_detach = true;
+		break;
+	case SM5504_IRQ_INT1_CHG_DET:
+	case SM5504_IRQ_INT1_DCD_OUT:
+	case SM5504_IRQ_INT1_OVP_EVENT:
+	case SM5504_IRQ_INT1_CONNECT:
+	case SM5504_IRQ_INT1_ADC_CHG:
+	case SM5504_IRQ_INT2_RID_CHG:
+	case SM5504_IRQ_INT2_UVLO:
+	case SM5504_IRQ_INT2_POR:
+	case SM5504_IRQ_INT2_OVP_FET:
+	case SM5504_IRQ_INT2_OCP_LATCH:
+	case SM5504_IRQ_INT2_OCP_EVENT:
+	case SM5504_IRQ_INT2_OVP_OCP_EVENT:
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 static irqreturn_t sm5502_muic_irq_handler(int irq, void *data)
 {
 	struct sm5502_muic_info *info = data;
@@ -506,7 +616,10 @@ static irqreturn_t sm5502_muic_irq_handler(int irq, void *data)
 		if (irq == info->muic_irqs[i].virq)
 			irq_type = info->muic_irqs[i].irq;
 
-	ret = sm5502_parse_irq(info, irq_type);
+	if (info->type == TYPE_SM5504)
+		ret = sm5504_parse_irq(info, irq_type);
+	else
+		ret = sm5502_parse_irq(info, irq_type);
 	if (ret < 0) {
 		dev_warn(info->dev, "cannot handle is interrupt:%d\n",
 				    irq_type);
@@ -565,6 +678,7 @@ static void sm5502_init_dev_type(struct sm5502_muic_info *info)
 static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
 {
 	struct device_node *np = i2c->dev.of_node;
+	const struct regmap_irq_chip *irq_chip;
 	struct sm5502_muic_info *info;
 	int i, ret, irq_flags;
 
@@ -579,10 +693,26 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
 	info->dev = &i2c->dev;
 	info->i2c = i2c;
 	info->irq = i2c->irq;
-	info->muic_irqs = sm5502_muic_irqs;
-	info->num_muic_irqs = ARRAY_SIZE(sm5502_muic_irqs);
-	info->reg_data = sm5502_reg_data;
-	info->num_reg_data = ARRAY_SIZE(sm5502_reg_data);
+	info->type = (enum sm5502_types)device_get_match_data(info->dev);
+
+	switch (info->type) {
+	case TYPE_SM5502:
+		irq_chip = &sm5502_muic_irq_chip;
+		info->muic_irqs = sm5502_muic_irqs;
+		info->num_muic_irqs = ARRAY_SIZE(sm5502_muic_irqs);
+		info->reg_data = sm5502_reg_data;
+		info->num_reg_data = ARRAY_SIZE(sm5502_reg_data);
+		break;
+	case TYPE_SM5504:
+		irq_chip = &sm5504_muic_irq_chip;
+		info->muic_irqs = sm5504_muic_irqs;
+		info->num_muic_irqs = ARRAY_SIZE(sm5504_muic_irqs);
+		info->reg_data = sm5504_reg_data;
+		info->num_reg_data = ARRAY_SIZE(sm5504_reg_data);
+		break;
+	default:
+		return -EINVAL;
+	}
 
 	mutex_init(&info->mutex);
 
@@ -598,8 +728,8 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
 
 	/* Support irq domain for SM5502 MUIC device */
 	irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_SHARED;
-	ret = devm_regmap_add_irq_chip(info->dev, info->regmap, info->irq, irq_flags,
-				       0, &sm5502_muic_irq_chip, &info->irq_data);
+	ret = devm_regmap_add_irq_chip(info->dev, info->regmap, info->irq,
+				       irq_flags, 0, irq_chip, &info->irq_data);
 	if (ret != 0) {
 		dev_err(info->dev, "failed to request IRQ %d: %d\n",
 				    info->irq, ret);
@@ -660,7 +790,8 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
 }
 
 static const struct of_device_id sm5502_dt_match[] = {
-	{ .compatible = "siliconmitus,sm5502-muic" },
+	{ .compatible = "siliconmitus,sm5502-muic", .data = (void *)TYPE_SM5502 },
+	{ .compatible = "siliconmitus,sm5504-muic", .data = (void *)TYPE_SM5504 },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, sm5502_dt_match);
@@ -692,6 +823,7 @@ static SIMPLE_DEV_PM_OPS(sm5502_muic_pm_ops,
 
 static const struct i2c_device_id sm5502_i2c_id[] = {
 	{ "sm5502", TYPE_SM5502 },
+	{ "sm5504", TYPE_SM5504 },
 	{ }
 };
 MODULE_DEVICE_TABLE(i2c, sm5502_i2c_id);
diff --git a/drivers/extcon/extcon-sm5502.h b/drivers/extcon/extcon-sm5502.h
index ce1f1ec310c4..0ce00274ed86 100644
--- a/drivers/extcon/extcon-sm5502.h
+++ b/drivers/extcon/extcon-sm5502.h
@@ -10,6 +10,7 @@
 
 enum sm5502_types {
 	TYPE_SM5502,
+	TYPE_SM5504,
 };
 
 /* SM5502 registers */
@@ -93,6 +94,13 @@ enum sm5502_reg {
 #define SM5502_REG_CONTROL_RAW_DATA_MASK	(0x1 << SM5502_REG_CONTROL_RAW_DATA_SHIFT)
 #define SM5502_REG_CONTROL_SW_OPEN_MASK		(0x1 << SM5502_REG_CONTROL_SW_OPEN_SHIFT)
 
+#define SM5504_REG_CONTROL_CHGTYP_SHIFT		5
+#define SM5504_REG_CONTROL_USBCHDEN_SHIFT	6
+#define SM5504_REG_CONTROL_ADC_EN_SHIFT		7
+#define SM5504_REG_CONTROL_CHGTYP_MASK		(0x1 << SM5504_REG_CONTROL_CHGTYP_SHIFT)
+#define SM5504_REG_CONTROL_USBCHDEN_MASK	(0x1 << SM5504_REG_CONTROL_USBCHDEN_SHIFT)
+#define SM5504_REG_CONTROL_ADC_EN_MASK		(0x1 << SM5504_REG_CONTROL_ADC_EN_SHIFT)
+
 #define SM5502_REG_INTM1_ATTACH_SHIFT		0
 #define SM5502_REG_INTM1_DETACH_SHIFT		1
 #define SM5502_REG_INTM1_KP_SHIFT		2
@@ -123,6 +131,36 @@ enum sm5502_reg {
 #define SM5502_REG_INTM2_STUCK_KEY_RCV_MASK	(0x1 << SM5502_REG_INTM2_STUCK_KEY_RCV_SHIFT)
 #define SM5502_REG_INTM2_MHL_MASK		(0x1 << SM5502_REG_INTM2_MHL_SHIFT)
 
+#define SM5504_REG_INTM1_ATTACH_SHIFT		0
+#define SM5504_REG_INTM1_DETACH_SHIFT		1
+#define SM5504_REG_INTM1_CHG_DET_SHIFT		2
+#define SM5504_REG_INTM1_DCD_OUT_SHIFT		3
+#define SM5504_REG_INTM1_OVP_EVENT_SHIFT	4
+#define SM5504_REG_INTM1_CONNECT_SHIFT		5
+#define SM5504_REG_INTM1_ADC_CHG_SHIFT		6
+#define SM5504_REG_INTM1_ATTACH_MASK		(0x1 << SM5504_REG_INTM1_ATTACH_SHIFT)
+#define SM5504_REG_INTM1_DETACH_MASK		(0x1 << SM5504_REG_INTM1_DETACH_SHIFT)
+#define SM5504_REG_INTM1_CHG_DET_MASK		(0x1 << SM5504_REG_INTM1_CHG_DET_SHIFT)
+#define SM5504_REG_INTM1_DCD_OUT_MASK		(0x1 << SM5504_REG_INTM1_DCD_OUT_SHIFT)
+#define SM5504_REG_INTM1_OVP_EVENT_MASK		(0x1 << SM5504_REG_INTM1_OVP_EVENT_SHIFT)
+#define SM5504_REG_INTM1_CONNECT_MASK		(0x1 << SM5504_REG_INTM1_CONNECT_SHIFT)
+#define SM5504_REG_INTM1_ADC_CHG_MASK		(0x1 << SM5504_REG_INTM1_ADC_CHG_SHIFT)
+
+#define SM5504_REG_INTM2_RID_CHG_SHIFT		0
+#define SM5504_REG_INTM2_UVLO_SHIFT		1
+#define SM5504_REG_INTM2_POR_SHIFT		2
+#define SM5504_REG_INTM2_OVP_FET_SHIFT		4
+#define SM5504_REG_INTM2_OCP_LATCH_SHIFT	5
+#define SM5504_REG_INTM2_OCP_EVENT_SHIFT	6
+#define SM5504_REG_INTM2_OVP_OCP_EVENT_SHIFT	7
+#define SM5504_REG_INTM2_RID_CHG_MASK		(0x1 << SM5504_REG_INTM2_RID_CHG_SHIFT)
+#define SM5504_REG_INTM2_UVLO_MASK		(0x1 << SM5504_REG_INTM2_UVLO_SHIFT)
+#define SM5504_REG_INTM2_POR_MASK		(0x1 << SM5504_REG_INTM2_POR_SHIFT)
+#define SM5504_REG_INTM2_OVP_FET_MASK		(0x1 << SM5504_REG_INTM2_OVP_FET_SHIFT)
+#define SM5504_REG_INTM2_OCP_LATCH_MASK		(0x1 << SM5504_REG_INTM2_OCP_LATCH_SHIFT)
+#define SM5504_REG_INTM2_OCP_EVENT_MASK		(0x1 << SM5504_REG_INTM2_OCP_EVENT_SHIFT)
+#define SM5504_REG_INTM2_OVP_OCP_EVENT_MASK	(0x1 << SM5504_REG_INTM2_OVP_OCP_EVENT_SHIFT)
+
 #define SM5502_REG_ADC_SHIFT			0
 #define SM5502_REG_ADC_MASK			(0x1f << SM5502_REG_ADC_SHIFT)
 
@@ -199,6 +237,9 @@ enum sm5502_reg {
 #define SM5502_REG_DEV_TYPE1_DEDICATED_CHG_MASK		(0x1 << SM5502_REG_DEV_TYPE1_DEDICATED_CHG_SHIFT)
 #define SM5502_REG_DEV_TYPE1_USB_OTG_MASK		(0x1 << SM5502_REG_DEV_TYPE1_USB_OTG_SHIFT)
 
+#define SM5504_REG_DEV_TYPE1_USB_OTG_SHIFT		0
+#define SM5504_REG_DEV_TYPE1_USB_OTG_MASK		(0x1 << SM5504_REG_DEV_TYPE1_USB_OTG_SHIFT)
+
 #define SM5502_REG_DEV_TYPE2_JIG_USB_ON_SHIFT		0
 #define SM5502_REG_DEV_TYPE2_JIG_USB_OFF_SHIFT		1
 #define SM5502_REG_DEV_TYPE2_JIG_UART_ON_SHIFT		2
@@ -277,4 +318,42 @@ enum sm5502_irq {
 #define SM5502_IRQ_INT2_STUCK_KEY_RCV_MASK	BIT(4)
 #define SM5502_IRQ_INT2_MHL_MASK		BIT(5)
 
+/* SM5504 Interrupts */
+enum sm5504_irq {
+	/* INT1 */
+	SM5504_IRQ_INT1_ATTACH,
+	SM5504_IRQ_INT1_DETACH,
+	SM5504_IRQ_INT1_CHG_DET,
+	SM5504_IRQ_INT1_DCD_OUT,
+	SM5504_IRQ_INT1_OVP_EVENT,
+	SM5504_IRQ_INT1_CONNECT,
+	SM5504_IRQ_INT1_ADC_CHG,
+
+	/* INT2 */
+	SM5504_IRQ_INT2_RID_CHG,
+	SM5504_IRQ_INT2_UVLO,
+	SM5504_IRQ_INT2_POR,
+	SM5504_IRQ_INT2_OVP_FET,
+	SM5504_IRQ_INT2_OCP_LATCH,
+	SM5504_IRQ_INT2_OCP_EVENT,
+	SM5504_IRQ_INT2_OVP_OCP_EVENT,
+
+	SM5504_IRQ_NUM,
+};
+
+#define SM5504_IRQ_INT1_ATTACH_MASK		BIT(0)
+#define SM5504_IRQ_INT1_DETACH_MASK		BIT(1)
+#define SM5504_IRQ_INT1_CHG_DET_MASK		BIT(2)
+#define SM5504_IRQ_INT1_DCD_OUT_MASK		BIT(3)
+#define SM5504_IRQ_INT1_OVP_MASK		BIT(4)
+#define SM5504_IRQ_INT1_CONNECT_MASK		BIT(5)
+#define SM5504_IRQ_INT1_ADC_CHG_MASK		BIT(6)
+#define SM5504_IRQ_INT2_RID_CHG_MASK		BIT(0)
+#define SM5504_IRQ_INT2_UVLO_MASK		BIT(1)
+#define SM5504_IRQ_INT2_POR_MASK		BIT(2)
+#define SM5504_IRQ_INT2_OVP_FET_MASK		BIT(4)
+#define SM5504_IRQ_INT2_OCP_LATCH_MASK		BIT(5)
+#define SM5504_IRQ_INT2_OCP_EVENT_MASK		BIT(6)
+#define SM5504_IRQ_INT2_OVP_OCP_EVENT_MASK	BIT(7)
+
 #endif /*  __LINUX_EXTCON_SM5502_H */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 6/6] extcon: sm5502: Add support for SM5504
  2021-05-20 11:23 ` [PATCH 6/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
@ 2021-05-24  0:54   ` kernel test robot
  0 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2021-05-24  0:54 UTC (permalink / raw)
  To: Stephan Gerhold, Chanwoo Choi, MyungJoo Ham
  Cc: kbuild-all, clang-built-linux, Rob Herring, devicetree,
	linux-kernel, Nikita Travkin, ~postmarketos/upstreaming,
	Stephan Gerhold

[-- Attachment #1: Type: text/plain, Size: 11002 bytes --]

Hi Stephan,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on chanwoo-extcon/extcon-next]
[also build test WARNING on robh/for-next linus/master v5.13-rc2 next-20210521]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Stephan-Gerhold/extcon-sm5502-Add-support-for-SM5504/20210522-215255
base:   https://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git extcon-next
config: x86_64-randconfig-b001-20210522 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project e84a9b9bb3051c35dea993cdad7b3d2575638f85)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://github.com/0day-ci/linux/commit/f9928587360c40e166418ea5b10fc0c210b93330
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Stephan-Gerhold/extcon-sm5502-Add-support-for-SM5504/20210522-215255
        git checkout f9928587360c40e166418ea5b10fc0c210b93330
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/extcon/extcon-sm5502.c:696:15: warning: cast to smaller integer type 'enum sm5502_types' from 'const void *' [-Wvoid-pointer-to-enum-cast]
           info->type = (enum sm5502_types)device_get_match_data(info->dev);
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   1 warning generated.


vim +696 drivers/extcon/extcon-sm5502.c

914b881f9452fd Chanwoo Choi     2014-05-22  677  
9e92a019f01894 Stephan Gerhold  2021-05-20  678  static int sm5022_muic_i2c_probe(struct i2c_client *i2c)
914b881f9452fd Chanwoo Choi     2014-05-22  679  {
914b881f9452fd Chanwoo Choi     2014-05-22  680  	struct device_node *np = i2c->dev.of_node;
f9928587360c40 Stephan Gerhold  2021-05-20  681  	const struct regmap_irq_chip *irq_chip;
914b881f9452fd Chanwoo Choi     2014-05-22  682  	struct sm5502_muic_info *info;
914b881f9452fd Chanwoo Choi     2014-05-22  683  	int i, ret, irq_flags;
914b881f9452fd Chanwoo Choi     2014-05-22  684  
914b881f9452fd Chanwoo Choi     2014-05-22  685  	if (!np)
914b881f9452fd Chanwoo Choi     2014-05-22  686  		return -EINVAL;
914b881f9452fd Chanwoo Choi     2014-05-22  687  
914b881f9452fd Chanwoo Choi     2014-05-22  688  	info = devm_kzalloc(&i2c->dev, sizeof(*info), GFP_KERNEL);
914b881f9452fd Chanwoo Choi     2014-05-22  689  	if (!info)
914b881f9452fd Chanwoo Choi     2014-05-22  690  		return -ENOMEM;
914b881f9452fd Chanwoo Choi     2014-05-22  691  	i2c_set_clientdata(i2c, info);
914b881f9452fd Chanwoo Choi     2014-05-22  692  
914b881f9452fd Chanwoo Choi     2014-05-22  693  	info->dev = &i2c->dev;
914b881f9452fd Chanwoo Choi     2014-05-22  694  	info->i2c = i2c;
914b881f9452fd Chanwoo Choi     2014-05-22  695  	info->irq = i2c->irq;
f9928587360c40 Stephan Gerhold  2021-05-20 @696  	info->type = (enum sm5502_types)device_get_match_data(info->dev);
f9928587360c40 Stephan Gerhold  2021-05-20  697  
f9928587360c40 Stephan Gerhold  2021-05-20  698  	switch (info->type) {
f9928587360c40 Stephan Gerhold  2021-05-20  699  	case TYPE_SM5502:
f9928587360c40 Stephan Gerhold  2021-05-20  700  		irq_chip = &sm5502_muic_irq_chip;
914b881f9452fd Chanwoo Choi     2014-05-22  701  		info->muic_irqs = sm5502_muic_irqs;
914b881f9452fd Chanwoo Choi     2014-05-22  702  		info->num_muic_irqs = ARRAY_SIZE(sm5502_muic_irqs);
914b881f9452fd Chanwoo Choi     2014-05-22  703  		info->reg_data = sm5502_reg_data;
914b881f9452fd Chanwoo Choi     2014-05-22  704  		info->num_reg_data = ARRAY_SIZE(sm5502_reg_data);
f9928587360c40 Stephan Gerhold  2021-05-20  705  		break;
f9928587360c40 Stephan Gerhold  2021-05-20  706  	case TYPE_SM5504:
f9928587360c40 Stephan Gerhold  2021-05-20  707  		irq_chip = &sm5504_muic_irq_chip;
f9928587360c40 Stephan Gerhold  2021-05-20  708  		info->muic_irqs = sm5504_muic_irqs;
f9928587360c40 Stephan Gerhold  2021-05-20  709  		info->num_muic_irqs = ARRAY_SIZE(sm5504_muic_irqs);
f9928587360c40 Stephan Gerhold  2021-05-20  710  		info->reg_data = sm5504_reg_data;
f9928587360c40 Stephan Gerhold  2021-05-20  711  		info->num_reg_data = ARRAY_SIZE(sm5504_reg_data);
f9928587360c40 Stephan Gerhold  2021-05-20  712  		break;
f9928587360c40 Stephan Gerhold  2021-05-20  713  	default:
f9928587360c40 Stephan Gerhold  2021-05-20  714  		return -EINVAL;
f9928587360c40 Stephan Gerhold  2021-05-20  715  	}
914b881f9452fd Chanwoo Choi     2014-05-22  716  
914b881f9452fd Chanwoo Choi     2014-05-22  717  	mutex_init(&info->mutex);
914b881f9452fd Chanwoo Choi     2014-05-22  718  
914b881f9452fd Chanwoo Choi     2014-05-22  719  	INIT_WORK(&info->irq_work, sm5502_muic_irq_work);
914b881f9452fd Chanwoo Choi     2014-05-22  720  
914b881f9452fd Chanwoo Choi     2014-05-22  721  	info->regmap = devm_regmap_init_i2c(i2c, &sm5502_muic_regmap_config);
914b881f9452fd Chanwoo Choi     2014-05-22  722  	if (IS_ERR(info->regmap)) {
914b881f9452fd Chanwoo Choi     2014-05-22  723  		ret = PTR_ERR(info->regmap);
914b881f9452fd Chanwoo Choi     2014-05-22  724  		dev_err(info->dev, "failed to allocate register map: %d\n",
914b881f9452fd Chanwoo Choi     2014-05-22  725  				   ret);
914b881f9452fd Chanwoo Choi     2014-05-22  726  		return ret;
914b881f9452fd Chanwoo Choi     2014-05-22  727  	}
914b881f9452fd Chanwoo Choi     2014-05-22  728  
914b881f9452fd Chanwoo Choi     2014-05-22  729  	/* Support irq domain for SM5502 MUIC device */
914b881f9452fd Chanwoo Choi     2014-05-22  730  	irq_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_SHARED;
f9928587360c40 Stephan Gerhold  2021-05-20  731  	ret = devm_regmap_add_irq_chip(info->dev, info->regmap, info->irq,
f9928587360c40 Stephan Gerhold  2021-05-20  732  				       irq_flags, 0, irq_chip, &info->irq_data);
914b881f9452fd Chanwoo Choi     2014-05-22  733  	if (ret != 0) {
914b881f9452fd Chanwoo Choi     2014-05-22  734  		dev_err(info->dev, "failed to request IRQ %d: %d\n",
914b881f9452fd Chanwoo Choi     2014-05-22  735  				    info->irq, ret);
914b881f9452fd Chanwoo Choi     2014-05-22  736  		return ret;
914b881f9452fd Chanwoo Choi     2014-05-22  737  	}
914b881f9452fd Chanwoo Choi     2014-05-22  738  
914b881f9452fd Chanwoo Choi     2014-05-22  739  	for (i = 0; i < info->num_muic_irqs; i++) {
914b881f9452fd Chanwoo Choi     2014-05-22  740  		struct muic_irq *muic_irq = &info->muic_irqs[i];
363b389106e676 Andrzej Hajda    2015-09-24  741  		int virq = 0;
914b881f9452fd Chanwoo Choi     2014-05-22  742  
914b881f9452fd Chanwoo Choi     2014-05-22  743  		virq = regmap_irq_get_virq(info->irq_data, muic_irq->irq);
914b881f9452fd Chanwoo Choi     2014-05-22  744  		if (virq <= 0)
914b881f9452fd Chanwoo Choi     2014-05-22  745  			return -EINVAL;
914b881f9452fd Chanwoo Choi     2014-05-22  746  		muic_irq->virq = virq;
914b881f9452fd Chanwoo Choi     2014-05-22  747  
914b881f9452fd Chanwoo Choi     2014-05-22  748  		ret = devm_request_threaded_irq(info->dev, virq, NULL,
914b881f9452fd Chanwoo Choi     2014-05-22  749  						sm5502_muic_irq_handler,
005ad18727b489 Vasyl Gomonovych 2019-07-19  750  						IRQF_NO_SUSPEND | IRQF_ONESHOT,
914b881f9452fd Chanwoo Choi     2014-05-22  751  						muic_irq->name, info);
914b881f9452fd Chanwoo Choi     2014-05-22  752  		if (ret) {
fbae30d8dd3545 Chanwoo Choi     2014-08-12  753  			dev_err(info->dev,
fbae30d8dd3545 Chanwoo Choi     2014-08-12  754  				"failed: irq request (IRQ: %d, error :%d)\n",
fbae30d8dd3545 Chanwoo Choi     2014-08-12  755  				muic_irq->irq, ret);
914b881f9452fd Chanwoo Choi     2014-05-22  756  			return ret;
914b881f9452fd Chanwoo Choi     2014-05-22  757  		}
914b881f9452fd Chanwoo Choi     2014-05-22  758  	}
914b881f9452fd Chanwoo Choi     2014-05-22  759  
914b881f9452fd Chanwoo Choi     2014-05-22  760  	/* Allocate extcon device */
914b881f9452fd Chanwoo Choi     2014-05-22  761  	info->edev = devm_extcon_dev_allocate(info->dev, sm5502_extcon_cable);
914b881f9452fd Chanwoo Choi     2014-05-22  762  	if (IS_ERR(info->edev)) {
914b881f9452fd Chanwoo Choi     2014-05-22  763  		dev_err(info->dev, "failed to allocate memory for extcon\n");
914b881f9452fd Chanwoo Choi     2014-05-22  764  		return -ENOMEM;
914b881f9452fd Chanwoo Choi     2014-05-22  765  	}
914b881f9452fd Chanwoo Choi     2014-05-22  766  
914b881f9452fd Chanwoo Choi     2014-05-22  767  	/* Register extcon device */
914b881f9452fd Chanwoo Choi     2014-05-22  768  	ret = devm_extcon_dev_register(info->dev, info->edev);
914b881f9452fd Chanwoo Choi     2014-05-22  769  	if (ret) {
914b881f9452fd Chanwoo Choi     2014-05-22  770  		dev_err(info->dev, "failed to register extcon device\n");
914b881f9452fd Chanwoo Choi     2014-05-22  771  		return ret;
914b881f9452fd Chanwoo Choi     2014-05-22  772  	}
914b881f9452fd Chanwoo Choi     2014-05-22  773  
e1954452f500cb Chanwoo Choi     2014-05-28  774  	/*
e1954452f500cb Chanwoo Choi     2014-05-28  775  	 * Detect accessory after completing the initialization of platform
e1954452f500cb Chanwoo Choi     2014-05-28  776  	 *
e1954452f500cb Chanwoo Choi     2014-05-28  777  	 * - Use delayed workqueue to detect cable state and then
e1954452f500cb Chanwoo Choi     2014-05-28  778  	 * notify cable state to notifiee/platform through uevent.
e1954452f500cb Chanwoo Choi     2014-05-28  779  	 * After completing the booting of platform, the extcon provider
e1954452f500cb Chanwoo Choi     2014-05-28  780  	 * driver should notify cable state to upper layer.
e1954452f500cb Chanwoo Choi     2014-05-28  781  	 */
e1954452f500cb Chanwoo Choi     2014-05-28  782  	INIT_DELAYED_WORK(&info->wq_detcable, sm5502_muic_detect_cable_wq);
e1954452f500cb Chanwoo Choi     2014-05-28  783  	queue_delayed_work(system_power_efficient_wq, &info->wq_detcable,
e1954452f500cb Chanwoo Choi     2014-05-28  784  			msecs_to_jiffies(DELAY_MS_DEFAULT));
e1954452f500cb Chanwoo Choi     2014-05-28  785  
914b881f9452fd Chanwoo Choi     2014-05-22  786  	/* Initialize SM5502 device and print vendor id and version id */
914b881f9452fd Chanwoo Choi     2014-05-22  787  	sm5502_init_dev_type(info);
914b881f9452fd Chanwoo Choi     2014-05-22  788  
914b881f9452fd Chanwoo Choi     2014-05-22  789  	return 0;
914b881f9452fd Chanwoo Choi     2014-05-22  790  }
914b881f9452fd Chanwoo Choi     2014-05-22  791  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 34396 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-05-24  0:56 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-20 11:23 [PATCH 0/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
2021-05-20 11:23 ` [PATCH 1/6] extcon: sm5502: Use devm_regmap_add_irq_chip() Stephan Gerhold
2021-05-20 11:23 ` [PATCH 2/6] extcon: sm5502: Implement i2c_driver->probe_new() Stephan Gerhold
2021-05-20 11:23 ` [PATCH 3/6] extcon: sm5502: Drop invalid register write in sm5502_reg_data Stephan Gerhold
2021-05-20 11:23 ` [PATCH 4/6] dt-bindings: extcon: sm5502: Convert to DT schema Stephan Gerhold
2021-05-20 11:23 ` [PATCH 5/6] dt-bindings: extcon: sm5502: Document siliconmitus,sm5504-muic Stephan Gerhold
2021-05-20 11:23 ` [PATCH 6/6] extcon: sm5502: Add support for SM5504 Stephan Gerhold
2021-05-24  0:54   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).