Commit 89a86a2d authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge branch 'staging-linus' into staging-next

We need this for the pstore fixes that went into the staging-linus branch, so
that things apply properly for the pstore/android code merge.
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parents 71f882fe 364ed2f4
...@@ -218,6 +218,7 @@ What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_scale ...@@ -218,6 +218,7 @@ What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_scale
What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_supply_scale What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_supply_scale
What: /sys/bus/iio/devices/iio:deviceX/in_voltage_scale What: /sys/bus/iio/devices/iio:deviceX/in_voltage_scale
What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_scale What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_scale
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_scale
What: /sys/bus/iio/devices/iio:deviceX/in_accel_scale What: /sys/bus/iio/devices/iio:deviceX/in_accel_scale
What: /sys/bus/iio/devices/iio:deviceX/in_accel_peak_scale What: /sys/bus/iio/devices/iio:deviceX/in_accel_peak_scale
What: /sys/bus/iio/devices/iio:deviceX/in_anglvel_scale What: /sys/bus/iio/devices/iio:deviceX/in_anglvel_scale
...@@ -272,6 +273,7 @@ What: /sys/bus/iio/devices/iio:deviceX/in_accel_scale_available ...@@ -272,6 +273,7 @@ What: /sys/bus/iio/devices/iio:deviceX/in_accel_scale_available
What: /sys/.../iio:deviceX/in_voltageX_scale_available What: /sys/.../iio:deviceX/in_voltageX_scale_available
What: /sys/.../iio:deviceX/in_voltage-voltage_scale_available What: /sys/.../iio:deviceX/in_voltage-voltage_scale_available
What: /sys/.../iio:deviceX/out_voltageX_scale_available What: /sys/.../iio:deviceX/out_voltageX_scale_available
What: /sys/.../iio:deviceX/out_altvoltageX_scale_available
What: /sys/.../iio:deviceX/in_capacitance_scale_available What: /sys/.../iio:deviceX/in_capacitance_scale_available
KernelVersion: 2.635 KernelVersion: 2.635
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
...@@ -297,14 +299,19 @@ Description: ...@@ -297,14 +299,19 @@ Description:
gives the 3dB frequency of the filter in Hz. gives the 3dB frequency of the filter in Hz.
What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_raw What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_raw
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_raw
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
Raw (unscaled, no bias etc.) output voltage for Raw (unscaled, no bias etc.) output voltage for
channel Y. The number must always be specified and channel Y. The number must always be specified and
unique if the output corresponds to a single channel. unique if the output corresponds to a single channel.
While DAC like devices typically use out_voltage,
a continuous frequency generating device, such as
a DDS or PLL should use out_altvoltage.
What: /sys/bus/iio/devices/iio:deviceX/out_voltageY&Z_raw What: /sys/bus/iio/devices/iio:deviceX/out_voltageY&Z_raw
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY&Z_raw
KernelVersion: 2.6.37 KernelVersion: 2.6.37
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
...@@ -315,6 +322,8 @@ Description: ...@@ -315,6 +322,8 @@ Description:
What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown_mode What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown_mode
What: /sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown_mode What: /sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown_mode
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_powerdown_mode
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltage_powerdown_mode
KernelVersion: 2.6.38 KernelVersion: 2.6.38
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
...@@ -331,6 +340,8 @@ Description: ...@@ -331,6 +340,8 @@ Description:
What: /sys/.../iio:deviceX/out_votlageY_powerdown_mode_available What: /sys/.../iio:deviceX/out_votlageY_powerdown_mode_available
What: /sys/.../iio:deviceX/out_voltage_powerdown_mode_available What: /sys/.../iio:deviceX/out_voltage_powerdown_mode_available
What: /sys/.../iio:deviceX/out_altvotlageY_powerdown_mode_available
What: /sys/.../iio:deviceX/out_altvoltage_powerdown_mode_available
KernelVersion: 2.6.38 KernelVersion: 2.6.38
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
...@@ -339,6 +350,8 @@ Description: ...@@ -339,6 +350,8 @@ Description:
What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown
What: /sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown What: /sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_powerdown
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltage_powerdown
KernelVersion: 2.6.38 KernelVersion: 2.6.38
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
Description: Description:
...@@ -348,6 +361,24 @@ Description: ...@@ -348,6 +361,24 @@ Description:
operation. Y may be suppressed if all outputs are controlled operation. Y may be suppressed if all outputs are controlled
together. together.
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_frequency
KernelVersion: 3.4.0
Contact: linux-iio@vger.kernel.org
Description:
Output frequency for channel Y in Hz. The number must always be
specified and unique if the output corresponds to a single
channel.
What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_phase
KernelVersion: 3.4.0
Contact: linux-iio@vger.kernel.org
Description:
Phase in radians of one frequency/clock output Y
(out_altvoltageY) relative to another frequency/clock output
(out_altvoltageZ) of the device X. The number must always be
specified and unique if the output corresponds to a single
channel.
What: /sys/bus/iio/devices/iio:deviceX/events What: /sys/bus/iio/devices/iio:deviceX/events
KernelVersion: 2.6.35 KernelVersion: 2.6.35
Contact: linux-iio@vger.kernel.org Contact: linux-iio@vger.kernel.org
......
...@@ -724,7 +724,6 @@ static int iio_device_register_sysfs(struct iio_dev *indio_dev) ...@@ -724,7 +724,6 @@ static int iio_device_register_sysfs(struct iio_dev *indio_dev)
* New channel registration method - relies on the fact a group does * New channel registration method - relies on the fact a group does
* not need to be initialized if it is name is NULL. * not need to be initialized if it is name is NULL.
*/ */
INIT_LIST_HEAD(&indio_dev->channel_attr_list);
if (indio_dev->channels) if (indio_dev->channels)
for (i = 0; i < indio_dev->num_channels; i++) { for (i = 0; i < indio_dev->num_channels; i++) {
ret = iio_device_add_channel_sysfs(indio_dev, ret = iio_device_add_channel_sysfs(indio_dev,
...@@ -788,12 +787,16 @@ static void iio_device_unregister_sysfs(struct iio_dev *indio_dev) ...@@ -788,12 +787,16 @@ static void iio_device_unregister_sysfs(struct iio_dev *indio_dev)
static void iio_dev_release(struct device *device) static void iio_dev_release(struct device *device)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(device); struct iio_dev *indio_dev = dev_to_iio_dev(device);
if (indio_dev->chrdev.dev)
cdev_del(&indio_dev->chrdev); cdev_del(&indio_dev->chrdev);
if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
iio_device_unregister_trigger_consumer(indio_dev); iio_device_unregister_trigger_consumer(indio_dev);
iio_device_unregister_eventset(indio_dev); iio_device_unregister_eventset(indio_dev);
iio_device_unregister_sysfs(indio_dev); iio_device_unregister_sysfs(indio_dev);
iio_device_unregister_debugfs(indio_dev); iio_device_unregister_debugfs(indio_dev);
ida_simple_remove(&iio_ida, indio_dev->id);
kfree(indio_dev);
} }
static struct device_type iio_dev_type = { static struct device_type iio_dev_type = {
...@@ -824,6 +827,7 @@ struct iio_dev *iio_device_alloc(int sizeof_priv) ...@@ -824,6 +827,7 @@ struct iio_dev *iio_device_alloc(int sizeof_priv)
dev_set_drvdata(&dev->dev, (void *)dev); dev_set_drvdata(&dev->dev, (void *)dev);
mutex_init(&dev->mlock); mutex_init(&dev->mlock);
mutex_init(&dev->info_exist_lock); mutex_init(&dev->info_exist_lock);
INIT_LIST_HEAD(&dev->channel_attr_list);
dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL); dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);
if (dev->id < 0) { if (dev->id < 0) {
...@@ -841,10 +845,8 @@ EXPORT_SYMBOL(iio_device_alloc); ...@@ -841,10 +845,8 @@ EXPORT_SYMBOL(iio_device_alloc);
void iio_device_free(struct iio_dev *dev) void iio_device_free(struct iio_dev *dev)
{ {
if (dev) { if (dev)
ida_simple_remove(&iio_ida, dev->id); put_device(&dev->dev);
kfree(dev);
}
} }
EXPORT_SYMBOL(iio_device_free); EXPORT_SYMBOL(iio_device_free);
...@@ -965,7 +967,7 @@ void iio_device_unregister(struct iio_dev *indio_dev) ...@@ -965,7 +967,7 @@ void iio_device_unregister(struct iio_dev *indio_dev)
mutex_lock(&indio_dev->info_exist_lock); mutex_lock(&indio_dev->info_exist_lock);
indio_dev->info = NULL; indio_dev->info = NULL;
mutex_unlock(&indio_dev->info_exist_lock); mutex_unlock(&indio_dev->info_exist_lock);
device_unregister(&indio_dev->dev); device_del(&indio_dev->dev);
} }
EXPORT_SYMBOL(iio_device_unregister); EXPORT_SYMBOL(iio_device_unregister);
subsys_initcall(iio_init); subsys_initcall(iio_init);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kconfig.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
...@@ -1030,6 +1031,8 @@ void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver, ...@@ -1030,6 +1031,8 @@ void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver,
} }
EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister); EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister);
#if IS_ENABLED(CONFIG_USB)
static int comedi_old_usb_auto_config(struct usb_interface *intf, static int comedi_old_usb_auto_config(struct usb_interface *intf,
struct comedi_driver *driver) struct comedi_driver *driver)
{ {
...@@ -1092,3 +1095,5 @@ void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver, ...@@ -1092,3 +1095,5 @@ void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,
comedi_driver_unregister(comedi_driver); comedi_driver_unregister(comedi_driver);
} }
EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister); EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);
#endif
...@@ -29,8 +29,6 @@ Then fill in the following: ...@@ -29,8 +29,6 @@ Then fill in the following:
* info->driver_module: * info->driver_module:
Set to THIS_MODULE. Used to ensure correct ownership Set to THIS_MODULE. Used to ensure correct ownership
of various resources allocate by the core. of various resources allocate by the core.
* info->num_interrupt_lines:
Number of event triggering hardware lines the device has.
* info->event_attrs: * info->event_attrs:
Attributes used to enable / disable hardware events. Attributes used to enable / disable hardware events.
* info->attrs: * info->attrs:
......
...@@ -13,6 +13,7 @@ config AD7291 ...@@ -13,6 +13,7 @@ config AD7291
config AD7298 config AD7298
tristate "Analog Devices AD7298 ADC driver" tristate "Analog Devices AD7298 ADC driver"
depends on SPI depends on SPI
select IIO_KFIFO_BUF if IIO_BUFFER
help help
Say yes here to build support for Analog Devices AD7298 Say yes here to build support for Analog Devices AD7298
8 Channel ADC with temperature sensor. 8 Channel ADC with temperature sensor.
......
...@@ -235,7 +235,8 @@ static const struct attribute_group ad7606_attribute_group_range = { ...@@ -235,7 +235,8 @@ static const struct attribute_group ad7606_attribute_group_range = {
.indexed = 1, \ .indexed = 1, \
.channel = num, \ .channel = num, \
.address = num, \ .address = num, \
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT, \ .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
IIO_CHAN_INFO_SCALE_SHARED_BIT, \
.scan_index = num, \ .scan_index = num, \
.scan_type = IIO_ST('s', 16, 16, 0), \ .scan_type = IIO_ST('s', 16, 16, 0), \
} }
......
...@@ -208,7 +208,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper, ...@@ -208,7 +208,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
*/ */
ret = omap_gem_get_paddr(fbdev->bo, &paddr, true); ret = omap_gem_get_paddr(fbdev->bo, &paddr, true);
if (ret) { if (ret) {
dev_err(dev->dev, "could not map (paddr)!\n"); dev_err(dev->dev,
"could not map (paddr)! Skipping framebuffer alloc\n");
ret = -ENOMEM; ret = -ENOMEM;
goto fail; goto fail;
} }
...@@ -388,8 +389,11 @@ void omap_fbdev_free(struct drm_device *dev) ...@@ -388,8 +389,11 @@ void omap_fbdev_free(struct drm_device *dev)
fbi = helper->fbdev; fbi = helper->fbdev;
/* only cleanup framebuffer if it is present */
if (fbi) {
unregister_framebuffer(fbi); unregister_framebuffer(fbi);
framebuffer_release(fbi); framebuffer_release(fbi);
}
drm_fb_helper_fini(helper); drm_fb_helper_fini(helper);
......
...@@ -258,7 +258,7 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, ...@@ -258,7 +258,7 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id,
return rc; return rc;
} }
int pstore_fill_super(struct super_block *sb, void *data, int silent) static int pstore_fill_super(struct super_block *sb, void *data, int silent)
{ {
struct inode *inode; struct inode *inode;
......
...@@ -106,6 +106,8 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type, ...@@ -106,6 +106,8 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
time->tv_sec = 0; time->tv_sec = 0;
time->tv_nsec = 0; time->tv_nsec = 0;
/* Update old/shadowed buffer. */
persistent_ram_save_old(prz);
size = persistent_ram_old_size(prz); size = persistent_ram_old_size(prz);
*buf = kmalloc(size, GFP_KERNEL); *buf = kmalloc(size, GFP_KERNEL);
if (*buf == NULL) if (*buf == NULL)
...@@ -184,6 +186,7 @@ static int ramoops_pstore_erase(enum pstore_type_id type, u64 id, ...@@ -184,6 +186,7 @@ static int ramoops_pstore_erase(enum pstore_type_id type, u64 id,
return -EINVAL; return -EINVAL;
persistent_ram_free_old(cxt->przs[id]); persistent_ram_free_old(cxt->przs[id]);
persistent_ram_zap(cxt->przs[id]);
return 0; return 0;
} }
......
...@@ -250,23 +250,24 @@ static void notrace persistent_ram_update(struct persistent_ram_zone *prz, ...@@ -250,23 +250,24 @@ static void notrace persistent_ram_update(struct persistent_ram_zone *prz,
persistent_ram_update_ecc(prz, start, count); persistent_ram_update_ecc(prz, start, count);
} }
static void __init void persistent_ram_save_old(struct persistent_ram_zone *prz)
persistent_ram_save_old(struct persistent_ram_zone *prz)
{ {
struct persistent_ram_buffer *buffer = prz->buffer; struct persistent_ram_buffer *buffer = prz->buffer;
size_t size = buffer_size(prz); size_t size = buffer_size(prz);
size_t start = buffer_start(prz); size_t start = buffer_start(prz);
char *dest;
persistent_ram_ecc_old(prz); if (!size)
return;
dest = kmalloc(size, GFP_KERNEL); if (!prz->old_log) {
if (dest == NULL) { persistent_ram_ecc_old(prz);
prz->old_log = kmalloc(size, GFP_KERNEL);
}
if (!prz->old_log) {
pr_err("persistent_ram: failed to allocate buffer\n"); pr_err("persistent_ram: failed to allocate buffer\n");
return; return;
} }
prz->old_log = dest;
prz->old_log_size = size; prz->old_log_size = size;
memcpy(prz->old_log, &buffer->data[start], size - start); memcpy(prz->old_log, &buffer->data[start], size - start);
memcpy(prz->old_log + size - start, &buffer->data[0], start); memcpy(prz->old_log + size - start, &buffer->data[0], start);
...@@ -319,6 +320,13 @@ void persistent_ram_free_old(struct persistent_ram_zone *prz) ...@@ -319,6 +320,13 @@ void persistent_ram_free_old(struct persistent_ram_zone *prz)
prz->old_log_size = 0; prz->old_log_size = 0;
} }
void persistent_ram_zap(struct persistent_ram_zone *prz)
{
atomic_set(&prz->buffer->start, 0);
atomic_set(&prz->buffer->size, 0);
persistent_ram_update_header_ecc(prz);
}
static void *persistent_ram_vmap(phys_addr_t start, size_t size) static void *persistent_ram_vmap(phys_addr_t start, size_t size)
{ {
struct page **pages; struct page **pages;
...@@ -405,6 +413,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool ...@@ -405,6 +413,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool
" size %zu, start %zu\n", " size %zu, start %zu\n",
buffer_size(prz), buffer_start(prz)); buffer_size(prz), buffer_start(prz));
persistent_ram_save_old(prz); persistent_ram_save_old(prz);
return 0;
} }
} else { } else {
pr_info("persistent_ram: no valid data in buffer" pr_info("persistent_ram: no valid data in buffer"
...@@ -412,8 +421,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool ...@@ -412,8 +421,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool
} }
prz->buffer->sig = PERSISTENT_RAM_SIG; prz->buffer->sig = PERSISTENT_RAM_SIG;
atomic_set(&prz->buffer->start, 0); persistent_ram_zap(prz);
atomic_set(&prz->buffer->size, 0);
return 0; return 0;
} }
...@@ -448,7 +456,6 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start, ...@@ -448,7 +456,6 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,
goto err; goto err;
persistent_ram_post_init(prz, ecc); persistent_ram_post_init(prz, ecc);
persistent_ram_update_header_ecc(prz);
return prz; return prz;
err: err:
......
...@@ -69,12 +69,14 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start, ...@@ -69,12 +69,14 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,
size_t size, size_t size,
bool ecc); bool ecc);
void persistent_ram_free(struct persistent_ram_zone *prz); void persistent_ram_free(struct persistent_ram_zone *prz);
void persistent_ram_zap(struct persistent_ram_zone *prz);
struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev, struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev,
bool ecc); bool ecc);
int persistent_ram_write(struct persistent_ram_zone *prz, const void *s, int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,
unsigned int count); unsigned int count);
void persistent_ram_save_old(struct persistent_ram_zone *prz);
size_t persistent_ram_old_size(struct persistent_ram_zone *prz); size_t persistent_ram_old_size(struct persistent_ram_zone *prz);
void *persistent_ram_old(struct persistent_ram_zone *prz); void *persistent_ram_old(struct persistent_ram_zone *prz);
void persistent_ram_free_old(struct persistent_ram_zone *prz); void persistent_ram_free_old(struct persistent_ram_zone *prz);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment