Lines Matching refs:vtg
89 static void vtg_register(struct sti_vtg *vtg) in vtg_register() argument
91 list_add_tail(&vtg->link, &vtg_lookup); in vtg_register()
96 struct sti_vtg *vtg; in of_vtg_find() local
98 list_for_each_entry(vtg, &vtg_lookup, link) { in of_vtg_find()
99 if (vtg->np == np) in of_vtg_find()
100 return vtg; in of_vtg_find()
106 static void vtg_reset(struct sti_vtg *vtg) in vtg_reset() argument
109 if (vtg->slave) in vtg_reset()
110 vtg_reset(vtg->slave); in vtg_reset()
112 writel(1, vtg->regs + VTG_DRST_AUTOC); in vtg_reset()
115 static void vtg_set_mode(struct sti_vtg *vtg, in vtg_set_mode() argument
120 if (vtg->slave) in vtg_set_mode()
121 vtg_set_mode(vtg->slave, VTG_TYPE_SLAVE_BY_EXT0, mode); in vtg_set_mode()
123 writel(mode->htotal, vtg->regs + VTG_CLKLN); in vtg_set_mode()
124 writel(mode->vtotal * 2, vtg->regs + VTG_HLFLN); in vtg_set_mode()
128 writel(tmp, vtg->regs + VTG_VID_TFO); in vtg_set_mode()
129 writel(tmp, vtg->regs + VTG_VID_BFO); in vtg_set_mode()
133 writel(tmp, vtg->regs + VTG_VID_TFS); in vtg_set_mode()
134 writel(tmp, vtg->regs + VTG_VID_BFS); in vtg_set_mode()
138 writel(tmp, vtg->regs + VTG_H_HD_1); in vtg_set_mode()
139 writel(tmp, vtg->regs + VTG_H_HD_2); in vtg_set_mode()
143 writel(tmp, vtg->regs + VTG_TOP_V_VD_1); in vtg_set_mode()
144 writel(tmp, vtg->regs + VTG_BOT_V_VD_1); in vtg_set_mode()
145 writel(0, vtg->regs + VTG_TOP_V_HD_1); in vtg_set_mode()
146 writel(0, vtg->regs + VTG_BOT_V_HD_1); in vtg_set_mode()
149 writel(tmp, vtg->regs + VTG_TOP_V_VD_2); in vtg_set_mode()
150 writel(tmp, vtg->regs + VTG_BOT_V_VD_2); in vtg_set_mode()
151 writel(0, vtg->regs + VTG_TOP_V_HD_2); in vtg_set_mode()
152 writel(0, vtg->regs + VTG_BOT_V_HD_2); in vtg_set_mode()
157 writel(tmp, vtg->regs + VTG_H_HD_3); in vtg_set_mode()
161 writel(tmp, vtg->regs + VTG_TOP_V_VD_3); in vtg_set_mode()
162 writel(tmp, vtg->regs + VTG_BOT_V_VD_3); in vtg_set_mode()
166 writel(tmp, vtg->regs + VTG_TOP_V_HD_3); in vtg_set_mode()
167 writel(tmp, vtg->regs + VTG_BOT_V_HD_3); in vtg_set_mode()
170 writel(type, vtg->regs + VTG_MODE); in vtg_set_mode()
173 static void vtg_enable_irq(struct sti_vtg *vtg) in vtg_enable_irq() argument
176 writel(0xFFFF, vtg->regs + VTG_HOST_ITS_BCLR); in vtg_enable_irq()
177 writel(0xFFFF, vtg->regs + VTG_HOST_ITM_BCLR); in vtg_enable_irq()
178 writel(VTG_IRQ_MASK, vtg->regs + VTG_HOST_ITM_BSET); in vtg_enable_irq()
181 void sti_vtg_set_config(struct sti_vtg *vtg, in sti_vtg_set_config() argument
185 vtg_set_mode(vtg, VTG_TYPE_MASTER, mode); in sti_vtg_set_config()
187 vtg_reset(vtg); in sti_vtg_set_config()
190 if (vtg->slave) in sti_vtg_set_config()
191 vtg_enable_irq(vtg->slave); in sti_vtg_set_config()
193 vtg_enable_irq(vtg); in sti_vtg_set_config()
236 int sti_vtg_register_client(struct sti_vtg *vtg, in sti_vtg_register_client() argument
239 if (vtg->slave) in sti_vtg_register_client()
240 return sti_vtg_register_client(vtg->slave, nb, crtc_id); in sti_vtg_register_client()
242 vtg->crtc_id = crtc_id; in sti_vtg_register_client()
243 return raw_notifier_chain_register(&vtg->notifier_list, nb); in sti_vtg_register_client()
247 int sti_vtg_unregister_client(struct sti_vtg *vtg, struct notifier_block *nb) in sti_vtg_unregister_client() argument
249 if (vtg->slave) in sti_vtg_unregister_client()
250 return sti_vtg_unregister_client(vtg->slave, nb); in sti_vtg_unregister_client()
252 return raw_notifier_chain_unregister(&vtg->notifier_list, nb); in sti_vtg_unregister_client()
258 struct sti_vtg *vtg = arg; in vtg_irq_thread() local
261 event = (vtg->irq_status & VTG_IRQ_TOP) ? in vtg_irq_thread()
264 raw_notifier_call_chain(&vtg->notifier_list, event, &vtg->crtc_id); in vtg_irq_thread()
271 struct sti_vtg *vtg = arg; in vtg_irq() local
273 vtg->irq_status = readl(vtg->regs + VTG_HOST_ITS); in vtg_irq()
275 writel(vtg->irq_status, vtg->regs + VTG_HOST_ITS_BCLR); in vtg_irq()
278 readl(vtg->regs + VTG_HOST_ITS); in vtg_irq()
287 struct sti_vtg *vtg; in vtg_probe() local
292 vtg = devm_kzalloc(dev, sizeof(*vtg), GFP_KERNEL); in vtg_probe()
293 if (!vtg) in vtg_probe()
296 vtg->dev = dev; in vtg_probe()
297 vtg->np = pdev->dev.of_node; in vtg_probe()
305 vtg->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); in vtg_probe()
306 if (!vtg->regs) { in vtg_probe()
313 vtg->slave = of_vtg_find(np); in vtg_probe()
315 if (!vtg->slave) in vtg_probe()
318 vtg->irq = platform_get_irq(pdev, 0); in vtg_probe()
319 if (IS_ERR_VALUE(vtg->irq)) { in vtg_probe()
321 return vtg->irq; in vtg_probe()
325 dev_name(vtg->dev)); in vtg_probe()
327 RAW_INIT_NOTIFIER_HEAD(&vtg->notifier_list); in vtg_probe()
329 ret = devm_request_threaded_irq(dev, vtg->irq, vtg_irq, in vtg_probe()
330 vtg_irq_thread, IRQF_ONESHOT, irq_name, vtg); in vtg_probe()
337 vtg_register(vtg); in vtg_probe()
338 platform_set_drvdata(pdev, vtg); in vtg_probe()
340 DRM_INFO("%s %s\n", __func__, dev_name(vtg->dev)); in vtg_probe()