Merge branch 'for-6.8/nintendo' into for-linus
authorJiri Kosina <jkosina@suse.com>
Mon, 8 Jan 2024 20:09:48 +0000 (21:09 +0100)
committerJiri Kosina <jkosina@suse.com>
Mon, 8 Jan 2024 20:09:48 +0000 (21:09 +0100)
- support for Nintendo NSO controllers -- SNES, Genesis
  and N64 (Ryan McClelland)

1  2 
drivers/hid/Kconfig
drivers/hid/hid-ids.h
drivers/hid/hid-nintendo.c

Simple merge
Simple merge
index 997c3a1adacab265bbb9b08ae98964f36ca60113,47af111ef3a208991b361db5590d6ed7701e5457..ccc4032fb2b03f4fbae705b9dc8b256978b92966
@@@ -325,29 -336,160 +336,160 @@@ struct joycon_imu_cal 
   * All the controller's button values are stored in a u32.
   * They can be accessed with bitwise ANDs.
   */
 -static const u32 JC_BTN_Y     = BIT(0);
 -static const u32 JC_BTN_X     = BIT(1);
 -static const u32 JC_BTN_B     = BIT(2);
 -static const u32 JC_BTN_A     = BIT(3);
 -static const u32 JC_BTN_SR_R  = BIT(4);
 -static const u32 JC_BTN_SL_R  = BIT(5);
 -static const u32 JC_BTN_R     = BIT(6);
 -static const u32 JC_BTN_ZR    = BIT(7);
 -static const u32 JC_BTN_MINUS = BIT(8);
 -static const u32 JC_BTN_PLUS  = BIT(9);
 -static const u32 JC_BTN_RSTICK        = BIT(10);
 -static const u32 JC_BTN_LSTICK        = BIT(11);
 -static const u32 JC_BTN_HOME  = BIT(12);
 -static const u32 JC_BTN_CAP   = BIT(13); /* capture button */
 -static const u32 JC_BTN_DOWN  = BIT(16);
 -static const u32 JC_BTN_UP    = BIT(17);
 -static const u32 JC_BTN_RIGHT = BIT(18);
 -static const u32 JC_BTN_LEFT  = BIT(19);
 -static const u32 JC_BTN_SR_L  = BIT(20);
 -static const u32 JC_BTN_SL_L  = BIT(21);
 -static const u32 JC_BTN_L     = BIT(22);
 -static const u32 JC_BTN_ZL    = BIT(23);
 +#define JC_BTN_Y       BIT(0)
 +#define JC_BTN_X       BIT(1)
 +#define JC_BTN_B       BIT(2)
 +#define JC_BTN_A       BIT(3)
 +#define JC_BTN_SR_R    BIT(4)
 +#define JC_BTN_SL_R    BIT(5)
 +#define JC_BTN_R       BIT(6)
 +#define JC_BTN_ZR      BIT(7)
 +#define JC_BTN_MINUS   BIT(8)
 +#define JC_BTN_PLUS    BIT(9)
 +#define JC_BTN_RSTICK  BIT(10)
 +#define JC_BTN_LSTICK  BIT(11)
 +#define JC_BTN_HOME    BIT(12)
 +#define JC_BTN_CAP     BIT(13) /* capture button */
 +#define JC_BTN_DOWN    BIT(16)
 +#define JC_BTN_UP      BIT(17)
 +#define JC_BTN_RIGHT   BIT(18)
 +#define JC_BTN_LEFT    BIT(19)
 +#define JC_BTN_SR_L    BIT(20)
 +#define JC_BTN_SL_L    BIT(21)
 +#define JC_BTN_L       BIT(22)
 +#define JC_BTN_ZL      BIT(23)
  
+ struct joycon_ctlr_button_mapping {
+       u32 code;
+       u32 bit;
+ };
+ /*
+  * D-pad is configured as buttons for the left Joy-Con only!
+  */
+ static const struct joycon_ctlr_button_mapping left_joycon_button_mappings[] = {
+       { BTN_TL,               JC_BTN_L,       },
+       { BTN_TL2,              JC_BTN_ZL,      },
+       { BTN_SELECT,           JC_BTN_MINUS,   },
+       { BTN_THUMBL,           JC_BTN_LSTICK,  },
+       { BTN_DPAD_UP,          JC_BTN_UP,      },
+       { BTN_DPAD_DOWN,        JC_BTN_DOWN,    },
+       { BTN_DPAD_LEFT,        JC_BTN_LEFT,    },
+       { BTN_DPAD_RIGHT,       JC_BTN_RIGHT,   },
+       { BTN_Z,                JC_BTN_CAP,     },
+       { /* sentinel */ },
+ };
+ /*
+  * The unused *right*-side triggers become the SL/SR triggers for the *left*
+  * Joy-Con, if and only if we're not using a charging grip.
+  */
+ static const struct joycon_ctlr_button_mapping left_joycon_s_button_mappings[] = {
+       { BTN_TR,       JC_BTN_SL_L,    },
+       { BTN_TR2,      JC_BTN_SR_L,    },
+       { /* sentinel */ },
+ };
+ static const struct joycon_ctlr_button_mapping right_joycon_button_mappings[] = {
+       { BTN_EAST,     JC_BTN_A,       },
+       { BTN_SOUTH,    JC_BTN_B,       },
+       { BTN_NORTH,    JC_BTN_X,       },
+       { BTN_WEST,     JC_BTN_Y,       },
+       { BTN_TR,       JC_BTN_R,       },
+       { BTN_TR2,      JC_BTN_ZR,      },
+       { BTN_START,    JC_BTN_PLUS,    },
+       { BTN_THUMBR,   JC_BTN_RSTICK,  },
+       { BTN_MODE,     JC_BTN_HOME,    },
+       { /* sentinel */ },
+ };
+ /*
+  * The unused *left*-side triggers become the SL/SR triggers for the *right*
+  * Joy-Con, if and only if we're not using a charging grip.
+  */
+ static const struct joycon_ctlr_button_mapping right_joycon_s_button_mappings[] = {
+       { BTN_TL,       JC_BTN_SL_R,    },
+       { BTN_TL2,      JC_BTN_SR_R,    },
+       { /* sentinel */ },
+ };
+ static const struct joycon_ctlr_button_mapping procon_button_mappings[] = {
+       { BTN_EAST,     JC_BTN_A,       },
+       { BTN_SOUTH,    JC_BTN_B,       },
+       { BTN_NORTH,    JC_BTN_X,       },
+       { BTN_WEST,     JC_BTN_Y,       },
+       { BTN_TL,       JC_BTN_L,       },
+       { BTN_TR,       JC_BTN_R,       },
+       { BTN_TL2,      JC_BTN_ZL,      },
+       { BTN_TR2,      JC_BTN_ZR,      },
+       { BTN_SELECT,   JC_BTN_MINUS,   },
+       { BTN_START,    JC_BTN_PLUS,    },
+       { BTN_THUMBL,   JC_BTN_LSTICK,  },
+       { BTN_THUMBR,   JC_BTN_RSTICK,  },
+       { BTN_MODE,     JC_BTN_HOME,    },
+       { BTN_Z,        JC_BTN_CAP,     },
+       { /* sentinel */ },
+ };
+ static const struct joycon_ctlr_button_mapping nescon_button_mappings[] = {
+       { BTN_SOUTH,    JC_BTN_A,       },
+       { BTN_EAST,     JC_BTN_B,       },
+       { BTN_TL,       JC_BTN_L,       },
+       { BTN_TR,       JC_BTN_R,       },
+       { BTN_SELECT,   JC_BTN_MINUS,   },
+       { BTN_START,    JC_BTN_PLUS,    },
+       { /* sentinel */ },
+ };
+ static const struct joycon_ctlr_button_mapping snescon_button_mappings[] = {
+       { BTN_EAST,     JC_BTN_A,       },
+       { BTN_SOUTH,    JC_BTN_B,       },
+       { BTN_NORTH,    JC_BTN_X,       },
+       { BTN_WEST,     JC_BTN_Y,       },
+       { BTN_TL,       JC_BTN_L,       },
+       { BTN_TR,       JC_BTN_R,       },
+       { BTN_TL2,      JC_BTN_ZL,      },
+       { BTN_TR2,      JC_BTN_ZR,      },
+       { BTN_SELECT,   JC_BTN_MINUS,   },
+       { BTN_START,    JC_BTN_PLUS,    },
+       { /* sentinel */ },
+ };
+ /*
+  * "A", "B", and "C" are mapped positionally, rather than by label (e.g., "A"
+  * gets assigned to BTN_EAST instead of BTN_A).
+  */
+ static const struct joycon_ctlr_button_mapping gencon_button_mappings[] = {
+       { BTN_SOUTH,    JC_BTN_A,       },
+       { BTN_EAST,     JC_BTN_B,       },
+       { BTN_WEST,     JC_BTN_R,       },
+       { BTN_SELECT,   JC_BTN_ZR,      },
+       { BTN_START,    JC_BTN_PLUS,    },
+       { BTN_MODE,     JC_BTN_HOME,    },
+       { BTN_Z,        JC_BTN_CAP,     },
+       { /* sentinel */ },
+ };
+ /*
+  * N64's C buttons get assigned to d-pad directions and registered as buttons.
+  */
+ static const struct joycon_ctlr_button_mapping n64con_button_mappings[] = {
+       { BTN_A,                JC_BTN_A,       },
+       { BTN_B,                JC_BTN_B,       },
+       { BTN_TL2,              JC_BTN_ZL,      }, /* Z */
+       { BTN_TL,               JC_BTN_L,       },
+       { BTN_TR,               JC_BTN_R,       },
+       { BTN_TR2,              JC_BTN_LSTICK,  }, /* ZR */
+       { BTN_START,            JC_BTN_PLUS,    },
+       { BTN_FORWARD,          JC_BTN_Y,       }, /* C UP */
+       { BTN_BACK,             JC_BTN_ZR,      }, /* C DOWN */
+       { BTN_LEFT,             JC_BTN_X,       }, /* C LEFT */
+       { BTN_RIGHT,            JC_BTN_MINUS,   }, /* C RIGHT */
+       { BTN_MODE,             JC_BTN_HOME,    },
+       { BTN_Z,                JC_BTN_CAP,     },
+       { /* sentinel */ },
+ };
  enum joycon_msg_type {
        JOYCON_MSG_TYPE_NONE,
        JOYCON_MSG_TYPE_USB,