static int hi3798cv200_crg_probe(struct platform_device *pdev) { struct hisi_crg_dev *crg; crg = devm_kmalloc(&pdev->dev, sizeof(*crg), GFP_KERNEL); if (!crg) return -ENOMEM; crg->funcs = of_device_get_match_data(&pdev->dev); if (!crg->funcs) return -ENOENT; crg->rstc = hisi_reset_init(pdev); if (!crg->rstc) return -ENOMEM; crg->clk_data = crg->funcs->register_clks(pdev); if (IS_ERR(crg->clk_data)) { hisi_reset_exit(crg->rstc); return PTR_ERR(crg->clk_data); } platform_set_drvdata(pdev, crg); return 0; }
static int ltq_wdt_probe(struct platform_device *pdev) { struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); struct clk *clk; ltq_wdt_bootstatus_set ltq_wdt_bootstatus_set; int ret; ltq_wdt_membase = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(ltq_wdt_membase)) return PTR_ERR(ltq_wdt_membase); ltq_wdt_bootstatus_set = of_device_get_match_data(&pdev->dev); if (ltq_wdt_bootstatus_set) { ret = ltq_wdt_bootstatus_set(pdev); if (ret) return ret; } /* we do not need to enable the clock as it is always running */ clk = clk_get_io(); if (IS_ERR(clk)) { dev_err(&pdev->dev, "Failed to get clock\n"); return -ENOENT; } ltq_io_region_clk_rate = clk_get_rate(clk); clk_put(clk); dev_info(&pdev->dev, "Init done\n"); return misc_register(<q_wdt_miscdev); }
static int exynos_pmu_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pmu_base_addr = devm_ioremap_resource(dev, res); if (IS_ERR(pmu_base_addr)) return PTR_ERR(pmu_base_addr); pmu_context = devm_kzalloc(&pdev->dev, sizeof(struct exynos_pmu_context), GFP_KERNEL); if (!pmu_context) return -ENOMEM; pmu_context->dev = dev; pmu_context->pmu_data = of_device_get_match_data(dev); if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_init) pmu_context->pmu_data->pmu_init(); platform_set_drvdata(pdev, pmu_context); dev_dbg(dev, "Exynos PMU Driver probe done\n"); return 0; }
static int rcar_du_probe(struct platform_device *pdev) { struct rcar_du_device *rcdu; struct drm_device *ddev; struct resource *mem; int ret; /* Allocate and initialize the R-Car device structure. */ rcdu = devm_kzalloc(&pdev->dev, sizeof(*rcdu), GFP_KERNEL); if (rcdu == NULL) return -ENOMEM; rcdu->dev = &pdev->dev; rcdu->info = of_device_get_match_data(rcdu->dev); platform_set_drvdata(pdev, rcdu); /* I/O resources */ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); rcdu->mmio = devm_ioremap_resource(&pdev->dev, mem); if (IS_ERR(rcdu->mmio)) return PTR_ERR(rcdu->mmio); /* DRM/KMS objects */ ddev = drm_dev_alloc(&rcar_du_driver, &pdev->dev); if (IS_ERR(ddev)) return PTR_ERR(ddev); rcdu->ddev = ddev; ddev->dev_private = rcdu; ret = rcar_du_modeset_init(rcdu); if (ret < 0) { if (ret != -EPROBE_DEFER) dev_err(&pdev->dev, "failed to initialize DRM/KMS (%d)\n", ret); goto error; } ddev->irq_enabled = 1; /* * Register the DRM device with the core and the connectors with * sysfs. */ ret = drm_dev_register(ddev, 0); if (ret) goto error; DRM_INFO("Device %s probed\n", dev_name(&pdev->dev)); drm_fbdev_generic_setup(ddev, 32); return 0; error: rcar_du_remove(pdev); return ret; }
static int rza_wdt_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct rza_wdt *priv; unsigned long rate; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->clk = devm_clk_get(dev, NULL); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); rate = clk_get_rate(priv->clk); if (rate < 16384) { dev_err(dev, "invalid clock rate (%ld)\n", rate); return -ENOENT; } priv->wdev.info = &rza_wdt_ident, priv->wdev.ops = &rza_wdt_ops, priv->wdev.parent = dev; priv->cks = (u8)(uintptr_t) of_device_get_match_data(dev); if (priv->cks == CKS_4BIT) { /* Assume slowest clock rate possible (CKS=0xF) */ priv->wdev.max_timeout = (DIVIDER_4BIT * U8_MAX) / rate; } else if (priv->cks == CKS_3BIT) { /* Assume slowest clock rate possible (CKS=7) */ rate /= DIVIDER_3BIT; /* * Since the max possible timeout of our 8-bit count * register is less than a second, we must use * max_hw_heartbeat_ms. */ priv->wdev.max_hw_heartbeat_ms = (1000 * U8_MAX) / rate; dev_dbg(dev, "max hw timeout of %dms\n", priv->wdev.max_hw_heartbeat_ms); } priv->wdev.min_timeout = 1; priv->wdev.timeout = DEFAULT_TIMEOUT; watchdog_init_timeout(&priv->wdev, 0, dev); watchdog_set_drvdata(&priv->wdev, priv); ret = devm_watchdog_register_device(dev, &priv->wdev); if (ret) dev_err(dev, "Cannot register watchdog device\n"); return ret; }
static int denali_dt_probe(struct platform_device *pdev) { struct resource *res; struct denali_dt *dt; const struct denali_dt_data *data; struct denali_nand_info *denali; int ret; dt = devm_kzalloc(&pdev->dev, sizeof(*dt), GFP_KERNEL); if (!dt) return -ENOMEM; denali = &dt->denali; data = of_device_get_match_data(&pdev->dev); if (data) { denali->revision = data->revision; denali->caps = data->caps; denali->ecc_caps = data->ecc_caps; } denali->dev = &pdev->dev; denali->irq = platform_get_irq(pdev, 0); if (denali->irq < 0) { dev_err(&pdev->dev, "no irq defined\n"); return denali->irq; } res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "denali_reg"); denali->reg = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(denali->reg)) return PTR_ERR(denali->reg); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_data"); denali->host = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(denali->host)) return PTR_ERR(denali->host); dt->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(dt->clk)) { dev_err(&pdev->dev, "no clk available\n"); return PTR_ERR(dt->clk); } ret = clk_prepare_enable(dt->clk); if (ret) return ret; denali->clk_x_rate = clk_get_rate(dt->clk); ret = denali_init(denali); if (ret) goto out_disable_clk; platform_set_drvdata(pdev, dt); return 0; out_disable_clk: clk_disable_unprepare(dt->clk); return ret; }
static int rpm_clk_probe(struct platform_device *pdev) { struct rpm_cc *rcc; int ret; size_t num_clks, i; struct qcom_rpm *rpm; struct clk_rpm **rpm_clks; const struct rpm_clk_desc *desc; rpm = dev_get_drvdata(pdev->dev.parent); if (!rpm) { dev_err(&pdev->dev, "Unable to retrieve handle to RPM\n"); return -ENODEV; } desc = of_device_get_match_data(&pdev->dev); if (!desc) return -EINVAL; rpm_clks = desc->clks; num_clks = desc->num_clks; rcc = devm_kzalloc(&pdev->dev, sizeof(*rcc), GFP_KERNEL); if (!rcc) return -ENOMEM; rcc->clks = rpm_clks; rcc->num_clks = num_clks; for (i = 0; i < num_clks; i++) { if (!rpm_clks[i]) continue; rpm_clks[i]->rpm = rpm; ret = clk_rpm_handoff(rpm_clks[i]); if (ret) goto err; } for (i = 0; i < num_clks; i++) { if (!rpm_clks[i]) continue; ret = devm_clk_hw_register(&pdev->dev, &rpm_clks[i]->hw); if (ret) goto err; } ret = of_clk_add_hw_provider(pdev->dev.of_node, qcom_rpm_clk_hw_get, rcc); if (ret) goto err; return 0; err: dev_err(&pdev->dev, "Error registering RPM Clock driver (%d)\n", ret); return ret; }
static int ltq_wdt_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct ltq_wdt_priv *priv; struct watchdog_device *wdt; struct clk *clk; const struct ltq_wdt_hw *ltq_wdt_hw; int ret; u32 status; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->membase = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->membase)) return PTR_ERR(priv->membase); /* we do not need to enable the clock as it is always running */ clk = clk_get_io(); priv->clk_rate = clk_get_rate(clk) / LTQ_WDT_DIVIDER; if (!priv->clk_rate) { dev_err(dev, "clock rate less than divider %i\n", LTQ_WDT_DIVIDER); return -EINVAL; } wdt = &priv->wdt; wdt->info = <q_wdt_info; wdt->ops = <q_wdt_ops; wdt->min_timeout = 1; wdt->max_timeout = LTQ_WDT_CR_MAX_TIMEOUT / priv->clk_rate; wdt->timeout = wdt->max_timeout; wdt->parent = dev; ltq_wdt_hw = of_device_get_match_data(dev); if (ltq_wdt_hw && ltq_wdt_hw->bootstatus_get) { ret = ltq_wdt_hw->bootstatus_get(dev); if (ret >= 0) wdt->bootstatus = ret; } watchdog_set_nowayout(wdt, nowayout); watchdog_init_timeout(wdt, 0, dev); status = ltq_wdt_r32(priv, LTQ_WDT_SR); if (status & LTQ_WDT_SR_EN) { /* * If the watchdog is already running overwrite it with our * new settings. Stop is not needed as the start call will * replace all settings anyway. */ ltq_wdt_start(wdt); set_bit(WDOG_HW_RUNNING, &wdt->status); } return devm_watchdog_register_device(dev, wdt); }
static int imx6ul_pinctrl_probe(struct platform_device *pdev) { const struct imx_pinctrl_soc_info *pinctrl_info; pinctrl_info = of_device_get_match_data(&pdev->dev); if (!pinctrl_info) return -ENODEV; return imx_pinctrl_probe(pdev, pinctrl_info); }
static int cpm_gpio_probe(struct platform_device *ofdev) { struct device *dev = &ofdev->dev; int (*gp_add)(struct device *dev) = of_device_get_match_data(dev); if (!gp_add) return -ENODEV; return gp_add(dev); }
static int uniphier_clk_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct clk_hw_onecell_data *hw_data; const struct uniphier_clk_data *p, *data; struct regmap *regmap; struct device_node *parent; int clk_num = 0; data = of_device_get_match_data(dev); if (WARN_ON(!data)) return -EINVAL; parent = of_get_parent(dev->of_node); /* parent should be syscon node */ regmap = syscon_node_to_regmap(parent); of_node_put(parent); if (IS_ERR(regmap)) { dev_err(dev, "failed to get regmap (error %ld)\n", PTR_ERR(regmap)); return PTR_ERR(regmap); } for (p = data; p->name; p++) clk_num = max(clk_num, p->idx + 1); hw_data = devm_kzalloc(dev, sizeof(*hw_data) + clk_num * sizeof(struct clk_hw *), GFP_KERNEL); if (!hw_data) return -ENOMEM; hw_data->num = clk_num; /* avoid returning NULL for unused idx */ while (--clk_num >= 0) hw_data->hws[clk_num] = ERR_PTR(-EINVAL); for (p = data; p->name; p++) { struct clk_hw *hw; dev_dbg(dev, "register %s (index=%d)\n", p->name, p->idx); hw = uniphier_clk_register(dev, regmap, p); if (IS_ERR(hw)) { dev_err(dev, "failed to register %s (error %ld)\n", p->name, PTR_ERR(hw)); return PTR_ERR(hw); } if (p->idx >= 0) hw_data->hws[p->idx] = hw; } return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, hw_data); }
static int syscon_gpio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct syscon_gpio_priv *priv; struct device_node *np = dev->of_node; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->data = of_device_get_match_data(dev); if (priv->data->compatible) { priv->syscon = syscon_regmap_lookup_by_compatible( priv->data->compatible); if (IS_ERR(priv->syscon)) return PTR_ERR(priv->syscon); } else { priv->syscon = syscon_regmap_lookup_by_phandle(np, "gpio,syscon-dev"); if (IS_ERR(priv->syscon) && np->parent) priv->syscon = syscon_node_to_regmap(np->parent); if (IS_ERR(priv->syscon)) return PTR_ERR(priv->syscon); ret = of_property_read_u32_index(np, "gpio,syscon-dev", 1, &priv->dreg_offset); if (ret) dev_err(dev, "can't read the data register offset!\n"); priv->dreg_offset <<= 3; ret = of_property_read_u32_index(np, "gpio,syscon-dev", 2, &priv->dir_reg_offset); if (ret) dev_dbg(dev, "can't read the dir register offset!\n"); priv->dir_reg_offset <<= 3; } priv->chip.parent = dev; priv->chip.owner = THIS_MODULE; priv->chip.label = dev_name(dev); priv->chip.base = -1; priv->chip.ngpio = priv->data->bit_count; priv->chip.get = syscon_gpio_get; if (priv->data->flags & GPIO_SYSCON_FEAT_IN) priv->chip.direction_input = syscon_gpio_dir_in; if (priv->data->flags & GPIO_SYSCON_FEAT_OUT) { priv->chip.set = priv->data->set ? : syscon_gpio_set; priv->chip.direction_output = syscon_gpio_dir_out; }
static int gic_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; const struct gic_clk_data *data; struct gic_chip_data *gic; int ret, irq; data = of_device_get_match_data(&pdev->dev); if (!data) { dev_err(&pdev->dev, "no device match found\n"); return -ENODEV; } irq = irq_of_parse_and_map(dev->of_node, 0); if (!irq) { dev_err(dev, "no parent interrupt found!\n"); return -EINVAL; } ret = gic_get_clocks(dev, data); if (ret) goto irq_dispose; pm_runtime_enable(dev); ret = pm_runtime_get_sync(dev); if (ret < 0) goto rpm_disable; ret = gic_of_init_child(dev, &gic, irq); if (ret) goto rpm_put; platform_set_drvdata(pdev, gic); pm_runtime_put(dev); dev_info(dev, "GIC IRQ controller registered\n"); return 0; rpm_put: pm_runtime_put_sync(dev); rpm_disable: pm_runtime_disable(dev); pm_clk_destroy(dev); irq_dispose: irq_dispose_mapping(irq); return ret; }
static int hisi_thermal_probe(struct platform_device *pdev) { struct hisi_thermal_data *data; int (*platform_probe)(struct hisi_thermal_data *); struct device *dev = &pdev->dev; int ret; data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->pdev = pdev; platform_set_drvdata(pdev, data); platform_probe = of_device_get_match_data(dev); if (!platform_probe) { dev_err(dev, "failed to get probe func\n"); return -EINVAL; } ret = platform_probe(data); if (ret) return ret; ret = hisi_thermal_register_sensor(pdev, data, &data->sensor); if (ret) { dev_err(dev, "failed to register thermal sensor: %d\n", ret); return ret; } ret = data->enable_sensor(data); if (ret) { dev_err(dev, "Failed to setup the sensor: %d\n", ret); return ret; } if (data->irq) { ret = devm_request_threaded_irq(dev, data->irq, NULL, hisi_thermal_alarm_irq_thread, IRQF_ONESHOT, "hisi_thermal", data); if (ret < 0) { dev_err(dev, "failed to request alarm irq: %d\n", ret); return ret; } } hisi_thermal_toggle_sensor(&data->sensor, true); return 0; }
static int rk_gmac_probe(struct platform_device *pdev) { struct plat_stmmacenet_data *plat_dat; struct stmmac_resources stmmac_res; const struct rk_gmac_ops *data; int ret; data = of_device_get_match_data(&pdev->dev); if (!data) { dev_err(&pdev->dev, "no of match data provided\n"); return -EINVAL; } ret = stmmac_get_platform_resources(pdev, &stmmac_res); if (ret) return ret; plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); if (IS_ERR(plat_dat)) return PTR_ERR(plat_dat); plat_dat->has_gmac = true; plat_dat->fix_mac_speed = rk_fix_speed; plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data); if (IS_ERR(plat_dat->bsp_priv)) { ret = PTR_ERR(plat_dat->bsp_priv); goto err_remove_config_dt; } ret = rk_gmac_clk_init(plat_dat); if (ret) return ret; ret = rk_gmac_powerup(plat_dat->bsp_priv); if (ret) goto err_remove_config_dt; ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); if (ret) goto err_gmac_powerdown; return 0; err_gmac_powerdown: rk_gmac_powerdown(plat_dat->bsp_priv); err_remove_config_dt: stmmac_remove_config_dt(pdev, plat_dat); return ret; }
static int hi3660_clk_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = pdev->dev.of_node; void (*init_func)(struct device_node *np); init_func = of_device_get_match_data(dev); if (!init_func) return -ENODEV; init_func(np); return 0; }
static int uniphier_pciephy_probe(struct platform_device *pdev) { struct uniphier_pciephy_priv *priv; struct phy_provider *phy_provider; struct device *dev = &pdev->dev; struct regmap *regmap; struct resource *res; struct phy *phy; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->data = of_device_get_match_data(dev); if (WARN_ON(!priv->data)) return -EINVAL; priv->dev = dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->base = devm_ioremap_resource(dev, res); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->clk = devm_clk_get(dev, NULL); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); priv->rst = devm_reset_control_get_shared(dev, NULL); if (IS_ERR(priv->rst)) return PTR_ERR(priv->rst); phy = devm_phy_create(dev, dev->of_node, &uniphier_pciephy_ops); if (IS_ERR(phy)) return PTR_ERR(phy); regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "socionext,syscon"); if (!IS_ERR(regmap) && priv->data->has_syscon) regmap_update_bits(regmap, SG_USBPCIESEL, SG_USBPCIESEL_PCIE, SG_USBPCIESEL_PCIE); phy_set_drvdata(phy, priv); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int clk_mt7629_probe(struct platform_device *pdev) { int (*clk_init)(struct platform_device *); int r; clk_init = of_device_get_match_data(&pdev->dev); if (!clk_init) return -EINVAL; r = clk_init(pdev); if (r) dev_err(&pdev->dev, "could not register clock provider: %s: %d\n", pdev->name, r); return r; }
static int msm_hdmi_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct hdmi_phy *phy; int ret; phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); if (!phy) return -ENODEV; phy->cfg = (struct hdmi_phy_cfg *)of_device_get_match_data(dev); if (!phy->cfg) return -ENODEV; phy->mmio = msm_ioremap(pdev, "hdmi_phy", "HDMI_PHY"); if (IS_ERR(phy->mmio)) { dev_err(dev, "%s: failed to map phy base\n", __func__); return -ENOMEM; } phy->pdev = pdev; ret = msm_hdmi_phy_resource_init(phy); if (ret) return ret; pm_runtime_enable(&pdev->dev); ret = msm_hdmi_phy_resource_enable(phy); if (ret) return ret; ret = msm_hdmi_phy_pll_init(pdev, phy->cfg->type); if (ret) { dev_err(dev, "couldn't init PLL\n"); msm_hdmi_phy_resource_disable(phy); return ret; } msm_hdmi_phy_resource_disable(phy); platform_set_drvdata(pdev, phy); return 0; }
static int msm_hdmi_bind(struct device *dev, struct device *master, void *data) { struct drm_device *drm = dev_get_drvdata(master); struct msm_drm_private *priv = drm->dev_private; static struct hdmi_platform_config *hdmi_cfg; struct hdmi *hdmi; struct device_node *of_node = dev->of_node; int i, err; hdmi_cfg = (struct hdmi_platform_config *) of_device_get_match_data(dev); if (!hdmi_cfg) { dev_err(dev, "unknown hdmi_cfg: %s\n", of_node->name); return -ENXIO; } hdmi_cfg->mmio_name = "core_physical"; hdmi_cfg->qfprom_mmio_name = "qfprom_physical"; for (i = 0; i < HDMI_MAX_NUM_GPIO; i++) { hdmi_cfg->gpios[i].num = msm_hdmi_get_gpio(of_node, msm_hdmi_gpio_pdata[i].name); hdmi_cfg->gpios[i].output = msm_hdmi_gpio_pdata[i].output; hdmi_cfg->gpios[i].value = msm_hdmi_gpio_pdata[i].value; hdmi_cfg->gpios[i].label = msm_hdmi_gpio_pdata[i].label; } dev->platform_data = hdmi_cfg; hdmi = msm_hdmi_init(to_platform_device(dev)); if (IS_ERR(hdmi)) return PTR_ERR(hdmi); priv->hdmi = hdmi; err = msm_hdmi_register_audio_driver(hdmi, dev); if (err) { DRM_ERROR("Failed to attach an audio codec %d\n", err); hdmi->audio_pdev = NULL; } return 0; }
static int exynos_rng_probe(struct platform_device *pdev) { struct exynos_rng_dev *rng; struct resource *res; int ret; if (exynos_rng_dev) return -EEXIST; rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL); if (!rng) return -ENOMEM; rng->type = (enum exynos_prng_type)of_device_get_match_data(&pdev->dev); mutex_init(&rng->lock); rng->dev = &pdev->dev; rng->clk = devm_clk_get(&pdev->dev, "secss"); if (IS_ERR(rng->clk)) { dev_err(&pdev->dev, "Couldn't get clock.\n"); return PTR_ERR(rng->clk); } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); rng->mem = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(rng->mem)) return PTR_ERR(rng->mem); platform_set_drvdata(pdev, rng); exynos_rng_dev = rng; ret = crypto_register_rng(&exynos_rng_alg); if (ret) { dev_err(&pdev->dev, "Couldn't register rng crypto alg: %d\n", ret); exynos_rng_dev = NULL; } return ret; }
static int rockchip_dp_bind(struct device *dev, struct device *master, void *data) { struct rockchip_dp_device *dp = dev_get_drvdata(dev); const struct rockchip_dp_chip_data *dp_data; struct drm_device *drm_dev = data; int ret; /* * Just like the probe function said, we don't need the * device drvrate anymore, we should leave the charge to * analogix dp driver, set the device drvdata to NULL. */ dev_set_drvdata(dev, NULL); dp_data = of_device_get_match_data(dev); if (!dp_data) return -ENODEV; ret = rockchip_dp_init(dp); if (ret < 0) return ret; dp->data = dp_data; dp->drm_dev = drm_dev; ret = rockchip_dp_drm_create_encoder(dp); if (ret) { DRM_ERROR("failed to create drm encoder\n"); return ret; } dp->plat_data.encoder = &dp->encoder; dp->plat_data.dev_type = dp->data->chip_type; dp->plat_data.power_on = rockchip_dp_poweron; dp->plat_data.power_off = rockchip_dp_powerdown; dp->plat_data.get_modes = rockchip_dp_get_modes; return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data); }
static int lm63_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct device *hwmon_dev; struct lm63_data *data; int groups = 0; data = devm_kzalloc(dev, sizeof(struct lm63_data), GFP_KERNEL); if (!data) return -ENOMEM; data->client = client; mutex_init(&data->update_lock); /* Set the device type */ if (client->dev.of_node) data->kind = (enum chips)of_device_get_match_data(&client->dev); else data->kind = id->driver_data; if (data->kind == lm64) data->temp2_offset = 16000; /* Initialize chip */ lm63_init_client(data); /* Register sysfs hooks */ data->groups[groups++] = &lm63_group; if (data->config & 0x04) /* tachometer enabled */ data->groups[groups++] = &lm63_group_fan1; if (data->kind == lm96163) { data->groups[groups++] = &lm63_group_temp2_type; data->groups[groups++] = &lm63_group_extra_lut; } hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, data, data->groups); return PTR_ERR_OR_ZERO(hwmon_dev); }
static int exynos_pcie_phy_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct exynos_pcie_phy *exynos_phy; struct phy *generic_phy; struct phy_provider *phy_provider; struct resource *res; const struct exynos_pcie_phy_data *drv_data; drv_data = of_device_get_match_data(dev); if (!drv_data) return -ENODEV; exynos_phy = devm_kzalloc(dev, sizeof(*exynos_phy), GFP_KERNEL); if (!exynos_phy) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); exynos_phy->phy_base = devm_ioremap_resource(dev, res); if (IS_ERR(exynos_phy->phy_base)) return PTR_ERR(exynos_phy->phy_base); res = platform_get_resource(pdev, IORESOURCE_MEM, 1); exynos_phy->blk_base = devm_ioremap_resource(dev, res); if (IS_ERR(exynos_phy->blk_base)) return PTR_ERR(exynos_phy->blk_base); exynos_phy->drv_data = drv_data; generic_phy = devm_phy_create(dev, dev->of_node, drv_data->ops); if (IS_ERR(generic_phy)) { dev_err(dev, "failed to create PHY\n"); return PTR_ERR(generic_phy); } phy_set_drvdata(generic_phy, exynos_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); return PTR_ERR_OR_ZERO(phy_provider); }
static int rcar_lvds_probe(struct platform_device *pdev) { struct rcar_lvds *lvds; struct resource *mem; int ret; lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); if (lvds == NULL) return -ENOMEM; platform_set_drvdata(pdev, lvds); lvds->dev = &pdev->dev; lvds->info = of_device_get_match_data(&pdev->dev); lvds->enabled = false; ret = rcar_lvds_parse_dt(lvds); if (ret < 0) return ret; lvds->bridge.driver_private = lvds; lvds->bridge.funcs = &rcar_lvds_bridge_ops; lvds->bridge.of_node = pdev->dev.of_node; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); lvds->mmio = devm_ioremap_resource(&pdev->dev, mem); if (IS_ERR(lvds->mmio)) return PTR_ERR(lvds->mmio); lvds->clock = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(lvds->clock)) { dev_err(&pdev->dev, "failed to get clock\n"); return PTR_ERR(lvds->clock); } drm_bridge_add(&lvds->bridge); return 0; }
static int uniphier_reset_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct uniphier_reset_priv *priv; const struct uniphier_reset_data *p, *data; struct regmap *regmap; struct device_node *parent; unsigned int nr_resets = 0; data = of_device_get_match_data(dev); if (WARN_ON(!data)) return -EINVAL; parent = of_get_parent(dev->of_node); /* parent should be syscon node */ regmap = syscon_node_to_regmap(parent); of_node_put(parent); if (IS_ERR(regmap)) { dev_err(dev, "failed to get regmap (error %ld)\n", PTR_ERR(regmap)); return PTR_ERR(regmap); } priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; for (p = data; p->id != UNIPHIER_RESET_ID_END; p++) nr_resets = max(nr_resets, p->id + 1); priv->rcdev.ops = &uniphier_reset_ops; priv->rcdev.owner = dev->driver->owner; priv->rcdev.of_node = dev->of_node; priv->rcdev.nr_resets = nr_resets; priv->dev = dev; priv->regmap = regmap; priv->data = data; return devm_reset_controller_register(&pdev->dev, &priv->rcdev); }
static int imx_ocotp_probe(struct platform_device *pdev) { const struct of_device_id *of_id; struct device *dev = &pdev->dev; struct resource *res; struct ocotp_priv *priv; struct nvmem_device *nvmem; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; priv->dev = dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); priv->base = devm_ioremap_resource(dev, res); if (IS_ERR(priv->base)) return PTR_ERR(priv->base); priv->clk = devm_clk_get(dev, NULL); if (IS_ERR(priv->clk)) return PTR_ERR(priv->clk); of_id = of_match_device(imx_ocotp_dt_ids, dev); priv->params = of_device_get_match_data(&pdev->dev); imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; imx_ocotp_nvmem_config.dev = dev; imx_ocotp_nvmem_config.priv = priv; priv->config = &imx_ocotp_nvmem_config; nvmem = nvmem_register(&imx_ocotp_nvmem_config); if (IS_ERR(nvmem)) return PTR_ERR(nvmem); platform_set_drvdata(pdev, nvmem); return 0; }
static int rk_gmac_probe(struct platform_device *pdev) { struct plat_stmmacenet_data *plat_dat; struct stmmac_resources stmmac_res; const struct rk_gmac_ops *data; int ret; data = of_device_get_match_data(&pdev->dev); if (!data) { dev_err(&pdev->dev, "no of match data provided\n"); return -EINVAL; } ret = stmmac_get_platform_resources(pdev, &stmmac_res); if (ret) return ret; plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); if (IS_ERR(plat_dat)) return PTR_ERR(plat_dat); plat_dat->has_gmac = true; plat_dat->init = rk_gmac_init; plat_dat->exit = rk_gmac_exit; plat_dat->fix_mac_speed = rk_fix_speed; plat_dat->suspend = rk_gmac_suspend; plat_dat->resume = rk_gmac_resume; plat_dat->bsp_priv = rk_gmac_setup(pdev, data); if (IS_ERR(plat_dat->bsp_priv)) return PTR_ERR(plat_dat->bsp_priv); ret = rk_gmac_init(pdev, plat_dat->bsp_priv); if (ret) return ret; return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); }
static int kirin_drm_platform_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct component_match *match = NULL; struct device_node *remote; dc_ops = (struct kirin_dc_ops *)of_device_get_match_data(dev); if (!dc_ops) { DRM_ERROR("failed to get dt id data\n"); return -EINVAL; } remote = kirin_get_remote_node(np); if (IS_ERR(remote)) return PTR_ERR(remote); drm_of_component_match_add(dev, &match, compare_of, remote); of_node_put(remote); return component_master_add_with_match(dev, &kirin_drm_ops, match); return 0; }
static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg) { struct msm_otg_platform_data *pdata; struct extcon_dev *ext_id, *ext_vbus; struct device_node *node = pdev->dev.of_node; struct property *prop; int len, ret, words; u32 val, tmp[3]; pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; motg->pdata = pdata; pdata->phy_type = (enum msm_usb_phy_type)of_device_get_match_data(&pdev->dev); if (!pdata->phy_type) return 1; motg->link_rst = devm_reset_control_get(&pdev->dev, "link"); if (IS_ERR(motg->link_rst)) return PTR_ERR(motg->link_rst); motg->phy_rst = devm_reset_control_get(&pdev->dev, "phy"); if (IS_ERR(motg->phy_rst)) motg->phy_rst = NULL; pdata->mode = usb_get_dr_mode(&pdev->dev); if (pdata->mode == USB_DR_MODE_UNKNOWN) pdata->mode = USB_DR_MODE_OTG; pdata->otg_control = OTG_PHY_CONTROL; if (!of_property_read_u32(node, "qcom,otg-control", &val)) if (val == OTG_PMIC_CONTROL) pdata->otg_control = val; if (!of_property_read_u32(node, "qcom,phy-num", &val) && val < 2) motg->phy_number = val; motg->vdd_levels[VDD_LEVEL_NONE] = USB_PHY_SUSP_DIG_VOL; motg->vdd_levels[VDD_LEVEL_MIN] = USB_PHY_VDD_DIG_VOL_MIN; motg->vdd_levels[VDD_LEVEL_MAX] = USB_PHY_VDD_DIG_VOL_MAX; if (of_get_property(node, "qcom,vdd-levels", &len) && len == sizeof(tmp)) { of_property_read_u32_array(node, "qcom,vdd-levels", tmp, len / sizeof(*tmp)); motg->vdd_levels[VDD_LEVEL_NONE] = tmp[VDD_LEVEL_NONE]; motg->vdd_levels[VDD_LEVEL_MIN] = tmp[VDD_LEVEL_MIN]; motg->vdd_levels[VDD_LEVEL_MAX] = tmp[VDD_LEVEL_MAX]; } motg->manual_pullup = of_property_read_bool(node, "qcom,manual-pullup"); motg->switch_gpio = devm_gpiod_get_optional(&pdev->dev, "switch", GPIOD_OUT_LOW); if (IS_ERR(motg->switch_gpio)) return PTR_ERR(motg->switch_gpio); ext_id = ERR_PTR(-ENODEV); ext_vbus = ERR_PTR(-ENODEV); if (of_property_read_bool(node, "extcon")) { /* Each one of them is not mandatory */ ext_vbus = extcon_get_edev_by_phandle(&pdev->dev, 0); if (IS_ERR(ext_vbus) && PTR_ERR(ext_vbus) != -ENODEV) return PTR_ERR(ext_vbus); ext_id = extcon_get_edev_by_phandle(&pdev->dev, 1); if (IS_ERR(ext_id) && PTR_ERR(ext_id) != -ENODEV) return PTR_ERR(ext_id); } if (!IS_ERR(ext_vbus)) { motg->vbus.extcon = ext_vbus; motg->vbus.nb.notifier_call = msm_otg_vbus_notifier; ret = extcon_register_notifier(ext_vbus, EXTCON_USB, &motg->vbus.nb); if (ret < 0) { dev_err(&pdev->dev, "register VBUS notifier failed\n"); return ret; } ret = extcon_get_cable_state_(ext_vbus, EXTCON_USB); if (ret) set_bit(B_SESS_VLD, &motg->inputs); else clear_bit(B_SESS_VLD, &motg->inputs); } if (!IS_ERR(ext_id)) { motg->id.extcon = ext_id; motg->id.nb.notifier_call = msm_otg_id_notifier; ret = extcon_register_notifier(ext_id, EXTCON_USB_HOST, &motg->id.nb); if (ret < 0) { dev_err(&pdev->dev, "register ID notifier failed\n"); extcon_unregister_notifier(motg->vbus.extcon, EXTCON_USB, &motg->vbus.nb); return ret; } ret = extcon_get_cable_state_(ext_id, EXTCON_USB_HOST); if (ret) clear_bit(ID, &motg->inputs); else set_bit(ID, &motg->inputs); } prop = of_find_property(node, "qcom,phy-init-sequence", &len); if (!prop || !len) return 0; words = len / sizeof(u32); if (words >= ULPI_EXT_VENDOR_SPECIFIC) { dev_warn(&pdev->dev, "Too big PHY init sequence %d\n", words); return 0; } pdata->phy_init_seq = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); if (!pdata->phy_init_seq) return 0; ret = of_property_read_u32_array(node, "qcom,phy-init-sequence", pdata->phy_init_seq, words); if (!ret) pdata->phy_init_sz = words; return 0; }