这篇教程C++ EXPORT_SYMBOL_GPL函数代码示例写得很实用,希望能帮到您。
本文整理汇总了C++中EXPORT_SYMBOL_GPL函数的典型用法代码示例。如果您正苦于以下问题:C++ EXPORT_SYMBOL_GPL函数的具体用法?C++ EXPORT_SYMBOL_GPL怎么用?C++ EXPORT_SYMBOL_GPL使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。 在下文中一共展示了EXPORT_SYMBOL_GPL函数的26个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。 示例1: hns_roce_alloc_pdint hns_roce_alloc_pd(struct ib_pd *ibpd, struct ib_ucontext *context, struct ib_udata *udata){ struct ib_device *ib_dev = ibpd->device; struct hns_roce_dev *hr_dev = to_hr_dev(ib_dev); struct device *dev = hr_dev->dev; struct hns_roce_pd *pd = to_hr_pd(ibpd); int ret; ret = hns_roce_pd_alloc(to_hr_dev(ib_dev), &pd->pdn); if (ret) { dev_err(dev, "[alloc_pd]hns_roce_pd_alloc failed!/n"); return ret; } if (context) { struct hns_roce_ib_alloc_pd_resp uresp = {.pdn = pd->pdn}; if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { hns_roce_pd_free(to_hr_dev(ib_dev), pd->pdn); dev_err(dev, "[alloc_pd]ib_copy_to_udata failed!/n"); return -EFAULT; } } return 0;}EXPORT_SYMBOL_GPL(hns_roce_alloc_pd);void hns_roce_dealloc_pd(struct ib_pd *pd){ hns_roce_pd_free(to_hr_dev(pd->device), to_hr_pd(pd)->pdn);}
开发者ID:Anjali05,项目名称:linux,代码行数:33,
示例2: ERR_PTR/* * Set up a pNFS Data Server client over NFSv3. * * Return any existing nfs_client that matches server address,port,version * and minorversion. * * For a new nfs_client, use a soft mount (default), a low retrans and a * low timeout interval so that if a connection is lost, we retry through * the MDS. */struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv, const struct sockaddr *ds_addr, int ds_addrlen, int ds_proto, unsigned int ds_timeo, unsigned int ds_retrans){ struct rpc_timeout ds_timeout; struct nfs_client *mds_clp = mds_srv->nfs_client; struct nfs_client_initdata cl_init = { .addr = ds_addr, .addrlen = ds_addrlen, .nodename = mds_clp->cl_rpcclient->cl_nodename, .ip_addr = mds_clp->cl_ipaddr, .nfs_mod = &nfs_v3, .proto = ds_proto, .net = mds_clp->cl_net, .timeparms = &ds_timeout, .cred = mds_srv->cred, }; struct nfs_client *clp; char buf[INET6_ADDRSTRLEN + 1]; /* fake a hostname because lockd wants it */ if (rpc_ntop(ds_addr, buf, sizeof(buf)) <= 0) return ERR_PTR(-EINVAL); cl_init.hostname = buf; if (mds_srv->flags & NFS_MOUNT_NORESVPORT) set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); /* Use the MDS nfs_client cl_ipaddr. */ nfs_init_timeout_values(&ds_timeout, ds_proto, ds_timeo, ds_retrans); clp = nfs_get_client(&cl_init); return clp;}EXPORT_SYMBOL_GPL(nfs3_set_ds_client);
开发者ID:avagin,项目名称:linux,代码行数:45,
示例3: gcore_input_report_keyvoid gcore_input_report_key(struct gcore_data *gdata, int scancode, int value){ struct input_dev *idev = gdata->input_dev; int error; struct input_keymap_entry ke = { .flags = 0, .len = sizeof(scancode), }; *((int *) ke.scancode) = scancode; error = input_get_keycode(idev, &ke); if (!error && ke.keycode != KEY_UNKNOWN && ke.keycode != KEY_RESERVED) { /* Only report mapped keys */ input_report_key(idev, ke.keycode, value); } else if (!!value) { /* Or report MSC_SCAN on keypress of an unmapped key */ input_event(idev, EV_MSC, MSC_SCAN, scancode); }}EXPORT_SYMBOL_GPL(gcore_input_report_key);void gcore_input_remove(struct gcore_data *gdata){ input_unregister_device(gdata->input_dev); kfree(gdata->input_dev->keycode);}
开发者ID:anomaly256,项目名称:lg4l,代码行数:28,
示例4: dax_zero_page_range/** * dax_zero_page_range - zero a range within a page of a DAX file * @inode: The file being truncated * @from: The file offset that is being truncated to * @length: The number of bytes to zero * @get_block: The filesystem method used to translate file offsets to blocks * * This function can be called by a filesystem when it is zeroing part of a * page in a DAX file. This is intended for hole-punch operations. If * you are truncating a file, the helper function dax_truncate_page() may be * more convenient. * * We work in terms of PAGE_SIZE here for commonality with * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem * took care of disposing of the unnecessary blocks. Even if the filesystem * block size is smaller than PAGE_SIZE, we have to zero the rest of the page * since the file might be mmapped. */int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, get_block_t get_block){ struct buffer_head bh; pgoff_t index = from >> PAGE_SHIFT; unsigned offset = from & (PAGE_SIZE-1); int err; /* Block boundary? Nothing to do */ if (!length) return 0; BUG_ON((offset + length) > PAGE_SIZE); memset(&bh, 0, sizeof(bh)); bh.b_bdev = inode->i_sb->s_bdev; bh.b_size = PAGE_SIZE; err = get_block(inode, index, &bh, 0); if (err < 0) return err; if (buffer_written(&bh)) { struct block_device *bdev = bh.b_bdev; struct blk_dax_ctl dax = { .sector = to_sector(&bh, inode), .size = PAGE_SIZE, }; if (dax_map_atomic(bdev, &dax) < 0) return PTR_ERR(dax.addr); clear_pmem(dax.addr + offset, length); wmb_pmem(); dax_unmap_atomic(bdev, &dax); } return 0;}EXPORT_SYMBOL_GPL(dax_zero_page_range);/** * dax_truncate_page - handle a partial page being truncated in a DAX file * @inode: The file being truncated * @from: The file offset that is being truncated to * @get_block: The filesystem method used to translate file offsets to blocks * * Similar to block_truncate_page(), this function can be called by a * filesystem when it is truncating a DAX file to handle the partial page. * * We work in terms of PAGE_SIZE here for commonality with * block_truncate_page(), but we could go down to PAGE_SIZE if the filesystem * took care of disposing of the unnecessary blocks. Even if the filesystem * block size is smaller than PAGE_SIZE, we have to zero the rest of the page * since the file might be mmapped. */int dax_truncate_page(struct inode *inode, loff_t from, get_block_t get_block){ unsigned length = PAGE_ALIGN(from) - from; return dax_zero_page_range(inode, from, length, get_block);}
开发者ID:020gzh,项目名称:linux,代码行数:75,
示例5: ad_sd_write_reg/** * ad_sd_write_reg() - Write a register * * @sigma_delta: The sigma delta device * @reg: Address of the register * @size: Size of the register (0-3) * @val: Value to write to the register * * Returns 0 on success, an error code otherwise. **/int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, unsigned int size, unsigned int val){ uint8_t *data = sigma_delta->data; struct spi_transfer t = { .tx_buf = data, .len = size + 1, .cs_change = sigma_delta->bus_locked, }; struct spi_message m; int ret; data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm; switch (size) { case 3: data[1] = val >> 16; data[2] = val >> 8; data[3] = val; break; case 2: put_unaligned_be16(val, &data[1]); break; case 1: data[1] = val; break; case 0: break; default: return -EINVAL; } spi_message_init(&m); spi_message_add_tail(&t, &m); if (sigma_delta->bus_locked) ret = spi_sync_locked(sigma_delta->spi, &m); else ret = spi_sync(sigma_delta->spi, &m); return ret;}EXPORT_SYMBOL_GPL(ad_sd_write_reg);static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta, unsigned int reg, unsigned int size, uint8_t *val){ uint8_t *data = sigma_delta->data; int ret; struct spi_transfer t[] = { { .tx_buf = data, .len = 1, }, { .rx_buf = val,
开发者ID:Lyude,项目名称:linux,代码行数:65,
示例6: rave_sp_execint rave_sp_exec(struct rave_sp *sp, void *__data, size_t data_size, void *reply_data, size_t reply_data_size){ struct rave_sp_reply reply = { .data = reply_data, .length = reply_data_size, .received = COMPLETION_INITIALIZER_ONSTACK(reply.received), }; unsigned char *data = __data; int command, ret = 0; u8 ackid; command = sp->variant->cmd.translate(data[0]); if (command < 0) return command; ackid = atomic_inc_return(&sp->ackid); reply.ackid = ackid; reply.code = rave_sp_reply_code((u8)command), mutex_lock(&sp->bus_lock); mutex_lock(&sp->reply_lock); sp->reply = &reply; mutex_unlock(&sp->reply_lock); data[0] = command; data[1] = ackid; rave_sp_write(sp, data, data_size); if (!wait_for_completion_timeout(&reply.received, HZ)) { dev_err(&sp->serdev->dev, "Command timeout/n"); ret = -ETIMEDOUT; mutex_lock(&sp->reply_lock); sp->reply = NULL; mutex_unlock(&sp->reply_lock); } mutex_unlock(&sp->bus_lock); return ret;}EXPORT_SYMBOL_GPL(rave_sp_exec);static void rave_sp_receive_event(struct rave_sp *sp, const unsigned char *data, size_t length){ u8 cmd[] = { [0] = rave_sp_reply_code(data[0]), [1] = data[1], };
开发者ID:AlexShiLucky,项目名称:linux,代码行数:53,
示例7: save_stack_trace_tskvoid save_stack_trace_tsk(struct task_struct *task, struct stack_trace *trace){ struct stack_trace_data trace_data = { .trace = trace, .skip = trace->skip, }; walk_stackframe(stack_pointer(task), stack_trace_cb, &trace_data);}EXPORT_SYMBOL_GPL(save_stack_trace_tsk);void save_stack_trace(struct stack_trace *trace){ save_stack_trace_tsk(current, trace);}
开发者ID:03199618,项目名称:linux,代码行数:14,
示例8: ERR_PTR/** * nfs_do_submount - set up mountpoint when crossing a filesystem boundary * @dentry - parent directory * @fh - filehandle for new root dentry * @fattr - attributes for new root inode * @authflavor - security flavor to use when performing the mount * */struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr, rpc_authflavor_t authflavor){ struct nfs_clone_mount mountdata = { .sb = dentry->d_sb, .dentry = dentry, .fh = fh, .fattr = fattr, .authflavor = authflavor, }; struct vfsmount *mnt = ERR_PTR(-ENOMEM); char *page = (char *) __get_free_page(GFP_USER); char *devname; dprintk("--> nfs_do_submount()/n"); dprintk("%s: submounting on %s/%s/n", __func__, dentry->d_parent->d_name.name, dentry->d_name.name); if (page == NULL) goto out; devname = nfs_devname(dentry, page, PAGE_SIZE); mnt = (struct vfsmount *)devname; if (IS_ERR(devname)) goto free_page; mnt = nfs_do_clone_mount(NFS_SB(dentry->d_sb), devname, &mountdata);free_page: free_page((unsigned long)page);out: dprintk("%s: done/n", __func__); dprintk("<-- nfs_do_submount() = %p/n", mnt); return mnt;}EXPORT_SYMBOL_GPL(nfs_do_submount);struct vfsmount *nfs_submount(struct nfs_server *server, struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr){ int err; struct dentry *parent = dget_parent(dentry); /* Look it up again to get its attributes */ err = server->nfs_client->rpc_ops->lookup(parent->d_inode, &dentry->d_name, fh, fattr); dput(parent); if (err != 0) return ERR_PTR(err); return nfs_do_submount(dentry, fh, fattr, server->client->cl_auth->au_flavor);}
开发者ID:ARMWorks,项目名称:FA_2451_Linux_Kernel,代码行数:58,
示例9: rtnl_put_cacheinfoint rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst, u32 id, u32 ts, u32 tsage, long expires, u32 error){ struct rta_cacheinfo ci = { .rta_lastuse = jiffies_to_clock_t(jiffies - dst->lastuse), .rta_used = dst->__use, .rta_clntref = atomic_read(&(dst->__refcnt)), .rta_error = error, .rta_id = id, .rta_ts = ts, .rta_tsage = tsage, }; if (expires) ci.rta_expires = jiffies_to_clock_t(expires); return nla_put(skb, RTA_CACHEINFO, sizeof(ci), &ci);}EXPORT_SYMBOL_GPL(rtnl_put_cacheinfo);static void set_operstate(struct net_device *dev, unsigned char transition){ unsigned char operstate = dev->operstate; switch(transition) { case IF_OPER_UP: if ((operstate == IF_OPER_DORMANT || operstate == IF_OPER_UNKNOWN) && !netif_dormant(dev)) operstate = IF_OPER_UP; break; case IF_OPER_DORMANT: if (operstate == IF_OPER_UP || operstate == IF_OPER_UNKNOWN) operstate = IF_OPER_DORMANT; break; } if (dev->operstate != operstate) { write_lock_bh(&dev_base_lock); dev->operstate = operstate; write_unlock_bh(&dev_base_lock); netdev_state_change(dev); }}
开发者ID:ruigulala,项目名称:helgrind_uml,代码行数:47,
示例10: pmf_get_detectstatic int pmf_get_detect(struct gpio_runtime *rt, enum notify_type type){ char *name; int err = -EBUSY, ret; struct pmf_args args = { .count = 1, .u[0].p = &ret }; switch (type) { case AOA_NOTIFY_HEADPHONE: name = "headphone-detect"; break; case AOA_NOTIFY_LINE_IN: name = "linein-detect"; break; case AOA_NOTIFY_LINE_OUT: name = "lineout-detect"; break; default: return -EINVAL; } err = pmf_call_function(rt->node, name, &args); if (err) return err; return ret;}static struct gpio_methods methods = { .init = pmf_gpio_init, .exit = pmf_gpio_exit, .all_amps_off = pmf_gpio_all_amps_off, .all_amps_restore = pmf_gpio_all_amps_restore, .set_headphone = pmf_gpio_set_headphone, .set_speakers = pmf_gpio_set_amp, .set_lineout = pmf_gpio_set_lineout, .set_hw_reset = pmf_gpio_set_hw_reset, .get_headphone = pmf_gpio_get_headphone, .get_speakers = pmf_gpio_get_amp, .get_lineout = pmf_gpio_get_lineout, .set_notify = pmf_set_notify, .get_detect = pmf_get_detect,};struct gpio_methods *pmf_gpio_methods = &methods;EXPORT_SYMBOL_GPL(pmf_gpio_methods);
开发者ID:CSCLOG,项目名称:beaglebone,代码行数:45,
示例11: tcp_vegas_get_info/* Extract info for Tcp socket info provided via netlink. */void tcp_vegas_get_info(struct sock *sk, u32 ext, struct sk_buff *skb){ const struct vegas *ca = inet_csk_ca(sk); if (ext & (1 << (INET_DIAG_VEGASINFO - 1))) { struct tcpvegas_info info = { .tcpv_enabled = ca->doing_vegas_now, .tcpv_rttcnt = ca->cntRTT, .tcpv_rtt = ca->baseRTT, .tcpv_minrtt = ca->minRTT, }; nla_put(skb, INET_DIAG_VEGASINFO, sizeof(info), &info); }}EXPORT_SYMBOL_GPL(tcp_vegas_get_info);static struct tcp_congestion_ops tcp_vegas __read_mostly = { .flags = TCP_CONG_RTT_STAMP, .init = tcp_vegas_init, .ssthresh = tcp_reno_ssthresh, .cong_avoid = tcp_vegas_cong_avoid, .min_cwnd = tcp_reno_min_cwnd, .pkts_acked = tcp_vegas_pkts_acked, .set_state = tcp_vegas_state, .cwnd_event = tcp_vegas_cwnd_event, .get_info = tcp_vegas_get_info, .owner = THIS_MODULE, .name = "vegas",};static int __init tcp_vegas_register(void){ BUILD_BUG_ON(sizeof(struct vegas) > ICSK_CA_PRIV_SIZE); tcp_register_congestion_control(&tcp_vegas); return 0;}static void __exit tcp_vegas_unregister(void){ tcp_unregister_congestion_control(&tcp_vegas);}
开发者ID:CSCLOG,项目名称:beaglebone,代码行数:43,
示例12: __get_free_page/** * nfs_do_submount - set up mountpoint when crossing a filesystem boundary * @dentry - parent directory * @fh - filehandle for new root dentry * @fattr - attributes for new root inode * @authflavor - security flavor to use when performing the mount * */struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr, rpc_authflavor_t authflavor){ struct nfs_clone_mount mountdata = { .sb = dentry->d_sb, .dentry = dentry, .fh = fh, .fattr = fattr, .authflavor = authflavor, }; struct vfsmount *mnt; char *page = (char *) __get_free_page(GFP_USER); char *devname; if (page == NULL) return ERR_PTR(-ENOMEM); devname = nfs_devname(dentry, page, PAGE_SIZE); if (IS_ERR(devname)) mnt = (struct vfsmount *)devname; else mnt = nfs_do_clone_mount(NFS_SB(dentry->d_sb), devname, &mountdata); free_page((unsigned long)page); return mnt;}EXPORT_SYMBOL_GPL(nfs_do_submount);struct vfsmount *nfs_submount(struct nfs_server *server, struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr){ int err; struct dentry *parent = dget_parent(dentry); /* Look it up again to get its attributes */ err = server->nfs_client->rpc_ops->lookup(d_inode(parent), &dentry->d_name, fh, fattr, NULL); dput(parent); if (err != 0) return ERR_PTR(err); return nfs_do_submount(dentry, fh, fattr, server->client->cl_auth->au_flavor);}
开发者ID:rldleblanc,项目名称:linux,代码行数:50,
示例13: xen_free_vm_areavoid xen_free_vm_area(struct vm_struct *area){ unsigned int order = get_order(area->size); unsigned long i; unsigned long phys_addr = __pa(area->addr); /* This area is used for foreign page mappping. * So underlying machine page may not be assigned. */ for (i = 0; i < (1 << order); i++) { unsigned long ret; unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i; struct xen_memory_reservation reservation = { .nr_extents = 1, .address_bits = 0, .extent_order = 0, .domid = DOMID_SELF }; set_xen_guest_handle(reservation.extent_start, &gpfn); ret = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); BUG_ON(ret != 1); } free_pages((unsigned long)area->addr, order); kfree(area);}EXPORT_SYMBOL_GPL(xen_free_vm_area);/**************************************************************************** * grant table hack * cmd: GNTTABOP_xxx */int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, unsigned long max_nr_gframes, struct grant_entry **__shared){ *__shared = __va(frames[0] << PAGE_SHIFT); return 0;}
开发者ID:10x-Amin,项目名称:nAa-kernel,代码行数:40,
示例14: mars_digestvoid mars_digest(unsigned char *digest, void *data, int len){ struct hash_desc desc = { .tfm = mars_tfm, .flags = 0, }; struct scatterlist sg; memset(digest, 0, mars_digest_size); // TODO: use per-thread instance, omit locking down(&tfm_sem); crypto_hash_init(&desc); sg_init_table(&sg, 1); sg_set_buf(&sg, data, len); crypto_hash_update(&desc, &sg, sg.length); crypto_hash_final(&desc, digest); up(&tfm_sem);}EXPORT_SYMBOL_GPL(mars_digest);void mref_checksum(struct mref_object *mref){ unsigned char checksum[mars_digest_size]; int len; if (mref->ref_cs_mode <= 0 || !mref->ref_data) return; mars_digest(checksum, mref->ref_data, mref->ref_len); len = sizeof(mref->ref_checksum); if (len > mars_digest_size) len = mars_digest_size; memcpy(&mref->ref_checksum, checksum, len);}
开发者ID:grpomega,项目名称:mars,代码行数:37,
示例15: stack_trace_save/** * stack_trace_save - Save a stack trace into a storage array * @store: Pointer to storage array * @size: Size of the storage array * @skipnr: Number of entries to skip at the start of the stack trace * * Return: Number of trace entries stored */unsigned int stack_trace_save(unsigned long *store, unsigned int size, unsigned int skipnr){ struct stack_trace trace = { .entries = store, .max_entries = size, .skip = skipnr + 1, }; save_stack_trace(&trace); return trace.nr_entries;}EXPORT_SYMBOL_GPL(stack_trace_save);/** * stack_trace_save_tsk - Save a task stack trace into a storage array * @task: The task to examine * @store: Pointer to storage array * @size: Size of the storage array * @skipnr: Number of entries to skip at the start of the stack trace * * Return: Number of trace entries stored */unsigned int stack_trace_save_tsk(struct task_struct *task, unsigned long *store, unsigned int size, unsigned int skipnr){ struct stack_trace trace = { .entries = store, .max_entries = size, .skip = skipnr + 1, }; save_stack_trace_tsk(task, &trace); return trace.nr_entries;}/** * stack_trace_save_regs - Save a stack trace based on pt_regs into a storage array * @regs: Pointer to pt_regs to examine * @store: Pointer to storage array * @size: Size of the storage array * @skipnr: Number of entries to skip at the start of the stack trace * * Return: Number of trace entries stored */unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store, unsigned int size, unsigned int skipnr){ struct stack_trace trace = { .entries = store, .max_entries = size, .skip = skipnr, }; save_stack_trace_regs(regs, &trace); return trace.nr_entries;}#ifdef CONFIG_HAVE_RELIABLE_STACKTRACE/** * stack_trace_save_tsk_reliable - Save task stack with verification * @tsk: Pointer to the task to examine * @store: Pointer to storage array * @size: Size of the storage array * * Return: An error if it detects any unreliable features of the * stack. Otherwise it guarantees that the stack trace is * reliable and returns the number of entries stored. * * If the task is not 'current', the caller *must* ensure the task is inactive. */int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store, unsigned int size){ struct stack_trace trace = { .entries = store, .max_entries = size, }; int ret = save_stack_trace_tsk_reliable(tsk, &trace); return ret ? ret : trace.nr_entries;}#endif#ifdef CONFIG_USER_STACKTRACE_SUPPORT/** * stack_trace_save_user - Save a user space stack trace into a storage array * @store: Pointer to storage array * @size: Size of the storage array * * Return: Number of trace entries stored//.........这里部分代码省略.........
开发者ID:avagin,项目名称:linux,代码行数:101,
示例16: __dax_pmd_fault//.........这里部分代码省略......... dax_unmap_atomic(bdev, &dax); goto fallback; } if (pfn_t_to_pfn(dax.pfn) & PG_PMD_COLOUR) { dax_pmd_dbg(&bh, address, "pfn unaligned"); dax_unmap_atomic(bdev, &dax); goto fallback; } if (!pfn_t_devmap(dax.pfn)) { dax_unmap_atomic(bdev, &dax); dax_pmd_dbg(&bh, address, "pfn not in memmap"); goto fallback; } if (buffer_unwritten(&bh) || buffer_new(&bh)) { clear_pmem(dax.addr, PMD_SIZE); wmb_pmem(); count_vm_event(PGMAJFAULT); mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); result |= VM_FAULT_MAJOR; } dax_unmap_atomic(bdev, &dax); /* * For PTE faults we insert a radix tree entry for reads, and * leave it clean. Then on the first write we dirty the radix * tree entry via the dax_pfn_mkwrite() path. This sequence * allows the dax_pfn_mkwrite() call to be simpler and avoid a * call into get_block() to translate the pgoff to a sector in * order to be able to create a new radix tree entry. * * The PMD path doesn't have an equivalent to * dax_pfn_mkwrite(), though, so for a read followed by a * write we traverse all the way through __dax_pmd_fault() * twice. This means we can just skip inserting a radix tree * entry completely on the initial read and just wait until * the write to insert a dirty entry. */ if (write) { error = dax_radix_entry(mapping, pgoff, dax.sector, true, true); if (error) { dax_pmd_dbg(&bh, address, "PMD radix insertion failed"); goto fallback; } } dev_dbg(part_to_dev(bdev->bd_part), "%s: %s addr: %lx pfn: %lx sect: %llx/n", __func__, current->comm, address, pfn_t_to_pfn(dax.pfn), (unsigned long long) dax.sector); result |= vmf_insert_pfn_pmd(vma, address, pmd, dax.pfn, write); } out: i_mmap_unlock_read(mapping); if (buffer_unwritten(&bh)) complete_unwritten(&bh, !(result & VM_FAULT_ERROR)); return result; fallback: count_vm_event(THP_FAULT_FALLBACK); result = VM_FAULT_FALLBACK; goto out;}EXPORT_SYMBOL_GPL(__dax_pmd_fault);/** * dax_pmd_fault - handle a PMD fault on a DAX file * @vma: The virtual memory area where the fault occurred * @vmf: The description of the fault * @get_block: The filesystem method used to translate file offsets to blocks * * When a page fault occurs, filesystems may call this helper in their * pmd_fault handler for DAX files. */int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, unsigned int flags, get_block_t get_block, dax_iodone_t complete_unwritten){ int result; struct super_block *sb = file_inode(vma->vm_file)->i_sb; if (flags & FAULT_FLAG_WRITE) { sb_start_pagefault(sb); file_update_time(vma->vm_file); } result = __dax_pmd_fault(vma, address, pmd, flags, get_block, complete_unwritten); if (flags & FAULT_FLAG_WRITE) sb_end_pagefault(sb); return result;}
开发者ID:020gzh,项目名称:linux,代码行数:101,
示例17: alloc_pagesstruct page *read_dax_sector(struct block_device *bdev, sector_t n){ struct page *page = alloc_pages(GFP_KERNEL, 0); struct blk_dax_ctl dax = { .size = PAGE_SIZE, .sector = n & ~((((int) PAGE_SIZE) / 512) - 1), }; long rc; if (!page) return ERR_PTR(-ENOMEM); rc = dax_map_atomic(bdev, &dax); if (rc < 0) return ERR_PTR(rc); memcpy_from_pmem(page_address(page), dax.addr, PAGE_SIZE); dax_unmap_atomic(bdev, &dax); return page;}/* * dax_clear_sectors() is called from within transaction context from XFS, * and hence this means the stack from this point must follow GFP_NOFS * semantics for all operations. */int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size){ struct blk_dax_ctl dax = { .sector = _sector, .size = _size, }; might_sleep(); do { long count, sz; count = dax_map_atomic(bdev, &dax); if (count < 0) return count; sz = min_t(long, count, SZ_128K); clear_pmem(dax.addr, sz); dax.size -= sz; dax.sector += sz / 512; dax_unmap_atomic(bdev, &dax); cond_resched(); } while (dax.size); wmb_pmem(); return 0;}EXPORT_SYMBOL_GPL(dax_clear_sectors);/* the clear_pmem() calls are ordered by a wmb_pmem() in the caller */static void dax_new_buf(void __pmem *addr, unsigned size, unsigned first, loff_t pos, loff_t end){ loff_t final = end - pos + first; /* The final byte of the buffer */ if (first > 0) clear_pmem(addr, first); if (final < size) clear_pmem(addr + final, size - final);}
开发者ID:020gzh,项目名称:linux,代码行数:63,
示例18: copy_user_bh//.........这里部分代码省略......... entry = radix_tree_lookup(&mapping->page_tree, pmd_index); rcu_read_unlock(); /* see if the start of our range is covered by a PMD entry */ if (entry && RADIX_DAX_TYPE(entry) == RADIX_DAX_PMD) start_index = pmd_index; tag_pages_for_writeback(mapping, start_index, end_index); pagevec_init(&pvec, 0); while (!done) { pvec.nr = find_get_entries_tag(mapping, start_index, PAGECACHE_TAG_TOWRITE, PAGEVEC_SIZE, pvec.pages, indices); if (pvec.nr == 0) break; for (i = 0; i < pvec.nr; i++) { if (indices[i] > end_index) { done = true; break; } ret = dax_writeback_one(bdev, mapping, indices[i], pvec.pages[i]); if (ret < 0) return ret; } } wmb_pmem(); return 0;}EXPORT_SYMBOL_GPL(dax_writeback_mapping_range);static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, struct vm_area_struct *vma, struct vm_fault *vmf){ unsigned long vaddr = (unsigned long)vmf->virtual_address; struct address_space *mapping = inode->i_mapping; struct block_device *bdev = bh->b_bdev; struct blk_dax_ctl dax = { .sector = to_sector(bh, inode), .size = bh->b_size, }; pgoff_t size; int error; i_mmap_lock_read(mapping); /* * Check truncate didn't happen while we were allocating a block. * If it did, this block may or may not be still allocated to the * file. We can't tell the filesystem to free it because we can't * take i_mutex here. In the worst case, the file still has blocks * allocated past the end of the file. */ size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; if (unlikely(vmf->pgoff >= size)) { error = -EIO; goto out; } if (dax_map_atomic(bdev, &dax) < 0) { error = PTR_ERR(dax.addr); goto out;
开发者ID:020gzh,项目名称:linux,代码行数:67,
示例19: cpufreq_frequency_table_targetint cpufreq_frequency_table_target(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, unsigned int target_freq, unsigned int relation, unsigned int *index){ struct cpufreq_frequency_table optimal = { .index = ~0, .frequency = 0, }; struct cpufreq_frequency_table suboptimal = { .index = ~0, .frequency = 0, }; unsigned int diff, i = 0; pr_debug("request for target %u kHz (relation: %u) for cpu %u/n", target_freq, relation, policy->cpu); switch (relation) { case CPUFREQ_RELATION_H: suboptimal.frequency = ~0; break; case CPUFREQ_RELATION_L: case CPUFREQ_RELATION_C: optimal.frequency = ~0; break; } if (!cpu_online(policy->cpu)) return -EINVAL; for (i = 0; (table[i].frequency != CPUFREQ_TABLE_END); i++) { unsigned int freq = table[i].frequency; if (freq == CPUFREQ_ENTRY_INVALID) continue; if ((freq < policy->min) || (freq > policy->max)) continue; if (freq == target_freq) { optimal.index = i; break; } switch (relation) { case CPUFREQ_RELATION_H: if (freq < target_freq) { if (freq >= optimal.frequency) { optimal.frequency = freq; optimal.index = i; } } else { if (freq <= suboptimal.frequency) { suboptimal.frequency = freq; suboptimal.index = i; } } break; case CPUFREQ_RELATION_L: if (freq > target_freq) { if (freq <= optimal.frequency) { optimal.frequency = freq; optimal.index = i; } } else { if (freq >= suboptimal.frequency) { suboptimal.frequency = freq; suboptimal.index = i; } } break; case CPUFREQ_RELATION_C: diff = abs(freq - target_freq); if (diff < optimal.frequency || (diff == optimal.frequency && freq > table[optimal.index].frequency)) { optimal.frequency = diff; optimal.index = i; } break; } } if (optimal.index > i) { if (suboptimal.index > i) return -EINVAL; *index = suboptimal.index; } else *index = optimal.index; pr_debug("target is %u (%u kHz, %u)/n", *index, table[*index].frequency, table[*index].index); return 0;}EXPORT_SYMBOL_GPL(cpufreq_frequency_table_target);static DEFINE_PER_CPU(struct cpufreq_frequency_table *, cpufreq_show_table);/** * show_available_freqs - show available frequencies for the specified CPU */static ssize_t show_available_freqs(struct cpufreq_policy *policy, char *buf){//.........这里部分代码省略.........
开发者ID:davidnguyenwm,项目名称:Hulk-Kernel,代码行数:101,
示例20: xenbus_map_ring_valloc/** * xenbus_map_ring_valloc * @dev: xenbus device * @gnt_ref: grant reference * @vaddr: pointer to address to be filled out by mapping * * Based on Rusty Russell's skeleton driver's map_page. * Map a page of memory into this domain from another domain's grant table. * xenbus_map_ring_valloc allocates a page of virtual address space, maps the * page to that address, and sets *vaddr to that address. * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h) * or -ENOMEM on error. If an error is returned, device will switch to * XenbusStateClosing and the error message will be saved in XenStore. */int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr){ struct gnttab_map_grant_ref op = { .flags = GNTMAP_host_map, .ref = gnt_ref, .dom = dev->otherend_id, }; struct vm_struct *area; *vaddr = NULL; area = xen_alloc_vm_area(PAGE_SIZE); if (!area) return -ENOMEM; op.host_addr = (unsigned long)area->addr; if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)) BUG(); if (op.status != GNTST_okay) { xen_free_vm_area(area); xenbus_dev_fatal(dev, op.status, "mapping in shared page %d from domain %d", gnt_ref, dev->otherend_id); return op.status; } /* Stuff the handle in an unused field */ area->phys_addr = (unsigned long)op.handle; *vaddr = area->addr; return 0;}EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);/** * xenbus_map_ring * @dev: xenbus device * @gnt_ref: grant reference * @handle: pointer to grant handle to be filled * @vaddr: address to be mapped to * * Map a page of memory into this domain from another domain's grant table. * xenbus_map_ring does not allocate the virtual address space (you must do * this yourself!). It only maps in the page to the specified address. * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h) * or -ENOMEM on error. If an error is returned, device will switch to * XenbusStateClosing and the error message will be saved in XenStore. */int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref, grant_handle_t *handle, void *vaddr){ struct gnttab_map_grant_ref op = { .host_addr = (unsigned long)vaddr, .flags = GNTMAP_host_map, .ref = gnt_ref, .dom = dev->otherend_id, }; if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)) BUG(); if (op.status != GNTST_okay) { xenbus_dev_fatal(dev, op.status, "mapping in shared page %d from domain %d", gnt_ref, dev->otherend_id); } else *handle = op.handle; return op.status;}EXPORT_SYMBOL_GPL(xenbus_map_ring);/** * xenbus_unmap_ring_vfree * @dev: xenbus device * @vaddr: addr to unmap * * Based on Rusty Russell's skeleton driver's unmap_page. * Unmap a page of memory in this domain that was imported from another domain. * Use xenbus_unmap_ring_vfree if you mapped in your memory with * xenbus_map_ring_valloc (it will free the virtual address space). * Returns 0 on success and returns GNTST_* on error//.........这里部分代码省略.........
开发者ID:johnny,项目名称:CobraDroidBeta,代码行数:101,
示例21: cw1200_core_probeint cw1200_core_probe(const struct sbus_ops *sbus_ops, struct sbus_priv *sbus, struct device *pdev, struct cw1200_common **pself, u8 *mac_addr){ int err = -ENOMEM; u16 ctrl_reg; struct ieee80211_hw *dev; struct cw1200_common *priv; struct wsm_operational_mode mode = { .power_mode = wsm_power_mode_quiescent, .disableMoreFlagUsage = true, }; dev = cw1200_init_common(sizeof(struct cw1200_common), mac_addr); if (!dev) goto err; priv = dev->priv; priv->sbus_ops = sbus_ops; priv->sbus_priv = sbus; priv->pdev = pdev; SET_IEEE80211_DEV(priv->hw, pdev); /* WSM callbacks. */ priv->wsm_cbc.scan_complete = cw1200_scan_complete_cb; priv->wsm_cbc.tx_confirm = cw1200_tx_confirm_cb; priv->wsm_cbc.rx = cw1200_rx_cb; priv->wsm_cbc.suspend_resume = cw1200_suspend_resume; /* priv->wsm_cbc.set_pm_complete = cw1200_set_pm_complete_cb; */ priv->wsm_cbc.channel_switch = cw1200_channel_switch_cb; err = cw1200_register_bh(priv); if (err) goto err1; err = cw1200_load_firmware(priv); if (err) goto err2; priv->sbus_ops->lock(priv->sbus_priv); WARN_ON(priv->sbus_ops->set_block_size(priv->sbus_priv, SDIO_BLOCK_SIZE)); priv->sbus_ops->unlock(priv->sbus_priv); if (wait_event_interruptible_timeout(priv->wsm_startup_done, priv->wsm_caps.firmwareReady, 3*HZ) <= 0) { /* TODO: Needs to find how to reset device */ /* in QUEUE mode properly. */ goto err3; } WARN_ON(cw1200_reg_write_16(priv, ST90TDS_CONTROL_REG_ID, ST90TDS_CONT_WUP_BIT)); if (cw1200_reg_read_16(priv,ST90TDS_CONTROL_REG_ID, &ctrl_reg)) WARN_ON(cw1200_reg_read_16(priv,ST90TDS_CONTROL_REG_ID, &ctrl_reg)); WARN_ON(!(ctrl_reg & ST90TDS_CONT_RDY_BIT)); /* Set low-power mode. */ WARN_ON(wsm_set_operational_mode(priv, &mode)); /* Enable multi-TX confirmation */ WARN_ON(wsm_use_multi_tx_conf(priv, true)); err = cw1200_register_common(dev); if (err) { priv->sbus_ops->irq_unsubscribe(priv->sbus_priv); goto err3; } *pself = dev->priv; return err;err3: sbus_ops->reset(sbus);err2: cw1200_unregister_bh(priv);err1: cw1200_free_common(dev);err: return err;}EXPORT_SYMBOL_GPL(cw1200_core_probe);void cw1200_core_release(struct cw1200_common *self){ cw1200_unregister_common(self->hw); cw1200_free_common(self->hw); return;}
开发者ID:Meticulus,项目名称:vendor_st-ericsson_u8500,代码行数:95,
示例22: inet_sk_diag_fill//.........这里部分代码省略......... rcu_read_lock(); ca_ops = READ_ONCE(icsk->icsk_ca_ops); if (ca_ops) err = nla_put_string(skb, INET_DIAG_CONG, ca_ops->name); rcu_read_unlock(); if (err < 0) goto errout; } handler->idiag_get_info(sk, r, info); if (sk->sk_state < TCP_TIME_WAIT) { union tcp_cc_info info; size_t sz = 0; int attr; rcu_read_lock(); ca_ops = READ_ONCE(icsk->icsk_ca_ops); if (ca_ops && ca_ops->get_info) sz = ca_ops->get_info(sk, ext, &attr, &info); rcu_read_unlock(); if (sz && nla_put(skb, attr, sz, &info) < 0) goto errout; }out: nlmsg_end(skb, nlh); return 0;errout: nlmsg_cancel(skb, nlh); return -EMSGSIZE;}EXPORT_SYMBOL_GPL(inet_sk_diag_fill);static int inet_csk_diag_fill(struct sock *sk, struct sk_buff *skb, const struct inet_diag_req_v2 *req, struct user_namespace *user_ns, u32 portid, u32 seq, u16 nlmsg_flags, const struct nlmsghdr *unlh){ return inet_sk_diag_fill(sk, inet_csk(sk), skb, req, user_ns, portid, seq, nlmsg_flags, unlh);}static int inet_twsk_diag_fill(struct sock *sk, struct sk_buff *skb, u32 portid, u32 seq, u16 nlmsg_flags, const struct nlmsghdr *unlh){ struct inet_timewait_sock *tw = inet_twsk(sk); struct inet_diag_msg *r; struct nlmsghdr *nlh; long tmo; nlh = nlmsg_put(skb, portid, seq, unlh->nlmsg_type, sizeof(*r), nlmsg_flags); if (!nlh) return -EMSGSIZE; r = nlmsg_data(nlh); BUG_ON(tw->tw_state != TCP_TIME_WAIT); tmo = tw->tw_timer.expires - jiffies; if (tmo < 0)
开发者ID:zefie,项目名称:nxt_andx86_kernel,代码行数:67,
示例23: can_fill_infostatic int can_fill_info(struct sk_buff *skb, const struct net_device *dev){ struct can_priv *priv = netdev_priv(dev); struct can_ctrlmode cm = {.flags = priv->ctrlmode}; struct can_berr_counter bec; enum can_state state = priv->state; if (priv->do_get_state) priv->do_get_state(dev, &state); NLA_PUT_U32(skb, IFLA_CAN_STATE, state); NLA_PUT(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm); NLA_PUT_U32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms); NLA_PUT(skb, IFLA_CAN_BITTIMING, sizeof(priv->bittiming), &priv->bittiming); NLA_PUT(skb, IFLA_CAN_CLOCK, sizeof(cm), &priv->clock); if (priv->do_get_berr_counter && !priv->do_get_berr_counter(dev, &bec)) NLA_PUT(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec); if (priv->bittiming_const) NLA_PUT(skb, IFLA_CAN_BITTIMING_CONST, sizeof(*priv->bittiming_const), priv->bittiming_const); return 0;nla_put_failure: return -EMSGSIZE;}static size_t can_get_xstats_size(const struct net_device *dev){ return sizeof(struct can_device_stats);}static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev){ struct can_priv *priv = netdev_priv(dev); NLA_PUT(skb, IFLA_INFO_XSTATS, sizeof(priv->can_stats), &priv->can_stats); return 0;nla_put_failure: return -EMSGSIZE;}static int can_newlink(struct net *src_net, struct net_device *dev, struct nlattr *tb[], struct nlattr *data[]){ return -EOPNOTSUPP;}static struct rtnl_link_ops can_link_ops __read_mostly = { .kind = "can", .maxtype = IFLA_CAN_MAX, .policy = can_policy, .setup = can_setup, .newlink = can_newlink, .changelink = can_changelink, .get_size = can_get_size, .fill_info = can_fill_info, .get_xstats_size = can_get_xstats_size, .fill_xstats = can_fill_xstats,};int register_candev(struct net_device *dev){ dev->rtnl_link_ops = &can_link_ops; return register_netdev(dev);}EXPORT_SYMBOL_GPL(register_candev);void unregister_candev(struct net_device *dev){ unregister_netdev(dev);}
开发者ID:DirtyDroidX,项目名称:android_kernel_htc_m8ul,代码行数:75,
示例24: async_encrypt//.........这里部分代码省略.........static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask){ struct blkcipher_alg *alg = &tfm->__crt_alg->cra_blkcipher; if (alg->ivsize > PAGE_SIZE / 8) return -EINVAL; if ((mask & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_MASK) return crypto_init_blkcipher_ops_sync(tfm); else return crypto_init_blkcipher_ops_async(tfm);}static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused));static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg){ seq_printf(m, "type : blkcipher/n"); seq_printf(m, "blocksize : %u/n", alg->cra_blocksize); seq_printf(m, "min keysize : %u/n", alg->cra_blkcipher.min_keysize); seq_printf(m, "max keysize : %u/n", alg->cra_blkcipher.max_keysize); seq_printf(m, "ivsize : %u/n", alg->cra_blkcipher.ivsize); seq_printf(m, "geniv : %s/n", alg->cra_blkcipher.geniv ?: "<default>");}const struct crypto_type crypto_blkcipher_type = { .ctxsize = crypto_blkcipher_ctxsize, .init = crypto_init_blkcipher_ops,#ifdef CONFIG_PROC_FS .show = crypto_blkcipher_show,#endif};EXPORT_SYMBOL_GPL(crypto_blkcipher_type);static int crypto_grab_nivcipher(struct crypto_skcipher_spawn *spawn, const char *name, u32 type, u32 mask){ struct crypto_alg *alg; int err; type = crypto_skcipher_type(type); mask = crypto_skcipher_mask(mask)| CRYPTO_ALG_GENIV; alg = crypto_alg_mod_lookup(name, type, mask); if (IS_ERR(alg)) return PTR_ERR(alg); err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask); crypto_mod_put(alg); return err;}struct crypto_instance *skcipher_geniv_alloc(struct crypto_template *tmpl, struct rtattr **tb, u32 type, u32 mask){ struct { int (*setkey)(struct crypto_ablkcipher *tfm, const u8 *key, unsigned int keylen); int (*encrypt)(struct ablkcipher_request *req); int (*decrypt)(struct ablkcipher_request *req); unsigned int min_keysize; unsigned int max_keysize; unsigned int ivsize;
开发者ID:1111saeid,项目名称:jb_kernel_3.0.16_htc_golfu,代码行数:67,
示例25: acpi_bus_osc_supportstatic void acpi_bus_osc_support(void){ u32 capbuf[2]; struct acpi_osc_context context = { .uuid_str = sb_uuid_str, .rev = 1, .cap.length = 8, .cap.pointer = capbuf, }; acpi_handle handle; capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE; capbuf[OSC_SUPPORT_TYPE] = OSC_SB_PR3_SUPPORT; /* _PR3 is in use */#if defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR) || / defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR_MODULE) capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_PAD_SUPPORT;#endif#if defined(CONFIG_ACPI_PROCESSOR) || defined(CONFIG_ACPI_PROCESSOR_MODULE) capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_PPC_OST_SUPPORT;#endif if (ACPI_FAILURE(acpi_get_handle(NULL, "//_SB", &handle))) return; if (ACPI_SUCCESS(acpi_run_osc(handle, &context))) kfree(context.ret.pointer); /* do we need to check the returned cap? Sounds no */}/* -------------------------------------------------------------------------- Event Management -------------------------------------------------------------------------- */#ifdef CONFIG_ACPI_PROC_EVENTstatic DEFINE_SPINLOCK(acpi_bus_event_lock);LIST_HEAD(acpi_bus_event_list);DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue);extern int event_is_open;int acpi_bus_generate_proc_event4(const char *device_class, const char *bus_id, u8 type, int data){ struct acpi_bus_event *event; unsigned long flags = 0; /* drop event on the floor if no one's listening */ if (!event_is_open) return 0; event = kzalloc(sizeof(struct acpi_bus_event), GFP_ATOMIC); if (!event) return -ENOMEM; strcpy(event->device_class, device_class); strcpy(event->bus_id, bus_id); event->type = type; event->data = data; spin_lock_irqsave(&acpi_bus_event_lock, flags); list_add_tail(&event->node, &acpi_bus_event_list); spin_unlock_irqrestore(&acpi_bus_event_lock, flags); wake_up_interruptible(&acpi_bus_event_queue); return 0;}EXPORT_SYMBOL_GPL(acpi_bus_generate_proc_event4);int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data){ if (!device) return -EINVAL; return acpi_bus_generate_proc_event4(device->pnp.device_class, device->pnp.bus_id, type, data);}EXPORT_SYMBOL(acpi_bus_generate_proc_event);int acpi_bus_receive_event(struct acpi_bus_event *event){ unsigned long flags = 0; struct acpi_bus_event *entry = NULL; DECLARE_WAITQUEUE(wait, current); if (!event) return -EINVAL; if (list_empty(&acpi_bus_event_list)) { set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&acpi_bus_event_queue, &wait); if (list_empty(&acpi_bus_event_list)) schedule(); remove_wait_queue(&acpi_bus_event_queue, &wait);//.........这里部分代码省略.........
开发者ID:1703011,项目名称:asuswrt-merlin,代码行数:101,
示例26: em28xx_init_camera//.........这里部分代码省略......... * need to use a lower xclk frequency. * Yet, it would be possible to adjust xclk depending on the * desired resolution, since this affects directly the * frame rate. */ dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ; em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk); v4l2->sensor_xtal = 4300000; pdata.xtal = v4l2->sensor_xtal; if (NULL == v4l2_i2c_new_subdev_board(&v4l2->v4l2_dev, adap, &mt9v011_info, NULL)) { ret = -ENODEV; break; } /* probably means GRGB 16 bit bayer */ v4l2->vinmode = 0x0d; v4l2->vinctl = 0x00; break; } case EM28XX_MT9M001: v4l2->sensor_xres = 1280; v4l2->sensor_yres = 1024; em28xx_initialize_mt9m001(dev); /* probably means BGGR 16 bit bayer */ v4l2->vinmode = 0x0c; v4l2->vinctl = 0x00; break; case EM28XX_MT9M111: v4l2->sensor_xres = 640; v4l2->sensor_yres = 512; dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ; em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk); em28xx_initialize_mt9m111(dev); v4l2->vinmode = 0x0a; v4l2->vinctl = 0x00; break; case EM28XX_OV2640: { struct v4l2_subdev *subdev; struct i2c_board_info ov2640_info = { .type = "ov2640", .flags = I2C_CLIENT_SCCB, .addr = client->addr, .platform_data = &camlink, }; struct v4l2_mbus_framefmt fmt; /* * FIXME: sensor supports resolutions up to 1600x1200, but * resolution setting/switching needs to be modified to * - switch sensor output resolution (including further * configuration changes) * - adjust bridge xclk * - disable 16 bit (12 bit) output formats on high resolutions */ v4l2->sensor_xres = 640; v4l2->sensor_yres = 480; subdev = v4l2_i2c_new_subdev_board(&v4l2->v4l2_dev, adap, &ov2640_info, NULL); if (NULL == subdev) { ret = -ENODEV; break; } fmt.code = MEDIA_BUS_FMT_YUYV8_2X8; fmt.width = 640; fmt.height = 480; v4l2_subdev_call(subdev, video, s_mbus_fmt, &fmt); /* NOTE: for UXGA=1600x1200 switch to 12MHz */ dev->board.xclk = EM28XX_XCLK_FREQUENCY_24MHZ; em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk); v4l2->vinmode = 0x08; v4l2->vinctl = 0x00; break; } case EM28XX_NOSENSOR: default: ret = -EINVAL; } if (ret < 0) { v4l2_clk_unregister_fixed(v4l2->clk); v4l2->clk = NULL; } return ret;}EXPORT_SYMBOL_GPL(em28xx_init_camera);
开发者ID:nateriver0007,项目名称:linux-at91,代码行数:101,
注:本文中的EXPORT_SYMBOL_GPL函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 C++ EXPR_LOCATION函数代码示例 C++ EXPECT_TRUE函数代码示例 |