某平台pcie设备的(host)controller驱动框架及其phy驱动框架(二)

NOTE:Kernel version: 5.4.24
File Path:drivers/phy/xxxxxx/phy-xxx-pcie.c(省略返回值判断)

1、相关结构

struct xxx_pcie_phy {
	struct phy *phy;
	struct clk *clk;
	void __iomem *base;
	u32 flags;
};

2、phy驱动框架

NOTE: 下述代码凡是对返回值判断均用...代替;而......表示省略部分代码。

5)主要硬件配置函数xxx_pcie_phy_cal

static int xxx_pcie_phy_cal(struct phy *phy)
{
	/*与phy硬件相关的配置*/
	/*5.1 当PHY的Reference clock是内部clock时,输出clock到ep*/
	if (xxx_phy->flags & xxxMP_PCIE_PHY_FLAG_SYS_PLL) {
		......
		......
	}else if (xxx_phy->flags & xxxMP_PCIE_PHY_FLAG_XO) {
		......
		......
	}

	/*5.2 配置TX drive level*/
	......
	......
	
	return 0;
}

4)定义xxx_pcie_phy_ops

static struct phy_ops xxx_pcie_phy_ops = {
	.init		= xxx_pcie_phy_init,
	.calibrate	= xxx_pcie_phy_cal,
	.power_on	= xxx_pcie_phy_power_on,
	.power_off	= xxx_pcie_phy_power_off,
	.owner		= THIS_MODULE,
};

3)实现xxx_pcie_phy_probe

static int xxx_pcie_phy_probe(struct platform_device *pdev)
{
	struct xxx_pcie_phy *xxx_phy;
	struct device *dev = &pdev->dev;
	struct device_node *np = dev->of_node;
	u32 val = 0;
	struct resource *res;
	
	/*1、分配内存*/
	xxx_phy = devm_kzalloc(dev, sizeof(*xxx_phy), GFP_KERNEL);
	...
	
	/*2、填充xxx_phy*/
	/*2.1 获取clock mode*/
	xxx_phy->flags &= ~xxxMP_PCIE_PHY_FLAG_CLK_MASK;
	if (of_property_read_u32(np, "clk_mode", &val) < 0)
		xxx_phy->flags |= xxxMP_PCIE_PHY_FLAG_EXT_OSC;	//default clock mode
	if (val == 1)
		xxx_phy->flags |= xxxMP_PCIE_PHY_FLAG_XO;
	else if (val == 2)
		xxx_phy->flags |= xxxMP_PCIE_PHY_FLAG_EXT_OSC;
	else if (val == 3)
		xxx_phy->flags |= xxxMP_PCIE_PHY_FLAG_SYS_PLL;
	
	/*2.2 获取phy的clock*/
	xxx_phy->clk = devm_clk_get(dev, "phy");
	...
	
	/*2.3 获取phy的物理基址并映射*/
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	xxx_phy->base = devm_ioremap_resource(dev, res);
	...
	
	/*2.4 设置phy的操作函数*/
	xxx_phy->phy = devm_phy_create(dev, NULL, &xxx_pcie_phy_ops);
	...
	
	/*3、设置数据到phy*/
	phy_set_drvdata(xxx_phy->phy, xxx_phy);
	
	/*core层*/
	......
}

2)定义.driver.of_match_table

static const struct of_device_id xxx_pcie_phy_of_match[] = {
	{.compatible = "fsl,xxxmp-pcie-phy",},
	{ },
};
MODULE_DEVICE_TABLE(of, xxx_pcie_phy_of_match);

1)定义一个platform driver

static struct platform_driver xxx_pcie_phy_driver = {
	.probe	= xxx_pcie_phy_probe,
	.driver = {
		.name	= "xxx-pcie-phy",
		.of_match_table	= xxx_pcie_phy_of_match,
	}
};
module_platform_driver(xxx_pcie_phy_driver)
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值