soc: ixp4xx: npe: Pass addresses as resources
Instead of using hardcoded base addresses implicitly obtained through <linux/io.h>, pass the physical base for the three NPE blocks as memory resources and remap these in the driver. Drop the memory request region business, this will anyways be done by devm_* remapping functions. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Родитель
81bca32fcc
Коммит
0b458d7b10
|
@ -150,9 +150,30 @@ static struct platform_device ixp4xx_udc_device = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource ixp4xx_npe_resources[] = {
|
||||||
|
{
|
||||||
|
.start = IXP4XX_NPEA_BASE_PHYS,
|
||||||
|
.end = IXP4XX_NPEA_BASE_PHYS + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IXP4XX_NPEB_BASE_PHYS,
|
||||||
|
.end = IXP4XX_NPEB_BASE_PHYS + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = IXP4XX_NPEC_BASE_PHYS,
|
||||||
|
.end = IXP4XX_NPEC_BASE_PHYS + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device ixp4xx_npe_device = {
|
static struct platform_device ixp4xx_npe_device = {
|
||||||
.name = "ixp4xx-npe",
|
.name = "ixp4xx-npe",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(ixp4xx_npe_resources),
|
||||||
|
.resource = ixp4xx_npe_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ixp4xx_qmgr_device = {
|
static struct platform_device ixp4xx_qmgr_device = {
|
||||||
|
|
|
@ -132,9 +132,6 @@
|
||||||
#define IXP4XX_INTC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000)
|
#define IXP4XX_INTC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000)
|
||||||
#define IXP4XX_GPIO_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000)
|
#define IXP4XX_GPIO_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000)
|
||||||
#define IXP4XX_TIMER_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000)
|
#define IXP4XX_TIMER_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000)
|
||||||
#define IXP4XX_NPEA_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x6000)
|
|
||||||
#define IXP4XX_NPEB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x7000)
|
|
||||||
#define IXP4XX_NPEC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x8000)
|
|
||||||
#define IXP4XX_EthB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000)
|
#define IXP4XX_EthB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000)
|
||||||
#define IXP4XX_EthC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000)
|
#define IXP4XX_EthC_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000)
|
||||||
#define IXP4XX_USB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000)
|
#define IXP4XX_USB_BASE_VIRT (IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000)
|
||||||
|
|
|
@ -155,16 +155,10 @@ static struct {
|
||||||
static struct npe npe_tab[NPE_COUNT] = {
|
static struct npe npe_tab[NPE_COUNT] = {
|
||||||
{
|
{
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.regs = (struct npe_regs __iomem *)IXP4XX_NPEA_BASE_VIRT,
|
|
||||||
.regs_phys = IXP4XX_NPEA_BASE_PHYS,
|
|
||||||
}, {
|
}, {
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.regs = (struct npe_regs __iomem *)IXP4XX_NPEB_BASE_VIRT,
|
|
||||||
.regs_phys = IXP4XX_NPEB_BASE_PHYS,
|
|
||||||
}, {
|
}, {
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.regs = (struct npe_regs __iomem *)IXP4XX_NPEC_BASE_VIRT,
|
|
||||||
.regs_phys = IXP4XX_NPEC_BASE_PHYS,
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -687,23 +681,34 @@ void npe_release(struct npe *npe)
|
||||||
static int ixp4xx_npe_probe(struct platform_device *pdev)
|
static int ixp4xx_npe_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int i, found = 0;
|
int i, found = 0;
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct resource *res;
|
||||||
|
|
||||||
for (i = 0; i < NPE_COUNT; i++) {
|
for (i = 0; i < NPE_COUNT; i++) {
|
||||||
struct npe *npe = &npe_tab[i];
|
struct npe *npe = &npe_tab[i];
|
||||||
|
|
||||||
|
res = platform_get_resource(pdev, IORESOURCE_MEM, i);
|
||||||
|
if (!res)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (!(ixp4xx_read_feature_bits() &
|
if (!(ixp4xx_read_feature_bits() &
|
||||||
(IXP4XX_FEATURE_RESET_NPEA << i)))
|
(IXP4XX_FEATURE_RESET_NPEA << i))) {
|
||||||
|
dev_info(dev, "NPE%d at 0x%08x-0x%08x not available\n",
|
||||||
|
i, res->start, res->end);
|
||||||
continue; /* NPE already disabled or not present */
|
continue; /* NPE already disabled or not present */
|
||||||
if (!(npe->mem_res = request_mem_region(npe->regs_phys,
|
}
|
||||||
REGS_SIZE,
|
npe->regs = devm_ioremap_resource(dev, res);
|
||||||
npe_name(npe)))) {
|
if (!npe->regs)
|
||||||
print_npe(KERN_ERR, npe,
|
return -ENOMEM;
|
||||||
"failed to request memory region\n");
|
|
||||||
|
if (npe_reset(npe)) {
|
||||||
|
dev_info(dev, "NPE%d at 0x%08x-0x%08x does not reset\n",
|
||||||
|
i, res->start, res->end);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (npe_reset(npe))
|
|
||||||
continue;
|
|
||||||
npe->valid = 1;
|
npe->valid = 1;
|
||||||
|
dev_info(dev, "NPE%d at 0x%08x-0x%08x registered\n",
|
||||||
|
i, res->start, res->end);
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,9 +722,8 @@ static int ixp4xx_npe_remove(struct platform_device *pdev)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NPE_COUNT; i++)
|
for (i = 0; i < NPE_COUNT; i++)
|
||||||
if (npe_tab[i].mem_res) {
|
if (npe_tab[i].regs) {
|
||||||
npe_reset(&npe_tab[i]);
|
npe_reset(&npe_tab[i]);
|
||||||
release_resource(npe_tab[i].mem_res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -16,9 +16,7 @@ struct npe_regs {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct npe {
|
struct npe {
|
||||||
struct resource *mem_res;
|
|
||||||
struct npe_regs __iomem *regs;
|
struct npe_regs __iomem *regs;
|
||||||
u32 regs_phys;
|
|
||||||
int id;
|
int id;
|
||||||
int valid;
|
int valid;
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче