Message ID | 20230110100003.370917-1-alexander.stein@ew.tq-group.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | [v2,1/4] clk: rs9: Check for vendor/device ID | expand |
On 1/10/23 11:00, Alexander Stein wrote: > This is in preparation to support additional devices which have different > IDs as well as a slightly different register layout. > > Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> Reviewed-by: Marek Vasut <marex@denx.de>
Hi Stephen, want me to resend adding all Reviewed-By? Best regards, Alexander Am Dienstag, 10. Januar 2023, 11:00:00 CET schrieb Alexander Stein: > This is in preparation to support additional devices which have different > IDs as well as a slightly different register layout. > > Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> > --- > Changes in v2: > * Use dev_err_probe to include return statement in one line > > drivers/clk/clk-renesas-pcie.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/drivers/clk/clk-renesas-pcie.c b/drivers/clk/clk-renesas-pcie.c > index e6247141d0c05..bba09a88c2ccc 100644 > --- a/drivers/clk/clk-renesas-pcie.c > +++ b/drivers/clk/clk-renesas-pcie.c > @@ -45,6 +45,13 @@ > #define RS9_REG_DID 0x6 > #define RS9_REG_BCP 0x7 > > +#define RS9_REG_VID_IDT 0x01 > + > +#define RS9_REG_DID_TYPE_FGV (0x0 << RS9_REG_DID_TYPE_SHIFT) > +#define RS9_REG_DID_TYPE_DBV (0x1 << RS9_REG_DID_TYPE_SHIFT) > +#define RS9_REG_DID_TYPE_DMV (0x2 << RS9_REG_DID_TYPE_SHIFT) > +#define RS9_REG_DID_TYPE_SHIFT 0x6 > + > /* Supported Renesas 9-series models. */ > enum rs9_model { > RENESAS_9FGV0241, > @@ -54,6 +61,7 @@ enum rs9_model { > struct rs9_chip_info { > const enum rs9_model model; > unsigned int num_clks; > + u8 did; > }; > > struct rs9_driver_data { > @@ -270,6 +278,7 @@ static int rs9_probe(struct i2c_client *client) > { > unsigned char name[5] = "DIF0"; > struct rs9_driver_data *rs9; > + unsigned int vid, did; > struct clk_hw *hw; > int i, ret; > > @@ -306,6 +315,20 @@ static int rs9_probe(struct i2c_client *client) > if (ret < 0) > return ret; > > + ret = regmap_read(rs9->regmap, RS9_REG_VID, &vid); > + if (ret < 0) > + return ret; > + > + ret = regmap_read(rs9->regmap, RS9_REG_DID, &did); > + if (ret < 0) > + return ret; > + > + if (vid != RS9_REG_VID_IDT || did != rs9->chip_info->did) > + return dev_err_probe(&client->dev, -ENODEV, > + "Incorrect VID/DID: %#02x, %#02x. Expected %#02x, %#02x\n", > + vid, did, RS9_REG_VID_IDT, > + rs9->chip_info->did); > + > /* Register clock */ > for (i = 0; i < rs9->chip_info->num_clks; i++) { > snprintf(name, 5, "DIF%d", i); > @@ -349,6 +372,7 @@ static int __maybe_unused rs9_resume(struct device *dev) > static const struct rs9_chip_info renesas_9fgv0241_info = { > .model = RENESAS_9FGV0241, > .num_clks = 2, > + .did = RS9_REG_DID_TYPE_FGV | 0x02, > }; > > static const struct i2c_device_id rs9_id[] = {
diff --git a/drivers/clk/clk-renesas-pcie.c b/drivers/clk/clk-renesas-pcie.c index e6247141d0c05..bba09a88c2ccc 100644 --- a/drivers/clk/clk-renesas-pcie.c +++ b/drivers/clk/clk-renesas-pcie.c @@ -45,6 +45,13 @@ #define RS9_REG_DID 0x6 #define RS9_REG_BCP 0x7 +#define RS9_REG_VID_IDT 0x01 + +#define RS9_REG_DID_TYPE_FGV (0x0 << RS9_REG_DID_TYPE_SHIFT) +#define RS9_REG_DID_TYPE_DBV (0x1 << RS9_REG_DID_TYPE_SHIFT) +#define RS9_REG_DID_TYPE_DMV (0x2 << RS9_REG_DID_TYPE_SHIFT) +#define RS9_REG_DID_TYPE_SHIFT 0x6 + /* Supported Renesas 9-series models. */ enum rs9_model { RENESAS_9FGV0241, @@ -54,6 +61,7 @@ enum rs9_model { struct rs9_chip_info { const enum rs9_model model; unsigned int num_clks; + u8 did; }; struct rs9_driver_data { @@ -270,6 +278,7 @@ static int rs9_probe(struct i2c_client *client) { unsigned char name[5] = "DIF0"; struct rs9_driver_data *rs9; + unsigned int vid, did; struct clk_hw *hw; int i, ret; @@ -306,6 +315,20 @@ static int rs9_probe(struct i2c_client *client) if (ret < 0) return ret; + ret = regmap_read(rs9->regmap, RS9_REG_VID, &vid); + if (ret < 0) + return ret; + + ret = regmap_read(rs9->regmap, RS9_REG_DID, &did); + if (ret < 0) + return ret; + + if (vid != RS9_REG_VID_IDT || did != rs9->chip_info->did) + return dev_err_probe(&client->dev, -ENODEV, + "Incorrect VID/DID: %#02x, %#02x. Expected %#02x, %#02x\n", + vid, did, RS9_REG_VID_IDT, + rs9->chip_info->did); + /* Register clock */ for (i = 0; i < rs9->chip_info->num_clks; i++) { snprintf(name, 5, "DIF%d", i); @@ -349,6 +372,7 @@ static int __maybe_unused rs9_resume(struct device *dev) static const struct rs9_chip_info renesas_9fgv0241_info = { .model = RENESAS_9FGV0241, .num_clks = 2, + .did = RS9_REG_DID_TYPE_FGV | 0x02, }; static const struct i2c_device_id rs9_id[] = {
This is in preparation to support additional devices which have different IDs as well as a slightly different register layout. Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> --- Changes in v2: * Use dev_err_probe to include return statement in one line drivers/clk/clk-renesas-pcie.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)