Description
Hello,
I'm looking to ship a Raspberry Pi HAT + EEPROM overlay that uses the PWM as part of a larger driver, but I am having some difficulties with it, most likely due to my newness to Device Tree.
I read here that @repk has patched the clock subsystem to enable the PWM clock from Device Tree. These patches appear to have been applied to the two RPi Foundation Linux 4.4 and 4.6 kernels I've experimented with, but I haven't dug too deeply to confirm this 100%. An example of making it work is provided with @repk's EPD driver along with a brief README mention that the PWM clock patch is applied to recent RPi Foundation kernels.
Unfortunately, I can't seem to get the clock to turn on with my Device Tree code unless I manually enable the PWM clock via direct register access on my Raspberry Pi 1 B+:
PWMCLK_DIV = 0x5A000000 | (5<<12); // TODO: switch to writel()
PWMCLK_CNTL = 0x5A000016;
After the enabling the clock with the above, calls to of_pwm_get(), pwm_config(), and pwm_enable() all function as expected and generate the correct PWM waveform.
Below is my Device Tree Overlay. Could someone point out where the mistake is that prevents the PWM clock from turning on at boot with this overlay? I'm very new to Device Tree, so it's very likely I'm doing something wrong.
I'm currently using the Raspbian Lite distribution released 2016-05-27 and a recent kernel release raspberrypi-kernel_1.20160506-1.tar.gz. As mentioned earlier, I've also tried the current git 4.6 branch as well. My kernel configuration is simply make bcmrpi_defconfig.
Thanks!
-Adam
Device Tree Overlay below. Note: I'm temporarily "borrowing" the i2s_pins node for the PWM out because I still need to fix an outstanding phandle reference issue if I overlay my own pwm_pins node within the gpio node.
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835", "bcrm,bcm2708";
fragment@0 {
target = <&i2s_pins>;
__overlay__ {
brcm,pins = <19>;
brcm,function = <2>;
};
};
fragment@1 {
target = <&pwm>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&i2s_pins>;
status = "okay";
};
};
fragment@2 {
target-path = "/";
__overlay__ {
corp_foo@0{
compatible = "corp,foo";
pwms = <&pwm 1 50000>;
reset-gpios = <&gpio 13 0>;
status = "okay";
};
};
};
};