• Home
  • Raw
  • Download

Lines Matching +full:segment +full:- +full:no +full:- +full:remap

1 // SPDX-License-Identifier: GPL-2.0-or-later
117 array->type = type; in ssd1307fb_alloc_array()
131 dev_err(&client->dev, "Couldn't send I2C command.\n"); in ssd1307fb_write_array()
145 return -ENOMEM; in ssd1307fb_write_cmd()
147 array->data[0] = cmd; in ssd1307fb_write_cmd()
158 u8 *vmem = par->info->screen_buffer; in ssd1307fb_update_display()
159 unsigned int line_length = par->info->fix.line_length; in ssd1307fb_update_display()
160 unsigned int pages = DIV_ROUND_UP(par->height, 8); in ssd1307fb_update_display()
163 array = ssd1307fb_alloc_array(par->width * pages, SSD1307FB_DATA); in ssd1307fb_update_display()
176 * wide. Each letter-number combination is a bit that controls in ssd1307fb_update_display()
197 for (j = 0; j < par->width; j++) { in ssd1307fb_update_display()
199 u32 array_idx = i * par->width + j; in ssd1307fb_update_display()
200 array->data[array_idx] = 0; in ssd1307fb_update_display()
202 if (i + 1 == pages && par->height % 8) in ssd1307fb_update_display()
203 m = par->height % 8; in ssd1307fb_update_display()
208 array->data[array_idx] |= bit << k; in ssd1307fb_update_display()
213 ssd1307fb_write_array(par->client, array, par->width * pages); in ssd1307fb_update_display()
221 struct ssd1307fb_par *par = info->par; in ssd1307fb_write()
226 total_size = info->fix.smem_len; in ssd1307fb_write()
229 return -EINVAL; in ssd1307fb_write()
232 count = total_size - p; in ssd1307fb_write()
235 return -EINVAL; in ssd1307fb_write()
237 dst = info->screen_buffer + p; in ssd1307fb_write()
240 return -EFAULT; in ssd1307fb_write()
251 struct ssd1307fb_par *par = info->par; in ssd1307fb_blank()
254 return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF); in ssd1307fb_blank()
256 return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON); in ssd1307fb_blank()
261 struct ssd1307fb_par *par = info->par; in ssd1307fb_fillrect()
268 struct ssd1307fb_par *par = info->par; in ssd1307fb_copyarea()
275 struct ssd1307fb_par *par = info->par; in ssd1307fb_imageblit()
293 ssd1307fb_update_display(info->par); in ssd1307fb_deferred_io()
302 if (par->device_info->need_pwm) { in ssd1307fb_init()
303 par->pwm = pwm_get(&par->client->dev, NULL); in ssd1307fb_init()
304 if (IS_ERR(par->pwm)) { in ssd1307fb_init()
305 dev_err(&par->client->dev, "Could not get PWM from device tree!\n"); in ssd1307fb_init()
306 return PTR_ERR(par->pwm); in ssd1307fb_init()
309 pwm_init_state(par->pwm, &pwmstate); in ssd1307fb_init()
311 pwm_apply_state(par->pwm, &pwmstate); in ssd1307fb_init()
314 pwm_enable(par->pwm); in ssd1307fb_init()
316 dev_dbg(&par->client->dev, "Using PWM%d with a %lluns period.\n", in ssd1307fb_init()
317 par->pwm->pwm, pwm_get_period(par->pwm)); in ssd1307fb_init()
321 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST); in ssd1307fb_init()
325 ret = ssd1307fb_write_cmd(par->client, par->contrast); in ssd1307fb_init()
329 /* Set segment re-map */ in ssd1307fb_init()
330 if (par->seg_remap) { in ssd1307fb_init()
331 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SEG_REMAP_ON); in ssd1307fb_init()
337 com_invdir = 0xc0 | par->com_invdir << 3; in ssd1307fb_init()
338 ret = ssd1307fb_write_cmd(par->client, com_invdir); in ssd1307fb_init()
343 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_MULTIPLEX_RATIO); in ssd1307fb_init()
347 ret = ssd1307fb_write_cmd(par->client, par->height - 1); in ssd1307fb_init()
352 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_DISPLAY_OFFSET); in ssd1307fb_init()
356 ret = ssd1307fb_write_cmd(par->client, par->com_offset); in ssd1307fb_init()
361 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_CLOCK_FREQ); in ssd1307fb_init()
365 dclk = ((par->dclk_div - 1) & 0xf) | (par->dclk_frq & 0xf) << 4; in ssd1307fb_init()
366 ret = ssd1307fb_write_cmd(par->client, dclk); in ssd1307fb_init()
371 if (par->area_color_enable || par->low_power) { in ssd1307fb_init()
374 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
379 mode = (par->area_color_enable ? 0x30 : 0) | in ssd1307fb_init()
380 (par->low_power ? 5 : 0); in ssd1307fb_init()
381 ret = ssd1307fb_write_cmd(par->client, mode); in ssd1307fb_init()
387 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PRECHARGE_PERIOD); in ssd1307fb_init()
391 precharge = (par->prechargep1 & 0xf) | (par->prechargep2 & 0xf) << 4; in ssd1307fb_init()
392 ret = ssd1307fb_write_cmd(par->client, precharge); in ssd1307fb_init()
397 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COM_PINS_CONFIG); in ssd1307fb_init()
401 compins = 0x02 | !par->com_seq << 4 | par->com_lrremap << 5; in ssd1307fb_init()
402 ret = ssd1307fb_write_cmd(par->client, compins); in ssd1307fb_init()
407 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_VCOMH); in ssd1307fb_init()
411 ret = ssd1307fb_write_cmd(par->client, par->vcomh); in ssd1307fb_init()
415 /* Turn on the DC-DC Charge Pump */ in ssd1307fb_init()
416 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CHARGE_PUMP); in ssd1307fb_init()
420 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
421 BIT(4) | (par->device_info->need_chargepump ? BIT(2) : 0)); in ssd1307fb_init()
426 if (par->lookup_table_set) { in ssd1307fb_init()
429 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
434 for (i = 0; i < ARRAY_SIZE(par->lookup_table); ++i) { in ssd1307fb_init()
435 u8 val = par->lookup_table[i]; in ssd1307fb_init()
438 dev_warn(&par->client->dev, in ssd1307fb_init()
441 ret = ssd1307fb_write_cmd(par->client, val); in ssd1307fb_init()
448 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_ADDRESS_MODE); in ssd1307fb_init()
452 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
458 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); in ssd1307fb_init()
462 ret = ssd1307fb_write_cmd(par->client, par->col_offset); in ssd1307fb_init()
466 ret = ssd1307fb_write_cmd(par->client, par->col_offset + par->width - 1); in ssd1307fb_init()
471 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PAGE_RANGE); in ssd1307fb_init()
475 ret = ssd1307fb_write_cmd(par->client, par->page_offset); in ssd1307fb_init()
479 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
480 par->page_offset + in ssd1307fb_init()
481 DIV_ROUND_UP(par->height, 8) - 1); in ssd1307fb_init()
489 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON); in ssd1307fb_init()
500 int brightness = bdev->props.brightness; in ssd1307fb_update_bl()
502 par->contrast = brightness; in ssd1307fb_update_bl()
504 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST); in ssd1307fb_update_bl()
507 ret = ssd1307fb_write_cmd(par->client, par->contrast); in ssd1307fb_update_bl()
517 return par->contrast; in ssd1307fb_get_brightness()
523 return (info->bl_dev == bdev); in ssd1307fb_check_fb()
561 .compatible = "solomon,ssd1305fb-i2c",
565 .compatible = "solomon,ssd1306fb-i2c",
569 .compatible = "solomon,ssd1307fb-i2c",
573 .compatible = "solomon,ssd1309fb-i2c",
582 struct device *dev = &client->dev; in ssd1307fb_probe()
594 return -ENOMEM; in ssd1307fb_probe()
596 par = info->par; in ssd1307fb_probe()
597 par->info = info; in ssd1307fb_probe()
598 par->client = client; in ssd1307fb_probe()
600 par->device_info = device_get_match_data(dev); in ssd1307fb_probe()
602 par->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ssd1307fb_probe()
603 if (IS_ERR(par->reset)) { in ssd1307fb_probe()
605 PTR_ERR(par->reset)); in ssd1307fb_probe()
606 ret = PTR_ERR(par->reset); in ssd1307fb_probe()
610 par->vbat_reg = devm_regulator_get_optional(dev, "vbat"); in ssd1307fb_probe()
611 if (IS_ERR(par->vbat_reg)) { in ssd1307fb_probe()
612 ret = PTR_ERR(par->vbat_reg); in ssd1307fb_probe()
613 if (ret == -ENODEV) { in ssd1307fb_probe()
614 par->vbat_reg = NULL; in ssd1307fb_probe()
621 if (device_property_read_u32(dev, "solomon,width", &par->width)) in ssd1307fb_probe()
622 par->width = 96; in ssd1307fb_probe()
624 if (device_property_read_u32(dev, "solomon,height", &par->height)) in ssd1307fb_probe()
625 par->height = 16; in ssd1307fb_probe()
627 if (device_property_read_u32(dev, "solomon,page-offset", &par->page_offset)) in ssd1307fb_probe()
628 par->page_offset = 1; in ssd1307fb_probe()
630 if (device_property_read_u32(dev, "solomon,col-offset", &par->col_offset)) in ssd1307fb_probe()
631 par->col_offset = 0; in ssd1307fb_probe()
633 if (device_property_read_u32(dev, "solomon,com-offset", &par->com_offset)) in ssd1307fb_probe()
634 par->com_offset = 0; in ssd1307fb_probe()
636 if (device_property_read_u32(dev, "solomon,prechargep1", &par->prechargep1)) in ssd1307fb_probe()
637 par->prechargep1 = 2; in ssd1307fb_probe()
639 if (device_property_read_u32(dev, "solomon,prechargep2", &par->prechargep2)) in ssd1307fb_probe()
640 par->prechargep2 = 2; in ssd1307fb_probe()
642 if (!device_property_read_u8_array(dev, "solomon,lookup-table", in ssd1307fb_probe()
643 par->lookup_table, in ssd1307fb_probe()
644 ARRAY_SIZE(par->lookup_table))) in ssd1307fb_probe()
645 par->lookup_table_set = 1; in ssd1307fb_probe()
647 par->seg_remap = !device_property_read_bool(dev, "solomon,segment-no-remap"); in ssd1307fb_probe()
648 par->com_seq = device_property_read_bool(dev, "solomon,com-seq"); in ssd1307fb_probe()
649 par->com_lrremap = device_property_read_bool(dev, "solomon,com-lrremap"); in ssd1307fb_probe()
650 par->com_invdir = device_property_read_bool(dev, "solomon,com-invdir"); in ssd1307fb_probe()
651 par->area_color_enable = in ssd1307fb_probe()
652 device_property_read_bool(dev, "solomon,area-color-enable"); in ssd1307fb_probe()
653 par->low_power = device_property_read_bool(dev, "solomon,low-power"); in ssd1307fb_probe()
655 par->contrast = 127; in ssd1307fb_probe()
656 par->vcomh = par->device_info->default_vcomh; in ssd1307fb_probe()
659 if (device_property_read_u32(dev, "solomon,dclk-div", &par->dclk_div)) in ssd1307fb_probe()
660 par->dclk_div = par->device_info->default_dclk_div; in ssd1307fb_probe()
661 if (device_property_read_u32(dev, "solomon,dclk-frq", &par->dclk_frq)) in ssd1307fb_probe()
662 par->dclk_frq = par->device_info->default_dclk_frq; in ssd1307fb_probe()
664 vmem_size = DIV_ROUND_UP(par->width, 8) * par->height; in ssd1307fb_probe()
670 ret = -ENOMEM; in ssd1307fb_probe()
678 ret = -ENOMEM; in ssd1307fb_probe()
682 ssd1307fb_defio->delay = HZ / refreshrate; in ssd1307fb_probe()
683 ssd1307fb_defio->deferred_io = ssd1307fb_deferred_io; in ssd1307fb_probe()
685 info->fbops = &ssd1307fb_ops; in ssd1307fb_probe()
686 info->fix = ssd1307fb_fix; in ssd1307fb_probe()
687 info->fix.line_length = DIV_ROUND_UP(par->width, 8); in ssd1307fb_probe()
688 info->fbdefio = ssd1307fb_defio; in ssd1307fb_probe()
690 info->var = ssd1307fb_var; in ssd1307fb_probe()
691 info->var.xres = par->width; in ssd1307fb_probe()
692 info->var.xres_virtual = par->width; in ssd1307fb_probe()
693 info->var.yres = par->height; in ssd1307fb_probe()
694 info->var.yres_virtual = par->height; in ssd1307fb_probe()
696 info->screen_buffer = vmem; in ssd1307fb_probe()
697 info->fix.smem_start = __pa(vmem); in ssd1307fb_probe()
698 info->fix.smem_len = vmem_size; in ssd1307fb_probe()
704 if (par->reset) { in ssd1307fb_probe()
706 gpiod_set_value_cansleep(par->reset, 1); in ssd1307fb_probe()
708 gpiod_set_value_cansleep(par->reset, 0); in ssd1307fb_probe()
712 if (par->vbat_reg) { in ssd1307fb_probe()
713 ret = regulator_enable(par->vbat_reg); in ssd1307fb_probe()
730 snprintf(bl_name, sizeof(bl_name), "ssd1307fb%d", info->node); in ssd1307fb_probe()
739 bl->props.brightness = par->contrast; in ssd1307fb_probe()
740 bl->props.max_brightness = MAX_CONTRAST; in ssd1307fb_probe()
741 info->bl_dev = bl; in ssd1307fb_probe()
743 …framebuffer device registered, using %d bytes of video memory\n", info->node, info->fix.id, vmem_s… in ssd1307fb_probe()
750 if (par->device_info->need_pwm) { in ssd1307fb_probe()
751 pwm_disable(par->pwm); in ssd1307fb_probe()
752 pwm_put(par->pwm); in ssd1307fb_probe()
755 if (par->vbat_reg) in ssd1307fb_probe()
756 regulator_disable(par->vbat_reg); in ssd1307fb_probe()
767 struct ssd1307fb_par *par = info->par; in ssd1307fb_remove()
769 ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF); in ssd1307fb_remove()
771 backlight_device_unregister(info->bl_dev); in ssd1307fb_remove()
774 if (par->device_info->need_pwm) { in ssd1307fb_remove()
775 pwm_disable(par->pwm); in ssd1307fb_remove()
776 pwm_put(par->pwm); in ssd1307fb_remove()
778 if (par->vbat_reg) in ssd1307fb_remove()
779 regulator_disable(par->vbat_reg); in ssd1307fb_remove()
781 __free_pages(__va(info->fix.smem_start), get_order(info->fix.smem_len)); in ssd1307fb_remove()
809 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");