From 2fb0847ba47cd77e697c233f8810f7cfb1629c35 Mon Sep 17 00:00:00 2001 From: Donghwa Lee Date: Fri, 26 Feb 2010 15:46:02 +0900 Subject: [PATCH] s5pc1xx: move LCD spi function to s5p-spi.c --- drivers/video/Makefile | 2 +- drivers/video/s5p-spi.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/video/s5p-spi.h | 6 +- drivers/video/s6d16a0x.c | 137 +--------------------------------------------- drivers/video/s6e63m0.c | 139 +---------------------------------------------- 5 files changed, 145 insertions(+), 275 deletions(-) create mode 100644 drivers/video/s5p-spi.c diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 184ff98..3633563 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -38,7 +38,7 @@ COBJS-$(CONFIG_SED156X) += sed156x.o COBJS-$(CONFIG_VIDEO_SM501) += sm501.o COBJS-$(CONFIG_VIDEO_SMI_LYNXEM) += smiLynxEM.o COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.o -COBJS-$(CONFIG_S5PC1XXFB) += s5p-fb.o s5p-fimd.o +COBJS-$(CONFIG_S5PC1XXFB) += s5p-fb.o s5p-fimd.o s5p-spi.o COBJS-$(CONFIG_S6E63M0) += s6e63m0.o COBJS-$(CONFIG_S6D16A0X) += s6d16a0x.o COBJS-$(CONFIG_AMS701KA) += ams701ka.o diff --git a/drivers/video/s5p-spi.c b/drivers/video/s5p-spi.c new file mode 100644 index 0000000..4734574 --- /dev/null +++ b/drivers/video/s5p-spi.c @@ -0,0 +1,136 @@ +#include +#include "s5p-spi.h" + + +static void cs_low(struct spi_platform_data *spi) +{ + gpio_set_value(spi->cs_bank, spi->cs_num, 0); +} + +static void cs_high(struct spi_platform_data *spi) +{ + gpio_set_value(spi->cs_bank, spi->cs_num, 1); +} + +static void clk_low(struct spi_platform_data *spi) +{ + gpio_set_value(spi->clk_bank, spi->clk_num, 0); +} + +static void clk_high(struct spi_platform_data *spi) +{ + gpio_set_value(spi->clk_bank, spi->clk_num, 1); +} + +static void si_low(struct spi_platform_data *spi) +{ + gpio_set_value(spi->si_bank, spi->si_num, 0); +} + +static void si_high(struct spi_platform_data *spi) +{ + gpio_set_value(spi->si_bank, spi->si_num, 1); +} + +static char so_read(struct spi_platform_data *spi) +{ + return gpio_get_value(spi->so_bank, spi->so_num); +} + +void spi_write_byte(struct spi_platform_data *spi, unsigned char address, unsigned char command) +{ + int j; + unsigned short data; + unsigned char DELAY = 1; + + data = (address << 8) + command; + + cs_high(spi); + si_high(spi); + clk_high(spi); + udelay(DELAY); + + cs_low(spi); + udelay(DELAY); + + for (j = PACKET_LEN; j >= 0; j--) + { + clk_low(spi); + + /* data high or low */ + if ((data >> j) & 0x1) + si_high(spi); + else + si_low(spi); + + udelay(DELAY); + + clk_high(spi); + udelay(DELAY); + } + + cs_high(spi); + udelay(DELAY); +} + +#ifdef UNUSED_FUNCTIONS +unsigned char spi_read_byte(struct spi_platform_data *spi, unsigned char select, unsigned char address) +{ + int j; + static unsigned int first = 1; + unsigned char DELAY = 1; + unsigned short data = 0; + char command = 0; + + data = (select << 8) + address; + + cs_high(spi); + si_high(spi); + clk_high(spi); + udelay(DELAY); + + clk_low(spi); + udelay(DELAY); + + for (j = PACKET_LEN + 8; j >= 0; j--) + { + + if (j > 7) { + clk_low(spi); + + /* data high or low */ + if ((data >> (j - 8)) & 0x1) + si_high(spi); + else + si_low(spi); + + udelay(DELAY); + clk_high(spi); + } else { + if (first) { + gpio_cfg_pin(spi->so_bank, spi->so_num, GPIO_INPUT); + first = 0; + } + + clk_low(spi); + + if (so_read(spi) & 0x1) + command |= 1 << j; + else + command |= 0 << j; + + udelay(DELAY); + clk_high(spi); + } + + udelay(DELAY); + } + + cs_high(spi); + udelay(DELAY); + + gpio_cfg_pin(spi->so_bank, spi->so_num, GPIO_OUTPUT); + + return command; +} +#endif diff --git a/drivers/video/s5p-spi.h b/drivers/video/s5p-spi.h index 8fc480c..63a92e3 100644 --- a/drivers/video/s5p-spi.h +++ b/drivers/video/s5p-spi.h @@ -1,7 +1,5 @@ - #define COMMAND_ONLY 0xFE #define DATA_ONLY 0xFF - #define PACKET_LEN 8 struct spi_platform_data { @@ -18,3 +16,7 @@ struct spi_platform_data { unsigned int set_rev; }; +void spi_write_byte(struct spi_platform_data *spi, + unsigned char address, unsigned char command); +void spi_read_byte(struct spi_platform_data *spi, + unsigned char address, unsigned char command); diff --git a/drivers/video/s6d16a0x.c b/drivers/video/s6d16a0x.c index a40653a..a238b4e 100644 --- a/drivers/video/s6d16a0x.c +++ b/drivers/video/s6d16a0x.c @@ -30,41 +30,6 @@ /* these machine specific platform data would be setting at universal.c */ struct spi_platform_data *s6d16a0x; -void cs_low_(void) -{ - gpio_set_value(s6d16a0x->cs_bank, s6d16a0x->cs_num, 0); -} - -void cs_high_(void) -{ - gpio_set_value(s6d16a0x->cs_bank, s6d16a0x->cs_num, 1); -} - -void clk_low_(void) -{ - gpio_set_value(s6d16a0x->clk_bank, s6d16a0x->clk_num, 0); -} - -void clk_high_(void) -{ - gpio_set_value(s6d16a0x->clk_bank, s6d16a0x->clk_num, 1); -} - -void si_low_(void) -{ - gpio_set_value(s6d16a0x->si_bank, s6d16a0x->si_num, 0); -} - -void si_high_(void) -{ - gpio_set_value(s6d16a0x->si_bank, s6d16a0x->si_num, 1); -} - -char so_read_(void) -{ - return gpio_get_value(s6d16a0x->so_bank, s6d16a0x->so_num); -} - static const unsigned char SEQ_PASSWD2_SET[] = { 0xF1, 0x5A, DATA_ONLY, 0x5A, @@ -353,111 +318,13 @@ static const unsigned char SEQ_DISPOFF[] = { 0x28, COMMAND_ONLY, }; -unsigned char Delay=1; - -static void s6d16a0x_c110_spi_write_byte(unsigned char address, unsigned char command) -{ - int j; - unsigned short data; - data = (address << 8) + command; - - cs_high_(); - si_high_(); - clk_high_(); - udelay(Delay); - - cs_low_(); - udelay(Delay); - - for (j = PACKET_LEN; j >= 0; j--) - { - clk_low_(); - - /* data high or low */ - if ((data >> j) & 0x0001) - si_high_(); - else - si_low_(); - - udelay(Delay); - - clk_high_(); - udelay(Delay); - } - - cs_high_(); - udelay(Delay); -} - -#ifdef UNUSED_FUNCTIONS -static unsigned char s6d16a0x_c110_spi_read_byte(unsigned char select, unsigned char address) -{ - int j; - static unsigned int first = 1; - unsigned char DELAY=1; - unsigned short data = 0; - char command = 0; - - data = (select << 8) + address; - - cs_high(); - si_high(); - clk_high(); - udelay(DELAY); - - clk_low(); - udelay(DELAY); - - for (j = PACKET_LEN + 8; j >= 0; j--) - { - - if (j > 7) { - clk_low(); - - /* data high or low */ - if ((data >> (j - 8)) & 0x0001) - si_high(); - else - si_low(); - - udelay(DELAY); - clk_high(); - } else { - if (first) { - gpio_cfg_pin(s6d16a0x->so_bank, s6d16a0x->so_num, GPIO_INPUT); - first = 0; - } - - clk_low(); - - if (so_read() & 0x1) - command |= 1 << j; - else - command |= 0 << j; - - udelay(DELAY); - clk_high(); - } - - udelay(DELAY); - } - - cs_high(); - udelay(DELAY); - - gpio_cfg_pin(s6d16a0x->so_bank, s6d16a0x->so_num, GPIO_OUTPUT); - - return command; -} -#endif - static void s6d16a0x_spi_write(unsigned char address, unsigned char command) { if (address != DATA_ONLY) - s6d16a0x_c110_spi_write_byte(0x0, address); + spi_write_byte(s6d16a0x, 0x0, address); if (command != COMMAND_ONLY) - s6d16a0x_c110_spi_write_byte(0x1, command); + spi_write_byte(s6d16a0x, 0x1, command); } static void s6d16a0x_panel_send_sequence(const unsigned char *wbuf, unsigned int size_cmd) diff --git a/drivers/video/s6e63m0.c b/drivers/video/s6e63m0.c index b3071b2..432d98a 100644 --- a/drivers/video/s6e63m0.c +++ b/drivers/video/s6e63m0.c @@ -28,45 +28,9 @@ #include "s5p-spi.h" -unsigned int size_cmd; /* these machine specific platform data would be setting at universal.c */ struct spi_platform_data *s6e63m0; -void cs_low(void) -{ - gpio_set_value(s6e63m0->cs_bank, s6e63m0->cs_num, 0); -} - -void cs_high(void) -{ - gpio_set_value(s6e63m0->cs_bank, s6e63m0->cs_num, 1); -} - -void clk_low(void) -{ - gpio_set_value(s6e63m0->clk_bank, s6e63m0->clk_num, 0); -} - -void clk_high(void) -{ - gpio_set_value(s6e63m0->clk_bank, s6e63m0->clk_num, 1); -} - -void si_low(void) -{ - gpio_set_value(s6e63m0->si_bank, s6e63m0->si_num, 0); -} - -void si_high(void) -{ - gpio_set_value(s6e63m0->si_bank, s6e63m0->si_num, 1); -} - -char so_read(void) -{ - return gpio_get_value(s6e63m0->so_bank, s6e63m0->so_num); -} - static const unsigned char SEQ_PANEL_CONDITION_SET[] = { 0xF8, 0x01, DATA_ONLY, 0x27, @@ -365,112 +329,13 @@ static const unsigned char SEQ_DISPLAY_ON[] = { 0x29, COMMAND_ONLY, }; -unsigned char DELAY=1; - -static void s6e63m0_c110_spi_write_byte(unsigned char address, unsigned char command) -{ - int j; - unsigned short data; - - data = (address << 8) + command; - - cs_high(); - si_high(); - clk_high(); - udelay(DELAY); - - cs_low(); - udelay(DELAY); - - for (j = PACKET_LEN; j >= 0; j--) - { - clk_low(); - - /* data high or low */ - if ((data >> j) & 0x0001) - si_high(); - else - si_low(); - - udelay(DELAY); - - clk_high(); - udelay(DELAY); - } - - cs_high(); - udelay(DELAY); -} - -#ifdef UNUSED_FUNCTION -static unsigned char s6e63m0_c110_spi_read_byte(unsigned char select, unsigned char address) -{ - int j; - static unsigned int first = 1; - unsigned char DELAY=1; - unsigned short data = 0; - char command = 0; - - data = (select << 8) + address; - - cs_high(); - si_high(); - clk_high(); - udelay(DELAY); - - clk_low(); - udelay(DELAY); - - for (j = PACKET_LEN + 8; j >= 0; j--) - { - - if (j > 7) { - clk_low(); - - /* data high or low */ - if ((data >> (j - 8)) & 0x0001) - si_high(); - else - si_low(); - - udelay(DELAY); - clk_high(); - } else { - if (first) { - gpio_cfg_pin(s6e63m0->so_bank, s6e63m0->so_num, GPIO_INPUT); - first = 0; - } - - clk_low(); - - if (so_read() & 0x1) - command |= 1 << j; - else - command |= 0 << j; - - udelay(DELAY); - clk_high(); - } - - udelay(DELAY); - } - - cs_high(); - udelay(DELAY); - - gpio_cfg_pin(s6e63m0->so_bank, s6e63m0->so_num, GPIO_OUTPUT); - - return command; -} -#endif - static void s6e63m0_spi_write(unsigned char address, unsigned char command) { if (address != DATA_ONLY) - s6e63m0_c110_spi_write_byte(0x0, address); + spi_write_byte(s6e63m0, 0x0, address); if (command != COMMAND_ONLY) - s6e63m0_c110_spi_write_byte(0x1, command); + spi_write_byte(s6e63m0, 0x1, command); } static void s6e63m0_panel_send_sequence(const unsigned char *wbuf, unsigned size_cmd) -- 2.7.4