static void prosavage_gpio_setscl(void* data, int val) { struct savagefb_i2c_chan *chan = data; u32 r; r = VGArCR(chan->reg, chan->par); r |= PROSAVAGE_I2C_ENAB; if (val) { r |= PROSAVAGE_I2C_SCL_OUT; } else { r &= ~PROSAVAGE_I2C_SCL_OUT; } VGAwCR(chan->reg, r, chan->par); }
void savagefb_create_i2c_busses(struct fb_info *info) { struct savagefb_par *par = info->par; par->chan.par = par; switch(info->fix.accel) { case FB_ACCEL_PROSAVAGE_DDRK: case FB_ACCEL_PROSAVAGE_PM: par->chan.reg = CR_SERIAL2; par->chan.ioaddr = par->mmio.vbase; par->chan.algo.setsda = prosavage_gpio_setsda; par->chan.algo.setscl = prosavage_gpio_setscl; par->chan.algo.getsda = prosavage_gpio_getsda; par->chan.algo.getscl = prosavage_gpio_getscl; break; case FB_ACCEL_SAVAGE4: par->chan.reg = CR_SERIAL1; if (par->pcidev->revision > 1 && !(VGArCR(0xa6, par) & 0x40)) par->chan.reg = CR_SERIAL2; par->chan.ioaddr = par->mmio.vbase; par->chan.algo.setsda = prosavage_gpio_setsda; par->chan.algo.setscl = prosavage_gpio_setscl; par->chan.algo.getsda = prosavage_gpio_getsda; par->chan.algo.getscl = prosavage_gpio_getscl; break; case FB_ACCEL_SAVAGE2000: par->chan.reg = 0xff20; par->chan.ioaddr = par->mmio.vbase; par->chan.algo.setsda = savage4_gpio_setsda; par->chan.algo.setscl = savage4_gpio_setscl; par->chan.algo.getsda = savage4_gpio_getsda; par->chan.algo.getscl = savage4_gpio_getscl; break; default: par->chan.par = NULL; } savage_setup_i2c_bus(&par->chan, "SAVAGE DDC2"); }
static int prosavage_gpio_getsda(void* data) { struct savagefb_i2c_chan *chan = data; return (VGArCR(chan->reg, chan->par) & PROSAVAGE_I2C_SDA_IN) ? 1 : 0; }