Char/Misc driver fixes for 4.13-rc2
Here are some small char and misc driver fixes for 4.13-rc2. All fix reported problems with 4.13-rc1 or older kernels (like the binder fixes). Full details in the shortlog. All have been in linux-next with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWXMc8Q8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymePwCdEFD40T8GU7dnOHWVMkpX0wuNlOYAnijkamLl o41CVfvi/9Zwz6msMHX7 =HmjL -----END PGP SIGNATURE----- Merge tag 'char-misc-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc driver fixes from Greg KH: "Here are some small char and misc driver fixes for 4.13-rc2. All fix reported problems with 4.13-rc1 or older kernels (like the binder fixes). Full details in the shortlog. All have been in linux-next with no reported issues" * tag 'char-misc-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: w1: omap-hdq: fix error return code in omap_hdq_probe() regmap: regmap-w1: Fix build troubles w1: Fix slave count on 1-Wire bus (resend) mux: mux-core: unregister mux_class in mux_exit() mux: remove the Kconfig question for the subsystem nvmem: rockchip-efuse: amend compatible rk322x-efuse to rk3228-efuse drivers/fsi: fix fsi_slave_mode prototype fsi: core: register with postcore_initcall thunderbolt: Correct access permissions for active NVM contents vmbus: re-enable channel tasklet spmi: pmic-arb: Always allocate ppid_to_apid table MAINTAINERS: Add entry for SPMI subsystem spmi: Include OF based modalias in device uevent binder: Use wake up hint for synchronous transactions. binder: use group leader instead of open thread Revert "android: binder: Sanity check at binder ioctl"
This commit is contained in:
commit
dedaff2f6d
@ -4,7 +4,7 @@ Required properties:
|
|||||||
- compatible: Should be one of the following.
|
- compatible: Should be one of the following.
|
||||||
- "rockchip,rk3066a-efuse" - for RK3066a SoCs.
|
- "rockchip,rk3066a-efuse" - for RK3066a SoCs.
|
||||||
- "rockchip,rk3188-efuse" - for RK3188 SoCs.
|
- "rockchip,rk3188-efuse" - for RK3188 SoCs.
|
||||||
- "rockchip,rk322x-efuse" - for RK322x SoCs.
|
- "rockchip,rk3228-efuse" - for RK3228 SoCs.
|
||||||
- "rockchip,rk3288-efuse" - for RK3288 SoCs.
|
- "rockchip,rk3288-efuse" - for RK3288 SoCs.
|
||||||
- "rockchip,rk3399-efuse" - for RK3399 SoCs.
|
- "rockchip,rk3399-efuse" - for RK3399 SoCs.
|
||||||
- reg: Should contain the registers location and exact eFuse size
|
- reg: Should contain the registers location and exact eFuse size
|
||||||
|
@ -12356,6 +12356,15 @@ S: Supported
|
|||||||
F: Documentation/networking/spider_net.txt
|
F: Documentation/networking/spider_net.txt
|
||||||
F: drivers/net/ethernet/toshiba/spider_net*
|
F: drivers/net/ethernet/toshiba/spider_net*
|
||||||
|
|
||||||
|
SPMI SUBSYSTEM
|
||||||
|
R: Stephen Boyd <sboyd@codeaurora.org>
|
||||||
|
L: linux-arm-msm@vger.kernel.org
|
||||||
|
F: Documentation/devicetree/bindings/spmi/
|
||||||
|
F: drivers/spmi/
|
||||||
|
F: include/dt-bindings/spmi/spmi.h
|
||||||
|
F: include/linux/spmi.h
|
||||||
|
F: include/trace/events/spmi.h
|
||||||
|
|
||||||
SPU FILE SYSTEM
|
SPU FILE SYSTEM
|
||||||
M: Jeremy Kerr <jk@ozlabs.org>
|
M: Jeremy Kerr <jk@ozlabs.org>
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
|
@ -2200,8 +2200,12 @@ static void binder_transaction(struct binder_proc *proc,
|
|||||||
list_add_tail(&t->work.entry, target_list);
|
list_add_tail(&t->work.entry, target_list);
|
||||||
tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE;
|
tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE;
|
||||||
list_add_tail(&tcomplete->entry, &thread->todo);
|
list_add_tail(&tcomplete->entry, &thread->todo);
|
||||||
if (target_wait)
|
if (target_wait) {
|
||||||
wake_up_interruptible(target_wait);
|
if (reply || !(t->flags & TF_ONE_WAY))
|
||||||
|
wake_up_interruptible_sync(target_wait);
|
||||||
|
else
|
||||||
|
wake_up_interruptible(target_wait);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err_translate_failed:
|
err_translate_failed:
|
||||||
@ -3247,10 +3251,6 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||||||
/*pr_info("binder_ioctl: %d:%d %x %lx\n",
|
/*pr_info("binder_ioctl: %d:%d %x %lx\n",
|
||||||
proc->pid, current->pid, cmd, arg);*/
|
proc->pid, current->pid, cmd, arg);*/
|
||||||
|
|
||||||
if (unlikely(current->mm != proc->vma_vm_mm)) {
|
|
||||||
pr_err("current mm mismatch proc mm\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
trace_binder_ioctl(cmd, arg);
|
trace_binder_ioctl(cmd, arg);
|
||||||
|
|
||||||
ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);
|
ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);
|
||||||
@ -3464,9 +3464,8 @@ static int binder_open(struct inode *nodp, struct file *filp)
|
|||||||
proc = kzalloc(sizeof(*proc), GFP_KERNEL);
|
proc = kzalloc(sizeof(*proc), GFP_KERNEL);
|
||||||
if (proc == NULL)
|
if (proc == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
get_task_struct(current);
|
get_task_struct(current->group_leader);
|
||||||
proc->tsk = current;
|
proc->tsk = current->group_leader;
|
||||||
proc->vma_vm_mm = current->mm;
|
|
||||||
INIT_LIST_HEAD(&proc->todo);
|
INIT_LIST_HEAD(&proc->todo);
|
||||||
init_waitqueue_head(&proc->wait);
|
init_waitqueue_head(&proc->wait);
|
||||||
proc->default_priority = task_nice(current);
|
proc->default_priority = task_nice(current);
|
||||||
|
@ -532,7 +532,7 @@ static inline uint32_t fsi_smode_sid(int x)
|
|||||||
return (x & FSI_SMODE_SID_MASK) << FSI_SMODE_SID_SHIFT;
|
return (x & FSI_SMODE_SID_MASK) << FSI_SMODE_SID_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint32_t fsi_slave_smode(int id)
|
static uint32_t fsi_slave_smode(int id)
|
||||||
{
|
{
|
||||||
return FSI_SMODE_WSC | FSI_SMODE_ECRC
|
return FSI_SMODE_WSC | FSI_SMODE_ECRC
|
||||||
| fsi_smode_sid(id)
|
| fsi_smode_sid(id)
|
||||||
@ -883,17 +883,16 @@ struct bus_type fsi_bus_type = {
|
|||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(fsi_bus_type);
|
EXPORT_SYMBOL_GPL(fsi_bus_type);
|
||||||
|
|
||||||
static int fsi_init(void)
|
static int __init fsi_init(void)
|
||||||
{
|
{
|
||||||
return bus_register(&fsi_bus_type);
|
return bus_register(&fsi_bus_type);
|
||||||
}
|
}
|
||||||
|
postcore_initcall(fsi_init);
|
||||||
|
|
||||||
static void fsi_exit(void)
|
static void fsi_exit(void)
|
||||||
{
|
{
|
||||||
bus_unregister(&fsi_bus_type);
|
bus_unregister(&fsi_bus_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(fsi_init);
|
|
||||||
module_exit(fsi_exit);
|
module_exit(fsi_exit);
|
||||||
module_param(discard_errors, int, 0664);
|
module_param(discard_errors, int, 0664);
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -606,6 +606,8 @@ static int vmbus_close_internal(struct vmbus_channel *channel)
|
|||||||
get_order(channel->ringbuffer_pagecount * PAGE_SIZE));
|
get_order(channel->ringbuffer_pagecount * PAGE_SIZE));
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
/* re-enable tasklet for use on re-open */
|
||||||
|
tasklet_enable(&channel->callback_event);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,20 +2,11 @@
|
|||||||
# Multiplexer devices
|
# Multiplexer devices
|
||||||
#
|
#
|
||||||
|
|
||||||
menuconfig MULTIPLEXER
|
config MULTIPLEXER
|
||||||
tristate "Multiplexer subsystem"
|
tristate
|
||||||
help
|
|
||||||
Multiplexer controller subsystem. Multiplexers are used in a
|
|
||||||
variety of settings, and this subsystem abstracts their use
|
|
||||||
so that the rest of the kernel sees a common interface. When
|
|
||||||
multiple parallel multiplexers are controlled by one single
|
|
||||||
multiplexer controller, this subsystem also coordinates the
|
|
||||||
multiplexer accesses.
|
|
||||||
|
|
||||||
To compile the subsystem as a module, choose M here: the module will
|
menu "Multiplexer drivers"
|
||||||
be called mux-core.
|
depends on MULTIPLEXER
|
||||||
|
|
||||||
if MULTIPLEXER
|
|
||||||
|
|
||||||
config MUX_ADG792A
|
config MUX_ADG792A
|
||||||
tristate "Analog Devices ADG792A/ADG792G Multiplexers"
|
tristate "Analog Devices ADG792A/ADG792G Multiplexers"
|
||||||
@ -56,4 +47,4 @@ config MUX_MMIO
|
|||||||
To compile the driver as a module, choose M here: the module will
|
To compile the driver as a module, choose M here: the module will
|
||||||
be called mux-mmio.
|
be called mux-mmio.
|
||||||
|
|
||||||
endif
|
endmenu
|
||||||
|
@ -46,7 +46,7 @@ static int __init mux_init(void)
|
|||||||
|
|
||||||
static void __exit mux_exit(void)
|
static void __exit mux_exit(void)
|
||||||
{
|
{
|
||||||
class_register(&mux_class);
|
class_unregister(&mux_class);
|
||||||
ida_destroy(&mux_ida);
|
ida_destroy(&mux_ida);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ static const struct of_device_id rockchip_efuse_match[] = {
|
|||||||
.data = (void *)&rockchip_rk3288_efuse_read,
|
.data = (void *)&rockchip_rk3288_efuse_read,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.compatible = "rockchip,rk322x-efuse",
|
.compatible = "rockchip,rk3228-efuse",
|
||||||
.data = (void *)&rockchip_rk3288_efuse_read,
|
.data = (void *)&rockchip_rk3288_efuse_read,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -134,7 +134,6 @@ struct apid_data {
|
|||||||
* @spmic: SPMI controller object
|
* @spmic: SPMI controller object
|
||||||
* @ver_ops: version dependent operations.
|
* @ver_ops: version dependent operations.
|
||||||
* @ppid_to_apid in-memory copy of PPID -> channel (APID) mapping table.
|
* @ppid_to_apid in-memory copy of PPID -> channel (APID) mapping table.
|
||||||
* v2 only.
|
|
||||||
*/
|
*/
|
||||||
struct spmi_pmic_arb {
|
struct spmi_pmic_arb {
|
||||||
void __iomem *rd_base;
|
void __iomem *rd_base;
|
||||||
@ -1016,6 +1015,13 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
|
|||||||
goto err_put_ctrl;
|
goto err_put_ctrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pa->ppid_to_apid = devm_kcalloc(&ctrl->dev, PMIC_ARB_MAX_PPID,
|
||||||
|
sizeof(*pa->ppid_to_apid), GFP_KERNEL);
|
||||||
|
if (!pa->ppid_to_apid) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto err_put_ctrl;
|
||||||
|
}
|
||||||
|
|
||||||
hw_ver = readl_relaxed(core + PMIC_ARB_VERSION);
|
hw_ver = readl_relaxed(core + PMIC_ARB_VERSION);
|
||||||
|
|
||||||
if (hw_ver < PMIC_ARB_VERSION_V2_MIN) {
|
if (hw_ver < PMIC_ARB_VERSION_V2_MIN) {
|
||||||
@ -1048,15 +1054,6 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)
|
|||||||
err = PTR_ERR(pa->wr_base);
|
err = PTR_ERR(pa->wr_base);
|
||||||
goto err_put_ctrl;
|
goto err_put_ctrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa->ppid_to_apid = devm_kcalloc(&ctrl->dev,
|
|
||||||
PMIC_ARB_MAX_PPID,
|
|
||||||
sizeof(*pa->ppid_to_apid),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!pa->ppid_to_apid) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto err_put_ctrl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n",
|
dev_info(&ctrl->dev, "PMIC arbiter version %s (0x%x)\n",
|
||||||
|
@ -365,11 +365,23 @@ static int spmi_drv_remove(struct device *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int spmi_drv_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = of_device_uevent_modalias(dev, env);
|
||||||
|
if (ret != -ENODEV)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct bus_type spmi_bus_type = {
|
static struct bus_type spmi_bus_type = {
|
||||||
.name = "spmi",
|
.name = "spmi",
|
||||||
.match = spmi_device_match,
|
.match = spmi_device_match,
|
||||||
.probe = spmi_drv_probe,
|
.probe = spmi_drv_probe,
|
||||||
.remove = spmi_drv_remove,
|
.remove = spmi_drv_remove,
|
||||||
|
.uevent = spmi_drv_uevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -281,9 +281,11 @@ static struct nvmem_device *register_nvmem(struct tb_switch *sw, int id,
|
|||||||
if (active) {
|
if (active) {
|
||||||
config.name = "nvm_active";
|
config.name = "nvm_active";
|
||||||
config.reg_read = tb_switch_nvm_read;
|
config.reg_read = tb_switch_nvm_read;
|
||||||
|
config.read_only = true;
|
||||||
} else {
|
} else {
|
||||||
config.name = "nvm_non_active";
|
config.name = "nvm_non_active";
|
||||||
config.reg_write = tb_switch_nvm_write;
|
config.reg_write = tb_switch_nvm_write;
|
||||||
|
config.root_only = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
config.id = id;
|
config.id = id;
|
||||||
@ -292,7 +294,6 @@ static struct nvmem_device *register_nvmem(struct tb_switch *sw, int id,
|
|||||||
config.size = size;
|
config.size = size;
|
||||||
config.dev = &sw->dev;
|
config.dev = &sw->dev;
|
||||||
config.owner = THIS_MODULE;
|
config.owner = THIS_MODULE;
|
||||||
config.root_only = true;
|
|
||||||
config.priv = sw;
|
config.priv = sw;
|
||||||
|
|
||||||
return nvmem_register(&config);
|
return nvmem_register(&config);
|
||||||
|
@ -704,7 +704,8 @@ static int omap_hdq_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (irq < 0) {
|
if (irq < 0) {
|
||||||
ret = -ENXIO;
|
dev_dbg(&pdev->dev, "Failed to get IRQ: %d\n", irq);
|
||||||
|
ret = irq;
|
||||||
goto err_irq;
|
goto err_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,6 +728,7 @@ int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn)
|
|||||||
memcpy(&sl->reg_num, rn, sizeof(sl->reg_num));
|
memcpy(&sl->reg_num, rn, sizeof(sl->reg_num));
|
||||||
atomic_set(&sl->refcnt, 1);
|
atomic_set(&sl->refcnt, 1);
|
||||||
atomic_inc(&sl->master->refcnt);
|
atomic_inc(&sl->master->refcnt);
|
||||||
|
dev->slave_count++;
|
||||||
|
|
||||||
/* slave modules need to be loaded in a context with unlocked mutex */
|
/* slave modules need to be loaded in a context with unlocked mutex */
|
||||||
mutex_unlock(&dev->mutex);
|
mutex_unlock(&dev->mutex);
|
||||||
@ -747,11 +748,11 @@ int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn)
|
|||||||
|
|
||||||
sl->family = f;
|
sl->family = f;
|
||||||
|
|
||||||
|
|
||||||
err = __w1_attach_slave_device(sl);
|
err = __w1_attach_slave_device(sl);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__,
|
dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__,
|
||||||
sl->name);
|
sl->name);
|
||||||
|
dev->slave_count--;
|
||||||
w1_family_put(sl->family);
|
w1_family_put(sl->family);
|
||||||
atomic_dec(&sl->master->refcnt);
|
atomic_dec(&sl->master->refcnt);
|
||||||
kfree(sl);
|
kfree(sl);
|
||||||
@ -759,7 +760,6 @@ int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sl->ttl = dev->slave_ttl;
|
sl->ttl = dev->slave_ttl;
|
||||||
dev->slave_count++;
|
|
||||||
|
|
||||||
memcpy(msg.id.id, rn, sizeof(msg.id));
|
memcpy(msg.id.id, rn, sizeof(msg.id));
|
||||||
msg.type = W1_SLAVE_ADD;
|
msg.type = W1_SLAVE_ADD;
|
||||||
|
Loading…
Reference in New Issue
Block a user