aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2009-05-13 15:48:50 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 17:21:11 -0400
commitc668f32dca105d876e51862a003a302fa61e4ae4 (patch)
tree5a71742ecd4e6a1c48f77977e5e2f6d129ffb566 /drivers/media/video/saa7134
parent1df8e9861cf9fac5737ccb61c7f7fefa77711d40 (diff)
V4L/DVB (11844): ir-kbd-i2c: Switch to the new-style device binding model
Let card drivers probe for IR receiver devices and instantiate them if found. Ultimately it would be better if we could stop probing completely, but I suspect this won't be possible for all card types. There's certainly room for cleanups. For example, some drivers are sharing I2C adapter IDs, so they also had to share the list of I2C addresses being probed for an IR receiver. Now that each driver explicitly says which addresses should be probed, maybe some addresses can be dropped from some drivers. Also, the special cases in saa7134-i2c should probably be handled on a per-board basis. This would be more efficient and less risky than always probing extra addresses on all boards. I'll give it a try later. Signed-off-by: Jean Delvare <khali@linux-fr.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c3
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c86
-rw-r--r--drivers/media/video/saa7134/saa7134.h1
3 files changed, 78 insertions, 12 deletions
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
index f3e285aa2fb4..a96f75985cba 100644
--- a/drivers/media/video/saa7134/saa7134-i2c.c
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -433,6 +433,9 @@ int saa7134_i2c_register(struct saa7134_dev *dev)
433 saa7134_i2c_eeprom(dev,dev->eedata,sizeof(dev->eedata)); 433 saa7134_i2c_eeprom(dev,dev->eedata,sizeof(dev->eedata));
434 if (i2c_scan) 434 if (i2c_scan)
435 do_i2c_scan(dev->name,&dev->i2c_client); 435 do_i2c_scan(dev->name,&dev->i2c_client);
436
437 /* Instantiate the IR receiver device, if present */
438 saa7134_probe_i2c_ir(dev);
436 return 0; 439 return 0;
437} 440}
438 441
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index 6cd693d3b8ed..4144ca9cc7e0 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -134,10 +134,10 @@ static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
134 int gpio; 134 int gpio;
135 135
136 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */ 136 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */
137 struct saa7134_dev *dev = ir->c.adapter->algo_data; 137 struct saa7134_dev *dev = ir->c->adapter->algo_data;
138 if (dev == NULL) { 138 if (dev == NULL) {
139 dprintk("get_key_msi_tvanywhere_plus: " 139 dprintk("get_key_msi_tvanywhere_plus: "
140 "gir->c.adapter->algo_data is NULL!\n"); 140 "gir->c->adapter->algo_data is NULL!\n");
141 return -EIO; 141 return -EIO;
142 } 142 }
143 143
@@ -156,7 +156,7 @@ static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
156 156
157 /* GPIO says there is a button press. Get it. */ 157 /* GPIO says there is a button press. Get it. */
158 158
159 if (1 != i2c_master_recv(&ir->c, &b, 1)) { 159 if (1 != i2c_master_recv(ir->c, &b, 1)) {
160 i2cdprintk("read error\n"); 160 i2cdprintk("read error\n");
161 return -EIO; 161 return -EIO;
162 } 162 }
@@ -179,7 +179,7 @@ static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
179 unsigned char b; 179 unsigned char b;
180 180
181 /* poll IR chip */ 181 /* poll IR chip */
182 if (1 != i2c_master_recv(&ir->c,&b,1)) { 182 if (1 != i2c_master_recv(ir->c, &b, 1)) {
183 i2cdprintk("read error\n"); 183 i2cdprintk("read error\n");
184 return -EIO; 184 return -EIO;
185 } 185 }
@@ -202,7 +202,7 @@ static int get_key_hvr1110(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
202 unsigned char buf[5], cod4, code3, code4; 202 unsigned char buf[5], cod4, code3, code4;
203 203
204 /* poll IR chip */ 204 /* poll IR chip */
205 if (5 != i2c_master_recv(&ir->c,buf,5)) 205 if (5 != i2c_master_recv(ir->c, buf, 5))
206 return -EIO; 206 return -EIO;
207 207
208 cod4 = buf[4]; 208 cod4 = buf[4];
@@ -224,7 +224,7 @@ static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
224 unsigned char data[12]; 224 unsigned char data[12];
225 u32 gpio; 225 u32 gpio;
226 226
227 struct saa7134_dev *dev = ir->c.adapter->algo_data; 227 struct saa7134_dev *dev = ir->c->adapter->algo_data;
228 228
229 /* rising SAA7134_GPIO_GPRESCAN reads the status */ 229 /* rising SAA7134_GPIO_GPRESCAN reads the status */
230 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN); 230 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
@@ -235,9 +235,9 @@ static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
235 if (0x400000 & ~gpio) 235 if (0x400000 & ~gpio)
236 return 0; /* No button press */ 236 return 0; /* No button press */
237 237
238 ir->c.addr = 0x5a >> 1; 238 ir->c->addr = 0x5a >> 1;
239 239
240 if (12 != i2c_master_recv(&ir->c, data, 12)) { 240 if (12 != i2c_master_recv(ir->c, data, 12)) {
241 i2cdprintk("read error\n"); 241 i2cdprintk("read error\n");
242 return -EIO; 242 return -EIO;
243 } 243 }
@@ -267,7 +267,7 @@ static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
267 unsigned int start = 0,parity = 0,code = 0; 267 unsigned int start = 0,parity = 0,code = 0;
268 268
269 /* poll IR chip */ 269 /* poll IR chip */
270 if (4 != i2c_master_recv(&ir->c, b, 4)) { 270 if (4 != i2c_master_recv(ir->c, b, 4)) {
271 i2cdprintk("read error\n"); 271 i2cdprintk("read error\n");
272 return -EIO; 272 return -EIO;
273 } 273 }
@@ -682,14 +682,76 @@ void saa7134_input_fini(struct saa7134_dev *dev)
682 dev->remote = NULL; 682 dev->remote = NULL;
683} 683}
684 684
685void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir) 685void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
686{ 686{
687 struct i2c_board_info info;
688 const unsigned short addr_list[] = {
689 0x7a, 0x47, 0x71, 0x2d,
690 I2C_CLIENT_END
691 };
692
693 const unsigned short addr_list_msi[] = {
694 0x30, I2C_CLIENT_END
695 };
696 struct i2c_msg msg_msi = {
697 .addr = 0x50,
698 .flags = I2C_M_RD,
699 .len = 0,
700 .buf = NULL,
701 };
702
703 unsigned char subaddr, data;
704 struct i2c_msg msg_avermedia[] = { {
705 .addr = 0x40,
706 .flags = 0,
707 .len = 1,
708 .buf = &subaddr,
709 }, {
710 .addr = 0x40,
711 .flags = I2C_M_RD,
712 .len = 1,
713 .buf = &data,
714 } };
715
716 struct i2c_client *client;
717 int rc;
718
687 if (disable_ir) { 719 if (disable_ir) {
688 dprintk("Found supported i2c remote, but IR has been disabled\n"); 720 dprintk("IR has been disabled, not probing for i2c remote\n");
689 ir->get_key=NULL;
690 return; 721 return;
691 } 722 }
692 723
724 memset(&info, 0, sizeof(struct i2c_board_info));
725 strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
726 client = i2c_new_probed_device(&dev->i2c_adap, &info, addr_list);
727 if (client)
728 return;
729
730 /* MSI TV@nywhere Plus controller doesn't seem to
731 respond to probes unless we read something from
732 an existing device. Weird... */
733 rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
734 dprintk(KERN_DEBUG "probe 0x%02x @ %s: %s\n",
735 msg_msi.addr, dev->i2c_adap.name,
736 (1 == rc) ? "yes" : "no");
737 client = i2c_new_probed_device(&dev->i2c_adap, &info, addr_list_msi);
738 if (client)
739 return;
740
741 /* Special case for AVerMedia Cardbus remote */
742 subaddr = 0x0d;
743 rc = i2c_transfer(&dev->i2c_adap, msg_avermedia, 2);
744 dprintk(KERN_DEBUG "probe 0x%02x/0x%02x @ %s: %s\n",
745 msg_avermedia[0].addr, subaddr, dev->i2c_adap.name,
746 (2 == rc) ? "yes" : "no");
747 if (2 == rc) {
748 info.addr = msg_avermedia[0].addr;
749 i2c_new_device(&dev->i2c_adap, &info);
750 }
751}
752
753void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
754{
693 switch (dev->board) { 755 switch (dev->board) {
694 case SAA7134_BOARD_PINNACLE_PCTV_110i: 756 case SAA7134_BOARD_PINNACLE_PCTV_110i:
695 case SAA7134_BOARD_PINNACLE_PCTV_310i: 757 case SAA7134_BOARD_PINNACLE_PCTV_310i:
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index 8229ab213223..116534ec33eb 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -799,6 +799,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status);
799int saa7134_input_init1(struct saa7134_dev *dev); 799int saa7134_input_init1(struct saa7134_dev *dev);
800void saa7134_input_fini(struct saa7134_dev *dev); 800void saa7134_input_fini(struct saa7134_dev *dev);
801void saa7134_input_irq(struct saa7134_dev *dev); 801void saa7134_input_irq(struct saa7134_dev *dev);
802void saa7134_probe_i2c_ir(struct saa7134_dev *dev);
802void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir); 803void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir);
803void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir); 804void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir);
804void saa7134_ir_stop(struct saa7134_dev *dev); 805void saa7134_ir_stop(struct saa7134_dev *dev);