On Fri, Aug 10, 2018 at 2:51 PM <sam.abb...@gmail.com> wrote:
>
> Hi Frank,
>
> I tried modifying am335x-bone-common.dtsi but it did not toggle the gpio pin.
>
> I was also not able to find gpiod_set_valud_cansleep, in my mdio_bus.c.

Maybe we're using different Linux versions? I'm using Linux 4.14. This
is what I see:

https://elixir.bootlin.com/linux/v4.14.62/source/drivers/net/phy/mdio_bus.c#L357

Then lines 365 and 367 for the actual toggling of the GPIO.

-Frank

>
> Following is my _mdiobus_register function:
>
> int __mdiobus_register(struct mii_bus *bus, struct module *owner)
> {
>  int i, err;
>
>
>  if (NULL == bus || NULL == bus->name ||
>      NULL == bus->read || NULL == bus->write)
>  return -EINVAL;
>
>
>  BUG_ON(bus->state != MDIOBUS_ALLOCATED &&
>         bus->state != MDIOBUS_UNREGISTERED);
>
>
>  bus->owner = owner;
>  bus->dev.parent = bus->parent;
>  bus->dev.class = &mdio_bus_class;
>  bus->dev.groups = NULL;
>  dev_set_name(&bus->dev, "%s", bus->id);
>
>
>  err = device_register(&bus->dev);
>  if (err) {
>  pr_err("mii_bus %s failed to register\n", bus->id);
>  put_device(&bus->dev);
>  return -EINVAL;
>  }
>
>
>  mutex_init(&bus->mdio_lock);
>
>
>  if (bus->reset)
>  bus->reset(bus);
>
>
>  for (i = 0; i < PHY_MAX_ADDR; i++) {
>  if ((bus->phy_mask & (1 << i)) == 0) {
>  struct phy_device *phydev;
>
>
>  phydev = mdiobus_scan(bus, i);
>  if (IS_ERR(phydev)) {
>  err = PTR_ERR(phydev);
>  goto error;
>  }
>  }
>  }
>
>
>  bus->state = MDIOBUS_REGISTERED;
>  pr_info("%s: probed\n", bus->name);
>  return 0;
>
>
> error:
>  while (--i >= 0) {
>  struct phy_device *phydev = bus->phy_map[i];
>  if (phydev) {
>  phy_device_remove(phydev);
>  phy_device_free(phydev);
>  }
>  }
>  device_del(&bus->dev);
>  return err;
> }
> EXPORT_SYMBOL(__mdiobus_register);
>
>
>
>
> Thank you,
> Samer
>
>
> On Thursday, August 9, 2018 at 8:28:16 AM UTC-6, Frank Hunleth wrote:
>>
>> Hi Samer,
>>
>> On Wed, Aug 8, 2018 at 11:43 AM <sam.a...@gmail.com> wrote:
>> > Where exactly do I need to put this code in the device tree?
>>
>> In my setup, I didn't modify am33xx.dtsi. I modified the main .dts
>> file for my board by adding the fragment that I posted. The analogous
>> file for the beaglebones is am335x-bone-common.dtsi and if you look
>> down in it, you can see the existing reference to davinci_mdio.
>>
>> I get confused frequently with what is actually in device tree files,
>> so I almost always run `dtc -o out.dts am335x-<name>.dtb` to decompile
>> the device tree and see what actually got added to it.
>>
>> My other idea for you is to try adding printk's to
>> <kernel>/drivers/net/phy/mdio_bus.c to verify that the phy reset code
>> is being called. If you open mdio_bus.c and search for the
>> __mdiobus_register function, there's a line about it getting the
>> "reset" GPIO from the device tree and then if it's successful, you can
>> see calls to gpiod_set_valud_cansleep. I put 'printk(KERN_ERR
>> "Resetting phy!!!");` calls throughout this code when I didn't see the
>> gpio working. At least this way, you can know whether the GPIO is
>> actually being toggled in software.
>>
>> -Frank
>>
>> >
>> > I tried adding this code in am33xx.dtsi, but my GPIO is not getting 
>> > triggered. It looks like this:
>> >
>> > mac: ethernet@4a100000 {
>> > compatible = "ti,am335x-cpsw","ti,cpsw";
>> > ti,hwmods = "cpgmac0";
>> > clocks = <&cpsw_125mhz_gclk>, <&cpsw_cpts_rft_clk>;
>> > clock-names = "fck", "cpts";
>> > cpdma_channels = <8>;
>> > ale_entries = <1024>;
>> > bd_ram_size = <0x2000>;
>> > mac_control = <0x20>;
>> > slaves = <2>;
>> > active_slave = <0>;
>> > cpts_clock_mult = <0x80000000>;
>> > cpts_clock_shift = <29>;
>> > reg = <0x4a100000 0x800
>> >        0x4a101200 0x100>;
>> > #address-cells = <1>;
>> > #size-cells = <1>;
>> > /*
>> > * c0_rx_thresh_pend
>> > * c0_rx_pend
>> > * c0_tx_pend
>> > * c0_misc_pend
>> > */
>> > interrupts = <40 41 42 43>;
>> > ranges;
>> > syscon = <&scm_conf>;
>> > status = "disabled";
>> >
>> > davinci_mdio: mdio@4a101000 {
>> > compatible = "ti,cpsw-mdio","ti,davinci_mdio";
>> > #address-cells = <1>;
>> > #size-cells = <0>;
>> > ti,hwmods = "davinci_mdio";
>> > bus_freq = <1000000>;
>> > reg = <0x4a101000 0x100>;
>> >
>> > status = "disabled";
>> > };
>> > &davinci_mdio {
>> > pinctrl-names = "default", "sleep";
>> > pinctrl-0 = <&davinci_mdio_default>;
>> > pinctrl-1 = <&davinci_mdio_sleep>;
>> > status = "okay";
>> >
>> > reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
>> > reset-delay-us = <100>;
>> > ethphy0: @cpsw_emac0 {};
>> > };
>> >
>> > cpsw_emac0: slave@4a100200 {
>> > /* Filled in by U-Boot */
>> > mac-address = [ 00 00 00 00 00 00 ];
>> > };
>> >
>> > cpsw_emac1: slave@4a100300 {
>> > /* Filled in by U-Boot */
>> > mac-address = [ 00 00 00 00 00 00 ];
>> > };
>> >
>> > phy_sel: cpsw-phy-sel@44e10650 {
>> > compatible = "ti,am3352-cpsw-phy-sel";
>> > reg= <0x44e10650 0x4>;
>> > reg-names = "gmii-sel";
>> > };
>> > };
>> >
>> > Thank you,
>> > Samer
>> >
>> > On Tuesday, August 7, 2018 at 9:28:45 PM UTC-6, Frank Hunleth wrote:
>> >>
>> >> On Tue, Aug 7, 2018 at 8:29 PM <sam.a...@gmail.com> wrote:
>> >> >
>> >> > So I cut the trace for reset pin on Lan8710 and jumpered a wire to a 
>> >> > gpio pin. And I added the reset gpio/reset-delay-us as shown in this 
>> >> > link: 
>> >> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/net/mdio.txt
>> >> >
>> >> > I added following commands in am335x.dtsi on line 1057
>> >> >
>> >> > reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
>> >> > reset-delay-us = <100>;
>> >> >
>> >>
>> >> I had a similar problem. I believe that you need to specify the phy as
>> >> a child node to trigger the reset GPIO logic in the mdio driver.
>> >> Here's the relevant section of my device tree:
>> >>
>> >> &davinci_mdio {
>> >>         pinctrl-names = "default", "sleep";
>> >>         pinctrl-0 = <&davinci_mdio_default>;
>> >>         pinctrl-1 = <&davinci_mdio_sleep>;
>> >>         status = "okay";
>> >>
>> >>         reset-gpios = <&gpio3 21 GPIO_ACTIVE_LOW>;
>> >>         reset-delay-us = <100>;
>> >>         ethphy0: @cpsw_emac0 {};
>> >> };
>> >>
>> >> I've only done some quick tests, but it appears to be working.
>> >>
>> >> -Frank
>> >
>
> --
> For more options, visit http://beagleboard.org/discuss
> ---
> You received this message because you are subscribed to the Google Groups 
> "BeagleBoard" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to beagleboard+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/beagleboard/aa9139f7-3b95-48b9-96c9-380932f0cbe7%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



-- 
Frank Hunleth
Troodon Software LLC
Embedded Software Development
http://troodon-software.com/

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/CA%2B-urNTBQu1YheR-dpEFt1p2QvHkip0fV%2BcxaZuknED2M3opJw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to