问题:
我正在尝试找到一种方法来检索已添加到设备树中的mdio_bus
的dev对象。我确定当我越过这个时,我会迅速将手掌伸到我的额头上,但对于我的生活,我无法在任何地方找到答案。我已经看过如何使用bus_find_device_by_name()
在总线上找到对象,但我似乎无法找到如何获取总线本身。
背景:
我们使用连接到at919g20的MACB的Micrel KSZ8863以太网交换机为我们的主机提供网络访问。我没有使用固定的PHY选项,而是将MDIO地址0伪装成一个“伪”PHY,代表到交换机的固定MII链路。我正在为交换机编写驱动程序以接收其中断并监视面向外的PHY并控制“伪”PHY到主机的链路状态。为了将交换机配置为超出基本MIIM配置,您需要在MDIO总线上使用SMI来访问交换机中的完整寄存器阵列。通过进一步调整MACB中的mii_read / write函数,在reg地址中添加一个头,我相信我可以使用MACB的MDIO / MII控制器为SMI请求做正确的事情。由于总线不再由PHY:REG寻址,我需要能够从交换机驱动程序直接向总线发出原始读/写命令。这让我回到了我的问题:如何通过名称从设备树中请求mdio_bus
的dev对象?
谢谢, 布赖恩
答案 0 :(得分:2)
在狩猎之后,毫无结果地,为了找到一个指向mii_bus对象的设备指针的方法,我最终提出了以下解决方案。我不确定它是最好的方法,但看起来很干净。我基本上最终向mdio_bus.c添加了一个辅助函数,它允许另一个驱动程序使用class_find_device()按名称搜索总线。我确信有更好的方法可以做到这一点,这不涉及添加到总线的驱动程序,但它似乎也不是最糟糕的方式。
-Brian
以下是我添加到mdio_bus.c的函数:
/**
* mdiobus_match_name - compares specified string to the device name
* @dev: device object to be examined
* @data: pointer to string to compare device name to
*
* Description: matching function used in call to class_find_device() to find
* a device with the specified name
*/
static int mdiobus_match_name( struct device * dev, void * data )
{
const char * name = data;
return sysfs_streq( name, dev_name( dev ) );
}
/**
* mdiobus_find_by_name - Convenience function for retrieving an mii_bus pointer
* by name
* @name: name of the bus being searched for
*/
struct mii_bus * mdiobus_find_by_name( char * name )
{
struct device * dev;
/* search devices registered for with the mdio_bus_class using the device
name as the matching criteria */
dev = class_find_device( &mdio_bus_class,
NULL,
(void *)name,
mdiobus_match_name );
/* return the mii_bus pointer or NULL if none was found */
return dev ? container_of( dev, struct mii_bus, dev ) : NULL;
}
EXPORT_SYMBOL( mdiobus_find_by_name );