static struct alpha_pll_clk *alpha_pll_dt_parser(struct device *dev, struct device_node *np) { struct alpha_pll_clk *pll; struct msmclk_data *drv; pll = devm_kzalloc(dev, sizeof(*pll), GFP_KERNEL); if (!pll) { dt_err(np, "memory alloc failure\n"); return ERR_PTR(-ENOMEM); } if (of_property_read_u32(np, "qcom,base-offset", &pll->offset)) { dt_err(np, "missing qcom,base-offset\n"); return ERR_PTR(-EINVAL); } /* Optional property */ of_property_read_u32(np, "qcom,post-div-config", &pll->post_div_config); pll->masks = devm_kzalloc(dev, sizeof(*pll->masks), GFP_KERNEL); if (!pll->masks) { dt_err(np, "memory alloc failure\n"); return ERR_PTR(-ENOMEM); } if (of_device_is_compatible(np, "qcom,fixed-alpha-pll-20p") || of_device_is_compatible(np, "qcom,alpha-pll-20p")) { *pll->masks = masks_20nm_p; pll->vco_tbl = vco_20nm_p; pll->num_vco = ARRAY_SIZE(vco_20nm_p); } else if (of_device_is_compatible(np, "qcom,fixed-alpha-pll-20t") || of_device_is_compatible(np, "qcom,alpha-pll-20t")) { *pll->masks = masks_20nm_t; pll->vco_tbl = vco_20nm_t; pll->num_vco = ARRAY_SIZE(vco_20nm_t); } else { dt_err(np, "unexpected compatible string\n"); return ERR_PTR(-EINVAL); } drv = msmclk_parse_phandle(dev, np->parent->phandle); if (IS_ERR_OR_NULL(drv)) return ERR_CAST(drv); pll->base = &drv->base; return pll; }
static void *votable_pll_clk_dt_parser(struct device *dev, struct device_node *np) { struct pll_vote_clk *v, *peer; struct clk *c; u32 val, rc; phandle p; struct msmclk_data *drv; v = devm_kzalloc(dev, sizeof(*v), GFP_KERNEL); if (!v) { dt_err(np, "memory alloc failure\n"); return ERR_PTR(-ENOMEM); } drv = msmclk_parse_phandle(dev, np->parent->phandle); if (IS_ERR_OR_NULL(drv)) return ERR_CAST(drv); v->base = &drv->base; rc = of_property_read_u32(np, "qcom,en-offset", (u32 *)&v->en_reg); if (rc) { dt_err(np, "missing qcom,en-offset dt property\n"); return ERR_PTR(-EINVAL); } rc = of_property_read_u32(np, "qcom,en-bit", &val); if (rc) { dt_err(np, "missing qcom,en-bit dt property\n"); return ERR_PTR(-EINVAL); } v->en_mask = BIT(val); rc = of_property_read_u32(np, "qcom,status-offset", (u32 *)&v->status_reg); if (rc) { dt_err(np, "missing qcom,status-offset dt property\n"); return ERR_PTR(-EINVAL); } rc = of_property_read_u32(np, "qcom,status-bit", &val); if (rc) { dt_err(np, "missing qcom,status-bit dt property\n"); return ERR_PTR(-EINVAL); } v->status_mask = BIT(val); rc = of_property_read_u32(np, "qcom,pll-config-rate", &val); if (rc) { dt_err(np, "missing qcom,pll-config-rate dt property\n"); return ERR_PTR(-EINVAL); } v->c.rate = val; if (of_device_is_compatible(np, "qcom,active-only-pll")) v->soft_vote_mask = PLL_SOFT_VOTE_ACPU; else if (of_device_is_compatible(np, "qcom,sleep-active-pll")) v->soft_vote_mask = PLL_SOFT_VOTE_PRIMARY; if (of_device_is_compatible(np, "qcom,votable-pll")) { v->c.ops = &clk_ops_pll_vote; return msmclk_generic_clk_init(dev, np, &v->c); } rc = of_property_read_phandle_index(np, "qcom,peer", 0, &p); if (rc) { dt_err(np, "missing qcom,peer dt property\n"); return ERR_PTR(-EINVAL); } c = msmclk_lookup_phandle(dev, p); if (!IS_ERR_OR_NULL(c)) { v->soft_vote = devm_kzalloc(dev, sizeof(*v->soft_vote), GFP_KERNEL); if (!v->soft_vote) { dt_err(np, "memory alloc failure\n"); return ERR_PTR(-ENOMEM); } peer = to_pll_vote_clk(c); peer->soft_vote = v->soft_vote; } v->c.ops = &clk_ops_pll_acpu_vote; return msmclk_generic_clk_init(dev, np, &v->c); }