Hi, On Thu, 27 Feb 2025 at 11:57, Catalin Popescu <catalin.popescu@xxxxxxxxxxxxxxxxxxxx> wrote: > > NXP bluetooth chip shares power supply and reset gpio with a WLAN > chip. Add support for power supply and reset and enforce powerup > sequence: > - apply power supply > - deassert reset/powerdown > > Signed-off-by: Catalin Popescu <catalin.popescu@xxxxxxxxxxxxxxxxxxxx> > Reviewed-by: Neeraj Sanjay Kale <neeraj.sanjaykale@xxxxxxx> > --- > v2: > - rebase on linux-next tag next-20250227 > - add reviewed-by [...] > @@ -1522,6 +1525,7 @@ static int nxp_serdev_probe(struct serdev_device *serdev) > { > struct hci_dev *hdev; > struct btnxpuart_dev *nxpdev; > + int err; > > nxpdev = devm_kzalloc(&serdev->dev, sizeof(*nxpdev), GFP_KERNEL); > if (!nxpdev) > @@ -1549,6 +1553,16 @@ static int nxp_serdev_probe(struct serdev_device *serdev) > > crc8_populate_msb(crc8_table, POLYNOMIAL8); > > + nxpdev->pdn = devm_reset_control_get_optional_shared(&serdev->dev, NULL); Maybe devm_reset_control_get_optional_shared_deasserted could be useful here instead? > + if (IS_ERR(nxpdev->pdn)) > + return PTR_ERR(nxpdev->pdn); > + > + err = devm_regulator_get_enable(&serdev->dev, "vcc"); > + if (err) { > + dev_err(&serdev->dev, "Failed to enable vcc regulator\n"); > + return err; > + } > + > /* Initialize and register HCI device */ > hdev = hci_alloc_dev(); > if (!hdev) { > @@ -1556,6 +1570,8 @@ static int nxp_serdev_probe(struct serdev_device *serdev) > return -ENOMEM; > } > > + reset_control_deassert(nxpdev->pdn); > + > nxpdev->hdev = hdev; > > hdev->bus = HCI_UART; > @@ -1583,6 +1599,7 @@ static int nxp_serdev_probe(struct serdev_device *serdev) > return 0; > > probe_fail: > + reset_control_assert(nxpdev->pdn); > hci_free_dev(hdev); > return -ENODEV; > } > @@ -1609,6 +1626,7 @@ static void nxp_serdev_remove(struct serdev_device *serdev) > } > ps_cleanup(nxpdev); > hci_unregister_dev(hdev); > + reset_control_assert(nxpdev->pdn); > hci_free_dev(hdev); > } > > -- > 2.43.0 >