Ejemplo n.º 1
0
static int __init pcie_portdrv_init(void)
{
	int retval = 0;

	pcie_port_bus_register();
	retval = pci_register_driver(&pcie_portdrv);
	if (retval)
		pcie_port_bus_unregister();
	return retval;
}
Ejemplo n.º 2
0
static int __init pcie_portdrv_init(void)
{
	int retval;

	retval = pcie_port_bus_register();
	if (retval) {
		printk(KERN_WARNING "PCIE: bus_register error: %d\n", retval);
		goto out;
	}
	retval = pci_register_driver(&pcie_portdriver);
	if (retval)
		pcie_port_bus_unregister();
 out:
	return retval;
}
Ejemplo n.º 3
0
int pcie_wifi_pwrctrl_save(void)
{
    /*
    the precondition of invoking pci_get_class:
      there is only one bridge in the system, and the bridge vendor is hisilicon.
      otherwise, we have to invoke other api, such as pci_get_subsys
    */
    pcie_port_dev = pci_get_class((PCI_CLASS_BRIDGE_PCI << 8), NULL);
    if(!pcie_port_dev)
    {
        printk(KERN_ERR "bridge not found,please check.\n");
        return -EIO;
    }
    pcie_wifi_dev = pci_get_subsys(WIFI_VENDOR_ID,WIFI_DEVICE_ID,
                                   WIFI_SS_VENDOR_ID,WIFI_SS_ID,NULL);
    if(!pcie_wifi_dev)
    {
        printk(KERN_ERR "wifi dev not found,please check.\n");
        return -EIO;
    }

    /*save interrupt pin&line*/
    pcie_port_dev_int_pin = pcie_port_dev->pin;
    pcie_port_dev_int_irq = pcie_port_dev->irq;
    pcie_wifi_dev_int_pin = pcie_wifi_dev->pin;
    pcie_wifi_dev_int_irq = pcie_wifi_dev->irq;

    pci_unregister_driver(&pcie_portdriver);
    pcie_port_bus_unregister();
    root_bus = pcie_port_dev->bus;
    pci_stop_and_remove_bus_device(pcie_port_dev);
    pcie_port_dev = NULL;
    pcie_wifi_powerdown();
    pcie_ltssm_enable(false);
    disable_irq(INT_LVL_PCIE0_LINK_DOWN);
#if !defined(BSP_CONFIG_V7R2_SFT)
    /*
    the power consumption when disable clk and reset is more than only diable clk.
    */
    /*pcie_phy_ctrl_reset();*/
    pcie_clk_disable();
#endif

    return regulator_disable(pcie_regulator);

}
Ejemplo n.º 4
0
static int __init pcie_portdrv_init(void)
{
	int retval;

	if (pcie_ports_disabled)
		return pci_register_driver(&pcie_portdriver);

	dmi_check_system(pcie_portdrv_dmi_table);

	retval = pcie_port_bus_register();
	if (retval) {
		printk(KERN_WARNING "PCIE: bus_register error: %d\n", retval);
		goto out;
	}
	retval = pci_register_driver(&pcie_portdriver);
	if (retval)
		pcie_port_bus_unregister();
 out:
	return retval;
}
Ejemplo n.º 5
0
static void __exit pcie_portdrv_exit(void) 
{
	pci_unregister_driver(&pcie_portdriver);
	pcie_port_bus_unregister();
}
Ejemplo n.º 6
0
int pcie_wifi_pwrctrl_restore(void)
{
    int ret = 0;

    ret = regulator_enable(pcie_regulator);
    if (ret)
    {
        printk(KERN_ERR "fail to enable regulator\n");
        return ret;
    }

    pcie_wifi_poweron();
#if !defined(BSP_CONFIG_V7R2_SFT)
    pcie_clk_enable();
    pcie_phy_ctrl_reset();
    pcie_phy_ctrl_undo_reset();
#endif
    enable_irq(INT_LVL_PCIE0_LINK_DOWN);
    pcie_hw_preinit();
    pcie_ltssm_enable(true);
    ret = pcie_link_up_confirm();
    if(-EIO == ret)
    {
        goto out;
    }
    pcie_hw_postinit();
    pci_rescan_bus(root_bus);

    pcie_port_dev = pci_get_class((PCI_CLASS_BRIDGE_PCI << 8), NULL);
    if(!pcie_port_dev)
    {
        printk(KERN_ERR "bridge not found,please check.\n");
        return -EIO;
    }
    pcie_wifi_dev = pci_get_subsys(WIFI_VENDOR_ID,WIFI_DEVICE_ID,
                                   WIFI_SS_VENDOR_ID,WIFI_SS_ID,NULL);
    if(!pcie_wifi_dev)
    {
        printk(KERN_ERR "wifi dev not found,please check.\n");
        return -EIO;
    }

    /*recover interrupt pin&line*/
    pci_write_config_byte(pcie_port_dev,PCI_INTERRUPT_PIN,pcie_port_dev_int_pin);
    pci_write_config_byte(pcie_wifi_dev,PCI_INTERRUPT_PIN,pcie_wifi_dev_int_pin);
    pcie_port_dev->pin = pcie_port_dev_int_pin;
    pcie_port_dev->irq = pcie_port_dev_int_irq;
    pcie_wifi_dev->pin = pcie_wifi_dev_int_pin;
    pcie_wifi_dev->irq = pcie_wifi_dev_int_irq;
    pcibios_update_irq(pcie_port_dev,pcie_port_dev_int_irq);
    pcibios_update_irq(pcie_wifi_dev,pcie_wifi_dev_int_irq);

    ret = pcie_port_bus_register();
	if (ret) {
		printk(KERN_WARNING "PCIE: bus_register error: %d\n", ret);
		goto out;
	}
    ret = pci_register_driver(&pcie_portdriver);
	if (ret)
	{
		pcie_port_bus_unregister();
	}
 out:
	return ret;
}