Re: [PATCH v3 3/3] irqchip: Add Qualcomm MPM controller driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Shawn,

I love your patch! Yet something to improve:

[auto build test ERROR on tip/irq/core]
[also build test ERROR on linux/master linus/master v5.16-rc3 next-20211202]
[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]

url:    https://github.com/0day-ci/linux/commits/Shawn-Guo/Add-Qualcomm-MPM-irqchip-driver-support/20211202-202327
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 4946f15e8c334840bf277a0bf924371eae120fcd
config: arm-allmodconfig (https://download.01.org/0day-ci/archive/20211203/202112030740.6LvRpZLQ-lkp@xxxxxxxxx/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.2.0
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/0day-ci/linux/commit/d575d38e462a2d09c7e36150fb9a638d591a9c91
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Shawn-Guo/Add-Qualcomm-MPM-irqchip-driver-support/20211202-202327
        git checkout d575d38e462a2d09c7e36150fb9a638d591a9c91
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm SHELL=/bin/bash drivers/irqchip/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

   drivers/irqchip/qcom-mpm.c: In function 'qcom_mpm_handler':
>> drivers/irqchip/qcom-mpm.c:284:33: error: implicit declaration of function 'irq_set_irqchip_state'; did you mean 'irq_set_chip_data'? [-Werror=implicit-function-declaration]
     284 |                                 irq_set_irqchip_state(d->irq,
         |                                 ^~~~~~~~~~~~~~~~~~~~~
         |                                 irq_set_chip_data
>> drivers/irqchip/qcom-mpm.c:285:49: error: 'IRQCHIP_STATE_PENDING' undeclared (first use in this function)
     285 |                                                 IRQCHIP_STATE_PENDING, true);
         |                                                 ^~~~~~~~~~~~~~~~~~~~~
   drivers/irqchip/qcom-mpm.c:285:49: note: each undeclared identifier is reported only once for each function it appears in
   drivers/irqchip/qcom-mpm.c: In function 'qcom_mpm_init':
>> drivers/irqchip/qcom-mpm.c:425:15: error: implicit declaration of function 'devm_request_irq'; did you mean 'can_request_irq'? [-Werror=implicit-function-declaration]
     425 |         ret = devm_request_irq(dev, irq, qcom_mpm_handler,
         |               ^~~~~~~~~~~~~~~~
         |               can_request_irq
>> drivers/irqchip/qcom-mpm.c:426:32: error: 'IRQF_TRIGGER_RISING' undeclared (first use in this function); did you mean 'IRQD_TRIGGER_MASK'?
     426 |                                IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND,
         |                                ^~~~~~~~~~~~~~~~~~~
         |                                IRQD_TRIGGER_MASK
>> drivers/irqchip/qcom-mpm.c:426:54: error: 'IRQF_NO_SUSPEND' undeclared (first use in this function)
     426 |                                IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND,
         |                                                      ^~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +284 drivers/irqchip/qcom-mpm.c

   264	
   265	/* Triggered by RPM when system resumes from deep sleep */
   266	static irqreturn_t qcom_mpm_handler(int irq, void *dev_id)
   267	{
   268		struct qcom_mpm_priv *priv = dev_id;
   269		unsigned long enable, pending;
   270		int i, j;
   271	
   272		for (i = 0; i < priv->reg_stride; i++) {
   273			enable = qcom_mpm_read(priv, MPM_REG_ENABLE, i);
   274			pending = qcom_mpm_read(priv, MPM_REG_STATUS, i);
   275			pending &= enable;
   276	
   277			for_each_set_bit(j, &pending, 32) {
   278				unsigned int pin = 32 * i + j;
   279				struct irq_desc *desc =
   280						irq_resolve_mapping(priv->domain, pin);
   281				struct irq_data *d = &desc->irq_data;
   282	
   283				if (!irqd_is_level_type(d))
 > 284					irq_set_irqchip_state(d->irq,
 > 285							IRQCHIP_STATE_PENDING, true);
   286	
   287			}
   288		}
   289	
   290		return IRQ_HANDLED;
   291	}
   292	
   293	static int qcom_mpm_enter_sleep(struct qcom_mpm_priv *priv)
   294	{
   295		int i, ret;
   296	
   297		for (i = 0; i < priv->reg_stride; i++)
   298			qcom_mpm_write(priv, MPM_REG_STATUS, i, 0);
   299	
   300		/* Notify RPM to write vMPM into HW */
   301		ret = mbox_send_message(priv->mbox_chan, NULL);
   302		if (ret < 0)
   303			return ret;
   304	
   305		return 0;
   306	}
   307	
   308	static int qcom_mpm_cpu_pm_callback(struct notifier_block *nb,
   309					    unsigned long action, void *data)
   310	{
   311		struct qcom_mpm_priv *priv = container_of(nb, struct qcom_mpm_priv,
   312							  pm_nb);
   313		int ret = NOTIFY_OK;
   314		int cpus_in_pm;
   315	
   316		switch (action) {
   317		case CPU_PM_ENTER:
   318			cpus_in_pm = atomic_inc_return(&priv->cpus_in_pm);
   319			/*
   320			 * NOTE: comments for num_online_cpus() point out that it's
   321			 * only a snapshot so we need to be careful. It should be OK
   322			 * for us to use, though.  It's important for us not to miss
   323			 * if we're the last CPU going down so it would only be a
   324			 * problem if a CPU went offline right after we did the check
   325			 * AND that CPU was not idle AND that CPU was the last non-idle
   326			 * CPU. That can't happen. CPUs would have to come out of idle
   327			 * before the CPU could go offline.
   328			 */
   329			if (cpus_in_pm < num_online_cpus())
   330				return NOTIFY_OK;
   331			break;
   332		case CPU_PM_ENTER_FAILED:
   333		case CPU_PM_EXIT:
   334			atomic_dec(&priv->cpus_in_pm);
   335			return NOTIFY_OK;
   336		default:
   337			return NOTIFY_DONE;
   338		}
   339	
   340		/*
   341		 * It's likely we're on the last CPU. Grab the lock and write MPM for
   342		 * sleep. Grabbing the lock means that if we race with another CPU
   343		 * coming up we are still guaranteed to be safe.
   344		 */
   345		if (raw_spin_trylock(&priv->lock)) {
   346			if (qcom_mpm_enter_sleep(priv))
   347				ret = NOTIFY_BAD;
   348			raw_spin_unlock(&priv->lock);
   349		} else {
   350			/* Another CPU must be up */
   351			return NOTIFY_OK;
   352		}
   353	
   354		if (ret == NOTIFY_BAD) {
   355			/* Double-check if we're here because someone else is up */
   356			if (cpus_in_pm < num_online_cpus())
   357				ret = NOTIFY_OK;
   358			else
   359				/* We won't be called w/ CPU_PM_ENTER_FAILED */
   360				atomic_dec(&priv->cpus_in_pm);
   361		}
   362	
   363		return ret;
   364	}
   365	
   366	static int qcom_mpm_init(struct platform_device *pdev,
   367				 struct device_node *parent,
   368				 const struct mpm_data *data)
   369	{
   370		struct irq_domain *parent_domain;
   371		struct device *dev = &pdev->dev;
   372		struct device_node *np = dev->of_node;
   373		struct qcom_mpm_priv *priv;
   374		unsigned int pin_num;
   375		int irq;
   376		int ret;
   377	
   378		if (!data)
   379			return -ENODEV;
   380	
   381		priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
   382		if (!priv)
   383			return -ENOMEM;
   384	
   385		priv->data = data;
   386		pin_num = priv->data->pin_num;
   387		priv->reg_stride = DIV_ROUND_UP(pin_num, 32);
   388	
   389		raw_spin_lock_init(&priv->lock);
   390	
   391		priv->base = devm_platform_ioremap_resource(pdev, 0);
   392		if (!priv->base)
   393			return PTR_ERR(priv->base);
   394	
   395		irq = platform_get_irq(pdev, 0);
   396		if (irq < 0)
   397			return irq;
   398	
   399		priv->mbox_client.dev = dev;
   400		priv->mbox_chan = mbox_request_channel(&priv->mbox_client, 0);
   401		if (IS_ERR(priv->mbox_chan)) {
   402			ret = PTR_ERR(priv->mbox_chan);
   403			dev_err(dev, "failed to acquire IPC channel: %d\n", ret);
   404			return ret;
   405		}
   406	
   407		parent_domain = irq_find_host(parent);
   408		if (!parent_domain) {
   409			dev_err(dev, "failed to find MPM parent domain\n");
   410			ret = -ENXIO;
   411			goto free_mbox;
   412		}
   413	
   414		priv->domain = irq_domain_create_hierarchy(parent_domain,
   415					IRQ_DOMAIN_FLAG_QCOM_MPM_WAKEUP, pin_num,
   416					of_node_to_fwnode(np), &qcom_mpm_ops, priv);
   417		if (!priv->domain) {
   418			dev_err(dev, "failed to create MPM domain\n");
   419			ret = -ENOMEM;
   420			goto free_mbox;
   421		}
   422	
   423		irq_domain_update_bus_token(priv->domain, DOMAIN_BUS_WAKEUP);
   424	
 > 425		ret = devm_request_irq(dev, irq, qcom_mpm_handler,
 > 426				       IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND,
   427				       "qcom_mpm", priv);
   428		if (ret) {
   429			dev_err(dev, "failed to request irq: %d\n", ret);
   430			goto remove_domain;
   431		}
   432	
   433		priv->pm_nb.notifier_call = qcom_mpm_cpu_pm_callback;
   434		cpu_pm_register_notifier(&priv->pm_nb);
   435	
   436		dev_set_drvdata(dev, priv);
   437	
   438		return 0;
   439	
   440	remove_domain:
   441		irq_domain_remove(priv->domain);
   442	free_mbox:
   443		mbox_free_channel(priv->mbox_chan);
   444		return ret;
   445	}
   446	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux