Re: [PATCH 07/17] usb: musb: omap2430: use *syscon* framework to write to mailbox register

Kishon Vijay Abraham I
2015-06-24T13:22:43Z

Hi,

On Wednesday 24 June 2015 05:09 PM, Roger Quadros wrote:
> On Tue, 23 Jun 2015 17:28:52 +0530
> Kishon Vijay Abraham I <kishon@ti.com> wrote:
>
>> Deprecate using phy-omap-control driver to write to the mailbox register
>> and start using *syscon* framework to do the same.
>>
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>> Documentation/devicetree/bindings/usb/omap-usb.txt | 7 +-
>> drivers/usb/musb/omap2430.c | 118 ++++++++++++++++----
>> 2 files changed, 102 insertions(+), 23 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt
>> index 38d9bb8..c001306 100644
>> --- a/Documentation/devicetree/bindings/usb/omap-usb.txt
>> +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt
>> @@ -20,10 +20,15 @@ OMAP MUSB GLUE
>> - phy-names : the names of the PHY corresponding to the PHYs present in the
>> *phy* phandle.
>>
>> -Optional properties:
>> +Optional Properties:
>> +Deprecated properties:
>> - ctrl-module : phandle of the control module this glue uses to write to
>> mailbox
>>
>> +Recommended properies:
>> + - syscon-otghs : phandle/offset pair. Phandle to the system control module and the
>> + register offset of the mailbox.
>> +
>> SOC specific device node entry
>> usb_otg_hs: usb_otg_hs@4a0ab000 {
>> compatible = "ti,omap4-musb";
>> diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
>> index cc752d8..bcd6d1e 100644
>> --- a/drivers/usb/musb/omap2430.c
>> +++ b/drivers/usb/musb/omap2430.c
>> @@ -39,16 +39,27 @@
>> #include <linux/usb/musb-omap.h>
>> #include <linux/phy/omap_control_phy.h>
>> #include <linux/of_platform.h>
>> +#include <linux/regmap.h>
>> +#include <linux/mfd/syscon.h>
>>
>> #include "musb_core.h"
>> #include "omap2430.h"
>>
>> +#define OMAP2430_MUSB_MODE_MASK 0x1f
>> +#define OMAP2430_MUSB_AVALID (0x1 << 0)
>> +#define OMAP2430_MUSB_BVALID (0x1 << 1)
>> +#define OMAP2430_MUSB_VBUSVALID (0x1 << 2)
>> +#define OMAP2430_MUSB_SESSEND (0x1 << 3)
>> +#define OMAP2430_MUSB_IDDIG (0x1 << 4)
>> +
>> struct omap2430_glue {
>> struct device *dev;
>> struct platform_device *musb;
>> enum omap_musb_vbus_id_status status;
>> struct work_struct omap_musb_mailbox_work;
>> struct device *control_otghs;
>> + struct regmap *syscon_otghs; /* ctrl. reg. acces */
>> + unsigned int otghs_reg; /* otghs reg. index within syscon */
>> };
>> #define glue_to_musb(g) platform_get_drvdata(g->musb)
>>
>> @@ -253,6 +264,47 @@ void omap_musb_mailbox(enum omap_musb_vbus_id_status status)
>> }
>> EXPORT_SYMBOL_GPL(omap_musb_mailbox);
>>
>> +static void omap2430_musb_set_usbmode(struct omap2430_glue *glue,
>> + enum omap_control_usb_mode mode)
>> +{
>> + u32 val;
>> + int ret;
>> +
>> + if (glue->syscon_otghs) {
>> + switch (mode) {
>> + case USB_MODE_HOST:
>> + val = OMAP2430_MUSB_AVALID | OMAP2430_MUSB_VBUSVALID;
>> + break;
>> +
>> + case USB_MODE_DEVICE:
>> + val = OMAP2430_MUSB_IDDIG | OMAP2430_MUSB_AVALID |
>> + OMAP2430_MUSB_VBUSVALID;
>> + break;
>> +
>> + case USB_MODE_DISCONNECT:
>> + val = OMAP2430_MUSB_IDDIG | OMAP2430_MUSB_SESSEND;
>> + break;
>> +
>> + default:
>> + dev_dbg(glue->dev, "Invalid mode\n");
>> + goto err_regmap_update;
>> + }
>> +
>> + ret = regmap_update_bits(glue->syscon_otghs,
>> + glue->otghs_reg,
>> + OMAP2430_MUSB_MODE_MASK, val);
>> + if (ret < 0)
>> + goto err_regmap_update;
>> + } else {
>> + omap_control_usb_set_mode(glue->control_otghs, mode);
>> + }
>> +
>> + return;
>> +
>> +err_regmap_update:
>> + dev_err(glue->dev, "Failed to set mode to %d\n", mode);
>> +}
>> +
>> static void omap_musb_set_mailbox(struct omap2430_glue *glue)
>> {
>> struct musb *musb = glue_to_musb(glue);
>> @@ -270,8 +322,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
>> musb->xceiv->last_event = USB_EVENT_ID;
>> if (musb->gadget_driver) {
>> pm_runtime_get_sync(dev);
>> - omap_control_usb_set_mode(glue->control_otghs,
>> - USB_MODE_HOST);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_HOST);
>> omap2430_musb_set_vbus(musb, 1);
>> }
>> break;
>> @@ -284,7 +335,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
>> musb->xceiv->last_event = USB_EVENT_VBUS;
>> if (musb->gadget_driver)
>> pm_runtime_get_sync(dev);
>> - omap_control_usb_set_mode(glue->control_otghs, USB_MODE_DEVICE);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_DEVICE);
>> break;
>>
>> case OMAP_MUSB_ID_FLOAT:
>> @@ -301,8 +352,7 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)
>> if (data->interface_type == MUSB_INTERFACE_UTMI)
>> otg_set_vbus(musb->xceiv->otg, 0);
>>
>> - omap_control_usb_set_mode(glue->control_otghs,
>> - USB_MODE_DISCONNECT);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_DISCONNECT);
>> break;
>> default:
>> dev_dbg(dev, "ID float\n");
>> @@ -444,7 +494,7 @@ static void omap2430_musb_enable(struct musb *musb)
>> switch (glue->status) {
>>
>> case OMAP_MUSB_ID_GROUND:
>> - omap_control_usb_set_mode(glue->control_otghs, USB_MODE_HOST);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_HOST);
>> if (data->interface_type != MUSB_INTERFACE_UTMI)
>> break;
>> devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
>> @@ -463,7 +513,7 @@ static void omap2430_musb_enable(struct musb *musb)
>> break;
>>
>> case OMAP_MUSB_VBUS_VALID:
>> - omap_control_usb_set_mode(glue->control_otghs, USB_MODE_DEVICE);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_DEVICE);
>> break;
>>
>> default:
>> @@ -477,8 +527,7 @@ static void omap2430_musb_disable(struct musb *musb)
>> struct omap2430_glue *glue = dev_get_drvdata(dev->parent);
>>
>> if (glue->status != OMAP_MUSB_UNKNOWN)
>> - omap_control_usb_set_mode(glue->control_otghs,
>> - USB_MODE_DISCONNECT);
>> + omap2430_musb_set_usbmode(glue, USB_MODE_DISCONNECT);
>> }
>>
>> static int omap2430_musb_exit(struct musb *musb)
>> @@ -507,6 +556,40 @@ static const struct musb_platform_ops omap2430_ops = {
>>
>> static u64 omap2430_dmamask = DMA_BIT_MASK(32);
>>
>> +static int omap2430_get_control(struct omap2430_glue *glue,
>> + struct device_node *np)
>> +{
>> + struct device_node *control_node;
>> + struct platform_device *control_pdev;
>> +
>> + glue->syscon_otghs = syscon_regmap_lookup_by_phandle(np,
>> + "syscon-otghs");
>> + if (IS_ERR(glue->syscon_otghs)) {
>> + dev_info(glue->dev, "can't get syscon, using control device\n");
>
> dev_dbg().

Alright.

Thanks
Kishon