提交 1aba038b 编写于 作者: L Linus Torvalds

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
...@@ -200,7 +200,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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[] = { ...@@ -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) = { ...@@ -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 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p) ...@@ -451,7 +451,12 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p)
.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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[] = { ...@@ -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++,
&reg->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++, &reg->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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册