/*
 * Google LWIS PHY Interface
 *
 * Copyright (c) 2018 Google, LLC
 *
 * 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.
 */

#ifndef LWIS_PHY_H_
#define LWIS_PHY_H_

#include <linux/phy/phy.h>

struct lwis_phy {
	struct phy *phy;
	char *name;
};

struct lwis_phy_list {
	struct lwis_phy *phy;
	int count;
};

/*
 *  lwis_phy_list_alloc: Allocate an instance of the lwis_phy_list
 *  and initialize the data structures according to the number of PHYs
 *  specified.
 *  NOTE: This does not register the PHY structs.
 */
struct lwis_phy_list *lwis_phy_list_alloc(int count);

/*
 *  lwis_phy_list_free: Deallocate the lwis_phy_list structure.
 */
void lwis_phy_list_free(struct lwis_phy_list *list);

/*
 *  lwis_phy_get: Register the PHY by name.
 *  Returns: index number (>= 0) if success, -ve if error
 */
int lwis_phy_get(struct lwis_phy_list *list, char *name, struct device *dev);

/*
 *  lwis_phy_put_by_idx: Unregister the PHY by index.
 *  Returns: 0 if success, -ve if error
 */
int lwis_phy_put_by_idx(struct lwis_phy_list *list, int index, struct device *dev);

/*
 *  lwis_phy_put_by_name: Unregister the PHY by name.
 *  Returns: 0 if success, -ve if error
 */
int lwis_phy_put_by_name(struct lwis_phy_list *list, char *name, struct device *dev);

/*
 *  lwis_phy_set_power_by_idx: Turn power on/off for a specific PHY by index.
 *  Returns: 0 if success, -ve if error
 */
int lwis_phy_set_power_by_idx(struct lwis_phy_list *list, int index, bool power_on);

/*
 *  lwis_phy_set_power_by_name: Turn power on/off for a specific PHY by name.
 *  Returns: 0 if success, -ve if error
 */
int lwis_phy_set_power_by_name(struct lwis_phy_list *list, char *name, bool power_on);

/*
 *  lwis_phy_set_power_all: Turn power on/off for all PHYs in list.
 *  Returns: 0 if success, -ve if error
 */
int lwis_phy_set_power_all(struct lwis_phy_list *list, bool power_on);

/*
 *  lwis_phy_print: Debug function to print all the PHYs in the
 *  supplied list.
 */
void lwis_phy_print(struct lwis_phy_list *list);

#endif /* LWIS_PHY_H_ */
