Staging driver fixes for 3.13-rc5
Here are a number of staging, and iio, fixes for 3.13-rc5 that resolve some reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEABECAAYFAlKx3bAACgkQMUfUDdst+yn9HQCcC+rHeV3wybIo9DopYug0NwjK mxMAn349hfGJuCsdh8s34UeSbT3BgRqQ =cHKK -----END PGP SIGNATURE----- Merge tag 'staging-3.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging Pull staging driver fixes from Greg KH: "Here are a number of staging, and iio, fixes for 3.13-rc5 that resolve some reported issues" * tag 'staging-3.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: imx-drm: imx-drm-core: improve safety of imx_drm_add_crtc() imx-drm: imx-drm-core: make imx_drm_crtc_register() safer imx-drm: imx-drm-core: use defined constant for number of CRTCs. imx-drm: imx-tve: don't call sleeping functions beneath enable_lock spinlock imx-drm: ipu-v3: fix potential CRTC device registration race imx-drm: imx-drm-core: fix DRM cleanup paths imx-drm: imx-drm-core: fix error cleanup path for imx_drm_add_crtc() staging: comedi: drivers: fix return value of comedi_load_firmware() staging: comedi: 8255_pci: fix for newer PCI-DIO48H iio:adc:ad7887 Fix channel reported endianness from cpu to big endian iio:imu:adis16400 fix pressure channel scan type staging:iio:mag:hmc5843 fix incorrect endianness of channel as a result of missuse of the IIO_ST macro. iio: cm36651: Changed return value of read function
This commit is contained in:
Коммит
1aba038bbb
|
@ -200,7 +200,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = {
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||||
.address = 1,
|
.address = 1,
|
||||||
.scan_index = 1,
|
.scan_index = 1,
|
||||||
.scan_type = IIO_ST('u', 12, 16, 0),
|
.scan_type = {
|
||||||
|
.sign = 'u',
|
||||||
|
.realbits = 12,
|
||||||
|
.storagebits = 16,
|
||||||
|
.shift = 0,
|
||||||
|
.endianness = IIO_BE,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
.channel[1] = {
|
.channel[1] = {
|
||||||
.type = IIO_VOLTAGE,
|
.type = IIO_VOLTAGE,
|
||||||
|
@ -210,7 +216,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = {
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||||
.address = 0,
|
.address = 0,
|
||||||
.scan_index = 0,
|
.scan_index = 0,
|
||||||
.scan_type = IIO_ST('u', 12, 16, 0),
|
.scan_type = {
|
||||||
|
.sign = 'u',
|
||||||
|
.realbits = 12,
|
||||||
|
.storagebits = 16,
|
||||||
|
.shift = 0,
|
||||||
|
.endianness = IIO_BE,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
.channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2),
|
.channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2),
|
||||||
.int_vref_mv = 2500,
|
.int_vref_mv = 2500,
|
||||||
|
|
|
@ -651,7 +651,12 @@ static const struct iio_chan_spec adis16448_channels[] = {
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||||
.address = ADIS16448_BARO_OUT,
|
.address = ADIS16448_BARO_OUT,
|
||||||
.scan_index = ADIS16400_SCAN_BARO,
|
.scan_index = ADIS16400_SCAN_BARO,
|
||||||
.scan_type = IIO_ST('s', 16, 16, 0),
|
.scan_type = {
|
||||||
|
.sign = 's',
|
||||||
|
.realbits = 16,
|
||||||
|
.storagebits = 16,
|
||||||
|
.endianness = IIO_BE,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
|
ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
|
||||||
IIO_CHAN_SOFT_TIMESTAMP(11)
|
IIO_CHAN_SOFT_TIMESTAMP(11)
|
||||||
|
|
|
@ -387,7 +387,7 @@ static int cm36651_read_int_time(struct cm36651_data *cm36651,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return IIO_VAL_INT_PLUS_MICRO;
|
return IIO_VAL_INT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cm36651_write_int_time(struct cm36651_data *cm36651,
|
static int cm36651_write_int_time(struct cm36651_data *cm36651,
|
||||||
|
|
|
@ -446,7 +446,7 @@ int comedi_load_firmware(struct comedi_device *dev,
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(comedi_load_firmware);
|
EXPORT_SYMBOL_GPL(comedi_load_firmware);
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,8 @@ enum pci_8255_boardid {
|
||||||
BOARD_ADLINK_PCI7296,
|
BOARD_ADLINK_PCI7296,
|
||||||
BOARD_CB_PCIDIO24,
|
BOARD_CB_PCIDIO24,
|
||||||
BOARD_CB_PCIDIO24H,
|
BOARD_CB_PCIDIO24H,
|
||||||
BOARD_CB_PCIDIO48H,
|
BOARD_CB_PCIDIO48H_OLD,
|
||||||
|
BOARD_CB_PCIDIO48H_NEW,
|
||||||
BOARD_CB_PCIDIO96H,
|
BOARD_CB_PCIDIO96H,
|
||||||
BOARD_NI_PCIDIO96,
|
BOARD_NI_PCIDIO96,
|
||||||
BOARD_NI_PCIDIO96B,
|
BOARD_NI_PCIDIO96B,
|
||||||
|
@ -106,11 +107,16 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = {
|
||||||
.dio_badr = 2,
|
.dio_badr = 2,
|
||||||
.n_8255 = 1,
|
.n_8255 = 1,
|
||||||
},
|
},
|
||||||
[BOARD_CB_PCIDIO48H] = {
|
[BOARD_CB_PCIDIO48H_OLD] = {
|
||||||
.name = "cb_pci-dio48h",
|
.name = "cb_pci-dio48h",
|
||||||
.dio_badr = 1,
|
.dio_badr = 1,
|
||||||
.n_8255 = 2,
|
.n_8255 = 2,
|
||||||
},
|
},
|
||||||
|
[BOARD_CB_PCIDIO48H_NEW] = {
|
||||||
|
.name = "cb_pci-dio48h",
|
||||||
|
.dio_badr = 2,
|
||||||
|
.n_8255 = 2,
|
||||||
|
},
|
||||||
[BOARD_CB_PCIDIO96H] = {
|
[BOARD_CB_PCIDIO96H] = {
|
||||||
.name = "cb_pci-dio96h",
|
.name = "cb_pci-dio96h",
|
||||||
.dio_badr = 2,
|
.dio_badr = 2,
|
||||||
|
@ -263,7 +269,10 @@ static DEFINE_PCI_DEVICE_TABLE(pci_8255_pci_table) = {
|
||||||
{ PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 },
|
{ PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 },
|
||||||
{ PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 },
|
{ PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 },
|
||||||
{ PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H },
|
{ PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H },
|
||||||
{ PCI_VDEVICE(CB, 0x000b), BOARD_CB_PCIDIO48H },
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, 0x0000, 0x0000),
|
||||||
|
.driver_data = BOARD_CB_PCIDIO48H_OLD },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, PCI_VENDOR_ID_CB, 0x000b),
|
||||||
|
.driver_data = BOARD_CB_PCIDIO48H_NEW },
|
||||||
{ PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H },
|
{ PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H },
|
||||||
{ PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 },
|
{ PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 },
|
||||||
{ PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B },
|
{ PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B },
|
||||||
|
|
|
@ -451,7 +451,12 @@ done:
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
|
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
|
||||||
BIT(IIO_CHAN_INFO_SAMP_FREQ), \
|
BIT(IIO_CHAN_INFO_SAMP_FREQ), \
|
||||||
.scan_index = idx, \
|
.scan_index = idx, \
|
||||||
.scan_type = IIO_ST('s', 16, 16, IIO_BE), \
|
.scan_type = { \
|
||||||
|
.sign = 's', \
|
||||||
|
.realbits = 16, \
|
||||||
|
.storagebits = 16, \
|
||||||
|
.endianness = IIO_BE, \
|
||||||
|
}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct iio_chan_spec hmc5843_channels[] = {
|
static const struct iio_chan_spec hmc5843_channels[] = {
|
||||||
|
|
|
@ -88,8 +88,9 @@ static int imx_drm_driver_unload(struct drm_device *drm)
|
||||||
|
|
||||||
imx_drm_device_put();
|
imx_drm_device_put();
|
||||||
|
|
||||||
drm_mode_config_cleanup(imxdrm->drm);
|
drm_vblank_cleanup(imxdrm->drm);
|
||||||
drm_kms_helper_poll_fini(imxdrm->drm);
|
drm_kms_helper_poll_fini(imxdrm->drm);
|
||||||
|
drm_mode_config_cleanup(imxdrm->drm);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -199,8 +200,8 @@ static void imx_drm_driver_preclose(struct drm_device *drm,
|
||||||
if (!file->is_master)
|
if (!file->is_master)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < MAX_CRTC; i++)
|
||||||
imx_drm_disable_vblank(drm , i);
|
imx_drm_disable_vblank(drm, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations imx_drm_driver_fops = {
|
static const struct file_operations imx_drm_driver_fops = {
|
||||||
|
@ -376,8 +377,6 @@ static int imx_drm_crtc_register(struct imx_drm_crtc *imx_drm_crtc)
|
||||||
struct imx_drm_device *imxdrm = __imx_drm_device();
|
struct imx_drm_device *imxdrm = __imx_drm_device();
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
drm_crtc_init(imxdrm->drm, imx_drm_crtc->crtc,
|
|
||||||
imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
|
|
||||||
ret = drm_mode_crtc_set_gamma_size(imx_drm_crtc->crtc, 256);
|
ret = drm_mode_crtc_set_gamma_size(imx_drm_crtc->crtc, 256);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -385,6 +384,9 @@ static int imx_drm_crtc_register(struct imx_drm_crtc *imx_drm_crtc)
|
||||||
drm_crtc_helper_add(imx_drm_crtc->crtc,
|
drm_crtc_helper_add(imx_drm_crtc->crtc,
|
||||||
imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs);
|
imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs);
|
||||||
|
|
||||||
|
drm_crtc_init(imxdrm->drm, imx_drm_crtc->crtc,
|
||||||
|
imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs);
|
||||||
|
|
||||||
drm_mode_group_reinit(imxdrm->drm);
|
drm_mode_group_reinit(imxdrm->drm);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -428,11 +430,11 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
|
||||||
ret = drm_mode_group_init_legacy_group(imxdrm->drm,
|
ret = drm_mode_group_init_legacy_group(imxdrm->drm,
|
||||||
&imxdrm->drm->primary->mode_group);
|
&imxdrm->drm->primary->mode_group);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_init;
|
goto err_kms;
|
||||||
|
|
||||||
ret = drm_vblank_init(imxdrm->drm, MAX_CRTC);
|
ret = drm_vblank_init(imxdrm->drm, MAX_CRTC);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_init;
|
goto err_kms;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* with vblank_disable_allowed = true, vblank interrupt will be disabled
|
* with vblank_disable_allowed = true, vblank interrupt will be disabled
|
||||||
|
@ -441,12 +443,19 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
|
||||||
*/
|
*/
|
||||||
imxdrm->drm->vblank_disable_allowed = true;
|
imxdrm->drm->vblank_disable_allowed = true;
|
||||||
|
|
||||||
if (!imx_drm_device_get())
|
if (!imx_drm_device_get()) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto err_vblank;
|
||||||
|
}
|
||||||
|
|
||||||
ret = 0;
|
mutex_unlock(&imxdrm->mutex);
|
||||||
|
return 0;
|
||||||
|
|
||||||
err_init:
|
err_vblank:
|
||||||
|
drm_vblank_cleanup(drm);
|
||||||
|
err_kms:
|
||||||
|
drm_kms_helper_poll_fini(drm);
|
||||||
|
drm_mode_config_cleanup(drm);
|
||||||
mutex_unlock(&imxdrm->mutex);
|
mutex_unlock(&imxdrm->mutex);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -492,6 +501,15 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
|
||||||
|
|
||||||
mutex_lock(&imxdrm->mutex);
|
mutex_lock(&imxdrm->mutex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The vblank arrays are dimensioned by MAX_CRTC - we can't
|
||||||
|
* pass IDs greater than this to those functions.
|
||||||
|
*/
|
||||||
|
if (imxdrm->pipes >= MAX_CRTC) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto err_busy;
|
||||||
|
}
|
||||||
|
|
||||||
if (imxdrm->drm->open_count) {
|
if (imxdrm->drm->open_count) {
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
goto err_busy;
|
goto err_busy;
|
||||||
|
@ -528,6 +546,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_register:
|
err_register:
|
||||||
|
list_del(&imx_drm_crtc->list);
|
||||||
kfree(imx_drm_crtc);
|
kfree(imx_drm_crtc);
|
||||||
err_alloc:
|
err_alloc:
|
||||||
err_busy:
|
err_busy:
|
||||||
|
|
|
@ -114,7 +114,6 @@ struct imx_tve {
|
||||||
struct drm_encoder encoder;
|
struct drm_encoder encoder;
|
||||||
struct imx_drm_encoder *imx_drm_encoder;
|
struct imx_drm_encoder *imx_drm_encoder;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
spinlock_t enable_lock; /* serializes tve_enable/disable */
|
|
||||||
spinlock_t lock; /* register lock */
|
spinlock_t lock; /* register lock */
|
||||||
bool enabled;
|
bool enabled;
|
||||||
int mode;
|
int mode;
|
||||||
|
@ -146,10 +145,8 @@ __releases(&tve->lock)
|
||||||
|
|
||||||
static void tve_enable(struct imx_tve *tve)
|
static void tve_enable(struct imx_tve *tve)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock_irqsave(&tve->enable_lock, flags);
|
|
||||||
if (!tve->enabled) {
|
if (!tve->enabled) {
|
||||||
tve->enabled = true;
|
tve->enabled = true;
|
||||||
clk_prepare_enable(tve->clk);
|
clk_prepare_enable(tve->clk);
|
||||||
|
@ -169,23 +166,18 @@ static void tve_enable(struct imx_tve *tve)
|
||||||
TVE_CD_SM_IEN |
|
TVE_CD_SM_IEN |
|
||||||
TVE_CD_LM_IEN |
|
TVE_CD_LM_IEN |
|
||||||
TVE_CD_MON_END_IEN);
|
TVE_CD_MON_END_IEN);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&tve->enable_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tve_disable(struct imx_tve *tve)
|
static void tve_disable(struct imx_tve *tve)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock_irqsave(&tve->enable_lock, flags);
|
|
||||||
if (tve->enabled) {
|
if (tve->enabled) {
|
||||||
tve->enabled = false;
|
tve->enabled = false;
|
||||||
ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
|
ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG,
|
||||||
TVE_IPU_CLK_EN | TVE_EN, 0);
|
TVE_IPU_CLK_EN | TVE_EN, 0);
|
||||||
clk_disable_unprepare(tve->clk);
|
clk_disable_unprepare(tve->clk);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&tve->enable_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tve_setup_tvout(struct imx_tve *tve)
|
static int tve_setup_tvout(struct imx_tve *tve)
|
||||||
|
@ -601,7 +593,6 @@ static int imx_tve_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
tve->dev = &pdev->dev;
|
tve->dev = &pdev->dev;
|
||||||
spin_lock_init(&tve->lock);
|
spin_lock_init(&tve->lock);
|
||||||
spin_lock_init(&tve->enable_lock);
|
|
||||||
|
|
||||||
ddc_node = of_parse_phandle(np, "ddc", 0);
|
ddc_node = of_parse_phandle(np, "ddc", 0);
|
||||||
if (ddc_node) {
|
if (ddc_node) {
|
||||||
|
|
|
@ -996,35 +996,35 @@ static const struct ipu_platform_reg client_reg[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static DEFINE_MUTEX(ipu_client_id_mutex);
|
||||||
static int ipu_client_id;
|
static int ipu_client_id;
|
||||||
|
|
||||||
static int ipu_add_subdevice_pdata(struct device *dev,
|
|
||||||
const struct ipu_platform_reg *reg)
|
|
||||||
{
|
|
||||||
struct platform_device *pdev;
|
|
||||||
|
|
||||||
pdev = platform_device_register_data(dev, reg->name, ipu_client_id++,
|
|
||||||
®->pdata, sizeof(struct ipu_platform_reg));
|
|
||||||
|
|
||||||
return PTR_ERR_OR_ZERO(pdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ipu_add_client_devices(struct ipu_soc *ipu)
|
static int ipu_add_client_devices(struct ipu_soc *ipu)
|
||||||
{
|
{
|
||||||
int ret;
|
struct device *dev = ipu->dev;
|
||||||
int i;
|
unsigned i;
|
||||||
|
int id, ret;
|
||||||
|
|
||||||
|
mutex_lock(&ipu_client_id_mutex);
|
||||||
|
id = ipu_client_id;
|
||||||
|
ipu_client_id += ARRAY_SIZE(client_reg);
|
||||||
|
mutex_unlock(&ipu_client_id_mutex);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
|
for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
|
||||||
const struct ipu_platform_reg *reg = &client_reg[i];
|
const struct ipu_platform_reg *reg = &client_reg[i];
|
||||||
ret = ipu_add_subdevice_pdata(ipu->dev, reg);
|
struct platform_device *pdev;
|
||||||
if (ret)
|
|
||||||
|
pdev = platform_device_register_data(dev, reg->name,
|
||||||
|
id++, ®->pdata, sizeof(reg->pdata));
|
||||||
|
|
||||||
|
if (IS_ERR(pdev))
|
||||||
goto err_register;
|
goto err_register;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_register:
|
err_register:
|
||||||
platform_device_unregister_children(to_platform_device(ipu->dev));
|
platform_device_unregister_children(to_platform_device(dev));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче