@@ -17,6 +17,8 @@
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
+
+#include <linux/clk.h>
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/delay.h>
@@ -926,12 +928,33 @@ void fsl_pci_assign_primary(void)
static int fsl_pci_probe(struct platform_device *pdev)
{
+ struct clk *clk;
int ret;
struct device_node *node;
#ifdef CONFIG_SWIOTLB
struct pci_controller *hose;
#endif
+ /*
+ * clock lookup is non-fatal since the driver is shared among
+ * platforms and not all of them provide clocks specs in their
+ * device tree, but failure to enable a specified clock is
+ * considered fatal
+ */
+ clk = devm_clk_get(&pdev->dev, "per");
+ if (!IS_ERR(clk)) {
+ ret = clk_prepare_enable(clk);
+ if (ret) {
+ dev_err(dev, "Could not enable peripheral clock\n");
+ devm_clk_put(&pdev->dev, clk);
+ return ret;
+ }
+ /*
+ * TODO where to store the 'clk' reference? there appears
+ * to be no remove() routine which undoes what probe() does
+ */
+ }
+
node = pdev->dev.of_node;
ret = fsl_add_bridge(pdev, fsl_pci_primary == node);
make the Freescale PCI driver get, prepare and enable the PCI clock during probe() clock lookup is non-fatal as not all platforms may provide clock specs in their device tree, but failure to enable specified clocks are fatal the driver appears to not have a remove() routine, so no reference to the clock is kept during use, and the clock isn't released (the devm approach will put the clock, but it won't get disabled or unprepared) Signed-off-by: Gerhard Sittig <gsi@denx.de> --- arch/powerpc/sysdev/fsl_pci.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)