Char/misc driver fixes for 5.16-rc5

Here are a bunch of small char/misc and other driver subsystem fixes for
 5.16-rc5
 
 Included in here are:
 	- iio driver fixes for reported problems.
 	- phy driver fixes for a number of reported problems.
 	- mhi resume bugfix for broken hardware
 	- nvmem driver fix
 	- rtsx driver fix for irq issues
 	- fastrpc packet parsing fix
 
 All of these have been in linux-next for a while with no reported
 issues.
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 
 iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYbYCqA8cZ3JlZ0Brcm9h
 aC5jb20ACgkQMUfUDdst+ylTYQCgyo5jrV1yye8z1rDbkedjwQgDoVQAn3Qp5/l8
 VWH18k8sQwfEuuMVxHRe
 =Ky7t
 -----END PGP SIGNATURE-----

Merge tag 'char-misc-5.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
 "Here are a bunch of small char/misc and other driver subsystem fixes.

  Included in here are:

   - iio driver fixes for reported problems

   - phy driver fixes for a number of reported problems

   - mhi resume bugfix for broken hardware

   - nvmem driver fix

   - rtsx driver fix for irq issues

   - fastrpc packet parsing fix

  All of these have been in linux-next for a while with no reported
  issues"

* tag 'char-misc-5.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (33 commits)
  bus: mhi: core: Add support for forced PM resume
  iio: trigger: stm32-timer: fix MODULE_ALIAS
  misc: rtsx: Avoid mangling IRQ during runtime PM
  nvmem: eeprom: at25: fix FRAM byte_len
  misc: fastrpc: fix improper packet size calculation
  MAINTAINERS: add maintainer for Qualcomm FastRPC driver
  bus: mhi: pci_generic: Fix device recovery failed issue
  iio: adc: stm32: fix null pointer on defer_probe error
  phy: HiSilicon: Fix copy and paste bug in error handling
  dt-bindings: phy: zynqmp-psgtr: fix USB phy name
  phy: ti: omap-usb2: Fix the kernel-doc style
  phy: qualcomm: ipq806x-usb: Fix kernel-doc style
  iio: at91-sama5d2: Fix incorrect sign extension
  iio: adc: axp20x_adc: fix charging current reporting on AXP22x
  iio: gyro: adxrs290: fix data signedness
  phy: ti: tusb1210: Fix the kernel-doc warn
  phy: qualcomm: usb-hsic: Fix the kernel-doc warn
  phy: qualcomm: qmp: Add missing struct documentation
  phy: mvebu-cp110-utmi: Fix kernel-doc warns
  iio: ad7768-1: Call iio_trigger_notify_done() on error
  ...
This commit is contained in:
Linus Torvalds 2021-12-12 10:16:34 -08:00
commit 8d7ed10410
34 changed files with 136 additions and 102 deletions

View File

@ -29,7 +29,7 @@ properties:
- PHY_TYPE_PCIE - PHY_TYPE_PCIE
- PHY_TYPE_SATA - PHY_TYPE_SATA
- PHY_TYPE_SGMII - PHY_TYPE_SGMII
- PHY_TYPE_USB - PHY_TYPE_USB3
- description: The PHY instance - description: The PHY instance
minimum: 0 minimum: 0
maximum: 1 # for DP, SATA or USB maximum: 1 # for DP, SATA or USB

View File

@ -15770,6 +15770,15 @@ S: Maintained
F: Documentation/devicetree/bindings/net/qcom,ethqos.txt F: Documentation/devicetree/bindings/net/qcom,ethqos.txt
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
QUALCOMM FASTRPC DRIVER
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
M: Amol Maheshwari <amahesh@qti.qualcomm.com>
L: linux-arm-msm@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
F: drivers/misc/fastrpc.c
F: include/uapi/misc/fastrpc.h
QUALCOMM GENERIC INTERFACE I2C DRIVER QUALCOMM GENERIC INTERFACE I2C DRIVER
M: Akash Asthana <akashast@codeaurora.org> M: Akash Asthana <akashast@codeaurora.org>
M: Mukesh Savaliya <msavaliy@codeaurora.org> M: Mukesh Savaliya <msavaliy@codeaurora.org>

View File

@ -881,7 +881,7 @@ int mhi_pm_suspend(struct mhi_controller *mhi_cntrl)
} }
EXPORT_SYMBOL_GPL(mhi_pm_suspend); EXPORT_SYMBOL_GPL(mhi_pm_suspend);
int mhi_pm_resume(struct mhi_controller *mhi_cntrl) static int __mhi_pm_resume(struct mhi_controller *mhi_cntrl, bool force)
{ {
struct mhi_chan *itr, *tmp; struct mhi_chan *itr, *tmp;
struct device *dev = &mhi_cntrl->mhi_dev->dev; struct device *dev = &mhi_cntrl->mhi_dev->dev;
@ -898,8 +898,12 @@ int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))
return -EIO; return -EIO;
if (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M3) if (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M3) {
return -EINVAL; dev_warn(dev, "Resuming from non M3 state (%s)\n",
TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)));
if (!force)
return -EINVAL;
}
/* Notify clients about exiting LPM */ /* Notify clients about exiting LPM */
list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) { list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {
@ -940,8 +944,19 @@ int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
return 0; return 0;
} }
int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
{
return __mhi_pm_resume(mhi_cntrl, false);
}
EXPORT_SYMBOL_GPL(mhi_pm_resume); EXPORT_SYMBOL_GPL(mhi_pm_resume);
int mhi_pm_resume_force(struct mhi_controller *mhi_cntrl)
{
return __mhi_pm_resume(mhi_cntrl, true);
}
EXPORT_SYMBOL_GPL(mhi_pm_resume_force);
int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl) int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)
{ {
int ret; int ret;

View File

@ -20,7 +20,7 @@
#define MHI_PCI_DEFAULT_BAR_NUM 0 #define MHI_PCI_DEFAULT_BAR_NUM 0
#define MHI_POST_RESET_DELAY_MS 500 #define MHI_POST_RESET_DELAY_MS 2000
#define HEALTH_CHECK_PERIOD (HZ * 2) #define HEALTH_CHECK_PERIOD (HZ * 2)

View File

@ -1595,8 +1595,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
return 0; return 0;
err_buffer_cleanup: err_buffer_cleanup:
if (data->dready_trig) iio_triggered_buffer_cleanup(indio_dev);
iio_triggered_buffer_cleanup(indio_dev);
err_trigger_unregister: err_trigger_unregister:
if (data->dready_trig) if (data->dready_trig)
iio_trigger_unregister(data->dready_trig); iio_trigger_unregister(data->dready_trig);
@ -1618,8 +1617,8 @@ static int kxcjk1013_remove(struct i2c_client *client)
pm_runtime_disable(&client->dev); pm_runtime_disable(&client->dev);
pm_runtime_set_suspended(&client->dev); pm_runtime_set_suspended(&client->dev);
iio_triggered_buffer_cleanup(indio_dev);
if (data->dready_trig) { if (data->dready_trig) {
iio_triggered_buffer_cleanup(indio_dev);
iio_trigger_unregister(data->dready_trig); iio_trigger_unregister(data->dready_trig);
iio_trigger_unregister(data->motion_trig); iio_trigger_unregister(data->motion_trig);
} }

View File

@ -224,14 +224,14 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
hw_values.chan, hw_values.chan,
sizeof(hw_values.chan)); sizeof(hw_values.chan));
if (ret) { if (ret) {
dev_err(st->dev, dev_err(st->dev, "error reading data: %d\n", ret);
"error reading data\n"); goto out;
return ret;
} }
iio_push_to_buffers_with_timestamp(indio_dev, iio_push_to_buffers_with_timestamp(indio_dev,
&hw_values, &hw_values,
iio_get_time_ns(indio_dev)); iio_get_time_ns(indio_dev));
out:
iio_trigger_notify_done(indio_dev->trig); iio_trigger_notify_done(indio_dev->trig);
return IRQ_HANDLED; return IRQ_HANDLED;

View File

@ -1470,7 +1470,7 @@ static int mma8452_trigger_setup(struct iio_dev *indio_dev)
if (ret) if (ret)
return ret; return ret;
indio_dev->trig = trig; indio_dev->trig = iio_trigger_get(trig);
return 0; return 0;
} }

View File

@ -532,7 +532,7 @@ config IMX7D_ADC
config IMX8QXP_ADC config IMX8QXP_ADC
tristate "NXP IMX8QXP ADC driver" tristate "NXP IMX8QXP ADC driver"
depends on ARCH_MXC_ARM64 || COMPILE_TEST depends on ARCH_MXC || COMPILE_TEST
depends on HAS_IOMEM depends on HAS_IOMEM
help help
Say yes here to build support for IMX8QXP ADC. Say yes here to build support for IMX8QXP ADC.

View File

@ -480,8 +480,8 @@ static irqreturn_t ad7768_trigger_handler(int irq, void *p)
iio_push_to_buffers_with_timestamp(indio_dev, &st->data.scan, iio_push_to_buffers_with_timestamp(indio_dev, &st->data.scan,
iio_get_time_ns(indio_dev)); iio_get_time_ns(indio_dev));
iio_trigger_notify_done(indio_dev->trig);
err_unlock: err_unlock:
iio_trigger_notify_done(indio_dev->trig);
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
return IRQ_HANDLED; return IRQ_HANDLED;

View File

@ -1586,7 +1586,8 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev,
*val = st->conversion_value; *val = st->conversion_value;
ret = at91_adc_adjust_val_osr(st, val); ret = at91_adc_adjust_val_osr(st, val);
if (chan->scan_type.sign == 's') if (chan->scan_type.sign == 's')
*val = sign_extend32(*val, 11); *val = sign_extend32(*val,
chan->scan_type.realbits - 1);
st->conversion_done = false; st->conversion_done = false;
} }

View File

@ -251,19 +251,8 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan, int *val) struct iio_chan_spec const *chan, int *val)
{ {
struct axp20x_adc_iio *info = iio_priv(indio_dev); struct axp20x_adc_iio *info = iio_priv(indio_dev);
int size;
/* *val = axp20x_read_variable_width(info->regmap, chan->address, 12);
* N.B.: Unlike the Chinese datasheets tell, the charging current is
* stored on 12 bits, not 13 bits. Only discharging current is on 13
* bits.
*/
if (chan->type == IIO_CURRENT && chan->channel == AXP22X_BATT_DISCHRG_I)
size = 13;
else
size = 12;
*val = axp20x_read_variable_width(info->regmap, chan->address, size);
if (*val < 0) if (*val < 0)
return *val; return *val;
@ -386,9 +375,8 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,
return IIO_VAL_INT_PLUS_MICRO; return IIO_VAL_INT_PLUS_MICRO;
case IIO_CURRENT: case IIO_CURRENT:
*val = 0; *val = 1;
*val2 = 500000; return IIO_VAL_INT;
return IIO_VAL_INT_PLUS_MICRO;
case IIO_TEMP: case IIO_TEMP:
*val = 100; *val = 100;

View File

@ -248,7 +248,6 @@ static int dln2_adc_set_chan_period(struct dln2_adc *dln2,
static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel) static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
{ {
int ret, i; int ret, i;
struct iio_dev *indio_dev = platform_get_drvdata(dln2->pdev);
u16 conflict; u16 conflict;
__le16 value; __le16 value;
int olen = sizeof(value); int olen = sizeof(value);
@ -257,13 +256,9 @@ static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)
.chan = channel, .chan = channel,
}; };
ret = iio_device_claim_direct_mode(indio_dev);
if (ret < 0)
return ret;
ret = dln2_adc_set_chan_enabled(dln2, channel, true); ret = dln2_adc_set_chan_enabled(dln2, channel, true);
if (ret < 0) if (ret < 0)
goto release_direct; return ret;
ret = dln2_adc_set_port_enabled(dln2, true, &conflict); ret = dln2_adc_set_port_enabled(dln2, true, &conflict);
if (ret < 0) { if (ret < 0) {
@ -300,8 +295,6 @@ disable_port:
dln2_adc_set_port_enabled(dln2, false, NULL); dln2_adc_set_port_enabled(dln2, false, NULL);
disable_chan: disable_chan:
dln2_adc_set_chan_enabled(dln2, channel, false); dln2_adc_set_chan_enabled(dln2, channel, false);
release_direct:
iio_device_release_direct_mode(indio_dev);
return ret; return ret;
} }
@ -337,10 +330,16 @@ static int dln2_adc_read_raw(struct iio_dev *indio_dev,
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
ret = iio_device_claim_direct_mode(indio_dev);
if (ret < 0)
return ret;
mutex_lock(&dln2->mutex); mutex_lock(&dln2->mutex);
ret = dln2_adc_read(dln2, chan->channel); ret = dln2_adc_read(dln2, chan->channel);
mutex_unlock(&dln2->mutex); mutex_unlock(&dln2->mutex);
iio_device_release_direct_mode(indio_dev);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -656,7 +655,11 @@ static int dln2_adc_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
iio_trigger_set_drvdata(dln2->trig, dln2); iio_trigger_set_drvdata(dln2->trig, dln2);
devm_iio_trigger_register(dev, dln2->trig); ret = devm_iio_trigger_register(dev, dln2->trig);
if (ret) {
dev_err(dev, "failed to register trigger: %d\n", ret);
return ret;
}
iio_trigger_set_immutable(indio_dev, dln2->trig); iio_trigger_set_immutable(indio_dev, dln2->trig);
ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,

View File

@ -1117,6 +1117,7 @@ static void stm32h7_adc_unprepare(struct iio_dev *indio_dev)
{ {
struct stm32_adc *adc = iio_priv(indio_dev); struct stm32_adc *adc = iio_priv(indio_dev);
stm32_adc_writel(adc, STM32H7_ADC_PCSEL, 0);
stm32h7_adc_disable(indio_dev); stm32h7_adc_disable(indio_dev);
stm32_adc_int_ch_disable(adc); stm32_adc_int_ch_disable(adc);
stm32h7_adc_enter_pwr_down(adc); stm32h7_adc_enter_pwr_down(adc);
@ -1986,7 +1987,7 @@ static int stm32_adc_populate_int_ch(struct iio_dev *indio_dev, const char *ch_n
/* Get calibration data for vrefint channel */ /* Get calibration data for vrefint channel */
ret = nvmem_cell_read_u16(&indio_dev->dev, "vrefint", &vrefint); ret = nvmem_cell_read_u16(&indio_dev->dev, "vrefint", &vrefint);
if (ret && ret != -ENOENT) { if (ret && ret != -ENOENT) {
return dev_err_probe(&indio_dev->dev, ret, return dev_err_probe(indio_dev->dev.parent, ret,
"nvmem access error\n"); "nvmem access error\n");
} }
if (ret == -ENOENT) if (ret == -ENOENT)

View File

@ -7,6 +7,7 @@
*/ */
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -124,7 +125,7 @@ static int adxrs290_get_rate_data(struct iio_dev *indio_dev, const u8 cmd, int *
goto err_unlock; goto err_unlock;
} }
*val = temp; *val = sign_extend32(temp, 15);
err_unlock: err_unlock:
mutex_unlock(&st->lock); mutex_unlock(&st->lock);
@ -146,7 +147,7 @@ static int adxrs290_get_temp_data(struct iio_dev *indio_dev, int *val)
} }
/* extract lower 12 bits temperature reading */ /* extract lower 12 bits temperature reading */
*val = temp & 0x0FFF; *val = sign_extend32(temp, 11);
err_unlock: err_unlock:
mutex_unlock(&st->lock); mutex_unlock(&st->lock);

View File

@ -61,9 +61,9 @@ static irqreturn_t itg3200_trigger_handler(int irq, void *p)
iio_push_to_buffers_with_timestamp(indio_dev, &scan, pf->timestamp); iio_push_to_buffers_with_timestamp(indio_dev, &scan, pf->timestamp);
error_ret:
iio_trigger_notify_done(indio_dev->trig); iio_trigger_notify_done(indio_dev->trig);
error_ret:
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -556,7 +556,6 @@ struct iio_trigger *viio_trigger_alloc(struct device *parent,
irq_modify_status(trig->subirq_base + i, irq_modify_status(trig->subirq_base + i,
IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE); IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE);
} }
get_device(&trig->dev);
return trig; return trig;

View File

@ -1275,7 +1275,7 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1, ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1,
als_buf, sizeof(als_buf)); als_buf, sizeof(als_buf));
if (ret < 0) if (ret < 0)
return ret; goto done;
if (test_bit(0, indio_dev->active_scan_mask)) if (test_bit(0, indio_dev->active_scan_mask))
scan.channels[j++] = le16_to_cpu(als_buf[1]); scan.channels[j++] = le16_to_cpu(als_buf[1]);
if (test_bit(1, indio_dev->active_scan_mask)) if (test_bit(1, indio_dev->active_scan_mask))

View File

@ -546,9 +546,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private)
mutex_lock(&data->lock); mutex_lock(&data->lock);
ret = regmap_field_read(data->reg_flag_nf, &dir); ret = regmap_field_read(data->reg_flag_nf, &dir);
if (ret < 0) { if (ret < 0) {
dev_err(&data->client->dev, "register read failed\n"); dev_err(&data->client->dev, "register read failed: %d\n", ret);
mutex_unlock(&data->lock); goto out;
return ret;
} }
event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1,
IIO_EV_TYPE_THRESH, IIO_EV_TYPE_THRESH,
@ -560,6 +559,7 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private)
ret = regmap_field_write(data->reg_flag_psint, 0); ret = regmap_field_write(data->reg_flag_psint, 0);
if (ret < 0) if (ret < 0)
dev_err(&data->client->dev, "failed to reset interrupts\n"); dev_err(&data->client->dev, "failed to reset interrupts\n");
out:
mutex_unlock(&data->lock); mutex_unlock(&data->lock);
return IRQ_HANDLED; return IRQ_HANDLED;

View File

@ -912,6 +912,6 @@ static struct platform_driver stm32_timer_trigger_driver = {
}; };
module_platform_driver(stm32_timer_trigger_driver); module_platform_driver(stm32_timer_trigger_driver);
MODULE_ALIAS("platform: stm32-timer-trigger"); MODULE_ALIAS("platform:stm32-timer-trigger");
MODULE_DESCRIPTION("STMicroelectronics STM32 Timer Trigger driver"); MODULE_DESCRIPTION("STMicroelectronics STM32 Timer Trigger driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -1803,8 +1803,6 @@ static int rtsx_pci_runtime_suspend(struct device *device)
mutex_lock(&pcr->pcr_mutex); mutex_lock(&pcr->pcr_mutex);
rtsx_pci_power_off(pcr, HOST_ENTER_S3); rtsx_pci_power_off(pcr, HOST_ENTER_S3);
free_irq(pcr->irq, (void *)pcr);
mutex_unlock(&pcr->pcr_mutex); mutex_unlock(&pcr->pcr_mutex);
pcr->is_runtime_suspended = true; pcr->is_runtime_suspended = true;
@ -1825,8 +1823,6 @@ static int rtsx_pci_runtime_resume(struct device *device)
mutex_lock(&pcr->pcr_mutex); mutex_lock(&pcr->pcr_mutex);
rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00); rtsx_pci_write_register(pcr, HOST_SLEEP_STATE, 0x03, 0x00);
rtsx_pci_acquire_irq(pcr);
synchronize_irq(pcr->irq);
if (pcr->ops->fetch_vendor_settings) if (pcr->ops->fetch_vendor_settings)
pcr->ops->fetch_vendor_settings(pcr); pcr->ops->fetch_vendor_settings(pcr);

View File

@ -376,7 +376,6 @@ MODULE_DEVICE_TABLE(spi, at25_spi_ids);
static int at25_probe(struct spi_device *spi) static int at25_probe(struct spi_device *spi)
{ {
struct at25_data *at25 = NULL; struct at25_data *at25 = NULL;
struct spi_eeprom chip;
int err; int err;
int sr; int sr;
u8 id[FM25_ID_LEN]; u8 id[FM25_ID_LEN];
@ -389,15 +388,18 @@ static int at25_probe(struct spi_device *spi)
if (match && !strcmp(match->compatible, "cypress,fm25")) if (match && !strcmp(match->compatible, "cypress,fm25"))
is_fram = 1; is_fram = 1;
at25 = devm_kzalloc(&spi->dev, sizeof(struct at25_data), GFP_KERNEL);
if (!at25)
return -ENOMEM;
/* Chip description */ /* Chip description */
if (!spi->dev.platform_data) { if (spi->dev.platform_data) {
if (!is_fram) { memcpy(&at25->chip, spi->dev.platform_data, sizeof(at25->chip));
err = at25_fw_to_chip(&spi->dev, &chip); } else if (!is_fram) {
if (err) err = at25_fw_to_chip(&spi->dev, &at25->chip);
return err; if (err)
} return err;
} else }
chip = *(struct spi_eeprom *)spi->dev.platform_data;
/* Ping the chip ... the status register is pretty portable, /* Ping the chip ... the status register is pretty portable,
* unlike probing manufacturer IDs. We do expect that system * unlike probing manufacturer IDs. We do expect that system
@ -409,12 +411,7 @@ static int at25_probe(struct spi_device *spi)
return -ENXIO; return -ENXIO;
} }
at25 = devm_kzalloc(&spi->dev, sizeof(struct at25_data), GFP_KERNEL);
if (!at25)
return -ENOMEM;
mutex_init(&at25->lock); mutex_init(&at25->lock);
at25->chip = chip;
at25->spi = spi; at25->spi = spi;
spi_set_drvdata(spi, at25); spi_set_drvdata(spi, at25);
@ -431,7 +428,7 @@ static int at25_probe(struct spi_device *spi)
dev_err(&spi->dev, "Error: unsupported size (id %02x)\n", id[7]); dev_err(&spi->dev, "Error: unsupported size (id %02x)\n", id[7]);
return -ENODEV; return -ENODEV;
} }
chip.byte_len = int_pow(2, id[7] - 0x21 + 4) * 1024; at25->chip.byte_len = int_pow(2, id[7] - 0x21 + 4) * 1024;
if (at25->chip.byte_len > 64 * 1024) if (at25->chip.byte_len > 64 * 1024)
at25->chip.flags |= EE_ADDR3; at25->chip.flags |= EE_ADDR3;
@ -464,7 +461,7 @@ static int at25_probe(struct spi_device *spi)
at25->nvmem_config.type = is_fram ? NVMEM_TYPE_FRAM : NVMEM_TYPE_EEPROM; at25->nvmem_config.type = is_fram ? NVMEM_TYPE_FRAM : NVMEM_TYPE_EEPROM;
at25->nvmem_config.name = dev_name(&spi->dev); at25->nvmem_config.name = dev_name(&spi->dev);
at25->nvmem_config.dev = &spi->dev; at25->nvmem_config.dev = &spi->dev;
at25->nvmem_config.read_only = chip.flags & EE_READONLY; at25->nvmem_config.read_only = at25->chip.flags & EE_READONLY;
at25->nvmem_config.root_only = true; at25->nvmem_config.root_only = true;
at25->nvmem_config.owner = THIS_MODULE; at25->nvmem_config.owner = THIS_MODULE;
at25->nvmem_config.compat = true; at25->nvmem_config.compat = true;
@ -474,17 +471,18 @@ static int at25_probe(struct spi_device *spi)
at25->nvmem_config.priv = at25; at25->nvmem_config.priv = at25;
at25->nvmem_config.stride = 1; at25->nvmem_config.stride = 1;
at25->nvmem_config.word_size = 1; at25->nvmem_config.word_size = 1;
at25->nvmem_config.size = chip.byte_len; at25->nvmem_config.size = at25->chip.byte_len;
at25->nvmem = devm_nvmem_register(&spi->dev, &at25->nvmem_config); at25->nvmem = devm_nvmem_register(&spi->dev, &at25->nvmem_config);
if (IS_ERR(at25->nvmem)) if (IS_ERR(at25->nvmem))
return PTR_ERR(at25->nvmem); return PTR_ERR(at25->nvmem);
dev_info(&spi->dev, "%d %s %s %s%s, pagesize %u\n", dev_info(&spi->dev, "%d %s %s %s%s, pagesize %u\n",
(chip.byte_len < 1024) ? chip.byte_len : (chip.byte_len / 1024), (at25->chip.byte_len < 1024) ?
(chip.byte_len < 1024) ? "Byte" : "KByte", at25->chip.byte_len : (at25->chip.byte_len / 1024),
(at25->chip.byte_len < 1024) ? "Byte" : "KByte",
at25->chip.name, is_fram ? "fram" : "eeprom", at25->chip.name, is_fram ? "fram" : "eeprom",
(chip.flags & EE_READONLY) ? " (readonly)" : "", (at25->chip.flags & EE_READONLY) ? " (readonly)" : "",
at25->chip.page_size); at25->chip.page_size);
return 0; return 0;
} }

View File

@ -719,16 +719,18 @@ static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx)
static u64 fastrpc_get_payload_size(struct fastrpc_invoke_ctx *ctx, int metalen) static u64 fastrpc_get_payload_size(struct fastrpc_invoke_ctx *ctx, int metalen)
{ {
u64 size = 0; u64 size = 0;
int i; int oix;
size = ALIGN(metalen, FASTRPC_ALIGN); size = ALIGN(metalen, FASTRPC_ALIGN);
for (i = 0; i < ctx->nscalars; i++) { for (oix = 0; oix < ctx->nbufs; oix++) {
int i = ctx->olaps[oix].raix;
if (ctx->args[i].fd == 0 || ctx->args[i].fd == -1) { if (ctx->args[i].fd == 0 || ctx->args[i].fd == -1) {
if (ctx->olaps[i].offset == 0) if (ctx->olaps[oix].offset == 0)
size = ALIGN(size, FASTRPC_ALIGN); size = ALIGN(size, FASTRPC_ALIGN);
size += (ctx->olaps[i].mend - ctx->olaps[i].mstart); size += (ctx->olaps[oix].mend - ctx->olaps[oix].mstart);
} }
} }

View File

@ -533,7 +533,11 @@ static int ath11k_mhi_set_state(struct ath11k_pci *ab_pci,
ret = mhi_pm_suspend(ab_pci->mhi_ctrl); ret = mhi_pm_suspend(ab_pci->mhi_ctrl);
break; break;
case ATH11K_MHI_RESUME: case ATH11K_MHI_RESUME:
ret = mhi_pm_resume(ab_pci->mhi_ctrl); /* Do force MHI resume as some devices like QCA6390, WCN6855
* are not in M3 state but they are functional. So just ignore
* the MHI state while resuming.
*/
ret = mhi_pm_resume_force(ab_pci->mhi_ctrl);
break; break;
case ATH11K_MHI_TRIGGER_RDDM: case ATH11K_MHI_TRIGGER_RDDM:
ret = mhi_force_rddm_mode(ab_pci->mhi_ctrl); ret = mhi_force_rddm_mode(ab_pci->mhi_ctrl);

View File

@ -757,8 +757,8 @@ static int hi3670_pcie_phy_get_resources(struct hi3670_pcie_phy *phy,
return PTR_ERR(phy->sysctrl); return PTR_ERR(phy->sysctrl);
phy->pmctrl = syscon_regmap_lookup_by_compatible("hisilicon,hi3670-pmctrl"); phy->pmctrl = syscon_regmap_lookup_by_compatible("hisilicon,hi3670-pmctrl");
if (IS_ERR(phy->sysctrl)) if (IS_ERR(phy->pmctrl))
return PTR_ERR(phy->sysctrl); return PTR_ERR(phy->pmctrl);
/* clocks */ /* clocks */
phy->phy_ref_clk = devm_clk_get(dev, "phy_ref"); phy->phy_ref_clk = devm_clk_get(dev, "phy_ref");

View File

@ -82,9 +82,9 @@
* struct mvebu_cp110_utmi - PHY driver data * struct mvebu_cp110_utmi - PHY driver data
* *
* @regs: PHY registers * @regs: PHY registers
* @syscom: Regmap with system controller registers * @syscon: Regmap with system controller registers
* @dev: device driver handle * @dev: device driver handle
* @caps: PHY capabilities * @ops: phy ops
*/ */
struct mvebu_cp110_utmi { struct mvebu_cp110_utmi {
void __iomem *regs; void __iomem *regs;

View File

@ -127,12 +127,13 @@ struct phy_drvdata {
}; };
/** /**
* Write register and read back masked value to confirm it is written * usb_phy_write_readback() - Write register and read back masked value to
* confirm it is written
* *
* @base - QCOM DWC3 PHY base virtual address. * @phy_dwc3: QCOM DWC3 phy context
* @offset - register offset. * @offset: register offset.
* @mask - register bitmask specifying what should be updated * @mask: register bitmask specifying what should be updated
* @val - value to write. * @val: value to write.
*/ */
static inline void usb_phy_write_readback(struct usb_phy *phy_dwc3, static inline void usb_phy_write_readback(struct usb_phy *phy_dwc3,
u32 offset, u32 offset,
@ -171,11 +172,11 @@ static int wait_for_latch(void __iomem *addr)
} }
/** /**
* Write SSPHY register * usb_ss_write_phycreg() - Write SSPHY register
* *
* @base - QCOM DWC3 PHY base virtual address. * @phy_dwc3: QCOM DWC3 phy context
* @addr - SSPHY address to write. * @addr: SSPHY address to write.
* @val - value to write. * @val: value to write.
*/ */
static int usb_ss_write_phycreg(struct usb_phy *phy_dwc3, static int usb_ss_write_phycreg(struct usb_phy *phy_dwc3,
u32 addr, u32 val) u32 addr, u32 val)
@ -209,10 +210,11 @@ err_wait:
} }
/** /**
* Read SSPHY register. * usb_ss_read_phycreg() - Read SSPHY register.
* *
* @base - QCOM DWC3 PHY base virtual address. * @phy_dwc3: QCOM DWC3 phy context
* @addr - SSPHY address to read. * @addr: SSPHY address to read.
* @val: pointer in which read is store.
*/ */
static int usb_ss_read_phycreg(struct usb_phy *phy_dwc3, static int usb_ss_read_phycreg(struct usb_phy *phy_dwc3,
u32 addr, u32 *val) u32 addr, u32 *val)

View File

@ -2973,6 +2973,9 @@ struct qmp_phy_combo_cfg {
* @qmp: QMP phy to which this lane belongs * @qmp: QMP phy to which this lane belongs
* @lane_rst: lane's reset controller * @lane_rst: lane's reset controller
* @mode: current PHY mode * @mode: current PHY mode
* @dp_aux_cfg: Display port aux config
* @dp_opts: Display port optional config
* @dp_clks: Display port clocks
*/ */
struct qmp_phy { struct qmp_phy {
struct phy *phy; struct phy *phy;

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/** /*
* Copyright (C) 2016 Linaro Ltd * Copyright (C) 2016 Linaro Ltd
*/ */
#include <linux/module.h> #include <linux/module.h>

View File

@ -478,7 +478,7 @@ static void stm32_usbphyc_phy_tuning(struct stm32_usbphyc *usbphyc,
if (!of_property_read_bool(np, "st,no-lsfs-fb-cap")) if (!of_property_read_bool(np, "st,no-lsfs-fb-cap"))
usbphyc_phy->tune |= LFSCAPEN; usbphyc_phy->tune |= LFSCAPEN;
if (of_property_read_bool(np, "st,slow-hs-slew-rate")) if (of_property_read_bool(np, "st,decrease-hs-slew-rate"))
usbphyc_phy->tune |= HSDRVSLEW; usbphyc_phy->tune |= HSDRVSLEW;
ret = of_property_read_u32(np, "st,tune-hs-dc-level", &val); ret = of_property_read_u32(np, "st,tune-hs-dc-level", &val);

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/** /*
* PCIe SERDES driver for AM654x SoC * PCIe SERDES driver for AM654x SoC
* *
* Copyright (C) 2018 - 2019 Texas Instruments Incorporated - http://www.ti.com/ * Copyright (C) 2018 - 2019 Texas Instruments Incorporated - http://www.ti.com/

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/** /*
* Wrapper driver for SERDES used in J721E * Wrapper driver for SERDES used in J721E
* *
* Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/

View File

@ -89,9 +89,9 @@ static inline void omap_usb_writel(void __iomem *addr, unsigned int offset,
} }
/** /**
* omap_usb2_set_comparator - links the comparator present in the system with * omap_usb2_set_comparator() - links the comparator present in the system with this phy
* this phy *
* @comparator - the companion phy(comparator) for this phy * @comparator: the companion phy(comparator) for this phy
* *
* The phy companion driver should call this API passing the phy_companion * The phy companion driver should call this API passing the phy_companion
* filled with set_vbus and start_srp to be used by usb phy. * filled with set_vbus and start_srp to be used by usb phy.

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/** /*
* tusb1210.c - TUSB1210 USB ULPI PHY driver * tusb1210.c - TUSB1210 USB ULPI PHY driver
* *
* Copyright (C) 2015 Intel Corporation * Copyright (C) 2015 Intel Corporation

View File

@ -663,6 +663,19 @@ int mhi_pm_suspend(struct mhi_controller *mhi_cntrl);
*/ */
int mhi_pm_resume(struct mhi_controller *mhi_cntrl); int mhi_pm_resume(struct mhi_controller *mhi_cntrl);
/**
* mhi_pm_resume_force - Force resume MHI from suspended state
* @mhi_cntrl: MHI controller
*
* Resume the device irrespective of its MHI state. As per the MHI spec, devices
* has to be in M3 state during resume. But some devices seem to be in a
* different MHI state other than M3 but they continue working fine if allowed.
* This API is intented to be used for such devices.
*
* Return: 0 if the resume succeeds, a negative error code otherwise
*/
int mhi_pm_resume_force(struct mhi_controller *mhi_cntrl);
/** /**
* mhi_download_rddm_image - Download ramdump image from device for * mhi_download_rddm_image - Download ramdump image from device for
* debugging purpose. * debugging purpose.