aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-si5351.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-01-28 21:44:53 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-28 21:44:53 -0500
commitd30492adea3a82e7120bcf60893aaaab711f90a6 (patch)
tree082d1dff4d71ccbd722b5edd47411acad110b636 /drivers/clk/clk-si5351.c
parentf1499382f114231cbd1e3dee7e656b50ce9d8236 (diff)
parentfd3fdaf09f26cd4f53fd4d7cdfe8e3dbb55a4dda (diff)
Merge tag 'clk-for-linus-3.14-part2' of git://git.linaro.org/people/mike.turquette/linux
Pull more clock framework changes from Mike Turquette: "The second half of the clock framework pull requeust for 3.14 is dominated by platform support for Qualcomm's MSM SoCs, DT binding updates for TI's OMAP-ish processors and additional support for Samsung chips. Additionally there are other smaller clock driver changes and several last minute fixes. This pull request also includes the HiSilicon support that depends on the already-merged arm-soc pull request" [ Fix up stupid compile error in the source tree with evil merge - Grumpy Linus ] * tag 'clk-for-linus-3.14-part2' of git://git.linaro.org/people/mike.turquette/linux: (49 commits) clk: sort Makefile clk: sunxi: fix overflow when setting up divided factors clk: Export more clk-provider functions dt-bindings: qcom: Fix warning with duplicate dt define clk: si5351: remove variant from platform_data clk: samsung: Remove unneeded semicolon clk: qcom: Fix modular build ARM: OMAP3: use DT clock init if DT data is available ARM: AM33xx: remove old clock data and link in new clock init code ARM: AM43xx: Enable clock init ARM: OMAP: DRA7: Enable clock init ARM: OMAP4: remove old clock data and link in new clock init code ARM: OMAP2+: io: use new clock init API ARM: OMAP2+: PRM: add support for initializing PRCM clock modules from DT ARM: OMAP3: hwmod: initialize clkdm from clkdm_name ARM: OMAP: hwmod: fix an incorrect clk type cast with _get_clkdm ARM: OMAP2+: clock: use driver API instead of direct memory read/write ARM: OMAP2+: clock: add support for indexed memmaps ARM: dts: am43xx clock data ARM: dts: AM35xx: use DT clock data ...
Diffstat (limited to 'drivers/clk/clk-si5351.c')
-rw-r--r--drivers/clk/clk-si5351.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
index c50e83744b0a..3b2a66f78755 100644
--- a/drivers/clk/clk-si5351.c
+++ b/drivers/clk/clk-si5351.c
@@ -1111,11 +1111,11 @@ static const struct of_device_id si5351_dt_ids[] = {
1111}; 1111};
1112MODULE_DEVICE_TABLE(of, si5351_dt_ids); 1112MODULE_DEVICE_TABLE(of, si5351_dt_ids);
1113 1113
1114static int si5351_dt_parse(struct i2c_client *client) 1114static int si5351_dt_parse(struct i2c_client *client,
1115 enum si5351_variant variant)
1115{ 1116{
1116 struct device_node *child, *np = client->dev.of_node; 1117 struct device_node *child, *np = client->dev.of_node;
1117 struct si5351_platform_data *pdata; 1118 struct si5351_platform_data *pdata;
1118 const struct of_device_id *match;
1119 struct property *prop; 1119 struct property *prop;
1120 const __be32 *p; 1120 const __be32 *p;
1121 int num = 0; 1121 int num = 0;
@@ -1124,15 +1124,10 @@ static int si5351_dt_parse(struct i2c_client *client)
1124 if (np == NULL) 1124 if (np == NULL)
1125 return 0; 1125 return 0;
1126 1126
1127 match = of_match_node(si5351_dt_ids, np);
1128 if (match == NULL)
1129 return -EINVAL;
1130
1131 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); 1127 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1132 if (!pdata) 1128 if (!pdata)
1133 return -ENOMEM; 1129 return -ENOMEM;
1134 1130
1135 pdata->variant = (enum si5351_variant)match->data;
1136 pdata->clk_xtal = of_clk_get(np, 0); 1131 pdata->clk_xtal = of_clk_get(np, 0);
1137 if (!IS_ERR(pdata->clk_xtal)) 1132 if (!IS_ERR(pdata->clk_xtal))
1138 clk_put(pdata->clk_xtal); 1133 clk_put(pdata->clk_xtal);
@@ -1163,7 +1158,7 @@ static int si5351_dt_parse(struct i2c_client *client)
1163 pdata->pll_src[num] = SI5351_PLL_SRC_XTAL; 1158 pdata->pll_src[num] = SI5351_PLL_SRC_XTAL;
1164 break; 1159 break;
1165 case 1: 1160 case 1:
1166 if (pdata->variant != SI5351_VARIANT_C) { 1161 if (variant != SI5351_VARIANT_C) {
1167 dev_err(&client->dev, 1162 dev_err(&client->dev,
1168 "invalid parent %d for pll %d\n", 1163 "invalid parent %d for pll %d\n",
1169 val, num); 1164 val, num);
@@ -1187,7 +1182,7 @@ static int si5351_dt_parse(struct i2c_client *client)
1187 } 1182 }
1188 1183
1189 if (num >= 8 || 1184 if (num >= 8 ||
1190 (pdata->variant == SI5351_VARIANT_A3 && num >= 3)) { 1185 (variant == SI5351_VARIANT_A3 && num >= 3)) {
1191 dev_err(&client->dev, "invalid clkout %d\n", num); 1186 dev_err(&client->dev, "invalid clkout %d\n", num);
1192 return -EINVAL; 1187 return -EINVAL;
1193 } 1188 }
@@ -1226,7 +1221,7 @@ static int si5351_dt_parse(struct i2c_client *client)
1226 SI5351_CLKOUT_SRC_XTAL; 1221 SI5351_CLKOUT_SRC_XTAL;
1227 break; 1222 break;
1228 case 3: 1223 case 3:
1229 if (pdata->variant != SI5351_VARIANT_C) { 1224 if (variant != SI5351_VARIANT_C) {
1230 dev_err(&client->dev, 1225 dev_err(&client->dev,
1231 "invalid parent %d for clkout %d\n", 1226 "invalid parent %d for clkout %d\n",
1232 val, num); 1227 val, num);
@@ -1298,7 +1293,7 @@ static int si5351_dt_parse(struct i2c_client *client)
1298 return 0; 1293 return 0;
1299} 1294}
1300#else 1295#else
1301static int si5351_dt_parse(struct i2c_client *client) 1296static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant)
1302{ 1297{
1303 return 0; 1298 return 0;
1304} 1299}
@@ -1307,6 +1302,7 @@ static int si5351_dt_parse(struct i2c_client *client)
1307static int si5351_i2c_probe(struct i2c_client *client, 1302static int si5351_i2c_probe(struct i2c_client *client,
1308 const struct i2c_device_id *id) 1303 const struct i2c_device_id *id)
1309{ 1304{
1305 enum si5351_variant variant = (enum si5351_variant)id->driver_data;
1310 struct si5351_platform_data *pdata; 1306 struct si5351_platform_data *pdata;
1311 struct si5351_driver_data *drvdata; 1307 struct si5351_driver_data *drvdata;
1312 struct clk_init_data init; 1308 struct clk_init_data init;
@@ -1315,7 +1311,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1315 u8 num_parents, num_clocks; 1311 u8 num_parents, num_clocks;
1316 int ret, n; 1312 int ret, n;
1317 1313
1318 ret = si5351_dt_parse(client); 1314 ret = si5351_dt_parse(client, variant);
1319 if (ret) 1315 if (ret)
1320 return ret; 1316 return ret;
1321 1317
@@ -1331,7 +1327,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1331 1327
1332 i2c_set_clientdata(client, drvdata); 1328 i2c_set_clientdata(client, drvdata);
1333 drvdata->client = client; 1329 drvdata->client = client;
1334 drvdata->variant = pdata->variant; 1330 drvdata->variant = variant;
1335 drvdata->pxtal = pdata->clk_xtal; 1331 drvdata->pxtal = pdata->clk_xtal;
1336 drvdata->pclkin = pdata->clk_clkin; 1332 drvdata->pclkin = pdata->clk_clkin;
1337 1333
@@ -1568,10 +1564,10 @@ static int si5351_i2c_probe(struct i2c_client *client,
1568} 1564}
1569 1565
1570static const struct i2c_device_id si5351_i2c_ids[] = { 1566static const struct i2c_device_id si5351_i2c_ids[] = {
1571 { "si5351a", 0 }, 1567 { "si5351a", SI5351_VARIANT_A },
1572 { "si5351a-msop", 0 }, 1568 { "si5351a-msop", SI5351_VARIANT_A3 },
1573 { "si5351b", 0 }, 1569 { "si5351b", SI5351_VARIANT_B },
1574 { "si5351c", 0 }, 1570 { "si5351c", SI5351_VARIANT_C },
1575 { } 1571 { }
1576}; 1572};
1577MODULE_DEVICE_TABLE(i2c, si5351_i2c_ids); 1573MODULE_DEVICE_TABLE(i2c, si5351_i2c_ids);