Lines Matching refs:ctx
141 static int s6e63m0_clear_error(struct s6e63m0 *ctx)
143 int ret = ctx->error;
145 ctx->error = 0;
149 static void s6e63m0_dcs_read(struct s6e63m0 *ctx, const u8 cmd, u8 *data)
151 if (ctx->error < 0)
154 ctx->error = ctx->dcs_read(ctx->dev, cmd, data);
157 static void s6e63m0_dcs_write(struct s6e63m0 *ctx, const u8 *data, size_t len)
159 if (ctx->error < 0 || len == 0)
162 ctx->error = ctx->dcs_write(ctx->dev, data, len);
165 #define s6e63m0_dcs_write_seq_static(ctx, seq ...) \
168 s6e63m0_dcs_write(ctx, d, ARRAY_SIZE(d)); \
171 static int s6e63m0_check_lcd_type(struct s6e63m0 *ctx)
176 s6e63m0_dcs_read(ctx, MCS_READ_ID1, &id1);
177 s6e63m0_dcs_read(ctx, MCS_READ_ID2, &id2);
178 s6e63m0_dcs_read(ctx, MCS_READ_ID3, &id3);
180 ret = s6e63m0_clear_error(ctx);
182 dev_err(ctx->dev, "error checking LCD type (%d)\n", ret);
183 ctx->lcd_type = 0x00;
187 dev_info(ctx->dev, "MTP ID: %02x %02x %02x\n", id1, id2, id3);
192 dev_info(ctx->dev, "detected LCD panel AMS397GE MIPI M2\n");
196 dev_info(ctx->dev, "detected LCD panel AMS397GE MIPI SM2\n");
199 dev_info(ctx->dev, "unknown LCD panel type %02x\n", id2);
203 ctx->lcd_type = id2;
208 static void s6e63m0_init(struct s6e63m0 *ctx)
210 s6e63m0_dcs_write_seq_static(ctx, MCS_PANELCTL,
214 s6e63m0_dcs_write_seq_static(ctx, MCS_DISCTL,
216 s6e63m0_dcs_write_seq_static(ctx, MCS_IFCTL,
219 s6e63m0_dcs_write_seq_static(ctx, MCS_PGAMMACTL,
224 s6e63m0_dcs_write_seq_static(ctx, MCS_PGAMMACTL,
227 s6e63m0_dcs_write_seq_static(ctx, MCS_SRCCTL,
229 s6e63m0_dcs_write_seq_static(ctx, 0xb3,
232 s6e63m0_dcs_write_seq_static(ctx, 0xb5,
239 s6e63m0_dcs_write_seq_static(ctx, 0xb6,
244 s6e63m0_dcs_write_seq_static(ctx, 0xb7,
253 s6e63m0_dcs_write_seq_static(ctx, 0xb9,
260 s6e63m0_dcs_write_seq_static(ctx, 0xba,
265 s6e63m0_dcs_write_seq_static(ctx, MCS_BCMODE,
271 s6e63m0_dcs_write_seq_static(ctx, 0xb2,
274 s6e63m0_dcs_write_seq_static(ctx, MCS_MIECTL1,
277 s6e63m0_dcs_write_seq_static(ctx, MCS_ELVSS_ON,
281 static int s6e63m0_power_on(struct s6e63m0 *ctx)
285 ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
292 gpiod_set_value(ctx->reset_gpio, 1);
294 gpiod_set_value(ctx->reset_gpio, 0);
300 static int s6e63m0_power_off(struct s6e63m0 *ctx)
304 gpiod_set_value(ctx->reset_gpio, 1);
307 ret = regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
316 struct s6e63m0 *ctx = panel_to_s6e63m0(panel);
318 if (!ctx->enabled)
321 backlight_disable(ctx->bl_dev);
323 s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_OFF);
325 s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_ENTER_SLEEP_MODE);
328 ctx->enabled = false;
335 struct s6e63m0 *ctx = panel_to_s6e63m0(panel);
338 if (!ctx->prepared)
341 s6e63m0_clear_error(ctx);
343 ret = s6e63m0_power_off(ctx);
347 ctx->prepared = false;
354 struct s6e63m0 *ctx = panel_to_s6e63m0(panel);
357 if (ctx->prepared)
360 ret = s6e63m0_power_on(ctx);
365 s6e63m0_dcs_write_seq_static(ctx, MCS_LEVEL_2_KEY, 0x5a, 0x5a);
367 s6e63m0_dcs_write_seq_static(ctx, MCS_MTP_KEY, 0x5a, 0x5a);
369 ret = s6e63m0_check_lcd_type(ctx);
373 s6e63m0_init(ctx);
375 ret = s6e63m0_clear_error(ctx);
380 ctx->prepared = true;
387 struct s6e63m0 *ctx = panel_to_s6e63m0(panel);
389 if (ctx->enabled)
392 s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_EXIT_SLEEP_MODE);
394 s6e63m0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_ON);
397 s6e63m0_dcs_write_seq_static(ctx, MCS_ERROR_CHECK,
402 backlight_enable(ctx->bl_dev);
404 ctx->enabled = true;
440 struct s6e63m0 *ctx = bl_get_data(bd);
445 s6e63m0_dcs_write(ctx, s6e63m0_gamma_22[brightness],
449 s6e63m0_dcs_write_seq_static(ctx, MCS_PGAMMACTL, 0x01);
451 return s6e63m0_clear_error(ctx);
458 static int s6e63m0_backlight_register(struct s6e63m0 *ctx)
465 struct device *dev = ctx->dev;
468 ctx->bl_dev = devm_backlight_device_register(dev, "panel", dev, ctx,
471 if (IS_ERR(ctx->bl_dev)) {
472 ret = PTR_ERR(ctx->bl_dev);
484 struct s6e63m0 *ctx;
487 ctx = devm_kzalloc(dev, sizeof(struct s6e63m0), GFP_KERNEL);
488 if (!ctx)
491 ctx->dcs_read = dcs_read;
492 ctx->dcs_write = dcs_write;
493 dev_set_drvdata(dev, ctx);
495 ctx->dev = dev;
496 ctx->enabled = false;
497 ctx->prepared = false;
499 ctx->supplies[0].supply = "vdd3";
500 ctx->supplies[1].supply = "vci";
501 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies),
502 ctx->supplies);
508 ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
509 if (IS_ERR(ctx->reset_gpio)) {
510 dev_err(dev, "cannot get reset-gpios %ld\n", PTR_ERR(ctx->reset_gpio));
511 return PTR_ERR(ctx->reset_gpio);
514 drm_panel_init(&ctx->panel, dev, &s6e63m0_drm_funcs,
518 ret = s6e63m0_backlight_register(ctx);
522 drm_panel_add(&ctx->panel);
530 struct s6e63m0 *ctx = dev_get_drvdata(dev);
532 drm_panel_remove(&ctx->panel);