.. | .. |
---|
1313 | 1313 | continue; |
---|
1314 | 1314 | |
---|
1315 | 1315 | rate = clk_get_rate(clk); |
---|
1316 | | - if (!rate) |
---|
| 1316 | + if (!rate) { |
---|
| 1317 | + dev_err(ourport->port.dev, |
---|
| 1318 | + "Failed to get clock rate for %s.\n", clkname); |
---|
| 1319 | + clk_put(clk); |
---|
1317 | 1320 | continue; |
---|
| 1321 | + } |
---|
1318 | 1322 | |
---|
1319 | 1323 | if (ourport->info->has_divslot) { |
---|
1320 | 1324 | unsigned long div = rate / req_baud; |
---|
.. | .. |
---|
1340 | 1344 | calc_deviation = -calc_deviation; |
---|
1341 | 1345 | |
---|
1342 | 1346 | if (calc_deviation < deviation) { |
---|
| 1347 | + /* |
---|
| 1348 | + * If we find a better clk, release the previous one, if |
---|
| 1349 | + * any. |
---|
| 1350 | + */ |
---|
| 1351 | + if (!IS_ERR(*best_clk)) |
---|
| 1352 | + clk_put(*best_clk); |
---|
1343 | 1353 | *best_clk = clk; |
---|
1344 | 1354 | best_quot = quot; |
---|
1345 | 1355 | *clk_num = cnt; |
---|
1346 | 1356 | deviation = calc_deviation; |
---|
| 1357 | + } else { |
---|
| 1358 | + clk_put(clk); |
---|
1347 | 1359 | } |
---|
1348 | 1360 | } |
---|
1349 | 1361 | |
---|