Implement OCOTP driver for Vybrid using NVMEM
Subsystems (5)
v10 cover Implement OCOTP driver for Vybrid using NVMEM
Hello,
Tested on Greg's tree char-misc-next branch along with Stefan's NAND driver patchset.
Sample output on Colibri VF50
root at colibri-vf:/sys/bus/nvmem/devices/ocotp0# uname -a
Linux colibri-vf 4.2.0-rc6-00009-g1cec223 #5 SMP Mon Sep 7 12:34:37 IST 2015 armv7l GNU/Linux
root at colibri-vf:/sys/bus/nvmem/devices/ocotp0# hexdump nvmem 0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000410 72a6 df64 0000 0000 0000 0000 0000 0000 0000420 11d4 2006 0000 0000 0000 0000 0000 0000 0000430 0000 0000 0000 0000 0000 0000 0000 0000
*
0000450 0280 0000 0000 0000 0000 0000 0000 0000 0000460 0000 0000 0000 0000 0000 0000 0000 0000
*
0000880 8f01 0000 0000 0000 0000 0000 0000 0000 0000890 0000 0000 0000 0000 0000 0000 0000 0000
*
00008c0 0000 1300 0000 0000 0000 0000 0000 0000 00008d0 320a 0800 0000 0000 0000 0000 0000 0000 00008e0 0000 e200 0000 0000 0000 0000 0000 0000 00008f0 0000 0000 0000 0000 0000 0000 0000 0000
*
0000c80 bada bada 0000 0000 0000 0000 0000 0000
*
0000cc0 0000 0000 0000 0000 0000 0000 0000 0000
*
0000cf0
Changes since v9:
1. Drop clock-names property from DT
2. Rebase on top of latest char-misc-next
Changes since v8:
1. Fix three lines over 80 characters
2. Rebase on top of Greg's char-misc-next branch
Changes since v7:
1. Add COMPILE_TEST to Kconfig
2. Use GENMASK and BIT macros where applicable
3. Fix a code alignment issue
4. Get the max_register value for regmap config using resource_size()
5. Also add copyright info as the driver logic is based off on ocotp code in barebox
6. Add missing info related to clock in DT binding doc
Changes since v6:
1. Use the v9 of NVMEM framework patchset
2. Add a few comments
3. Initialise buffer address not part of the fuse map to 0 instead of only handling buffer locations with valid fuse addresses.
Changes since v5:
Use NVMEM framework by Srinivas and Maxime
Changes since v4:
1. Use devm_* family of functions and use a struct to get rid of global variables (suggested by Joachim Eastwood)
2. Make Kconfig govern the compilation with tristate, instead of earlier bool. Paul Bolle raised a valid point that perhaps this should have been built in with the bool, however I had not taken into consideration generic distro kernels and it makes sense to have this tristated. (comments from Paul Bolle and Andreas Farber)
Changes since v3:
Instead of using the syscon_regmap_lookup_by_compatible function use a phandle in the device tree along with offsets specified in this phandle node and then read the offset along with the device node in the driver for reading from the required region.
Changes since v2:
Implement the SoC bus code as a driver in drivers/soc by registering with fsl,mscm-cpucfg as per Arnd's feedback
Changes since v1:
Sort the headers in alphabetical order
Changes since RFC:
Use a DT entry for the ROM area while specifying it as syscon.
Version 9 patches can be found here
https://lkml.org/lkml/2015/8/12/530
Version 8 patches can be found here
https://lkml.org/lkml/2015/8/10/566
Version 7 patches can be found here
https://lkml.org/lkml/2015/8/6/440
Version 6 RFC patches can be found here
http://lkml.iu.edu/hypermail/linux/kernel/1506.2/05123.html
Version 5 of the patchset can be found here
http://lkml.iu.edu/hypermail/linux/kernel/1506.0/03787.html
Version 4 of the patchset can be found here
https://lkml.org/lkml/2015/5/26/199
Version 3 of the patchset can be found here
http://www.spinics.net/lists/arm-kernel/msg420847.html
Version 2 of the patchset can be found here
http://www.spinics.net/lists/devicetree/msg80654.html
Version 1 of the patchset can be found here
http://www.spinics.net/lists/devicetree/msg80257.html
The RFC version can be found here
https://lkml.org/lkml/2015/5/11/13
Thanks & Regards,
Sanchayan Maity.
Sanchayan Maity (4):
clk: clk-vf610: Add clock for Vybrid OCOTP controller
ARM: dts: vfxxx: Add OCOTP node
drivers: nvmem: Add Vybrid OCOTP support
nvmem: Add DT binding documentation for Vybrid OCOTP driver
.../devicetree/bindings/nvmem/vf610-ocotp.txt | 19 ++ arch/arm/boot/dts/vfxxx.dtsi | 8 + drivers/clk/imx/clk-vf610.c | 1 + drivers/nvmem/Kconfig | 10 + drivers/nvmem/Makefile | 2 + drivers/nvmem/vf610-ocotp.c | 302 +++++++++++++++++++++ include/dt-bindings/clock/vf610-clock.h | 3 +- 7 files changed, 344 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/nvmem/vf610-ocotp.txt create mode 100644 drivers/nvmem/vf610-ocotp.c
Signature · 1 line
2.5.1
PATCH v10 1/4 clk: clk-vf610: Add clock for Vybrid OCOTP controller
Add clock support for Vybrid On-Chip One Time Programmable (OCOTP) controller.
While the OCOTP block does not require explicit clock gating, for programming the OCOTP timing register the clock rate of ipg clock is required for timing calculations related to fuse and shadow register read sequence. We explicitly specify the ipg clock for OCOTP as a result.
--- drivers/clk/imx/clk-vf610.c | 1 + include/dt-bindings/clock/vf610-clock.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/clk/imx/clk-vf610.c +1 -0
@@ -387,6 +387,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) clk[VF610_CLK_SNVS ] =imx_clk_gate2 ("snvs-rtc" ,"ipg_bus" ,CCM_CCGR6 ,CCM_CCGRx_CGn (7 )); clk[VF610_CLK_DAP ] =imx_clk_gate ("dap" ,"platform_bus" ,CCM_CCSR ,24 ); + clk[VF610_CLK_OCOTP ] =imx_clk_gate ("ocotp" ,"ipg_bus" ,CCM_CCGR6 ,CCM_CCGRx_CGn (5 ));imx_check_clocks (clk,ARRAY_SIZE (clk));
include/dt-bindings/clock/vf610-clock.h +2 -1
@@ -194,6 +194,7 @@#define VF610_PLL7_BYPASS 181#define VF610_CLK_SNVS 182#define VF610_CLK_DAP 183 -#define VF610_CLK_END 184 +#define VF610_CLK_OCOTP 184 +#define VF610_CLK_END 185#endif /* __DT_BINDINGS_CLOCK_VF610_H */
Signature · 1 line
2.5.1
PATCH v10 2/4 ARM: dts: vfxxx: Add OCOTP node
In reply to Sanchayan MaityAdd device tree node for the On-Chip One Time Programmable controller (OCOTP) on the Vybrid platform.
--- arch/arm/boot/dts/vfxxx.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/boot/dts/vfxxx.dtsi +8 -0
@@ -403,6 +403,14 @@ status = "disabled"; }; + ocotp: ocotp at 400a5000 { + compatible = "fsl,vf610-ocotp"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x400a5000 0xCF0>; + clocks = <&clks VF610_CLK_OCOTP>; + }; + snvs0: snvs at 400a7000 { compatible = "fsl,sec-v4.0-mon", "simple-bus"; #address-cells = <1>;
Signature · 1 line
2.5.1
PATCH v10 3/4 drivers: nvmem: Add Vybrid OCOTP support
In reply to Sanchayan MaityThe patch adds support for the On Chip One Time Programmable Peripheral (OCOTP) on the Vybrid platform.
--- drivers/nvmem/Kconfig | 10 ++ drivers/nvmem/Makefile | 2 + drivers/nvmem/vf610-ocotp.c | 302 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 drivers/nvmem/vf610-ocotp.c
drivers/nvmem/Kconfig +10 -0
@@ -36,4 +36,14 @@ config NVMEM_SUNXI_SID This driver can also be built as a module. If so, the module will be called nvmem_sunxi_sid. +config NVMEM_VF610_OCOTP + tristate "VF610 SoC OCOTP support" + depends on SOC_VF610 || COMPILE_TEST + help + This is a driver for the 'OCOTP' peripheral available on Vybrid + devices like VF5xx and VF6xx. + + This driver can also be build as a module. If so, the module will + be called nvmem-vf610-ocotp. + endif
drivers/nvmem/Makefile +2 -0
@@ -10,3 +10,5 @@ obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o nvmem_qfprom-y := qfprom.o obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o nvmem_sunxi_sid-y := sunxi_sid.o +obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o +nvmem-vf610-ocotp-y := vf610-ocotp.o
drivers/nvmem/vf610-ocotp.c new file +302 -0
302 lines not on this page · raw message
Signature · 1 line
2.5.1
PATCH v10 4/4 nvmem: Add DT binding documentation for Vybrid OCOTP driver
In reply to Sanchayan MaityAdd the devicetree bindings for the Freescale Vybrid On-Chip OTP driver.
--- .../devicetree/bindings/nvmem/vf610-ocotp.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Documentation/devicetree/bindings/nvmem/vf610-ocotp.txt
Documentation/devicetree/bindings/nvmem/vf610-ocotp.txt new file +19 -0
@@ -0,0 +1,19 @@ +On-Chip OTP Memory for Freescale Vybrid + +Required Properties: + compatible: + - "fsl,vf610-ocotp" for VF5xx/VF6xx + #address-cells : Should be 1 + #size-cells : Should be 1 + reg : Address and length of OTP controller and fuse map registers + clocks : ipg clock we associate with the OCOTP peripheral + +Example for Vybrid VF5xx/VF6xx: + + ocotp: ocotp at 400a5000 { + compatible = "fsl,vf610-ocotp"; + #address-cells = <1>; + #size-cells = <1>; + reg = <0x400a5000 0xCF0>; + clocks = <&clks VF610_CLK_OCOTP>; + };
Signature · 1 line
2.5.1
Hello,
Ping?
- Sanchayan.
Quoted 140 lines · Sanchayan Maity
Hello,
Tested on Greg's tree char-misc-next branch along with Stefan's NAND driver patchset.
Sample output on Colibri VF50
root at colibri-vf:/sys/bus/nvmem/devices/ocotp0# uname -a
Linux colibri-vf 4.2.0-rc6-00009-g1cec223 #5 SMP Mon Sep 7 12:34:37 IST 2015 armv7l GNU/Linuxroot at colibri-vf:/sys/bus/nvmem/devices/ocotp0# hexdump nvmem 0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000410 72a6 df64 0000 0000 0000 0000 0000 0000 0000420 11d4 2006 0000 0000 0000 0000 0000 0000 0000430 0000 0000 0000 0000 0000 0000 0000 0000
*
0000450 0280 0000 0000 0000 0000 0000 0000 0000 0000460 0000 0000 0000 0000 0000 0000 0000 0000
*
0000880 8f01 0000 0000 0000 0000 0000 0000 0000 0000890 0000 0000 0000 0000 0000 0000 0000 0000
*
00008c0 0000 1300 0000 0000 0000 0000 0000 0000 00008d0 320a 0800 0000 0000 0000 0000 0000 0000 00008e0 0000 e200 0000 0000 0000 0000 0000 0000 00008f0 0000 0000 0000 0000 0000 0000 0000 0000
*
0000c80 bada bada 0000 0000 0000 0000 0000 0000
*
0000cc0 0000 0000 0000 0000 0000 0000 0000 0000
*
0000cf0Changes since v9:
1. Drop clock-names property from DT
2. Rebase on top of latest char-misc-nextChanges since v8:
1. Fix three lines over 80 characters
2. Rebase on top of Greg's char-misc-next branchChanges since v7:
1. AddCOMPILE_TESTtoKconfig
2. Use GENMASK and BIT macros where applicable
3. Fix a code alignment issue
4. Get themax_registervalue for regmap config usingresource_size()
5. Also add copyright info as the driver logic is based off on ocotp code in barebox
6. Add missing info related to clock in DT binding docChanges since v6:
1. Use the v9 of NVMEM framework patchset
2. Add a few comments
3. Initialise buffer address not part of the fuse map to 0 instead of only handling buffer locations with valid fuse addresses.Changes since v5:
Use NVMEM framework by Srinivas and MaximeChanges since v4:
1. Use devm_* family of functions and use a struct to get rid of global variables (suggested by Joachim Eastwood)
2. MakeKconfiggovern the compilation with tristate, instead of earlier bool. Paul Bolle raised a valid point that perhaps this should have been built in with the bool, however I had not taken into consideration generic distro kernels and it makes sense to have this tristated. (comments from Paul Bolle and Andreas Farber)Changes since v3:
Instead of using thesyscon_regmap_lookup_by_compatiblefunction use a phandle in the device tree along with offsets specified in this phandle node and then read the offset along with the device node in the driver for reading from the required region.Changes since v2:
Implement the SoC bus code as a driver indrivers/socby registering with fsl,mscm-cpucfg as per Arnd's feedbackChanges since v1:
Sort the headers in alphabetical orderChanges since RFC:
Use a DT entry for the ROM area while specifying it as syscon.Version 9 patches can be found here
https://lkml.org/lkml/2015/8/12/530Version 8 patches can be found here
https://lkml.org/lkml/2015/8/10/566Version 7 patches can be found here
https://lkml.org/lkml/2015/8/6/440Version 6 RFC patches can be found here
http://lkml.iu.edu/hypermail/linux/kernel/1506.2/05123.htmlVersion 5 of the patchset can be found here
http://lkml.iu.edu/hypermail/linux/kernel/1506.0/03787.htmlVersion 4 of the patchset can be found here
https://lkml.org/lkml/2015/5/26/199Version 3 of the patchset can be found here
http://www.spinics.net/lists/arm-kernel/msg420847.htmlVersion 2 of the patchset can be found here
http://www.spinics.net/lists/devicetree/msg80654.htmlVersion 1 of the patchset can be found here
http://www.spinics.net/lists/devicetree/msg80257.htmlThe RFC version can be found here
https://lkml.org/lkml/2015/5/11/13Thanks & Regards,
Sanchayan Maity.Sanchayan Maity (4):
clk: clk-vf610: Add clock for Vybrid OCOTP controller
ARM: dts: vfxxx: Add OCOTP node
drivers: nvmem: Add Vybrid OCOTP support
nvmem: Add DT binding documentation for Vybrid OCOTP driver.../devicetree/bindings/nvmem/vf610-ocotp.txt | 19 ++ arch/arm/boot/dts/vfxxx.dtsi | 8 + drivers/clk/imx/clk-vf610.c | 1 + drivers/nvmem/Kconfig | 10 + drivers/nvmem/Makefile | 2 + drivers/nvmem/vf610-ocotp.c | 302 +++++++++++++++++++++ include/dt-bindings/clock/vf610-clock.h | 3 +- 7 files changed, 344 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/nvmem/vf610-ocotp.txt create mode 100644 drivers/nvmem/vf610-ocotp.cSignature · 1 line
2.5.1
Shawn Guo
AppliedRe: [PATCH v10 1/4] clk: clk-vf610: Add clock for Vybrid OCOTP controller
In reply to Sanchayan MaityQuoted 10 lines · Sanchayan Maity
Add clock support for Vybrid On-Chip One Time Programmable (OCOTP) controller.
While the OCOTP block does not require explicit clock gating, for programming the OCOTP timing register the clock rate of ipg clock is required for timing calculations related to fuse and shadow register read sequence. We explicitly specify the ipg clock for OCOTP as a result.
Signed-off-by Sanchayan Maity <[email protected]>
Applied this one, thanks.