|
@@ -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);
|
|
@@ -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);
|