ptp_qoriq: convert to use ptp_qoriq_init/free
Moved QorIQ PTP clock initialization/free into new functions ptp_qoriq_init()/ptp_qoriq_free(). These functions could also be reused by ENETC PTP drvier which is a PCI driver for same 1588 timer IP block. Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
73356e4ea8
commit
ff54571a74
|
@ -458,25 +458,17 @@ static int ptp_qoriq_auto_config(struct ptp_qoriq *ptp_qoriq,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptp_qoriq_probe(struct platform_device *dev)
|
int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
|
||||||
|
const struct ptp_clock_info caps)
|
||||||
{
|
{
|
||||||
struct device_node *node = dev->dev.of_node;
|
struct device_node *node = ptp_qoriq->dev->of_node;
|
||||||
struct ptp_qoriq *ptp_qoriq;
|
|
||||||
struct ptp_qoriq_registers *regs;
|
struct ptp_qoriq_registers *regs;
|
||||||
struct timespec64 now;
|
struct timespec64 now;
|
||||||
int err = -ENOMEM;
|
|
||||||
u32 tmr_ctrl;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void __iomem *base;
|
u32 tmr_ctrl;
|
||||||
|
|
||||||
ptp_qoriq = kzalloc(sizeof(*ptp_qoriq), GFP_KERNEL);
|
ptp_qoriq->base = base;
|
||||||
if (!ptp_qoriq)
|
ptp_qoriq->caps = caps;
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
err = -EINVAL;
|
|
||||||
|
|
||||||
ptp_qoriq->dev = &dev->dev;
|
|
||||||
ptp_qoriq->caps = ptp_qoriq_caps;
|
|
||||||
|
|
||||||
if (of_property_read_u32(node, "fsl,cksel", &ptp_qoriq->cksel))
|
if (of_property_read_u32(node, "fsl,cksel", &ptp_qoriq->cksel))
|
||||||
ptp_qoriq->cksel = DEFAULT_CKSEL;
|
ptp_qoriq->cksel = DEFAULT_CKSEL;
|
||||||
|
@ -501,44 +493,9 @@ static int ptp_qoriq_probe(struct platform_device *dev)
|
||||||
pr_warn("device tree node missing required elements, try automatic configuration\n");
|
pr_warn("device tree node missing required elements, try automatic configuration\n");
|
||||||
|
|
||||||
if (ptp_qoriq_auto_config(ptp_qoriq, node))
|
if (ptp_qoriq_auto_config(ptp_qoriq, node))
|
||||||
goto no_config;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = -ENODEV;
|
|
||||||
|
|
||||||
ptp_qoriq->irq = platform_get_irq(dev, 0);
|
|
||||||
|
|
||||||
if (ptp_qoriq->irq < 0) {
|
|
||||||
pr_err("irq not in device tree\n");
|
|
||||||
goto no_node;
|
|
||||||
}
|
|
||||||
if (request_irq(ptp_qoriq->irq, ptp_qoriq_isr, IRQF_SHARED,
|
|
||||||
DRIVER, ptp_qoriq)) {
|
|
||||||
pr_err("request_irq failed\n");
|
|
||||||
goto no_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptp_qoriq->rsrc = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
|
||||||
if (!ptp_qoriq->rsrc) {
|
|
||||||
pr_err("no resource\n");
|
|
||||||
goto no_resource;
|
|
||||||
}
|
|
||||||
if (request_resource(&iomem_resource, ptp_qoriq->rsrc)) {
|
|
||||||
pr_err("resource busy\n");
|
|
||||||
goto no_resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_init(&ptp_qoriq->lock);
|
|
||||||
|
|
||||||
base = ioremap(ptp_qoriq->rsrc->start,
|
|
||||||
resource_size(ptp_qoriq->rsrc));
|
|
||||||
if (!base) {
|
|
||||||
pr_err("ioremap ptp registers failed\n");
|
|
||||||
goto no_ioremap;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptp_qoriq->base = base;
|
|
||||||
|
|
||||||
if (of_device_is_compatible(node, "fsl,fman-ptp-timer")) {
|
if (of_device_is_compatible(node, "fsl,fman-ptp-timer")) {
|
||||||
ptp_qoriq->regs.ctrl_regs = base + FMAN_CTRL_REGS_OFFSET;
|
ptp_qoriq->regs.ctrl_regs = base + FMAN_CTRL_REGS_OFFSET;
|
||||||
ptp_qoriq->regs.alarm_regs = base + FMAN_ALARM_REGS_OFFSET;
|
ptp_qoriq->regs.alarm_regs = base + FMAN_ALARM_REGS_OFFSET;
|
||||||
|
@ -558,6 +515,7 @@ static int ptp_qoriq_probe(struct platform_device *dev)
|
||||||
(ptp_qoriq->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT |
|
(ptp_qoriq->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT |
|
||||||
(ptp_qoriq->cksel & CKSEL_MASK) << CKSEL_SHIFT;
|
(ptp_qoriq->cksel & CKSEL_MASK) << CKSEL_SHIFT;
|
||||||
|
|
||||||
|
spin_lock_init(&ptp_qoriq->lock);
|
||||||
spin_lock_irqsave(&ptp_qoriq->lock, flags);
|
spin_lock_irqsave(&ptp_qoriq->lock, flags);
|
||||||
|
|
||||||
regs = &ptp_qoriq->regs;
|
regs = &ptp_qoriq->regs;
|
||||||
|
@ -571,16 +529,77 @@ static int ptp_qoriq_probe(struct platform_device *dev)
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
|
spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
|
||||||
|
|
||||||
ptp_qoriq->clock = ptp_clock_register(&ptp_qoriq->caps, &dev->dev);
|
ptp_qoriq->clock = ptp_clock_register(&ptp_qoriq->caps, ptp_qoriq->dev);
|
||||||
if (IS_ERR(ptp_qoriq->clock)) {
|
if (IS_ERR(ptp_qoriq->clock))
|
||||||
err = PTR_ERR(ptp_qoriq->clock);
|
return PTR_ERR(ptp_qoriq->clock);
|
||||||
goto no_clock;
|
|
||||||
}
|
|
||||||
ptp_qoriq->phc_index = ptp_clock_index(ptp_qoriq->clock);
|
ptp_qoriq->phc_index = ptp_clock_index(ptp_qoriq->clock);
|
||||||
|
|
||||||
ptp_qoriq_create_debugfs(ptp_qoriq);
|
ptp_qoriq_create_debugfs(ptp_qoriq);
|
||||||
platform_set_drvdata(dev, ptp_qoriq);
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ptp_qoriq_init);
|
||||||
|
|
||||||
|
void ptp_qoriq_free(struct ptp_qoriq *ptp_qoriq)
|
||||||
|
{
|
||||||
|
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
|
||||||
|
|
||||||
|
qoriq_write(®s->ctrl_regs->tmr_temask, 0);
|
||||||
|
qoriq_write(®s->ctrl_regs->tmr_ctrl, 0);
|
||||||
|
|
||||||
|
ptp_qoriq_remove_debugfs(ptp_qoriq);
|
||||||
|
ptp_clock_unregister(ptp_qoriq->clock);
|
||||||
|
iounmap(ptp_qoriq->base);
|
||||||
|
free_irq(ptp_qoriq->irq, ptp_qoriq);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ptp_qoriq_free);
|
||||||
|
|
||||||
|
static int ptp_qoriq_probe(struct platform_device *dev)
|
||||||
|
{
|
||||||
|
struct ptp_qoriq *ptp_qoriq;
|
||||||
|
int err = -ENOMEM;
|
||||||
|
void __iomem *base;
|
||||||
|
|
||||||
|
ptp_qoriq = kzalloc(sizeof(*ptp_qoriq), GFP_KERNEL);
|
||||||
|
if (!ptp_qoriq)
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
ptp_qoriq->dev = &dev->dev;
|
||||||
|
|
||||||
|
err = -ENODEV;
|
||||||
|
|
||||||
|
ptp_qoriq->irq = platform_get_irq(dev, 0);
|
||||||
|
if (ptp_qoriq->irq < 0) {
|
||||||
|
pr_err("irq not in device tree\n");
|
||||||
|
goto no_node;
|
||||||
|
}
|
||||||
|
if (request_irq(ptp_qoriq->irq, ptp_qoriq_isr, IRQF_SHARED,
|
||||||
|
DRIVER, ptp_qoriq)) {
|
||||||
|
pr_err("request_irq failed\n");
|
||||||
|
goto no_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptp_qoriq->rsrc = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||||
|
if (!ptp_qoriq->rsrc) {
|
||||||
|
pr_err("no resource\n");
|
||||||
|
goto no_resource;
|
||||||
|
}
|
||||||
|
if (request_resource(&iomem_resource, ptp_qoriq->rsrc)) {
|
||||||
|
pr_err("resource busy\n");
|
||||||
|
goto no_resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
base = ioremap(ptp_qoriq->rsrc->start,
|
||||||
|
resource_size(ptp_qoriq->rsrc));
|
||||||
|
if (!base) {
|
||||||
|
pr_err("ioremap ptp registers failed\n");
|
||||||
|
goto no_ioremap;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ptp_qoriq_init(ptp_qoriq, base, ptp_qoriq_caps);
|
||||||
|
if (err)
|
||||||
|
goto no_clock;
|
||||||
|
|
||||||
|
platform_set_drvdata(dev, ptp_qoriq);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
no_clock:
|
no_clock:
|
||||||
|
@ -589,7 +608,6 @@ no_ioremap:
|
||||||
release_resource(ptp_qoriq->rsrc);
|
release_resource(ptp_qoriq->rsrc);
|
||||||
no_resource:
|
no_resource:
|
||||||
free_irq(ptp_qoriq->irq, ptp_qoriq);
|
free_irq(ptp_qoriq->irq, ptp_qoriq);
|
||||||
no_config:
|
|
||||||
no_node:
|
no_node:
|
||||||
kfree(ptp_qoriq);
|
kfree(ptp_qoriq);
|
||||||
no_memory:
|
no_memory:
|
||||||
|
@ -599,18 +617,10 @@ no_memory:
|
||||||
static int ptp_qoriq_remove(struct platform_device *dev)
|
static int ptp_qoriq_remove(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
struct ptp_qoriq *ptp_qoriq = platform_get_drvdata(dev);
|
struct ptp_qoriq *ptp_qoriq = platform_get_drvdata(dev);
|
||||||
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
|
|
||||||
|
|
||||||
qoriq_write(®s->ctrl_regs->tmr_temask, 0);
|
ptp_qoriq_free(ptp_qoriq);
|
||||||
qoriq_write(®s->ctrl_regs->tmr_ctrl, 0);
|
|
||||||
|
|
||||||
ptp_qoriq_remove_debugfs(ptp_qoriq);
|
|
||||||
ptp_clock_unregister(ptp_qoriq->clock);
|
|
||||||
iounmap(ptp_qoriq->base);
|
|
||||||
release_resource(ptp_qoriq->rsrc);
|
release_resource(ptp_qoriq->rsrc);
|
||||||
free_irq(ptp_qoriq->irq, ptp_qoriq);
|
|
||||||
kfree(ptp_qoriq);
|
kfree(ptp_qoriq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,9 @@ static inline void qoriq_write(unsigned __iomem *addr, u32 val)
|
||||||
}
|
}
|
||||||
|
|
||||||
irqreturn_t ptp_qoriq_isr(int irq, void *priv);
|
irqreturn_t ptp_qoriq_isr(int irq, void *priv);
|
||||||
|
int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
|
||||||
|
const struct ptp_clock_info caps);
|
||||||
|
void ptp_qoriq_free(struct ptp_qoriq *ptp_qoriq);
|
||||||
int ptp_qoriq_adjfine(struct ptp_clock_info *ptp, long scaled_ppm);
|
int ptp_qoriq_adjfine(struct ptp_clock_info *ptp, long scaled_ppm);
|
||||||
int ptp_qoriq_adjtime(struct ptp_clock_info *ptp, s64 delta);
|
int ptp_qoriq_adjtime(struct ptp_clock_info *ptp, s64 delta);
|
||||||
int ptp_qoriq_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
|
int ptp_qoriq_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
|
||||||
|
|
Loading…
Reference in New Issue