@@ -454,6 +454,8 @@ CONFIG_V4L_MEM2MEM_DRIVERS=y
CONFIG_SOC_CAMERA_MT9M111=m
CONFIG_DRM=m
CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+CONFIG_FB_W100=y
CONFIG_FB_TILEBLITTING=y
CONFIG_FB_PXA_OVERLAY=y
CONFIG_FB_PXA_PARAMETERS=y
@@ -549,9 +549,6 @@ config MACH_ICONTROL
config ARCH_PXA_ESERIES
bool "PXA based Toshiba e-series PDAs"
- select FB_W100
- select FB
- select PXA25x
config MACH_E330
bool "Toshiba e330"
@@ -849,20 +849,8 @@ static struct w100_mem_info e800_w100_mem_info = {
.size = 0x1fffff,
};
-static void e800_tg_change(struct w100fb_par *par)
-{
- unsigned long tmp;
-
- tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
- if (par->mode->xres == 480)
- tmp |= 0x100;
- else
- tmp &= ~0x100;
- w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
-}
-
static struct w100_tg_info e800_tg_info = {
- .change = e800_tg_change,
+ .change_e800 = true,
};
static struct w100fb_mach_info e800_fb_info = {
@@ -48,7 +48,6 @@ static void w100_init_lcd(struct w100fb_par*);
static void w100_set_dispregs(struct w100fb_par*);
static void w100_update_enable(void);
static void w100_update_disable(void);
-static void calc_hsync(struct w100fb_par *par);
static void w100_init_graphic_engine(struct w100fb_par *par);
struct w100_pll_info *w100_get_xtal_table(unsigned int freq);
@@ -101,8 +100,6 @@ static ssize_t flip_store(struct device *dev, struct device_attribute *attr, con
w100_set_dispregs(par);
w100_update_enable();
- calc_hsync(par);
-
return count;
}
@@ -157,7 +154,6 @@ static ssize_t fastpllclk_store(struct device *dev, struct device_attribute *att
}
w100_init_clocks(par);
- calc_hsync(par);
return count;
}
@@ -173,23 +169,6 @@ static struct attribute *w100fb_attrs[] = {
};
ATTRIBUTE_GROUPS(w100fb);
-/*
- * Some touchscreens need hsync information from the video driver to
- * function correctly. We export it here.
- */
-unsigned long w100fb_get_hsynclen(struct device *dev)
-{
- struct fb_info *info = dev_get_drvdata(dev);
- struct w100fb_par *par=info->par;
-
- /* If display is blanked/suspended, hsync isn't active */
- if (par->blanked)
- return 0;
- else
- return par->hsync_len;
-}
-EXPORT_SYMBOL(w100fb_get_hsynclen);
-
static void w100fb_clear_screen(struct w100fb_par *par)
{
memset_io(remapped_fbuf + (W100_FB_BASE-MEM_WINDOW_BASE), 0, (par->xres * par->yres * BITS_PER_PIXEL/8));
@@ -405,6 +384,15 @@ static void w100fb_copyarea(struct fb_info *info,
writel((w << 16) | (h & 0xffff), remapped_regs + mmDST_WIDTH_HEIGHT);
}
+static void w100fb_e800_tg_change(struct w100fb_par *par)
+{
+ u32 tmp = readl(remapped_regs + mmGPIO_DATA);
+ if (par->mode->xres == 480)
+ tmp |= 0x100;
+ else
+ tmp &= ~0x100;
+ writel(tmp, remapped_regs + mmGPIO_DATA);
+}
/*
* Change the resolution by calling the appropriate hardware functions
@@ -425,10 +413,9 @@ static void w100fb_activate_var(struct w100fb_par *par)
w100_update_enable();
w100_init_graphic_engine(par);
- calc_hsync(par);
-
- if (!par->blanked && tg && tg->change)
- tg->change(par);
+ if (IS_ENABLED(CONFIG_ARCH_PXA_ESERIES) &&
+ !par->blanked && tg && tg->change_e800)
+ w100fb_e800_tg_change(par);
}
@@ -837,28 +824,6 @@ static void w100_update_enable(void)
writel((u32) (disp_db_buf_wr_cntl.val), remapped_regs + mmDISP_DB_BUF_CNTL);
}
-unsigned long w100fb_gpio_read(int port)
-{
- unsigned long value;
-
- if (port==W100_GPIO_PORT_A)
- value = readl(remapped_regs + mmGPIO_DATA);
- else
- value = readl(remapped_regs + mmGPIO_DATA2);
-
- return value;
-}
-
-void w100fb_gpio_write(int port, unsigned long value)
-{
- if (port==W100_GPIO_PORT_A)
- writel(value, remapped_regs + mmGPIO_DATA);
- else
- writel(value, remapped_regs + mmGPIO_DATA2);
-}
-EXPORT_SYMBOL(w100fb_gpio_read);
-EXPORT_SYMBOL(w100fb_gpio_write);
-
/*
* Initialization of critical w100 hardware
*/
@@ -1497,31 +1462,6 @@ static void w100_set_dispregs(struct w100fb_par *par)
writel((par->xres*BITS_PER_PIXEL/8), remapped_regs + mmGRAPHIC_PITCH);
}
-
-/*
- * Work out how long the sync pulse lasts
- * Value is 1/(time in seconds)
- */
-static void calc_hsync(struct w100fb_par *par)
-{
- unsigned long hsync;
- struct w100_mode *mode = par->mode;
- union crtc_ss_u crtc_ss;
-
- if (mode->pixclk_src == CLK_SRC_XTAL)
- hsync=par->mach->xtal_freq;
- else
- hsync=((par->fastpll_mode && mode->fast_pll_freq) ? mode->fast_pll_freq : mode->pll_freq)*100000;
-
- hsync /= (w100_pwr_state.pclk_cntl.f.pclk_post_div + 1);
-
- crtc_ss.val = readl(remapped_regs + mmCRTC_SS);
- if (crtc_ss.val)
- par->hsync_len = hsync / (crtc_ss.f.ss_end-crtc_ss.f.ss_start);
- else
- par->hsync_len = 0;
-}
-
static void w100_suspend(u32 mode)
{
u32 val;
@@ -14,13 +14,9 @@
struct w100fb_par;
-unsigned long w100fb_gpio_read(int port);
-void w100fb_gpio_write(int port, unsigned long value);
-unsigned long w100fb_get_hsynclen(struct device *dev);
-
/* LCD Specific Routines and Config */
struct w100_tg_info {
- void (*change)(struct w100fb_par*);
+ bool change_e800;
void (*suspend)(struct w100fb_par*);
void (*resume)(struct w100fb_par*);
};
In order to get rid of the 'select FB' line in Kconfig for all platforms, change the w100fb driver to handle the gpio lines itself rather than using an indirect function call. This also allows removing the remaining exported interfaces from the driver, the only other symbol has been unused for a long time. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/configs/pxa_defconfig | 2 + arch/arm/mach-pxa/Kconfig | 3 -- arch/arm/mach-pxa/eseries.c | 14 +----- drivers/video/fbdev/w100fb.c | 84 +++++----------------------------- include/video/w100fb.h | 6 +-- 5 files changed, 16 insertions(+), 93 deletions(-)