Hi! > > > > Here's v4 set of n_gsm serdev support patches, and the related protocol > > > > driver for the modem found on Motorola Mapphone phones and tablets > > > > like droid4. > > > > > > > > This series only adds basic character device support for the serdev > > > > driver. Other serdev consumer drivers for specific devices will be > > > > posted separately. > > > > > > I'm still missing an architectural (design) overview here -- reviewer > > > time is a scarce resource. > > > > > > I also suggested earlier that you include, at least as an RFC, one or > > > more of your child-device drivers so that we can see how this ends up > > > being used in the end (including an example devicetree). > > > > Note that this is useful on its own: we have ofonod running on the top > > of this doing calls and SMSes. > > Yup. > > > Tony: I know you have drivers depending on this somewhere (audio > > routing and GPS), but I can't find them. It is not droid4-pending-v5.6 > > AFAICT. Do you have a pointer / could you publish them somewhere? > > Hmm they should be there in droid4-pending-v5.6 branch [0]: > > $ git log --abbrev=12 --pretty=format:"%h (\"%s\")" \ > v5.6..droid4-pending-v5.6 | grep -i -e gsm -e mot -e mdm > e09590a260a4 ("mfd: motmdm: Fix oops on unload of motorola-mdm") > f9252f9ff6bd ("mfd: motmdm: Revert bad list change") > d733dcaf4416 ("mfd: motmdm: Fix issue with receiving data before ddata is set") > 452d2b5d4c95 ("n_gsm: Build fixes for make randconfig build") > 6882b27ea92a ("phy: mapphone-mdm6600: Fix write timeouts with shorter GPIO toggle interval") > 58ff58c4b520 ("mfd: motmdm: Add basic DTMF support") > e92b6f30e5ae ("ASoC: audio-graph-card: Add audio mixer for motorold mdm6600") > c2caea5767d5 ("gnss: mot-mdm6600: Add support for Motorola Mapphone MDM6600 modem") > a5f73b7b06f6 ("mfd: motmdm: Add Motorola TS 27.010 serdev driver for devices like droid4") > 6c311d5aeb0a ("dt-bindings: mfd: motmdm: Add binding for motorola-mdm") > cd02274b920e ("tty: n_gsm: Add support for serdev drivers") > a73a48321c98 ("phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling") Thanks for pointers, I was lost in all the git trees. Port is not quite trivial :-(. I tried to port GPS and codec support over to new version of base patches, but I get oops when I try to open the GPS: Best regards, Pavel [ 182.877014] bfe0: 00000005 bed23af8 b6f279cf b6eb46f6 00070030 bed23ea7 00000000 00000000 [ 182.901672] [] (motmdm_gnss_open) from [] (gnss_open+0x7c/0xb0) [ 182.901672] [] (gnss_open) from [] (chrdev_open+0x9c/0x194) [ 182.901672] [] (chrdev_open) from [] (do_dentry_open+0x21c/0x3e8) [ 182.901672] [] (do_dentry_open) from [] (path_openat+0x8b0/0xc1c) [ 182.901672] [] (path_openat) from [] (do_filp_open+0x60/0xb4) [ 182.940002] [] (do_filp_open) from [] (do_sys_openat2+0x1f0/0x2f4) [ 182.940002] [] (do_sys_openat2) from [] (do_sys_open+0x98: diff --git a/drivers/gnss/Kconfig b/drivers/gnss/Kconfig index 960178dfad47..13b91034e3ea 100644 --- a/drivers/gnss/Kconfig +++ b/drivers/gnss/Kconfig @@ -15,7 +15,6 @@ if GNSS config GNSS_MOTMDM tristate "Motorola Modem TS 27.010 serdev GNSS receiver support" - depends on MFD_MOTMDM ---help--- Say Y here if you have a Motorola modem using TS 27.010 line discipline for GNSS such as a Motorola Mapphone series device diff --git a/drivers/tty/serdev/protocol/serdev-ngsm-motmdm.c b/drivers/tty/serdev/protocol/serdev-ngsm-motmdm.c index 97eb349f5f13..f234a0cd2fb7 100644 --- a/drivers/tty/serdev/protocol/serdev-ngsm-motmdm.c +++ b/drivers/tty/serdev/protocol/serdev-ngsm-motmdm.c @@ -477,7 +477,7 @@ static int motmdm_send_command(struct device *dev, return err; } -static int motmdm_register_dlci(struct device *dev, +int motmdm_register_dlci(struct device *dev, struct motmdm_dlci *mot_dlci) { struct motmdm *ddata; @@ -522,7 +522,7 @@ static int motmdm_register_dlci(struct device *dev, return err; } -static void motmdm_unregister_dlci(struct device *dev, +void motmdm_unregister_dlci(struct device *dev, struct motmdm_dlci *mot_dlci) { struct motmdm *ddata; diff --git a/include/linux/mfd/motorola-mdm.h b/include/linux/mfd/motorola-mdm.h new file mode 100644 index 000000000000..aae61050cd34 --- /dev/null +++ b/include/linux/mfd/motorola-mdm.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +struct gsm_serdev_dlci; +struct kfifo; +struct motmdm_response; + +enum motmdm_dlci_nr { + MOTMDM_DLCI1 = 1, + MOTMDM_DLCI2, + MOTMDM_DLCI3, + MOTMDM_DLCI4, + MOTMDM_DLCI5, + MOTMDM_DLCI6, + MOTMDM_DLCI7, + MOTMDM_DLCI8, + MOTMDM_DLCI9, + MOTMDM_DLCI10, + MOTMDM_DLCI11, + MOTMDM_DLCI12, + MOTMDM_DLCI13, + MOTMDM_DLCI14, + MOTMDM_DLCI15, +}; + +enum motmdm_state { + MOTMDM_STATE_IDLE = 0, + MOTMDM_STATE_DIAL = 1, + MOTMDM_STATE_ANSWERING = 2, + MOTMDM_STATE_CONNECTING = 3, + MOTMDM_STATE_INCOMING = 4, + MOTMDM_STATE_CONNECTED = 5, + MOTMDM_STATE_HANGING_UP = 6, + MOTMDM_STATE_DISCONNECTED = 7, +}; + +struct motmdm_dlci { + struct gsm_serdev_dlci gsm_dlci; + struct list_head node; + wait_queue_head_t read_queue; + struct kfifo read_fifo; + int line; + u16 id; + int (*send_command)(struct device *dev, struct motmdm_dlci *mot_dlci, + unsigned long timeout_ms, const unsigned char *cmd, + size_t cmdlen, + unsigned char *rsp, size_t rsplen); + int (*handle_command)(struct motmdm_dlci *mot_dlci, int id, + const unsigned char *buf, size_t len); + int (*receive_data)(struct motmdm_dlci *mot_dlci, + const unsigned char *buf, + size_t len); + int (*write)(struct device *dev, struct motmdm_dlci *mot_dlci, + int cmdid, const unsigned char *buf, size_t count); + int (*notify)(struct motmdm_dlci *mot_dlci, enum motmdm_state); + struct list_head list; + void *privdata; /* Do not use, internal data */ + void *drvdata; /* Available for consumer drivers */ +}; + +int motmdm_register_dlci(struct device *dev, struct motmdm_dlci *mot_dlci); +void motmdm_unregister_dlci(struct device *dev, struct motmdm_dlci *mot_dlci); + +static inline +int motmdm_send_command(struct device *dev, struct motmdm_dlci *mot_dlci, + unsigned long timeout_ms, const unsigned char *cmd, + size_t cmdlen, unsigned char *rsp, size_t rsplen) +{ + if (mot_dlci && mot_dlci->send_command) + return mot_dlci->send_command(dev, mot_dlci, + timeout_ms, cmd, cmdlen, + rsp, rsplen); + else + return -EINVAL; +} + +static inline +int motmdm_write(struct device *dev, struct motmdm_dlci *mot_dlci, + const unsigned char *buf, size_t count) +{ + if (mot_dlci && mot_dlci->write) + return mot_dlci->write(dev, mot_dlci, -1, buf, count); + else + return -EINVAL; +} diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 3635fc0ab2a6..63d8d3e731ff 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -878,7 +878,6 @@ config SND_SOC_MAX9860 config SND_SOC_MOTMDM tristate "Motorola Modem TS 27.010 Voice Call Codec" - depends on MFD_MOTMDM help Enable support for Motorola TS 27.010 line discipline serdev voice call codec driver for Motorola Mapphone series of devices -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany