// SPDX-License-Identifier: GPL-2.0-or-later /* * AHCI SATA platform library * * Copyright 2004-2005 Red Hat, Inc. * Jeff Garzik <[email protected]> * Copyright 2010 MontaVista Software, LLC. * Anton Vorontsov <[email protected]> */ #include <linux/clk.h> #include <linux/kernel.h> #include <linux/gfp.h> #include <linux/module.h> #include <linux/pm.h> #include <linux/interrupt.h> #include <linux/device.h> #include <linux/platform_device.h> #include <linux/libata.h> #include <linux/ahci_platform.h> #include <linux/phy/phy.h> #include <linux/pm_runtime.h> #include <linux/of.h> #include <linux/of_platform.h> #include <linux/reset.h> #include "ahci.h" static void ahci_host_stop(struct ata_host *host); struct ata_port_operations ahci_platform_ops = …; EXPORT_SYMBOL_GPL(…); /** * ahci_platform_enable_phys - Enable PHYs * @hpriv: host private area to store config values * * This function enables all the PHYs found in hpriv->phys, if any. * If a PHY fails to be enabled, it disables all the PHYs already * enabled in reverse order and returns an error. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_enable_phys(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_disable_phys - Disable PHYs * @hpriv: host private area to store config values * * This function disables all PHYs found in hpriv->phys. */ void ahci_platform_disable_phys(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_find_clk - Find platform clock * @hpriv: host private area to store config values * @con_id: clock connection ID * * This function returns a pointer to the clock descriptor of the clock with * the passed ID. * * RETURNS: * Pointer to the clock descriptor on success otherwise NULL */ struct clk *ahci_platform_find_clk(struct ahci_host_priv *hpriv, const char *con_id) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_enable_clks - Enable platform clocks * @hpriv: host private area to store config values * * This function enables all the clks found for the AHCI device. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_enable_clks(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_disable_clks - Disable platform clocks * @hpriv: host private area to store config values * * This function disables all the clocks enabled before * (bulk-clocks-disable function is supposed to do that in reverse * from the enabling procedure order). */ void ahci_platform_disable_clks(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_deassert_rsts - Deassert/trigger platform resets * @hpriv: host private area to store config values * * This function deasserts or triggers all the reset lines found for * the AHCI device. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_deassert_rsts(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_assert_rsts - Assert/rearm platform resets * @hpriv: host private area to store config values * * This function asserts or rearms (for self-deasserting resets) all * the reset controls found for the AHCI device. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_assert_rsts(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_enable_regulators - Enable regulators * @hpriv: host private area to store config values * * This function enables all the regulators found in controller and * hpriv->target_pwrs, if any. If a regulator fails to be enabled, it * disables all the regulators already enabled in reverse order and * returns an error. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_disable_regulators - Disable regulators * @hpriv: host private area to store config values * * This function disables all regulators found in hpriv->target_pwrs and * AHCI controller. */ void ahci_platform_disable_regulators(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_enable_resources - Enable platform resources * @hpriv: host private area to store config values * * This function enables all ahci_platform managed resources in the * following order: * 1) Regulator * 2) Clocks (through ahci_platform_enable_clks) * 3) Resets * 4) Phys * * If resource enabling fails at any point the previous enabled resources * are disabled in reverse order. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_enable_resources(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_disable_resources - Disable platform resources * @hpriv: host private area to store config values * * This function disables all ahci_platform managed resources in the * following order: * 1) Phys * 2) Resets * 3) Clocks (through ahci_platform_disable_clks) * 4) Regulator */ void ahci_platform_disable_resources(struct ahci_host_priv *hpriv) { … } EXPORT_SYMBOL_GPL(…); static void ahci_platform_put_resources(struct device *dev, void *res) { … } static int ahci_platform_get_phy(struct ahci_host_priv *hpriv, u32 port, struct device *dev, struct device_node *node) { … } static int ahci_platform_get_regulator(struct ahci_host_priv *hpriv, u32 port, struct device *dev) { … } static int ahci_platform_get_firmware(struct ahci_host_priv *hpriv, struct device *dev) { … } /** * ahci_platform_get_resources - Get platform resources * @pdev: platform device to get resources for * @flags: bitmap representing the resource to get * * This function allocates an ahci_host_priv struct, and gets the following * resources, storing a reference to them inside the returned struct: * * 1) mmio registers (IORESOURCE_MEM 0, mandatory) * 2) regulator for controlling the targets power (optional) * regulator for controlling the AHCI controller (optional) * 3) all clocks specified in the devicetree node, or a single * clock for non-OF platforms (optional) * 4) resets, if flags has AHCI_PLATFORM_GET_RESETS (optional) * 5) phys (optional) * * RETURNS: * The allocated ahci_host_priv on success, otherwise an ERR_PTR value */ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev, unsigned int flags) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_init_host - Bring up an ahci-platform host * @pdev: platform device pointer for the host * @hpriv: ahci-host private data for the host * @pi_template: template for the ata_port_info to use * @sht: scsi_host_template to use when registering * * This function does all the usual steps needed to bring up an * ahci-platform host, note any necessary resources (ie clks, phys, etc.) * must be initialized / enabled before calling this. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_init_host(struct platform_device *pdev, struct ahci_host_priv *hpriv, const struct ata_port_info *pi_template, const struct scsi_host_template *sht) { … } EXPORT_SYMBOL_GPL(…); static void ahci_host_stop(struct ata_host *host) { … } /** * ahci_platform_shutdown - Disable interrupts and stop DMA for host ports * @pdev: platform device pointer for the host * * This function is called during system shutdown and performs the minimal * deconfiguration required to ensure that an ahci_platform host cannot * corrupt or otherwise interfere with a new kernel being started with kexec. */ void ahci_platform_shutdown(struct platform_device *pdev) { … } EXPORT_SYMBOL_GPL(…); #ifdef CONFIG_PM_SLEEP /** * ahci_platform_suspend_host - Suspend an ahci-platform host * @dev: device pointer for the host * * This function does all the usual steps needed to suspend an * ahci-platform host, note any necessary resources (ie clks, phys, etc.) * must be disabled after calling this. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_suspend_host(struct device *dev) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_resume_host - Resume an ahci-platform host * @dev: device pointer for the host * * This function does all the usual steps needed to resume an ahci-platform * host, note any necessary resources (ie clks, phys, etc.) must be * initialized / enabled before calling this. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_resume_host(struct device *dev) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_suspend - Suspend an ahci-platform device * @dev: the platform device to suspend * * This function suspends the host associated with the device, followed by * disabling all the resources of the device. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_suspend(struct device *dev) { … } EXPORT_SYMBOL_GPL(…); /** * ahci_platform_resume - Resume an ahci-platform device * @dev: the platform device to resume * * This function enables all the resources of the device followed by * resuming the host associated with the device. * * RETURNS: * 0 on success otherwise a negative error code */ int ahci_platform_resume(struct device *dev) { … } EXPORT_SYMBOL_GPL(…); #endif MODULE_DESCRIPTION(…) …; MODULE_AUTHOR(…) …; MODULE_LICENSE(…) …;