Lines Matching +full:imx1 +full:- +full:clock
16 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
75 { .compatible = "fsl,imx1-weim", .data = &imx1_weim_devtype, },
77 { .compatible = "fsl,imx27-weim", .data = &imx27_weim_devtype, },
79 { .compatible = "fsl,imx50-weim", .data = &imx50_weim_devtype, },
80 { .compatible = "fsl,imx6q-weim", .data = &imx50_weim_devtype, },
82 { .compatible = "fsl,imx51-weim", .data = &imx51_weim_devtype, },
89 struct device_node *np = pdev->dev.of_node; in imx_weim_gpr_setup()
104 gpr = syscon_regmap_lookup_by_phandle(np, "fsl,weim-cs-gpr"); in imx_weim_gpr_setup()
106 dev_dbg(&pdev->dev, "failed to find weim-cs-gpr\n"); in imx_weim_gpr_setup()
132 dev_err(&pdev->dev, "Invalid 'ranges' configuration\n"); in imx_weim_gpr_setup()
133 return -EINVAL; in imx_weim_gpr_setup()
148 if (WARN_ON(devtype->cs_regs_count > MAX_CS_REGS_COUNT)) in weim_timing_setup()
149 return -EINVAL; in weim_timing_setup()
150 if (WARN_ON(devtype->cs_count > MAX_CS_COUNT)) in weim_timing_setup()
151 return -EINVAL; in weim_timing_setup()
154 base = priv->base; in weim_timing_setup()
155 ts = &priv->timing_state; in weim_timing_setup()
157 ret = of_property_read_u32_array(np, "fsl,weim-cs-timing", in weim_timing_setup()
158 value, devtype->cs_regs_count); in weim_timing_setup()
170 return -EINVAL; in weim_timing_setup()
178 if (cs_idx >= devtype->cs_count) in weim_timing_setup()
179 return -EINVAL; in weim_timing_setup()
181 /* prevent re-configuring a CS that's already been configured */ in weim_timing_setup()
182 cst = &ts->cs[cs_idx]; in weim_timing_setup()
183 if (cst->is_applied && memcmp(value, cst->regs, in weim_timing_setup()
184 devtype->cs_regs_count * sizeof(u32))) { in weim_timing_setup()
185 dev_err(dev, "fsl,weim-cs-timing conflict on %pOF", np); in weim_timing_setup()
186 return -EINVAL; in weim_timing_setup()
190 for (i = 0; i < devtype->cs_regs_count; i++) in weim_timing_setup()
192 base + cs_idx * devtype->cs_stride + i * 4); in weim_timing_setup()
193 if (!cst->is_applied) { in weim_timing_setup()
194 cst->is_applied = true; in weim_timing_setup()
195 memcpy(cst->regs, value, in weim_timing_setup()
196 devtype->cs_regs_count * sizeof(u32)); in weim_timing_setup()
206 &pdev->dev); in weim_parse_dt()
207 const struct imx_weim_devtype *devtype = of_id->data; in weim_parse_dt()
220 priv = dev_get_drvdata(&pdev->dev); in weim_parse_dt()
221 base = priv->base; in weim_parse_dt()
223 if (of_property_read_bool(pdev->dev.of_node, "fsl,burst-clk-enable")) { in weim_parse_dt()
224 if (devtype->wcr_bcm) { in weim_parse_dt()
225 reg = readl(base + devtype->wcr_offset); in weim_parse_dt()
226 reg |= devtype->wcr_bcm; in weim_parse_dt()
228 if (of_property_read_bool(pdev->dev.of_node, in weim_parse_dt()
229 "fsl,continuous-burst-clk")) { in weim_parse_dt()
230 if (devtype->wcr_cont_bclk) { in weim_parse_dt()
231 reg |= devtype->wcr_cont_bclk; in weim_parse_dt()
233 dev_err(&pdev->dev, in weim_parse_dt()
235 return -EINVAL; in weim_parse_dt()
239 writel(reg, base + devtype->wcr_offset); in weim_parse_dt()
241 dev_err(&pdev->dev, "burst clk mode not supported.\n"); in weim_parse_dt()
242 return -EINVAL; in weim_parse_dt()
246 for_each_available_child_of_node(pdev->dev.of_node, child) { in weim_parse_dt()
247 ret = weim_timing_setup(&pdev->dev, child, devtype); in weim_parse_dt()
249 dev_warn(&pdev->dev, "%pOF set timing failed.\n", in weim_parse_dt()
256 ret = of_platform_default_populate(pdev->dev.of_node, in weim_parse_dt()
257 NULL, &pdev->dev); in weim_parse_dt()
259 dev_err(&pdev->dev, "%pOF fail to create devices.\n", in weim_parse_dt()
260 pdev->dev.of_node); in weim_parse_dt()
271 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in weim_probe()
273 return -ENOMEM; in weim_probe()
280 priv->base = base; in weim_probe()
281 dev_set_drvdata(&pdev->dev, priv); in weim_probe()
283 /* get the clock */ in weim_probe()
284 clk = devm_clk_get(&pdev->dev, NULL); in weim_probe()
297 dev_info(&pdev->dev, "Driver registered.\n"); in weim_probe()
314 of_id = of_match_node(weim_id_table, rd->dn->parent); in of_weim_notify()
318 devtype = of_id->data; in of_weim_notify()
320 pdev = of_find_device_by_node(rd->dn->parent); in of_weim_notify()
323 __func__, rd->dn->parent); in of_weim_notify()
325 return notifier_from_errno(-EINVAL); in of_weim_notify()
328 if (weim_timing_setup(&pdev->dev, rd->dn, devtype)) in of_weim_notify()
329 dev_warn(&pdev->dev, in of_weim_notify()
330 "Failed to setup timing for '%pOF'\n", rd->dn); in of_weim_notify()
332 if (!of_node_check_flag(rd->dn, OF_POPULATED)) { in of_weim_notify()
338 rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; in of_weim_notify()
339 if (!of_platform_device_create(rd->dn, NULL, &pdev->dev)) { in of_weim_notify()
340 dev_err(&pdev->dev, in of_weim_notify()
342 rd->dn); in of_weim_notify()
343 ret = notifier_from_errno(-EINVAL); in of_weim_notify()
351 if (!of_node_check_flag(rd->dn, OF_POPULATED)) in of_weim_notify()
354 of_id = of_match_node(weim_id_table, rd->dn->parent); in of_weim_notify()
358 pdev = of_find_device_by_node(rd->dn); in of_weim_notify()
361 rd->dn); in of_weim_notify()
363 ret = notifier_from_errno(-EINVAL); in of_weim_notify()
365 of_platform_device_destroy(&pdev->dev, NULL); in of_weim_notify()
384 .name = "imx-weim",