@@ -182,6 +182,7 @@ struct hmc5843_chip_info {
182
182
183
183
/* Each client has this additional data */
184
184
struct hmc5843_data {
185
+ struct i2c_client * client ;
185
186
struct mutex lock ;
186
187
u8 rate ;
187
188
u8 meas_conf ;
@@ -200,31 +201,28 @@ static s32 hmc5843_configure(struct i2c_client *client,
200
201
}
201
202
202
203
/* Return the measurement value from the specified channel */
203
- static int hmc5843_read_measurement (struct iio_dev * indio_dev ,
204
- int address ,
205
- int * val )
204
+ static int hmc5843_read_measurement (struct hmc5843_data * data ,
205
+ int address , int * val )
206
206
{
207
- struct i2c_client * client = to_i2c_client (indio_dev -> dev .parent );
208
- struct hmc5843_data * data = iio_priv (indio_dev );
209
207
s32 result ;
210
208
int tries = 150 ;
211
209
212
210
mutex_lock (& data -> lock );
213
211
while (tries -- > 0 ) {
214
- result = i2c_smbus_read_byte_data (client ,
212
+ result = i2c_smbus_read_byte_data (data -> client ,
215
213
HMC5843_STATUS_REG );
216
214
if (result & HMC5843_DATA_READY )
217
215
break ;
218
216
msleep (20 );
219
217
}
220
218
221
219
if (tries < 0 ) {
222
- dev_err (& client -> dev , "data not ready\n" );
220
+ dev_err (& data -> client -> dev , "data not ready\n" );
223
221
mutex_unlock (& data -> lock );
224
222
return - EIO ;
225
223
}
226
224
227
- result = i2c_smbus_read_word_swapped (client , address );
225
+ result = i2c_smbus_read_word_swapped (data -> client , address );
228
226
mutex_unlock (& data -> lock );
229
227
if (result < 0 )
230
228
return - EINVAL ;
@@ -318,15 +316,13 @@ static IIO_DEVICE_ATTR(operating_mode,
318
316
* and BN.
319
317
*
320
318
*/
321
- static s32 hmc5843_set_meas_conf (struct i2c_client * client ,
322
- u8 meas_conf )
319
+ static s32 hmc5843_set_meas_conf (struct hmc5843_data * data , u8 meas_conf )
323
320
{
324
- struct iio_dev * indio_dev = i2c_get_clientdata (client );
325
- struct hmc5843_data * data = iio_priv (indio_dev );
326
321
u8 reg_val ;
327
322
reg_val = (meas_conf & HMC5843_MEAS_CONF_MASK ) |
328
323
(data -> rate << HMC5843_RATE_OFFSET );
329
- return i2c_smbus_write_byte_data (client , HMC5843_CONFIG_REG_A , reg_val );
324
+ return i2c_smbus_write_byte_data (data -> client , HMC5843_CONFIG_REG_A ,
325
+ reg_val );
330
326
}
331
327
332
328
static ssize_t hmc5843_show_measurement_configuration (struct device * dev ,
@@ -344,7 +340,6 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
344
340
size_t count )
345
341
{
346
342
struct iio_dev * indio_dev = dev_to_iio_dev (dev );
347
- struct i2c_client * client = to_i2c_client (indio_dev -> dev .parent );
348
343
struct hmc5843_data * data = iio_priv (indio_dev );
349
344
unsigned long meas_conf = 0 ;
350
345
int error ;
@@ -357,7 +352,7 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
357
352
358
353
mutex_lock (& data -> lock );
359
354
dev_dbg (dev , "set measurement configuration to %lu\n" , meas_conf );
360
- if (hmc5843_set_meas_conf (client , meas_conf )) {
355
+ if (hmc5843_set_meas_conf (data , meas_conf )) {
361
356
count = - EINVAL ;
362
357
goto exit ;
363
358
}
@@ -396,21 +391,19 @@ static ssize_t hmc5843_show_sampling_frequencies_available(struct device *dev,
396
391
397
392
static IIO_DEV_ATTR_SAMP_FREQ_AVAIL (hmc5843_show_sampling_frequencies_available );
398
393
399
- static s32 hmc5843_set_rate (struct i2c_client * client ,
400
- u8 rate )
394
+ static s32 hmc5843_set_rate (struct hmc5843_data * data , u8 rate )
401
395
{
402
- struct iio_dev * indio_dev = i2c_get_clientdata (client );
403
- struct hmc5843_data * data = iio_priv (indio_dev );
404
396
u8 reg_val ;
405
397
406
398
if (rate >= HMC5843_RATE_NOT_USED ) {
407
- dev_err (& client -> dev ,
399
+ dev_err (& data -> client -> dev ,
408
400
"data output rate is not supported\n" );
409
401
return - EINVAL ;
410
402
}
411
403
412
404
reg_val = data -> meas_conf | (rate << HMC5843_RATE_OFFSET );
413
- return i2c_smbus_write_byte_data (client , HMC5843_CONFIG_REG_A , reg_val );
405
+ return i2c_smbus_write_byte_data (data -> client , HMC5843_CONFIG_REG_A ,
406
+ reg_val );
414
407
}
415
408
416
409
static int hmc5843_check_sampling_frequency (struct hmc5843_data * data ,
@@ -433,20 +426,19 @@ static ssize_t hmc5843_set_sampling_frequency(struct device *dev,
433
426
{
434
427
435
428
struct iio_dev * indio_dev = dev_to_iio_dev (dev );
436
- struct i2c_client * client = to_i2c_client (indio_dev -> dev .parent );
437
429
struct hmc5843_data * data = iio_priv (indio_dev );
438
430
int rate ;
439
431
440
432
rate = hmc5843_check_sampling_frequency (data , buf );
441
433
if (rate < 0 ) {
442
- dev_err (& client -> dev ,
434
+ dev_err (& data -> client -> dev ,
443
435
"sampling frequency is not supported\n" );
444
436
return rate ;
445
437
}
446
438
447
439
mutex_lock (& data -> lock );
448
440
dev_dbg (dev , "set rate to %d\n" , rate );
449
- if (hmc5843_set_rate (client , rate )) {
441
+ if (hmc5843_set_rate (data , rate )) {
450
442
count = - EINVAL ;
451
443
goto exit ;
452
444
}
@@ -461,12 +453,11 @@ static ssize_t hmc5843_show_sampling_frequency(struct device *dev,
461
453
struct device_attribute * attr , char * buf )
462
454
{
463
455
struct iio_dev * indio_dev = dev_to_iio_dev (dev );
464
- struct i2c_client * client = to_i2c_client (indio_dev -> dev .parent );
465
456
struct iio_dev_attr * this_attr = to_iio_dev_attr (attr );
466
457
struct hmc5843_data * data = iio_priv (indio_dev );
467
458
s32 rate ;
468
459
469
- rate = i2c_smbus_read_byte_data (client , this_attr -> address );
460
+ rate = i2c_smbus_read_byte_data (data -> client , this_attr -> address );
470
461
if (rate < 0 )
471
462
return rate ;
472
463
rate = (rate & HMC5843_RATE_BITMASK ) >> HMC5843_RATE_OFFSET ;
@@ -497,7 +488,6 @@ static ssize_t hmc5843_set_range_gain(struct device *dev,
497
488
size_t count )
498
489
{
499
490
struct iio_dev * indio_dev = dev_to_iio_dev (dev );
500
- struct i2c_client * client = to_i2c_client (indio_dev -> dev .parent );
501
491
struct iio_dev_attr * this_attr = to_iio_dev_attr (attr );
502
492
struct hmc5843_data * data = iio_priv (indio_dev );
503
493
unsigned long range = 0 ;
@@ -518,7 +508,7 @@ static ssize_t hmc5843_set_range_gain(struct device *dev,
518
508
519
509
data -> range = range ;
520
510
range = range << HMC5843_RANGE_GAIN_OFFSET ;
521
- if (i2c_smbus_write_byte_data (client , this_attr -> address , range ))
511
+ if (i2c_smbus_write_byte_data (data -> client , this_attr -> address , range ))
522
512
count = - EINVAL ;
523
513
524
514
exit :
@@ -541,9 +531,7 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
541
531
542
532
switch (mask ) {
543
533
case IIO_CHAN_INFO_RAW :
544
- return hmc5843_read_measurement (indio_dev ,
545
- chan -> address ,
546
- val );
534
+ return hmc5843_read_measurement (data , chan -> address , val );
547
535
case IIO_CHAN_INFO_SCALE :
548
536
* val = 0 ;
549
537
* val2 = data -> variant -> regval_to_nanoscale [data -> range ];
@@ -621,8 +609,8 @@ static void hmc5843_init_client(struct i2c_client *client,
621
609
data -> variant = & hmc5843_chip_info_tbl [id -> driver_data ];
622
610
indio_dev -> channels = data -> variant -> channels ;
623
611
indio_dev -> num_channels = 3 ;
624
- hmc5843_set_meas_conf (client , data -> meas_conf );
625
- hmc5843_set_rate (client , data -> rate );
612
+ hmc5843_set_meas_conf (data , data -> meas_conf );
613
+ hmc5843_set_rate (data , data -> rate );
626
614
hmc5843_configure (client , data -> operating_mode );
627
615
i2c_smbus_write_byte_data (client , HMC5843_CONFIG_REG_B , data -> range );
628
616
mutex_init (& data -> lock );
@@ -649,6 +637,7 @@ static int hmc5843_probe(struct i2c_client *client,
649
637
650
638
/* default settings at probe */
651
639
data = iio_priv (indio_dev );
640
+ data -> client = client ;
652
641
data -> meas_conf = HMC5843_MEAS_CONF_NORMAL ;
653
642
data -> range = HMC5843_RANGE_GAIN_DEFAULT ;
654
643
data -> operating_mode = HMC5843_MODE_CONVERSION_CONTINUOUS ;
@@ -687,10 +676,10 @@ static int hmc5843_suspend(struct device *dev)
687
676
688
677
static int hmc5843_resume (struct device * dev )
689
678
{
690
- struct i2c_client * client = to_i2c_client ( dev );
691
- struct hmc5843_data * data = iio_priv ( i2c_get_clientdata ( client ));
679
+ struct hmc5843_data * data = iio_priv ( i2c_get_clientdata (
680
+ to_i2c_client ( dev ) ));
692
681
693
- hmc5843_configure (client , data -> operating_mode );
682
+ hmc5843_configure (data -> client , data -> operating_mode );
694
683
695
684
return 0 ;
696
685
}
0 commit comments