ravb: use clock rate as basis for GTI.TIV

The GTI.TIV may be set to 2GHz^2 / rate, where rate is
that of the clock of the device. Rather than assuming a
rate of 130MHz use the actual rate of the clock.

The motivation for this is to use the correct rate on
the r8a7795/Salvator-X which is advertised as 133MHz but
may differ depending on the extal present on the Salvator-X.

Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Simon Horman 2015-11-20 11:29:39 -08:00 коммит произвёл David S. Miller
Родитель 1777ddb84a
Коммит b3d39a8805
2 изменённых файлов: 40 добавлений и 1 удалений

Просмотреть файл

@ -576,6 +576,9 @@ enum GTI_BIT {
GTI_TIV = 0x0FFFFFFF, GTI_TIV = 0x0FFFFFFF,
}; };
#define GTI_TIV_MAX GTI_TIV
#define GTI_TIV_MIN 0x20
/* GIC */ /* GIC */
enum GIC_BIT { enum GIC_BIT {
GIC_PTCE = 0x00000001, /* Undocumented? */ GIC_PTCE = 0x00000001, /* Undocumented? */

Просмотреть файл

@ -32,6 +32,8 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/div64.h>
#include "ravb.h" #include "ravb.h"
#define RAVB_DEF_MSG_ENABLE \ #define RAVB_DEF_MSG_ENABLE \
@ -1659,6 +1661,38 @@ static const struct of_device_id ravb_match_table[] = {
}; };
MODULE_DEVICE_TABLE(of, ravb_match_table); MODULE_DEVICE_TABLE(of, ravb_match_table);
static int ravb_set_gti(struct net_device *ndev)
{
struct device *dev = ndev->dev.parent;
struct device_node *np = dev->of_node;
unsigned long rate;
struct clk *clk;
uint64_t inc;
clk = of_clk_get(np, 0);
if (IS_ERR(clk)) {
dev_err(dev, "could not get clock\n");
return PTR_ERR(clk);
}
rate = clk_get_rate(clk);
clk_put(clk);
inc = 1000000000ULL << 20;
do_div(inc, rate);
if (inc < GTI_TIV_MIN || inc > GTI_TIV_MAX) {
dev_err(dev, "gti.tiv increment 0x%llx is outside the range 0x%x - 0x%x\n",
inc, GTI_TIV_MIN, GTI_TIV_MAX);
return -EINVAL;
}
ravb_write(ndev, inc, GTI);
return 0;
}
static int ravb_probe(struct platform_device *pdev) static int ravb_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
@ -1755,7 +1789,9 @@ static int ravb_probe(struct platform_device *pdev)
CCC); CCC);
/* Set GTI value */ /* Set GTI value */
ravb_write(ndev, ((1000 << 20) / 130) & GTI_TIV, GTI); error = ravb_set_gti(ndev);
if (error)
goto out_release;
/* Request GTI loading */ /* Request GTI loading */
ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR); ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR);