Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:04

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @brief I2C Driver for SEMTECH SC620 Octal LED Driver
0007  */
0008 
0009 /*
0010  * Copyright (c) 2013 embedded brains GmbH & Co. KG
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 #include <libchip/i2c-sc620.h>
0035 
0036 #include <rtems/libio.h>
0037 
0038 #define SC620_REG_COUNT 10
0039 
0040 static rtems_status_code i2c_sc620_write(
0041   rtems_device_major_number major,
0042   rtems_device_minor_number minor,
0043   void *arg
0044 )
0045 {
0046   rtems_status_code sc = RTEMS_IO_ERROR;
0047   rtems_libio_rw_args_t *rw = arg;
0048   unsigned char *buf = (unsigned char *) &rw->buffer[0];
0049 
0050   if (rw->count == 2 && buf[0] < SC620_REG_COUNT) {
0051     int rv;
0052 
0053     rv = rtems_libi2c_start_write_bytes(
0054       minor, buf, 2
0055     );
0056     if (rv == 2) {
0057       sc = rtems_libi2c_send_stop(minor);
0058     }
0059   }
0060 
0061   rw->bytes_moved = sc == RTEMS_SUCCESSFUL ? 2 : 0;
0062 
0063   return sc;
0064 }
0065 
0066 static rtems_status_code i2c_sc620_read(
0067   rtems_device_major_number major,
0068   rtems_device_minor_number minor,
0069   void *arg
0070 )
0071 {
0072   rtems_status_code sc = RTEMS_IO_ERROR;
0073   rtems_libio_rw_args_t *rw = arg;
0074   unsigned char *buf = (unsigned char *) &rw->buffer[0];
0075 
0076   if (rw->count == 1 && buf[0] < SC620_REG_COUNT) {
0077     int rv;
0078 
0079     rv = rtems_libi2c_start_write_bytes(minor, buf, 1);
0080     if (rv == 1) {
0081       sc = rtems_libi2c_send_addr(minor, 0);
0082       if (sc == RTEMS_SUCCESSFUL) {
0083         rv = rtems_libi2c_read_bytes(minor, buf, 1);
0084         if (rv == 1) {
0085           sc = rtems_libi2c_send_stop(minor);
0086         }
0087       }
0088     }
0089   }
0090 
0091   rw->bytes_moved = sc == RTEMS_SUCCESSFUL ? 1 : 0;
0092 
0093   return sc;
0094 }
0095 
0096 static rtems_driver_address_table i2c_sc620_ops = {
0097   .read_entry =  i2c_sc620_read,
0098   .write_entry = i2c_sc620_write
0099 };
0100 
0101 rtems_libi2c_drv_t i2c_sc620_driver = {
0102   .ops = &i2c_sc620_ops,
0103   .size = sizeof(i2c_sc620_driver)
0104 };