]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
clk: rs9: Check for vendor/device ID
authorAlexander Stein <alexander.stein@ew.tq-group.com>
Fri, 10 Mar 2023 07:55:32 +0000 (08:55 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Jul 2023 17:39:34 +0000 (19:39 +0200)
[ Upstream commit da751726ff2ad2322d81316ebf6aadb22dfad0d8 ]

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>
Link: https://lore.kernel.org/r/20230310075535.3476580-1-alexander.stein@ew.tq-group.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Stable-dep-of: ad527ca87e4e ("clk: rs9: Fix .driver_data content in i2c_device_id")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clk/clk-renesas-pcie.c

index ff3a52d48479092257a98ddaaf3b2af701a6bd99..f4e9f70f412afbd8d4517dd8864ebc475d3edd6d 100644 (file)
 #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[] = {