svn commit: r340845 - in head/sys: conf dev/extres/phy

Emmanuel Vadot manu at FreeBSD.org
Fri Nov 23 19:43:20 UTC 2018


Author: manu
Date: Fri Nov 23 19:43:18 2018
New Revision: 340845
URL: https://svnweb.freebsd.org/changeset/base/340845

Log:
  Derive PHY class to new one specialized for USB PHY functions.
  
  Submitted by:	mmel

Added:
  head/sys/dev/extres/phy/phy_internal.h   (contents, props changed)
  head/sys/dev/extres/phy/phy_usb.c   (contents, props changed)
  head/sys/dev/extres/phy/phy_usb.h   (contents, props changed)
  head/sys/dev/extres/phy/phynode_usb_if.m   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/dev/extres/phy/phy.c

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Fri Nov 23 18:27:16 2018	(r340844)
+++ head/sys/conf/files	Fri Nov 23 19:43:18 2018	(r340845)
@@ -1734,6 +1734,8 @@ dev/extres/clk/clk_mux.c	optional ext_resources clk fd
 dev/extres/phy/phy.c		optional ext_resources phy fdt
 dev/extres/phy/phydev_if.m	optional ext_resources phy fdt
 dev/extres/phy/phynode_if.m	optional ext_resources phy fdt
+dev/extres/phy/phy_usb.c	optional ext_resources phy fdt
+dev/extres/phy/phynode_usb_if.m	optional ext_resources phy fdt
 dev/extres/hwreset/hwreset.c	optional ext_resources hwreset fdt
 dev/extres/hwreset/hwreset_if.m	optional ext_resources hwreset fdt
 dev/extres/nvmem/nvmem.c	optional ext_resources nvmem fdt

Modified: head/sys/dev/extres/phy/phy.c
==============================================================================
--- head/sys/dev/extres/phy/phy.c	Fri Nov 23 18:27:16 2018	(r340844)
+++ head/sys/dev/extres/phy/phy.c	Fri Nov 23 19:43:18 2018	(r340845)
@@ -43,18 +43,12 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #include  <dev/extres/phy/phy.h>
+#include  <dev/extres/phy/phy_internal.h>
 
 #include "phydev_if.h"
 
 MALLOC_DEFINE(M_PHY, "phy", "Phy framework");
 
-/* Forward declarations. */
-struct phy;
-struct phynode;
-
-typedef TAILQ_HEAD(phynode_list, phynode) phynode_list_t;
-typedef TAILQ_HEAD(phy_list, phy) phy_list_t;
-
 /* Default phy methods. */
 static int phynode_method_init(struct phynode *phynode);
 static int phynode_method_enable(struct phynode *phynode, bool disable);
@@ -73,52 +67,9 @@ static phynode_method_t phynode_methods[] = {
 };
 DEFINE_CLASS_0(phynode, phynode_class, phynode_methods, 0);
 
-/*
- * Phy node
- */
-struct phynode {
-	KOBJ_FIELDS;
-
-	TAILQ_ENTRY(phynode)	phylist_link;	/* Global list entry */
-	phy_list_t		consumers_list;	/* Consumers list */
-
-
-	/* Details of this device. */
-	const char		*name;		/* Globally unique name */
-
-	device_t		pdev;		/* Producer device_t */
-	void			*softc;		/* Producer softc */
-	intptr_t		id;		/* Per producer unique id */
-#ifdef FDT
-	 phandle_t		ofw_node;	/* OFW node of phy */
-#endif
-	struct sx		lock;		/* Lock for this phy */
-	int			ref_cnt;	/* Reference counter */
-	int			enable_cnt;	/* Enabled counter */
-};
-
-struct phy {
-	device_t		cdev;		/* consumer device*/
-	struct phynode		*phynode;
-	TAILQ_ENTRY(phy)	link;		/* Consumers list entry */
-
-	int			enable_cnt;
-};
-
 static phynode_list_t phynode_list = TAILQ_HEAD_INITIALIZER(phynode_list);
 
-static struct sx		phynode_topo_lock;
 SX_SYSINIT(phy_topology, &phynode_topo_lock, "Phy topology lock");
-
-#define PHY_TOPO_SLOCK()	sx_slock(&phynode_topo_lock)
-#define PHY_TOPO_XLOCK()	sx_xlock(&phynode_topo_lock)
-#define PHY_TOPO_UNLOCK()	sx_unlock(&phynode_topo_lock)
-#define PHY_TOPO_ASSERT()	sx_assert(&phynode_topo_lock, SA_LOCKED)
-#define PHY_TOPO_XASSERT() 	sx_assert(&phynode_topo_lock, SA_XLOCKED)
-
-#define PHYNODE_SLOCK(_sc)	sx_slock(&((_sc)->lock))
-#define PHYNODE_XLOCK(_sc)	sx_xlock(&((_sc)->lock))
-#define PHYNODE_UNLOCK(_sc)	sx_unlock(&((_sc)->lock))
 
 /* ----------------------------------------------------------------------------
  *

Added: head/sys/dev/extres/phy/phy_internal.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/extres/phy/phy_internal.h	Fri Nov 23 19:43:18 2018	(r340845)
@@ -0,0 +1,83 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef DEV_EXTRES_PHY_INTERNAL_H
+#define DEV_EXTRES_PHY_INTERNAL_H
+
+/* Forward declarations. */
+struct phy;
+struct phynode;
+
+typedef TAILQ_HEAD(phynode_list, phynode) phynode_list_t;
+typedef TAILQ_HEAD(phy_list, phy) phy_list_t;
+
+/*
+ * Phy node
+ */
+struct phynode {
+	KOBJ_FIELDS;
+
+	TAILQ_ENTRY(phynode)	phylist_link;	/* Global list entry */
+	phy_list_t		consumers_list;	/* Consumers list */
+
+
+	/* Details of this device. */
+	const char		*name;		/* Globally unique name */
+
+	device_t		pdev;		/* Producer device_t */
+	void			*softc;		/* Producer softc */
+	intptr_t		id;		/* Per producer unique id */
+#ifdef FDT
+	 phandle_t		ofw_node;	/* OFW node of phy */
+#endif
+	struct sx		lock;		/* Lock for this phy */
+	int			ref_cnt;	/* Reference counter */
+	int			enable_cnt;	/* Enabled counter */
+};
+
+struct phy {
+	device_t		cdev;		/* consumer device*/
+	struct phynode		*phynode;
+	TAILQ_ENTRY(phy)	link;		/* Consumers list entry */
+
+	int			enable_cnt;
+};
+
+
+#define PHY_TOPO_SLOCK()	sx_slock(&phynode_topo_lock)
+#define PHY_TOPO_XLOCK()	sx_xlock(&phynode_topo_lock)
+#define PHY_TOPO_UNLOCK()	sx_unlock(&phynode_topo_lock)
+#define PHY_TOPO_ASSERT()	sx_assert(&phynode_topo_lock, SA_LOCKED)
+#define PHY_TOPO_XASSERT() 	sx_assert(&phynode_topo_lock, SA_XLOCKED)
+
+#define PHYNODE_SLOCK(_sc)	sx_slock(&((_sc)->lock))
+#define PHYNODE_XLOCK(_sc)	sx_xlock(&((_sc)->lock))
+#define PHYNODE_UNLOCK(_sc)	sx_unlock(&((_sc)->lock))
+
+struct sx		phynode_topo_lock;
+
+#endif /* DEV_EXTRES_PHY_INTERNAL_H */

Added: head/sys/dev/extres/phy/phy_usb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/extres/phy/phy_usb.c	Fri Nov 23 19:43:18 2018	(r340845)
@@ -0,0 +1,149 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/queue.h>
+#include <sys/sx.h>
+
+
+#include <dev/extres/phy/phy_usb.h>
+#include <dev/extres/phy/phy_internal.h>
+
+#include "phydev_if.h"
+
+/*
+ * USB phy controller methods.
+ */
+static phynode_usb_method_t phynode_usb_methods[] = {
+
+	PHYNODEUSBMETHOD_END
+};
+DEFINE_CLASS_1(phynode_usb, phynode_usb_class, phynode_usb_methods,
+    0, phynode_class);
+
+/*
+ * Create and initialize phy object, but do not register it.
+ */
+struct phynode *
+phynode_usb_create(device_t pdev, phynode_class_t phynode_class,
+    struct phynode_usb_init_def *def)
+
+{
+	struct phynode *phynode;
+	struct phynode_usb_sc *sc;
+
+	phynode = phynode_create(pdev, phynode_class, &def->phynode_init_def);
+	if (phynode == NULL)
+		return (NULL);
+	sc = phynode_get_softc(phynode);
+	sc->std_param = def->std_param;
+	return (phynode);
+}
+
+struct phynode
+*phynode_usb_register(struct phynode *phynode)
+{
+
+	return (phynode_register(phynode));
+}
+
+/* --------------------------------------------------------------------------
+ *
+ * Real consumers executive
+ *
+ */
+
+/*
+ * Set USB phy mode. (PHY_USB_MODE_*)
+ */
+int
+phynode_usb_set_mode(struct phynode *phynode, int usb_mode)
+{
+	int rv;
+
+	PHY_TOPO_ASSERT();
+
+	PHYNODE_XLOCK(phynode);
+	rv = PHYNODE_USB_SET_MODE(phynode, usb_mode);
+	PHYNODE_UNLOCK(phynode);
+	return (rv);
+}
+
+/*
+ * Get USB phy mode. (PHY_USB_MODE_*)
+ */
+int
+phynode_usb_get_mode(struct phynode *phynode, int *usb_mode)
+{
+	int rv;
+
+	PHY_TOPO_ASSERT();
+
+	PHYNODE_XLOCK(phynode);
+	rv = PHYNODE_USB_GET_MODE(phynode, usb_mode);
+	PHYNODE_UNLOCK(phynode);
+	return (rv);
+}
+
+ /* --------------------------------------------------------------------------
+ *
+ * USB phy consumers interface.
+ *
+ */
+int phy_usb_set_mode(phy_t phy, int usb_mode)
+{
+	int rv;
+	struct phynode *phynode;
+
+	phynode = phy->phynode;
+	KASSERT(phynode->ref_cnt > 0,
+	   ("Attempt to access unreferenced phy.\n"));
+
+	PHY_TOPO_SLOCK();
+	rv = phynode_usb_set_mode(phynode, usb_mode);
+	PHY_TOPO_UNLOCK();
+	return (rv);
+}
+
+int phy_usb_get_mode(phy_t phy, int *usb_mode)
+{
+	int rv;
+	struct phynode *phynode;
+
+	phynode = phy->phynode;
+	KASSERT(phynode->ref_cnt > 0,
+	   ("Attempt to access unreferenced phy.\n"));
+
+	PHY_TOPO_SLOCK();
+	rv = phynode_usb_get_mode(phynode, usb_mode);
+	PHY_TOPO_UNLOCK();
+	return (rv);
+}

Added: head/sys/dev/extres/phy/phy_usb.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/extres/phy/phy_usb.h	Fri Nov 23 19:43:18 2018	(r340845)
@@ -0,0 +1,85 @@
+/*-
+ * Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DEV_EXTRES_PHY_USB_H_
+#define _DEV_EXTRES_PHY_USB_H_
+
+#include <dev/extres/phy/phy.h>
+#include "phynode_usb_if.h"
+
+#define	PHY_USB_MODE_UNKNOWN	0
+#define	PHY_USB_MODE_HOST	1
+#define	PHY_USB_MODE_OTG	2
+#define	PHY_USB_MODE_DEVICE	3
+
+/* Standard USB phy parameters. */
+struct phynode_usb_std_param {
+	int	usb_mode;
+};
+
+struct phynode_usb_sc {
+   struct phynode_usb_std_param		std_param;
+};
+
+/* Initialization parameters. */
+struct phynode_usb_init_def {
+	struct phynode_init_def		phynode_init_def;
+	struct phynode_usb_std_param	std_param; /* Standard parameters */
+};
+
+
+/*
+ * Shorthands for constructing method tables.
+ */
+#define	PHYNODEUSBMETHOD	KOBJMETHOD
+#define	PHYNODEUSBMETHOD_END	KOBJMETHOD_END
+#define phynode_usb_method_t	kobj_method_t
+#define phynode_usb_class_t	kobj_class_t
+DECLARE_CLASS(phynode_usb_class);
+
+struct phynode *phynode_usb_create(device_t pdev, phynode_class_t phynode_class,
+    struct phynode_usb_init_def *def);
+struct phynode *phynode_usb_register(struct phynode *phynode);
+
+#if 0
+/* XXX to be implemented */
+#ifdef FDT
+int phynode_usb_parse_ofw_stdparam(device_t dev, phandle_t node,
+    struct phynode_usb_init_def *def);
+#endif
+#endif
+
+/* Phynode functions. */
+int phynode_usb_set_mode(struct phynode *phynode, int usb_mode);
+int phynode_usb_get_mode(struct phynode *phynode, int *usb_mode);
+
+/* Consumer functions. */
+int phy_usb_set_mode(phy_t phy, int usb_mode);
+int phy_usb_get_mode(phy_t phy, int *usb_mode);
+
+#endif /*_DEV_EXTRES_PHY_USB_H_*/

Added: head/sys/dev/extres/phy/phynode_usb_if.m
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/extres/phy/phynode_usb_if.m	Fri Nov 23 19:43:18 2018	(r340845)
@@ -0,0 +1,51 @@
+#-
+# Copyright 2018 Michal Meloun <mmel at FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+INTERFACE phynode_usb;
+
+HEADER {
+	struct phynode;
+}
+
+#
+# Set USB mode for phy
+# Returns 0 on success or a standard errno value.
+#
+METHOD int set_mode {
+	struct phynode	*phynode;
+	int		usb_mode;	/* PHY_USB_MODE_* */
+};
+
+#
+# Get USB mode
+# Returns 0 on success or a standard errno value.
+#
+METHOD int get_mode {
+	struct phynode	*phynode;
+	int		*usb_mode;	/* PHY_USB_MODE_* */
+};


More information about the svn-src-all mailing list