i2c: Introduce common module to instantiate CCGx UCSI
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 5 Jan 2022 14:19:31 +0000 (16:19 +0200)
committerWolfram Sang <wsa@kernel.org>
Tue, 15 Feb 2022 09:04:53 +0000 (10:04 +0100)
Introduce a common module to provide an API to instantiate UCSI device
for Cypress CCGx Type-C controller. Individual bus drivers need to select
this one on demand.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/busses/i2c-ccgx-ucsi.c [new file with mode: 0644]
drivers/i2c/busses/i2c-ccgx-ucsi.h [new file with mode: 0644]

index bfe17c4..6df1bd1 100644 (file)
@@ -9,6 +9,13 @@ menu "I2C Hardware Bus support"
 comment "PC SMBus host controller drivers"
        depends on PCI
 
+config I2C_CCGX_UCSI
+       tristate
+       help
+         A common module to provide an API to instantiate UCSI device
+         for Cypress CCGx Type-C controller. Individual bus drivers
+         need to select this one on demand.
+
 config I2C_ALI1535
        tristate "ALI 1535"
        depends on PCI
index 752f47b..479f60e 100644 (file)
@@ -6,6 +6,9 @@
 # ACPI drivers
 obj-$(CONFIG_I2C_SCMI)         += i2c-scmi.o
 
+# Auxiliary I2C/SMBus modules
+obj-$(CONFIG_I2C_CCGX_UCSI)    += i2c-ccgx-ucsi.o
+
 # PC SMBus host controller drivers
 obj-$(CONFIG_I2C_ALI1535)      += i2c-ali1535.o
 obj-$(CONFIG_I2C_ALI1563)      += i2c-ali1563.o
diff --git a/drivers/i2c/busses/i2c-ccgx-ucsi.c b/drivers/i2c/busses/i2c-ccgx-ucsi.c
new file mode 100644 (file)
index 0000000..092dc92
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Instantiate UCSI device for Cypress CCGx Type-C controller.
+ * Derived from i2c-designware-pcidrv.c and i2c-nvidia-gpu.c.
+ */
+
+#include <linux/i2c.h>
+#include <linux/export.h>
+#include <linux/module.h>
+#include <linux/string.h>
+
+#include "i2c-ccgx-ucsi.h"
+
+struct software_node;
+
+struct i2c_client *i2c_new_ccgx_ucsi(struct i2c_adapter *adapter, int irq,
+                                    const struct software_node *swnode)
+{
+       struct i2c_board_info info = {};
+
+       strscpy(info.type, "ccgx-ucsi", sizeof(info.type));
+       info.addr = 0x08;
+       info.irq = irq;
+       info.swnode = swnode;
+
+       return i2c_new_client_device(adapter, &info);
+}
+EXPORT_SYMBOL_GPL(i2c_new_ccgx_ucsi);
+
+MODULE_LICENSE("GPL");
diff --git a/drivers/i2c/busses/i2c-ccgx-ucsi.h b/drivers/i2c/busses/i2c-ccgx-ucsi.h
new file mode 100644 (file)
index 0000000..739ac7a
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef __I2C_CCGX_UCSI_H_
+#define __I2C_CCGX_UCSI_H_
+
+struct i2c_adapter;
+struct i2c_client;
+struct software_node;
+
+struct i2c_client *i2c_new_ccgx_ucsi(struct i2c_adapter *adapter, int irq,
+                                    const struct software_node *swnode);
+#endif /* __I2C_CCGX_UCSI_H_ */