Re: [PATCH] davinci_emac: Add cpu_freq support
From: Sergei Shtylyov <hidden>
Date: 2012-04-09 11:31:28
Also in:
lkml
Hello. On 09-04-2012 14:49, Manjunathappa, Prakash wrote:
Reconfigure interrupt coalesce parameter for changed emac bus_freq due to DVFS.
Signed-off-by: Manjunathappa, Prakash<redacted> --- drivers/net/ethernet/ti/davinci_emac.c | 60 ++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-)
quoted hunk ↗ jump to hunk
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index 174a334..11d3bd7 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c
[...]
quoted hunk ↗ jump to hunk
@@ -1761,6 +1765,46 @@ static const struct net_device_ops emac_netdev_ops = { #endif }; +#ifdef CONFIG_CPU_FREQ +static int davinci_emac_cpufreq_transition(struct notifier_block *nb, + unsigned long val, void *data) +{ + int ret = 0; + struct emac_priv *priv; + + priv = container_of(nb, struct emac_priv, freq_transition); + if (priv->coal_intvl != 0) { + if (val == CPUFREQ_POSTCHANGE) { + if (emac_bus_frequency != clk_get_rate(emac_clk)) {
These 3 *if*s could be collapsed into one, and so indentation level
lowered significantly.
quoted hunk ↗ jump to hunk
+ struct ethtool_coalesce coal; + + emac_bus_frequency = clk_get_rate(emac_clk); + + priv->bus_freq_mhz = (u32)(emac_bus_frequency / + 1000000); + coal.rx_coalesce_usecs = (priv->coal_intvl + << 4); + ret = emac_set_coalesce(priv->ndev,&coal); + } + } + } + return ret; +} + +static inline int davinci_emac_cpufreq_register(struct emac_priv *priv) +{ + priv->freq_transition.notifier_call = davinci_emac_cpufreq_transition; + return cpufreq_register_notifier(&priv->freq_transition, + CPUFREQ_TRANSITION_NOTIFIER); +} + +static inline void davinci_emac_cpufreq_deregister(struct emac_priv *priv) +{ + cpufreq_unregister_notifier(&priv->freq_transition, + CPUFREQ_TRANSITION_NOTIFIER); +} +#endif + /** * davinci_emac_probe: EMAC device probe * @pdev: The DaVinci EMAC device that we are removing@@ -1925,8 +1969,21 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev) "(regs: %p, irq: %d)\n", (void *)priv->emac_base_phys, ndev->irq); } + +#ifdef CONFIG_CPU_FREQ + rc = davinci_emac_cpufreq_register(priv); + if (rc) { + dev_err(&pdev->dev, "error in register_netdev\n");
Really?
quoted hunk ↗ jump to hunk
+ rc = -ENODEV; + goto cpufreq_reg_err; + } +#endif return 0; +#ifdef CONFIG_CPU_FREQ +cpufreq_reg_err: + unregister_netdev(ndev); +#endif netdev_reg_err: clk_disable(emac_clk); no_irq_res:@@ -1973,6 +2030,9 @@ static int __devexit davinci_emac_remove(struct platform_device *pdev) release_mem_region(res->start, resource_size(res)); +#ifdef CONFIG_CPU_FREQ + davinci_emac_cpufreq_deregister(priv); +#endif
This is considered a bad practice to use #ifdef in the body of function.
Define the faunction you call here as empty inline in case CONFIG_CPU_FREQ is
not defined instead. The same about davinci_emac_cpufreq_register().
WBR, Sergei