|
32 | 32 | #include <linux/slab.h>
|
33 | 33 | #include <linux/spinlock.h>
|
34 | 34 |
|
| 35 | +#include <asm/div64.h> |
| 36 | + |
35 | 37 | #include "ravb.h"
|
36 | 38 |
|
37 | 39 | #define RAVB_DEF_MSG_ENABLE \
|
@@ -1659,6 +1661,38 @@ static const struct of_device_id ravb_match_table[] = {
|
1659 | 1661 | };
|
1660 | 1662 | MODULE_DEVICE_TABLE(of, ravb_match_table);
|
1661 | 1663 |
|
| 1664 | +static int ravb_set_gti(struct net_device *ndev) |
| 1665 | +{ |
| 1666 | + |
| 1667 | + struct device *dev = ndev->dev.parent; |
| 1668 | + struct device_node *np = dev->of_node; |
| 1669 | + unsigned long rate; |
| 1670 | + struct clk *clk; |
| 1671 | + uint64_t inc; |
| 1672 | + |
| 1673 | + clk = of_clk_get(np, 0); |
| 1674 | + if (IS_ERR(clk)) { |
| 1675 | + dev_err(dev, "could not get clock\n"); |
| 1676 | + return PTR_ERR(clk); |
| 1677 | + } |
| 1678 | + |
| 1679 | + rate = clk_get_rate(clk); |
| 1680 | + clk_put(clk); |
| 1681 | + |
| 1682 | + inc = 1000000000ULL << 20; |
| 1683 | + do_div(inc, rate); |
| 1684 | + |
| 1685 | + if (inc < GTI_TIV_MIN || inc > GTI_TIV_MAX) { |
| 1686 | + dev_err(dev, "gti.tiv increment 0x%llx is outside the range 0x%x - 0x%x\n", |
| 1687 | + inc, GTI_TIV_MIN, GTI_TIV_MAX); |
| 1688 | + return -EINVAL; |
| 1689 | + } |
| 1690 | + |
| 1691 | + ravb_write(ndev, inc, GTI); |
| 1692 | + |
| 1693 | + return 0; |
| 1694 | +} |
| 1695 | + |
1662 | 1696 | static int ravb_probe(struct platform_device *pdev)
|
1663 | 1697 | {
|
1664 | 1698 | struct device_node *np = pdev->dev.of_node;
|
@@ -1755,7 +1789,9 @@ static int ravb_probe(struct platform_device *pdev)
|
1755 | 1789 | CCC);
|
1756 | 1790 |
|
1757 | 1791 | /* Set GTI value */
|
1758 |
| - ravb_write(ndev, ((1000 << 20) / 130) & GTI_TIV, GTI); |
| 1792 | + error = ravb_set_gti(ndev); |
| 1793 | + if (error) |
| 1794 | + goto out_release; |
1759 | 1795 |
|
1760 | 1796 | /* Request GTI loading */
|
1761 | 1797 | ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR);
|
|
0 commit comments