Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1319175 > unrolled thread
| Started by | Tony Lindgren <tony@atomide.com> |
|---|---|
| First post | 2016-01-27 18:40 +0100 |
| Last post | 2016-01-27 20:00 +0100 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset Tony Lindgren <tony@atomide.com> - 2016-01-27 18:40 +0100
Re: [PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset Suman Anna <s-anna@ti.com> - 2016-01-27 19:20 +0100
Re: [PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset Tony Lindgren <tony@atomide.com> - 2016-01-27 20:00 +0100
| From | Tony Lindgren <tony@atomide.com> |
|---|---|
| Date | 2016-01-27 18:40 +0100 |
| Subject | Re: [PATCH v3 3/3] pci: dra7xx: use pdata callbacks to perform reset |
| Message-ID | <qVCet-72J-1@gated-at.bofh.it> |
* Kishon Vijay Abraham I <kishon@ti.com> [160114 06:12]: > Use assert/deassert callbacks populated in the platform data to > to perform reset of PCIe. > > Use these callbacks until a reset controller driver is > is available in the kernel to reset PCIe. ... > --- a/drivers/pci/host/pci-dra7xx.c > +++ b/drivers/pci/host/pci-dra7xx.c > @@ -347,6 +404,10 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) > enum of_gpio_flags flags; > unsigned long gpio_flags; > > + ret = dra7xx_pcie_reset(pdev); > + if (ret) > + return ret; > + > dra7xx = devm_kzalloc(dev, sizeof(*dra7xx), GFP_KERNEL); > if (!dra7xx) > return -ENOMEM; With the hwmod data properly configured the reset already happens for the device by the bus driver, the hwmod code in this case? > @@ -457,6 +518,7 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev) > struct pcie_port *pp = &dra7xx->pp; > struct device *dev = &pdev->dev; > int count = dra7xx->phy_count; > + int ret; > > if (pp->irq_domain) > irq_domain_remove(pp->irq_domain); > @@ -467,6 +529,10 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev) > phy_exit(dra7xx->phy[count]); > } > > + ret = dra7xx_pcie_assert_reset(pdev); > + if (ret < 0) > + return ret; > + > return 0; > } Why do you need another reset here? Can't you just implement PM runtime in the driver and do the usual pm_runtime_put_sync followed by pm_runtime_disable? Basically I'm wondering how come we need these platform data callbacks at all. Regards, Tony
[toc] | [next] | [standalone]
| From | Suman Anna <s-anna@ti.com> |
|---|---|
| Date | 2016-01-27 19:20 +0100 |
| Message-ID | <qVCRe-7CM-67@gated-at.bofh.it> |
| In reply to | #1319175 |
Hi Tony, On 01/27/2016 11:31 AM, Tony Lindgren wrote: > * Kishon Vijay Abraham I <kishon@ti.com> [160114 06:12]: >> Use assert/deassert callbacks populated in the platform data to >> to perform reset of PCIe. >> >> Use these callbacks until a reset controller driver is >> is available in the kernel to reset PCIe. > ... > >> --- a/drivers/pci/host/pci-dra7xx.c >> +++ b/drivers/pci/host/pci-dra7xx.c >> @@ -347,6 +404,10 @@ static int __init dra7xx_pcie_probe(struct platform_device *pdev) >> enum of_gpio_flags flags; >> unsigned long gpio_flags; >> >> + ret = dra7xx_pcie_reset(pdev); >> + if (ret) >> + return ret; >> + >> dra7xx = devm_kzalloc(dev, sizeof(*dra7xx), GFP_KERNEL); >> if (!dra7xx) >> return -ENOMEM; > > With the hwmod data properly configured the reset already happens > for the device by the bus driver, the hwmod code in this case? > >> @@ -457,6 +518,7 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev) >> struct pcie_port *pp = &dra7xx->pp; >> struct device *dev = &pdev->dev; >> int count = dra7xx->phy_count; >> + int ret; >> >> if (pp->irq_domain) >> irq_domain_remove(pp->irq_domain); >> @@ -467,6 +529,10 @@ static int __exit dra7xx_pcie_remove(struct platform_device *pdev) >> phy_exit(dra7xx->phy[count]); >> } >> >> + ret = dra7xx_pcie_assert_reset(pdev); >> + if (ret < 0) >> + return ret; >> + >> return 0; >> } > > Why do you need another reset here? Can't you just implement PM runtime > in the driver and do the usual pm_runtime_put_sync followed by > pm_runtime_disable? The omap_hwmod_enable/disable code does not deal with hardresets (PRCM reset lines) and so the pm_runtime_get_sync/put_sync only end up dealing with clocks, and we need to invoke the reset functions separately. Modules with softresets in SYSCONFIG are ok, as they are dealt with properly. > Basically I'm wondering how come we need these platform data callbacks > at all. The hardresets are controlled through the omap_device_assert(deassert)_hardreset functions, and since these are limited to mach-omap2, we are invoking them through platform data callbacks. regards Suman
[toc] | [prev] | [next] | [standalone]
| From | Tony Lindgren <tony@atomide.com> |
|---|---|
| Date | 2016-01-27 20:00 +0100 |
| Message-ID | <qVDtU-7VF-11@gated-at.bofh.it> |
| In reply to | #1319226 |
* Suman Anna <s-anna@ti.com> [160127 10:17]:
> On 01/27/2016 11:31 AM, Tony Lindgren wrote:
> > Why do you need another reset here? Can't you just implement PM runtime
> > in the driver and do the usual pm_runtime_put_sync followed by
> > pm_runtime_disable?
>
> The omap_hwmod_enable/disable code does not deal with hardresets (PRCM
> reset lines) and so the pm_runtime_get_sync/put_sync only end up dealing
> with clocks, and we need to invoke the reset functions separately.
> Modules with softresets in SYSCONFIG are ok, as they are dealt with
> properly.
Hmm _reset() in omap_hwmod.c has this to call _assert_hardreset:
if (oh->class->reset) {
r = oh->class->reset(oh);
} else {
if (oh->rst_lines_cnt > 0) {
for (i = 0; i < oh->rst_lines_cnt; i++)
_assert_hardreset(oh, oh->rst_lines[i].name);
return 0;
} else {
r = _ocp_softreset(oh);
if (r == -ENOENT)
r = 0;
}
}
Care to explain what exactly the problem with the hwmod code not doing
the reset on init?
And why do you need to do another reset in dra7xx_pcie_remove()?
> > Basically I'm wondering how come we need these platform data callbacks
> > at all.
>
> The hardresets are controlled through the
> omap_device_assert(deassert)_hardreset functions, and since these are
> limited to mach-omap2, we are invoking them through platform data callbacks.
Right.. But I'm wondering about the why you need to do this in the
driver at all part :)
Regards,
Tony
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web