Merge tag 'iio-for-4.3b-2' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next
Jonathan writes:
Second set of new device support, features and cleanup for the 4.3 cycle.
Take 2 also includes a fix set that was too late for the 4.2 cycle.
As we had a lot of tools and docs work in this set, I have broken those
out into their own categories in this description.
Fixes from the pull request '4th set of IIO fixes for the 4.2 cycle'.
* Poll functions for both event chardev and the buffer one were returning
negative error codes (via a positive value).
* A recent change to lsiio adding some error handling that was wrong and
stopped the tool working.
* bmg160 was missing some dependencies in Kconfig
* berlin2-adc had a misshandled register (wrote a value rather than a bitmap)
New device support
* TI opt3001 light sensor
* TXC PA12 ALS and proximity sensor.
* mcp3301 ADC support (in mcp320x driver)
* ST lsm303agr accelerometer and magnetometer drivers (plus some st-sensors
common support to allow different WHOAMI register addresses, devices with
fixed scale and allow interrupt equiped magnetometers).
* ADIS16305, ADIS16367, ADIS16445IMUs (in the adis16400 driver)
* ADIS16266 gyro (in the adis16260 driver)
* ADIS16137 gyro (in the adis16136 driver)
New functionality
* mmc35240 DT bindings.
* Inverse unit conversion macros to aid handing of values written to sysfs
attributes.
Core cleanup
* Forward declaration of struct iio_trigger to avoid a compile warning.
Driver cleanup / fixes
* mxs-lradc
- Clarify which parts are supported.
- Fix spelling erorrs.
- Missing/extra includes
- reorder includes
- add datasheet name listings for all usable channels (to allow them
to be bound by name from consumer drivers)
* acpi-als - add some function prefixes as per general iio style.
* bmc150_magn - replace a magic value with the existing define.
* vf610 - determine possible sample frequencies taking into account the
electrical characteristics (defining a minimum sample time)
* dht11
- whitespace
- additional docs
- avoid mulitple assignments in one line
- Use the new funciton ktime_get_resolution_ns to cleanup a nasty trick
previously used for timing.
* Fix all drivers that consider 0 a valid IRQ for historical reasons.
* Export I2C module alias info where previously missing (to allow autoprobing)
* Export OF module alias info where previously missing.
* mmc35240 - switch some variables into arrays to improve readability.
* mlx90614 - define some magic numbers for readability.
* bmc150_magn
- expand area locked by a mutex to cover all the use of the
data->buffer.
- use descriptive naming for a mask instead of a magic value.
* berin2-adc
- pass up an error code rather that a generic error
- constify the iio_chan_spec
- some other little tidy ups.
* stk8312
- fix a dependency on triggered buffers in kconfig
- add a check for invalid attribute values
- improve error handling by returning error codes where possible and
return immediately where relevant
- rework macro defs to use GENMASK etc
- change some variable types to reduce unnecessary casting
- clean up code style
- drop a local buffer copy for bulk reads and use the one in data->buffer
instead.
* adis16400 - the adis16448 gyroscope scale was wrong.
* adis16480 - some more wrong scales for various parts.
* adis16300 - has an undocumented product id and serial number registers so
use them.
* iio_simple_dummy - fix some wrong code indentation.
* bmc150-accel - use the chip ID to detect the chip present rather than
verifying the expected part was there. This was in response to a wrong
ACPI entry on the WinBook TW100.
* mma8452
- fix _get_hp_filter_index
- drop a double include
- pass up an error code rather than rewriting it
- range check input values to attribute writes
- register defs tidy up using GENMASK and reordering them to be easier to
follow.
- various coding style cleanups
- put the Kconfig entry in the write place (alphabetically).
Tools related
* Tools cleanup - drop an explicity NULL comparison, some unnecessary braces,
use the ARRAY_SIZE macro, send error messages to stderr instead of dropping
them in the middle of normal output.
* Fix tools to allow that scale and offset attributes are optional.
* More tools fixes including allowing true 32bit data (previously an overflow
prevented more than 31bits)
* Drop a stray header guard that ended up in a c file.
* Make calc_digits static as it isn't exported or in the header.
* Set ci_array pointer to NULL after free as a protection against non safe
usage of the tools core code. Also convert a double pointer to a single
one as the extra level of indirection was unnecessary.
Docs
* DocBook introduction by Daniel Baluta. Glad we are beginning to
draw together some more introductory docs to suplement the various
tools / examples.
* Drop bytes_per_datum sysfs attribute docs as it no longer exists.
* A whole load of missing / fixing of kernel-doc for the core of IIO.
* Document the trigger name sysfs attribute in the ABI docs.
* Minor typos in the ABI docs related to power down modes.
This commit is contained in:
@@ -68,6 +68,9 @@
|
||||
#define VF610_ADC_CLK_DIV8 0x60
|
||||
#define VF610_ADC_CLK_MASK 0x60
|
||||
#define VF610_ADC_ADLSMP_LONG 0x10
|
||||
#define VF610_ADC_ADSTS_SHORT 0x100
|
||||
#define VF610_ADC_ADSTS_NORMAL 0x200
|
||||
#define VF610_ADC_ADSTS_LONG 0x300
|
||||
#define VF610_ADC_ADSTS_MASK 0x300
|
||||
#define VF610_ADC_ADLPC_EN 0x80
|
||||
#define VF610_ADC_ADHSC_EN 0x400
|
||||
@@ -98,6 +101,8 @@
|
||||
#define VF610_ADC_CALF 0x2
|
||||
#define VF610_ADC_TIMEOUT msecs_to_jiffies(100)
|
||||
|
||||
#define DEFAULT_SAMPLE_TIME 1000
|
||||
|
||||
enum clk_sel {
|
||||
VF610_ADCIOC_BUSCLK_SET,
|
||||
VF610_ADCIOC_ALTCLK_SET,
|
||||
@@ -124,6 +129,17 @@ enum conversion_mode_sel {
|
||||
VF610_ADC_CONV_LOW_POWER,
|
||||
};
|
||||
|
||||
enum lst_adder_sel {
|
||||
VF610_ADCK_CYCLES_3,
|
||||
VF610_ADCK_CYCLES_5,
|
||||
VF610_ADCK_CYCLES_7,
|
||||
VF610_ADCK_CYCLES_9,
|
||||
VF610_ADCK_CYCLES_13,
|
||||
VF610_ADCK_CYCLES_17,
|
||||
VF610_ADCK_CYCLES_21,
|
||||
VF610_ADCK_CYCLES_25,
|
||||
};
|
||||
|
||||
struct vf610_adc_feature {
|
||||
enum clk_sel clk_sel;
|
||||
enum vol_ref vol_ref;
|
||||
@@ -132,6 +148,8 @@ struct vf610_adc_feature {
|
||||
int clk_div;
|
||||
int sample_rate;
|
||||
int res_mode;
|
||||
u32 lst_adder_index;
|
||||
u32 default_sample_time;
|
||||
|
||||
bool calibration;
|
||||
bool ovwren;
|
||||
@@ -155,11 +173,13 @@ struct vf610_adc {
|
||||
};
|
||||
|
||||
static const u32 vf610_hw_avgs[] = { 1, 4, 8, 16, 32 };
|
||||
static const u32 vf610_lst_adder[] = { 3, 5, 7, 9, 13, 17, 21, 25 };
|
||||
|
||||
static inline void vf610_adc_calculate_rates(struct vf610_adc *info)
|
||||
{
|
||||
struct vf610_adc_feature *adc_feature = &info->adc_feature;
|
||||
unsigned long adck_rate, ipg_rate = clk_get_rate(info->clk);
|
||||
u32 adck_period, lst_addr_min;
|
||||
int divisor, i;
|
||||
|
||||
adck_rate = info->max_adck_rate[adc_feature->conv_mode];
|
||||
@@ -173,6 +193,19 @@ static inline void vf610_adc_calculate_rates(struct vf610_adc *info)
|
||||
adc_feature->clk_div = 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the long sample time adder value to be used based
|
||||
* on the default minimum sample time provided.
|
||||
*/
|
||||
adck_period = NSEC_PER_SEC / adck_rate;
|
||||
lst_addr_min = adc_feature->default_sample_time / adck_period;
|
||||
for (i = 0; i < ARRAY_SIZE(vf610_lst_adder); i++) {
|
||||
if (vf610_lst_adder[i] > lst_addr_min) {
|
||||
adc_feature->lst_adder_index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate ADC sample frequencies
|
||||
* Sample time unit is ADCK cycles. ADCK clk source is ipg clock,
|
||||
@@ -182,12 +215,13 @@ static inline void vf610_adc_calculate_rates(struct vf610_adc *info)
|
||||
* SFCAdder: fixed to 6 ADCK cycles
|
||||
* AverageNum: 1, 4, 8, 16, 32 samples for hardware average.
|
||||
* BCT (Base Conversion Time): fixed to 25 ADCK cycles for 12 bit mode
|
||||
* LSTAdder(Long Sample Time): fixed to 3 ADCK cycles
|
||||
* LSTAdder(Long Sample Time): 3, 5, 7, 9, 13, 17, 21, 25 ADCK cycles
|
||||
*/
|
||||
adck_rate = ipg_rate / info->adc_feature.clk_div;
|
||||
for (i = 0; i < ARRAY_SIZE(vf610_hw_avgs); i++)
|
||||
info->sample_freq_avail[i] =
|
||||
adck_rate / (6 + vf610_hw_avgs[i] * (25 + 3));
|
||||
adck_rate / (6 + vf610_hw_avgs[i] *
|
||||
(25 + vf610_lst_adder[adc_feature->lst_adder_index]));
|
||||
}
|
||||
|
||||
static inline void vf610_adc_cfg_init(struct vf610_adc *info)
|
||||
@@ -347,8 +381,40 @@ static void vf610_adc_sample_set(struct vf610_adc *info)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Use the short sample mode */
|
||||
cfg_data &= ~(VF610_ADC_ADLSMP_LONG | VF610_ADC_ADSTS_MASK);
|
||||
/*
|
||||
* Set ADLSMP and ADSTS based on the Long Sample Time Adder value
|
||||
* determined.
|
||||
*/
|
||||
switch (adc_feature->lst_adder_index) {
|
||||
case VF610_ADCK_CYCLES_3:
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_5:
|
||||
cfg_data |= VF610_ADC_ADSTS_SHORT;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_7:
|
||||
cfg_data |= VF610_ADC_ADSTS_NORMAL;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_9:
|
||||
cfg_data |= VF610_ADC_ADSTS_LONG;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_13:
|
||||
cfg_data |= VF610_ADC_ADLSMP_LONG;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_17:
|
||||
cfg_data |= VF610_ADC_ADLSMP_LONG;
|
||||
cfg_data |= VF610_ADC_ADSTS_SHORT;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_21:
|
||||
cfg_data |= VF610_ADC_ADLSMP_LONG;
|
||||
cfg_data |= VF610_ADC_ADSTS_NORMAL;
|
||||
break;
|
||||
case VF610_ADCK_CYCLES_25:
|
||||
cfg_data |= VF610_ADC_ADLSMP_LONG;
|
||||
cfg_data |= VF610_ADC_ADSTS_NORMAL;
|
||||
break;
|
||||
default:
|
||||
dev_err(info->dev, "error in sample time select\n");
|
||||
}
|
||||
|
||||
/* update hardware average selection */
|
||||
cfg_data &= ~VF610_ADC_AVGS_MASK;
|
||||
@@ -713,6 +779,11 @@ static int vf610_adc_probe(struct platform_device *pdev)
|
||||
of_property_read_u32_array(pdev->dev.of_node, "fsl,adck-max-frequency",
|
||||
info->max_adck_rate, 3);
|
||||
|
||||
ret = of_property_read_u32(pdev->dev.of_node, "min-sample-time",
|
||||
&info->adc_feature.default_sample_time);
|
||||
if (ret)
|
||||
info->adc_feature.default_sample_time = DEFAULT_SAMPLE_TIME;
|
||||
|
||||
platform_set_drvdata(pdev, indio_dev);
|
||||
|
||||
init_completion(&info->completion);
|
||||
|
||||
Reference in New Issue
Block a user