linux网卡驱动irq,Linux驱动--request_irq

err =request_irq(irq, button_interrupt, IRQ_TYPE_EDGE_BOTH,

buttons[i].name, (void *)&buttons[i]);static inline int __must_check request_irq(unsigned intirq,

irq_handler_t handler, unsignedlong flags,const char *name,void *dev)

{returnrequest_threaded_irq(irq, handler, NULL, flags, name, dev);

##/**

* request_threaded_irq - allocate an interrupt line

* @irq: Interrupt line to allocate

* @handler: Function to be called when the IRQ occurs.

* Primary handler for threaded interrupts

* If NULL and thread_fn != NULL the default

* primary handler is installed

* @thread_fn: Function called from the irq handler thread

* If NULL, no irq thread is created

* @irqflags: Interrupt type flags

* @devname: An ascii name for the claiming device

* @dev_id: A cookie passed back to the handler function*/

int request_threaded_irq(unsigned intirq, irq_handler_t handler,

irq_handler_t thread_fn, unsignedlongirqflags,const char *devname, void *dev_id)

{struct irqaction *action;struct irq_desc *desc;intretval;/** Sanity-check: shared interrupts must pass in a real dev-ID,

* otherwise we'll have trouble later trying to figure out

* which interrupt is which (messes up the interrupt freeing

* logic etc).*/

if ((irqflags & IRQF_SHARED) && !dev_id)return -EINVAL;

desc=irq_to_desc(irq);

####define NR_IRQS (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1)

//IRQ_EINT(31) = 160 +31-16 = 175

#define S5P_GPIOINT_COUNT (S5P_GPIOINT_GROUP_COUNT * S5P_GPIOINT_GROUP_SIZE)

#define S5P_GPIOINT_GROUP_COUNT 4

#define S5P_GPIOINT_GROUP_SIZE 8

//#define S5P_GPIOINT_COUNT 12

#define NR_IRQS (175+12+ 1)

//#define NR_IRQS 188

####

#ifndef CONFIG_SPARSE_IRQextern structirq_desc irq_desc[NR_IRQS];#endif####struct irq_desc *irq_to_desc(unsigned intirq)

{return (irq < NR_IRQS) ? irq_desc +irq : NULL;

}//desc = irq_desc[irq]//irqdesc.c

#else /* !CONFIG_SPARSE_IRQ */

struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp ={

[0 ... NR_IRQS-1] ={

.handle_irq=handle_bad_irq,

.depth= 1,

.lock = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock),

}

}

###if (!desc)return -EINVAL;

###static inline bool irq_settings_can_request(struct irq_desc *desc)

{return !(desc->status_use_accessors &_IRQ_NOREQUEST);

}

###if (!irq_settings_can_request(desc))return -EINVAL;if (!handler) {if (!thread_fn)return -EINVAL;

handler=irq_default_primary_handler;

}

action= kzalloc(sizeof(structirqaction), GFP_KERNEL);

###/**

* struct irqaction - per interrupt action descriptor

* @handler: interrupt handler function

* @flags: flags (see IRQF_* above)

* @name: name of the device

* @dev_id: cookie to identify the device

* @next: pointer to the next irqaction for shared interrupts

* @irq: interrupt number

* @dir: pointer to the proc/irq/NN/name entry

* @thread_fn: interrupt handler function for threaded interrupts

* @thread: thread pointer for threaded interrupts

* @thread_flags: flags related to @thread

* @thread_mask: bitmask for keeping track of @thread activity*/

structirqaction {

irq_handler_t handler;

unsignedlongflags;void *dev_id;struct irqaction *next;intirq;

irq_handler_t thread_fn;struct task_struct *thread;

unsignedlongthread_flags;

unsignedlongthread_mask;const char *name;struct proc_dir_entry *dir;

} ____cacheline_internodealigned_in_smp;

###if (!action)return -ENOMEM;

action->handler =handler;

action->thread_fn =thread_fn;

action->flags =irqflags;

action->name =devname;

action->dev_id =dev_id;

chip_bus_lock(desc);

retval=__setup_irq(irq, desc, action);

###static int__setup_irq(unsignedint irq, struct irq_desc *desc,struct irqaction *new)

{

register_irq_proc(irq, desc);new->dir =NULL;

register_handler_proc(irq,new);

free_cpumask_var(mask);return 0;

}

###

chip_bus_sync_unlock(desc);if(retval)

kfree(action);returnretval;

}

##

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值