diff mbox series

[1/6] isa: Introduce the module_isa_driver_with_irq helper macro

Message ID 016c8d87cef87a1375e53f1c97c41d8b969f8d79.1660839809.git.william.gray@linaro.org
State Accepted
Commit 85ebe0afd3f8377a9b506321314f4b8344caa8ec
Headers show
Series isa: Ensure number of irq matches number of base | expand

Commit Message

William Breathitt Gray Aug. 18, 2022, 4:28 p.m. UTC
Several ISA drivers feature IRQ support that can configured via an "irq"
array module parameter. This array typically matches directly with the
respective "base" array module parameter. To reduce code repetition, a
module_isa_driver_with_irq helper macro is introduced to provide a check
ensuring that the number of "irq" passed to the module matches with the
respective number of "base".

Signed-off-by: William Breathitt Gray <william.gray@linaro.org>
---
 include/linux/isa.h | 52 ++++++++++++++++++++++++++++++++++++---------
 1 file changed, 42 insertions(+), 10 deletions(-)

Comments

William Breathitt Gray Aug. 31, 2022, 10:53 p.m. UTC | #1
On Thu, Aug 18, 2022 at 12:28:10PM -0400, William Breathitt Gray wrote:
> Several ISA drivers feature IRQ support that can configured via an "irq"
> array module parameter. This array typically matches directly with the
> respective "base" array module parameter. To reduce code repetition, a
> module_isa_driver_with_irq helper macro is introduced to provide a check
> ensuring that the number of "irq" passed to the module matches with the
> respective number of "base".
> 
> Signed-off-by: William Breathitt Gray <william.gray@linaro.org>

Acked-by: William Breathitt Gray <william.gray@linaro.org>
Bartosz Golaszewski Sept. 15, 2022, 8:29 a.m. UTC | #2
On Thu, Sep 1, 2022 at 12:53 AM William Breathitt Gray
<william.gray@linaro.org> wrote:
>
> On Thu, Aug 18, 2022 at 12:28:10PM -0400, William Breathitt Gray wrote:
> > Several ISA drivers feature IRQ support that can configured via an "irq"
> > array module parameter. This array typically matches directly with the
> > respective "base" array module parameter. To reduce code repetition, a
> > module_isa_driver_with_irq helper macro is introduced to provide a check
> > ensuring that the number of "irq" passed to the module matches with the
> > respective number of "base".
> >
> > Signed-off-by: William Breathitt Gray <william.gray@linaro.org>
>
> Acked-by: William Breathitt Gray <william.gray@linaro.org>

Series queued.

Bart
diff mbox series

Patch

diff --git a/include/linux/isa.h b/include/linux/isa.h
index e30963190968..4fbbf5e36e08 100644
--- a/include/linux/isa.h
+++ b/include/linux/isa.h
@@ -38,6 +38,32 @@  static inline void isa_unregister_driver(struct isa_driver *d)
 }
 #endif
 
+#define module_isa_driver_init(__isa_driver, __num_isa_dev) \
+static int __init __isa_driver##_init(void) \
+{ \
+	return isa_register_driver(&(__isa_driver), __num_isa_dev); \
+} \
+module_init(__isa_driver##_init)
+
+#define module_isa_driver_with_irq_init(__isa_driver, __num_isa_dev, __num_irq) \
+static int __init __isa_driver##_init(void) \
+{ \
+	if (__num_irq != __num_isa_dev) { \
+		pr_err("%s: Number of irq (%u) does not match number of base (%u)\n", \
+		       __isa_driver.driver.name, __num_irq, __num_isa_dev); \
+		return -EINVAL; \
+	} \
+	return isa_register_driver(&(__isa_driver), __num_isa_dev); \
+} \
+module_init(__isa_driver##_init)
+
+#define module_isa_driver_exit(__isa_driver) \
+static void __exit __isa_driver##_exit(void) \
+{ \
+	isa_unregister_driver(&(__isa_driver)); \
+} \
+module_exit(__isa_driver##_exit)
+
 /**
  * module_isa_driver() - Helper macro for registering a ISA driver
  * @__isa_driver: isa_driver struct
@@ -48,16 +74,22 @@  static inline void isa_unregister_driver(struct isa_driver *d)
  * use this macro once, and calling it replaces module_init and module_exit.
  */
 #define module_isa_driver(__isa_driver, __num_isa_dev) \
-static int __init __isa_driver##_init(void) \
-{ \
-	return isa_register_driver(&(__isa_driver), __num_isa_dev); \
-} \
-module_init(__isa_driver##_init); \
-static void __exit __isa_driver##_exit(void) \
-{ \
-	isa_unregister_driver(&(__isa_driver)); \
-} \
-module_exit(__isa_driver##_exit);
+module_isa_driver_init(__isa_driver, __num_isa_dev); \
+module_isa_driver_exit(__isa_driver)
+
+/**
+ * module_isa_driver_with_irq() - Helper macro for registering an ISA driver with irq
+ * @__isa_driver: isa_driver struct
+ * @__num_isa_dev: number of devices to register
+ * @__num_irq: number of IRQ to register
+ *
+ * Helper macro for ISA drivers with irq that do not do anything special in
+ * module init/exit. Each module may only use this macro once, and calling it
+ * replaces module_init and module_exit.
+ */
+#define module_isa_driver_with_irq(__isa_driver, __num_isa_dev, __num_irq) \
+module_isa_driver_with_irq_init(__isa_driver, __num_isa_dev, __num_irq); \
+module_isa_driver_exit(__isa_driver)
 
 /**
  * max_num_isa_dev() - Maximum possible number registered of an ISA device