Lines Matching refs:par

158 static void ssd1307fb_update_display(struct ssd1307fb_par *par)  in ssd1307fb_update_display()  argument
161 u8 *vmem = par->info->screen_buffer; in ssd1307fb_update_display()
162 unsigned int line_length = par->info->fix.line_length; in ssd1307fb_update_display()
163 unsigned int pages = DIV_ROUND_UP(par->height, 8); in ssd1307fb_update_display()
166 array = ssd1307fb_alloc_array(par->width * pages, SSD1307FB_DATA); in ssd1307fb_update_display()
200 for (j = 0; j < par->width; j++) { in ssd1307fb_update_display()
202 u32 array_idx = i * par->width + j; in ssd1307fb_update_display()
205 if (i + 1 == pages && par->height % 8) in ssd1307fb_update_display()
206 m = par->height % 8; in ssd1307fb_update_display()
216 ssd1307fb_write_array(par->client, array, par->width * pages); in ssd1307fb_update_display()
224 struct ssd1307fb_par *par = info->par; in ssd1307fb_write() local
245 ssd1307fb_update_display(par); in ssd1307fb_write()
254 struct ssd1307fb_par *par = info->par; in ssd1307fb_blank() local
257 return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF); in ssd1307fb_blank()
259 return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON); in ssd1307fb_blank()
264 struct ssd1307fb_par *par = info->par; in ssd1307fb_fillrect() local
266 ssd1307fb_update_display(par); in ssd1307fb_fillrect()
271 struct ssd1307fb_par *par = info->par; in ssd1307fb_copyarea() local
273 ssd1307fb_update_display(par); in ssd1307fb_copyarea()
278 struct ssd1307fb_par *par = info->par; in ssd1307fb_imageblit() local
280 ssd1307fb_update_display(par); in ssd1307fb_imageblit()
296 ssd1307fb_update_display(info->par); in ssd1307fb_deferred_io()
299 static int ssd1307fb_init(struct ssd1307fb_par *par) in ssd1307fb_init() argument
305 if (par->device_info->need_pwm) { in ssd1307fb_init()
306 par->pwm = pwm_get(&par->client->dev, NULL); in ssd1307fb_init()
307 if (IS_ERR(par->pwm)) { in ssd1307fb_init()
308 dev_err(&par->client->dev, "Could not get PWM from device tree!\n"); in ssd1307fb_init()
309 return PTR_ERR(par->pwm); in ssd1307fb_init()
316 pwm_apply_args(par->pwm); in ssd1307fb_init()
318 pwm_get_args(par->pwm, &pargs); in ssd1307fb_init()
320 par->pwm_period = pargs.period; in ssd1307fb_init()
322 pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period); in ssd1307fb_init()
323 pwm_enable(par->pwm); in ssd1307fb_init()
325 dev_dbg(&par->client->dev, "Using PWM%d with a %dns period.\n", in ssd1307fb_init()
326 par->pwm->pwm, par->pwm_period); in ssd1307fb_init()
330 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST); in ssd1307fb_init()
334 ret = ssd1307fb_write_cmd(par->client, par->contrast); in ssd1307fb_init()
339 if (par->seg_remap) { in ssd1307fb_init()
340 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SEG_REMAP_ON); in ssd1307fb_init()
346 com_invdir = 0xc0 | par->com_invdir << 3; in ssd1307fb_init()
347 ret = ssd1307fb_write_cmd(par->client, com_invdir); in ssd1307fb_init()
352 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_MULTIPLEX_RATIO); in ssd1307fb_init()
356 ret = ssd1307fb_write_cmd(par->client, par->height - 1); in ssd1307fb_init()
361 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_DISPLAY_OFFSET); in ssd1307fb_init()
365 ret = ssd1307fb_write_cmd(par->client, par->com_offset); in ssd1307fb_init()
370 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_CLOCK_FREQ); in ssd1307fb_init()
374 dclk = ((par->dclk_div - 1) & 0xf) | (par->dclk_frq & 0xf) << 4; in ssd1307fb_init()
375 ret = ssd1307fb_write_cmd(par->client, dclk); in ssd1307fb_init()
380 if (par->area_color_enable || par->low_power) { in ssd1307fb_init()
383 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
388 mode = (par->area_color_enable ? 0x30 : 0) | in ssd1307fb_init()
389 (par->low_power ? 5 : 0); in ssd1307fb_init()
390 ret = ssd1307fb_write_cmd(par->client, mode); in ssd1307fb_init()
396 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PRECHARGE_PERIOD); in ssd1307fb_init()
400 precharge = (par->prechargep1 & 0xf) | (par->prechargep2 & 0xf) << 4; in ssd1307fb_init()
401 ret = ssd1307fb_write_cmd(par->client, precharge); in ssd1307fb_init()
406 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COM_PINS_CONFIG); in ssd1307fb_init()
410 compins = 0x02 | !par->com_seq << 4 | par->com_lrremap << 5; in ssd1307fb_init()
411 ret = ssd1307fb_write_cmd(par->client, compins); in ssd1307fb_init()
416 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_VCOMH); in ssd1307fb_init()
420 ret = ssd1307fb_write_cmd(par->client, par->vcomh); in ssd1307fb_init()
425 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CHARGE_PUMP); in ssd1307fb_init()
429 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
430 BIT(4) | (par->device_info->need_chargepump ? BIT(2) : 0)); in ssd1307fb_init()
435 if (par->lookup_table_set) { in ssd1307fb_init()
438 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
443 for (i = 0; i < ARRAY_SIZE(par->lookup_table); ++i) { in ssd1307fb_init()
444 u8 val = par->lookup_table[i]; in ssd1307fb_init()
447 dev_warn(&par->client->dev, in ssd1307fb_init()
450 ret = ssd1307fb_write_cmd(par->client, val); in ssd1307fb_init()
457 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_ADDRESS_MODE); in ssd1307fb_init()
461 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
467 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_COL_RANGE); in ssd1307fb_init()
471 ret = ssd1307fb_write_cmd(par->client, 0x0); in ssd1307fb_init()
475 ret = ssd1307fb_write_cmd(par->client, par->width - 1); in ssd1307fb_init()
480 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_SET_PAGE_RANGE); in ssd1307fb_init()
484 ret = ssd1307fb_write_cmd(par->client, par->page_offset); in ssd1307fb_init()
488 ret = ssd1307fb_write_cmd(par->client, in ssd1307fb_init()
489 par->page_offset + in ssd1307fb_init()
490 DIV_ROUND_UP(par->height, 8) - 1); in ssd1307fb_init()
495 ssd1307fb_update_display(par); in ssd1307fb_init()
498 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON); in ssd1307fb_init()
507 struct ssd1307fb_par *par = bl_get_data(bdev); in ssd1307fb_update_bl() local
511 par->contrast = brightness; in ssd1307fb_update_bl()
513 ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST); in ssd1307fb_update_bl()
516 ret = ssd1307fb_write_cmd(par->client, par->contrast); in ssd1307fb_update_bl()
524 struct ssd1307fb_par *par = bl_get_data(bdev); in ssd1307fb_get_brightness() local
526 return par->contrast; in ssd1307fb_get_brightness()
598 struct ssd1307fb_par *par; in ssd1307fb_probe() local
611 par = info->par; in ssd1307fb_probe()
612 par->info = info; in ssd1307fb_probe()
613 par->client = client; in ssd1307fb_probe()
615 par->device_info = of_device_get_match_data(&client->dev); in ssd1307fb_probe()
617 par->reset = devm_gpiod_get_optional(&client->dev, "reset", in ssd1307fb_probe()
619 if (IS_ERR(par->reset)) { in ssd1307fb_probe()
621 PTR_ERR(par->reset)); in ssd1307fb_probe()
622 ret = PTR_ERR(par->reset); in ssd1307fb_probe()
626 par->vbat_reg = devm_regulator_get_optional(&client->dev, "vbat"); in ssd1307fb_probe()
627 if (IS_ERR(par->vbat_reg)) { in ssd1307fb_probe()
628 ret = PTR_ERR(par->vbat_reg); in ssd1307fb_probe()
630 par->vbat_reg = NULL; in ssd1307fb_probe()
638 if (of_property_read_u32(node, "solomon,width", &par->width)) in ssd1307fb_probe()
639 par->width = 96; in ssd1307fb_probe()
641 if (of_property_read_u32(node, "solomon,height", &par->height)) in ssd1307fb_probe()
642 par->height = 16; in ssd1307fb_probe()
644 if (of_property_read_u32(node, "solomon,page-offset", &par->page_offset)) in ssd1307fb_probe()
645 par->page_offset = 1; in ssd1307fb_probe()
647 if (of_property_read_u32(node, "solomon,com-offset", &par->com_offset)) in ssd1307fb_probe()
648 par->com_offset = 0; in ssd1307fb_probe()
650 if (of_property_read_u32(node, "solomon,prechargep1", &par->prechargep1)) in ssd1307fb_probe()
651 par->prechargep1 = 2; in ssd1307fb_probe()
653 if (of_property_read_u32(node, "solomon,prechargep2", &par->prechargep2)) in ssd1307fb_probe()
654 par->prechargep2 = 2; in ssd1307fb_probe()
657 par->lookup_table, in ssd1307fb_probe()
658 ARRAY_SIZE(par->lookup_table))) in ssd1307fb_probe()
659 par->lookup_table_set = 1; in ssd1307fb_probe()
661 par->seg_remap = !of_property_read_bool(node, "solomon,segment-no-remap"); in ssd1307fb_probe()
662 par->com_seq = of_property_read_bool(node, "solomon,com-seq"); in ssd1307fb_probe()
663 par->com_lrremap = of_property_read_bool(node, "solomon,com-lrremap"); in ssd1307fb_probe()
664 par->com_invdir = of_property_read_bool(node, "solomon,com-invdir"); in ssd1307fb_probe()
665 par->area_color_enable = in ssd1307fb_probe()
667 par->low_power = of_property_read_bool(node, "solomon,low-power"); in ssd1307fb_probe()
669 par->contrast = 127; in ssd1307fb_probe()
670 par->vcomh = par->device_info->default_vcomh; in ssd1307fb_probe()
673 if (of_property_read_u32(node, "solomon,dclk-div", &par->dclk_div)) in ssd1307fb_probe()
674 par->dclk_div = par->device_info->default_dclk_div; in ssd1307fb_probe()
675 if (of_property_read_u32(node, "solomon,dclk-frq", &par->dclk_frq)) in ssd1307fb_probe()
676 par->dclk_frq = par->device_info->default_dclk_frq; in ssd1307fb_probe()
678 vmem_size = DIV_ROUND_UP(par->width, 8) * par->height; in ssd1307fb_probe()
701 info->fix.line_length = DIV_ROUND_UP(par->width, 8); in ssd1307fb_probe()
705 info->var.xres = par->width; in ssd1307fb_probe()
706 info->var.xres_virtual = par->width; in ssd1307fb_probe()
707 info->var.yres = par->height; in ssd1307fb_probe()
708 info->var.yres_virtual = par->height; in ssd1307fb_probe()
718 if (par->reset) { in ssd1307fb_probe()
720 gpiod_set_value_cansleep(par->reset, 1); in ssd1307fb_probe()
722 gpiod_set_value_cansleep(par->reset, 0); in ssd1307fb_probe()
726 if (par->vbat_reg) { in ssd1307fb_probe()
727 ret = regulator_enable(par->vbat_reg); in ssd1307fb_probe()
735 ret = ssd1307fb_init(par); in ssd1307fb_probe()
746 bl = backlight_device_register(bl_name, &client->dev, par, in ssd1307fb_probe()
755 bl->props.brightness = par->contrast; in ssd1307fb_probe()
766 if (par->device_info->need_pwm) { in ssd1307fb_probe()
767 pwm_disable(par->pwm); in ssd1307fb_probe()
768 pwm_put(par->pwm); in ssd1307fb_probe()
771 if (par->vbat_reg) in ssd1307fb_probe()
772 regulator_disable(par->vbat_reg); in ssd1307fb_probe()
783 struct ssd1307fb_par *par = info->par; in ssd1307fb_remove() local
785 ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF); in ssd1307fb_remove()
790 if (par->device_info->need_pwm) { in ssd1307fb_remove()
791 pwm_disable(par->pwm); in ssd1307fb_remove()
792 pwm_put(par->pwm); in ssd1307fb_remove()