Skip to content

Commit

Permalink
ravb: use clock rate as basis for GTI.TIV
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Simon Horman authored and David S. Miller committed Nov 20, 2015
1 parent 1777ddb commit b3d39a8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
3 changes: 3 additions & 0 deletions drivers/net/ethernet/renesas/ravb.h
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,9 @@ enum GTI_BIT {
GTI_TIV = 0x0FFFFFFF,
};

#define GTI_TIV_MAX GTI_TIV
#define GTI_TIV_MIN 0x20

/* GIC */
enum GIC_BIT {
GIC_PTCE = 0x00000001, /* Undocumented? */
Expand Down
38 changes: 37 additions & 1 deletion drivers/net/ethernet/renesas/ravb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include <linux/slab.h>
#include <linux/spinlock.h>

#include <asm/div64.h>

#include "ravb.h"

#define RAVB_DEF_MSG_ENABLE \
Expand Down Expand Up @@ -1659,6 +1661,38 @@ static const struct of_device_id 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)
{
struct device_node *np = pdev->dev.of_node;
Expand Down Expand Up @@ -1755,7 +1789,9 @@ static int ravb_probe(struct platform_device *pdev)
CCC);

/* 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 */
ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR);
Expand Down

0 comments on commit b3d39a8

Please sign in to comment.