Skip to content

Commit

Permalink
usb: typec: tcpci_rt1711h: Convert enum->pointer for data in the matc…
Browse files Browse the repository at this point in the history
…h tables

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 <biju.das.jz@bp.renesas.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20230906080619.36930-3-biju.das.jz@bp.renesas.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Biju Das authored and Greg Kroah-Hartman committed Oct 2, 2023
1 parent 343a9d3 commit e2d514d
Showing 1 changed file with 21 additions and 9 deletions.
30 changes: 21 additions & 9 deletions drivers/usb/typec/tcpm/tcpci_rt1711h.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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) {
Expand Down Expand Up @@ -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", 0 },
{ "rt1715", 0 },
{ "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);
Expand Down

0 comments on commit e2d514d

Please sign in to comment.