On Fri, Sep 20, 2019 at 12:08 AM Christian Mauderer <l...@c-mauderer.de>
wrote:

> On 19/09/2019 19:48, Vijay Kumar Banerjee wrote:
> >
> >
> >
> > On Thu, Sep 19, 2019 at 10:05 PM Christian Mauderer <l...@c-mauderer.de
> > <mailto:l...@c-mauderer.de>> wrote:
> >
> >     Hello Vijay,
> >
> >     sorry for being picky: What happens if something goes wrong during
> that
> >     initialization? For example: If the system has a configuration where
> >     /dev/i2c0 can't be created. In that case it will just silently fail
> to
> >     create the i2c-0 which maybe leads to odd errors later.
> >
> > This is a very good point.
> >
> >     There's already one precedent case how that could be handled: The
> >     powerpc/mvme3100 BSP. That BSP also initializes an I2C driver with a
> >     RTEMS_SYSINIT_ITEM. The return value is ignored too. But the
> >     BSP_i2c_initialize does print error messages.
> >
> >     I would suggest that here too: Check the return value of
> >     am335x_i2c_bus_register in your new bbb_i2c_0_initialize and at least
> >     print an error message that i2c0 couldn't be initialized. Most likely
> >     you should use printk here because it's not sure whether printf would
> >     work already.
> >
> > Will it be sufficient to do this:
> > ```
> > static void bbb_i2c_0_initialize(void)
> > {
> >   int err;
> >
> >   err = am335x_i2c_bus_register(BBB_I2C_0_BUS_PATH,
> >                                 AM335X_I2C0_BASE,
> >                                 I2C_BUS_CLOCK_DEFAULT,
> >                                 BBB_I2C0_IRQ);
> >   if (err != 0){
> >     printk("i2c-0 device could not be registered");
> >   }
> > }
> > ```
>
> You might could add the value of `err` to the output (just at the end in
> brackets or similar). Sometimes it is helpful to find the reason.
> Otherwise I'm OK with it.
>
> Fixed it in the attached v3 of the patch.
From af63a46dc3f2e0f0d13fea670cc842db1b96c64a Mon Sep 17 00:00:00 2001
From: Vijay Kumar Banerjee <vijaykumar9...@gmail.com>
Date: Wed, 18 Sep 2019 02:16:05 +0530
Subject: [PATCH v3] bsps/beagle: register i2c device at initialization

---
 bsps/arm/beagle/i2c/bbb-i2c.c     |  6 +++---
 bsps/arm/beagle/include/bsp/i2c.h | 10 ----------
 bsps/arm/beagle/start/bspstart.c  | 21 +++++++++++++++++++++
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/bsps/arm/beagle/i2c/bbb-i2c.c b/bsps/arm/beagle/i2c/bbb-i2c.c
index 37b88864b9..f705078085 100644
--- a/bsps/arm/beagle/i2c/bbb-i2c.c
+++ b/bsps/arm/beagle/i2c/bbb-i2c.c
@@ -186,16 +186,16 @@ static int am335x_i2c_reset( bbb_i2c_bus *bus )
 
   bus->con_reg = 0;
   regs->BBB_I2C_CON = bus->con_reg;
-  udelay( 50000 );
+  rtems_counter_delay_nanoseconds(50000000);
 
   regs->BBB_I2C_SYSC = AM335X_I2C_SYSC_SRST;
-  udelay( 1000 );
+  rtems_counter_delay_nanoseconds(1000000);
   regs->BBB_I2C_CON = AM335X_I2C_CON_I2C_EN;
 
   while ( !( regs->BBB_I2C_SYSS & AM335X_I2C_SYSS_RDONE )
           && timeout >= 0 ) {
     --timeout;
-    udelay( 100 );
+  rtems_counter_delay_nanoseconds(100000);
   }
 
   if ( timeout <= 0 ) {
diff --git a/bsps/arm/beagle/include/bsp/i2c.h b/bsps/arm/beagle/include/bsp/i2c.h
index 9d253406bf..60f71194bf 100644
--- a/bsps/arm/beagle/include/bsp/i2c.h
+++ b/bsps/arm/beagle/include/bsp/i2c.h
@@ -94,16 +94,6 @@ int am335x_i2c_bus_register(
   rtems_vector_number irq
 );
 
-static inline int bbb_register_i2c_0( void )
-{
-  return am335x_i2c_bus_register(
-    BBB_I2C_0_BUS_PATH,
-    AM335X_I2C0_BASE,
-    I2C_BUS_CLOCK_DEFAULT,
-    BBB_I2C0_IRQ
-  );
-}
-
 static inline int bbb_register_i2c_1( void )
 {
   return am335x_i2c_bus_register(
diff --git a/bsps/arm/beagle/start/bspstart.c b/bsps/arm/beagle/start/bspstart.c
index 224f9ecf3b..9b25f4429b 100644
--- a/bsps/arm/beagle/start/bspstart.c
+++ b/bsps/arm/beagle/start/bspstart.c
@@ -17,6 +17,8 @@
 #include <bsp/irq-generic.h>
 #include <bsp/fdt.h>
 #include <bsp/linker-symbols.h>
+#include <bsp/i2c.h>
+#include <rtems/sysinit.h>
 
 #include "bspdebug.h"
 
@@ -41,3 +43,22 @@ uint32_t bsp_fdt_map_intr(const uint32_t *intr, size_t icells)
 {
   return intr[0];
 }
+
+static void bbb_i2c_0_initialize(void)
+{
+  int err;
+
+  err = am335x_i2c_bus_register(BBB_I2C_0_BUS_PATH,
+                                AM335X_I2C0_BASE,
+                                I2C_BUS_CLOCK_DEFAULT,
+                                BBB_I2C0_IRQ);
+  if (err != 0){
+    printk("rtems i2c-0: Device could not be registered (%d)", err);
+  }
+}
+
+RTEMS_SYSINIT_ITEM(
+  bbb_i2c_0_initialize,
+  RTEMS_SYSINIT_LAST,
+  RTEMS_SYSINIT_ORDER_LAST
+);
-- 
2.20.1

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to