On Mon, 13 Jun 2016 17:38:28 +0900,
Arnd Bergmann wrote:
> 
> On Sunday, June 12, 2016 3:54:30 PM CEST Yoshinori Sato wrote:
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/pci/sh7751-pci.txt
> > +           ranges = <0x02000000 0x00000000 0xfd000000 0xfd000000 
> > 0x00000000 0x01000000>,
> > +                    <0x01000000 0x00000000 0xfe240000 0x00000000 
> > 0x00000000 0x00040000>;
> > +           reg = <0xfe200000 0x0400>,
> > +                 <0x0c000000 0x04000000>,
> > +                 <0xff800000 0x0030>;
> > +           #interrupt-cells = <1>;
> > +           interrupt-map-mask = <0x1800 0 7>;
> > +           interrupt-map = <0x0000 0 1 &cpldintc evt2irq(0x2a0) 0
> > +                            0x0000 0 2 &cpldintc evt2irq(0x2c0) 0
> > +                            0x0000 0 3 &cpldintc evt2irq(0x2e0) 0
> > +                            0x0000 0 4 &cpldintc evt2irq(0x300) 0
> > +
> > +                            0x0800 0 1 &cpldintc evt2irq(0x2c0) 0
> > +                            0x0800 0 2 &cpldintc evt2irq(0x2e0) 0
> > +                            0x0800 0 3 &cpldintc evt2irq(0x300) 0
> > +                            0x0800 0 4 &cpldintc evt2irq(0x2a0) 0
> 
> Is this not the default swizzling? I would guess that you can just
> list the interrupt once.
> 
> The formatting is slightly inconsistent here, my recommendation is
> to always enclose each entry in '< >' so you have a comma-separated
> list.

OK.
I'll fix this.

> > +
> > +#define pcic_writel(val, reg) __raw_writel(val, pci_reg_base + (reg))
> > +#define pcic_readl(reg) __raw_readl(pci_reg_base + (reg))
> 
> We generally try not to use __raw_*() accessors in drivers, because
> they are not portable, lack barriers and atomicity, and don't work
> when you change endianess.

OK.
It cpied old style driver.
Update ioread/write.

> > +unsigned long PCIBIOS_MIN_IO;
> > +unsigned long PCIBIOS_MIN_MEM;
> 
> These should probably be in architecture code, otherwise you cannot
> build more than one such driver into the kernel.
> 
> > +DEFINE_RAW_SPINLOCK(pci_config_lock);
> 
> This seems unnecessary, the config operations are always called
> under a spinlock already.

OK.
remove it.

> > +static __initconst const struct fixups {
> > +   char *compatible;
> > +   void (*fixup)(void __iomem *, void __iomem *);
> > +} fixup_list[] = {
> > +   {
> > +           .compatible = "iodata,landisk",
> > +           .fixup = landisk_fixup,
> > +   },
> > +};
> 
> Just move the fixup pointer into the existing of match table
> as the .data pointer, or add a structure to which .data
> points.

OK.

> > +/*
> > + * Functions for accessing PCI configuration space with type 1 accesses
> > + */
> > +static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,
> > +                      int where, int size, u32 *val)
> > +{
> > +   struct gen_pci *pci = bus->sysdata;
> > +   void __iomem *pci_reg_base;
> > +   unsigned long flags;
> > +   u32 data;
> > +
> > +   pci_reg_base = ioremap(pci->cfg.res.start,
> > +                          pci->cfg.res.end - pci->cfg.res.start);
> 
> You cannot call normally ioremap from pci_read, because it
> gets called under a spinlock and ioremap can normally sleep
> (that might be architecture specific).
> 
> Better map it a probe time, or use fixmap.

OK.

> > +   /*
> > +    * PCIPDR may only be accessed as 32 bit words,
> > +    * so we must do byte alignment by hand
> > +    */
> > +   raw_spin_lock_irqsave(&pci_config_lock, flags);
> > +   pcic_writel(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
> > +   data = pcic_readl(SH4_PCIPDR);
> > +   raw_spin_unlock_irqrestore(&pci_config_lock, flags);
> 
> This is shorter to express this using a 'map' function
> in pci_ops combined with pci_generic_config_read32
> and pci_generic_config_write32.

OK.

> > +/*
> > + * Called after each bus is probed, but before its children
> > + * are examined.
> > + */
> > +void pcibios_fixup_bus(struct pci_bus *bus)
> > +{
> > +}
> 
> This doesn't really belong into the driver.

OK.

> > +/*
> > + * We need to avoid collisions with `mirrored' VGA ports
> > + * and other strange ISA hardware, so we always want the
> > + * addresses to be allocated in the 0x000-0x0ff region
> > + * modulo 0x400.
> > + */
> > +resource_size_t pcibios_align_resource(void *data,
> > +                                  const struct resource *res,
> > +                                  resource_size_t size,
> > +                                  resource_size_t align)
> > +{
> > +   resource_size_t start = res->start;
> > +
> > +   return start;
> > +}
> 
> The comment does not match what the function does, you should
> change one or the other. Also move it to the same file as
> pcibios_fixup_bus.

OK.
This part copied old driver.
I will cleanup.

> > +int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
> > +                   enum pci_mmap_state mmap_state, int write_combine)
> > +{
> > +   /*
> > +    * I/O space can be accessed via normal processor loads and stores on
> > +    * this platform but for now we elect not to do this and portable
> > +    * drivers should not do this anyway.
> > +    */
> > +
> > +   if (mmap_state == pci_mmap_io)
> > +           return -EINVAL;
> > +
> > +   /*
> > +    * Ignore write-combine; for now only return uncached mappings.
> > +    */
> > +   vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> > +
> > +   return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
> > +                          vma->vm_end - vma->vm_start,
> > +                          vma->vm_page_prot);
> > +}
> 
> Do you actually need HAVE_PCI_MMAP? Maybe you can just unset that
> and remove the function here.

Not set this.
Remove function.

> > +   res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > +   pci_reg_base = ioremap(res->start, res->end - res->start);
> > +   if (IS_ERR(pci_reg_base))
> > +           return PTR_ERR(pci_reg_base);
> > +
> > +   wres = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> > +   if (IS_ERR(wres))
> > +           return PTR_ERR(wres);
> > +
> > +   res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
> > +   bcr = devm_ioremap_resource(&pdev->dev, res);
> > +   if (IS_ERR(bcr))
> 
> 
> You map three distinct memory resources here, but your
> binding just describes one as "reg: base address and
> length of the PCI controller registers".

OK.

> If there are multiple register ranges, please list each
> one in the binding and document in which order they
> are expected, or use named resources and list the required
> names.
>

This controller have single register area.
I will fix dts.

Thanks.

>       Arnd

-- 
Yoshinori Sato
<ys...@users.sourceforge.jp>

Reply via email to