Message ID | 20200512214713.40501-1-tony@atomide.com (mailing list archive) |
---|---|
Headers | show |
Series | n_gsm serdev support and GNSS driver for droid4 | expand |
Hi! > Here's the updated set of these patches fixed up for Johan's and > Pavel's earlier comments. > > This series does the following: > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > TTY ports configured in devicetree with help of n_gsm.c > > 3. Allows the use of standard Linux device drivers for dedicated > TS 27.010 channels for devices like GNSS and ALSA found on some > modems for example > 4. Adds a gnss-motmdm consumer driver for the GNSS device found on > the Motorola Mapphone MDM6600 modem on devices like droid4 It does one thing ... it turns Droid 4 into useful phone! Thanks a lot. I believe these are same patches as in droid4-pending-v5.7 branch, so whole series is Tested-by: Pavel Machek <pavel@ucw.cz> Getting this into 5.8 would be nice :-). > Now without the chardev support, the /dev/gsmtty* using apps need > to use "U1234AT+CFUN?" format for the packets. The advantage is > less kernel code, and we keep the existing /dev/gsmtty* interface. > > If we still really need the custom chardev support, that can now > be added as needed with the channel specific consumer driver(s), > but looks like this won't be needed based on Pavel's ofono work. These work for me, and I have patched ofono with basic functionality. It is no longer possible to use minicom for debugging, but printf can be used instead, so that's not much of a problem. I have adjusted ofono code, and moved away from normal AT support code. More API changes would not be welcome :-). Best regards, Pavel
* Pavel Machek <pavel@denx.de> [200513 19:10]: > Hi! > > > Here's the updated set of these patches fixed up for Johan's and > > Pavel's earlier comments. > > > > This series does the following: > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > TTY ports configured in devicetree with help of n_gsm.c > > > > 3. Allows the use of standard Linux device drivers for dedicated > > TS 27.010 channels for devices like GNSS and ALSA found on some > > modems for example > > > 4. Adds a gnss-motmdm consumer driver for the GNSS device found on > > the Motorola Mapphone MDM6600 modem on devices like droid4 > > It does one thing ... it turns Droid 4 into useful phone! Right, a minor detail I forgot :) > Thanks a lot. I believe these are same patches as in > droid4-pending-v5.7 branch, so whole series is > > Tested-by: Pavel Machek <pavel@ucw.cz> > > Getting this into 5.8 would be nice :-). > > > Now without the chardev support, the /dev/gsmtty* using apps need > > to use "U1234AT+CFUN?" format for the packets. The advantage is > > less kernel code, and we keep the existing /dev/gsmtty* interface. > > > > If we still really need the custom chardev support, that can now > > be added as needed with the channel specific consumer driver(s), > > but looks like this won't be needed based on Pavel's ofono work. > > These work for me, and I have patched ofono with basic > functionality. It is no longer possible to use minicom for debugging, > but printf can be used instead, so that's not much of a problem. > > I have adjusted ofono code, and moved away from normal AT support > code. More API changes would not be welcome :-). There is no need for a new API or API changes as we now use the existing n_gsm tty interface for /dev/gsmtty* devices that have been around for years. Regards, Tony
On Tue, May 12, 2020 at 02:47:07PM -0700, Tony Lindgren wrote: > Hi all, > > Here's the updated set of these patches fixed up for Johan's and > Pavel's earlier comments. > > This series does the following: > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > TTY ports configured in devicetree with help of n_gsm.c > > 3. Allows the use of standard Linux device drivers for dedicated > TS 27.010 channels for devices like GNSS and ALSA found on some > modems for example > > 4. Adds a gnss-motmdm consumer driver for the GNSS device found on > the Motorola Mapphone MDM6600 modem on devices like droid4 > > I've placed the serdev-ngsm.c under drivers/tty/serdev as it still > seems to make most sense with no better places available. It's no > longer an MFD driver as it really does not need to care what channel > specific consumer drivers might be configured for the generic driver. > Now serdev-ngsm just uses of_platform_populate() to probe whatever > child nodes it might find. > > I'm not attached having the driver in drivers/tty/serdev. I just > don't have any better locations in mind. So using Johan's earlier > i2c example, the drivers/tty/serdev/serdev-ngsm.c driver is now a > generic protocol and bus driver, so it's getting closer to the > the drivers/i2c/busses analogy maybe :) Please do suggest better > locations other than MFD and misc if you have better ideas. > > Now without the chardev support, the /dev/gsmtty* using apps need > to use "U1234AT+CFUN?" format for the packets. The advantage is > less kernel code, and we keep the existing /dev/gsmtty* interface. > > If we still really need the custom chardev support, that can now > be added as needed with the channel specific consumer driver(s), > but looks like this won't be needed based on Pavel's ofono work. Johan and Rob, any objection/review of this series? thanks, greg k-h
On Fri, May 22, 2020 at 11:17:31AM +0200, Greg Kroah-Hartman wrote: > On Tue, May 12, 2020 at 02:47:07PM -0700, Tony Lindgren wrote: > > Hi all, > > > > Here's the updated set of these patches fixed up for Johan's and > > Pavel's earlier comments. > > > > This series does the following: > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > TTY ports configured in devicetree with help of n_gsm.c > > > > 3. Allows the use of standard Linux device drivers for dedicated > > TS 27.010 channels for devices like GNSS and ALSA found on some > > modems for example > > > > 4. Adds a gnss-motmdm consumer driver for the GNSS device found on > > the Motorola Mapphone MDM6600 modem on devices like droid4 > > > > I've placed the serdev-ngsm.c under drivers/tty/serdev as it still > > seems to make most sense with no better places available. It's no > > longer an MFD driver as it really does not need to care what channel > > specific consumer drivers might be configured for the generic driver. > > Now serdev-ngsm just uses of_platform_populate() to probe whatever > > child nodes it might find. > > > > I'm not attached having the driver in drivers/tty/serdev. I just > > don't have any better locations in mind. So using Johan's earlier > > i2c example, the drivers/tty/serdev/serdev-ngsm.c driver is now a > > generic protocol and bus driver, so it's getting closer to the > > the drivers/i2c/busses analogy maybe :) Please do suggest better > > locations other than MFD and misc if you have better ideas. > > > > Now without the chardev support, the /dev/gsmtty* using apps need > > to use "U1234AT+CFUN?" format for the packets. The advantage is > > less kernel code, and we keep the existing /dev/gsmtty* interface. > > > > If we still really need the custom chardev support, that can now > > be added as needed with the channel specific consumer driver(s), > > but looks like this won't be needed based on Pavel's ofono work. > > Johan and Rob, any objection/review of this series? Yeah, sorry I haven't had time to review this yet. I should be able to look at it today. Johan
On Tue, May 12, 2020 at 02:47:07PM -0700, Tony Lindgren wrote: > Hi all, > > Here's the updated set of these patches fixed up for Johan's and > Pavel's earlier comments. > > This series does the following: > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > TTY ports configured in devicetree with help of n_gsm.c > > 3. Allows the use of standard Linux device drivers for dedicated > TS 27.010 channels for devices like GNSS and ALSA found on some > modems for example Unfortunately that does not seem to be the case just yet. Your gnss driver is still aware that it's using n_gsm for the transport and calls into the "parent" serdev-ngsm driver instead of using the serdev interface (e.g. as if this was still and MFD driver). If you model this right, the GNSS driver should work equally well regardless of whether you use the serial interface (with n_gsm) or USB (e.g. cdc-acm or usb-serial). > 4. Adds a gnss-motmdm consumer driver for the GNSS device found on > the Motorola Mapphone MDM6600 modem on devices like droid4 > > I've placed the serdev-ngsm.c under drivers/tty/serdev as it still > seems to make most sense with no better places available. It's no > longer an MFD driver as it really does not need to care what channel > specific consumer drivers might be configured for the generic driver. > Now serdev-ngsm just uses of_platform_populate() to probe whatever > child nodes it might find. > > I'm not attached having the driver in drivers/tty/serdev. I just > don't have any better locations in mind. So using Johan's earlier > i2c example, the drivers/tty/serdev/serdev-ngsm.c driver is now a > generic protocol and bus driver, so it's getting closer to the > the drivers/i2c/busses analogy maybe :) Please do suggest better > locations other than MFD and misc if you have better ideas. Please move it up one level to drivers/tty where the n_gsm line discipline lives. This is (supposed to be) a tty driver exposing tty devices. > Now without the chardev support, the /dev/gsmtty* using apps need > to use "U1234AT+CFUN?" format for the packets. The advantage is > less kernel code, and we keep the existing /dev/gsmtty* interface. Would it not be possible to deal with this in a plugin sort of way, again, similar to how the hci ldisc work with an additional "protocol" ioctl? Johan
On Thu 2020-05-28 10:39:18, Johan Hovold wrote: > On Tue, May 12, 2020 at 02:47:07PM -0700, Tony Lindgren wrote: > > Hi all, > > > > Here's the updated set of these patches fixed up for Johan's and > > Pavel's earlier comments. > > > > This series does the following: > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > TTY ports configured in devicetree with help of n_gsm.c > > > > 3. Allows the use of standard Linux device drivers for dedicated > > TS 27.010 channels for devices like GNSS and ALSA found on some > > modems for example > > Unfortunately that does not seem to be the case just yet. Your gnss > driver is still aware that it's using n_gsm for the transport and calls > into the "parent" serdev-ngsm driver instead of using the serdev > interface (e.g. as if this was still and MFD driver). > > If you model this right, the GNSS driver should work equally well > regardless of whether you use the serial interface (with n_gsm) or USB > (e.g. cdc-acm or usb-serial). I believe we are pretty sure we'll not see that protocol anywhere else. Best regards, Pavel
Hi! > > Here's the updated set of these patches fixed up for Johan's and > > Pavel's earlier comments. > > > > This series does the following: > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > TTY ports configured in devicetree with help of n_gsm.c > > > > 3. Allows the use of standard Linux device drivers for dedicated > > TS 27.010 channels for devices like GNSS and ALSA found on some > > modems for example > > Unfortunately that does not seem to be the case just yet. Your gnss > driver is still aware that it's using n_gsm for the transport and calls > into the "parent" serdev-ngsm driver instead of using the serdev > interface (e.g. as if this was still and MFD driver). > > If you model this right, the GNSS driver should work equally well > regardless of whether you use the serial interface (with n_gsm) or USB > (e.g. cdc-acm or usb-serial). We are not going to see that protocol anywhere else, so why is that a good goal? Anyway, Tony, is there newer version of this patchset? It would be good to get something in... Can I help somehow? Best regards, Pavel
* Pavel Machek <pavel@denx.de> [200726 08:25]: > Hi! > > > > Here's the updated set of these patches fixed up for Johan's and > > > Pavel's earlier comments. > > > > > > This series does the following: > > > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > > TTY ports configured in devicetree with help of n_gsm.c > > > > > > 3. Allows the use of standard Linux device drivers for dedicated > > > TS 27.010 channels for devices like GNSS and ALSA found on some > > > modems for example > > > > Unfortunately that does not seem to be the case just yet. Your gnss > > driver is still aware that it's using n_gsm for the transport and calls > > into the "parent" serdev-ngsm driver instead of using the serdev > > interface (e.g. as if this was still and MFD driver). > > > > If you model this right, the GNSS driver should work equally well > > regardless of whether you use the serial interface (with n_gsm) or USB > > (e.g. cdc-acm or usb-serial). > > We are not going to see that protocol anywhere else, so why is that > a good goal? Yes it seems this GNSS implementation is different from the one provided by gobi. > Anyway, Tony, is there newer version of this patchset? It would be > good to get something in... Sorry it will likely be few more weeks before I can look at this stuff again. > Can I help somehow? I think I'm pretty clear on what needs to be done regarding this patchset. Probably taking a look at if we could implement a minimal raw /dev/gsmtty* read/write access in ofono using ell instead of gatchat would help most :) So something that mbim modem is already doing I think, sorry have not had a chance to look at that either. The /dev/gsmtty* devices should not change even with the further changes to this patchset. Regards, Tony
Hi! > > Here's the updated set of these patches fixed up for Johan's and > > Pavel's earlier comments. > > > > This series does the following: > > > > 1. Adds functions to n_gsm.c for serdev-ngsm.c driver to use > > > > 2. Adds a generic serdev-ngsm.c driver that brings up the TS 27.010 > > TTY ports configured in devicetree with help of n_gsm.c > > > > 3. Allows the use of standard Linux device drivers for dedicated > > TS 27.010 channels for devices like GNSS and ALSA found on some > > modems for example > > Unfortunately that does not seem to be the case just yet. Your gnss > driver is still aware that it's using n_gsm for the transport and calls > into the "parent" serdev-ngsm driver instead of using the serdev > interface (e.g. as if this was still and MFD driver). It took me a while to understand what is wrong and how to fix it, but I seem to have something now. You... don't want to look at patch below as it is very very much work in progress. Best regards, Pavel diff --git a/arch/arm/boot/dts/motorola-mapphone-common.dtsi b/arch/arm/boot/dts/motorola-mapphone-common.dtsi index f5e7ec8e1028..ce907aa40a28 100644 --- a/arch/arm/boot/dts/motorola-mapphone-common.dtsi +++ b/arch/arm/boot/dts/motorola-mapphone-common.dtsi @@ -761,9 +761,22 @@ }; gnss@4 { - compatible = "motorola,mapphone-mdm6600-gnss"; + compatible = "disabled-old,motorola,mapphone-mdm6600-gnss"; reg = <4>; }; + + port@1 { + compatible = "gsmmux,port"; + reg = <1>; + subdev@1 { + compatible = "motorola,mapphone-mdm6600-gnss"; + }; + }; + + port@3 { + compatible = "disabled,gsmmux,port"; + reg = <3>; + }; }; }; diff --git a/drivers/gnss/motmdm.c b/drivers/gnss/motmdm.c index da1d44bed899..4668754408eb 100644 --- a/drivers/gnss/motmdm.c +++ b/drivers/gnss/motmdm.c @@ -3,11 +3,14 @@ * Motorola Modem TS 27.010 serdev GNSS driver * * Copyright (C) 2018 - 2020 Tony Lindgren <tony@atomide.com> + * Copyright (C) 2020 Pavel Machek <pavel@ucw.cz> * * Based on drivers/gnss/sirf.c driver example: * Copyright (C) 2018 Johan Hovold <johan@kernel.org> */ +/* FIXME: see serial.c for good example..? */ + #include <linux/errno.h> #include <linux/gnss.h> #include <linux/init.h> @@ -45,7 +48,7 @@ enum motmdm_gnss_status { struct motmdm_gnss_data { struct gnss_device *gdev; struct device *modem; - struct gsm_serdev_dlci dlci; + struct gsm_serdev_dlci_operations dlci; struct delayed_work restart_work; struct mutex mutex; /* For modem commands */ ktime_t last_update; @@ -76,6 +79,7 @@ int motmdm_gnss_send_command(struct motmdm_gnss_data *ddata, unsigned char cmd[128]; int ret, cmdlen; +#if 0 cmdlen = len + 5 + 1; if (cmdlen > 128) return -EINVAL; @@ -109,6 +113,7 @@ int motmdm_gnss_send_command(struct motmdm_gnss_data *ddata, mutex_unlock(&ddata->mutex); return ret; +#endif } /* @@ -198,7 +203,7 @@ static int motmdm_gnss_finish(struct gnss_device *gdev) return motmdm_gnss_send_command(ddata, cmd, strlen(cmd)); } -static int motmdm_gnss_receive_data(struct gsm_serdev_dlci *dlci, +static int motmdm_gnss_receive_data(struct gsm_serdev_dlci_operations *dlci, const unsigned char *buf, size_t len) { @@ -208,6 +213,8 @@ static int motmdm_gnss_receive_data(struct gsm_serdev_dlci *dlci, size_t msglen; int error = 0; + printk("motmdm_gnss_receive_data\n"); + if (len <= MOTMDM_GNSS_RESP_LEN) return 0; @@ -283,9 +290,10 @@ static int motmdm_gnss_receive_data(struct gsm_serdev_dlci *dlci, static int motmdm_gnss_open(struct gnss_device *gdev) { struct motmdm_gnss_data *ddata = gnss_get_drvdata(gdev); - struct gsm_serdev_dlci *dlci = &ddata->dlci; + struct gsm_serdev_dlci_operations *dlci = &ddata->dlci; int error; +#if 0 dlci->drvdata = gdev; dlci->receive_buf = motmdm_gnss_receive_data; @@ -299,16 +307,17 @@ static int motmdm_gnss_open(struct gnss_device *gdev) return error; } - +#endif return 0; } static void motmdm_gnss_close(struct gnss_device *gdev) { struct motmdm_gnss_data *ddata = gnss_get_drvdata(gdev); - struct gsm_serdev_dlci *dlci = &ddata->dlci; + struct gsm_serdev_dlci_operations *dlci = &ddata->dlci; int error; +#if 0 dlci->receive_buf = NULL; error = motmdm_gnss_finish(gdev); if (error < 0) @@ -316,15 +325,18 @@ static void motmdm_gnss_close(struct gnss_device *gdev) __func__, error); serdev_ngsm_unregister_dlci(ddata->modem, dlci); +#endif } static int motmdm_gnss_write_raw(struct gnss_device *gdev, const unsigned char *buf, size_t count) { +#if 0 struct motmdm_gnss_data *ddata = gnss_get_drvdata(gdev); return serdev_ngsm_write(ddata->modem, &ddata->dlci, buf, count); +#endif } static const struct gnss_operations motmdm_gnss_ops = { @@ -333,7 +345,84 @@ static const struct gnss_operations motmdm_gnss_ops = { .write_raw = motmdm_gnss_write_raw, }; -static int motmdm_gnss_probe(struct platform_device *pdev) +static int gnss_serial_receive_buf(struct serdev_device *serdev, + const unsigned char *buf, size_t count) +{ + printk("gnss_serial_recieve: %d bytes\n", count); + printk("gnss_serial_recieve: have data: %s bytes\n", buf); +#if 0 + struct gnss_serial *gserial = serdev_device_get_drvdata(serdev); + struct gnss_device *gdev = gserial->gdev; + + return gnss_insert_raw(gdev, buf, count); +#endif +} + +static const struct serdev_device_ops gnss_serial_serdev_ops = { + .receive_buf = gnss_serial_receive_buf, + .write_wakeup = serdev_device_write_wakeup, +}; + + +int motmdm_gnss_test(struct serdev_device *serdev) +{ + int ret; + if (!serdev) + return -EIO; + printk("have serdev_device: %p, nr %d\n", serdev, serdev->nr); + + dev_info(&serdev->dev, "interesting line\n"); + + /* HERE */ + serdev_device_set_drvdata(serdev, NULL); + serdev_device_set_client_ops(serdev, &gnss_serial_serdev_ops); + + dev_info(&serdev->dev, "opening serdev\n"); + ret = serdev_device_open(serdev); + if (ret) { + return ret; + } + +// serdev_device_set_baudrate(serdev, gserial->speed); +// serdev_device_set_flow_control(serdev, false); + dev_info(&serdev->dev, "writing\n"); + + { + int count = 5; + ret = serdev_device_write(serdev, "HELLO", count, MAX_SCHEDULE_TIMEOUT); + if (ret < 0 || ret < count) + return ret; + + } + dev_info(&serdev->dev, "waiting\n"); + + serdev_device_wait_until_sent(serdev, 0); + dev_info(&serdev->dev, "all ok\n"); + + return 0; +} + +int motmdm_gnss_attach(struct device *dev, int line) +{ + int ret; + void *me = NULL; /* FIXME */ + struct serdev_controller *ctrl = to_serdev_controller(dev); + struct serdev_device *serdev = ctrl->serdev; + + dev_info(dev, "motmdm_gnss_attach: %d\n", line); + if (line != 1) + return 0; + + printk("have serdev_controller: %p == %p, nr %d\n", ctrl, dev, ctrl->nr); + printk("have serdev_device: %p %p\n", serdev, dev); + + return motmdm_gnss_test(serdev); +} + + +EXPORT_SYMBOL(motmdm_gnss_attach); + +static int motmdm_gnss_probe(struct serdev_device *pdev) { struct device *dev = &pdev->dev; struct motmdm_gnss_data *ddata; @@ -341,14 +430,22 @@ static int motmdm_gnss_probe(struct platform_device *pdev) u32 line; int ret; + printk("gnss_probe\n"); + ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL); if (!ddata) return -ENOMEM; + printk("gnss_probe: searching for reg\n"); + motmdm_gnss_test(pdev); + +#if 0 ret = of_property_read_u32(dev->of_node, "reg", &line); if (ret) return ret; + printk("gnss_probe: should not go here\n"); + if (!line) return -EINVAL; @@ -384,16 +481,17 @@ static int motmdm_gnss_probe(struct platform_device *pdev) gnss_put_device(ddata->gdev); return ret; +#endif } -static int motmdm_gnss_remove(struct platform_device *pdev) +static void motmdm_gnss_remove(struct serdev_device *pdev) { +#if 0 struct motmdm_gnss_data *data = platform_get_drvdata(pdev); gnss_deregister_device(data->gdev); gnss_put_device(data->gdev); - - return 0; +#endif }; #ifdef CONFIG_OF @@ -404,7 +502,7 @@ static const struct of_device_id motmdm_gnss_of_match[] = { MODULE_DEVICE_TABLE(of, motmdm_gnss_of_match); #endif -static struct platform_driver motmdm_gnss_driver = { +static struct serdev_device_driver motmdm_gnss_driver = { .driver = { .name = "gnss-mot-mdm6600", .of_match_table = of_match_ptr(motmdm_gnss_of_match), @@ -412,7 +510,7 @@ static struct platform_driver motmdm_gnss_driver = { .probe = motmdm_gnss_probe, .remove = motmdm_gnss_remove, }; -module_platform_driver(motmdm_gnss_driver); +module_serdev_device_driver(motmdm_gnss_driver); MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>"); MODULE_DESCRIPTION("Motorola Mapphone MDM6600 GNSS receiver driver"); diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 460123447fa1..e4d18d38fc42 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -52,14 +52,17 @@ #include <linux/etherdevice.h> #include <linux/gsmmux.h> #include <linux/serdev-gsm.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> static int debug; module_param(debug, int, 0600); /* Defaults: these are from the specification */ -#define T1 10 /* 100mS */ -#define T2 34 /* 333mS */ +#define T1 10 /* 100ms */ +#define T2 34 /* 333ms */ #define N2 3 /* Retry 3 times */ /* Use long timers for testing at low speed with debug on */ @@ -152,7 +155,7 @@ struct gsm_dlci { /* Data handling callback */ void (*data)(struct gsm_dlci *dlci, const u8 *data, int len); void (*prev_data)(struct gsm_dlci *dlci, const u8 *data, int len); - struct gsm_serdev_dlci *ops; /* serdev dlci ops, if used */ + struct gsm_serdev_dlci_operations *ops; /* serdev dlci ops, if used */ struct net_device *net; /* network interface, if created */ }; @@ -1019,7 +1022,7 @@ static void gsm_control_reply(struct gsm_mux *gsm, int cmd, const u8 *data, static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, u32 modem, int clen) { - int mlines = 0; + int mlines = 0; u8 brk = 0; int fc; @@ -2344,38 +2347,10 @@ static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c) } #ifdef CONFIG_SERIAL_DEV_BUS - -/** - * gsm_serdev_get_config - read ts 27.010 config - * @gsd: serdev-gsm instance - * @c: ts 27.010 config data - * - * See gsm_copy_config_values() for more information. - */ -int gsm_serdev_get_config(struct gsm_serdev *gsd, struct gsm_config *c) -{ - struct gsm_mux *gsm; - - if (!gsd || !gsd->gsm) - return -ENODEV; - - gsm = gsd->gsm; - - if (!c) - return -EINVAL; - - gsm_copy_config_values(gsm, c); - - return 0; -} -EXPORT_SYMBOL_GPL(gsm_serdev_get_config); - /** * gsm_serdev_set_config - set ts 27.010 config * @gsd: serdev-gsm instance * @c: ts 27.010 config data - * - * See gsm_config() for more information. */ int gsm_serdev_set_config(struct gsm_serdev *gsd, struct gsm_config *c) { @@ -2404,7 +2379,7 @@ static struct gsm_dlci *gsd_dlci_get(struct gsm_serdev *gsd, int line, gsm = gsd->gsm; - if (line < 1 || line >= 63) + if (line < 1 || line >= 62) return ERR_PTR(-EINVAL); mutex_lock(&gsm->mutex); @@ -2431,7 +2406,7 @@ static struct gsm_dlci *gsd_dlci_get(struct gsm_serdev *gsd, int line, return dlci; } -static int gsd_dlci_receive_buf(struct gsm_serdev_dlci *ops, +static int gsd_dlci_receive_buf(struct gsm_serdev_dlci_operations *ops, const unsigned char *buf, size_t len) { @@ -2471,6 +2446,7 @@ static void gsd_dlci_data(struct gsm_dlci *dlci, const u8 *buf, int len) } } +/* FIXME: we should not be doing this; serdev_controller_ops->write_buf should be enough? */ /** * gsm_serdev_write - write data to a ts 27.010 channel * @gsd: serdev-gsm instance @@ -2478,7 +2454,7 @@ static void gsd_dlci_data(struct gsm_dlci *dlci, const u8 *buf, int len) * @buf: write buffer * @len: buffer length */ -int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci *ops, +int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci_operations *ops, const u8 *buf, int len) { struct gsm_mux *gsm; @@ -2551,7 +2527,7 @@ EXPORT_SYMBOL_GPL(gsm_serdev_data_kick); * @ops: channel ops */ int gsm_serdev_register_dlci(struct gsm_serdev *gsd, - struct gsm_serdev_dlci *ops) + struct gsm_serdev_dlci_operations *ops) { struct gsm_dlci *dlci; struct gsm_mux *gsm; @@ -2609,7 +2585,7 @@ EXPORT_SYMBOL_GPL(gsm_serdev_register_dlci); * @ops: channel ops */ void gsm_serdev_unregister_dlci(struct gsm_serdev *gsd, - struct gsm_serdev_dlci *ops) + struct gsm_serdev_dlci_operations *ops) { struct gsm_mux *gsm; struct gsm_dlci *dlci; @@ -2681,12 +2657,16 @@ static struct serdev_device_ops gsd_client_ops = { .write_wakeup = gsd_write_wakeup, }; +extern int motmdm_gnss_attach(struct device *dev, int line); + int gsm_serdev_register_tty_port(struct gsm_serdev *gsd, int line) { - struct gsm_serdev_dlci *ops; + struct gsm_serdev_dlci_operations *ops; unsigned int base; int error; - + struct device *dev; + struct device_node *node; + if (line < 1) return -EINVAL; @@ -2704,8 +2684,83 @@ int gsm_serdev_register_tty_port(struct gsm_serdev *gsd, int line) return error; } + base = mux_num_to_base(gsd->gsm); - tty_register_device(gsm_tty_driver, base + ops->line, NULL); + printk("register_tty_port: have port: %p, %d+%d\n", &gsd->gsm->dlci[line]->port, base, ops->line); + dev = &gsd->serdev->dev; + if (line != 1) + return 0; + + for_each_available_child_of_node(dev->of_node, node) { + struct platform_device_info devinfo = {}; + static int idx; + struct platform_device *pdev; + const char *c = of_get_property(node, "compatible", NULL); + + dev_info(dev, "register_tty: child -- %pOF\n", node); + + if (!c) + continue; + dev_info(dev, "register_tty: child -- %pOF -- compatible %s\n", node, c); + if (strcmp(c, "gsmmux,port")) + continue; + + printk("n_gsm: Have subnode with right compatible!\n"); + + devinfo.name = kasprintf(GFP_KERNEL, "gsm-mux-%d", idx++); + devinfo.parent = dev; + + /* Thanks to core.c: serdev_device_add */ + pdev = platform_device_register_full(&devinfo); + pdev->dev.of_node = node; + +#if 0 + tty_register_device(gsm_tty_driver, base + ops->line, NULL); +#else + { + struct device *dev; + + dev = tty_port_register_device_serdev(&gsd->gsm->dlci[line]->port, gsm_tty_driver, base + ops->line, &pdev->dev /* FIXME: needs non-null to attempt serdev registration */ ); + printk("register_tty_port: got %p\n", dev); + { +#if 0 + struct serdev_controller *ctrl = to_serdev_controller(dev); + struct serdev_device *serdev = serdev_device_alloc(ctrl); + int err; + if (!serdev) + dev_err(dev, "could not alloc serdev, that is bad\n"); + + //serdev->dev.of_node = node; + + err = serdev_device_add(serdev); + if (err) { + dev_err(&serdev->dev, + "failure adding device. status %pe\n", + ERR_PTR(err)); + //serdev_device_put(serdev); + } +#endif +#if 0 + printk("register_tty_port: Forcing attach\n"); + /* FIXME: Need to do of_serdev_register_devices() ? */ + motmdm_gnss_attach(dev, ops->line); +#endif + } + + } + } +#endif + /* FIXME: + +extern struct device *tty_register_device(struct tty_driver *driver, + unsigned index, struct device *dev); + +Would like tty_port_register_device_attr or better + tty_port_register_device_attr_serdev + +ale chce navic struct tty_port *. + + _attr() -- last 2 arguments can be NULL. */ return 0; } @@ -2730,7 +2785,7 @@ void gsm_serdev_unregister_tty_port(struct gsm_serdev *gsd, int line) } EXPORT_SYMBOL_GPL(gsm_serdev_unregister_tty_port); -struct gsm_serdev_dlci * +struct gsm_serdev_dlci_operations * gsm_serdev_tty_port_get_dlci(struct gsm_serdev *gsd, int line) { struct gsm_dlci *dlci; @@ -3644,7 +3699,7 @@ static int gsmtty_break_ctl(struct tty_struct *tty, int state) properly */ encode = 0x0F; else if (state > 0) { - encode = state / 200; /* mS to encoding */ + encode = state / 200; /* ms to encoding */ if (encode > 0x0F) encode = 0x0F; /* Best effort */ } diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c index c5f0d936b003..081702d5479d 100644 --- a/drivers/tty/serdev/core.c +++ b/drivers/tty/serdev/core.c @@ -121,7 +121,7 @@ int serdev_device_add(struct serdev_device *serdev) goto err_clear_serdev; } - dev_dbg(&serdev->dev, "device %s registered\n", dev_name(&serdev->dev)); + dev_info(&serdev->dev, "device %s registered, %p controller %p\n", dev_name(&serdev->dev), serdev, ctrl); return 0; @@ -509,7 +509,15 @@ struct serdev_controller *serdev_controller_alloc(struct device *parent, pm_runtime_no_callbacks(&ctrl->dev); pm_suspend_ignore_children(&ctrl->dev, true); - dev_dbg(&ctrl->dev, "allocated controller 0x%p id %d\n", ctrl, id); + /* /sys/bus/serial/drivers/serdev_ngsm/serial0-0 ? + +4806a000.serial:modem:audio-codec@2 modalias subsystem +4806a000.serial:modem:gnss@4 of_node supplier:phy-usb-phy@1.1 +driver power uevent + + */ + dev_info(&ctrl->dev, "allocated controller 0x%p 0x%p id %d [%d]\n", + ctrl, &ctrl->dev, id, ctrl->nr); return ctrl; err_free: @@ -527,10 +535,12 @@ static int of_serdev_register_devices(struct serdev_controller *ctrl) bool found = false; for_each_available_child_of_node(ctrl->dev.of_node, node) { + dev_info(&ctrl->dev, "of_serdev_register_device: considering %pOF\n", node); + if (!of_get_property(node, "compatible", NULL)) continue; - dev_dbg(&ctrl->dev, "adding child %pOF\n", node); + dev_info(&ctrl->dev, "adding child %pOF\n", node); serdev = serdev_device_alloc(ctrl); if (!serdev) @@ -740,26 +750,34 @@ int serdev_controller_add(struct serdev_controller *ctrl) { int ret_of, ret_acpi, ret; + printk("serdev_controller_add...\n"); + /* Can't register until after driver model init */ if (WARN_ON(!is_registered)) return -EAGAIN; + printk("serdev_controller_add 1... %pOF\n", ctrl->dev.of_node); + ret = device_add(&ctrl->dev); if (ret) return ret; + printk("serdev_controller_add 2...\n"); pm_runtime_enable(&ctrl->dev); ret_of = of_serdev_register_devices(ctrl); ret_acpi = acpi_serdev_register_devices(ctrl); if (ret_of && ret_acpi) { - dev_dbg(&ctrl->dev, "no devices registered: of:%pe acpi:%pe\n", + dev_info(&ctrl->dev, "no devices registered: of:%pe acpi:%pe\n", ERR_PTR(ret_of), ERR_PTR(ret_acpi)); +#if 0 ret = -ENODEV; goto err_rpm_disable; +#endif } - dev_dbg(&ctrl->dev, "serdev%d registered: dev:%p\n", + printk("serdev_controller_add all ok?...\n"); + dev_info(&ctrl->dev, "serdev%d registered: dev:%p\n", ctrl->nr, &ctrl->dev); return 0; diff --git a/drivers/tty/serdev/serdev-ngsm.c b/drivers/tty/serdev/serdev-ngsm.c index a247cf36df4f..a250a3594f71 100644 --- a/drivers/tty/serdev/serdev-ngsm.c +++ b/drivers/tty/serdev/serdev-ngsm.c @@ -40,7 +40,7 @@ struct serdev_ngsm { const struct serdev_ngsm_cfg *cfg; }; -static int serdev_ngsm_tty_init(struct serdev_ngsm *ddata) +static int serdev_ngsm_tty_init(struct serdev_ngsm *ddata, void *node /* will need of node here ? */) { struct gsm_serdev *gsd = &ddata->gsd; struct device *dev = ddata->dev; @@ -50,7 +50,7 @@ static int serdev_ngsm_tty_init(struct serdev_ngsm *ddata) if (BIT_ULL(bit) & TS27010_RESERVED_DLCI) continue; - err = gsm_serdev_register_tty_port(gsd, bit); + err = gsm_serdev_register_tty_port(gsd, bit /*, node FIXME */); if (err) { dev_err(dev, "ngsm tty init failed for dlci%i: %i\n", bit, err); @@ -80,7 +80,7 @@ static void serdev_ngsm_tty_exit(struct serdev_ngsm *ddata) * drivers may have already reserved. */ int serdev_ngsm_register_dlci(struct device *dev, - struct gsm_serdev_dlci *dlci) + struct gsm_serdev_dlci_operations *dlci) { struct serdev_ngsm *ddata = gsm_serdev_get_drvdata(dev); struct gsm_serdev *gsd = &ddata->gsd; @@ -95,7 +95,7 @@ int serdev_ngsm_register_dlci(struct device *dev, EXPORT_SYMBOL_GPL(serdev_ngsm_register_dlci); void serdev_ngsm_unregister_dlci(struct device *dev, - struct gsm_serdev_dlci *dlci) + struct gsm_serdev_dlci_operations *dlci) { struct serdev_ngsm *ddata = gsm_serdev_get_drvdata(dev); struct gsm_serdev *gsd = &ddata->gsd; @@ -104,7 +104,7 @@ void serdev_ngsm_unregister_dlci(struct device *dev, } EXPORT_SYMBOL_GPL(serdev_ngsm_unregister_dlci); -int serdev_ngsm_write(struct device *dev, struct gsm_serdev_dlci *ops, +int serdev_ngsm_write(struct device *dev, struct gsm_serdev_dlci_operations *ops, const u8 *buf, int len) { struct serdev_ngsm *ddata = gsm_serdev_get_drvdata(dev); @@ -127,7 +127,7 @@ int serdev_ngsm_write(struct device *dev, struct gsm_serdev_dlci *ops, } EXPORT_SYMBOL_GPL(serdev_ngsm_write); -struct gsm_serdev_dlci * +struct gsm_serdev_dlci_operations * serdev_ngsm_get_dlci(struct device *dev, int line) { struct serdev_ngsm *ddata = gsm_serdev_get_drvdata(dev); @@ -377,7 +377,7 @@ static int serdev_ngsm_probe(struct serdev_device *serdev) if (err) goto err_close; - err = serdev_ngsm_tty_init(ddata); + err = serdev_ngsm_tty_init(ddata, NULL /* FIXME! */); if (err) goto err_tty; diff --git a/drivers/tty/serdev/serdev-ttyport.c b/drivers/tty/serdev/serdev-ttyport.c index d367803e2044..6f02a1546560 100644 --- a/drivers/tty/serdev/serdev-ttyport.c +++ b/drivers/tty/serdev/serdev-ttyport.c @@ -272,6 +272,8 @@ struct device *serdev_tty_port_register(struct tty_port *port, if (!port || !drv || !parent) return ERR_PTR(-ENODEV); + printk("serdev_tty_port_register: %p, %d\n", port, idx); + ctrl = serdev_controller_alloc(parent, sizeof(struct serport)); if (!ctrl) return ERR_PTR(-ENOMEM); @@ -291,9 +293,12 @@ struct device *serdev_tty_port_register(struct tty_port *port, goto err_reset_data; dev_info(&ctrl->dev, "tty port %s%d registered\n", drv->name, idx); + printk("serdev_tty_port_register: controller is %p, serdev %p\n", ctrl, ctrl->serdev); + return &ctrl->dev; err_reset_data: + printk("serdev_tty_port_register: error?\n"); port->client_data = NULL; port->client_ops = &tty_port_default_client_ops; serdev_controller_put(ctrl); diff --git a/include/linux/serdev-gsm.h b/include/linux/serdev-gsm.h index 4fa819a6e366..5bdc8143b7df 100644 --- a/include/linux/serdev-gsm.h +++ b/include/linux/serdev-gsm.h @@ -7,7 +7,7 @@ #include <linux/serdev.h> #include <linux/types.h> -struct gsm_serdev_dlci; +struct gsm_serdev_dlci_operations; struct gsm_config; /** @@ -28,16 +28,16 @@ struct gsm_serdev { }; /** - * struct gsm_serdev_dlci - serdev-gsm ts 27.010 channel data + * struct gsm_serdev_dlci_operations - serdev-gsm ts 27.010 channel data * @gsd: serdev-gsm instance * @line: ts 27.010 channel, control channel 0 is not available * @receive_buf: function to handle data received for the channel * @drvdata: dlci specific consumer driver data */ -struct gsm_serdev_dlci { +struct gsm_serdev_dlci_operations { struct gsm_serdev *gsd; int line; - int (*receive_buf)(struct gsm_serdev_dlci *ops, + int (*receive_buf)(struct gsm_serdev_dlci_operations *ops, const unsigned char *buf, size_t len); void *drvdata; @@ -48,12 +48,12 @@ struct gsm_serdev_dlci { /* TS 27.010 channel specific functions for consumer drivers */ #if IS_ENABLED(CONFIG_SERIAL_DEV_N_GSM) extern int -serdev_ngsm_register_dlci(struct device *dev, struct gsm_serdev_dlci *dlci); +serdev_ngsm_register_dlci(struct device *dev, struct gsm_serdev_dlci_operations *dlci); extern void serdev_ngsm_unregister_dlci(struct device *dev, - struct gsm_serdev_dlci *dlci); -extern int serdev_ngsm_write(struct device *dev, struct gsm_serdev_dlci *ops, + struct gsm_serdev_dlci_operations *dlci); +extern int serdev_ngsm_write(struct device *dev, struct gsm_serdev_dlci_operations *ops, const u8 *buf, int len); -extern struct gsm_serdev_dlci * +extern struct gsm_serdev_dlci_operations * serdev_ngsm_get_dlci(struct device *dev, int line); #endif @@ -62,7 +62,7 @@ extern int gsm_serdev_register_device(struct gsm_serdev *gsd); extern void gsm_serdev_unregister_device(struct gsm_serdev *gsd); extern int gsm_serdev_register_tty_port(struct gsm_serdev *gsd, int line); extern void gsm_serdev_unregister_tty_port(struct gsm_serdev *gsd, int line); -extern struct gsm_serdev_dlci * +extern struct gsm_serdev_dlci_operations * gsm_serdev_tty_port_get_dlci(struct gsm_serdev *gsd, int line); static inline void *gsm_serdev_get_drvdata(struct device *dev) @@ -88,10 +88,10 @@ static inline void gsm_serdev_set_drvdata(struct device *dev, void *drvdata) extern int gsm_serdev_get_config(struct gsm_serdev *gsd, struct gsm_config *c); extern int gsm_serdev_set_config(struct gsm_serdev *gsd, struct gsm_config *c); extern int -gsm_serdev_register_dlci(struct gsm_serdev *gsd, struct gsm_serdev_dlci *ops); +gsm_serdev_register_dlci(struct gsm_serdev *gsd, struct gsm_serdev_dlci_operations *ops); extern void -gsm_serdev_unregister_dlci(struct gsm_serdev *gsd, struct gsm_serdev_dlci *ops); -extern int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci *ops, +gsm_serdev_unregister_dlci(struct gsm_serdev *gsd, struct gsm_serdev_dlci_operations *ops); +extern int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci_operations *ops, const u8 *buf, int len); extern void gsm_serdev_data_kick(struct gsm_serdev *gsd); @@ -118,7 +118,7 @@ void gsm_serdev_unregister_tty_port(struct gsm_serdev *gsd, int line) { } -static inline struct gsm_serdev_dlci * +static inline struct gsm_serdev_dlci_operations * gsm_serdev_tty_port_get_dlci(struct gsm_serdev *gsd, int line) { return NULL; @@ -148,19 +148,19 @@ int gsm_serdev_set_config(struct gsm_serdev *gsd, struct gsm_config *c) static inline int gsm_serdev_register_dlci(struct gsm_serdev *gsd, - struct gsm_serdev_dlci *ops) + struct gsm_serdev_dlci_operations *ops) { return -ENODEV; } static inline void gsm_serdev_unregister_dlci(struct gsm_serdev *gsd, - struct gsm_serdev_dlci *ops) + struct gsm_serdev_dlci_operations *ops) { } static inline -int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci *ops, +int gsm_serdev_write(struct gsm_serdev *gsd, struct gsm_serdev_dlci_operations *ops, const u8 *buf, int len) { return -ENODEV; diff --git a/include/linux/serdev.h b/include/linux/serdev.h index 9f14f9c12ec4..efdffe34a9b5 100644 --- a/include/linux/serdev.h +++ b/include/linux/serdev.h @@ -128,6 +128,7 @@ static inline void serdev_device_set_drvdata(struct serdev_device *serdev, void */ static inline void serdev_device_put(struct serdev_device *serdev) { + printk("serdev_device_put... %p\n", serdev); if (serdev) put_device(&serdev->dev); } @@ -156,6 +157,8 @@ static inline void serdev_controller_set_drvdata(struct serdev_controller *ctrl, */ static inline void serdev_controller_put(struct serdev_controller *ctrl) { + printk("serdev_controller_put... %p\n", ctrl); + WARN_ON(1); if (ctrl) put_device(&ctrl->dev); } diff --git a/lib/vsprintf.c b/lib/vsprintf.c index afb9521ddf91..530a0146893c 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -802,7 +802,7 @@ static char *ptr_to_id(char *buf, char *end, const void *ptr, * Print the real pointer value for NULL and error pointers, * as they are not actual addresses. */ - if (IS_ERR_OR_NULL(ptr)) +// if (IS_ERR_OR_NULL(ptr)) return pointer_string(buf, end, ptr, spec); /* When debugging early boot use non-cryptographically secure hash. */ diff --git a/sound/soc/codecs/motmdm.c b/sound/soc/codecs/motmdm.c index 325a860ef665..1528c89d9d57 100644 --- a/sound/soc/codecs/motmdm.c +++ b/sound/soc/codecs/motmdm.c @@ -28,7 +28,7 @@ struct motmdm_driver_data { struct snd_soc_component *component; struct snd_soc_dai *master_dai; struct device *modem; - struct gsm_serdev_dlci dlci; + struct gsm_serdev_dlci_operations dlci; struct regmap *regmap; unsigned char *buf; size_t len; @@ -38,7 +38,7 @@ struct motmdm_driver_data { struct mutex mutex; /* for sending commands */ wait_queue_head_t read_queue; - int (*receive_buf_orig)(struct gsm_serdev_dlci *ops, + int (*receive_buf_orig)(struct gsm_serdev_dlci_operations *ops, const unsigned char *buf, size_t len); unsigned int dtmf_val; @@ -121,7 +121,7 @@ static int motmdm_send_command(struct motmdm_driver_data *ddata, } /* Handle U1234+XXXX= style command response */ -static int motmdm_receive_data(struct gsm_serdev_dlci *dlci, +static int motmdm_receive_data(struct gsm_serdev_dlci_operations *dlci, const unsigned char *buf, size_t len) { @@ -569,7 +569,7 @@ static void motmdm_voice_get_state(struct motmdm_driver_data *ddata, motmdm_disable_primary_dai(ddata->component); } -static int receive_buf_voice(struct gsm_serdev_dlci *ops, +static int receive_buf_voice(struct gsm_serdev_dlci_operations *ops, const unsigned char *buf, size_t len) { @@ -585,7 +585,7 @@ static int receive_buf_voice(struct gsm_serdev_dlci *ops, /* Read the voice status from dlci1 and let user space handle rest */ static int motmdm_init_voice_dlci(struct motmdm_driver_data *ddata) { - struct gsm_serdev_dlci *dlci; + struct gsm_serdev_dlci_operations *dlci; dlci = serdev_ngsm_get_dlci(ddata->modem, MOTMDM_VOICE_DLCI); if (!dlci) @@ -600,7 +600,7 @@ static int motmdm_init_voice_dlci(struct motmdm_driver_data *ddata) static void motmdm_free_voice_dlci(struct motmdm_driver_data *ddata) { - struct gsm_serdev_dlci *dlci; + struct gsm_serdev_dlci_operations *dlci; dlci = serdev_ngsm_get_dlci(ddata->modem, MOTMDM_VOICE_DLCI); if (!dlci) @@ -613,7 +613,7 @@ static void motmdm_free_voice_dlci(struct motmdm_driver_data *ddata) static int motmdm_soc_probe(struct snd_soc_component *component) { struct motmdm_driver_data *ddata; - struct gsm_serdev_dlci *dlci; + struct gsm_serdev_dlci_operations *dlci; const unsigned char *cmd = "AT+CMUT=0"; int error; u32 line; @@ -690,7 +690,7 @@ static int motmdm_soc_probe(struct snd_soc_component *component) static void motmdm_soc_remove(struct snd_soc_component *component) { struct motmdm_driver_data *ddata; - struct gsm_serdev_dlci *dlci; + struct gsm_serdev_dlci_operations *dlci; ddata = snd_soc_component_get_drvdata(component); dlci = &ddata->dlci; diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c index 97b4f5480a31..31ff426226ef 100644 --- a/sound/soc/generic/audio-graph-card.c +++ b/sound/soc/generic/audio-graph-card.c @@ -631,6 +631,8 @@ static int graph_probe(struct platform_device *pdev) struct link_info li; int ret; + printk("audio-graph: probe starts\n"); + /* Allocate the private data and the DAI link array */ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) @@ -648,19 +650,24 @@ static int graph_probe(struct platform_device *pdev) if (!li.link || !li.dais) return -EINVAL; + printk("audio-graph: 2\n"); + ret = asoc_simple_init_priv(priv, &li); if (ret < 0) return ret; priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW); if (IS_ERR(priv->pa_gpio)) { + printk("audio-graph: optional pa failed\n"); ret = PTR_ERR(priv->pa_gpio); dev_err(dev, "failed to get amplifier gpio: %d\n", ret); return ret; } + printk("audio-graph: parsing of\n"); ret = graph_parse_of(priv); if (ret < 0) { + printk("audio-graph: parsing of failed: %d\n", ret); if (ret != -EPROBE_DEFER) dev_err(dev, "parse error %d\n", ret); goto err; @@ -670,9 +677,13 @@ static int graph_probe(struct platform_device *pdev) asoc_simple_debug_info(priv); + printk("audio-graph: registering card\n"); + + ret = devm_snd_soc_register_card(dev, card); if (ret < 0) goto err; + printk("audio-graph: all ok\n"); return 0; err: