lkml.org 
[lkml]   [2018]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v1 5/5] tinydrm: add winstar wg160160 driver
    From
    Date

    Den 02.08.2018 21.45, skrev Sam Ravnborg:
    > Add driver for the winstar wg160160 display.
    > The driver utilises pardata-dbi that
    > again utilise the pardata subsystem.
    >
    > Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    > ---
    > MAINTAINERS | 5 +
    > drivers/gpu/drm/tinydrm/Kconfig | 10 ++
    > drivers/gpu/drm/tinydrm/Makefile | 1 +
    > drivers/gpu/drm/tinydrm/wg160160.c | 298 +++++++++++++++++++++++++++++++++++++
    > 4 files changed, 314 insertions(+)
    > create mode 100644 drivers/gpu/drm/tinydrm/wg160160.c
    >

    [...]

    > +
    > +/**
    > + * write_reg - Write instruction on parallel bus to controller
    > + *
    > + * Check BUSY flag and write instruction
    > + *
    > + * @pdd: pardata data
    > + * @reg: The register to write
    > + * @value: The value of the register
    > + *
    > + * Returns:
    > + * Zero on success, negative error code on failure
    > + */
    > +int write_reg(struct pardata_data *pdd, unsigned int reg, unsigned int value)
    > +{
    > + int ins[PIN_NUM];
    > + int val[PIN_NUM];
    > + int i;
    > +
    > + for (i = 0; i < PIN_NUM; i++)
    > + ins[PIN_DB0 + i] = !!BIT(reg);
    > +
    > + for (i = 0; i < PIN_NUM; i++)
    > + val[PIN_DB0 + i] = !!(value & BIT(i));
    > +
    > + gpiod_set_value_cansleep(pdd->bus->pin_rs, 1);
    > + gpiod_set_array_value_cansleep(PIN_NUM, pdd->bus->data_pins->desc, ins);
    > + wait_busy(pdd);
    > + pardata_strobe_write(pdd);
    > +
    > + gpiod_set_value_cansleep(pdd->bus->pin_rs, 0);
    > + gpiod_set_array_value_cansleep(PIN_NUM, pdd->bus->data_pins->desc, val);
    > + wait_busy(pdd);
    > + pardata_strobe_write(pdd);
    > +
    > + return 0;
    > +}

    If this controller has normal registers, you could do a regmap
    implementation for pardata: drivers/base/regmap.

    Noralf.

    > +
    > +/**
    > + * write_buf - write buffer on parallel bus to controller
    > + *
    > + * @pdd: pardata data
    > + * @offset: offset into display RAM
    > + * @data: pointer to data to write
    > + * @len: number of bytes to write
    > + *
    > + * Returns:
    > + * Zero on success, negative error code on failure
    > + */
    > +int write_buf(struct pardata_data *pdd, u8 offset, u8 *data, size_t len)
    > +{
    > + int ins[PIN_NUM];
    > + int val[PIN_NUM];
    > + int bit;
    > + int i;
    > +
    > + /* Setup address */
    > + write_reg(pdd, WG160160_ADDRSL_REG, offset & 0xff);
    > + write_reg(pdd, WG160160_ADDRSL_REG, (offset >> 8) & 0xff);
    > +
    > + /* prepare to write data */
    > + for (i = 0; i < PIN_NUM; i++)
    > + ins[PIN_DB0 + i] = !!(WG160160_WRITE_REG & BIT(i));
    > +
    > + gpiod_set_value_cansleep(pdd->bus->pin_rs, 1);
    > + gpiod_set_array_value_cansleep(PIN_NUM, pdd->bus->data_pins->desc, ins);
    > + wait_busy(pdd);
    > + pardata_strobe_write(pdd);
    > +
    > + /* Write data byte - by byte */
    > + gpiod_set_value_cansleep(pdd->bus->pin_rs, 0);
    > +
    > + for (i = offset; i < (offset + len); i++) {
    > + for (bit = 0; bit < PIN_NUM; bit++)
    > + val[PIN_DB0 + bit] = !!(data[i] & BIT(bit));
    > +
    > + gpiod_set_array_value_cansleep(PIN_NUM,
    > + pdd->bus->data_pins->desc,
    > + val);
    > + wait_busy(pdd);
    > + pardata_strobe_write(pdd);
    > + }
    > +
    > + return 0;
    > +}

    \
     
     \ /
      Last update: 2018-08-07 19:37    [W:2.417 / U:1.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site