173 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * linux/drivers/video/mmp/panel/tpo_tj032md01bw.c4 * active panel using spi interface to do init5 *6 * Copyright (C) 2012 Marvell Technology Group Ltd.7 * Authors: Guoqing Li <ligq@marvell.com>8 * Lisa Du <cldu@marvell.com>9 * Zhou Zhu <zzhu3@marvell.com>10 */11 12#include <linux/module.h>13#include <linux/moduleparam.h>14#include <linux/kernel.h>15#include <linux/errno.h>16#include <linux/string.h>17#include <linux/delay.h>18#include <linux/platform_device.h>19#include <linux/err.h>20#include <linux/spi/spi.h>21#include <video/mmp_disp.h>22 23static u16 init[] = {24 0x0801,25 0x0800,26 0x0200,27 0x0304,28 0x040e,29 0x0903,30 0x0b18,31 0x0c53,32 0x0d01,33 0x0ee0,34 0x0f01,35 0x1058,36 0x201e,37 0x210a,38 0x220a,39 0x231e,40 0x2400,41 0x2532,42 0x2600,43 0x27ac,44 0x2904,45 0x2aa2,46 0x2b45,47 0x2c45,48 0x2d15,49 0x2e5a,50 0x2fff,51 0x306b,52 0x310d,53 0x3248,54 0x3382,55 0x34bd,56 0x35e7,57 0x3618,58 0x3794,59 0x3801,60 0x395d,61 0x3aae,62 0x3bff,63 0x07c9,64};65 66static u16 poweroff[] = {67 0x07d9,68};69 70struct tpohvga_plat_data {71 void (*plat_onoff)(int status);72 struct spi_device *spi;73};74 75static void tpohvga_onoff(struct mmp_panel *panel, int status)76{77 struct tpohvga_plat_data *plat = panel->plat_data;78 int ret;79 80 if (status) {81 plat->plat_onoff(1);82 83 ret = spi_write(plat->spi, init, sizeof(init));84 if (ret < 0)85 dev_warn(panel->dev, "init cmd failed(%d)\n", ret);86 } else {87 ret = spi_write(plat->spi, poweroff, sizeof(poweroff));88 if (ret < 0)89 dev_warn(panel->dev, "poweroff cmd failed(%d)\n", ret);90 91 plat->plat_onoff(0);92 }93}94 95static struct mmp_mode mmp_modes_tpohvga[] = {96 [0] = {97 .pixclock_freq = 10394400,98 .refresh = 60,99 .xres = 320,100 .yres = 480,101 .hsync_len = 10,102 .left_margin = 15,103 .right_margin = 10,104 .vsync_len = 2,105 .upper_margin = 4,106 .lower_margin = 2,107 .invert_pixclock = 1,108 .pix_fmt_out = PIXFMT_RGB565,109 },110};111 112static int tpohvga_get_modelist(struct mmp_panel *panel,113 struct mmp_mode **modelist)114{115 *modelist = mmp_modes_tpohvga;116 return 1;117}118 119static struct mmp_panel panel_tpohvga = {120 .name = "tpohvga",121 .panel_type = PANELTYPE_ACTIVE,122 .get_modelist = tpohvga_get_modelist,123 .set_onoff = tpohvga_onoff,124};125 126static int tpohvga_probe(struct spi_device *spi)127{128 struct mmp_mach_panel_info *mi;129 int ret;130 struct tpohvga_plat_data *plat_data;131 132 /* get configs from platform data */133 mi = spi->dev.platform_data;134 if (mi == NULL) {135 dev_err(&spi->dev, "%s: no platform data defined\n", __func__);136 return -EINVAL;137 }138 139 /* setup spi related info */140 spi->bits_per_word = 16;141 ret = spi_setup(spi);142 if (ret < 0) {143 dev_err(&spi->dev, "spi setup failed %d", ret);144 return ret;145 }146 147 plat_data = kzalloc(sizeof(*plat_data), GFP_KERNEL);148 if (plat_data == NULL)149 return -ENOMEM;150 151 plat_data->spi = spi;152 plat_data->plat_onoff = mi->plat_set_onoff;153 panel_tpohvga.plat_data = plat_data;154 panel_tpohvga.plat_path_name = mi->plat_path_name;155 panel_tpohvga.dev = &spi->dev;156 157 mmp_register_panel(&panel_tpohvga);158 159 return 0;160}161 162static struct spi_driver panel_tpohvga_driver = {163 .driver = {164 .name = "tpo-hvga",165 },166 .probe = tpohvga_probe,167};168module_spi_driver(panel_tpohvga_driver);169 170MODULE_AUTHOR("Lisa Du<cldu@marvell.com>");171MODULE_DESCRIPTION("Panel driver for tpohvga");172MODULE_LICENSE("GPL");173