提交 e168e984 编写于 作者: G Greg Kroah-Hartman

Merge tag 'iio-fixes-for-4.15a' of...

Merge tag 'iio-fixes-for-4.15a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus

Jonathan writes:

First set of IIO fixes in the 4.15 cycle.

* kernel-doc
  - fix a build error from symbols ending in _ by making them _*
* cpcap
  - Fix wrong handling of platform_get_irq_by_name which can return a
    postive value on success.
* max30102
  - ABI says temperature should bein milli Celsius after scaling. Here it
    was in Celsius.
* meson-saradc:
  - for Meson8/8b the gate clock bit was wrongly selected due to ffs/fls fun.
  - bandgap was not initialized properly on older socs.  Mostly got away
    with this because the bootloader was doing it for us.
  - Meson8/8b don't have some registers in the general regmap config. Give
    them their own ones.
* stm32-lptimer/stm32-adc trigger
  - Fix a link error when optional stm32-lptimer driver isn't built.
* sx9500
  - we recently removed explict handling of ACPI provided gpio interrupts
    as the core i2c acpi code started providing them directly.  Unfortuantely
    there are ACPI tables out there that use GpioIO resources and it doesn't
    know to map those as interrupts.  As such partial revert the removal
    of this handling from the driver.
...@@ -1011,7 +1011,7 @@ static int cpcap_adc_probe(struct platform_device *pdev) ...@@ -1011,7 +1011,7 @@ static int cpcap_adc_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, indio_dev); platform_set_drvdata(pdev, indio_dev);
ddata->irq = platform_get_irq_byname(pdev, "adcdone"); ddata->irq = platform_get_irq_byname(pdev, "adcdone");
if (!ddata->irq) if (ddata->irq < 0)
return -ENODEV; return -ENODEV;
error = devm_request_threaded_irq(&pdev->dev, ddata->irq, NULL, error = devm_request_threaded_irq(&pdev->dev, ddata->irq, NULL,
......
...@@ -221,8 +221,10 @@ enum meson_sar_adc_chan7_mux_sel { ...@@ -221,8 +221,10 @@ enum meson_sar_adc_chan7_mux_sel {
struct meson_sar_adc_data { struct meson_sar_adc_data {
bool has_bl30_integration; bool has_bl30_integration;
u32 bandgap_reg;
unsigned int resolution; unsigned int resolution;
const char *name; const char *name;
const struct regmap_config *regmap_config;
}; };
struct meson_sar_adc_priv { struct meson_sar_adc_priv {
...@@ -242,13 +244,20 @@ struct meson_sar_adc_priv { ...@@ -242,13 +244,20 @@ struct meson_sar_adc_priv {
int calibscale; int calibscale;
}; };
static const struct regmap_config meson_sar_adc_regmap_config = { static const struct regmap_config meson_sar_adc_regmap_config_gxbb = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 32, .val_bits = 32,
.reg_stride = 4, .reg_stride = 4,
.max_register = MESON_SAR_ADC_REG13, .max_register = MESON_SAR_ADC_REG13,
}; };
static const struct regmap_config meson_sar_adc_regmap_config_meson8 = {
.reg_bits = 8,
.val_bits = 32,
.reg_stride = 4,
.max_register = MESON_SAR_ADC_DELTA_10,
};
static unsigned int meson_sar_adc_get_fifo_count(struct iio_dev *indio_dev) static unsigned int meson_sar_adc_get_fifo_count(struct iio_dev *indio_dev)
{ {
struct meson_sar_adc_priv *priv = iio_priv(indio_dev); struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
...@@ -600,7 +609,7 @@ static int meson_sar_adc_clk_init(struct iio_dev *indio_dev, ...@@ -600,7 +609,7 @@ static int meson_sar_adc_clk_init(struct iio_dev *indio_dev,
init.num_parents = 1; init.num_parents = 1;
priv->clk_gate.reg = base + MESON_SAR_ADC_REG3; priv->clk_gate.reg = base + MESON_SAR_ADC_REG3;
priv->clk_gate.bit_idx = fls(MESON_SAR_ADC_REG3_CLK_EN); priv->clk_gate.bit_idx = __ffs(MESON_SAR_ADC_REG3_CLK_EN);
priv->clk_gate.hw.init = &init; priv->clk_gate.hw.init = &init;
priv->adc_clk = devm_clk_register(&indio_dev->dev, &priv->clk_gate.hw); priv->adc_clk = devm_clk_register(&indio_dev->dev, &priv->clk_gate.hw);
...@@ -685,6 +694,20 @@ static int meson_sar_adc_init(struct iio_dev *indio_dev) ...@@ -685,6 +694,20 @@ static int meson_sar_adc_init(struct iio_dev *indio_dev)
return 0; return 0;
} }
static void meson_sar_adc_set_bandgap(struct iio_dev *indio_dev, bool on_off)
{
struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
u32 enable_mask;
if (priv->data->bandgap_reg == MESON_SAR_ADC_REG11)
enable_mask = MESON_SAR_ADC_REG11_BANDGAP_EN;
else
enable_mask = MESON_SAR_ADC_DELTA_10_TS_VBG_EN;
regmap_update_bits(priv->regmap, priv->data->bandgap_reg, enable_mask,
on_off ? enable_mask : 0);
}
static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev) static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
{ {
struct meson_sar_adc_priv *priv = iio_priv(indio_dev); struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
...@@ -717,9 +740,9 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev) ...@@ -717,9 +740,9 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1); regval = FIELD_PREP(MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, 1);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0,
MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval); MESON_SAR_ADC_REG0_FIFO_CNT_IRQ_MASK, regval);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
MESON_SAR_ADC_REG11_BANDGAP_EN, meson_sar_adc_set_bandgap(indio_dev, true);
MESON_SAR_ADC_REG11_BANDGAP_EN);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
MESON_SAR_ADC_REG3_ADC_EN, MESON_SAR_ADC_REG3_ADC_EN,
MESON_SAR_ADC_REG3_ADC_EN); MESON_SAR_ADC_REG3_ADC_EN);
...@@ -739,8 +762,7 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev) ...@@ -739,8 +762,7 @@ static int meson_sar_adc_hw_enable(struct iio_dev *indio_dev)
err_adc_clk: err_adc_clk:
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
MESON_SAR_ADC_REG3_ADC_EN, 0); MESON_SAR_ADC_REG3_ADC_EN, 0);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11, meson_sar_adc_set_bandgap(indio_dev, false);
MESON_SAR_ADC_REG11_BANDGAP_EN, 0);
clk_disable_unprepare(priv->sana_clk); clk_disable_unprepare(priv->sana_clk);
err_sana_clk: err_sana_clk:
clk_disable_unprepare(priv->core_clk); clk_disable_unprepare(priv->core_clk);
...@@ -765,8 +787,8 @@ static int meson_sar_adc_hw_disable(struct iio_dev *indio_dev) ...@@ -765,8 +787,8 @@ static int meson_sar_adc_hw_disable(struct iio_dev *indio_dev)
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
MESON_SAR_ADC_REG3_ADC_EN, 0); MESON_SAR_ADC_REG3_ADC_EN, 0);
regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG11,
MESON_SAR_ADC_REG11_BANDGAP_EN, 0); meson_sar_adc_set_bandgap(indio_dev, false);
clk_disable_unprepare(priv->sana_clk); clk_disable_unprepare(priv->sana_clk);
clk_disable_unprepare(priv->core_clk); clk_disable_unprepare(priv->core_clk);
...@@ -844,30 +866,40 @@ static const struct iio_info meson_sar_adc_iio_info = { ...@@ -844,30 +866,40 @@ static const struct iio_info meson_sar_adc_iio_info = {
static const struct meson_sar_adc_data meson_sar_adc_meson8_data = { static const struct meson_sar_adc_data meson_sar_adc_meson8_data = {
.has_bl30_integration = false, .has_bl30_integration = false,
.bandgap_reg = MESON_SAR_ADC_DELTA_10,
.regmap_config = &meson_sar_adc_regmap_config_meson8,
.resolution = 10, .resolution = 10,
.name = "meson-meson8-saradc", .name = "meson-meson8-saradc",
}; };
static const struct meson_sar_adc_data meson_sar_adc_meson8b_data = { static const struct meson_sar_adc_data meson_sar_adc_meson8b_data = {
.has_bl30_integration = false, .has_bl30_integration = false,
.bandgap_reg = MESON_SAR_ADC_DELTA_10,
.regmap_config = &meson_sar_adc_regmap_config_meson8,
.resolution = 10, .resolution = 10,
.name = "meson-meson8b-saradc", .name = "meson-meson8b-saradc",
}; };
static const struct meson_sar_adc_data meson_sar_adc_gxbb_data = { static const struct meson_sar_adc_data meson_sar_adc_gxbb_data = {
.has_bl30_integration = true, .has_bl30_integration = true,
.bandgap_reg = MESON_SAR_ADC_REG11,
.regmap_config = &meson_sar_adc_regmap_config_gxbb,
.resolution = 10, .resolution = 10,
.name = "meson-gxbb-saradc", .name = "meson-gxbb-saradc",
}; };
static const struct meson_sar_adc_data meson_sar_adc_gxl_data = { static const struct meson_sar_adc_data meson_sar_adc_gxl_data = {
.has_bl30_integration = true, .has_bl30_integration = true,
.bandgap_reg = MESON_SAR_ADC_REG11,
.regmap_config = &meson_sar_adc_regmap_config_gxbb,
.resolution = 12, .resolution = 12,
.name = "meson-gxl-saradc", .name = "meson-gxl-saradc",
}; };
static const struct meson_sar_adc_data meson_sar_adc_gxm_data = { static const struct meson_sar_adc_data meson_sar_adc_gxm_data = {
.has_bl30_integration = true, .has_bl30_integration = true,
.bandgap_reg = MESON_SAR_ADC_REG11,
.regmap_config = &meson_sar_adc_regmap_config_gxbb,
.resolution = 12, .resolution = 12,
.name = "meson-gxm-saradc", .name = "meson-gxm-saradc",
}; };
...@@ -945,7 +977,7 @@ static int meson_sar_adc_probe(struct platform_device *pdev) ...@@ -945,7 +977,7 @@ static int meson_sar_adc_probe(struct platform_device *pdev)
return ret; return ret;
priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, priv->regmap = devm_regmap_init_mmio(&pdev->dev, base,
&meson_sar_adc_regmap_config); priv->data->regmap_config);
if (IS_ERR(priv->regmap)) if (IS_ERR(priv->regmap))
return PTR_ERR(priv->regmap); return PTR_ERR(priv->regmap);
......
...@@ -371,7 +371,7 @@ static int max30102_read_raw(struct iio_dev *indio_dev, ...@@ -371,7 +371,7 @@ static int max30102_read_raw(struct iio_dev *indio_dev,
mutex_unlock(&indio_dev->mlock); mutex_unlock(&indio_dev->mlock);
break; break;
case IIO_CHAN_INFO_SCALE: case IIO_CHAN_INFO_SCALE:
*val = 1; /* 0.0625 */ *val = 1000; /* 62.5 */
*val2 = 16; *val2 = 16;
ret = IIO_VAL_FRACTIONAL; ret = IIO_VAL_FRACTIONAL;
break; break;
......
...@@ -631,7 +631,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type, ...@@ -631,7 +631,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
* iio_format_value() - Formats a IIO value into its string representation * iio_format_value() - Formats a IIO value into its string representation
* @buf: The buffer to which the formatted value gets written * @buf: The buffer to which the formatted value gets written
* which is assumed to be big enough (i.e. PAGE_SIZE). * which is assumed to be big enough (i.e. PAGE_SIZE).
* @type: One of the IIO_VAL_... constants. This decides how the val * @type: One of the IIO_VAL_* constants. This decides how the val
* and val2 parameters are formatted. * and val2 parameters are formatted.
* @size: Number of IIO value entries contained in vals * @size: Number of IIO value entries contained in vals
* @vals: Pointer to the values, exact meaning depends on the * @vals: Pointer to the values, exact meaning depends on the
...@@ -639,7 +639,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type, ...@@ -639,7 +639,7 @@ static ssize_t __iio_format_value(char *buf, size_t len, unsigned int type,
* *
* Return: 0 by default, a negative number on failure or the * Return: 0 by default, a negative number on failure or the
* total number of characters written for a type that belongs * total number of characters written for a type that belongs
* to the IIO_VAL_... constant. * to the IIO_VAL_* constant.
*/ */
ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals)
{ {
......
...@@ -869,6 +869,7 @@ static int sx9500_init_device(struct iio_dev *indio_dev) ...@@ -869,6 +869,7 @@ static int sx9500_init_device(struct iio_dev *indio_dev)
static void sx9500_gpio_probe(struct i2c_client *client, static void sx9500_gpio_probe(struct i2c_client *client,
struct sx9500_data *data) struct sx9500_data *data)
{ {
struct gpio_desc *gpiod_int;
struct device *dev; struct device *dev;
if (!client) if (!client)
...@@ -876,6 +877,14 @@ static void sx9500_gpio_probe(struct i2c_client *client, ...@@ -876,6 +877,14 @@ static void sx9500_gpio_probe(struct i2c_client *client,
dev = &client->dev; dev = &client->dev;
if (client->irq <= 0) {
gpiod_int = devm_gpiod_get(dev, SX9500_GPIO_INT, GPIOD_IN);
if (IS_ERR(gpiod_int))
dev_err(dev, "gpio get irq failed\n");
else
client->irq = gpiod_to_irq(gpiod_int);
}
data->gpiod_rst = devm_gpiod_get(dev, SX9500_GPIO_RESET, GPIOD_OUT_HIGH); data->gpiod_rst = devm_gpiod_get(dev, SX9500_GPIO_RESET, GPIOD_OUT_HIGH);
if (IS_ERR(data->gpiod_rst)) { if (IS_ERR(data->gpiod_rst)) {
dev_warn(dev, "gpio get reset pin failed\n"); dev_warn(dev, "gpio get reset pin failed\n");
......
...@@ -16,11 +16,14 @@ ...@@ -16,11 +16,14 @@
#define LPTIM2_OUT "lptim2_out" #define LPTIM2_OUT "lptim2_out"
#define LPTIM3_OUT "lptim3_out" #define LPTIM3_OUT "lptim3_out"
#if IS_ENABLED(CONFIG_IIO_STM32_LPTIMER_TRIGGER) #if IS_REACHABLE(CONFIG_IIO_STM32_LPTIMER_TRIGGER)
bool is_stm32_lptim_trigger(struct iio_trigger *trig); bool is_stm32_lptim_trigger(struct iio_trigger *trig);
#else #else
static inline bool is_stm32_lptim_trigger(struct iio_trigger *trig) static inline bool is_stm32_lptim_trigger(struct iio_trigger *trig)
{ {
#if IS_ENABLED(CONFIG_IIO_STM32_LPTIMER_TRIGGER)
pr_warn_once("stm32 lptim_trigger not linked in\n");
#endif
return false; return false;
} }
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册