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@xxxxxxxxxxx> + * Copyright (C) 2020 Pavel Machek <pavel@xxxxxx> * * Based on drivers/gnss/sirf.c driver example: * Copyright (C) 2018 Johan Hovold <johan@xxxxxxxxxx> */ +/* 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@xxxxxxxxxxx>"); 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: -- http://www.livejournal.com/~pavelmachek
Attachment:
signature.asc
Description: Digital signature