Hi, On Friday 25 January 2008, Anton Salnikov wrote: > This is Palmchip BK3710 IDE controller support for kernel version 2.6.24. > The IDE controller logic supports PIO, multiword DMA and ultra-DMA modes. > Supports interface to compact Flash (CF) configured in True-IDE mode. Unfortunately some changes merged after 2.6.24 broke the build: drivers/ide/arm/palm_bk3710.c: In function ‘palm_bk3710_set_dma_mode’: drivers/ide/arm/palm_bk3710.c:243: error: ‘struct hwif_s’ has no member named ‘dma_master’ drivers/ide/arm/palm_bk3710.c: In function ‘palm_bk3710_set_pio_mode’: drivers/ide/arm/palm_bk3710.c:259: error: ‘struct hwif_s’ has no member named ‘dma_master’ [ ->dma_master is gone, ->dma_base should be used instead ] drivers/ide/arm/palm_bk3710.c: In function ‘palm_bk3710_probe’: drivers/ide/arm/palm_bk3710.c:389: error: too many arguments to function ‘ide_register_hw’ [ 'initializing' argument is gone, just removing it is OK ] drivers/ide/arm/palm_bk3710.c:404: error: too many arguments to function ‘ide_setup_dma’ [ 'num_ports' argument is gone, just removing it is OK ] Please re-sync the patch with the current Linus' git tree. There are also few less critical issues left... > Signed-off-by: Anton Salnikov <asalnikov@xxxxxxxxxxxxx> > --- > > drivers/ide/Kconfig | 8 > drivers/ide/arm/Makefile | 1 > drivers/ide/arm/palm_bk3710.c | 424 ++++++++++++++++++++++++++++++++++++++++++ > drivers/ide/ide-proc.c | 1 > include/linux/ide.h | 2 > 5 files changed, 435 insertions(+), 1 deletion(-) > > Index: 2.6.24.ide/drivers/ide/Kconfig > =================================================================== > --- 2.6.24.ide.orig/drivers/ide/Kconfig > +++ 2.6.24.ide/drivers/ide/Kconfig > @@ -1008,6 +1008,14 @@ config BLK_DEV_Q40IDE > normally be on; disable it only if you are running a custom hard > drive subsystem through an expansion card. > > +config BLK_DEV_PALMCHIP_BK3710 > + bool "Palmchip bk3710 IDE controller support" 'tristate' > + depends on ARCH_DAVINCI > + select BLK_DEV_IDEDMA_PCI > + help > + Say Y here if you want to support the onchip IDE controller on the > + TI DaVinci SoC > + > config BLK_DEV_MPC8xx_IDE > bool "MPC8xx IDE support" > depends on 8xx && (LWMON || IVMS8 || IVML24 || TQM8xxL) && IDE=y && > BLK_DEV_IDE=y && !PPC_MERGE > Index: 2.6.24.ide/drivers/ide/arm/Makefile > =================================================================== > --- 2.6.24.ide.orig/drivers/ide/arm/Makefile > +++ 2.6.24.ide/drivers/ide/arm/Makefile [...] > +static inline u8 hwif_read8(u32 base, u32 reg) > +{ > + return readb(base + reg); > +} > + > +static inline void hwif_write8(u32 base, u8 val, u32 reg) > +{ > + writeb(val, base + reg); > +} > + > +static inline u16 hwif_read16(u32 base, u32 reg) > +{ > + return readw(base + reg); > +} > + > +static inline void hwif_write16(u32 base, u16 val, u32 reg) > +{ > + writew(val, base + reg); > +} > + > +static inline u32 hwif_read32(u32 base, u32 reg) > +{ > + return readl(base + reg); > +} > + > +static inline void hwif_write32(u32 base, u32 val, u32 reg) > +{ > + writel(val, base + reg); > +} drivers/ide/arm/palm_bk3710.c: In function ‘hwif_read8’: drivers/ide/arm/palm_bk3710.c:93: warning: passing argument 1 of ‘readb’ makes pointer from integer without a cast drivers/ide/arm/palm_bk3710.c: In function ‘hwif_write8’: drivers/ide/arm/palm_bk3710.c:98: warning: passing argument 2 of ‘writeb’ makes pointer from integer without a cast drivers/ide/arm/palm_bk3710.c: In function ‘hwif_read16’: drivers/ide/arm/palm_bk3710.c:103: warning: passing argument 1 of ‘readw’ makes pointer from integer without a cast drivers/ide/arm/palm_bk3710.c: In function ‘hwif_write16’: drivers/ide/arm/palm_bk3710.c:108: warning: passing argument 2 of ‘writew’ makes pointer from integer without a cast drivers/ide/arm/palm_bk3710.c: In function ‘hwif_read32’: drivers/ide/arm/palm_bk3710.c:113: warning: passing argument 1 of ‘readl’ makes pointer from integer without a cast drivers/ide/arm/palm_bk3710.c: In function ‘hwif_write32’: drivers/ide/arm/palm_bk3710.c:118: warning: passing argument 2 of ‘writel’ makes pointer from integer without a cast 'base' should be of 'void __iomem *' type for read*/write* ops Besides: because the driver supports multiple controllers now these wrappers doesn't provide any value and just obfuscate the code (as noticed by Alan). Please remove them. > +static void palm_bk3710_setudmamode(u32 base, unsigned int dev, 'base' should be of 'void __iomem *' type for read*/*write ops [ casting from u32 can be done in the caller ] > + unsigned int mode) > +{ > + u8 tenv, trp, t0; > + u32 val32; > + u16 val16; > + > + /* DMA Data Setup */ > + t0 = (palm_bk3710_udmatimings[mode].cycletime + ide_palm_clk - 1) > + / ide_palm_clk - 1; > + tenv = (20 + ide_palm_clk - 1) / ide_palm_clk - 1; > + trp = (palm_bk3710_udmatimings[mode].rptime + ide_palm_clk - 1) > + / ide_palm_clk - 1; > + > + /* udmatim Register */ > + val16 = hwif_read16(base, BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0); > + val16 |= (mode << (dev ? 4 : 0)); > + hwif_write16(base, val16, BK3710_UDMATIM); > + > + /* udmastb Ultra DMA Access Strobe Width */ > + val32 = hwif_read32(base, BK3710_UDMASTB) & (0xFF << (dev ? 0 : 8)); > + val32 |= (t0 << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_UDMASTB); > + > + /* udmatrp Ultra DMA Ready to Pause Time */ > + val32 = hwif_read32(base, BK3710_UDMATRP) & (0xFF << (dev ? 0 : 8)); > + val32 |= (trp << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_UDMATRP); > + > + /* udmaenv Ultra DMA envelop Time */ > + val32 = hwif_read32(base, BK3710_UDMAENV) & (0xFF << (dev ? 0 : 8)); > + val32 |= (tenv << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_UDMAENV); > + > + /* Enable UDMA for Device */ > + val16 = hwif_read16(base, BK3710_UDMACTL) | (1 << dev); > + hwif_write16(base, val16, BK3710_UDMACTL); > +} > + > +static void palm_bk3710_setdmamode(u32 base, unsigned int dev, ditto > + unsigned short min_cycle, > + unsigned int mode) > +{ > + u8 td, tkw, t0; > + u32 val32; > + u16 val16; > + struct ide_timing *t; > + int cycletime; > + > + t = ide_timing_find_mode(mode); > + cycletime = max_t(int, t->cycle, min_cycle); > + > + /* DMA Data Setup */ > + t0 = (cycletime + ide_palm_clk - 1) / ide_palm_clk; > + td = (t->active + ide_palm_clk - 1) / ide_palm_clk; > + tkw = t0 - td - 1; > + td -= 1; > + > + val32 = hwif_read32(base, BK3710_DMASTB) & (0xFF << (dev ? 0 : 8)); > + val32 |= (td << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_DMASTB); > + > + val32 = hwif_read32(base, BK3710_DMARCVR) & (0xFF << (dev ? 0 : 8)); > + val32 |= (tkw << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_DMARCVR); > + > + /* Disable UDMA for Device */ > + val16 = hwif_read16(base, BK3710_UDMACTL) & ~(1 << dev); > + hwif_write16(base, val16, BK3710_UDMACTL); > +} > + > +static void palm_bk3710_setpiomode(u32 base, ide_drive_t *mate, ditto > + unsigned int dev, unsigned int cycletime, > + unsigned int mode) > +{ > + u8 t2, t2i, t0; > + u32 val32; > + struct ide_timing *t; > + > + /* PIO Data Setup */ > + t0 = (cycletime + ide_palm_clk - 1) / ide_palm_clk; > + t2 = (ide_timing_find_mode(XFER_PIO_0 + mode)->active + > + ide_palm_clk - 1) / ide_palm_clk; > + > + t2i = t0 - t2 - 1; > + t2 -= 1; > + > + val32 = hwif_read32(base, BK3710_DATSTB) & (0xFF << (dev ? 0 : 8)); > + val32 |= (t2 << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_DATSTB); > + > + val32 = hwif_read32(base, BK3710_DATRCVR) & (0xFF << (dev ? 0 : 8)); > + val32 |= (t2i << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_DATRCVR); > + > + if (mate && mate->present) { > + u8 mode2 = ide_get_best_pio_mode(mate, 255, 4); > + > + if (mode2 < mode) > + mode = mode2; > + } > + > + /* TASKFILE Setup */ > + t = ide_timing_find_mode(XFER_PIO_0 + mode); > + t0 = (t->cyc8b + ide_palm_clk - 1) / ide_palm_clk; > + t2 = (t->act8b + ide_palm_clk - 1) / ide_palm_clk; > + > + t2i = t0 - t2 - 1; > + t2 -= 1; > + > + val32 = hwif_read32(base, BK3710_REGSTB) & (0xFF << (dev ? 0 : 8)); > + val32 |= (t2 << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_REGSTB); > + > + val32 = hwif_read32(base, BK3710_REGRCVR) & (0xFF << (dev ? 0 : 8)); > + val32 |= (t2i << (dev ? 8 : 0)); > + hwif_write32(base, val32, BK3710_REGRCVR); > +} > + > +static void palm_bk3710_set_dma_mode(ide_drive_t *drive, u8 xferspeed) > +{ > + int is_slave = drive->dn & 1; > + u32 base = drive->hwif->dma_master; > + > + if (xferspeed >= XFER_UDMA_0) { > + palm_bk3710_setudmamode(base, is_slave, > + xferspeed - XFER_UDMA_0); > + } else { > + palm_bk3710_setdmamode(base, is_slave, drive->id->eide_dma_min, > + xferspeed); > + } > +} > + > +static void palm_bk3710_set_pio_mode(ide_drive_t *drive, u8 pio) > +{ > + unsigned int cycle_time; > + int is_slave = drive->dn & 1; > + ide_drive_t *mate; > + u32 base = drive->hwif->dma_master; > + > + /* > + * Obtain the drive PIO data for tuning the Palm Chip registers > + */ > + cycle_time = ide_pio_cycle_time(drive, pio); > + mate = ide_get_paired_drive(drive); > + palm_bk3710_setpiomode(base, mate, is_slave, cycle_time, pio); > +} > + > +static void __devinit palm_bk3710_chipinit(u32 base) 'u32' -> 'void __iomem *' > +{ > + /* > + * enable the reset_en of ATA controller so that when ata signals > + * are brought out, by writing into device config. at that > + * time por_n signal should not be 'Z' and have a stable value. > + */ > + hwif_write32(base, 0x0300, BK3710_MISCCTL); > + > + /* wait for some time and deassert the reset of ATA Device. */ > + mdelay(100); > + > + /* Deassert the Reset */ > + hwif_write32(base, 0x0200, BK3710_MISCCTL); > + > + /* > + * Program the IDETIMP Register Value based on the following assumptions > + * > + * (ATA_IDETIMP_IDEEN , ENABLE ) | > + * (ATA_IDETIMP_SLVTIMEN , DISABLE) | > + * (ATA_IDETIMP_RDYSMPL , 70NS) | > + * (ATA_IDETIMP_RDYRCVRY , 50NS) | > + * (ATA_IDETIMP_DMAFTIM1 , PIOCOMP) | > + * (ATA_IDETIMP_PREPOST1 , DISABLE) | > + * (ATA_IDETIMP_RDYSEN1 , DISABLE) | > + * (ATA_IDETIMP_PIOFTIM1 , DISABLE) | > + * (ATA_IDETIMP_DMAFTIM0 , PIOCOMP) | > + * (ATA_IDETIMP_PREPOST0 , DISABLE) | > + * (ATA_IDETIMP_RDYSEN0 , DISABLE) | > + * (ATA_IDETIMP_PIOFTIM0 , DISABLE) > + */ > + hwif_write16(base, 0xB388, BK3710_IDETIMP); > + > + /* > + * Configure SIDETIM Register > + * (ATA_SIDETIM_RDYSMPS1 ,120NS ) | > + * (ATA_SIDETIM_RDYRCYS1 ,120NS ) > + */ > + hwif_write8(base, 0, BK3710_SIDETIM); > + > + /* > + * UDMACTL Ultra-ATA DMA Control > + * (ATA_UDMACTL_UDMAP1 , 0 ) | > + * (ATA_UDMACTL_UDMAP0 , 0 ) > + * > + */ > + hwif_write16(base, 0, BK3710_UDMACTL); > + > + /* > + * MISCCTL Miscellaneous Conrol Register > + * (ATA_MISCCTL_RSTMODEP , 1) | > + * (ATA_MISCCTL_RESETP , 0) | > + * (ATA_MISCCTL_TIMORIDE , 1) > + */ > + hwif_write32(base, 0x201, BK3710_MISCCTL); > + > + /* > + * IORDYTMP IORDY Timer for Primary Register > + * (ATA_IORDYTMP_IORDYTMP , 0xffff ) > + */ > + hwif_write32(base, 0xFFFF, BK3710_IORDYTMP); > + > + /* > + * Configure BMISP Register > + * (ATA_BMISP_DMAEN1 , DISABLE ) | > + * (ATA_BMISP_DMAEN0 , DISABLE ) | > + * (ATA_BMISP_IORDYINT , CLEAR) | > + * (ATA_BMISP_INTRSTAT , CLEAR) | > + * (ATA_BMISP_DMAERROR , CLEAR) > + */ > + hwif_write16(base, 0, BK3710_BMISP); > + > + palm_bk3710_setpiomode(base, NULL, 0, 600, 0); > + palm_bk3710_setpiomode(base, NULL, 1, 600, 0); > +} > +static int __devinit palm_bk3710_probe(struct platform_device *pdev) > +{ > + hw_regs_t ide_ctlr_info; > + int index = 0; > + int pribase; > + struct clk *clkp; > + struct resource *mem, *irq; > + ide_hwif_t *hwif; > + u32 base; ditto > + clkp = clk_get(NULL, "IDECLK"); > + if (IS_ERR(clkp)) > + return -ENODEV; > + > + ideclkp = clkp; > + clk_enable(ideclkp); > + ide_palm_clk = clk_get_rate(ideclkp)/100000; > + ide_palm_clk = (10000/ide_palm_clk) + 1; > + /* Register the IDE interface with Linux ATA Interface */ > + memset(&ide_ctlr_info, 0, sizeof(ide_ctlr_info)); > + > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (mem == NULL) { > + printk(KERN_ERR "failed to get memory region resource\n"); > + return -ENODEV; > + } > + irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > + if (irq == NULL) { > + printk(KERN_ERR "failed to get IRQ resource\n"); > + return -ENODEV; > + } > + > + base = mem->start; > + > + /* Configure the Palm Chip controller */ > + palm_bk3710_chipinit(base); > + > + pribase = mem->start + IDE_PALM_ATA_PRI_REG_OFFSET; > + for (index = 0; index < IDE_NR_PORTS - 2; index++) > + ide_ctlr_info.io_ports[index] = pribase + index; > + ide_ctlr_info.io_ports[IDE_CONTROL_OFFSET] = mem->start + > + IDE_PALM_ATA_PRI_CTL_OFFSET; > + ide_ctlr_info.irq = irq->start; > + ide_ctlr_info.chipset = ide_palm3710; > + > + if (ide_register_hw(&ide_ctlr_info, NULL, 0, &hwif) < 0) { > + printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n"); > + return -ENODEV; > + } > + > + hwif->set_pio_mode = &palm_bk3710_set_pio_mode; > + hwif->set_dma_mode = &palm_bk3710_set_dma_mode; > + hwif->mmio = 1; > + default_hwif_mmiops(hwif); > + hwif->ultra_mask = 0x1f; /* Ultra DMA Mode 4 Max > + (input clk 99MHz) */ I've just noticed that there is no cable detection for UDMA modes > UDMA2? > + hwif->mwdma_mask = 0x7; > + hwif->drives[0].autotune = 1; > + hwif->drives[1].autotune = 1; > + > + ide_setup_dma(hwif, mem->start, 8); > + > + return 0; > +} [...] Otherwise the driver looks fine and will be merged once the above issues get addressed so please recast+resubmit it. Thanks, Bart - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html