This patch series extend support for retrieving match data for ID lookup
by using i2c_get_match_data().
The first patch fixes the driver_data for ID table and second patch
convert enum->pointer for constification of data and extending match data
support for ID table. The third and fourth patches replaces comparison of
did against hardware differences with data and feature variable. The last
patch drop CONFIG_OF ifdeffery.
This patch series is only compile tested.
v1->v2:
* Drop space from ID table
* Remove trailing comma in the terminator entry for OF table.
* Updated commit description for patch#2.
* Swapped the rxdz_sel variable in struct rt1711h_chip_info to avoid
holes.
* Changed enable_pd30_extended_message variable type to bool.
* Added patch for dropping CONFIG_OF ifdeffery for OF table.
Biju Das (5):
usb: typec: tcpci_rt1711h: Make similar OF and ID table
usb: typec: tcpci_rt1711h: Convert enum->pointer for data in the match
tables
usb: typec: tcpci_rt1711h: Add rxdz_sel variable to struct
rt1711h_chip_info
usb: typec: tcpci_rt1711h: Add enable_pd30_extended_message variable
to struct rt1711h_chip_info
usb: typec: tcpci_rt1711h: Drop CONFIG_OF ifdeffery
drivers/usb/typec/tcpm/tcpci_rt1711h.c | 46 ++++++++++++++++----------
1 file changed, 29 insertions(+), 17 deletions(-)
--
2.25.1
Drop of_match_ptr() from rt1711h_of_match and get rid of ugly CONFIG_OF
ifdeffery. This slightly increases the size of rt1711h_of_match on non-OF
system and shouldn't be an issue.
Add mod_devicetable.h include.
Signed-off-by: Biju Das <[email protected]>
---
v2:
* New patch
---
drivers/usb/typec/tcpm/tcpci_rt1711h.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
index 5d2dc7ead9d0..67422d45eb54 100644
--- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
+++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
@@ -7,6 +7,7 @@
#include <linux/bits.h>
#include <linux/kernel.h>
+#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
@@ -411,19 +412,17 @@ static const struct i2c_device_id rt1711h_id[] = {
};
MODULE_DEVICE_TABLE(i2c, rt1711h_id);
-#ifdef CONFIG_OF
static const struct of_device_id rt1711h_of_match[] = {
{ .compatible = "richtek,rt1711h", .data = &rt1711h },
{ .compatible = "richtek,rt1715", .data = &rt1715 },
{}
};
MODULE_DEVICE_TABLE(of, rt1711h_of_match);
-#endif
static struct i2c_driver rt1711h_i2c_driver = {
.driver = {
.name = "rt1711h",
- .of_match_table = of_match_ptr(rt1711h_of_match),
+ .of_match_table = rt1711h_of_match,
},
.probe = rt1711h_probe,
.remove = rt1711h_remove,
--
2.25.1
Currently did varaible is used for HW differences between the devices which
complicates the code by adding checks.
Therefore it is better to convert enum->pointer for data match and extend
match support for both ID and OF tables by using i2c_get_match_data().
Add struct rt1711h_chip_info with did variable and replace did->info in
struct rt1711h_chip. Later patch will add more hw differences to
struct rt1711h_chip_info and avoid checking did for HW differences.
Signed-off-by: Biju Das <[email protected]>
---
v1->v2:
* Updated commit description.
---
drivers/usb/typec/tcpm/tcpci_rt1711h.c | 30 ++++++++++++++++++--------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/typec/tcpm/tcpci_rt1711h.c b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
index 5ed3d0864431..2b7258d3cb4e 100644
--- a/drivers/usb/typec/tcpm/tcpci_rt1711h.c
+++ b/drivers/usb/typec/tcpm/tcpci_rt1711h.c
@@ -51,13 +51,17 @@
/* 1b0 as fixed rx threshold of rd/rp 0.55V, 1b1 depends on RTCRTL4[0] */
#define BMCIO_RXDZEN BIT(0)
+struct rt1711h_chip_info {
+ u16 did;
+};
+
struct rt1711h_chip {
struct tcpci_data data;
struct tcpci *tcpci;
struct device *dev;
struct regulator *vbus;
+ const struct rt1711h_chip_info *info;
bool src_en;
- u16 did;
};
static int rt1711h_read16(struct rt1711h_chip *chip, unsigned int reg, u16 *val)
@@ -105,7 +109,7 @@ static int rt1711h_init(struct tcpci *tcpci, struct tcpci_data *tdata)
return ret;
/* Enable PD30 extended message for RT1715 */
- if (chip->did == RT1715_DID) {
+ if (chip->info->did == RT1715_DID) {
ret = regmap_update_bits(regmap, RT1711H_RTCTRL8,
RT1711H_ENEXTMSG, RT1711H_ENEXTMSG);
if (ret < 0)
@@ -200,7 +204,7 @@ static inline int rt1711h_init_cc_params(struct rt1711h_chip *chip, u8 status)
if ((cc1 >= TYPEC_CC_RP_1_5 && cc2 < TYPEC_CC_RP_DEF) ||
(cc2 >= TYPEC_CC_RP_1_5 && cc1 < TYPEC_CC_RP_DEF)) {
rxdz_en = BMCIO_RXDZEN;
- if (chip->did == RT1715_DID)
+ if (chip->info->did == RT1715_DID)
rxdz_sel = RT1711H_BMCIO_RXDZSEL;
else
rxdz_sel = 0;
@@ -319,7 +323,7 @@ static int rt1711h_check_revision(struct i2c_client *i2c, struct rt1711h_chip *c
ret = i2c_smbus_read_word_data(i2c, TCPC_BCD_DEV);
if (ret < 0)
return ret;
- if (ret != chip->did) {
+ if (ret != chip->info->did) {
dev_err(&i2c->dev, "did is not correct, 0x%04x\n", ret);
return -ENODEV;
}
@@ -336,7 +340,7 @@ static int rt1711h_probe(struct i2c_client *client)
if (!chip)
return -ENOMEM;
- chip->did = (size_t)device_get_match_data(&client->dev);
+ chip->info = i2c_get_match_data(client);
ret = rt1711h_check_revision(client, chip);
if (ret < 0) {
@@ -391,17 +395,25 @@ static void rt1711h_remove(struct i2c_client *client)
tcpci_unregister_port(chip->tcpci);
}
+static const struct rt1711h_chip_info rt1711h = {
+ .did = RT1711H_DID,
+};
+
+static const struct rt1711h_chip_info rt1715 = {
+ .did = RT1715_DID,
+};
+
static const struct i2c_device_id rt1711h_id[] = {
- { "rt1711h", RT1711H_DID },
- { "rt1715", RT1715_DID },
+ { "rt1711h", (kernel_ulong_t)&rt1711h },
+ { "rt1715", (kernel_ulong_t)&rt1715 },
{}
};
MODULE_DEVICE_TABLE(i2c, rt1711h_id);
#ifdef CONFIG_OF
static const struct of_device_id rt1711h_of_match[] = {
- { .compatible = "richtek,rt1711h", .data = (void *)RT1711H_DID },
- { .compatible = "richtek,rt1715", .data = (void *)RT1715_DID },
+ { .compatible = "richtek,rt1711h", .data = &rt1711h },
+ { .compatible = "richtek,rt1715", .data = &rt1715 },
{}
};
MODULE_DEVICE_TABLE(of, rt1711h_of_match);
--
2.25.1
On Thu, Aug 31, 2023 at 05:05:01PM +0100, Biju Das wrote:
> Drop of_match_ptr() from rt1711h_of_match and get rid of ugly CONFIG_OF
> ifdeffery. This slightly increases the size of rt1711h_of_match on non-OF
> system and shouldn't be an issue.
>
> Add mod_devicetable.h include.
It also allows, in case if needed, to enumerate this device via ACPI with
PRP0001 magic.
--
With Best Regards,
Andy Shevchenko
On Thu, Aug 31, 2023 at 05:04:56PM +0100, Biju Das wrote:
> This patch series extend support for retrieving match data for ID lookup
> by using i2c_get_match_data().
>
> The first patch fixes the driver_data for ID table and second patch
> convert enum->pointer for constification of data and extending match data
> support for ID table. The third and fourth patches replaces comparison of
> did against hardware differences with data and feature variable. The last
> patch drop CONFIG_OF ifdeffery.
>
> This patch series is only compile tested.
FWIW, with the cosmetic changes it's fine,
Reviewed-by: Andy Shevchenko <[email protected]>
--
With Best Regards,
Andy Shevchenko