new file mode 100644
@@ -0,0 +1,179 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * probe_helper.h - helper functions for platform drivers' probe
+ * function
+ * Author: Satendra Singh Thakur <satendrasingh.thakur@hcl.com> Sep 2019
+ * <sst2005@gmail.com>
+ */
+#ifndef _PROBE_HELPER_H_
+#define _PROBE_HELPER_H_
+
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+
+/* devm_platform_probe_helper - Macro for helping probe method
+ * of platform drivers
+ * This macro combines the functions:
+ * devm_kzalloc, platform_get_resource, devm_ioremap_resource,
+ * devm_clk_get, platform_get_irq
+ * @pdev platform device
+ * @priv driver's private object for memory allocation
+ * @clk_name clock name as in DT
+ */
+#define devm_platform_probe_helper(pdev, priv, clk_name) \
+({ \
+ __label__ __out; \
+ int __ret = 0; \
+ priv = devm_kzalloc(&(pdev)->dev, sizeof(*priv), GFP_KERNEL); \
+ if (!(priv)) { \
+ dev_err(&(pdev)->dev, "devm_kzalloc failed\n"); \
+ __ret = -ENOMEM; \
+ goto __out; \
+ } \
+ (priv)->base = devm_platform_ioremap_resource(pdev, 0); \
+ if (IS_ERR((priv)->base)) { \
+ dev_err(&(pdev)->dev, \
+ "devm_platform_ioremap_resource failed\n"); \
+ __ret = PTR_ERR((priv)->base); \
+ goto __out; \
+ } \
+ (priv)->clk = devm_clk_get(&(pdev)->dev, clk_name); \
+ if (IS_ERR((priv)->clk)) { \
+ dev_err(&(pdev)->dev, "devm_clk_get failed\n"); \
+ __ret = PTR_ERR((priv)->clk); \
+ goto __out; \
+ } \
+ (priv)->irq = platform_get_irq(pdev, 0); \
+ if ((priv)->irq < 0) { \
+ dev_err(&(pdev)->dev, "platform_get_irq failed\n"); \
+ __ret = (priv)->irq; \
+ goto __out; \
+ } \
+__out: \
+ __ret; \
+})
+
+/* devm_platform_probe_helper_irq - Macro for helping probe method
+ * of platform drivers
+ * This macro combines the functions:
+ * devm_kzalloc, platform_get_resource, devm_ioremap_resource,
+ * devm_clk_get, platform_get_irq, devm_request_irq
+ * @pdev platform device
+ * @priv driver's private object for memory allocation
+ * @clk_name clock name as in DT
+ * @irq_hndlr interrupt handler function (isr)
+ * @irq_flags flags for interrupt registration
+ * @irq_name name of the interrupt handler
+ * @irq_devid device identifier for irq
+ */
+#define devm_platform_probe_helper_irq(pdev, priv, clk_name, \
+ irq_hndlr, irq_flags, irq_name, irq_devid) \
+({ \
+ __label__ __out; \
+ int __ret = 0; \
+ __ret = devm_platform_probe_helper(pdev, priv, clk_name); \
+ if (__ret < 0) \
+ goto __out; \
+ __ret = devm_request_irq(&(pdev)->dev, (priv)->irq, irq_hndlr, \
+ irq_flags, irq_name, irq_devid); \
+ if (__ret < 0) { \
+ dev_err(&(pdev)->dev, \
+ "devm_request_irq failed for irq num %d\n", \
+ (priv)->irq); \
+ goto __out; \
+ } \
+__out: \
+ __ret; \
+})
+
+/* devm_platform_probe_helper_clk Macro - for helping probe method
+ * of platform drivers
+ * This macro combines the functions:
+ * devm_kzalloc, platform_get_resource, devm_ioremap_resource,
+ * devm_clk_get, platform_get_irq, clk_prepare_enable
+ * @pdev platform device
+ * @priv driver's private object for memory allocation
+ * @clk_name clock name as in DT
+ */
+#define devm_platform_probe_helper_clk(pdev, priv, clk_name) \
+({ \
+ __label__ __out; \
+ int __ret = 0; \
+ __ret = devm_platform_probe_helper(pdev, priv, clk_name); \
+ if (__ret < 0) \
+ goto __out; \
+ __ret = clk_prepare_enable((priv)->clk); \
+ if (__ret < 0) { \
+ dev_err(&(pdev)->dev, "clk_prepare_enable failed\n"); \
+ goto __out; \
+ } \
+__out: \
+ __ret; \
+})
+
+/* devm_platform_probe_helper_all - Macro for helping probe method
+ * of platform drivers
+ * This macro combines the functions:
+ * devm_kzalloc, platform_get_resource, devm_ioremap_resource,
+ * devm_clk_get, platform_get_irq, devm_request_irq,
+ * clk_prepare_enable
+ * @pdev platform device
+ * @priv driver's private object for memory allocation
+ * @clk_name clock name as in DT
+ * @irq_hndlr interrupt handler function (isr)
+ * @irq_flags flags for interrupt registration
+ * @irq_name name of the interrupt handler
+ * @irq_devid device identifier for irq
+ */
+#define devm_platform_probe_helper_all(pdev, priv, clk_name, \
+ irq_hndlr, irq_flags, irq_name, irq_devid) \
+({ \
+ __label__ __out; \
+ int __ret = 0; \
+ __ret = devm_platform_probe_helper_clk(pdev, priv, clk_name); \
+ if (__ret < 0) \
+ goto __out; \
+ __ret = devm_request_irq(&(pdev)->dev, (priv)->irq, \
+ irq_hndlr, irq_flags, irq_name, irq_devid); \
+ if (__ret < 0) { \
+ dev_err(&(pdev)->dev, \
+ "devm_request_irq failed for irq num %d\n", \
+ (priv)->irq); \
+ if ((priv)->clk) \
+ clk_disable_unprepare((priv)->clk); \
+ goto __out; \
+ } \
+__out: \
+ __ret; \
+})
+
+/* devm_platform_probe_helper_all_data - Macro for helping probe method
+ * of platform drivers
+ * This macro combines the functions:
+ * devm_kzalloc, platform_get_resource, devm_ioremap_resource,
+ * devm_clk_get, platform_get_irq, devm_request_irq,
+ * clk_prepare_enable, platform_set_drvdata
+ * @pdev platform device
+ * @priv driver's private object for memory allocation
+ * @clk_name clock name as in DT
+ * @irq_hndlr interrupt handler function (isr)
+ * @irq_flags flags for interrupt registration
+ * @irq_name name of the interrupt handler
+ * @irq_devid device identifier for irq
+ */
+#define devm_platform_probe_helper_all_data(pdev, priv, clk_name, \
+ irq_hndlr, irq_flags, irq_name, irq_devid) \
+({ \
+ __label__ __out; \
+ int __ret = 0; \
+ __ret = devm_platform_probe_helper_all(pdev, priv, clk_name, \
+ irq_hndlr, irq_flags, irq_name, irq_devid); \
+ if (__ret < 0) \
+ goto __out; \
+ platform_set_drvdata(pdev, priv); \
+__out: \
+ __ret; \
+})
+
+#endif /*_PROBE_HELPER_H_*/