]> Pileus Git - ~andy/linux/blobdiff - drivers/clk/clk-si5351.c
Merge tag 'clk-for-linus-3.14-part2' of git://git.linaro.org/people/mike.turquette...
[~andy/linux] / drivers / clk / clk-si5351.c
index c50e83744b0aec3a0a8841f068bbbe05adc5ef8d..3b2a66f78755113fe9afde8f9caaa4d4e801260b 100644 (file)
@@ -1111,11 +1111,11 @@ static const struct of_device_id si5351_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, si5351_dt_ids);
 
-static int si5351_dt_parse(struct i2c_client *client)
+static int si5351_dt_parse(struct i2c_client *client,
+                          enum si5351_variant variant)
 {
        struct device_node *child, *np = client->dev.of_node;
        struct si5351_platform_data *pdata;
-       const struct of_device_id *match;
        struct property *prop;
        const __be32 *p;
        int num = 0;
@@ -1124,15 +1124,10 @@ static int si5351_dt_parse(struct i2c_client *client)
        if (np == NULL)
                return 0;
 
-       match = of_match_node(si5351_dt_ids, np);
-       if (match == NULL)
-               return -EINVAL;
-
        pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
                return -ENOMEM;
 
-       pdata->variant = (enum si5351_variant)match->data;
        pdata->clk_xtal = of_clk_get(np, 0);
        if (!IS_ERR(pdata->clk_xtal))
                clk_put(pdata->clk_xtal);
@@ -1163,7 +1158,7 @@ static int si5351_dt_parse(struct i2c_client *client)
                        pdata->pll_src[num] = SI5351_PLL_SRC_XTAL;
                        break;
                case 1:
-                       if (pdata->variant != SI5351_VARIANT_C) {
+                       if (variant != SI5351_VARIANT_C) {
                                dev_err(&client->dev,
                                        "invalid parent %d for pll %d\n",
                                        val, num);
@@ -1187,7 +1182,7 @@ static int si5351_dt_parse(struct i2c_client *client)
                }
 
                if (num >= 8 ||
-                   (pdata->variant == SI5351_VARIANT_A3 && num >= 3)) {
+                   (variant == SI5351_VARIANT_A3 && num >= 3)) {
                        dev_err(&client->dev, "invalid clkout %d\n", num);
                        return -EINVAL;
                }
@@ -1226,7 +1221,7 @@ static int si5351_dt_parse(struct i2c_client *client)
                                        SI5351_CLKOUT_SRC_XTAL;
                                break;
                        case 3:
-                               if (pdata->variant != SI5351_VARIANT_C) {
+                               if (variant != SI5351_VARIANT_C) {
                                        dev_err(&client->dev,
                                                "invalid parent %d for clkout %d\n",
                                                val, num);
@@ -1298,7 +1293,7 @@ static int si5351_dt_parse(struct i2c_client *client)
        return 0;
 }
 #else
-static int si5351_dt_parse(struct i2c_client *client)
+static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant)
 {
        return 0;
 }
@@ -1307,6 +1302,7 @@ static int si5351_dt_parse(struct i2c_client *client)
 static int si5351_i2c_probe(struct i2c_client *client,
                            const struct i2c_device_id *id)
 {
+       enum si5351_variant variant = (enum si5351_variant)id->driver_data;
        struct si5351_platform_data *pdata;
        struct si5351_driver_data *drvdata;
        struct clk_init_data init;
@@ -1315,7 +1311,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
        u8 num_parents, num_clocks;
        int ret, n;
 
-       ret = si5351_dt_parse(client);
+       ret = si5351_dt_parse(client, variant);
        if (ret)
                return ret;
 
@@ -1331,7 +1327,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
 
        i2c_set_clientdata(client, drvdata);
        drvdata->client = client;
-       drvdata->variant = pdata->variant;
+       drvdata->variant = variant;
        drvdata->pxtal = pdata->clk_xtal;
        drvdata->pclkin = pdata->clk_clkin;
 
@@ -1568,10 +1564,10 @@ static int si5351_i2c_probe(struct i2c_client *client,
 }
 
 static const struct i2c_device_id si5351_i2c_ids[] = {
-       { "si5351a", 0 },
-       { "si5351a-msop", 0 },
-       { "si5351b", 0 },
-       { "si5351c", 0 },
+       { "si5351a", SI5351_VARIANT_A },
+       { "si5351a-msop", SI5351_VARIANT_A3 },
+       { "si5351b", SI5351_VARIANT_B },
+       { "si5351c", SI5351_VARIANT_C },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, si5351_i2c_ids);