Message ID | be5cd69c7c58d44ca119d4ca692d95a2ae924533.1663835855.git.zhoubinbin@loongson.cn |
---|---|
State | New |
Headers | show |
Series | i2c: ls2x: Add support for the Loongson-2K/LS7A I2C | expand |
Hi, On Thu, Sep 22, 2022 at 07:39:54PM +0800, Binbin Zhou wrote: > Under LoongARCH based on ACPI(such as Loongson-3A + LS7A), the ls2x i2c > driver obtains the i2c bus number from ACPI table. Why this is needed? The I2CSerialBusV2() resource should be enough to identify the adapter, and I don't see why static number would be needed for anything?
On 2022/9/22 下午7:39, Binbin Zhou wrote: > Under LoongARCH based on ACPI(such as Loongson-3A + LS7A), the ls2x i2c > driver obtains the i2c bus number from ACPI table. > > Similar to the DT-base system, this is also a static bus number. > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> > Signed-off-by: Binbin Zhou <zhoubinbin@loongson.cn> > --- > drivers/i2c/i2c-core-base.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c > index 91007558bcb2..ffab4cc2c6ba 100644 > --- a/drivers/i2c/i2c-core-base.c > +++ b/drivers/i2c/i2c-core-base.c > @@ -1559,7 +1559,8 @@ static int __i2c_add_numbered_adapter(struct i2c_adapter *adap) > int i2c_add_adapter(struct i2c_adapter *adapter) > { > struct device *dev = &adapter->dev; > - int id; > + acpi_status status; > + unsigned long long id; > > if (dev->of_node) { > id = of_alias_get_id(dev->of_node, "i2c"); > @@ -1567,6 +1568,13 @@ int i2c_add_adapter(struct i2c_adapter *adapter) > adapter->nr = id; > return __i2c_add_numbered_adapter(adapter); > } > + } else if (dev->parent->fwnode) { > + status = acpi_evaluate_integer(ACPI_HANDLE(dev->parent), > + "_UID", NULL, &id); > + if (ACPI_SUCCESS(status) && (id >= 0)) { Hi, Binbin, Emm, the id is unsigned and it always return true if (id>=0). And I think you should check the other patches. Jinyang > + adapter->nr = id; > + return __i2c_add_numbered_adapter(adapter); > + } > } > > mutex_lock(&core_lock);
Hi Binbin, Thank you for the patch! Yet something to improve: [auto build test ERROR on wsa/i2c/for-next] [also build test ERROR on linus/master v6.0-rc6 next-20220921] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Binbin-Zhou/i2c-ls2x-Add-support-for-the-Loongson-2K-LS7A-I2C/20220922-194252 base: https://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/for-next config: hexagon-randconfig-r041-20220922 (https://download.01.org/0day-ci/archive/20220923/202209230228.LIiHRmuw-lkp@intel.com/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 791a7ae1ba3efd6bca96338e10ffde557ba83920) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/749fc796eb66dc42c209c6a5808c6b2a5e47fbb6 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Binbin-Zhou/i2c-ls2x-Add-support-for-the-Loongson-2K-LS7A-I2C/20220922-194252 git checkout 749fc796eb66dc42c209c6a5808c6b2a5e47fbb6 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/i2c/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): >> drivers/i2c/i2c-core-base.c:1568:12: error: call to undeclared function 'acpi_evaluate_integer'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] status = acpi_evaluate_integer(ACPI_HANDLE(dev->parent), ^ drivers/i2c/i2c-core-base.c:1568:12: note: did you mean 'acpi_evaluate_object'? include/acpi/acpixf.h:550:8: note: 'acpi_evaluate_object' declared here acpi_evaluate_object(acpi_handle object, ^ include/acpi/platform/aclinux.h:93:21: note: expanded from macro 'ACPI_EXTERNAL_RETURN_STATUS' static ACPI_INLINE prototype {return(AE_NOT_CONFIGURED);} ^ 1 error generated. vim +/acpi_evaluate_integer +1568 drivers/i2c/i2c-core-base.c 1540 1541 /** 1542 * i2c_add_adapter - declare i2c adapter, use dynamic bus number 1543 * @adapter: the adapter to add 1544 * Context: can sleep 1545 * 1546 * This routine is used to declare an I2C adapter when its bus number 1547 * doesn't matter or when its bus number is specified by an dt alias. 1548 * Examples of bases when the bus number doesn't matter: I2C adapters 1549 * dynamically added by USB links or PCI plugin cards. 1550 * 1551 * When this returns zero, a new bus number was allocated and stored 1552 * in adap->nr, and the specified adapter became available for clients. 1553 * Otherwise, a negative errno value is returned. 1554 */ 1555 int i2c_add_adapter(struct i2c_adapter *adapter) 1556 { 1557 struct device *dev = &adapter->dev; 1558 acpi_status status; 1559 unsigned long long id; 1560 1561 if (dev->of_node) { 1562 id = of_alias_get_id(dev->of_node, "i2c"); 1563 if (id >= 0) { 1564 adapter->nr = id; 1565 return __i2c_add_numbered_adapter(adapter); 1566 } 1567 } else if (dev->parent->fwnode) { > 1568 status = acpi_evaluate_integer(ACPI_HANDLE(dev->parent), 1569 "_UID", NULL, &id); 1570 if (ACPI_SUCCESS(status) && (id >= 0)) { 1571 adapter->nr = id; 1572 return __i2c_add_numbered_adapter(adapter); 1573 } 1574 } 1575 1576 mutex_lock(&core_lock); 1577 id = idr_alloc(&i2c_adapter_idr, adapter, 1578 __i2c_first_dynamic_bus_num, 0, GFP_KERNEL); 1579 mutex_unlock(&core_lock); 1580 if (WARN(id < 0, "couldn't get idr")) 1581 return id; 1582 1583 adapter->nr = id; 1584 1585 return i2c_register_adapter(adapter); 1586 } 1587 EXPORT_SYMBOL(i2c_add_adapter); 1588
Hi, Mika, On Thu, Sep 22, 2022 at 8:23 PM Mika Westerberg <mika.westerberg@linux.intel.com> wrote: > > Hi, > > On Thu, Sep 22, 2022 at 07:39:54PM +0800, Binbin Zhou wrote: > > Under LoongARCH based on ACPI(such as Loongson-3A + LS7A), the ls2x i2c > > driver obtains the i2c bus number from ACPI table. > > Why this is needed? The I2CSerialBusV2() resource should be enough to > identify the adapter, and I don't see why static number would be needed > for anything? > In later patches we will add LS7A i2c driver, this driver is shared by MIPS-based Loongson-3A4000 system (use FDT) and LoongArch-based Loongson-3A5000 system (use ACPI). FDT systems support static bus numbers, so we want to do the same thing on ACPI systems. I think keep this consistency can make user feel better Huacai
Hi, On Fri, Sep 23, 2022 at 03:16:03PM +0800, Huacai Chen wrote: > Hi, Mika, > > On Thu, Sep 22, 2022 at 8:23 PM Mika Westerberg > <mika.westerberg@linux.intel.com> wrote: > > > > Hi, > > > > On Thu, Sep 22, 2022 at 07:39:54PM +0800, Binbin Zhou wrote: > > > Under LoongARCH based on ACPI(such as Loongson-3A + LS7A), the ls2x i2c > > > driver obtains the i2c bus number from ACPI table. > > > > Why this is needed? The I2CSerialBusV2() resource should be enough to > > identify the adapter, and I don't see why static number would be needed > > for anything? > > > In later patches we will add LS7A i2c driver, this driver is shared by > MIPS-based Loongson-3A4000 system (use FDT) and LoongArch-based > Loongson-3A5000 system (use ACPI). > > FDT systems support static bus numbers, so we want to do the same > thing on ACPI systems. I think keep this consistency can make user > feel better I don't think the user cares to be honest. As long as all the devices work as expected ;-) And this saves a couple of lines of code too so if not really needed, I would just drop that part.
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 91007558bcb2..ffab4cc2c6ba 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1559,7 +1559,8 @@ static int __i2c_add_numbered_adapter(struct i2c_adapter *adap) int i2c_add_adapter(struct i2c_adapter *adapter) { struct device *dev = &adapter->dev; - int id; + acpi_status status; + unsigned long long id; if (dev->of_node) { id = of_alias_get_id(dev->of_node, "i2c"); @@ -1567,6 +1568,13 @@ int i2c_add_adapter(struct i2c_adapter *adapter) adapter->nr = id; return __i2c_add_numbered_adapter(adapter); } + } else if (dev->parent->fwnode) { + status = acpi_evaluate_integer(ACPI_HANDLE(dev->parent), + "_UID", NULL, &id); + if (ACPI_SUCCESS(status) && (id >= 0)) { + adapter->nr = id; + return __i2c_add_numbered_adapter(adapter); + } } mutex_lock(&core_lock);