linux/drivers/staging/most/i2c/i2c.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * i2c.c - Hardware Dependent Module for I2C Interface
   4 *
   5 * Copyright (C) 2013-2015, Microchip Technology Germany II GmbH & Co. KG
   6 */
   7
   8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9
  10#include <linux/init.h>
  11#include <linux/module.h>
  12#include <linux/slab.h>
  13#include <linux/i2c.h>
  14#include <linux/interrupt.h>
  15#include <linux/err.h>
  16
  17#include "most/core.h"
  18
  19enum { CH_RX, CH_TX, NUM_CHANNELS };
  20
  21#define MAX_BUFFERS_CONTROL 32
  22#define MAX_BUF_SIZE_CONTROL 256
  23
  24/**
  25 * list_first_mbo - get the first mbo from a list
  26 * @ptr:        the list head to take the mbo from.
  27 */
  28#define list_first_mbo(ptr) \
  29        list_first_entry(ptr, struct mbo, list)
  30
  31static unsigned int polling_rate;
  32module_param(polling_rate, uint, 0644);
  33MODULE_PARM_DESC(polling_rate, "Polling rate [Hz]. Default = 0 (use IRQ)");
  34
  35struct hdm_i2c {
  36        struct most_interface most_iface;
  37        struct most_channel_capability capabilities[NUM_CHANNELS];
  38        struct i2c_client *client;
  39        struct rx {
  40                struct delayed_work dwork;
  41                struct list_head list;
  42                bool int_disabled;
  43                unsigned int delay;
  44        } rx;
  45        char name[64];
  46};
  47
  48#define to_hdm(iface) container_of(iface, struct hdm_i2c, most_iface)
  49
  50static irqreturn_t most_irq_handler(int, void *);
  51static void pending_rx_work(struct work_struct *);
  52
  53/**
  54 * configure_channel - called from MOST core to configure a channel
  55 * @iface: interface the channel belongs to
  56 * @channel: channel to be configured
  57 * @channel_config: structure that holds the configuration information
  58 *
  59 * Return 0 on success, negative on failure.
  60 *
  61 * Receives configuration information from MOST core and initialize the
  62 * corresponding channel.
  63 */
  64static int configure_channel(struct most_interface *most_iface,
  65                             int ch_idx,
  66                             struct most_channel_config *channel_config)
  67{
  68        int ret;
  69        struct hdm_i2c *dev = to_hdm(most_iface);
  70        unsigned int delay, pr;
  71
  72        BUG_ON(ch_idx < 0 || ch_idx >= NUM_CHANNELS);
  73
  74        if (channel_config->data_type != MOST_CH_CONTROL) {
  75                pr_err("bad data type for channel %d\n", ch_idx);
  76                return -EPERM;
  77        }
  78
  79        if (channel_config->direction != dev->capabilities[ch_idx].direction) {
  80                pr_err("bad direction for channel %d\n", ch_idx);
  81                return -EPERM;
  82        }
  83
  84        if (channel_config->direction == MOST_CH_RX) {
  85                if (!polling_rate) {
  86                        if (dev->client->irq <= 0) {
  87                                pr_err("bad irq: %d\n", dev->client->irq);
  88                                return -ENOENT;
  89                        }
  90                        dev->rx.int_disabled = false;
  91                        ret = request_irq(dev->client->irq, most_irq_handler, 0,
  92                                          dev->client->name, dev);
  93                        if (ret) {
  94                                pr_err("request_irq(%d) failed: %d\n",
  95                                       dev->client->irq, ret);
  96                                return ret;
  97                        }
  98                } else {
  99                        delay = msecs_to_jiffies(MSEC_PER_SEC / polling_rate);
 100                        dev->rx.delay = delay ? delay : 1;
 101                        pr = MSEC_PER_SEC / jiffies_to_msecs(dev->rx.delay);
 102                        pr_info("polling rate is %u Hz\n", pr);
 103                }
 104        }
 105
 106        return 0;
 107}
 108
 109/**
 110 * enqueue - called from MOST core to enqueue a buffer for data transfer
 111 * @iface: intended interface
 112 * @channel: ID of the channel the buffer is intended for
 113 * @mbo: pointer to the buffer object
 114 *
 115 * Return 0 on success, negative on failure.
 116 *
 117 * Transmit the data over I2C if it is a "write" request or push the buffer into
 118 * list if it is an "read" request
 119 */
 120static int enqueue(struct most_interface *most_iface,
 121                   int ch_idx, struct mbo *mbo)
 122{
 123        struct hdm_i2c *dev = to_hdm(most_iface);
 124        int ret;
 125
 126        BUG_ON(ch_idx < 0 || ch_idx >= NUM_CHANNELS);
 127
 128        if (ch_idx == CH_RX) {
 129                /* RX */
 130                if (!polling_rate)
 131                        disable_irq(dev->client->irq);
 132                cancel_delayed_work_sync(&dev->rx.dwork);
 133                list_add_tail(&mbo->list, &dev->rx.list);
 134                if (dev->rx.int_disabled || polling_rate)
 135                        pending_rx_work(&dev->rx.dwork.work);
 136                if (!polling_rate)
 137                        enable_irq(dev->client->irq);
 138        } else {
 139                /* TX */
 140                ret = i2c_master_send(dev->client, mbo->virt_address,
 141                                      mbo->buffer_length);
 142                if (ret <= 0) {
 143                        mbo->processed_length = 0;
 144                        mbo->status = MBO_E_INVAL;
 145                } else {
 146                        mbo->processed_length = mbo->buffer_length;
 147                        mbo->status = MBO_SUCCESS;
 148                }
 149                mbo->complete(mbo);
 150        }
 151
 152        return 0;
 153}
 154
 155/**
 156 * poison_channel - called from MOST core to poison buffers of a channel
 157 * @iface: pointer to the interface the channel to be poisoned belongs to
 158 * @channel_id: corresponding channel ID
 159 *
 160 * Return 0 on success, negative on failure.
 161 *
 162 * If channel direction is RX, complete the buffers in list with
 163 * status MBO_E_CLOSE
 164 */
 165static int poison_channel(struct most_interface *most_iface,
 166                          int ch_idx)
 167{
 168        struct hdm_i2c *dev = to_hdm(most_iface);
 169        struct mbo *mbo;
 170
 171        BUG_ON(ch_idx < 0 || ch_idx >= NUM_CHANNELS);
 172
 173        if (ch_idx == CH_RX) {
 174                if (!polling_rate)
 175                        free_irq(dev->client->irq, dev);
 176                cancel_delayed_work_sync(&dev->rx.dwork);
 177
 178                while (!list_empty(&dev->rx.list)) {
 179                        mbo = list_first_mbo(&dev->rx.list);
 180                        list_del(&mbo->list);
 181
 182                        mbo->processed_length = 0;
 183                        mbo->status = MBO_E_CLOSE;
 184                        mbo->complete(mbo);
 185                }
 186        }
 187
 188        return 0;
 189}
 190
 191static void do_rx_work(struct hdm_i2c *dev)
 192{
 193        struct mbo *mbo;
 194        unsigned char msg[MAX_BUF_SIZE_CONTROL];
 195        int ret;
 196        u16 pml, data_size;
 197
 198        /* Read PML (2 bytes) */
 199        ret = i2c_master_recv(dev->client, msg, 2);
 200        if (ret <= 0) {
 201                pr_err("Failed to receive PML\n");
 202                return;
 203        }
 204
 205        pml = (msg[0] << 8) | msg[1];
 206        if (!pml)
 207                return;
 208
 209        data_size = pml + 2;
 210
 211        /* Read the whole message, including PML */
 212        ret = i2c_master_recv(dev->client, msg, data_size);
 213        if (ret <= 0) {
 214                pr_err("Failed to receive a Port Message\n");
 215                return;
 216        }
 217
 218        mbo = list_first_mbo(&dev->rx.list);
 219        list_del(&mbo->list);
 220
 221        mbo->processed_length = min(data_size, mbo->buffer_length);
 222        memcpy(mbo->virt_address, msg, mbo->processed_length);
 223        mbo->status = MBO_SUCCESS;
 224        mbo->complete(mbo);
 225}
 226
 227/**
 228 * pending_rx_work - Read pending messages through I2C
 229 * @work: definition of this work item
 230 *
 231 * Invoked by the Interrupt Service Routine, most_irq_handler()
 232 */
 233static void pending_rx_work(struct work_struct *work)
 234{
 235        struct hdm_i2c *dev = container_of(work, struct hdm_i2c, rx.dwork.work);
 236
 237        if (list_empty(&dev->rx.list))
 238                return;
 239
 240        do_rx_work(dev);
 241
 242        if (polling_rate) {
 243                schedule_delayed_work(&dev->rx.dwork, dev->rx.delay);
 244        } else {
 245                dev->rx.int_disabled = false;
 246                enable_irq(dev->client->irq);
 247        }
 248}
 249
 250/*
 251 * most_irq_handler - Interrupt Service Routine
 252 * @irq: irq number
 253 * @_dev: private data
 254 *
 255 * Schedules a delayed work
 256 *
 257 * By default the interrupt line behavior is Active Low. Once an interrupt is
 258 * generated by the device, until driver clears the interrupt (by reading
 259 * the PMP message), device keeps the interrupt line in low state. Since i2c
 260 * read is done in work queue, the interrupt line must be disabled temporarily
 261 * to avoid ISR being called repeatedly. Re-enable the interrupt in workqueue,
 262 * after reading the message.
 263 *
 264 * Note: If we use the interrupt line in Falling edge mode, there is a
 265 * possibility to miss interrupts when ISR is getting executed.
 266 *
 267 */
 268static irqreturn_t most_irq_handler(int irq, void *_dev)
 269{
 270        struct hdm_i2c *dev = _dev;
 271
 272        disable_irq_nosync(irq);
 273        dev->rx.int_disabled = true;
 274        schedule_delayed_work(&dev->rx.dwork, 0);
 275
 276        return IRQ_HANDLED;
 277}
 278
 279/*
 280 * i2c_probe - i2c probe handler
 281 * @client: i2c client device structure
 282 * @id: i2c client device id
 283 *
 284 * Return 0 on success, negative on failure.
 285 *
 286 * Register the i2c client device as a MOST interface
 287 */
 288static int i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
 289{
 290        struct hdm_i2c *dev;
 291        int ret, i;
 292
 293        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 294        if (!dev)
 295                return -ENOMEM;
 296
 297        /* ID format: i2c-<bus>-<address> */
 298        snprintf(dev->name, sizeof(dev->name), "i2c-%d-%04x",
 299                 client->adapter->nr, client->addr);
 300
 301        for (i = 0; i < NUM_CHANNELS; i++) {
 302                dev->capabilities[i].data_type = MOST_CH_CONTROL;
 303                dev->capabilities[i].num_buffers_packet = MAX_BUFFERS_CONTROL;
 304                dev->capabilities[i].buffer_size_packet = MAX_BUF_SIZE_CONTROL;
 305        }
 306        dev->capabilities[CH_RX].direction = MOST_CH_RX;
 307        dev->capabilities[CH_RX].name_suffix = "rx";
 308        dev->capabilities[CH_TX].direction = MOST_CH_TX;
 309        dev->capabilities[CH_TX].name_suffix = "tx";
 310
 311        dev->most_iface.interface = ITYPE_I2C;
 312        dev->most_iface.description = dev->name;
 313        dev->most_iface.num_channels = NUM_CHANNELS;
 314        dev->most_iface.channel_vector = dev->capabilities;
 315        dev->most_iface.configure = configure_channel;
 316        dev->most_iface.enqueue = enqueue;
 317        dev->most_iface.poison_channel = poison_channel;
 318
 319        INIT_LIST_HEAD(&dev->rx.list);
 320
 321        INIT_DELAYED_WORK(&dev->rx.dwork, pending_rx_work);
 322
 323        dev->client = client;
 324        i2c_set_clientdata(client, dev);
 325
 326        ret = most_register_interface(&dev->most_iface);
 327        if (ret) {
 328                pr_err("Failed to register i2c as a MOST interface\n");
 329                kfree(dev);
 330                return ret;
 331        }
 332
 333        return 0;
 334}
 335
 336/*
 337 * i2c_remove - i2c remove handler
 338 * @client: i2c client device structure
 339 *
 340 * Return 0 on success.
 341 *
 342 * Unregister the i2c client device as a MOST interface
 343 */
 344static int i2c_remove(struct i2c_client *client)
 345{
 346        struct hdm_i2c *dev = i2c_get_clientdata(client);
 347
 348        most_deregister_interface(&dev->most_iface);
 349        kfree(dev);
 350
 351        return 0;
 352}
 353
 354static const struct i2c_device_id i2c_id[] = {
 355        { "most_i2c", 0 },
 356        { }, /* Terminating entry */
 357};
 358
 359MODULE_DEVICE_TABLE(i2c, i2c_id);
 360
 361static struct i2c_driver i2c_driver = {
 362        .driver = {
 363                .name = "hdm_i2c",
 364        },
 365        .probe = i2c_probe,
 366        .remove = i2c_remove,
 367        .id_table = i2c_id,
 368};
 369
 370module_i2c_driver(i2c_driver);
 371
 372MODULE_AUTHOR("Andrey Shvetsov <andrey.shvetsov@k2l.de>");
 373MODULE_DESCRIPTION("I2C Hardware Dependent Module");
 374MODULE_LICENSE("GPL");
 375