Skip to content

Commit

Permalink
viafb: improve viafb_par
Browse files Browse the repository at this point in the history
This patch introduces viafb_shared and is the beginning of a smooth
transition to use it.

viafb_shared should contain all general, non-surface specific data that
should be shared along all viafb framebuffers while viafb_par should only
contain things that are specific to each surface or in other words extend
fb_info.  This change is intended to clean the dual/multi framebuffer
handling up.

This removes the annoyance that viafbinfo1->par points to a different
structure than viaparinfo1.

As the last change is fundamental it is difficult to ensure that all parts
of the driver do not depend on the previous brokenness but the chance of
regressions is very low.

Signed-off-by: Florian Tobias Schandinat <[email protected]>
Cc: Scott Fang <[email protected]>
Cc: Joseph Chan <[email protected]>
Cc: Harald Welte <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
schandinat authored and torvalds committed Sep 23, 2009
1 parent 68fa920 commit c4df548
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 65 deletions.
6 changes: 3 additions & 3 deletions drivers/video/via/dvi.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ int viafb_tmds_trasmitter_identify(void)

static void tmds_register_write(int index, u8 data)
{
viaparinfo->i2c_stuff.i2c_port =
viaparinfo->shared->i2c_stuff.i2c_port =
viaparinfo->chip_info->tmds_chip_info.i2c_port;

viafb_i2c_writebyte(viaparinfo->chip_info->tmds_chip_info.
Expand All @@ -172,7 +172,7 @@ static int tmds_register_read(int index)
{
u8 data;

viaparinfo->i2c_stuff.i2c_port =
viaparinfo->shared->i2c_stuff.i2c_port =
viaparinfo->chip_info->tmds_chip_info.i2c_port;
viafb_i2c_readbyte((u8) viaparinfo->chip_info->
tmds_chip_info.tmds_chip_slave_addr,
Expand All @@ -182,7 +182,7 @@ static int tmds_register_read(int index)

static int tmds_register_read_bytes(int index, u8 *buff, int buff_len)
{
viaparinfo->i2c_stuff.i2c_port =
viaparinfo->shared->i2c_stuff.i2c_port =
viaparinfo->chip_info->tmds_chip_info.i2c_port;
viafb_i2c_readbytes((u8) viaparinfo->chip_info->tmds_chip_info.
tmds_chip_slave_addr, (u8) index, buff, buff_len);
Expand Down
6 changes: 3 additions & 3 deletions drivers/video/via/lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,13 +207,13 @@ static bool lvds_identify_integratedlvds(void)

int viafb_lvds_trasmitter_identify(void)
{
viaparinfo->i2c_stuff.i2c_port = I2CPORTINDEX;
viaparinfo->shared->i2c_stuff.i2c_port = I2CPORTINDEX;
if (viafb_lvds_identify_vt1636()) {
viaparinfo->chip_info->lvds_chip_info.i2c_port = I2CPORTINDEX;
DEBUG_MSG(KERN_INFO
"Found VIA VT1636 LVDS on port i2c 0x31 \n");
} else {
viaparinfo->i2c_stuff.i2c_port = GPIOPORTINDEX;
viaparinfo->shared->i2c_stuff.i2c_port = GPIOPORTINDEX;
if (viafb_lvds_identify_vt1636()) {
viaparinfo->chip_info->lvds_chip_info.i2c_port =
GPIOPORTINDEX;
Expand Down Expand Up @@ -470,7 +470,7 @@ static int lvds_register_read(int index)
{
u8 data;

viaparinfo->i2c_stuff.i2c_port = GPIOPORTINDEX;
viaparinfo->shared->i2c_stuff.i2c_port = GPIOPORTINDEX;
viafb_i2c_readbyte((u8) viaparinfo->chip_info->
lvds_chip_info.lvds_chip_slave_addr,
(u8) index, &data);
Expand Down
64 changes: 32 additions & 32 deletions drivers/video/via/via_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ int viafb_i2c_readbyte(u8 slave_addr, u8 index, u8 *pdata)
mm1[0] = index;
msgs[0].len = 1; msgs[1].len = 1;
msgs[0].buf = mm1; msgs[1].buf = pdata;
i2c_transfer(&viaparinfo->i2c_stuff.adapter, msgs, 2);
i2c_transfer(&viaparinfo->shared->i2c_stuff.adapter, msgs, 2);

return 0;
}
Expand All @@ -111,7 +111,7 @@ int viafb_i2c_writebyte(u8 slave_addr, u8 index, u8 data)
msgs.addr = slave_addr / 2;
msgs.len = 2;
msgs.buf = msg;
return i2c_transfer(&viaparinfo->i2c_stuff.adapter, &msgs, 1);
return i2c_transfer(&viaparinfo->shared->i2c_stuff.adapter, &msgs, 1);
}

int viafb_i2c_readbytes(u8 slave_addr, u8 index, u8 *buff, int buff_len)
Expand All @@ -125,53 +125,53 @@ int viafb_i2c_readbytes(u8 slave_addr, u8 index, u8 *buff, int buff_len)
mm1[0] = index;
msgs[0].len = 1; msgs[1].len = buff_len;
msgs[0].buf = mm1; msgs[1].buf = buff;
i2c_transfer(&viaparinfo->i2c_stuff.adapter, msgs, 2);
i2c_transfer(&viaparinfo->shared->i2c_stuff.adapter, msgs, 2);
return 0;
}

int viafb_create_i2c_bus(void *viapar)
{
int ret;
struct viafb_par *par = (struct viafb_par *)viapar;

strcpy(par->i2c_stuff.adapter.name, "via_i2c");
par->i2c_stuff.i2c_port = 0x0;
par->i2c_stuff.adapter.owner = THIS_MODULE;
par->i2c_stuff.adapter.id = 0x01FFFF;
par->i2c_stuff.adapter.class = 0;
par->i2c_stuff.adapter.algo_data = &par->i2c_stuff.algo;
par->i2c_stuff.adapter.dev.parent = NULL;
par->i2c_stuff.algo.setsda = via_i2c_setsda;
par->i2c_stuff.algo.setscl = via_i2c_setscl;
par->i2c_stuff.algo.getsda = via_i2c_getsda;
par->i2c_stuff.algo.getscl = via_i2c_getscl;
par->i2c_stuff.algo.udelay = 40;
par->i2c_stuff.algo.timeout = 20;
par->i2c_stuff.algo.data = &par->i2c_stuff;

i2c_set_adapdata(&par->i2c_stuff.adapter, &par->i2c_stuff);
struct via_i2c_stuff *i2c_stuff =
&((struct viafb_par *)viapar)->shared->i2c_stuff;

strcpy(i2c_stuff->adapter.name, "via_i2c");
i2c_stuff->i2c_port = 0x0;
i2c_stuff->adapter.owner = THIS_MODULE;
i2c_stuff->adapter.id = 0x01FFFF;
i2c_stuff->adapter.class = 0;
i2c_stuff->adapter.algo_data = &i2c_stuff->algo;
i2c_stuff->adapter.dev.parent = NULL;
i2c_stuff->algo.setsda = via_i2c_setsda;
i2c_stuff->algo.setscl = via_i2c_setscl;
i2c_stuff->algo.getsda = via_i2c_getsda;
i2c_stuff->algo.getscl = via_i2c_getscl;
i2c_stuff->algo.udelay = 40;
i2c_stuff->algo.timeout = 20;
i2c_stuff->algo.data = i2c_stuff;

i2c_set_adapdata(&i2c_stuff->adapter, i2c_stuff);

/* Raise SCL and SDA */
par->i2c_stuff.i2c_port = I2CPORTINDEX;
via_i2c_setsda(&par->i2c_stuff, 1);
via_i2c_setscl(&par->i2c_stuff, 1);
i2c_stuff->i2c_port = I2CPORTINDEX;
via_i2c_setsda(i2c_stuff, 1);
via_i2c_setscl(i2c_stuff, 1);

par->i2c_stuff.i2c_port = GPIOPORTINDEX;
via_i2c_setsda(&par->i2c_stuff, 1);
via_i2c_setscl(&par->i2c_stuff, 1);
i2c_stuff->i2c_port = GPIOPORTINDEX;
via_i2c_setsda(i2c_stuff, 1);
via_i2c_setscl(i2c_stuff, 1);
udelay(20);

ret = i2c_bit_add_bus(&par->i2c_stuff.adapter);
ret = i2c_bit_add_bus(&i2c_stuff->adapter);
if (ret == 0)
DEBUG_MSG("I2C bus %s registered.\n",
par->i2c_stuff.adapter.name);
DEBUG_MSG("I2C bus %s registered.\n", i2c_stuff->adapter.name);
else
DEBUG_MSG("Failed to register I2C bus %s.\n",
par->i2c_stuff.adapter.name);
i2c_stuff->adapter.name);
return ret;
}

void viafb_delete_i2c_buss(void *par)
{
i2c_del_adapter(&((struct viafb_par *)par)->i2c_stuff.adapter);
i2c_del_adapter(&((struct viafb_par *)par)->shared->i2c_stuff.adapter);
}
35 changes: 13 additions & 22 deletions drivers/video/via/viafbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1943,40 +1943,30 @@ static int __devinit via_pci_probe(void)
char *tmpc, *tmpm;
char *tmpc_sec, *tmpm_sec;
int vmode_index;
u32 tmds_length, lvds_length, crt_length, chip_length, viafb_par_length;
u32 viafb_par_length;

DEBUG_MSG(KERN_INFO "VIAFB PCI Probe!!\n");

viafb_par_length = ALIGN(sizeof(struct viafb_par), BITS_PER_LONG/8);
tmds_length = ALIGN(sizeof(struct tmds_setting_information),
BITS_PER_LONG/8);
lvds_length = ALIGN(sizeof(struct lvds_setting_information),
BITS_PER_LONG/8);
crt_length = ALIGN(sizeof(struct lvds_setting_information),
BITS_PER_LONG/8);
chip_length = ALIGN(sizeof(struct chip_information), BITS_PER_LONG/8);

/* Allocate fb_info and ***_par here, also including some other needed
* variables
*/
viafbinfo = framebuffer_alloc(viafb_par_length + 2 * lvds_length +
tmds_length + crt_length + chip_length, NULL);
viafbinfo = framebuffer_alloc(viafb_par_length +
ALIGN(sizeof(struct viafb_shared), BITS_PER_LONG/8), NULL);
if (!viafbinfo) {
printk(KERN_ERR"Could not allocate memory for viafb_info.\n");
return -ENODEV;
}

viaparinfo = (struct viafb_par *)viafbinfo->par;
viaparinfo->tmds_setting_info = (struct tmds_setting_information *)
((unsigned long)viaparinfo + viafb_par_length);
viaparinfo->lvds_setting_info = (struct lvds_setting_information *)
((unsigned long)viaparinfo->tmds_setting_info + tmds_length);
viaparinfo->lvds_setting_info2 = (struct lvds_setting_information *)
((unsigned long)viaparinfo->lvds_setting_info + lvds_length);
viaparinfo->crt_setting_info = (struct crt_setting_information *)
((unsigned long)viaparinfo->lvds_setting_info2 + lvds_length);
viaparinfo->chip_info = (struct chip_information *)
((unsigned long)viaparinfo->crt_setting_info + crt_length);
viaparinfo->shared = viafbinfo->par + viafb_par_length;
viaparinfo->tmds_setting_info = &viaparinfo->shared->tmds_setting_info;
viaparinfo->lvds_setting_info = &viaparinfo->shared->lvds_setting_info;
viaparinfo->lvds_setting_info2 =
&viaparinfo->shared->lvds_setting_info2;
viaparinfo->crt_setting_info = &viaparinfo->shared->crt_setting_info;
viaparinfo->chip_info = &viaparinfo->shared->chip_info;

if (viafb_dual_fb)
viafb_SAMM_ON = 1;
Expand Down Expand Up @@ -2142,6 +2132,7 @@ static int __devinit via_pci_probe(void)
viaparinfo->iga_path = IGA1;
viaparinfo1->iga_path = IGA2;
memcpy(viafbinfo1, viafbinfo, sizeof(struct fb_info));
viafbinfo1->par = viaparinfo1;
viafbinfo1->screen_base = viafbinfo->screen_base +
viafb_second_offset;

Expand Down Expand Up @@ -2193,7 +2184,7 @@ static int __devinit via_pci_probe(void)
viafbinfo->node, viafbinfo->fix.id, default_var.xres,
default_var.yres, default_var.bits_per_pixel);

viafb_init_proc(&viaparinfo->proc_entry);
viafb_init_proc(&viaparinfo->shared->proc_entry);
viafb_init_dac(IGA2);
return 0;
}
Expand All @@ -2214,7 +2205,7 @@ static void __devexit via_pci_remove(void)
if (viafb_dual_fb)
framebuffer_release(viafbinfo1);

viafb_remove_proc(viaparinfo->proc_entry);
viafb_remove_proc(viaparinfo->shared->proc_entry);
}

#ifndef MODULE
Expand Down
19 changes: 16 additions & 3 deletions drivers/video/via/viafbdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,20 @@
#define VERSION_OS 0 /* 0: for 32 bits OS, 1: for 64 bits OS */
#define VERSION_MINOR 4

struct viafb_shared {
struct proc_dir_entry *proc_entry; /*viafb proc entry */

/* I2C stuff */
struct via_i2c_stuff i2c_stuff;

/* All the information will be needed to set engine */
struct tmds_setting_information tmds_setting_info;
struct crt_setting_information crt_setting_info;
struct lvds_setting_information lvds_setting_info;
struct lvds_setting_information lvds_setting_info2;
struct chip_information chip_info;
};

struct viafb_par {
void __iomem *io_virt; /*iospace virtual memory address */
unsigned int fbmem; /*framebuffer physical memory address */
Expand All @@ -47,12 +61,11 @@ struct viafb_par {
u32 VQ_start; /* Virtual Queue Start Address */
u32 VQ_end; /* Virtual Queue End Address */
u32 iga_path;
struct proc_dir_entry *proc_entry; /*viafb proc entry */

/* I2C stuff */
struct via_i2c_stuff i2c_stuff;
struct viafb_shared *shared;

/* All the information will be needed to set engine */
/* depreciated, use the ones in shared directly */
struct tmds_setting_information *tmds_setting_info;
struct crt_setting_information *crt_setting_info;
struct lvds_setting_information *lvds_setting_info;
Expand Down
4 changes: 2 additions & 2 deletions drivers/video/via/vt1636.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information
{
u8 data;

viaparinfo->i2c_stuff.i2c_port = plvds_chip_info->i2c_port;
viaparinfo->shared->i2c_stuff.i2c_port = plvds_chip_info->i2c_port;
viafb_i2c_readbyte(plvds_chip_info->lvds_chip_slave_addr, index, &data);

return data;
Expand All @@ -39,7 +39,7 @@ void viafb_gpio_i2c_write_mask_lvds(struct lvds_setting_information
{
int index, data;

viaparinfo->i2c_stuff.i2c_port = plvds_chip_info->i2c_port;
viaparinfo->shared->i2c_stuff.i2c_port = plvds_chip_info->i2c_port;

index = io_data.Index;
data = viafb_gpio_i2c_read_lvds(plvds_setting_info, plvds_chip_info,
Expand Down

0 comments on commit c4df548

Please sign in to comment.