Lines Matching +full:dev +full:- +full:ctrl

1 // SPDX-License-Identifier: GPL-2.0-or-later
20 #include <linux/dma-mapping.h>
32 struct mmphw_ctrl *ctrl = (struct mmphw_ctrl *)dev_id; in ctrl_handle_irq() local
35 isr = readl_relaxed(ctrl->reg_base + SPU_IRQ_ISR); in ctrl_handle_irq()
36 imask = readl_relaxed(ctrl->reg_base + SPU_IRQ_ENA); in ctrl_handle_irq()
40 tmp = readl_relaxed(ctrl->reg_base + SPU_IRQ_ISR); in ctrl_handle_irq()
42 writel_relaxed(~isr, ctrl->reg_base + SPU_IRQ_ISR); in ctrl_handle_irq()
43 } while ((isr = readl_relaxed(ctrl->reg_base + SPU_IRQ_ISR)) & imask); in ctrl_handle_irq()
122 struct mmp_path *path = overlay->path; in dmafetch_set_fmt()
123 tmp = readl_relaxed(ctrl_regs(path) + dma_ctrl(0, path->id)); in dmafetch_set_fmt()
125 tmp |= fmt_to_reg(overlay, overlay->win.pix_fmt); in dmafetch_set_fmt()
126 writel_relaxed(tmp, ctrl_regs(path) + dma_ctrl(0, path->id)); in dmafetch_set_fmt()
131 struct lcd_regs *regs = path_regs(overlay->path); in overlay_set_win()
134 memcpy(&overlay->win, win, sizeof(struct mmp_win)); in overlay_set_win()
136 mutex_lock(&overlay->access_ok); in overlay_set_win()
139 writel_relaxed(win->pitch[0], in overlay_set_win()
140 (void __iomem *)&regs->v_pitch_yc); in overlay_set_win()
141 writel_relaxed(win->pitch[2] << 16 | win->pitch[1], in overlay_set_win()
142 (void __iomem *)&regs->v_pitch_uv); in overlay_set_win()
144 writel_relaxed((win->ysrc << 16) | win->xsrc, in overlay_set_win()
145 (void __iomem *)&regs->v_size); in overlay_set_win()
146 writel_relaxed((win->ydst << 16) | win->xdst, in overlay_set_win()
147 (void __iomem *)&regs->v_size_z); in overlay_set_win()
148 writel_relaxed(win->ypos << 16 | win->xpos, in overlay_set_win()
149 (void __iomem *)&regs->v_start); in overlay_set_win()
151 writel_relaxed(win->pitch[0], (void __iomem *)&regs->g_pitch); in overlay_set_win()
153 writel_relaxed((win->ysrc << 16) | win->xsrc, in overlay_set_win()
154 (void __iomem *)&regs->g_size); in overlay_set_win()
155 writel_relaxed((win->ydst << 16) | win->xdst, in overlay_set_win()
156 (void __iomem *)&regs->g_size_z); in overlay_set_win()
157 writel_relaxed(win->ypos << 16 | win->xpos, in overlay_set_win()
158 (void __iomem *)&regs->g_start); in overlay_set_win()
162 mutex_unlock(&overlay->access_ok); in overlay_set_win()
171 struct mmp_path *path = overlay->path; in dmafetch_onoff()
173 mutex_lock(&overlay->access_ok); in dmafetch_onoff()
174 tmp = readl_relaxed(ctrl_regs(path) + dma_ctrl(0, path->id)); in dmafetch_onoff()
177 writel(tmp, ctrl_regs(path) + dma_ctrl(0, path->id)); in dmafetch_onoff()
178 mutex_unlock(&overlay->access_ok); in dmafetch_onoff()
184 mutex_lock(&path->access_ok); in path_enabledisable()
191 mutex_unlock(&path->access_ok); in path_enabledisable()
196 if (path->status == on) { in path_onoff()
197 dev_info(path->dev, "path %s is already %s\n", in path_onoff()
198 path->name, stat_name(path->status)); in path_onoff()
205 if (path->panel && path->panel->set_onoff) in path_onoff()
206 path->panel->set_onoff(path->panel, 1); in path_onoff()
208 if (path->panel && path->panel->set_onoff) in path_onoff()
209 path->panel->set_onoff(path->panel, 0); in path_onoff()
213 path->status = on; in path_onoff()
218 if (overlay->status == on) { in overlay_set_onoff()
219 dev_info(overlay_to_ctrl(overlay)->dev, "overlay %s is already %s\n", in overlay_set_onoff()
220 overlay->path->name, stat_name(overlay->status)); in overlay_set_onoff()
223 overlay->status = on; in overlay_set_onoff()
225 if (overlay->path->ops.check_status(overlay->path) in overlay_set_onoff()
226 != overlay->path->status) in overlay_set_onoff()
227 path_onoff(overlay->path, on); in overlay_set_onoff()
232 overlay->dmafetch_id = fetch_id; in overlay_set_fetch()
237 struct lcd_regs *regs = path_regs(overlay->path); in overlay_set_addr()
240 memcpy(&overlay->addr, addr, sizeof(struct mmp_addr)); in overlay_set_addr()
243 writel_relaxed(addr->phys[0], (void __iomem *)&regs->v_y0); in overlay_set_addr()
244 writel_relaxed(addr->phys[1], (void __iomem *)&regs->v_u0); in overlay_set_addr()
245 writel_relaxed(addr->phys[2], (void __iomem *)&regs->v_v0); in overlay_set_addr()
247 writel_relaxed(addr->phys[0], (void __iomem *)&regs->g_0); in overlay_set_addr()
249 return overlay->addr.phys[0]; in overlay_set_addr()
256 link_config = path_to_path_plat(path)->link_config, in path_set_mode()
257 dsi_rbswap = path_to_path_plat(path)->link_config; in path_set_mode()
260 memcpy(&path->mode, mode, sizeof(struct mmp_mode)); in path_set_mode()
262 mutex_lock(&path->access_ok); in path_set_mode()
265 tmp = readl_relaxed(ctrl_regs(path) + intf_ctrl(path->id)) & 0x1; in path_set_mode()
266 tmp |= mode->vsync_invert ? 0 : 0x8; in path_set_mode()
267 tmp |= mode->hsync_invert ? 0 : 0x4; in path_set_mode()
270 writel_relaxed(tmp, ctrl_regs(path) + intf_ctrl(path->id)); in path_set_mode()
273 tmp = readl_relaxed(ctrl_regs(path) + intf_rbswap_ctrl(path->id)) & in path_set_mode()
276 writel_relaxed(tmp, ctrl_regs(path) + intf_rbswap_ctrl(path->id)); in path_set_mode()
278 writel_relaxed((mode->yres << 16) | mode->xres, in path_set_mode()
279 (void __iomem *)&regs->screen_active); in path_set_mode()
280 writel_relaxed((mode->left_margin << 16) | mode->right_margin, in path_set_mode()
281 (void __iomem *)&regs->screen_h_porch); in path_set_mode()
282 writel_relaxed((mode->upper_margin << 16) | mode->lower_margin, in path_set_mode()
283 (void __iomem *)&regs->screen_v_porch); in path_set_mode()
284 total_x = mode->xres + mode->left_margin + mode->right_margin + in path_set_mode()
285 mode->hsync_len; in path_set_mode()
286 total_y = mode->yres + mode->upper_margin + mode->lower_margin + in path_set_mode()
287 mode->vsync_len; in path_set_mode()
289 (void __iomem *)&regs->screen_size); in path_set_mode()
291 /* vsync ctrl */ in path_set_mode()
292 if (path->output_type == PATH_OUT_DSI) in path_set_mode()
295 vsync_ctrl = ((mode->xres + mode->right_margin) << 16) in path_set_mode()
296 | (mode->xres + mode->right_margin); in path_set_mode()
297 writel_relaxed(vsync_ctrl, (void __iomem *)&regs->vsync_ctrl); in path_set_mode()
300 sclk_src = clk_get_rate(path_to_ctrl(path)->clk); in path_set_mode()
301 sclk_div = sclk_src / mode->pixclock_freq; in path_set_mode()
302 if (sclk_div * mode->pixclock_freq < sclk_src) in path_set_mode()
305 dev_info(path->dev, "%s sclk_src %d sclk_div 0x%x pclk %d\n", in path_set_mode()
306 __func__, sclk_src, sclk_div, mode->pixclock_freq); in path_set_mode()
313 mutex_unlock(&path->access_ok); in path_set_mode()
323 static void ctrl_set_default(struct mmphw_ctrl *ctrl) in ctrl_set_default() argument
331 tmp = readl_relaxed(ctrl->reg_base + LCD_TOP_CTRL); in ctrl_set_default()
333 writel_relaxed(tmp, ctrl->reg_base + LCD_TOP_CTRL); in ctrl_set_default()
339 tmp = readl_relaxed(ctrl->reg_base + SPU_IRQ_ENA); in ctrl_set_default()
342 writel_relaxed(tmp, ctrl->reg_base + SPU_IRQ_ENA); in ctrl_set_default()
350 path_config = path_to_path_plat(path)->path_config; in path_set_default()
353 if (PATH_OUT_PARALLEL == path->output_type) { in path_set_default()
375 writel_relaxed(dma_ctrl1, ctrl_regs(path) + dma_ctrl(1, path->id)); in path_set_default()
378 writel_relaxed(0x00000000, (void __iomem *)&regs->blank_color); in path_set_default()
379 writel_relaxed(0x00000000, (void __iomem *)&regs->g_1); in path_set_default()
380 writel_relaxed(0x00000000, (void __iomem *)&regs->g_start); in path_set_default()
388 tmp = readl_relaxed(ctrl_regs(path) + dma_ctrl(0, path->id)); in path_set_default()
390 if (PATH_TV == path->id) in path_set_default()
392 writel_relaxed(tmp, ctrl_regs(path) + dma_ctrl(0, path->id)); in path_set_default()
398 struct mmphw_ctrl *ctrl = path_plat->ctrl; in path_init() local
402 dev_info(ctrl->dev, "%s: %s\n", __func__, config->name); in path_init()
409 path_info->name = config->name; in path_init()
410 path_info->id = path_plat->id; in path_init()
411 path_info->dev = ctrl->dev; in path_init()
412 path_info->overlay_num = config->overlay_num; in path_init()
413 path_info->overlay_ops = &mmphw_overlay_ops; in path_init()
414 path_info->set_mode = path_set_mode; in path_init()
415 path_info->plat_data = path_plat; in path_init()
423 path_plat->path = path; in path_init()
424 path_plat->path_config = config->path_config; in path_init()
425 path_plat->link_config = config->link_config; in path_init()
426 path_plat->dsi_rbswap = config->dsi_rbswap; in path_init()
438 mmp_unregister_path(path_plat->path); in path_deinit()
447 struct mmphw_ctrl *ctrl = NULL; in mmphw_probe() local
452 dev_err(&pdev->dev, "%s: no IO memory defined\n", __func__); in mmphw_probe()
453 ret = -ENOENT; in mmphw_probe()
459 ret = -ENOENT; in mmphw_probe()
464 mi = pdev->dev.platform_data; in mmphw_probe()
465 if (mi == NULL || !mi->path_num || !mi->paths) { in mmphw_probe()
466 dev_err(&pdev->dev, "%s: no platform data defined\n", __func__); in mmphw_probe()
467 ret = -EINVAL; in mmphw_probe()
472 ctrl = devm_kzalloc(&pdev->dev, in mmphw_probe()
473 struct_size(ctrl, path_plats, mi->path_num), in mmphw_probe()
475 if (!ctrl) { in mmphw_probe()
476 ret = -ENOMEM; in mmphw_probe()
480 ctrl->name = mi->name; in mmphw_probe()
481 ctrl->path_num = mi->path_num; in mmphw_probe()
482 ctrl->dev = &pdev->dev; in mmphw_probe()
483 ctrl->irq = irq; in mmphw_probe()
484 platform_set_drvdata(pdev, ctrl); in mmphw_probe()
485 mutex_init(&ctrl->access_ok); in mmphw_probe()
488 if (!devm_request_mem_region(ctrl->dev, res->start, in mmphw_probe()
489 resource_size(res), ctrl->name)) { in mmphw_probe()
490 dev_err(ctrl->dev, in mmphw_probe()
492 ret = -EINVAL; in mmphw_probe()
496 ctrl->reg_base = devm_ioremap(ctrl->dev, in mmphw_probe()
497 res->start, resource_size(res)); in mmphw_probe()
498 if (ctrl->reg_base == NULL) { in mmphw_probe()
499 dev_err(ctrl->dev, "%s: res %pR map failed\n", __func__, res); in mmphw_probe()
500 ret = -ENOMEM; in mmphw_probe()
505 ret = devm_request_irq(ctrl->dev, ctrl->irq, ctrl_handle_irq, in mmphw_probe()
506 IRQF_SHARED, "lcd_controller", ctrl); in mmphw_probe()
508 dev_err(ctrl->dev, "%s unable to request IRQ %d\n", in mmphw_probe()
509 __func__, ctrl->irq); in mmphw_probe()
510 ret = -ENXIO; in mmphw_probe()
515 ctrl->clk = devm_clk_get_enabled(ctrl->dev, mi->clk_name); in mmphw_probe()
516 if (IS_ERR(ctrl->clk)) { in mmphw_probe()
517 ret = PTR_ERR(ctrl->clk); in mmphw_probe()
518 dev_err_probe(ctrl->dev, ret, in mmphw_probe()
519 "unable to get clk %s\n", mi->clk_name); in mmphw_probe()
524 ctrl_set_default(ctrl); in mmphw_probe()
527 for (i = 0; i < ctrl->path_num; i++) { in mmphw_probe()
529 path_plat = &ctrl->path_plats[i]; in mmphw_probe()
530 path_plat->id = i; in mmphw_probe()
531 path_plat->ctrl = ctrl; in mmphw_probe()
534 if (!path_init(path_plat, &mi->paths[i])) { in mmphw_probe()
535 ret = -EINVAL; in mmphw_probe()
541 ret = lcd_spi_register(ctrl); in mmphw_probe()
546 dev_info(ctrl->dev, "device init done\n"); in mmphw_probe()
551 for (i = 0; i < ctrl->path_num; i++) { in mmphw_probe()
552 path_plat = &ctrl->path_plats[i]; in mmphw_probe()
557 dev_err(&pdev->dev, "device init failed\n"); in mmphw_probe()
564 .name = "mmp-disp",