mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
Char/Misc fixes for 6.11-rc3
Here are some small char/misc/other driver fixes for 6.11-rc3 for reported issues. Included in here are: - binder driver fixes - fsi MODULE_DESCRIPTION() additions (people seem to love them...) - eeprom driver fix - Kconfig dependency fix to resolve build issues - spmi driver fixes All of these have been in linux-next for a while with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZri1Xw8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yn3PACdGIk4UDVkpZ3bQffGW4w5VzeXCa0AoJNAyYQN yhF2YAI/muxsf/FQ6Sp9 =pgV7 -----END PGP SIGNATURE----- Merge tag 'char-misc-6.11-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc fixes from Greg KH: "Here are some small char/misc/other driver fixes for 6.11-rc3 for reported issues. Included in here are: - binder driver fixes - fsi MODULE_DESCRIPTION() additions (people seem to love them...) - eeprom driver fix - Kconfig dependency fix to resolve build issues - spmi driver fixes All of these have been in linux-next for a while with no reported problems" * tag 'char-misc-6.11-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: spmi: pmic-arb: add missing newline in dev_err format strings spmi: pmic-arb: Pass the correct of_node to irq_domain_add_tree binder_alloc: Fix sleeping function called from invalid context binder: fix descriptor lookup for context manager char: add missing NetWinder MODULE_DESCRIPTION() macros misc: mrvl-cn10k-dpi: add PCI_IOV dependency eeprom: ee1004: Fix locking issues in ee1004_probe() fsi: add missing MODULE_DESCRIPTION() macros
This commit is contained in:
commit
9221afb2d8
@ -1044,13 +1044,13 @@ static struct binder_ref *binder_get_ref_olocked(struct binder_proc *proc,
|
||||
}
|
||||
|
||||
/* Find the smallest unused descriptor the "slow way" */
|
||||
static u32 slow_desc_lookup_olocked(struct binder_proc *proc)
|
||||
static u32 slow_desc_lookup_olocked(struct binder_proc *proc, u32 offset)
|
||||
{
|
||||
struct binder_ref *ref;
|
||||
struct rb_node *n;
|
||||
u32 desc;
|
||||
|
||||
desc = 1;
|
||||
desc = offset;
|
||||
for (n = rb_first(&proc->refs_by_desc); n; n = rb_next(n)) {
|
||||
ref = rb_entry(n, struct binder_ref, rb_node_desc);
|
||||
if (ref->data.desc > desc)
|
||||
@ -1071,21 +1071,18 @@ static int get_ref_desc_olocked(struct binder_proc *proc,
|
||||
u32 *desc)
|
||||
{
|
||||
struct dbitmap *dmap = &proc->dmap;
|
||||
unsigned int nbits, offset;
|
||||
unsigned long *new, bit;
|
||||
unsigned int nbits;
|
||||
|
||||
/* 0 is reserved for the context manager */
|
||||
if (node == proc->context->binder_context_mgr_node) {
|
||||
*desc = 0;
|
||||
return 0;
|
||||
}
|
||||
offset = (node == proc->context->binder_context_mgr_node) ? 0 : 1;
|
||||
|
||||
if (!dbitmap_enabled(dmap)) {
|
||||
*desc = slow_desc_lookup_olocked(proc);
|
||||
*desc = slow_desc_lookup_olocked(proc, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dbitmap_acquire_first_zero_bit(dmap, &bit) == 0) {
|
||||
if (dbitmap_acquire_next_zero_bit(dmap, offset, &bit) == 0) {
|
||||
*desc = bit;
|
||||
return 0;
|
||||
}
|
||||
|
@ -939,9 +939,9 @@ void binder_alloc_deferred_release(struct binder_alloc *alloc)
|
||||
__free_page(alloc->pages[i].page_ptr);
|
||||
page_count++;
|
||||
}
|
||||
kvfree(alloc->pages);
|
||||
}
|
||||
spin_unlock(&alloc->lock);
|
||||
kvfree(alloc->pages);
|
||||
if (alloc->mm)
|
||||
mmdrop(alloc->mm);
|
||||
|
||||
|
@ -6,8 +6,7 @@
|
||||
*
|
||||
* Used by the binder driver to optimize the allocation of the smallest
|
||||
* available descriptor ID. Each bit in the bitmap represents the state
|
||||
* of an ID, with the exception of BIT(0) which is used exclusively to
|
||||
* reference binder's context manager.
|
||||
* of an ID.
|
||||
*
|
||||
* A dbitmap can grow or shrink as needed. This part has been designed
|
||||
* considering that users might need to briefly release their locks in
|
||||
@ -58,11 +57,7 @@ static inline unsigned int dbitmap_shrink_nbits(struct dbitmap *dmap)
|
||||
if (bit < (dmap->nbits >> 2))
|
||||
return dmap->nbits >> 1;
|
||||
|
||||
/*
|
||||
* Note that find_last_bit() returns dmap->nbits when no bits
|
||||
* are set. While this is technically not possible here since
|
||||
* BIT(0) is always set, this check is left for extra safety.
|
||||
*/
|
||||
/* find_last_bit() returns dmap->nbits when no bits are set. */
|
||||
if (bit == dmap->nbits)
|
||||
return NBITS_MIN;
|
||||
|
||||
@ -132,16 +127,17 @@ dbitmap_grow(struct dbitmap *dmap, unsigned long *new, unsigned int nbits)
|
||||
}
|
||||
|
||||
/*
|
||||
* Finds and sets the first zero bit in the bitmap. Upon success @bit
|
||||
* Finds and sets the next zero bit in the bitmap. Upon success @bit
|
||||
* is populated with the index and 0 is returned. Otherwise, -ENOSPC
|
||||
* is returned to indicate that a dbitmap_grow() is needed.
|
||||
*/
|
||||
static inline int
|
||||
dbitmap_acquire_first_zero_bit(struct dbitmap *dmap, unsigned long *bit)
|
||||
dbitmap_acquire_next_zero_bit(struct dbitmap *dmap, unsigned long offset,
|
||||
unsigned long *bit)
|
||||
{
|
||||
unsigned long n;
|
||||
|
||||
n = find_first_zero_bit(dmap->map, dmap->nbits);
|
||||
n = find_next_zero_bit(dmap->map, dmap->nbits, offset);
|
||||
if (n == dmap->nbits)
|
||||
return -ENOSPC;
|
||||
|
||||
@ -154,9 +150,7 @@ dbitmap_acquire_first_zero_bit(struct dbitmap *dmap, unsigned long *bit)
|
||||
static inline void
|
||||
dbitmap_clear_bit(struct dbitmap *dmap, unsigned long bit)
|
||||
{
|
||||
/* BIT(0) should always set for the context manager */
|
||||
if (bit)
|
||||
clear_bit(bit, dmap->map);
|
||||
clear_bit(bit, dmap->map);
|
||||
}
|
||||
|
||||
static inline int dbitmap_init(struct dbitmap *dmap)
|
||||
@ -168,8 +162,6 @@ static inline int dbitmap_init(struct dbitmap *dmap)
|
||||
}
|
||||
|
||||
dmap->nbits = NBITS_MIN;
|
||||
/* BIT(0) is reserved for the context manager */
|
||||
set_bit(0, dmap->map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -421,4 +421,5 @@ static void __exit ds1620_exit(void)
|
||||
module_init(ds1620_init);
|
||||
module_exit(ds1620_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Dallas Semiconductor DS1620 thermometer driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -241,6 +241,7 @@ static void __exit nwbutton_exit (void)
|
||||
|
||||
|
||||
MODULE_AUTHOR("Alex Holden");
|
||||
MODULE_DESCRIPTION("NetWinder button driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(nwbutton_init);
|
||||
|
@ -618,6 +618,7 @@ static void __exit nwflash_exit(void)
|
||||
iounmap((void *)FLASH_BASE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("NetWinder flash memory driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_param(flashdebug, bool, 0644);
|
||||
|
@ -1444,5 +1444,6 @@ static void fsi_exit(void)
|
||||
}
|
||||
module_exit(fsi_exit);
|
||||
module_param(discard_errors, int, 0664);
|
||||
MODULE_DESCRIPTION("FSI core driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_PARM_DESC(discard_errors, "Don't invoke error handling on bus accesses");
|
||||
|
@ -670,4 +670,5 @@ static struct platform_driver fsi_master_aspeed_driver = {
|
||||
};
|
||||
|
||||
module_platform_driver(fsi_master_aspeed_driver);
|
||||
MODULE_DESCRIPTION("FSI master driver for AST2600");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
// Copyright 2018 IBM Corp
|
||||
/*
|
||||
* A FSI master controller, using a simple GPIO bit-banging interface
|
||||
* A FSI master based on Aspeed ColdFire coprocessor
|
||||
*/
|
||||
|
||||
#include <linux/crc4.h>
|
||||
@ -1438,5 +1438,6 @@ static struct platform_driver fsi_master_acf = {
|
||||
};
|
||||
|
||||
module_platform_driver(fsi_master_acf);
|
||||
MODULE_DESCRIPTION("A FSI master based on Aspeed ColdFire coprocessor");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(FW_FILE_NAME);
|
||||
|
@ -892,4 +892,5 @@ static struct platform_driver fsi_master_gpio_driver = {
|
||||
};
|
||||
|
||||
module_platform_driver(fsi_master_gpio_driver);
|
||||
MODULE_DESCRIPTION("A FSI master controller, using a simple GPIO bit-banging interface");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -295,4 +295,5 @@ static struct fsi_driver hub_master_driver = {
|
||||
};
|
||||
|
||||
module_fsi_driver(hub_master_driver);
|
||||
MODULE_DESCRIPTION("FSI hub master driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -625,4 +625,5 @@ static void scom_exit(void)
|
||||
|
||||
module_init(scom_init);
|
||||
module_exit(scom_exit);
|
||||
MODULE_DESCRIPTION("SCOM FSI Client device driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -587,7 +587,7 @@ config NSM
|
||||
|
||||
config MARVELL_CN10K_DPI
|
||||
tristate "Octeon CN10K DPI driver"
|
||||
depends on PCI
|
||||
depends on PCI && PCI_IOV
|
||||
depends on ARCH_THUNDER || (COMPILE_TEST && 64BIT)
|
||||
help
|
||||
Enables Octeon CN10K DMA packet interface (DPI) driver which
|
||||
|
@ -233,6 +233,49 @@ static void ee1004_cleanup_bus_data(void *data)
|
||||
mutex_unlock(&ee1004_bus_lock);
|
||||
}
|
||||
|
||||
static int ee1004_init_bus_data(struct i2c_client *client)
|
||||
{
|
||||
struct ee1004_bus_data *bd;
|
||||
int err, cnr = 0;
|
||||
|
||||
bd = ee1004_get_bus_data(client->adapter);
|
||||
if (!bd)
|
||||
return dev_err_probe(&client->dev, -ENOSPC, "Only %d busses supported",
|
||||
EE1004_MAX_BUSSES);
|
||||
|
||||
i2c_set_clientdata(client, bd);
|
||||
|
||||
if (++bd->dev_count == 1) {
|
||||
/* Use 2 dummy devices for page select command */
|
||||
for (cnr = 0; cnr < EE1004_NUM_PAGES; cnr++) {
|
||||
struct i2c_client *cl;
|
||||
|
||||
cl = i2c_new_dummy_device(client->adapter, EE1004_ADDR_SET_PAGE + cnr);
|
||||
if (IS_ERR(cl)) {
|
||||
err = PTR_ERR(cl);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
bd->set_page[cnr] = cl;
|
||||
}
|
||||
|
||||
/* Remember current page to avoid unneeded page select */
|
||||
err = ee1004_get_current_page(bd);
|
||||
if (err < 0)
|
||||
goto err_out;
|
||||
|
||||
dev_dbg(&client->dev, "Currently selected page: %d\n", err);
|
||||
bd->current_page = err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
ee1004_cleanup(cnr, bd);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ee1004_probe(struct i2c_client *client)
|
||||
{
|
||||
struct nvmem_config config = {
|
||||
@ -251,9 +294,8 @@ static int ee1004_probe(struct i2c_client *client)
|
||||
.compat = true,
|
||||
.base_dev = &client->dev,
|
||||
};
|
||||
struct ee1004_bus_data *bd;
|
||||
struct nvmem_device *ndev;
|
||||
int err, cnr = 0;
|
||||
int err;
|
||||
|
||||
/* Make sure we can operate on this adapter */
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
@ -264,46 +306,21 @@ static int ee1004_probe(struct i2c_client *client)
|
||||
|
||||
mutex_lock(&ee1004_bus_lock);
|
||||
|
||||
bd = ee1004_get_bus_data(client->adapter);
|
||||
if (!bd) {
|
||||
err = ee1004_init_bus_data(client);
|
||||
if (err < 0) {
|
||||
mutex_unlock(&ee1004_bus_lock);
|
||||
return dev_err_probe(&client->dev, -ENOSPC,
|
||||
"Only %d busses supported", EE1004_MAX_BUSSES);
|
||||
}
|
||||
|
||||
err = devm_add_action_or_reset(&client->dev, ee1004_cleanup_bus_data, bd);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
i2c_set_clientdata(client, bd);
|
||||
|
||||
if (++bd->dev_count == 1) {
|
||||
/* Use 2 dummy devices for page select command */
|
||||
for (cnr = 0; cnr < EE1004_NUM_PAGES; cnr++) {
|
||||
struct i2c_client *cl;
|
||||
|
||||
cl = i2c_new_dummy_device(client->adapter, EE1004_ADDR_SET_PAGE + cnr);
|
||||
if (IS_ERR(cl)) {
|
||||
mutex_unlock(&ee1004_bus_lock);
|
||||
return PTR_ERR(cl);
|
||||
}
|
||||
bd->set_page[cnr] = cl;
|
||||
}
|
||||
|
||||
/* Remember current page to avoid unneeded page select */
|
||||
err = ee1004_get_current_page(bd);
|
||||
if (err < 0) {
|
||||
mutex_unlock(&ee1004_bus_lock);
|
||||
return err;
|
||||
}
|
||||
dev_dbg(&client->dev, "Currently selected page: %d\n", err);
|
||||
bd->current_page = err;
|
||||
}
|
||||
|
||||
ee1004_probe_temp_sensor(client);
|
||||
|
||||
mutex_unlock(&ee1004_bus_lock);
|
||||
|
||||
err = devm_add_action_or_reset(&client->dev, ee1004_cleanup_bus_data,
|
||||
i2c_get_clientdata(client));
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
ndev = devm_nvmem_register(&client->dev, &config);
|
||||
if (IS_ERR(ndev))
|
||||
return PTR_ERR(ndev);
|
||||
|
@ -398,7 +398,7 @@ static int pmic_arb_fmt_read_cmd(struct spmi_pmic_arb_bus *bus, u8 opc, u8 sid,
|
||||
|
||||
*offset = rc;
|
||||
if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
|
||||
dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested",
|
||||
dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested\n",
|
||||
PMIC_ARB_MAX_TRANS_BYTES, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -477,7 +477,7 @@ static int pmic_arb_fmt_write_cmd(struct spmi_pmic_arb_bus *bus, u8 opc,
|
||||
|
||||
*offset = rc;
|
||||
if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
|
||||
dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested",
|
||||
dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested\n",
|
||||
PMIC_ARB_MAX_TRANS_BYTES, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -1702,7 +1702,7 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
|
||||
|
||||
index = of_property_match_string(node, "reg-names", "cnfg");
|
||||
if (index < 0) {
|
||||
dev_err(dev, "cnfg reg region missing");
|
||||
dev_err(dev, "cnfg reg region missing\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1712,7 +1712,7 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
|
||||
|
||||
index = of_property_match_string(node, "reg-names", "intr");
|
||||
if (index < 0) {
|
||||
dev_err(dev, "intr reg region missing");
|
||||
dev_err(dev, "intr reg region missing\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1737,8 +1737,7 @@ static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
|
||||
|
||||
dev_dbg(&pdev->dev, "adding irq domain for bus %d\n", bus_index);
|
||||
|
||||
bus->domain = irq_domain_add_tree(dev->of_node,
|
||||
&pmic_arb_irq_domain_ops, bus);
|
||||
bus->domain = irq_domain_add_tree(node, &pmic_arb_irq_domain_ops, bus);
|
||||
if (!bus->domain) {
|
||||
dev_err(&pdev->dev, "unable to create irq_domain\n");
|
||||
return -ENOMEM;
|
||||
|
Loading…
Reference in New Issue
Block a user