blob: 93386a87b19777a2e2d89b2cba129adad9ac5876 [file] [log] [blame]
Freescale Busfreq driver
It is a generic driver that manages the frequency of the DDR, AHB and AXI buses in the iMX6x architecture.
It works for both SMP and UP systems and for both DDR3 and LPDDR2 memory types.
Required properties are listed below:
- compatible: should be "fsl,imx6_busfreq"
- clocks: Lists the various clocks used by the busfreq driver
- interrupts - Lists the interrupts used by the busfreq driver. This is needed only for SMP architecutre.
- fsl,max_ddr_freq - The max ddr freq for this chip
Examples:
For SOC imx6q.dtsi:
busfreq { /* BUSFREQ */
compatible = "fsl,imx6_busfreq";
clocks = <&clks 171>, <&clks 6>, <&clks 11>, <&clks 104>, <&clks 172>, <&clks 58>,
<&clks 18>, <&clks 60>, <&clks 20>, <&clks 3>;
clock-names = "pll2_bus", "pll2_pfd2_396m", "pll2_198m", "arm", "pll3_usb_otg", "periph",
"periph_pre", "periph_clk2", "periph_clk2_sel", "osc";
interrupts = <0 107 0x04>, <0 112 0x4>, <0 113 0x4>, <0 114 0x4>;
interrupt-names = "irq_busfreq_0", "irq_busfreq_1", "irq_busfreq_2", "irq_busfreq_3";
fsl,max_ddr_freq = <528000000>;
};
The Freescale Busfreq driver supports the following setpoints for the DDR freq:
enum bus_freq_mode {
BUS_FREQ_HIGH, -> The max freq the SOC supports
BUS_FREQ_MED, -> Medium setpoint (ex 400MHz for DDR3 when the max is 528MHz)
BUS_FREQ_AUDIO, -> Audio playback freq (50MHz)
BUS_FREQ_LOW, -> Low power IDLE freq (24MHz)
};
Currently the Freescale Busfreq driver implementation requires drivers to call the following APIs:
1. request_bus_freq(enum bus_freq_mode):
The driver is requesting the system and ddr freq to be set to the requested value. The driver should call this
API before it even enables its clocks.
2. release_bus_freq(enum bus_freq_mode):
The driver no longer needs the system and ddr freq at the required value. The driver should call this API after
its work is done and it has disabled its clocks.
Examples:
In the IPU driver, the requesting and releasing of the required bus frequency is tied into the runtime PM implementation:
int ipu_runtime_suspend(struct device *dev)
{
release_bus_freq(BUS_FREQ_HIGH);
dev_dbg(dev, "ipu busfreq high release.\n");
return 0;
}
int ipu_runtime_resume(struct device *dev)
{
request_bus_freq(BUS_FREQ_HIGH);
dev_dbg(dev, "ipu busfreq high requst.\n");
return 0;
}
static const struct dev_pm_ops ipu_pm_ops = {
SET_RUNTIME_PM_OPS(ipu_runtime_suspend, ipu_runtime_resume, NULL)
SET_SYSTEM_SLEEP_PM_OPS(ipu_suspend, ipu_resume)
};