From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: Anton Salnikov <asalnikov@ru.mvista.com>
Cc: linux-ide@vger.kernel.org,
Sergei Shtylyov <sshtylyov@ru.mvista.com>,
Alan Cox <alan@lxorguk.ukuu.org.uk>
Subject: Re: [PATCH] Palmchip BK3710 IDE driver
Date: Sat, 2 Feb 2008 01:29:54 +0100 [thread overview]
Message-ID: <200802020129.54329.bzolnier@gmail.com> (raw)
In-Reply-To: <200801251512.09836.asalnikov@ru.mvista.com>
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@ru.mvista.com>
> ---
>
> 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
next prev parent reply other threads:[~2008-02-02 0:18 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-25 12:12 [PATCH] Palmchip BK3710 IDE driver Anton Salnikov
2008-01-29 18:36 ` Sergei Shtylyov
2008-01-29 18:38 ` Alan Cox
2008-02-02 0:29 ` Bartlomiej Zolnierkiewicz [this message]
-- strict thread matches above, loose matches on Subject: below --
2008-02-05 16:04 Anton Salnikov
2008-02-06 1:35 ` Bartlomiej Zolnierkiewicz
2008-05-15 18:32 ` Sergei Shtylyov
2008-01-24 15:01 Anton Salnikov
2008-01-24 19:18 ` Sergei Shtylyov
2008-01-21 18:44 Anton Salnikov
2008-01-21 19:51 ` Alan Cox
2008-01-22 12:11 ` Anton Salnikov
2008-01-22 14:37 ` Alan Cox
2008-01-22 19:31 ` Jeff Garzik
2008-01-22 20:30 ` Sergei Shtylyov
2008-01-22 22:22 ` Alan Cox
2008-01-23 13:38 ` Sergei Shtylyov
2008-01-23 14:59 ` Alan Cox
2008-01-23 14:32 ` Sergei Shtylyov
2008-01-17 18:50 Anton Salnikov
2008-01-17 18:57 ` Sergei Shtylyov
2008-01-17 23:23 ` Alan Cox
2008-01-18 14:14 ` Sergei Shtylyov
2008-01-18 15:04 ` Alan Cox
2008-01-18 18:03 ` Sergei Shtylyov
2008-01-18 22:20 ` Bartlomiej Zolnierkiewicz
2008-01-18 22:19 ` Bartlomiej Zolnierkiewicz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200802020129.54329.bzolnier@gmail.com \
--to=bzolnier@gmail.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=asalnikov@ru.mvista.com \
--cc=linux-ide@vger.kernel.org \
--cc=sshtylyov@ru.mvista.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).