@@ -39,6 +39,7 @@ MODULE_PARM_DESC(max_retries, "Max resends of a command before timing out.");
39
39
struct ipmi_ipmb_dev {
40
40
struct ipmi_smi * intf ;
41
41
struct i2c_client * client ;
42
+ struct i2c_client * slave ;
42
43
43
44
struct ipmi_smi_handlers handlers ;
44
45
@@ -257,7 +258,7 @@ static void ipmi_ipmb_format_for_xmit(struct ipmi_ipmb_dev *iidev,
257
258
memcpy (iidev -> xmitmsg + 5 , msg -> data + 1 , msg -> data_size - 1 );
258
259
iidev -> xmitlen = msg -> data_size + 4 ;
259
260
}
260
- iidev -> xmitmsg [3 ] = iidev -> client -> addr << 1 ;
261
+ iidev -> xmitmsg [3 ] = iidev -> slave -> addr << 1 ;
261
262
if (((msg -> data [0 ] >> 2 ) & 1 ) == 0 )
262
263
/* If it's a command, put in our own sequence number. */
263
264
iidev -> xmitmsg [4 ] = ((iidev -> xmitmsg [4 ] & 0x03 ) |
@@ -427,10 +428,13 @@ static int ipmi_ipmb_remove(struct i2c_client *client)
427
428
{
428
429
struct ipmi_ipmb_dev * iidev = i2c_get_clientdata (client );
429
430
430
- if (iidev -> client ) {
431
- iidev -> client = NULL ;
432
- i2c_slave_unregister (client );
431
+ if (iidev -> slave ) {
432
+ i2c_slave_unregister (iidev -> slave );
433
+ if (iidev -> slave != iidev -> client )
434
+ i2c_unregister_device (iidev -> slave );
433
435
}
436
+ iidev -> slave = NULL ;
437
+ iidev -> client = NULL ;
434
438
ipmi_ipmb_stop_thread (iidev );
435
439
436
440
ipmi_unregister_smi (iidev -> intf );
@@ -443,6 +447,9 @@ static int ipmi_ipmb_probe(struct i2c_client *client,
443
447
{
444
448
struct device * dev = & client -> dev ;
445
449
struct ipmi_ipmb_dev * iidev ;
450
+ struct device_node * slave_np ;
451
+ struct i2c_adapter * slave_adap = NULL ;
452
+ struct i2c_client * slave = NULL ;
446
453
int rv ;
447
454
448
455
iidev = devm_kzalloc (& client -> dev , sizeof (* iidev ), GFP_KERNEL );
@@ -466,14 +473,45 @@ static int ipmi_ipmb_probe(struct i2c_client *client,
466
473
& iidev -> max_retries ) != 0 )
467
474
iidev -> max_retries = max_retries ;
468
475
476
+ slave_np = of_parse_phandle (dev -> of_node , "slave-dev" , 0 );
477
+ if (slave_np ) {
478
+ slave_adap = of_get_i2c_adapter_by_node (slave_np );
479
+ if (!slave_adap ) {
480
+ dev_notice (& client -> dev ,
481
+ "Could not find slave adapter\n" );
482
+ return - EINVAL ;
483
+ }
484
+ }
485
+
486
+ iidev -> client = client ;
487
+
488
+ if (slave_adap ) {
489
+ struct i2c_board_info binfo ;
490
+
491
+ memset (& binfo , 0 , sizeof (binfo ));
492
+ strscpy (binfo .type , "ipmb-slave" , I2C_NAME_SIZE );
493
+ binfo .addr = client -> addr ;
494
+ binfo .flags = I2C_CLIENT_SLAVE ;
495
+ slave = i2c_new_client_device (slave_adap , & binfo );
496
+ i2c_put_adapter (slave_adap );
497
+ if (IS_ERR (slave )) {
498
+ rv = PTR_ERR (slave );
499
+ dev_notice (& client -> dev ,
500
+ "Could not allocate slave device: %d\n" , rv );
501
+ return rv ;
502
+ }
503
+ i2c_set_clientdata (slave , iidev );
504
+ } else {
505
+ slave = client ;
506
+ }
469
507
i2c_set_clientdata (client , iidev );
470
- client -> flags |= I2C_CLIENT_SLAVE ;
508
+ slave -> flags |= I2C_CLIENT_SLAVE ;
471
509
472
- rv = i2c_slave_register (client , ipmi_ipmb_slave_cb );
510
+ rv = i2c_slave_register (slave , ipmi_ipmb_slave_cb );
473
511
if (rv )
474
- return rv ;
475
-
476
- iidev -> client = client ;
512
+ goto out_err ;
513
+ iidev -> slave = slave ;
514
+ slave = NULL ;
477
515
478
516
iidev -> handlers .flags = IPMI_SMI_CAN_HANDLE_IPMB_DIRECT ;
479
517
iidev -> handlers .start_processing = ipmi_ipmb_start_processing ;
@@ -504,6 +542,8 @@ static int ipmi_ipmb_probe(struct i2c_client *client,
504
542
return 0 ;
505
543
506
544
out_err :
545
+ if (slave && slave != client )
546
+ i2c_unregister_device (slave );
507
547
ipmi_ipmb_remove (client );
508
548
return rv ;
509
549
}
0 commit comments