@@ -1222,6 +1222,124 @@ static int find_sdca_entity_ge(struct device *dev,
12221222 return - EINVAL ;
12231223}
12241224
1225+ static int sdwhid_parse (struct hid_device * hid )
1226+ {
1227+ //struct sdw_slave *slave = dev_to_sdw_dev(hid->dev.parent);
1228+ struct sdca_entity * entity = hid -> driver_data ;
1229+ unsigned int rsize = 0 ;
1230+ char * rdesc ;
1231+ int ret ;
1232+
1233+ rsize = entity -> hide .hid_desc .desc [0 ].wDescriptorLength ;
1234+
1235+ if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE ) {
1236+ dev_err (& hid -> dev , "weird size of report descriptor (%u)\n" , rsize );
1237+ return - EINVAL ;
1238+ }
1239+
1240+ rdesc = kmalloc (rsize , GFP_KERNEL );
1241+ if (!rdesc )
1242+ return - ENOMEM ;
1243+
1244+ memcpy (rdesc , entity -> hide .hid_report_desc , rsize );
1245+
1246+ ret = hid_parse_report (hid , rdesc , rsize );
1247+ kfree (rdesc );
1248+ if (ret ) {
1249+ dev_err (& hid -> dev , "parsing report descriptor failed\n" );
1250+ goto err ;
1251+ }
1252+
1253+ return 0 ;
1254+ err :
1255+ return ret ;
1256+ }
1257+
1258+ static int sdwhid_start (struct hid_device * hid )
1259+ {
1260+ return 0 ;
1261+ }
1262+
1263+ static void sdwhid_stop (struct hid_device * hid )
1264+ {
1265+
1266+ }
1267+
1268+ static int sdwhid_raw_request (struct hid_device * hid , unsigned char reportnum ,
1269+ __u8 * buf , size_t len , unsigned char rtype , int reqtype )
1270+ {
1271+ switch (reqtype ) {
1272+ case HID_REQ_GET_REPORT :
1273+ /* not implemented yet */
1274+ //return usbhid_get_raw_report(hid, reportnum, buf, len, rtype);
1275+ printk ("%s: HID_REQ_GET_REPORT not implemented\n" , __func__ );
1276+ return 0 ;
1277+ case HID_REQ_SET_REPORT :
1278+ /* not implemented yet */
1279+ //return usbhid_set_raw_report(hid, reportnum, buf, len, rtype);
1280+ printk ("%s: HID_REQ_SET_REPORT not implemented\n" , __func__ );
1281+ return 0 ;
1282+ default :
1283+ return - EIO ;
1284+ }
1285+ }
1286+
1287+ static int sdwhid_open (struct hid_device * hid )
1288+ {
1289+ return 0 ;
1290+ }
1291+
1292+ static void sdwhid_close (struct hid_device * hid )
1293+ {
1294+
1295+ }
1296+
1297+ static const struct hid_ll_driver sdw_hid_driver = {
1298+ .parse = sdwhid_parse ,
1299+ .start = sdwhid_start ,
1300+ .stop = sdwhid_stop ,
1301+ .open = sdwhid_open ,
1302+ .close = sdwhid_close ,
1303+ .raw_request = sdwhid_raw_request ,
1304+ };
1305+
1306+ static int register_sdw_hid_device (struct device * dev , struct fwnode_handle * entity_node ,
1307+ struct sdca_entity * entity )
1308+ {
1309+ struct sdw_bus * bus ;
1310+ struct hid_device * hid ;
1311+ struct sdw_slave * slave = dev_to_sdw_dev (dev );
1312+ int ret ;
1313+
1314+ bus = slave -> bus ;
1315+
1316+ hid = hid_allocate_device ();
1317+ if (IS_ERR (hid ))
1318+ return PTR_ERR (hid );
1319+
1320+ hid -> ll_driver = & sdw_hid_driver ;
1321+
1322+ hid -> dev .parent = dev ;
1323+
1324+ hid -> name [0 ] = 0 ;
1325+ if (!strlen (hid -> name ))
1326+ snprintf (hid -> name , sizeof (hid -> name ), "HID sdw:%01x:%01x:%04x:%04x:%02x" ,
1327+ bus -> controller_id , bus -> link_id , slave -> id .mfg_id , slave -> id .part_id ,
1328+ slave -> id .class_id );
1329+
1330+ hid -> driver_data = entity ;
1331+
1332+ ret = hid_add_device (hid );
1333+ if (ret ) {
1334+ if (ret != - ENODEV )
1335+ dev_err (dev , "can't add hid device: %d\n" , ret );
1336+ }
1337+
1338+ entity -> hide .hid = hid ;
1339+
1340+ return 0 ;
1341+ }
1342+
12251343static int find_sdca_entity_hide (struct device * dev , struct fwnode_handle * function_node ,
12261344 struct fwnode_handle * entity_node , struct sdca_entity * entity )
12271345{
@@ -1305,6 +1423,9 @@ static int find_sdca_entity_hide(struct device *dev, struct fwnode_handle *funct
13051423 hide -> hid_report_desc = report_desc ;
13061424 fwnode_property_read_u8_array (function_node , "mipi-sdca-report-descriptor" , report_desc , num_report_decs );
13071425
1426+ /* register HID device */
1427+ register_sdw_hid_device (dev , entity_node , entity );
1428+
13081429 return 0 ;
13091430}
13101431
0 commit comments