Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Allegro A8293 SEC driver
0004  *
0005  * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
0006  */
0007 
0008 #include "a8293.h"
0009 
0010 struct a8293_dev {
0011     struct i2c_client *client;
0012     u8 reg[2];
0013 };
0014 
0015 static int a8293_set_voltage(struct dvb_frontend *fe,
0016                  enum fe_sec_voltage fe_sec_voltage)
0017 {
0018     struct a8293_dev *dev = fe->sec_priv;
0019     struct i2c_client *client = dev->client;
0020     int ret;
0021     u8 reg0, reg1;
0022 
0023     dev_dbg(&client->dev, "fe_sec_voltage=%d\n", fe_sec_voltage);
0024 
0025     switch (fe_sec_voltage) {
0026     case SEC_VOLTAGE_OFF:
0027         /* ENB=0 */
0028         reg0 = 0x10;
0029         break;
0030     case SEC_VOLTAGE_13:
0031         /* VSEL0=1, VSEL1=0, VSEL2=0, VSEL3=0, ENB=1*/
0032         reg0 = 0x31;
0033         break;
0034     case SEC_VOLTAGE_18:
0035         /* VSEL0=0, VSEL1=0, VSEL2=0, VSEL3=1, ENB=1*/
0036         reg0 = 0x38;
0037         break;
0038     default:
0039         ret = -EINVAL;
0040         goto err;
0041     }
0042     if (reg0 != dev->reg[0]) {
0043         ret = i2c_master_send(client, &reg0, 1);
0044         if (ret < 0)
0045             goto err;
0046         dev->reg[0] = reg0;
0047     }
0048 
0049     /* TMODE=0, TGATE=1 */
0050     reg1 = 0x82;
0051     if (reg1 != dev->reg[1]) {
0052         ret = i2c_master_send(client, &reg1, 1);
0053         if (ret < 0)
0054             goto err;
0055         dev->reg[1] = reg1;
0056     }
0057 
0058     usleep_range(1500, 50000);
0059     return 0;
0060 err:
0061     dev_dbg(&client->dev, "failed=%d\n", ret);
0062     return ret;
0063 }
0064 
0065 static int a8293_probe(struct i2c_client *client,
0066                const struct i2c_device_id *id)
0067 {
0068     struct a8293_dev *dev;
0069     struct a8293_platform_data *pdata = client->dev.platform_data;
0070     struct dvb_frontend *fe = pdata->dvb_frontend;
0071     int ret;
0072     u8 buf[2];
0073 
0074     dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0075     if (!dev) {
0076         ret = -ENOMEM;
0077         goto err;
0078     }
0079 
0080     dev->client = client;
0081 
0082     /* check if the SEC is there */
0083     ret = i2c_master_recv(client, buf, 2);
0084     if (ret < 0)
0085         goto err_kfree;
0086 
0087     /* override frontend ops */
0088     fe->ops.set_voltage = a8293_set_voltage;
0089     fe->sec_priv = dev;
0090     i2c_set_clientdata(client, dev);
0091 
0092     dev_info(&client->dev, "Allegro A8293 SEC successfully attached\n");
0093     return 0;
0094 err_kfree:
0095     kfree(dev);
0096 err:
0097     dev_dbg(&client->dev, "failed=%d\n", ret);
0098     return ret;
0099 }
0100 
0101 static int a8293_remove(struct i2c_client *client)
0102 {
0103     struct a8293_dev *dev = i2c_get_clientdata(client);
0104 
0105     dev_dbg(&client->dev, "\n");
0106 
0107     kfree(dev);
0108     return 0;
0109 }
0110 
0111 static const struct i2c_device_id a8293_id_table[] = {
0112     {"a8293", 0},
0113     {}
0114 };
0115 MODULE_DEVICE_TABLE(i2c, a8293_id_table);
0116 
0117 static struct i2c_driver a8293_driver = {
0118     .driver = {
0119         .name   = "a8293",
0120         .suppress_bind_attrs = true,
0121     },
0122     .probe      = a8293_probe,
0123     .remove     = a8293_remove,
0124     .id_table   = a8293_id_table,
0125 };
0126 
0127 module_i2c_driver(a8293_driver);
0128 
0129 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
0130 MODULE_DESCRIPTION("Allegro A8293 SEC driver");
0131 MODULE_LICENSE("GPL");