Lines Matching refs:vtg
98 static void vtg_register(struct sti_vtg *vtg) in vtg_register() argument
100 list_add_tail(&vtg->link, &vtg_lookup); in vtg_register()
105 struct sti_vtg *vtg; in of_vtg_find() local
107 list_for_each_entry(vtg, &vtg_lookup, link) { in of_vtg_find()
108 if (vtg->np == np) in of_vtg_find()
109 return vtg; in of_vtg_find()
114 static void vtg_reset(struct sti_vtg *vtg) in vtg_reset() argument
117 if (vtg->slave) in vtg_reset()
118 vtg_reset(vtg->slave); in vtg_reset()
120 writel(1, vtg->regs + VTG_DRST_AUTOC); in vtg_reset()
149 static void vtg_set_mode(struct sti_vtg *vtg, in vtg_set_mode() argument
154 if (vtg->slave) in vtg_set_mode()
155 vtg_set_mode(vtg->slave, VTG_TYPE_SLAVE_BY_EXT0, mode); in vtg_set_mode()
158 writel(mode->htotal, vtg->regs + VTG_CLKLN); in vtg_set_mode()
161 writel(mode->vtotal * 2, vtg->regs + VTG_HLFLN); in vtg_set_mode()
164 vtg_set_output_window(vtg->regs, mode); in vtg_set_mode()
169 writel(tmp, vtg->regs + VTG_H_HD_1); in vtg_set_mode()
173 writel(tmp, vtg->regs + VTG_TOP_V_VD_1); in vtg_set_mode()
174 writel(tmp, vtg->regs + VTG_BOT_V_VD_1); in vtg_set_mode()
178 writel(tmp, vtg->regs + VTG_TOP_V_HD_1); in vtg_set_mode()
179 writel(tmp, vtg->regs + VTG_BOT_V_HD_1); in vtg_set_mode()
183 writel(tmp, vtg->regs + VTG_H_HD_2); in vtg_set_mode()
187 writel(tmp, vtg->regs + VTG_TOP_V_VD_2); in vtg_set_mode()
188 writel(tmp, vtg->regs + VTG_BOT_V_VD_2); in vtg_set_mode()
189 writel(0, vtg->regs + VTG_TOP_V_HD_2); in vtg_set_mode()
190 writel(0, vtg->regs + VTG_BOT_V_HD_2); in vtg_set_mode()
195 writel(tmp, vtg->regs + VTG_H_HD_3); in vtg_set_mode()
199 writel(tmp, vtg->regs + VTG_TOP_V_VD_3); in vtg_set_mode()
200 writel(tmp, vtg->regs + VTG_BOT_V_VD_3); in vtg_set_mode()
204 writel(tmp, vtg->regs + VTG_TOP_V_HD_3); in vtg_set_mode()
205 writel(tmp, vtg->regs + VTG_BOT_V_HD_3); in vtg_set_mode()
209 writel(tmp, vtg->regs + VTG_H_HD_4); in vtg_set_mode()
213 writel(tmp, vtg->regs + VTG_TOP_V_VD_4); in vtg_set_mode()
214 writel(tmp, vtg->regs + VTG_BOT_V_VD_4); in vtg_set_mode()
215 writel(0, vtg->regs + VTG_TOP_V_HD_4); in vtg_set_mode()
216 writel(0, vtg->regs + VTG_BOT_V_HD_4); in vtg_set_mode()
219 writel(type, vtg->regs + VTG_MODE); in vtg_set_mode()
222 static void vtg_enable_irq(struct sti_vtg *vtg) in vtg_enable_irq() argument
225 writel(0xFFFF, vtg->regs + VTG_HOST_ITS_BCLR); in vtg_enable_irq()
226 writel(0xFFFF, vtg->regs + VTG_HOST_ITM_BCLR); in vtg_enable_irq()
227 writel(VTG_IRQ_MASK, vtg->regs + VTG_HOST_ITM_BSET); in vtg_enable_irq()
230 void sti_vtg_set_config(struct sti_vtg *vtg, in sti_vtg_set_config() argument
234 vtg_set_mode(vtg, VTG_TYPE_MASTER, mode); in sti_vtg_set_config()
236 vtg_reset(vtg); in sti_vtg_set_config()
239 if (vtg->slave) in sti_vtg_set_config()
240 vtg_enable_irq(vtg->slave); in sti_vtg_set_config()
242 vtg_enable_irq(vtg); in sti_vtg_set_config()
282 int sti_vtg_register_client(struct sti_vtg *vtg, struct notifier_block *nb, in sti_vtg_register_client() argument
285 if (vtg->slave) in sti_vtg_register_client()
286 return sti_vtg_register_client(vtg->slave, nb, crtc); in sti_vtg_register_client()
288 vtg->crtc = crtc; in sti_vtg_register_client()
289 return raw_notifier_chain_register(&vtg->notifier_list, nb); in sti_vtg_register_client()
292 int sti_vtg_unregister_client(struct sti_vtg *vtg, struct notifier_block *nb) in sti_vtg_unregister_client() argument
294 if (vtg->slave) in sti_vtg_unregister_client()
295 return sti_vtg_unregister_client(vtg->slave, nb); in sti_vtg_unregister_client()
297 return raw_notifier_chain_unregister(&vtg->notifier_list, nb); in sti_vtg_unregister_client()
302 struct sti_vtg *vtg = arg; in vtg_irq_thread() local
305 event = (vtg->irq_status & VTG_IRQ_TOP) ? in vtg_irq_thread()
308 raw_notifier_call_chain(&vtg->notifier_list, event, vtg->crtc); in vtg_irq_thread()
315 struct sti_vtg *vtg = arg; in vtg_irq() local
317 vtg->irq_status = readl(vtg->regs + VTG_HOST_ITS); in vtg_irq()
319 writel(vtg->irq_status, vtg->regs + VTG_HOST_ITS_BCLR); in vtg_irq()
322 readl(vtg->regs + VTG_HOST_ITS); in vtg_irq()
331 struct sti_vtg *vtg; in vtg_probe() local
335 vtg = devm_kzalloc(dev, sizeof(*vtg), GFP_KERNEL); in vtg_probe()
336 if (!vtg) in vtg_probe()
339 vtg->dev = dev; in vtg_probe()
340 vtg->np = pdev->dev.of_node; in vtg_probe()
348 vtg->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); in vtg_probe()
352 vtg->slave = of_vtg_find(np); in vtg_probe()
354 if (!vtg->slave) in vtg_probe()
357 vtg->irq = platform_get_irq(pdev, 0); in vtg_probe()
358 if (IS_ERR_VALUE(vtg->irq)) { in vtg_probe()
360 return vtg->irq; in vtg_probe()
363 RAW_INIT_NOTIFIER_HEAD(&vtg->notifier_list); in vtg_probe()
365 ret = devm_request_threaded_irq(dev, vtg->irq, vtg_irq, in vtg_probe()
367 dev_name(dev), vtg); in vtg_probe()
374 vtg_register(vtg); in vtg_probe()
375 platform_set_drvdata(pdev, vtg); in vtg_probe()
377 DRM_INFO("%s %s\n", __func__, dev_name(vtg->dev)); in vtg_probe()