慢慢欣赏linux 继续深入学习x86中断3 pch中断

12 篇文章 2 订阅
2 篇文章 0 订阅
int pch_gpio_probe(struct pci_dev *pdev,
				    const struct pci_device_id *id)
{
	struct pch_gpio *chip = kzalloc(sizeof(*chip), GFP_KERNEL);
	int irq_base;
	
	chip->dev = &pdev->dev;
	ret = pci_enable_device(pdev);	
	ret = pci_request_regions(pdev, KBUILD_MODNAME);	
	chip->base = pci_iomap(pdev, 1, 0);
	
	chip->reg = chip->base;
	pci_set_drvdata(pdev, chip);
	
	pch_gpio_setup(chip);
	ret = gpiochip_add_data(&chip->gpio, chip);
	
	irq_base = devm_irq_alloc_descs(&pdev->dev, -1, 0,
					gpio_pins[chip->ioh], NUMA_NO_NODE);	// 有可能静态分配irq_desc 或者动态 kmalloc 申请
	
	chip->irq_base = irq_base;

	/* Mask all interrupts, but enable them */
	msk = (1 << gpio_pins[chip->ioh]) - 1;
	iowrite32(msk, &chip->reg->imask);
	iowrite32(msk, &chip->reg->ien);
	
	ret = devm_request_irq(&pdev->dev, pdev->irq, pch_gpio_handler,
			       IRQF_SHARED, KBUILD_MODNAME, chip);
				   
	ret = pch_gpio_alloc_generic_chip(chip, irq_base,
					  gpio_pins[chip->ioh]);
	=>int pch_gpio_alloc_generic_chip(struct pch_gpio *chip,
				       unsigned int irq_start,
				       unsigned int num)
	{
		struct irq_chip_generic *gc = devm_irq_alloc_generic_chip(chip->dev, "pch_gpio", 1, irq_start,
					 chip->base, handle_simple_irq);
		struct irq_chip_type *ct = gc->chip_types;
		gc->private = chip;

		ct->chip.irq_ack = pch_irq_ack;
		ct->chip.irq_mask = pch_irq_mask;
		ct->chip.irq_unmask = pch_irq_unmask;
		ct->chip.irq_set_type = pch_irq_type;

		rv = devm_irq_setup_generic_chip(chip->dev, gc, IRQ_MSK(num),
						 IRQ_GC_INIT_MASK_CACHE,
						 IRQ_NOREQUEST | IRQ_NOPROBE, 0);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值