From: Tomasz Figa <t.figa@samsung.com>
To: linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 01/15] drivers: phy: add generic PHY framework
Date: Tue, 23 Jul 2013 16:50:29 +0000 [thread overview]
Message-ID: <1446965.6APW5ZgLBW@amdc1227> (raw)
In-Reply-To: <20130723161846.GD2486@kroah.com>
On Tuesday 23 of July 2013 09:18:46 Greg KH wrote:
> On Tue, Jul 23, 2013 at 08:48:24PM +0530, Kishon Vijay Abraham I wrote:
> > Hi,
> >
> > On Tuesday 23 July 2013 08:07 PM, Alan Stern wrote:
> > > On Tue, 23 Jul 2013, Tomasz Figa wrote:
> > >> On Tuesday 23 of July 2013 09:29:32 Tomasz Figa wrote:
> > >>> Hi Alan,
> > >
> > > Thanks for helping to clarify the issues here.
> > >
> > >>>> Okay. Are PHYs _always_ platform devices?
> > >>>
> > >>> They can be i2c, spi or any other device types as well.
> > >
> > > In those other cases, presumably there is no platform data associated
> > > with the PHY since it isn't a platform device. Then how does the
> > > kernel know which controller is attached to the PHY? Is this spelled
> > > out in platform data associated with the PHY's i2c/spi/whatever
> > > parent?
> >
> > Yes. I think we could use i2c_board_info for passing platform data.
> >
> > >>>>>> PHY. Currently this information is represented by name or
> > >>
> > >> ID
> > >>
> > >>>>>> strings embedded in platform data.
> > >>>>>
> > >>>>> right. It's embedded in the platform data of the controller.
> > >>>>
> > >>>> It must also be embedded in the PHY's platform data somehow.
> > >>>> Otherwise, how would the kernel know which PHY to use?
> > >>>
> > >>> By using a PHY lookup as Stephen and I suggested in our previous
> > >>> replies. Without any extra data in platform data. (I have even
> > >>> posted a
> > >>> code example.)
> > >
> > > I don't understand, because I don't know what "a PHY lookup" does.
> >
> > It is how the PHY framework finds a PHY, when the controller (say
> > USB)requests a PHY from the PHY framework.
> >
> > >>>> In this case, it doesn't matter where the platform_device
> > >>>> structures
> > >>>> are created or where the driver source code is. Let's take a
> > >>>> simple
> > >>>> example. Suppose the system design includes a PHY named "foo".
> > >>>> Then
> > >>>> the board file could contain:
> > >>>>
> > >>>> struct phy_info { ... } phy_foo;
> > >>>> EXPORT_SYMBOL_GPL(phy_foo);
> > >>>>
> > >>>> and a header file would contain:
> > >>>>
> > >>>> extern struct phy_info phy_foo;
> > >>>>
> > >>>> The PHY supplier could then call phy_create(&phy_foo), and the PHY
> > >>>> client could call phy_find(&phy_foo). Or something like that;
> > >>>> make up
> > >>>> your own structure tags and function names.
> > >>>>
> > >>>> It's still possible to have conflicts, but now two PHYs with the
> > >>>> same
> > >>>> name (or a misspelled name somewhere) will cause an error at link
> > >>>> time.
> > >>>
> > >>> This is incorrect, sorry. First of all it's a layering violation -
> > >>> you
> > >>> export random driver-specific symbols from one driver to another.
> > >>> Then
> > >
> > > No, that's not what I said. Neither the PHY driver nor the
> > > controller
> > > driver exports anything to the other. Instead, both drivers use data
> > > exported by the board file.
> >
> > I think instead we can use the same data while creating the platform
> > data of the controller and the PHY.
> > The PHY driver while creating the PHY (using PHY framework) will also
> > pass the *data* it actually got from the platform data to the
> > framework. The PHY user driver (USB), while requesting for the PHY
> > (from the PHY framework) will pass the *data* it got from its platform
> > data.
> > The PHY framework can do a comparison of the *data* pointers it has and
> > return the appropriate PHY to the controller.
> >
> > >>> imagine 4 SoCs - A, B, C, D. There are two PHY types PHY1 and PHY2
> > >>> and
> > >>> there are two types of consumer drivers (e.g. USB host
> > >>> controllers). Now
> > >>> consider following mapping:
> > >>>
> > >>> SoC PHY consumer
> > >>> A PHY1 HOST1
> > >>> B PHY1 HOST2
> > >>> C PHY2 HOST1
> > >>> D PHY2 HOST2
> > >>>
> > >>> So we have to be able to use any of the PHYs with any of the host
> > >>> drivers. This means you would have to export symbol with the same
> > >>> name
> > >>> from both PHY drivers, which obviously would not work in this case,
> > >>> because having both drivers enabled (in a multiplatform aware
> > >>> configuration) would lead to linking conflict.
> > >
> > > You're right; the scheme was too simple. Instead, the board file
> > > must
> > > export two types of data structures, one for PHYs and one for
> > > controllers. Like this:
> > >
> > > struct phy_info {
> > >
> > > /* Info for the controller attached to this PHY */
> > > struct controller_info *hinfo;
> > >
> > > };
> > >
> > > struct controller_info {
> > >
> > > /* Info for the PHY which this controller is attached to */
> > > struct phy_info *pinfo;
> > >
> > > };
> > >
> > > The board file for SoC A would contain:
> > >
> > > struct phy_info phy1 = {&host1);
> > > EXPORT_SYMBOL(phy1);
> > > struct controller_info host1 = {&phy1};
> > > EXPORT_SYMBOL(host1);
> > >
> > > The board file for SoC B would contain:
> > >
> > > struct phy_info phy1 = {&host2);
> > > EXPORT_SYMBOL(phy1);
> > > struct controller_info host2 = {&phy1};
> > > EXPORT_SYMBOL(host2);
> >
> > I meant something like this
> > struct phy_info {
> >
> > const char *name;
> >
> > };
> >
> > struct phy_platform_data {
> >
> > .
> > .
> > struct phy_info *info;
> >
> > };
> >
> > struct usb_controller_platform_data {
> >
> > .
> > .
> > struct phy_info *info;
> >
> > };
> >
> > struct phy_info phy_info;
> >
> > While creating the phy device
> >
> > struct phy_platform_data phy_data;
> > phy_data.info = &info;
> > platform_device_add_data(pdev, &phy_data, sizeof(*phy_data))
> > platform_device_add();
> >
> > While creating the controller device
> >
> > struct usb_controller_platform_data controller_data;
> > controller_data.info = &info;
> > platform_device_add_data(pdev, &controller_data,
> > sizeof(*controller_data)) platform_device_add();
> >
> > Then modify PHY framework API phy create
> >
> > phy_create((struct device *dev, const struct phy_ops *ops,
> >
> > void *priv) {//API changed to take void pointer instead of
> > label
> >
> > . //existing implementation
> > .
> > phy->priv = priv;
> >
> > }
> >
> > struct phy *phy_get(struct device *dev, const char *string, void
> > *priv) {>
> > //API changed to take an additional pointer
> >
> > phy_lookup(priv)
> >
> > }
> >
> > static struct phy *phy_lookup(void *priv) {
> >
> > .
> > .
> > if (phy->priv=priv) //instead of string comparison, we'll use
> > pointer
> >
> > return phy;
> >
> > }
> >
> > PHY driver should be like
> >
> > phy_create((dev, ops, pdata->info);
> >
> > The controller driver would do
> >
> > phy_get(dev, NULL, pdata->info);
> >
> > Now the PHY framework will check for a match of *priv* pointer and
> > return the PHY.
> >
> > I think this should be possible?
>
> Ick, no. Why can't you just pass the pointer to the phy itself? If you
> had a "priv" pointer to search from, then you could have just passed the
> original phy pointer in the first place, right?
IMHO it would be better if you provided some code example, but let's try to
check if I understood you correctly.
8><------------------------------------------------------------------------
[Board file]
static struct phy my_phy;
static struct platform_device phy_pdev = {
/* ... */
.platform_data = &my_phy;
/* ... */
};
static struct platform_device phy_pdev = {
/* ... */
.platform_data = &my_phy;
/* ... */
};
[Provider driver]
struct phy *phy = pdev->dev.platform_data;
ret = phy_create(phy);
[Consumer driver]
struct phy *phy = pdev->dev.platform_data;
ret = phy_get(&pdev->dev, phy);
------------------------------------------------------------------------><8
Is this what you mean?
> The issue is that a string "name" is not going to scale at all, as it
> requires hard-coded information that will change over time (as the
> existing clock interface is already showing.)
I fully agree that a simple, single string will not scale even in some, not
so uncommon cases, but there is already a lot of existing lookup solutions
over the kernel and so there is no point in introducing another one.
> Please just pass the real "phy" pointer around, that's what it is there
> for. Your "board binding" logic/code should be able to handle this, as
> it somehow was going to do the same thing with a "name".
It's technically correct, but quality of this solution isn't really nice,
because it's a layering violation (at least if I understood what you mean).
This is because you need to have full definition of struct phy in board file
and a structure that is used as private data in PHY core comes from
platform code.
Best regards,
Tomasz
next prev parent reply other threads:[~2013-07-23 16:50 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-18 6:58 [PATCH 00/15] PHY framework Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 01/15] drivers: phy: add generic " Kishon Vijay Abraham I
2013-07-18 7:20 ` Greg KH
2013-07-18 9:11 ` Kishon Vijay Abraham I
2013-07-18 15:49 ` Greg KH
2013-07-19 5:49 ` Kishon Vijay Abraham I
2013-07-19 5:43 ` Greg KH
2013-07-19 5:56 ` Kishon Vijay Abraham I
2013-07-19 6:29 ` Greg KH
2013-07-19 6:48 ` Kishon Vijay Abraham I
2013-07-19 15:54 ` Stephen Warren
2013-07-20 3:27 ` Kishon Vijay Abraham I
2013-07-19 23:50 ` Greg KH
2013-07-20 3:31 ` Kishon Vijay Abraham I
2013-07-20 22:00 ` Greg KH
2013-07-21 2:32 ` Alan Stern
2013-07-21 2:59 ` Greg KH
2013-07-21 10:22 ` Sascha Hauer
2013-07-21 15:48 ` Greg KH
2013-07-21 17:14 ` Sylwester Nawrocki
2013-07-21 19:22 ` Alan Stern
2013-07-22 7:37 ` Kishon Vijay Abraham I
2013-07-22 14:44 ` Alan Stern
2013-07-23 5:59 ` Kishon Vijay Abraham I
2013-07-23 7:29 ` Tomasz Figa
2013-07-23 7:55 ` Tomasz Figa
2013-07-23 14:37 ` Alan Stern
2013-07-23 14:50 ` Tomasz Figa
2013-07-23 15:30 ` Kishon Vijay Abraham I
2013-07-23 16:18 ` Greg KH
2013-07-23 16:40 ` Kishon Vijay Abraham I
2013-07-23 16:35 ` Greg KH
2013-07-23 16:50 ` Tomasz Figa [this message]
2013-07-23 17:37 ` Greg KH
2013-07-23 17:44 ` Mark Brown
2013-07-23 18:01 ` Greg KH
2013-07-23 19:31 ` Mark Brown
2013-07-23 19:44 ` Greg KH
2013-07-23 20:07 ` Tomasz Figa
2013-07-23 20:50 ` Greg KH
2013-07-23 21:05 ` Tomasz Figa
2013-07-23 21:23 ` Greg KH
2013-07-23 23:48 ` Mark Brown
2013-07-23 17:48 ` Tomasz Figa
2013-07-23 18:04 ` Greg KH
2013-07-23 20:46 ` Tomasz Figa
2013-07-23 19:36 ` Alan Stern
2013-07-23 20:20 ` Tomasz Figa
2013-07-23 20:53 ` Alan Stern
2013-07-23 21:02 ` Tomasz Figa
2013-07-23 21:14 ` Alan Stern
2013-07-23 21:31 ` Tomasz Figa
2013-07-24 18:32 ` Arnd Bergmann
[not found] ` <51F0B373.5050907@ti.com>
2013-07-25 7:54 ` Arnd Bergmann
2013-07-25 9:29 ` Sylwester Nawrocki
2013-07-25 9:29 ` Mark Brown
2013-07-25 10:16 ` Laurent Pinchart
2013-07-25 11:00 ` Arnd Bergmann
2013-07-25 11:10 ` Laurent Pinchart
2013-07-25 12:09 ` Mark Brown
2013-07-23 17:34 ` Mark Brown
2013-07-22 15:04 ` Greg KH
2013-07-23 5:46 ` Kishon Vijay Abraham I
2013-07-21 10:31 ` Tomasz Figa
2013-07-21 11:19 ` Kishon Vijay Abraham I
2013-07-21 11:12 ` Tomasz Figa
2013-07-21 15:46 ` Greg KH
2013-07-30 7:11 ` Felipe Balbi
2013-07-31 5:56 ` Kishon Vijay Abraham I
2013-07-31 6:15 ` Felipe Balbi
2013-08-13 10:56 ` Kishon Vijay Abraham I
2013-08-13 11:37 ` Tomasz Figa
2013-08-13 12:17 ` Kishon Vijay Abraham I
2013-08-13 22:19 ` Sylwester Nawrocki
2013-08-13 23:04 ` Tomasz Figa
2013-08-14 15:17 ` Kishon Vijay Abraham I
2013-08-19 5:40 ` Kishon Vijay Abraham I
2013-08-20 12:26 ` Felipe Balbi
2013-07-18 6:58 ` [PATCH 02/15] usb: phy: omap-usb2: use the new " Kishon Vijay Abraham I
2013-07-18 7:21 ` Greg KH
2013-07-18 9:12 ` Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 03/15] usb: phy: twl4030: " Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 04/15] ARM: OMAP: USB: Add phy binding information Kishon Vijay Abraham I
2013-07-18 7:02 ` Tony Lindgren
2013-07-18 6:58 ` [PATCH 05/15] ARM: dts: omap: update usb_otg_hs data Kishon Vijay Abraham I
2013-07-18 7:05 ` Tony Lindgren
2013-07-18 6:58 ` [PATCH 06/15] usb: musb: omap2430: use the new generic PHY framework Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 07/15] usb: phy: omap-usb2: remove *set_suspend* callback from omap-usb2 Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 08/15] usb: phy: twl4030-usb: remove *set_suspend* and *phy_init* ops Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 09/15] phy: Add driver for Exynos MIPI CSIS/DSIM DPHYs Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 10/15] video: exynos_mipi_dsim: Use the generic PHY driver Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 11/15] exynos4-is: Use the generic MIPI CSIS " Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 12/15] ARM: Samsung: Remove the MIPI PHY setup code Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 13/15] phy: Add driver for Exynos DP PHY Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 14/15] video: exynos_dp: remove non-DT support for Exynos Display Port Kishon Vijay Abraham I
2013-07-18 6:58 ` [PATCH 15/15] video: exynos_dp: Use the generic PHY driver Kishon Vijay Abraham I
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1446965.6APW5ZgLBW@amdc1227 \
--to=t.figa@samsung.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).