/* * Create a new Memory Controller kobject instance, * mc<id> under the 'mc' directory * * Return: * 0 Success * !0 Failure */ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci, const struct attribute_group **groups) { char *name; int i, err; /* * The memory controller needs its own bus, in order to avoid * namespace conflicts at /sys/bus/edac. */ name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx); if (!name) return -ENOMEM; mci->bus->name = name; edac_dbg(0, "creating bus %s\n", mci->bus->name); err = bus_register(mci->bus); if (err < 0) { kfree(name); return err; } /* get the /sys/devices/system/edac subsys reference */ mci->dev.type = &mci_attr_type; device_initialize(&mci->dev); mci->dev.parent = mci_pdev; mci->dev.bus = mci->bus; mci->dev.groups = groups; dev_set_name(&mci->dev, "mc%d", mci->mc_idx); dev_set_drvdata(&mci->dev, mci); pm_runtime_forbid(&mci->dev); edac_dbg(0, "creating device %s\n", dev_name(&mci->dev)); err = device_add(&mci->dev); if (err < 0) { edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); goto fail_unregister_bus; } /* * Create the dimm/rank devices */ for (i = 0; i < mci->tot_dimms; i++) { struct dimm_info *dimm = mci->dimms[i]; /* Only expose populated DIMMs */ if (!dimm->nr_pages) continue; #ifdef CONFIG_EDAC_DEBUG edac_dbg(1, "creating dimm%d, located at ", i); if (edac_debug_level >= 1) { int lay; for (lay = 0; lay < mci->n_layers; lay++) printk(KERN_CONT "%s %d ", edac_layer_name[mci->layers[lay].type], dimm->location[lay]); printk(KERN_CONT "\n"); } #endif err = edac_create_dimm_object(mci, dimm, i); if (err) { edac_dbg(1, "failure: create dimm %d obj\n", i); goto fail_unregister_dimm; } } #ifdef CONFIG_EDAC_LEGACY_SYSFS err = edac_create_csrow_objects(mci); if (err < 0) goto fail_unregister_dimm; #endif edac_create_debugfs_nodes(mci); return 0; fail_unregister_dimm: for (i--; i >= 0; i--) { struct dimm_info *dimm = mci->dimms[i]; if (!dimm->nr_pages) continue; device_unregister(&dimm->dev); } device_unregister(&mci->dev); fail_unregister_bus: bus_unregister(mci->bus); kfree(name); return err; }
static char *vl_sync_devnode(struct device *dev, umode_t *mode) { return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); }
static int ds278x_battery_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ds278x_platform_data *pdata = client->dev.platform_data; struct ds278x_info *info; int ret; int num; /* * ds2786 should have the sense resistor value set * in the platform data */ if (id->driver_data == DS2786 && !pdata) { dev_err(&client->dev, "missing platform data for ds2786\n"); return -EINVAL; } /* Get an ID for this battery */ ret = idr_pre_get(&battery_id, GFP_KERNEL); if (ret == 0) { ret = -ENOMEM; goto fail_id; } mutex_lock(&battery_lock); ret = idr_get_new(&battery_id, client, &num); mutex_unlock(&battery_lock); if (ret < 0) goto fail_id; info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { ret = -ENOMEM; goto fail_info; } info->battery.name = kasprintf(GFP_KERNEL, "%s-%d", client->name, num); if (!info->battery.name) { ret = -ENOMEM; goto fail_name; } if (id->driver_data == DS2786) info->rsns = pdata->rsns; i2c_set_clientdata(client, info); info->client = client; info->id = num; info->ops = &ds278x_ops[id->driver_data]; ds278x_power_supply_init(&info->battery); ret = power_supply_register(&client->dev, &info->battery); if (ret) { dev_err(&client->dev, "failed to register battery\n"); goto fail_register; } return 0; fail_register: kfree(info->battery.name); fail_name: kfree(info); fail_info: mutex_lock(&battery_lock); idr_remove(&battery_id, num); mutex_unlock(&battery_lock); fail_id: return ret; }
static int bq27541_battery_probe(struct i2c_client *client, const struct i2c_device_id *id) { char *name; struct bq27541_device_info *di; struct bq27541_access_methods *bus; int num; int retval = 0; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -ENODEV; /* Get new ID for the new battery device */ retval = idr_pre_get(&battery_id, GFP_KERNEL); if (retval == 0) return -ENOMEM; mutex_lock(&battery_mutex); retval = idr_get_new(&battery_id, client, &num); mutex_unlock(&battery_mutex); if (retval < 0) return retval; name = kasprintf(GFP_KERNEL, "%s-%d", id->name, num); if (!name) { dev_err(&client->dev, "failed to allocate device name\n"); retval = -ENOMEM; goto batt_failed_1; } di = kzalloc(sizeof(*di), GFP_KERNEL); if (!di) { dev_err(&client->dev, "failed to allocate device info data\n"); retval = -ENOMEM; goto batt_failed_2; } di->id = num; bus = kzalloc(sizeof(*bus), GFP_KERNEL); if (!bus) { dev_err(&client->dev, "failed to allocate access method " "data\n"); retval = -ENOMEM; goto batt_failed_3; } i2c_set_clientdata(client, di); di->dev = &client->dev; bus->read = &bq27541_read_i2c; di->bus = bus; di->client = client; #ifdef CONFIG_BQ27541_TEST_ENABLE platform_set_drvdata(&this_device, di); retval = platform_device_register(&this_device); if (!retval) { retval = sysfs_create_group(&this_device.dev.kobj, &fs_attr_group); if (retval) goto batt_failed_4; } else goto batt_failed_4; #endif if (retval) { dev_err(&client->dev, "failed to setup bq27541\n"); goto batt_failed_4; } if (retval) { dev_err(&client->dev, "failed to powerup bq27541\n"); goto batt_failed_4; } spin_lock_init(&lock); bq27541_di = di; INIT_WORK(&di->counter, bq27541_coulomb_counter_work); INIT_DELAYED_WORK(&di->hw_config, bq27541_hw_config); schedule_delayed_work(&di->hw_config, BQ27541_INIT_DELAY); return 0; batt_failed_4: kfree(bus); batt_failed_3: kfree(di); batt_failed_2: kfree(name); batt_failed_1: mutex_lock(&battery_mutex); idr_remove(&battery_id, num); mutex_unlock(&battery_mutex); return retval; }
/* * Initialize chip structure */ static int ndfc_chip_init(struct ndfc_controller *ndfc, struct device_node *node) { #ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_CMDLINE_PARTS static const char *part_types[] = { "cmdlinepart", NULL }; #else static const char *part_types[] = { NULL }; #endif #endif struct device_node *flash_np; struct nand_chip *chip = &ndfc->chip; int ret; chip->IO_ADDR_R = ndfc->ndfcbase + NDFC_DATA; chip->IO_ADDR_W = ndfc->ndfcbase + NDFC_DATA; chip->cmd_ctrl = ndfc_hwcontrol; chip->dev_ready = ndfc_ready; chip->select_chip = ndfc_select_chip; chip->chip_delay = 50; chip->controller = &ndfc->ndfc_control; chip->read_buf = ndfc_read_buf; chip->write_buf = ndfc_write_buf; chip->verify_buf = ndfc_verify_buf; chip->ecc.correct = nand_correct_data; chip->ecc.hwctl = ndfc_enable_hwecc; chip->ecc.calculate = ndfc_calculate_ecc; chip->ecc.mode = NAND_ECC_HW; chip->ecc.size = 256; chip->ecc.bytes = 3; ndfc->mtd.priv = chip; ndfc->mtd.owner = THIS_MODULE; flash_np = of_get_next_child(node, NULL); if (!flash_np) return -ENODEV; ndfc->mtd.name = kasprintf(GFP_KERNEL, "%s.%s", ndfc->ofdev->dev.bus_id, flash_np->name); if (!ndfc->mtd.name) { ret = -ENOMEM; goto err; } ret = nand_scan(&ndfc->mtd, 1); if (ret) goto err; #ifdef CONFIG_MTD_PARTITIONS ret = parse_mtd_partitions(&ndfc->mtd, part_types, &ndfc->parts, 0); if (ret < 0) goto err; #ifdef CONFIG_MTD_OF_PARTS if (ret == 0) { ret = of_mtd_parse_partitions(&ndfc->ofdev->dev, flash_np, &ndfc->parts); if (ret < 0) goto err; } #endif if (ret > 0) ret = add_mtd_partitions(&ndfc->mtd, ndfc->parts, ret); else #endif ret = add_mtd_device(&ndfc->mtd); err: of_node_put(flash_np); if (ret) kfree(ndfc->mtd.name); return ret; }
static const char * __init ux500_get_family(void) { return kasprintf(GFP_KERNEL, "ux500"); }
static int imx_ssi_dev_probe(struct platform_device *pdev) { int fifo0_channel = pdev->id * 2; struct snd_soc_dai *dai; struct imx_ssi *priv; int fifo, channel; struct resource *res; int ret; BUG_ON(fifo0_channel >= MAX_SSI_CHANNELS); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; priv = kzalloc(sizeof(struct imx_ssi), GFP_KERNEL); if (!priv) return -ENOMEM; /* Each SSI block has 2 fifos which share the same private data (struct imx_ssi) */ priv->baseaddr = res->start; priv->ioaddr = ioremap(res->start, 0x5C); priv->irq = platform_get_irq(pdev, 0); priv->ssi_clk = clk_get(&pdev->dev, "ssi_clk"); priv->pdev = pdev; for (fifo = 0; fifo < 2; fifo++) { channel = (pdev->id * 2) + fifo; dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL); if (IS_ERR(dai)) { ret = -ENOMEM; goto DAI_ERR; } dai->name = kasprintf(GFP_KERNEL, "imx-ssi-%d-%d", pdev->id + 1, fifo); if (IS_ERR(dai->name)) { kfree(dai); ret = -ENOMEM; goto DAI_ERR; } dai->probe = imx_ssi_probe; dai->suspend = imx_ssi_suspend; dai->remove = imx_ssi_remove; dai->resume = imx_ssi_resume; dai->playback.channels_min = 1; dai->playback.channels_max = 2; dai->playback.rates = IMX_SSI_RATES; dai->playback.formats = IMX_SSI_FORMATS; dai->capture.channels_min = 1; dai->capture.channels_max = 2; dai->capture.rates = IMX_SSI_RATES; dai->capture.formats = IMX_SSI_FORMATS; dai->ops = &imx_ssi_dai_ops; dai->private_data = priv; dai->id = channel; imx_ssi_dai[channel] = dai; ret = snd_soc_register_dai(dai); if (ret < 0) { kfree(dai->name); kfree(dai); goto DAI_ERR; } } return 0; DAI_ERR: if (fifo == 1) { dai = imx_ssi_dai[fifo0_channel]; snd_soc_unregister_dai(dai); kfree(dai->name); kfree(dai); } clk_put(priv->ssi_clk); iounmap(priv->ioaddr); kfree(priv); return ret; }
static int __init txx9ndfmc_probe(struct platform_device *dev) { struct txx9ndfmc_platform_data *plat = dev->dev.platform_data; static const char *probes[] = { "cmdlinepart", NULL }; int hold, spw; int i; struct txx9ndfmc_drvdata *drvdata; unsigned long gbusclk = plat->gbus_clock; struct resource *res; res = platform_get_resource(dev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; drvdata = devm_kzalloc(&dev->dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; if (!devm_request_mem_region(&dev->dev, res->start, resource_size(res), dev_name(&dev->dev))) return -EBUSY; drvdata->base = devm_ioremap(&dev->dev, res->start, resource_size(res)); if (!drvdata->base) return -EBUSY; hold = plat->hold ?: 20; /* tDH */ spw = plat->spw ?: 90; /* max(tREADID, tWP, tRP) */ hold = TXX9NDFMC_NS_TO_CYC(gbusclk, hold); spw = TXX9NDFMC_NS_TO_CYC(gbusclk, spw); if (plat->flags & NDFMC_PLAT_FLAG_HOLDADD) hold -= 2; /* actual hold time : (HOLD + 2) BUSCLK */ spw -= 1; /* actual wait time : (SPW + 1) BUSCLK */ hold = clamp(hold, 1, 15); drvdata->hold = hold; spw = clamp(spw, 1, 15); drvdata->spw = spw; dev_info(&dev->dev, "CLK:%ldMHz HOLD:%d SPW:%d\n", (gbusclk + 500000) / 1000000, hold, spw); spin_lock_init(&drvdata->hw_control.lock); init_waitqueue_head(&drvdata->hw_control.wq); platform_set_drvdata(dev, drvdata); txx9ndfmc_initialize(dev); for (i = 0; i < MAX_TXX9NDFMC_DEV; i++) { struct txx9ndfmc_priv *txx9_priv; struct nand_chip *chip; struct mtd_info *mtd; int nr_parts; if (!(plat->ch_mask & (1 << i))) continue; txx9_priv = kzalloc(sizeof(struct txx9ndfmc_priv), GFP_KERNEL); if (!txx9_priv) { dev_err(&dev->dev, "Unable to allocate " "TXx9 NDFMC MTD device structure.\n"); continue; } chip = &txx9_priv->chip; mtd = &txx9_priv->mtd; mtd->owner = THIS_MODULE; mtd->priv = chip; chip->read_byte = txx9ndfmc_read_byte; chip->read_buf = txx9ndfmc_read_buf; chip->write_buf = txx9ndfmc_write_buf; chip->verify_buf = txx9ndfmc_verify_buf; chip->cmd_ctrl = txx9ndfmc_cmd_ctrl; chip->dev_ready = txx9ndfmc_dev_ready; chip->ecc.calculate = txx9ndfmc_calculate_ecc; chip->ecc.correct = txx9ndfmc_correct_data; chip->ecc.hwctl = txx9ndfmc_enable_hwecc; chip->ecc.mode = NAND_ECC_HW; /* txx9ndfmc_nand_scan will overwrite ecc.size and ecc.bytes */ chip->ecc.size = 256; chip->ecc.bytes = 3; chip->chip_delay = 100; chip->controller = &drvdata->hw_control; chip->priv = txx9_priv; txx9_priv->dev = dev; if (plat->ch_mask != 1) { txx9_priv->cs = i; txx9_priv->mtdname = kasprintf(GFP_KERNEL, "%s.%u", dev_name(&dev->dev), i); } else { txx9_priv->cs = -1; txx9_priv->mtdname = kstrdup(dev_name(&dev->dev), GFP_KERNEL); } if (!txx9_priv->mtdname) { kfree(txx9_priv); dev_err(&dev->dev, "Unable to allocate MTD name.\n"); continue; } if (plat->wide_mask & (1 << i)) chip->options |= NAND_BUSWIDTH_16; if (txx9ndfmc_nand_scan(mtd)) { kfree(txx9_priv->mtdname); kfree(txx9_priv); continue; } mtd->name = txx9_priv->mtdname; nr_parts = parse_mtd_partitions(mtd, probes, &drvdata->parts[i], 0); mtd_device_register(mtd, drvdata->parts[i], nr_parts); drvdata->mtds[i] = mtd; } return 0; }
static int ltc294x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct power_supply_config psy_cfg = {}; struct ltc294x_info *info; int ret; int num; u32 prescaler_exp; s32 r_sense; struct device_node *np; mutex_lock(<c294x_lock); ret = idr_alloc(<c294x_id, client, 0, 0, GFP_KERNEL); mutex_unlock(<c294x_lock); if (ret < 0) goto fail_id; num = ret; info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); if (info == NULL) { ret = -ENOMEM; goto fail_info; } i2c_set_clientdata(client, info); info->num_regs = id->driver_data; info->supply_desc.name = kasprintf(GFP_KERNEL, "%s-%d", client->name, num); if (!info->supply_desc.name) { ret = -ENOMEM; goto fail_name; } np = of_node_get(client->dev.of_node); /* r_sense can be negative, when sense+ is connected to the battery * instead of the sense-. This results in reversed measurements. */ ret = of_property_read_u32(np, "lltc,resistor-sense", &r_sense); if (ret < 0) { dev_err(&client->dev, "Could not find lltc,resistor-sense in devicetree\n"); goto fail_name; } info->r_sense = r_sense; ret = of_property_read_u32(np, "lltc,prescaler-exponent", &prescaler_exp); if (ret < 0) { dev_warn(&client->dev, "lltc,prescaler-exponent not in devicetree\n"); prescaler_exp = LTC2941_MAX_PRESCALER_EXP; } if (info->num_regs == LTC2943_NUM_REGS) { if (prescaler_exp > LTC2943_MAX_PRESCALER_EXP) prescaler_exp = LTC2943_MAX_PRESCALER_EXP; info->Qlsb = ((340 * 50000) / r_sense) / (4096 / (1 << (2*prescaler_exp))); } else { if (prescaler_exp > LTC2941_MAX_PRESCALER_EXP) prescaler_exp = LTC2941_MAX_PRESCALER_EXP; info->Qlsb = ((85 * 50000) / r_sense) / (128 / (1 << prescaler_exp)); } info->client = client; info->id = num; info->supply_desc.type = POWER_SUPPLY_TYPE_BATTERY; info->supply_desc.properties = ltc294x_properties; if (info->num_regs >= LTC294X_REG_TEMPERATURE_LSB) info->supply_desc.num_properties = ARRAY_SIZE(ltc294x_properties); else if (info->num_regs >= LTC294X_REG_CURRENT_LSB) info->supply_desc.num_properties = ARRAY_SIZE(ltc294x_properties) - 1; else if (info->num_regs >= LTC294X_REG_VOLTAGE_LSB) info->supply_desc.num_properties = ARRAY_SIZE(ltc294x_properties) - 2; else info->supply_desc.num_properties = ARRAY_SIZE(ltc294x_properties) - 3; info->supply_desc.get_property = ltc294x_get_property; info->supply_desc.set_property = ltc294x_set_property; info->supply_desc.property_is_writeable = ltc294x_property_is_writeable; info->supply_desc.external_power_changed = NULL; psy_cfg.drv_data = info; INIT_DELAYED_WORK(&info->work, ltc294x_work); ret = ltc294x_reset(info, prescaler_exp); if (ret < 0) { dev_err(&client->dev, "Communication with chip failed\n"); goto fail_comm; } info->supply = power_supply_register(&client->dev, &info->supply_desc, &psy_cfg); if (IS_ERR(info->supply)) { dev_err(&client->dev, "failed to register ltc2941\n"); ret = PTR_ERR(info->supply); goto fail_register; } else { schedule_delayed_work(&info->work, LTC294X_WORK_DELAY * HZ); } return 0; fail_register: kfree(info->supply_desc.name); fail_comm: fail_name: fail_info: mutex_lock(<c294x_lock); idr_remove(<c294x_id, num); mutex_unlock(<c294x_lock); fail_id: return ret; }
/* * The values of properties in the "/__symbols__" node are paths in * the ovcs->overlay_tree. When duplicating the properties, the paths * need to be adjusted to be the correct path for the live device tree. * * The paths refer to a node in the subtree of a fragment node's "__overlay__" * node, for example "/fragment@0/__overlay__/symbol_path_tail", * where symbol_path_tail can be a single node or it may be a multi-node path. * * The duplicated property value will be modified by replacing the * "/fragment_name/__overlay/" portion of the value with the target * path from the fragment node. */ static struct property *dup_and_fixup_symbol_prop( struct overlay_changeset *ovcs, const struct property *prop) { struct fragment *fragment; struct property *new_prop; struct device_node *fragment_node; struct device_node *overlay_node; const char *path; const char *path_tail; const char *target_path; int k; int overlay_name_len; int path_len; int path_tail_len; int target_path_len; if (!prop->value) return NULL; if (strnlen(prop->value, prop->length) >= prop->length) return NULL; path = prop->value; path_len = strlen(path); if (path_len < 1) return NULL; fragment_node = __of_find_node_by_path(ovcs->overlay_tree, path + 1); overlay_node = __of_find_node_by_path(fragment_node, "__overlay__/"); of_node_put(fragment_node); of_node_put(overlay_node); for (k = 0; k < ovcs->count; k++) { fragment = &ovcs->fragments[k]; if (fragment->overlay == overlay_node) break; } if (k >= ovcs->count) return NULL; overlay_name_len = snprintf(NULL, 0, "%pOF", fragment->overlay); if (overlay_name_len > path_len) return NULL; path_tail = path + overlay_name_len; path_tail_len = strlen(path_tail); target_path = kasprintf(GFP_KERNEL, "%pOF", fragment->target); if (!target_path) return NULL; target_path_len = strlen(target_path); new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); if (!new_prop) goto err_free_target_path; new_prop->name = kstrdup(prop->name, GFP_KERNEL); new_prop->length = target_path_len + path_tail_len + 1; new_prop->value = kzalloc(new_prop->length, GFP_KERNEL); if (!new_prop->name || !new_prop->value) goto err_free_new_prop; strcpy(new_prop->value, target_path); strcpy(new_prop->value + target_path_len, path_tail); of_property_set_flag(new_prop, OF_DYNAMIC); return new_prop; err_free_new_prop: kfree(new_prop->name); kfree(new_prop->value); kfree(new_prop); err_free_target_path: kfree(target_path); return NULL; }
static int xen_smp_intr_init(unsigned int cpu) { int rc; const char *resched_name, *callfunc_name, *debug_name; resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu); rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR, cpu, xen_reschedule_interrupt, IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING, resched_name, NULL); if (rc < 0) goto fail; per_cpu(xen_resched_irq, cpu) = rc; callfunc_name = kasprintf(GFP_KERNEL, "callfunc%d", cpu); rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR, cpu, xen_call_function_interrupt, IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING, callfunc_name, NULL); if (rc < 0) goto fail; per_cpu(xen_callfunc_irq, cpu) = rc; debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu); rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu, xen_debug_interrupt, IRQF_DISABLED | IRQF_PERCPU | IRQF_NOBALANCING, debug_name, NULL); if (rc < 0) goto fail; per_cpu(xen_debug_irq, cpu) = rc; callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu); rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR, cpu, xen_call_function_single_interrupt, IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING, callfunc_name, NULL); if (rc < 0) goto fail; per_cpu(xen_callfuncsingle_irq, cpu) = rc; return 0; fail: if (per_cpu(xen_resched_irq, cpu) >= 0) unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu), NULL); if (per_cpu(xen_callfunc_irq, cpu) >= 0) unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu), NULL); if (per_cpu(xen_debug_irq, cpu) >= 0) unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); if (per_cpu(xen_callfuncsingle_irq, cpu) >= 0) unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); return rc; }
static void __init ap_init_of(void) { unsigned long sc_dec; struct device_node *root; struct device_node *syscon; struct device *parent; struct soc_device *soc_dev; struct soc_device_attribute *soc_dev_attr; u32 ap_sc_id; int err; int i; /* Here we create an SoC device for the root node */ root = of_find_node_by_path("/"); if (!root) return; syscon = of_find_node_by_path("/syscon"); if (!syscon) return; ap_syscon_base = of_iomap(syscon, 0); if (!ap_syscon_base) return; ap_sc_id = readl(ap_syscon_base); soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); if (!soc_dev_attr) return; err = of_property_read_string(root, "compatible", &soc_dev_attr->soc_id); if (err) return; err = of_property_read_string(root, "model", &soc_dev_attr->machine); if (err) return; soc_dev_attr->family = "Integrator"; soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c", 'A' + (ap_sc_id & 0x0f)); soc_dev = soc_device_register(soc_dev_attr); if (IS_ERR(soc_dev)) { kfree(soc_dev_attr->revision); kfree(soc_dev_attr); return; } parent = soc_device_to_device(soc_dev); integrator_init_sysfs(parent, ap_sc_id); of_platform_populate(root, of_default_bus_match_table, ap_auxdata_lookup, parent); sc_dec = readl(ap_syscon_base + INTEGRATOR_SC_DEC_OFFSET); for (i = 0; i < 4; i++) { struct lm_device *lmdev; if ((sc_dec & (16 << i)) == 0) continue; lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL); if (!lmdev) continue; lmdev->resource.start = 0xc0000000 + 0x10000000 * i; lmdev->resource.end = lmdev->resource.start + 0x0fffffff; lmdev->resource.flags = IORESOURCE_MEM; lmdev->irq = IRQ_AP_EXPINT0 + i; lmdev->id = i; lm_device_register(lmdev); } }
static char * mic_devnode(struct device *dev, MODE_T *mode) { return kasprintf(GFP_KERNEL, "mic/%s", dev_name(dev)); }
int hua_ts_device_probe(struct hua_input_device *dev) { int ret; struct hua_ts_device *ts = (struct hua_ts_device *) dev; struct hua_input_chip *chip = dev->chip; struct hua_input_core *core = chip->core; struct input_dev *input = dev->input; const struct hua_ts_touch_key *key, *key_end; const char *name; ret = hua_input_add_kobject(&core->prop_kobj, "board_properties"); if (ret < 0 && ret != -EEXIST) { pr_red_info("hua_input_add_kobject"); return ret; } name = kasprintf(GFP_KERNEL, "virtualkeys.%s", input->name); if (name == NULL) { ret = -ENOMEM; pr_red_info("kasprintf"); goto out_hua_input_remove_kobject; } hua_ts_board_properties_attr.attr.name = name; ret = hua_input_create_sysfs_files(dev, &core->prop_kobj, &hua_ts_board_properties_attr, 1); if (ret < 0) { pr_red_info("hua_input_add_kobject"); goto out_kfree_name; } ret = sysfs_create_files(&dev->misc_dev.dev->kobj, hua_ts_device_attributes); if (ret < 0) { pr_red_info("sysfs_create_files"); goto out_hua_input_remove_sysfs_files; } #ifdef CONFIG_HAS_EARLYSUSPEND ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; ts->early_suspend.suspend = hua_ts_suspend; ts->early_suspend.resume = hua_ts_resume; register_early_suspend(&ts->early_suspend); #elif defined(CONFIG_FB) && defined(CONFIG_HUAMOBILE_USE_FB_NOTIFILER) ts->fb_notifier.notifier_call = hua_ts_fb_notifier_call; ret = fb_register_client(&ts->fb_notifier); if (ret < 0) { pr_red_info("fb_register_client"); } #else ts->pm_notifier.notifier_call = hua_ts_pm_notifier_call; ret = register_pm_notifier(&ts->pm_notifier); if (ret < 0) { pr_red_info("register_pm_notifier"); } #endif set_bit(INPUT_PROP_DIRECT, input->propbit); set_bit(EV_KEY, input->evbit); set_bit(BTN_TOUCH, input->keybit); if (ts->keys && ts->key_count) { for (key = ts->keys, key_end = key + ts->key_count; key < key_end; key++) { set_bit(key->code, input->keybit); } } set_bit(EV_ABS, input->evbit); input_set_abs_params(input, ABS_MT_POSITION_X, ts->xmin, ts->xmax, dev->fuzz, dev->flat); input_set_abs_params(input, ABS_MT_POSITION_Y, ts->ymin, ts->ymax, 0, 0); input_set_abs_params(input, ABS_MT_TRACKING_ID, 0, ts->point_count - 1, 0, 0); input->open = hua_ts_device_open; dev->remove = hua_ts_device_remove; ts->touch_count = 0; pr_green_info("huamobile touch screen %s probe complete", dev->name); return 0; out_hua_input_remove_sysfs_files: hua_input_remove_sysfs_files(&core->prop_kobj, &hua_ts_board_properties_attr, 1); out_kfree_name: kfree(name); out_hua_input_remove_kobject: hua_input_remove_kobject(&core->prop_kobj); return ret; }
static int bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask) { struct pnfs_block_volume *v = &volumes[idx]; const struct pr_ops *ops; const char *devname; int error; if (!bl_validate_designator(v)) return -EINVAL; switch (v->scsi.designator_len) { case 8: devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%8phN", v->scsi.designator); break; case 12: devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%12phN", v->scsi.designator); break; case 16: devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%16phN", v->scsi.designator); break; default: return -EINVAL; } d->bdev = blkdev_get_by_path(devname, FMODE_READ, NULL); if (IS_ERR(d->bdev)) { pr_warn("pNFS: failed to open device %s (%ld)\n", devname, PTR_ERR(d->bdev)); kfree(devname); return PTR_ERR(d->bdev); } kfree(devname); d->len = i_size_read(d->bdev->bd_inode); d->map = bl_map_simple; d->pr_key = v->scsi.pr_key; pr_info("pNFS: using block device %s (reservation key 0x%llx)\n", d->bdev->bd_disk->disk_name, d->pr_key); ops = d->bdev->bd_disk->fops->pr_ops; if (!ops) { pr_err("pNFS: block device %s does not support reservations.", d->bdev->bd_disk->disk_name); error = -EINVAL; goto out_blkdev_put; } error = ops->pr_register(d->bdev, 0, d->pr_key, true); if (error) { pr_err("pNFS: failed to register key for block device %s.", d->bdev->bd_disk->disk_name); goto out_blkdev_put; } d->pr_registered = true; return 0; out_blkdev_put: blkdev_put(d->bdev, FMODE_READ); return error; }
/** * Return the path to the error node for the given device, or NULL on failure. * If the value returned is non-NULL, then it is the caller's to kfree. */ static char *error_path(struct xenbus_device *dev) { return kasprintf(GFP_KERNEL, "error/%s", dev->nodename); }
static const char * __init ux500_get_machine(void) { return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); }
static int __init ksb_init(void) { struct ks_bridge *ksb; int num_instances = 0; int ret = 0; int i; dbg_dir = debugfs_create_dir("ks_bridge", NULL); if (IS_ERR(dbg_dir)) pr_err("unable to create debug dir"); for (i = 0; i < NO_BRIDGE_INSTANCES; i++) { ksb = kzalloc(sizeof(struct ks_bridge), GFP_KERNEL); if (!ksb) { pr_err("unable to allocat mem for ks_bridge"); ret = -ENOMEM; goto dev_free; } __ksb[i] = ksb; ksb->name = kasprintf(GFP_KERNEL, "ks_bridge:%i", i + 1); if (!ksb->name) { pr_info("unable to allocate name"); kfree(ksb); ret = -ENOMEM; goto dev_free; } spin_lock_init(&ksb->lock); INIT_LIST_HEAD(&ksb->to_mdm_list); INIT_LIST_HEAD(&ksb->to_ks_list); init_waitqueue_head(&ksb->ks_wait_q); ksb->wq = create_singlethread_workqueue(ksb->name); if (!ksb->wq) { pr_err("unable to allocate workqueue"); kfree(ksb->name); kfree(ksb); ret = -ENOMEM; goto dev_free; } INIT_WORK(&ksb->to_mdm_work, ksb_tomdm_work); INIT_WORK(&ksb->start_rx_work, ksb_start_rx_work); init_usb_anchor(&ksb->submitted); ksb->dbg_idx = 0; ksb->dbg_lock = __RW_LOCK_UNLOCKED(lck); if (!IS_ERR(dbg_dir)) debugfs_create_file(ksb->name, S_IRUGO, dbg_dir, ksb, &dbg_fops); num_instances++; } ret = usb_register(&ksb_usb_driver); if (ret) { pr_err("unable to register ks bridge driver"); goto dev_free; } pr_info("init done"); return 0; dev_free: if (!IS_ERR(dbg_dir)) debugfs_remove_recursive(dbg_dir); for (i = 0; i < num_instances; i++) { ksb = __ksb[i]; destroy_workqueue(ksb->wq); kfree(ksb->name); kfree(ksb); } return ret; }
static char *cpuid_devnode(struct device *dev, umode_t *mode) { return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt)); }
/** * drm_crtc_init_with_planes - Initialise a new CRTC object with * specified primary and cursor planes. * @dev: DRM device * @crtc: CRTC object to init * @primary: Primary plane for CRTC * @cursor: Cursor plane for CRTC * @funcs: callbacks for the new CRTC * @name: printf style format string for the CRTC name, or NULL for default name * * Inits a new object created as base part of a driver crtc object. Drivers * should use this function instead of drm_crtc_init(), which is only provided * for backwards compatibility with drivers which do not yet support universal * planes). For really simple hardware which has only 1 plane look at * drm_simple_display_pipe_init() instead. * * Returns: * Zero on success, error code on failure. */ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, struct drm_plane *primary, struct drm_plane *cursor, const struct drm_crtc_funcs *funcs, const char *name, ...) { struct drm_mode_config *config = &dev->mode_config; int ret; WARN_ON(primary && primary->type != DRM_PLANE_TYPE_PRIMARY); WARN_ON(cursor && cursor->type != DRM_PLANE_TYPE_CURSOR); /* crtc index is used with 32bit bitmasks */ if (WARN_ON(config->num_crtc >= 32)) return -EINVAL; WARN_ON(drm_drv_uses_atomic_modeset(dev) && (!funcs->atomic_destroy_state || !funcs->atomic_duplicate_state)); crtc->dev = dev; crtc->funcs = funcs; INIT_LIST_HEAD(&crtc->commit_list); spin_lock_init(&crtc->commit_lock); drm_modeset_lock_init(&crtc->mutex); ret = drm_mode_object_add(dev, &crtc->base, DRM_MODE_OBJECT_CRTC); if (ret) return ret; if (name) { va_list ap; va_start(ap, name); crtc->name = kvasprintf(GFP_KERNEL, name, ap); va_end(ap); } else { crtc->name = kasprintf(GFP_KERNEL, "crtc-%d", drm_num_crtcs(dev)); } if (!crtc->name) { drm_mode_object_unregister(dev, &crtc->base); return -ENOMEM; } crtc->fence_context = dma_fence_context_alloc(1); spin_lock_init(&crtc->fence_lock); snprintf(crtc->timeline_name, sizeof(crtc->timeline_name), "CRTC:%d-%s", crtc->base.id, crtc->name); crtc->base.properties = &crtc->properties; list_add_tail(&crtc->head, &config->crtc_list); crtc->index = config->num_crtc++; crtc->primary = primary; crtc->cursor = cursor; if (primary && !primary->possible_crtcs) primary->possible_crtcs = drm_crtc_mask(crtc); if (cursor && !cursor->possible_crtcs) cursor->possible_crtcs = drm_crtc_mask(crtc); ret = drm_crtc_crc_init(crtc); if (ret) { drm_mode_object_unregister(dev, &crtc->base); return ret; } if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { drm_object_attach_property(&crtc->base, config->prop_active, 0); drm_object_attach_property(&crtc->base, config->prop_mode_id, 0); drm_object_attach_property(&crtc->base, config->prop_out_fence_ptr, 0); drm_object_attach_property(&crtc->base, config->prop_vrr_enabled, 0); } return 0; }
static char *sound_devnode(struct device *dev, umode_t *mode) { if (MAJOR(dev->devt) == SOUND_MAJOR) return NULL; return kasprintf(GFP_KERNEL, "snd/%s", dev_name(dev)); }
static struct clk * krait_add_pri_mux(struct device *dev, int id, const char *s, unsigned int offset) { int ret; struct krait_mux_clk *mux; const char *p_names[3]; struct clk_init_data init = { .parent_names = p_names, .num_parents = ARRAY_SIZE(p_names), .ops = &krait_mux_clk_ops, .flags = CLK_SET_RATE_PARENT, }; struct clk *clk; mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); if (!mux) return ERR_PTR(-ENOMEM); mux->mask = 0x3; mux->shift = 0; mux->offset = offset; mux->lpl = id >= 0; mux->parent_map = pri_mux_map; mux->hw.init = &init; mux->safe_sel = 2; init.name = kasprintf(GFP_KERNEL, "krait%s_pri_mux", s); if (!init.name) return ERR_PTR(-ENOMEM); p_names[0] = kasprintf(GFP_KERNEL, "hfpll%s", s); if (!p_names[0]) { clk = ERR_PTR(-ENOMEM); goto err_p0; } p_names[1] = kasprintf(GFP_KERNEL, "hfpll%s_div", s); if (!p_names[1]) { clk = ERR_PTR(-ENOMEM); goto err_p1; } p_names[2] = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s); if (!p_names[2]) { clk = ERR_PTR(-ENOMEM); goto err_p2; } clk = devm_clk_register(dev, &mux->hw); ret = krait_notifier_register(dev, clk, mux); if (ret) goto err_p3; err_p3: kfree(p_names[2]); err_p2: kfree(p_names[1]); err_p1: kfree(p_names[0]); err_p0: kfree(init.name); return clk; }
/* * Create a new Memory Controller kobject instance, * mc<id> under the 'mc' directory * * Return: * 0 Success * !0 Failure */ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) { int i, err; /* * The memory controller needs its own bus, in order to avoid * namespace conflicts at /sys/bus/edac. */ mci->bus->name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx); if (!mci->bus->name) return -ENOMEM; edac_dbg(0, "creating bus %s\n", mci->bus->name); err = bus_register(mci->bus); if (err < 0) return err; /* get the /sys/devices/system/edac subsys reference */ mci->dev.type = &mci_attr_type; device_initialize(&mci->dev); mci->dev.parent = mci_pdev; mci->dev.bus = mci->bus; dev_set_name(&mci->dev, "mc%d", mci->mc_idx); dev_set_drvdata(&mci->dev, mci); pm_runtime_forbid(&mci->dev); edac_dbg(0, "creating device %s\n", dev_name(&mci->dev)); err = device_add(&mci->dev); if (err < 0) { edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); bus_unregister(mci->bus); kfree(mci->bus->name); return err; } if (mci->set_sdram_scrub_rate || mci->get_sdram_scrub_rate) { if (mci->get_sdram_scrub_rate) { dev_attr_sdram_scrub_rate.attr.mode |= S_IRUGO; dev_attr_sdram_scrub_rate.show = &mci_sdram_scrub_rate_show; } if (mci->set_sdram_scrub_rate) { dev_attr_sdram_scrub_rate.attr.mode |= S_IWUSR; dev_attr_sdram_scrub_rate.store = &mci_sdram_scrub_rate_store; } err = device_create_file(&mci->dev, &dev_attr_sdram_scrub_rate); if (err) { edac_dbg(1, "failure: create sdram_scrub_rate\n"); goto fail2; } } /* * Create the dimm/rank devices */ for (i = 0; i < mci->tot_dimms; i++) { struct dimm_info *dimm = mci->dimms[i]; /* Only expose populated DIMMs */ if (dimm->nr_pages == 0) continue; #ifdef CONFIG_EDAC_DEBUG edac_dbg(1, "creating dimm%d, located at ", i); if (edac_debug_level >= 1) { int lay; for (lay = 0; lay < mci->n_layers; lay++) printk(KERN_CONT "%s %d ", edac_layer_name[mci->layers[lay].type], dimm->location[lay]); printk(KERN_CONT "\n"); } #endif err = edac_create_dimm_object(mci, dimm, i); if (err) { edac_dbg(1, "failure: create dimm %d obj\n", i); goto fail; } } #ifdef CONFIG_EDAC_LEGACY_SYSFS err = edac_create_csrow_objects(mci); if (err < 0) goto fail; #endif #ifdef CONFIG_EDAC_DEBUG edac_create_debug_nodes(mci); #endif return 0; fail: for (i--; i >= 0; i--) { struct dimm_info *dimm = mci->dimms[i]; if (dimm->nr_pages == 0) continue; device_unregister(&dimm->dev); } fail2: device_unregister(&mci->dev); bus_unregister(mci->bus); kfree(mci->bus->name); return err; }
static int krait_add_div(struct device *dev, int id, const char *s, unsigned int offset) { struct krait_div2_clk *div; struct clk_init_data init = { .num_parents = 1, .ops = &krait_div2_clk_ops, .flags = CLK_SET_RATE_PARENT, }; const char *p_names[1]; struct clk *clk; div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL); if (!div) return -ENOMEM; div->width = 2; div->shift = 6; div->lpl = id >= 0; div->offset = offset; div->hw.init = &init; init.name = kasprintf(GFP_KERNEL, "hfpll%s_div", s); if (!init.name) return -ENOMEM; init.parent_names = p_names; p_names[0] = kasprintf(GFP_KERNEL, "hfpll%s", s); if (!p_names[0]) { kfree(init.name); return -ENOMEM; } clk = devm_clk_register(dev, &div->hw); kfree(p_names[0]); kfree(init.name); return PTR_ERR_OR_ZERO(clk); } static int krait_add_sec_mux(struct device *dev, int id, const char *s, unsigned int offset, bool unique_aux) { int ret; struct krait_mux_clk *mux; static const char *sec_mux_list[] = { "acpu_aux", "qsb", }; struct clk_init_data init = { .parent_names = sec_mux_list, .num_parents = ARRAY_SIZE(sec_mux_list), .ops = &krait_mux_clk_ops, .flags = CLK_SET_RATE_PARENT, }; struct clk *clk; mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); if (!mux) return -ENOMEM; mux->offset = offset; mux->lpl = id >= 0; mux->mask = 0x3; mux->shift = 2; mux->parent_map = sec_mux_map; mux->hw.init = &init; mux->safe_sel = 0; init.name = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s); if (!init.name) return -ENOMEM; if (unique_aux) { sec_mux_list[0] = kasprintf(GFP_KERNEL, "acpu%s_aux", s); if (!sec_mux_list[0]) { clk = ERR_PTR(-ENOMEM); goto err_aux; } } clk = devm_clk_register(dev, &mux->hw); ret = krait_notifier_register(dev, clk, mux); if (ret) goto unique_aux; unique_aux: if (unique_aux) kfree(sec_mux_list[0]); err_aux: kfree(init.name); return PTR_ERR_OR_ZERO(clk); }
static char *usblp_devnode(struct device *dev, umode_t *mode) { return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev)); }
int cx23885_input_init(struct cx23885_dev *dev) { struct cx23885_kernel_ir *kernel_ir; struct rc_dev *rc; char *rc_map; enum rc_driver_type driver_type; unsigned long allowed_protos; int ret; /* * If the IR device (hardware registers, chip, GPIO lines, etc.) isn't * encapsulated in a v4l2_subdev, then I'm not going to deal with it. */ if (dev->sd_ir == NULL) return -ENODEV; switch (dev->board) { case CX23885_BOARD_HAUPPAUGE_HVR1270: case CX23885_BOARD_HAUPPAUGE_HVR1850: case CX23885_BOARD_HAUPPAUGE_HVR1290: case CX23885_BOARD_HAUPPAUGE_HVR1250: /* Integrated CX2388[58] IR controller */ driver_type = RC_DRIVER_IR_RAW; allowed_protos = RC_BIT_ALL; /* The grey Hauppauge RC-5 remote */ rc_map = RC_MAP_HAUPPAUGE; break; case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL: /* Integrated CX23885 IR controller */ driver_type = RC_DRIVER_IR_RAW; allowed_protos = RC_BIT_NEC; /* The grey Terratec remote with orange buttons */ rc_map = RC_MAP_NEC_TERRATEC_CINERGY_XS; break; case CX23885_BOARD_TEVII_S470: /* Integrated CX23885 IR controller */ driver_type = RC_DRIVER_IR_RAW; allowed_protos = RC_BIT_ALL; /* A guess at the remote */ rc_map = RC_MAP_TEVII_NEC; break; case CX23885_BOARD_MYGICA_X8507: /* Integrated CX23885 IR controller */ driver_type = RC_DRIVER_IR_RAW; allowed_protos = RC_BIT_ALL; /* A guess at the remote */ rc_map = RC_MAP_TOTAL_MEDIA_IN_HAND_02; break; case CX23885_BOARD_TBS_6980: case CX23885_BOARD_TBS_6981: /* Integrated CX23885 IR controller */ driver_type = RC_DRIVER_IR_RAW; allowed_protos = RC_BIT_ALL; /* A guess at the remote */ rc_map = RC_MAP_TBS_NEC; break; default: return -ENODEV; } /* cx23885 board instance kernel IR state */ kernel_ir = kzalloc(sizeof(struct cx23885_kernel_ir), GFP_KERNEL); if (kernel_ir == NULL) return -ENOMEM; kernel_ir->cx = dev; kernel_ir->name = kasprintf(GFP_KERNEL, "cx23885 IR (%s)", cx23885_boards[dev->board].name); kernel_ir->phys = kasprintf(GFP_KERNEL, "pci-%s/ir0", pci_name(dev->pci)); /* input device */ rc = rc_allocate_device(); if (!rc) { ret = -ENOMEM; goto err_out_free; } kernel_ir->rc = rc; rc->input_name = kernel_ir->name; rc->input_phys = kernel_ir->phys; rc->input_id.bustype = BUS_PCI; rc->input_id.version = 1; if (dev->pci->subsystem_vendor) { rc->input_id.vendor = dev->pci->subsystem_vendor; rc->input_id.product = dev->pci->subsystem_device; } else { rc->input_id.vendor = dev->pci->vendor; rc->input_id.product = dev->pci->device; } rc->dev.parent = &dev->pci->dev; rc->driver_type = driver_type; rc_set_allowed_protocols(rc, allowed_protos); rc->priv = kernel_ir; rc->open = cx23885_input_ir_open; rc->close = cx23885_input_ir_close; rc->map_name = rc_map; rc->driver_name = MODULE_NAME; /* Go */ dev->kernel_ir = kernel_ir; ret = rc_register_device(rc); if (ret) goto err_out_stop; return 0; err_out_stop: cx23885_input_ir_stop(dev); dev->kernel_ir = NULL; rc_free_device(rc); err_out_free: kfree(kernel_ir->phys); kfree(kernel_ir->name); kfree(kernel_ir); return ret; }
/** * drm_universal_plane_init - Initialize a new universal plane object * @dev: DRM device * @plane: plane object to init * @possible_crtcs: bitmask of possible CRTCs * @funcs: callbacks for the new plane * @formats: array of supported formats (DRM_FORMAT\_\*) * @format_count: number of elements in @formats * @type: type of plane (overlay, primary, cursor) * @name: printf style format string for the plane name, or NULL for default name * * Initializes a plane object of type @type. * * Returns: * Zero on success, error code on failure. */ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, uint32_t possible_crtcs, const struct drm_plane_funcs *funcs, const uint32_t *formats, unsigned int format_count, enum drm_plane_type type, const char *name, ...) { struct drm_mode_config *config = &dev->mode_config; int ret; ret = drm_mode_object_add(dev, &plane->base, DRM_MODE_OBJECT_PLANE); if (ret) return ret; drm_modeset_lock_init(&plane->mutex); plane->base.properties = &plane->properties; plane->dev = dev; plane->funcs = funcs; plane->format_types = kmalloc_array(format_count, sizeof(uint32_t), GFP_KERNEL); if (!plane->format_types) { DRM_DEBUG_KMS("out of memory when allocating plane\n"); drm_mode_object_unregister(dev, &plane->base); return -ENOMEM; } if (name) { va_list ap; va_start(ap, name); plane->name = kvasprintf(GFP_KERNEL, name, ap); va_end(ap); } else { plane->name = kasprintf(GFP_KERNEL, "plane-%d", drm_num_planes(dev)); } if (!plane->name) { kfree(plane->format_types); drm_mode_object_unregister(dev, &plane->base); return -ENOMEM; } memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); plane->format_count = format_count; plane->possible_crtcs = possible_crtcs; plane->type = type; list_add_tail(&plane->head, &config->plane_list); plane->index = config->num_total_plane++; if (plane->type == DRM_PLANE_TYPE_OVERLAY) config->num_overlay_plane++; drm_object_attach_property(&plane->base, config->plane_type_property, plane->type); if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { drm_object_attach_property(&plane->base, config->prop_fb_id, 0); drm_object_attach_property(&plane->base, config->prop_in_fence_fd, -1); drm_object_attach_property(&plane->base, config->prop_crtc_id, 0); drm_object_attach_property(&plane->base, config->prop_crtc_x, 0); drm_object_attach_property(&plane->base, config->prop_crtc_y, 0); drm_object_attach_property(&plane->base, config->prop_crtc_w, 0); drm_object_attach_property(&plane->base, config->prop_crtc_h, 0); drm_object_attach_property(&plane->base, config->prop_src_x, 0); drm_object_attach_property(&plane->base, config->prop_src_y, 0); drm_object_attach_property(&plane->base, config->prop_src_w, 0); drm_object_attach_property(&plane->base, config->prop_src_h, 0); } return 0; }
/* serial core request to initialize uart and start rx operation */ static int pic32_uart_startup(struct uart_port *port) { struct pic32_sport *sport = to_pic32_sport(port); u32 dflt_baud = (port->uartclk / PIC32_UART_DFLT_BRATE / 16) - 1; unsigned long flags; int ret; local_irq_save(flags); ret = pic32_enable_clock(sport); if (ret) { local_irq_restore(flags); goto out_done; } /* clear status and mode registers */ pic32_uart_writel(sport, PIC32_UART_MODE, 0); pic32_uart_writel(sport, PIC32_UART_STA, 0); /* disable uart and mask all interrupts */ pic32_uart_dsbl_and_mask(port); /* set default baud */ pic32_uart_writel(sport, PIC32_UART_BRG, dflt_baud); local_irq_restore(flags); /* Each UART of a PIC32 has three interrupts therefore, * we setup driver to register the 3 irqs for the device. * * For each irq request_irq() is called with interrupt disabled. * And the irq is enabled as soon as we are ready to handle them. */ tx_irq_enabled(sport) = 0; sport->irq_fault_name = kasprintf(GFP_KERNEL, "%s%d-fault", pic32_uart_type(port), sport->idx); if (!sport->irq_fault_name) { dev_err(port->dev, "%s: kasprintf err!", __func__); ret = -ENOMEM; goto out_done; } irq_set_status_flags(sport->irq_fault, IRQ_NOAUTOEN); ret = request_irq(sport->irq_fault, pic32_uart_fault_interrupt, sport->irqflags_fault, sport->irq_fault_name, port); if (ret) { dev_err(port->dev, "%s: request irq(%d) err! ret:%d name:%s\n", __func__, sport->irq_fault, ret, pic32_uart_type(port)); goto out_f; } sport->irq_rx_name = kasprintf(GFP_KERNEL, "%s%d-rx", pic32_uart_type(port), sport->idx); if (!sport->irq_rx_name) { dev_err(port->dev, "%s: kasprintf err!", __func__); ret = -ENOMEM; goto out_f; } irq_set_status_flags(sport->irq_rx, IRQ_NOAUTOEN); ret = request_irq(sport->irq_rx, pic32_uart_rx_interrupt, sport->irqflags_rx, sport->irq_rx_name, port); if (ret) { dev_err(port->dev, "%s: request irq(%d) err! ret:%d name:%s\n", __func__, sport->irq_rx, ret, pic32_uart_type(port)); goto out_r; } sport->irq_tx_name = kasprintf(GFP_KERNEL, "%s%d-tx", pic32_uart_type(port), sport->idx); if (!sport->irq_tx_name) { dev_err(port->dev, "%s: kasprintf err!", __func__); ret = -ENOMEM; goto out_r; } irq_set_status_flags(sport->irq_tx, IRQ_NOAUTOEN); ret = request_irq(sport->irq_tx, pic32_uart_tx_interrupt, sport->irqflags_tx, sport->irq_tx_name, port); if (ret) { dev_err(port->dev, "%s: request irq(%d) err! ret:%d name:%s\n", __func__, sport->irq_tx, ret, pic32_uart_type(port)); goto out_t; } local_irq_save(flags); /* set rx interrupt on first receive */ pic32_uart_writel(sport, PIC32_CLR(PIC32_UART_STA), PIC32_UART_STA_URXISEL1 | PIC32_UART_STA_URXISEL0); /* set interrupt on empty */ pic32_uart_writel(sport, PIC32_CLR(PIC32_UART_STA), PIC32_UART_STA_UTXISEL1); /* enable all interrupts and eanable uart */ pic32_uart_en_and_unmask(port); enable_irq(sport->irq_rx); return 0; out_t: kfree(sport->irq_tx_name); free_irq(sport->irq_tx, port); out_r: kfree(sport->irq_rx_name); free_irq(sport->irq_rx, port); out_f: kfree(sport->irq_fault_name); free_irq(sport->irq_fault, port); out_done: return ret; }
static const char __init *ep93xx_get_machine_name(void) { return kasprintf(GFP_KERNEL,"%s", machine_desc->name); }
static char *mcom_devnode(struct device *dev, mode_t *mode) { return kasprintf(GFP_KERNEL, "mcom/%s", dev_name(dev)); }