0001
0002
0003
0004
0005
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
0028 reg0 = 0x10;
0029 break;
0030 case SEC_VOLTAGE_13:
0031
0032 reg0 = 0x31;
0033 break;
0034 case SEC_VOLTAGE_18:
0035
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, ®0, 1);
0044 if (ret < 0)
0045 goto err;
0046 dev->reg[0] = reg0;
0047 }
0048
0049
0050 reg1 = 0x82;
0051 if (reg1 != dev->reg[1]) {
0052 ret = i2c_master_send(client, ®1, 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
0083 ret = i2c_master_recv(client, buf, 2);
0084 if (ret < 0)
0085 goto err_kfree;
0086
0087
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");