[PATCH v2 3/6] DRIVERS: ATA: SATA PHY utility framework

Vasanth Ananthan vasanthananthan at gmail.com
Fri Nov 23 03:50:55 EST 2012


Hi,

Missed to include Ben, for I2C patch, including him and copying others.

Thanks,
Vasanth.

On Tue, Oct 30, 2012 at 9:31 PM, Vasanth Ananthan
<vasanthananthan at gmail.com> wrote:
> This patch adds SATA PHY utility framework APIs. The framework acts as an
> interface between the SATA device and the PHY device. The SATA PHY device
> registers itself with the framework through the APIs provided and the SATA
> device finds and requests for an appropriate PHY device.
>
> Signed-off-by: Vasanth Ananthan <vasanth.a at samsung.com>
> ---
>  drivers/ata/Kconfig    |   10 +++++
>  drivers/ata/Makefile   |    1 +
>  drivers/ata/sata_phy.c |  104 ++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/ata/sata_phy.h |   44 ++++++++++++++++++++
>  4 files changed, 159 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/ata/sata_phy.c
>  create mode 100644 drivers/ata/sata_phy.h
>
> diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
> index e08d322..e3a2972 100644
> --- a/drivers/ata/Kconfig
> +++ b/drivers/ata/Kconfig
> @@ -83,6 +83,16 @@ config SATA_AHCI_PLATFORM
>
>           If unsure, say N.
>
> +config SATA_PHY
> +       bool "SATA PHY Framework"
> +       default n
> +       help
> +         This option enables the SATA PHY utility framework APIs.
> +         The framework acts as an interface between the SATA device
> +         and the PHY device. The SATA PHY device registers itself
> +         with the framework through the APIs provided and the SATA
> +         device finds and requests for an appropriate PHY device.
> +
>  config SATA_FSL
>         tristate "Freescale 3.0Gbps SATA support"
>         depends on FSL_SOC
> diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
> index 9329daf..3d219a9 100644
> --- a/drivers/ata/Makefile
> +++ b/drivers/ata/Makefile
> @@ -10,6 +10,7 @@ obj-$(CONFIG_SATA_INIC162X)   += sata_inic162x.o
>  obj-$(CONFIG_SATA_SIL24)       += sata_sil24.o
>  obj-$(CONFIG_SATA_DWC)         += sata_dwc_460ex.o
>  obj-$(CONFIG_SATA_HIGHBANK)    += sata_highbank.o libahci.o
> +obj-$(CONFIG_SATA_PHY)         += sata_phy.o
>
>  # SFF w/ custom DMA
>  obj-$(CONFIG_PDC_ADMA)         += pdc_adma.o
> diff --git a/drivers/ata/sata_phy.c b/drivers/ata/sata_phy.c
> new file mode 100644
> index 0000000..e5631a9
> --- /dev/null
> +++ b/drivers/ata/sata_phy.c
> @@ -0,0 +1,104 @@
> +/*
> + * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
> + *              http://www.samsung.com
> + *
> + * EXYNOS - SATA utility framework.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> +*/
> +
> +#include <linux/kernel.h>
> +#include <linux/export.h>
> +#include <linux/err.h>
> +#include <linux/device.h>
> +#include <linux/slab.h>
> +#include <linux/list.h>
> +#include "sata_phy.h"
> +
> +static LIST_HEAD(phy_list);
> +static DEFINE_SPINLOCK(phy_lock);
> +
> +struct sata_phy *sata_get_phy(enum sata_phy_type type)
> +{
> +       struct sata_phy *x = NULL;
> +       unsigned long flag;
> +
> +       if (list_empty(&phy_list))
> +               return x;
> +
> +       spin_lock_irqsave(&phy_lock, flag);
> +
> +       list_for_each_entry(x, &phy_list, head) {
> +               if (x->type == type) {
> +                       get_device(x->dev);
> +                       break;
> +               }
> +       }
> +
> +       spin_unlock_irqrestore(&phy_lock, flag);
> +       return x;
> +}
> +EXPORT_SYMBOL(sata_get_phy);
> +
> +int sata_add_phy(struct sata_phy *phy, enum sata_phy_type type)
> +{
> +       unsigned long flag;
> +       unsigned int ret = -EINVAL;
> +       struct sata_phy *x;
> +
> +       spin_lock_irqsave(&phy_lock, flag);
> +
> +       if (!phy)
> +               return ret;
> +
> +       list_for_each_entry(x, &phy_list, head) {
> +               if (x->type == type) {
> +                       dev_err(phy->dev, "transceiver type already exists\n");
> +                       goto out;
> +               }
> +       }
> +       phy->type = type;
> +       list_add_tail(&phy->head, &phy_list);
> +       ret = 0;
> +
> + out:
> +       spin_unlock_irqrestore(&phy_lock, flag);
> +       return ret;
> +}
> +EXPORT_SYMBOL(sata_add_phy);
> +
> +void sata_remove_phy(struct sata_phy *phy)
> +{
> +       unsigned long flag;
> +       struct sata_phy *x;
> +
> +       spin_lock_irqsave(&phy_lock, flag);
> +
> +       if (!phy)
> +               return;
> +
> +       list_for_each_entry(x, &phy_list, head) {
> +               if (x->type == phy->type)
> +                       list_del(&phy->head);
> +       }
> +
> +       spin_unlock_irqrestore(&phy_lock, flag);
> +}
> +EXPORT_SYMBOL(sata_remove_phy);
> +
> +void sata_put_phy(struct sata_phy *phy)
> +{
> +       unsigned long flag;
> +
> +       spin_lock_irqsave(&phy_lock, flag);
> +
> +       if (!phy)
> +               return;
> +
> +       put_device(phy->dev);
> +       spin_unlock_irqrestore(&phy_lock, flag);
> +
> +}
> +EXPORT_SYMBOL(sata_put_phy);
> diff --git a/drivers/ata/sata_phy.h b/drivers/ata/sata_phy.h
> new file mode 100644
> index 0000000..dc38683
> --- /dev/null
> +++ b/drivers/ata/sata_phy.h
> @@ -0,0 +1,44 @@
> +/*
> + * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
> + *              http://www.samsung.com
> + *
> + * EXYNOS - SATA utility framework definitions.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> +*/
> +
> +enum sata_phy_type {
> +       SATA_PHY_GENERATION1,
> +       SATA_PHY_GENERATION2,
> +       SATA_PHY_GENERATION3,
> +};
> +
> +struct sata_phy {
> +       int (*init) (struct sata_phy *);
> +       int (*shutdown) (struct sata_phy *);
> +       struct device *dev;
> +       void *priv_data;
> +       enum sata_phy_type type;
> +       struct list_head head;
> +};
> +
> +static inline int sata_init_phy(struct sata_phy *x)
> +{
> +       if (x && x->init)
> +               return x->init(x);
> +
> +       return -EINVAL;
> +}
> +
> +static inline void sata_shutdown_phy(struct sata_phy *x)
> +{
> +       if (x && x->shutdown)
> +               x->shutdown(x);
> +}
> +
> +struct sata_phy *sata_get_phy(enum sata_phy_type);
> +int sata_add_phy(struct sata_phy *, enum sata_phy_type);
> +void sata_remove_phy(struct sata_phy *);
> +void sata_put_phy(struct sata_phy *);
> --
> 1.7.4.1
>



-- 
Regards,

Vasanth K A



More information about the linux-arm-kernel mailing list