i2c-tools: don't include linux/i2c-dev.h
authorBartosz Golaszewski <bartekgola@gmail.com>
Tue, 29 Aug 2017 10:31:22 +0000 (12:31 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 29 Aug 2017 10:31:22 +0000 (12:31 +0200)
Installing headers from upstream i2c-tools makes it impossible to
build the busybox version due to redefined symbols. This is caused by
the fact that linux/i2c-dev.h from i2c-tools overwrites the one from
linux uapi and defines symbols already defined by linux' linux/i2c.h.

Drop this include and simply re-implement the relevant defines from
linux/i2c-dev.h in miscutils/i2c-tools.c.

Tested by building on systems with and without i2c-tools headers.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/i2c_tools.c

index 03a09d51940fee2d85fb16306db0dd9fb14e9f09..52fc5ec6b1851a7568712e135dc76370005726d9 100644 (file)
@@ -8,7 +8,6 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
-
 //config:config I2CGET
 //config:      bool "i2cget (5.6 kb)"
 //config:      default y
@@ -63,7 +62,6 @@
 #include "libbb.h"
 
 #include <linux/i2c.h>
-#include <linux/i2c-dev.h>
 
 #define I2CDUMP_NUM_REGS               256
 
 #define I2CDETECT_MODE_QUICK           1
 #define I2CDETECT_MODE_READ            2
 
+/* linux/i2c-dev.h from i2c-tools overwrites the one from linux uapi
+ * and defines symbols already defined by linux/i2c.h.
+ * Also, it defines a bunch of static inlines which we would rather NOT
+ * inline. What a mess.
+ * We need only these definitions from linux/i2c-dev.h:
+ */
+#define I2C_SLAVE                      0x0703
+#define I2C_SLAVE_FORCE                        0x0706
+#define I2C_FUNCS                      0x0705
+#define I2C_PEC                                0x0708
+#define I2C_SMBUS                      0x0720
+struct i2c_smbus_ioctl_data {
+       __u8 read_write;
+       __u8 command;
+       __u32 size;
+       union i2c_smbus_data *data;
+};
+/* end linux/i2c-dev.h */
+
 /*
  * This is needed for ioctl_or_perror_and_die() since it only accepts pointers.
  */
@@ -1187,18 +1204,17 @@ static void will_skip(const char *cmd)
 }
 
 //usage:#define i2cdetect_trivial_usage
-//usage:       "[-F I2CBUS] [-l] [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]"
+//usage:       "-l | -F I2CBUS | [-ya] [-q|-r] I2CBUS [FIRST LAST]"
 //usage:#define i2cdetect_full_usage "\n\n"
-//usage:       "Detect I2C chips.\n"
-//usage:     "\n       I2CBUS  i2c bus number"
-//usage:     "\n       FIRST and LAST limit the probing range"
+//usage:       "Detect I2C chips"
 //usage:     "\n"
-//usage:     "\n       -l      output list of installed busses"
-//usage:     "\n       -y      disable interactive mode"
-//usage:     "\n       -a      force scanning of non-regular addresses"
-//usage:     "\n       -q      use smbus quick write commands for probing (default)"
-//usage:     "\n       -r      use smbus read byte commands for probing"
-//usage:     "\n       -F      display list of functionalities"
+//usage:     "\n       -l      Print list of installed buses"
+//usage:     "\n       -F BUS# Print list of functionalities on this bus"
+//usage:     "\n       -y      Disable interactive mode"
+//usage:     "\n       -a      Force scanning of non-regular addresses"
+//usage:     "\n       -q      Use smbus quick write commands for probing (default)"
+//usage:     "\n       -r      Use smbus read byte commands for probing"
+//usage:     "\n       FIRST and LAST limit probing range"
 int i2cdetect_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int i2cdetect_main(int argc UNUSED_PARAM, char **argv)
 {
@@ -1213,7 +1229,8 @@ int i2cdetect_main(int argc UNUSED_PARAM, char **argv)
        opts = getopt32(argv, "^"
                        "yaqrFl"
                        "\0"
-                       "q--r:r--q:"/*mutually exclusive*/ "?3"/*up to 3 args*/
+                       "q--r:r--q:"/*mutually exclusive*/
+                       "?3"/*up to 3 args*/
        );
        argv += optind;