On Fri, 23 Apr 2010 18:15:24 +0300 Carlos Chinea wrote:

> Adds HSI framework in to the linux kernel.
> 
> High Speed Synchronous Serial Interface (HSI) is a
             ^^^^^^^^^^^
             yes, correct spelling

> serial interface mainly used for connecting application
> engines (APE) with cellular modem engines (CMT) in cellular
> handsets.
> 
> HSI provides multiplexing for up to 16 logical channels,
> low-latency and full duplex communication.
> 
> Signed-off-by: Carlos Chinea <[email protected]>
> ---
>  drivers/Kconfig         |    2 +
>  drivers/Makefile        |    1 +
>  drivers/hsi/Kconfig     |   13 ++
>  drivers/hsi/Makefile    |    4 +
>  drivers/hsi/hsi.c       |  487 
> +++++++++++++++++++++++++++++++++++++++++++++++
>  include/linux/hsi/hsi.h |  365 +++++++++++++++++++++++++++++++++++
>  6 files changed, 872 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/hsi/Kconfig
>  create mode 100644 drivers/hsi/Makefile
>  create mode 100644 drivers/hsi/hsi.c
>  create mode 100644 include/linux/hsi/hsi.h
> 

> diff --git a/drivers/hsi/Kconfig b/drivers/hsi/Kconfig
> new file mode 100644
> index 0000000..e122584
> --- /dev/null
> +++ b/drivers/hsi/Kconfig
> @@ -0,0 +1,13 @@
> +#
> +# HSI driver configuration
> +#
> +menuconfig HSI
> +     bool "HSI support"
> +     ---help---
> +       The "High speed syncrhonous Serial Interface" is
                          ~~~~~~~~~~~

> +       synchrnous serial interface used mainly to connect
          ~~~~~~~~~~

Fix spelling mistakes (or typos).

> +       application engines and celluar modems.
> +
> +if HSI
> +
> +endif # HSI

> diff --git a/drivers/hsi/hsi.c b/drivers/hsi/hsi.c
> new file mode 100644
> index 0000000..f6fd777
> --- /dev/null
> +++ b/drivers/hsi/hsi.c
> @@ -0,0 +1,487 @@
> +/*
> + * hsi.c
> + *
> + * HSI core.
> + *
> + * Copyright (C) 2010 Nokia Corporation. All rights reserved.
> + *
> + * Contact: Carlos Chinea <[email protected]>
> + */
> +#include <linux/hsi/hsi.h>
> +#include <linux/rwsem.h>

Need
#include <linux/list.h>
for LIST_HEAD().

> +
> +struct hsi_cl_info {
> +     struct list_head        list;
> +     struct hsi_board_info   info;
> +};
> +
> +static LIST_HEAD(hsi_board_list);
> +


> +
> +static int hsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env)

#include <linux/kobject.h>


> +{
> +     add_uevent_var(env, "MODALIAS=hsi:%s", dev_name(dev));
> +
> +     return 0;
> +}
> +
> +static int hsi_bus_match(struct device *dev, struct device_driver *driver)
> +{
> +     return strcmp(dev_name(dev), driver->name) == 0;

string.h

> +}
> +
> +struct bus_type hsi_bus_type = {
> +     .name           = "hsi",
> +     .dev_attrs      = hsi_bus_dev_attrs,
> +     .match          = hsi_bus_match,
> +     .uevent         = hsi_bus_uevent,
> +};
> +
> +static void hsi_client_release(struct device *dev)
> +{
> +     kfree(to_hsi_client(dev));

slab.h

> +}
> +
> +static void hsi_new_client(struct hsi_port *port, struct hsi_board_info 
> *info)
> +{
> +     struct hsi_client *cl;
> +
> +     cl = kzalloc(sizeof(*cl), GFP_KERNEL);

slab.h

> +     if (!cl)
> +             return;
> +     cl->device.type = &hsi_cl;
> +     cl->tx_cfg = info->tx_cfg;
> +     cl->rx_cfg = info->rx_cfg;
> +     cl->device.bus = &hsi_bus_type;
> +     cl->device.parent = &port->device;
> +     cl->device.release = hsi_client_release;
> +     dev_set_name(&cl->device, info->name);
> +     cl->device.platform_data = info->platform_data;
> +     if (info->archdata)
> +             cl->device.archdata = *info->archdata;
> +     if (device_register(&cl->device) < 0) {
> +             pr_err("hsi: failed to register client: %s\n", info->name);
> +             kfree(cl);
> +     }
> +}

...



> +/**
> + * hsi_alloc_msg - Allocate an HSI message
> + * @nents: Number of memory entries
> + * @flags: Kernel allocation flags
> + *
> + * NOTE: nents can be 0. This mainly makes sense for read transfer.
> + * In that case, HSI drivers will call the complete callback when
> + * there is data to be read without cosuming it.

                                       consuming

> + *
> + * Return NULL on failure or a pointer to an hsi_msg on success.
> + */
> +struct hsi_msg *hsi_alloc_msg(unsigned int nents, gfp_t flags)
> +{
...
> +}
> +EXPORT_SYMBOL_GPL(hsi_alloc_msg);

...


> +/**
> + * hsi_event -Notifies clients about port events
> + * @port: Port where the event occurred
> + * @event: The event type:
> + *           - HSI_EVENT_START_RX: Incoming wake line high
> + *           - HSI_EVENT_STOP_RX: Incoming wake line down
> + *
> + * Note: Clients should not be concerned about wake line behavior. But due
> + * to a race condition in HSI HW protocol when the wake lines are in used,

                                                                 are in use,

> + * they need to be notified about wake line changes, so they can implement
> + * a workaround for it.
> + */
> +void hsi_event(struct hsi_port *port, unsigned int event)
> +{
...
> +}

> diff --git a/include/linux/hsi/hsi.h b/include/linux/hsi/hsi.h
> new file mode 100644
> index 0000000..b272f23
> --- /dev/null
> +++ b/include/linux/hsi/hsi.h
> @@ -0,0 +1,365 @@
> +/*
> + * hsi.h
> + *
> + * HSI core header file.
> + *
> + * Copyright (C) 2010 Nokia Corporation. All rights reserved.
> + *
> + * Contact: Carlos Chinea <[email protected]>
> + */
> +
> +#ifndef __LINUX_HSI_H__
> +#define __LINUX_HSI_H__
> +
> +#include <linux/device.h>
> +#include <linux/mutex.h>
> +#include <linux/scatterlist.h>
> +
> +/* HSI message ttype */
> +#define HSI_MSG_READ 0
> +#define HSI_MSG_WRITE        1
> +
> +/* HSI configuration values */
> +#define HSI_MODE_STREAM      1
> +#define HSI_MODE_FRAME       2
> +#define HSI_FLOW_SYNC        0       /* Synchronized flow */
> +#define HSI_FLOW_PIPE        1       /* Pipelined flow */
> +#define HSI_ARB_RR   0       /* Round-robin arbitration */
> +#define HSI_ARB_PRIO 1       /* Channel priority arbitration */
> +
> +#define HSI_MAX_CHANNELS     16

> +/**
> + * struct hsi_client - HSI client attached to an HSI port
> + * @device: Driver model representation of the device
> + * @tx_cfg: HSI TX configuration
> + * @rx_cfg: HSI RX configuration
> + * @hsi_start_rx: Called after incoming wake line goes high
> + * @hsi_stop_rx: Called after incoming wake line goes low
> + * @pclaimed: Set when successfully claimed a port. Internal, do not touch.
> + */
> +struct hsi_client {
> +     struct device           device;
> +     struct hsi_config       tx_cfg;
> +     struct hsi_config       rx_cfg;
> +     void                    (*hsi_start_rx)(struct hsi_client *cl);
> +     void                    (*hsi_stop_rx)(struct hsi_client *cl);

You can put:
        /* private: */
here and that struct field won't show up in the generated kernel-doc output...

> +     unsigned int            pclaimed:1; /* Private, do not touch */
> +};
> +
> +#define to_hsi_client(dev) container_of(dev, struct hsi_client, device)
> +



---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to